pkg-config-0.29.1/0000775000175000017500000000000012665370350010641 500000000000000pkg-config-0.29.1/config.guess0000755000175000017500000012367212601774033013106 00000000000000#! /bin/sh # Attempt to guess a canonical system name. # Copyright 1992-2015 Free Software Foundation, Inc. timestamp='2015-01-01' # This file 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 3 of the License, 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, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # # Originally written by Per Bothner; maintained since 2000 by Ben Elliston. # # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD # # Please send patches to . me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright 1992-2015 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." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown case "${UNAME_SYSTEM}" in Linux|GNU|GNU/*) # If the system lacks a compiler, then just pick glibc. # We could probably try harder. LIBC=gnu eval $set_cc_for_build cat <<-EOF > $dummy.c #include #if defined(__UCLIBC__) LIBC=uclibc #elif defined(__dietlibc__) LIBC=dietlibc #else LIBC=gnu #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC' | sed 's, ,,g'` ;; esac # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ELF__ then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit ;; *:Bitrig:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE} exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; *:SolidBSD:*:*) echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd${UNAME_RELEASE} exit ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` # Reset EXIT trap before exiting to avoid spurious non-zero exit code. exitcode=$? trap '' 0 exit $exitcode ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; arm*:riscos:*:*|arm*:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; s390x:SunOS:*:*) echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) echo i386-pc-auroraux${UNAME_RELEASE} exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) eval $set_cc_for_build SUN_ARCH="i386" # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH="x86_64" fi fi echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`$dummy $dummyarg` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[4567]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/lslpp ] ; then IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then eval $set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) UNAME_PROCESSOR=`/usr/bin/uname -p` case ${UNAME_PROCESSOR} in amd64) echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; *:MINGW64*:*) echo ${UNAME_MACHINE}-pc-mingw64 exit ;; *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; *:MSYS*:*) echo ${UNAME_MACHINE}-pc-msys exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; *:Interix*:*) case ${UNAME_MACHINE} in x86) echo i586-pc-interix${UNAME_RELEASE} exit ;; authenticamd | genuineintel | EM64T) echo x86_64-unknown-interix${UNAME_RELEASE} exit ;; IA64) echo ia64-unknown-interix${UNAME_RELEASE} exit ;; esac ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; 8664:Windows_NT:*) echo x86_64-pc-mks exit ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC} exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; aarch64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 if test "$?" = 0 ; then LIBC="gnulibc1" ; fi echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; arc:Linux:*:* | arceb:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; arm*:Linux:*:*) eval $set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then echo ${UNAME_MACHINE}-unknown-linux-${LIBC} else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi else echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf fi fi exit ;; avr32*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; cris:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; crisv32:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; frv:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; hexagon:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; i*86:Linux:*:*) echo ${UNAME_MACHINE}-pc-linux-${LIBC} exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; mips:Linux:*:* | mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef ${UNAME_MACHINE} #undef ${UNAME_MACHINE}el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=${UNAME_MACHINE}el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=${UNAME_MACHINE} #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } ;; openrisc*:Linux:*:*) echo or1k-unknown-linux-${LIBC} exit ;; or32:Linux:*:* | or1k*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; padre:Linux:*:*) echo sparc-unknown-linux-${LIBC} exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-${LIBC} exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-${LIBC} ;; PA8*) echo hppa2.0-unknown-linux-${LIBC} ;; *) echo hppa-unknown-linux-${LIBC} ;; esac exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-${LIBC} exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-${LIBC} exit ;; ppc64le:Linux:*:*) echo powerpc64le-unknown-linux-${LIBC} exit ;; ppcle:Linux:*:*) echo powerpcle-unknown-linux-${LIBC} exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux-${LIBC} exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; tile*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-${LIBC} exit ;; x86_64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; xtensa*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub # prints for the "djgpp" host, or else GDB configury will decide that # this is a cross-build. echo i586-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; NCR*:*:4.2:* | MPRAS*:*:4.2:*) OS_REL='.3' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. echo i586-pc-haiku exit ;; x86_64:Haiku:*:*) echo x86_64-unknown-haiku exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux${UNAME_RELEASE} exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux${UNAME_RELEASE} exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux${UNAME_RELEASE} exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown eval $set_cc_for_build if test "$UNAME_PROCESSOR" = unknown ; then UNAME_PROCESSOR=powerpc fi if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then case $UNAME_PROCESSOR in i386) UNAME_PROCESSOR=x86_64 ;; powerpc) UNAME_PROCESSOR=powerpc64 ;; esac fi fi elif test "$UNAME_PROCESSOR" = i386 ; then # Avoid executing cc on OS X 10.9, as it ships with a stub # that puts up a graphical alert prompting to install # developer tools. Any system running Mac OS X 10.7 or # later (Darwin 11 and later) is required to have a 64-bit # processor. This is not true of the ARM version of Darwin # that Apple uses in portable devices. UNAME_PROCESSOR=x86_64 fi echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NEO-?:NONSTOP_KERNEL:*:*) echo neo-tandem-nsk${UNAME_RELEASE} exit ;; NSE-*:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos exit ;; i*86:AROS:*:*) echo ${UNAME_MACHINE}-pc-aros exit ;; x86_64:VMkernel:*:*) echo ${UNAME_MACHINE}-unknown-esx exit ;; esac cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: pkg-config-0.29.1/depcomp0000755000175000017500000005601612601774033012140 00000000000000#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2013-05-30.07; # UTC # Copyright (C) 1999-2014 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, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by 'PROGRAMS ARGS'. object Object file output by 'PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputting dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac # Get the directory component of the given path, and save it in the # global variables '$dir'. Note that this directory component will # be either empty or ending with a '/' character. This is deliberate. set_dir_from () { case $1 in */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; *) dir=;; esac } # Get the suffix-stripped basename of the given path, and save it the # global variable '$base'. set_base_from () { base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` } # If no dependency file was actually created by the compiler invocation, # we still have to create a dummy depfile, to avoid errors with the # Makefile "include basename.Plo" scheme. make_dummy_depfile () { echo "#dummy" > "$depfile" } # Factor out some common post-processing of the generated depfile. # Requires the auxiliary global variable '$tmpdepfile' to be set. aix_post_process_depfile () { # If the compiler actually managed to produce a dependency file, # post-process it. if test -f "$tmpdepfile"; then # Each line is of the form 'foo.o: dependency.h'. # Do two passes, one to just change these to # $object: dependency.h # and one to simply output # dependency.h: # which is needed to avoid the deleted-header problem. { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" } > "$depfile" rm -f "$tmpdepfile" else make_dummy_depfile fi } # A tabulation character. tab=' ' # A newline character. nl=' ' # Character ranges might be problematic outside the C locale. # These definitions help. upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ lower=abcdefghijklmnopqrstuvwxyz digits=0123456789 alpha=${upper}${lower} if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Avoid interferences from the environment. gccflag= dashmflag= # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi cygpath_u="cygpath -u -f -" if test "$depmode" = msvcmsys; then # This is just like msvisualcpp but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvisualcpp fi if test "$depmode" = msvc7msys; then # This is just like msvc7 but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvc7 fi if test "$depmode" = xlc; then # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. gccflag=-qmakedep=gcc,-MF depmode=gcc fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. ## Unfortunately, FreeBSD c89 acceptance of flags depends upon ## the command line argument order; so add the flags where they ## appear in depend2.am. Note that the slowdown incurred here ## affects only configure: in makefiles, %FASTDEP% shortcuts this. for arg do case $arg in -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; *) set fnord "$@" "$arg" ;; esac shift # fnord shift # $arg done "$@" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. ## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. ## (see the conditional assignment to $gccflag above). ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). Also, it might not be ## supported by the other compilers which use the 'gcc' depmode. ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The second -e expression handles DOS-style file names with drive # letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the "deleted header file" problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. ## Some versions of gcc put a space before the ':'. On the theory ## that the space means something, we add a space to the output as ## well. hp depmode also adds that space, but also prefixes the VPATH ## to the object. Take care to not repeat it in the output. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like '#:fec' to the end of the # dependency line. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ | tr "$nl" ' ' >> "$depfile" echo >> "$depfile" # The second pass generates a dummy entry for each header file. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" ;; xlc) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts '$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.u tmpdepfile2=$base.u tmpdepfile3=$dir.libs/$base.u "$@" -Wc,-M else tmpdepfile1=$dir$base.u tmpdepfile2=$dir$base.u tmpdepfile3=$dir$base.u "$@" -M fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done aix_post_process_depfile ;; tcc) # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 # FIXME: That version still under development at the moment of writing. # Make that this statement remains true also for stable, released # versions. # It will wrap lines (doesn't matter whether long or short) with a # trailing '\', as in: # # foo.o : \ # foo.c \ # foo.h \ # # It will put a trailing '\' even on the last line, and will use leading # spaces rather than leading tabs (at least since its commit 0394caf7 # "Emit spaces for -MD"). "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. # We have to change lines of the first kind to '$object: \'. sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" # And for each line of the second kind, we have to emit a 'dep.h:' # dummy dependency, to avoid the deleted-header problem. sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" rm -f "$tmpdepfile" ;; ## The order of this option in the case statement is important, since the ## shell code in configure will try each of these formats in the order ## listed in this file. A plain '-MD' option would be understood by many ## compilers, so we must ensure this comes after the gcc and icc options. pgcc) # Portland's C compiler understands '-MD'. # Will always output deps to 'file.d' where file is the root name of the # source file under compilation, even if file resides in a subdirectory. # The object file name does not affect the name of the '.d' file. # pgcc 10.2 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using '\' : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... set_dir_from "$object" # Use the source, not the object, to determine the base name, since # that's sadly what pgcc will do too. set_base_from "$source" tmpdepfile=$base.d # For projects that build the same source file twice into different object # files, the pgcc approach of using the *source* file root name can cause # problems in parallel builds. Use a locking strategy to avoid stomping on # the same $tmpdepfile. lockdir=$base.d-lock trap " echo '$0: caught signal, cleaning up...' >&2 rmdir '$lockdir' exit 1 " 1 2 13 15 numtries=100 i=$numtries while test $i -gt 0; do # mkdir is a portable test-and-set. if mkdir "$lockdir" 2>/dev/null; then # This process acquired the lock. "$@" -MD stat=$? # Release the lock. rmdir "$lockdir" break else # If the lock is being held by a different process, wait # until the winning process is done or we timeout. while test -d "$lockdir" && test $i -gt 0; do sleep 1 i=`expr $i - 1` done fi i=`expr $i - 1` done trap - 1 2 13 15 if test $i -le 0; then echo "$0: failed to acquire lock after $numtries attempts" >&2 echo "$0: check lockdir '$lockdir'" >&2 exit 1 fi if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form `foo.o: dependent.h', # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp2) # The "hp" stanza above does not work with aCC (C++) and HP's ia64 # compilers, which have integrated preprocessors. The correct option # to use with these is +Maked; it writes dependencies to a file named # 'foo.d', which lands next to the object file, wherever that # happens to be. # Much of this is similar to the tru64 case; see comments there. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.d tmpdepfile2=$dir.libs/$base.d "$@" -Wc,+Maked else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d "$@" +Maked fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" # Add 'dependent.h:' lines. sed -ne '2,${ s/^ *// s/ \\*$// s/$/:/ p }' "$tmpdepfile" >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" "$tmpdepfile2" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in 'foo.d' instead, so we check for that too. # Subdirectories are respected. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then # Libtool generates 2 separate objects for the 2 libraries. These # two compilations output dependencies in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is # automatically cleaned when .libs/ is deleted, while ignoring # the former would cause a distcleancheck panic. tmpdepfile1=$dir$base.o.d # libtool 1.5 tmpdepfile2=$dir.libs/$base.o.d # Likewise. tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d "$@" -MD fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done # Same post-processing that is required for AIX mode. aix_post_process_depfile ;; msvc7) if test "$libtool" = yes; then showIncludes=-Wc,-showIncludes else showIncludes=-showIncludes fi "$@" $showIncludes > "$tmpdepfile" stat=$? grep -v '^Note: including file: ' "$tmpdepfile" if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The first sed program below extracts the file names and escapes # backslashes for cygpath. The second sed program outputs the file # name when reading, but also accumulates all include files in the # hold buffer in order to output them again at the end. This only # works with sed implementations that can handle large buffers. sed < "$tmpdepfile" -n ' /^Note: including file: *\(.*\)/ { s//\1/ s/\\/\\\\/g p }' | $cygpath_u | sort -u | sed -n ' s/ /\\ /g s/\(.*\)/'"$tab"'\1 \\/p s/.\(.*\) \\/\1:/ H $ { s/.*/'"$tab"'/ G p }' >> "$depfile" echo >> "$depfile" # make sure the fragment doesn't end with a backslash rm -f "$tmpdepfile" ;; msvc7msys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for ':' # in the target name. This is to cope with DOS-style filenames: # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. "$@" $dashmflag | sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this sed invocation # correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # X makedepend shift cleared=no eat=no for arg do case $cleared in no) set ""; shift cleared=yes ;; esac if test $eat = yes; then eat=no continue fi case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -arch) eat=yes ;; -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix=`echo "$object" | sed 's/^.*\././'` touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" # makedepend may prepend the VPATH from the source file name to the object. # No need to regex-escape $object, excess matching of '.' is harmless. sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process the last invocation # correctly. Breaking it into two sed invocations is a workaround. sed '1,2d' "$tmpdepfile" \ | tr ' ' "$nl" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E \ | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi IFS=" " for arg do case "$arg" in -o) shift ;; $object) shift ;; "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E 2>/dev/null | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" echo "$tab" >> "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; msvcmsys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # 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: pkg-config-0.29.1/aclocal.m40000664000175000017500000132744212665370324012437 00000000000000# generated automatically by aclocal 1.15 -*- Autoconf -*- # Copyright (C) 1996-2014 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, [m4_warning([this file was generated for autoconf 2.69. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically 'autoreconf'.])]) # libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- # # Copyright (C) 1996-2001, 2003-2015 Free Software Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. m4_define([_LT_COPYING], [dnl # Copyright (C) 2014 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. # GNU Libtool 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 of of the License, or # (at your option) any later version. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program or library that is built # using GNU Libtool, you may include this file under the same # distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that 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, see . ]) # serial 58 LT_INIT # LT_PREREQ(VERSION) # ------------------ # Complain and exit if this libtool version is less that VERSION. m4_defun([LT_PREREQ], [m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, [m4_default([$3], [m4_fatal([Libtool version $1 or higher is required], 63)])], [$2])]) # _LT_CHECK_BUILDDIR # ------------------ # Complain if the absolute build directory name contains unusual characters m4_defun([_LT_CHECK_BUILDDIR], [case `pwd` in *\ * | *\ *) AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; esac ]) # LT_INIT([OPTIONS]) # ------------------ AC_DEFUN([LT_INIT], [AC_PREREQ([2.62])dnl We use AC_PATH_PROGS_FEATURE_CHECK AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl AC_BEFORE([$0], [LT_LANG])dnl AC_BEFORE([$0], [LT_OUTPUT])dnl AC_BEFORE([$0], [LTDL_INIT])dnl m4_require([_LT_CHECK_BUILDDIR])dnl dnl Autoconf doesn't catch unexpanded LT_ macros by default: m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 dnl unless we require an AC_DEFUNed macro: AC_REQUIRE([LTOPTIONS_VERSION])dnl AC_REQUIRE([LTSUGAR_VERSION])dnl AC_REQUIRE([LTVERSION_VERSION])dnl AC_REQUIRE([LTOBSOLETE_VERSION])dnl m4_require([_LT_PROG_LTMAIN])dnl _LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) dnl Parse OPTIONS _LT_SET_OPTIONS([$0], [$1]) # This can be used to rebuild libtool when needed LIBTOOL_DEPS=$ltmain # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' AC_SUBST(LIBTOOL)dnl _LT_SETUP # Only expand once: m4_define([LT_INIT]) ])# LT_INIT # Old names: AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PROG_LIBTOOL], []) dnl AC_DEFUN([AM_PROG_LIBTOOL], []) # _LT_PREPARE_CC_BASENAME # ----------------------- m4_defun([_LT_PREPARE_CC_BASENAME], [ # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. func_cc_basename () { for cc_temp in @S|@*""; do case $cc_temp in compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; \-*) ;; *) break;; esac done func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` } ])# _LT_PREPARE_CC_BASENAME # _LT_CC_BASENAME(CC) # ------------------- # It would be clearer to call AC_REQUIREs from _LT_PREPARE_CC_BASENAME, # but that macro is also expanded into generated libtool script, which # arranges for $SED and $ECHO to be set by different means. m4_defun([_LT_CC_BASENAME], [m4_require([_LT_PREPARE_CC_BASENAME])dnl AC_REQUIRE([_LT_DECL_SED])dnl AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl func_cc_basename $1 cc_basename=$func_cc_basename_result ]) # _LT_FILEUTILS_DEFAULTS # ---------------------- # It is okay to use these file commands and assume they have been set # sensibly after 'm4_require([_LT_FILEUTILS_DEFAULTS])'. m4_defun([_LT_FILEUTILS_DEFAULTS], [: ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} ])# _LT_FILEUTILS_DEFAULTS # _LT_SETUP # --------- m4_defun([_LT_SETUP], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl _LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl dnl _LT_DECL([], [host_alias], [0], [The host system])dnl _LT_DECL([], [host], [0])dnl _LT_DECL([], [host_os], [0])dnl dnl _LT_DECL([], [build_alias], [0], [The build system])dnl _LT_DECL([], [build], [0])dnl _LT_DECL([], [build_os], [0])dnl dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl dnl AC_REQUIRE([AC_PROG_LN_S])dnl test -z "$LN_S" && LN_S="ln -s" _LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl dnl AC_REQUIRE([LT_CMD_MAX_LEN])dnl _LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl _LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl m4_require([_LT_CMD_RELOAD])dnl m4_require([_LT_CHECK_MAGIC_METHOD])dnl m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl m4_require([_LT_CMD_OLD_ARCHIVE])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_WITH_SYSROOT])dnl m4_require([_LT_CMD_TRUNCATE])dnl _LT_CONFIG_LIBTOOL_INIT([ # See if we are running on zsh, and set the options that allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi ]) if test -n "${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi _LT_CHECK_OBJDIR m4_require([_LT_TAG_COMPILER])dnl case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test set != "${COLLECT_NAMES+set}"; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a '.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld=$lt_cv_prog_gnu_ld old_CC=$CC old_CFLAGS=$CFLAGS # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o _LT_CC_BASENAME([$compiler]) # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then _LT_PATH_MAGIC fi ;; esac # Use C for the default configuration in the libtool script LT_SUPPORTED_TAG([CC]) _LT_LANG_C_CONFIG _LT_LANG_DEFAULT_CONFIG _LT_CONFIG_COMMANDS ])# _LT_SETUP # _LT_PREPARE_SED_QUOTE_VARS # -------------------------- # Define a few sed substitution that help us do robust quoting. m4_defun([_LT_PREPARE_SED_QUOTE_VARS], [# Backslashify metacharacters that are still active within # double-quoted strings. sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\([["`\\]]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ]) # _LT_PROG_LTMAIN # --------------- # Note that this code is called both from 'configure', and 'config.status' # now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, # 'config.status' has no value for ac_aux_dir unless we are using Automake, # so we pass a copy along to make sure it has a sensible value anyway. m4_defun([_LT_PROG_LTMAIN], [m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl _LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) ltmain=$ac_aux_dir/ltmain.sh ])# _LT_PROG_LTMAIN # So that we can recreate a full libtool script including additional # tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS # in macros and then make a single call at the end using the 'libtool' # label. # _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) # ---------------------------------------- # Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL_INIT], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_INIT], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_INIT]) # _LT_CONFIG_LIBTOOL([COMMANDS]) # ------------------------------ # Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) # _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) # ----------------------------------------------------- m4_defun([_LT_CONFIG_SAVE_COMMANDS], [_LT_CONFIG_LIBTOOL([$1]) _LT_CONFIG_LIBTOOL_INIT([$2]) ]) # _LT_FORMAT_COMMENT([COMMENT]) # ----------------------------- # Add leading comment marks to the start of each line, and a trailing # full-stop to the whole comment if one is not present already. m4_define([_LT_FORMAT_COMMENT], [m4_ifval([$1], [ m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) )]) # _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) # ------------------------------------------------------------------- # CONFIGNAME is the name given to the value in the libtool script. # VARNAME is the (base) name used in the configure script. # VALUE may be 0, 1 or 2 for a computed quote escaped value based on # VARNAME. Any other value will be used directly. m4_define([_LT_DECL], [lt_if_append_uniq([lt_decl_varnames], [$2], [, ], [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], [m4_ifval([$1], [$1], [$2])]) lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) m4_ifval([$4], [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) lt_dict_add_subkey([lt_decl_dict], [$2], [tagged?], [m4_ifval([$5], [yes], [no])])]) ]) # _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) # -------------------------------------------------------- m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) # lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_tag_varnames], [_lt_decl_filter([tagged?], [yes], $@)]) # _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) # --------------------------------------------------------- m4_define([_lt_decl_filter], [m4_case([$#], [0], [m4_fatal([$0: too few arguments: $#])], [1], [m4_fatal([$0: too few arguments: $#: $1])], [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], [lt_dict_filter([lt_decl_dict], $@)])[]dnl ]) # lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) # -------------------------------------------------- m4_define([lt_decl_quote_varnames], [_lt_decl_filter([value], [1], $@)]) # lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_dquote_varnames], [_lt_decl_filter([value], [2], $@)]) # lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_varnames_tagged], [m4_assert([$# <= 2])dnl _$0(m4_quote(m4_default([$1], [[, ]])), m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) m4_define([_lt_decl_varnames_tagged], [m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) # lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_all_varnames], [_$0(m4_quote(m4_default([$1], [[, ]])), m4_if([$2], [], m4_quote(lt_decl_varnames), m4_quote(m4_shift($@))))[]dnl ]) m4_define([_lt_decl_all_varnames], [lt_join($@, lt_decl_varnames_tagged([$1], lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl ]) # _LT_CONFIG_STATUS_DECLARE([VARNAME]) # ------------------------------------ # Quote a variable value, and forward it to 'config.status' so that its # declaration there will have the same value as in 'configure'. VARNAME # must have a single quote delimited value for this to work. m4_define([_LT_CONFIG_STATUS_DECLARE], [$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`']) # _LT_CONFIG_STATUS_DECLARATIONS # ------------------------------ # We delimit libtool config variables with single quotes, so when # we write them to config.status, we have to be sure to quote all # embedded single quotes properly. In configure, this macro expands # each variable declared with _LT_DECL (and _LT_TAGDECL) into: # # ='`$ECHO "$" | $SED "$delay_single_quote_subst"`' m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], [m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAGS # ---------------- # Output comment and list of tags supported by the script m4_defun([_LT_LIBTOOL_TAGS], [_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl available_tags='_LT_TAGS'dnl ]) # _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) # ----------------------------------- # Extract the dictionary values for VARNAME (optionally with TAG) and # expand to a commented shell variable setting: # # # Some comment about what VAR is for. # visible_name=$lt_internal_name m4_define([_LT_LIBTOOL_DECLARE], [_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [description])))[]dnl m4_pushdef([_libtool_name], m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), [0], [_libtool_name=[$]$1], [1], [_libtool_name=$lt_[]$1], [2], [_libtool_name=$lt_[]$1], [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl ]) # _LT_LIBTOOL_CONFIG_VARS # ----------------------- # Produce commented declarations of non-tagged libtool config variables # suitable for insertion in the LIBTOOL CONFIG section of the 'libtool' # script. Tagged libtool config variables (even for the LIBTOOL CONFIG # section) are produced by _LT_LIBTOOL_TAG_VARS. m4_defun([_LT_LIBTOOL_CONFIG_VARS], [m4_foreach([_lt_var], m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAG_VARS(TAG) # ------------------------- m4_define([_LT_LIBTOOL_TAG_VARS], [m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) # _LT_TAGVAR(VARNAME, [TAGNAME]) # ------------------------------ m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) # _LT_CONFIG_COMMANDS # ------------------- # Send accumulated output to $CONFIG_STATUS. Thanks to the lists of # variables for single and double quote escaping we saved from calls # to _LT_DECL, we can put quote escaped variables declarations # into 'config.status', and then the shell code to quote escape them in # for loops in 'config.status'. Finally, any additional code accumulated # from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. m4_defun([_LT_CONFIG_COMMANDS], [AC_PROVIDE_IFELSE([LT_OUTPUT], dnl If the libtool generation code has been placed in $CONFIG_LT, dnl instead of duplicating it all over again into config.status, dnl then we will have config.status run $CONFIG_LT later, so it dnl needs to know what name is stored there: [AC_CONFIG_COMMANDS([libtool], [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], dnl If the libtool generation code is destined for config.status, dnl expand the accumulated commands and init code now: [AC_CONFIG_COMMANDS([libtool], [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) ])#_LT_CONFIG_COMMANDS # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], [ # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' _LT_CONFIG_STATUS_DECLARATIONS LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$[]1 _LTECHO_EOF' } # Quote evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_quote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_dquote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done _LT_OUTPUT_LIBTOOL_INIT ]) # _LT_GENERATED_FILE_INIT(FILE, [COMMENT]) # ------------------------------------ # Generate a child script FILE with all initialization necessary to # reuse the environment learned by the parent script, and make the # file executable. If COMMENT is supplied, it is inserted after the # '#!' sequence but before initialization text begins. After this # macro, additional text can be appended to FILE to form the body of # the child script. The macro ends with non-zero status if the # file could not be fully written (such as if the disk is full). m4_ifdef([AS_INIT_GENERATED], [m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])], [m4_defun([_LT_GENERATED_FILE_INIT], [m4_require([AS_PREPARE])]dnl [m4_pushdef([AS_MESSAGE_LOG_FD])]dnl [lt_write_fail=0 cat >$1 <<_ASEOF || lt_write_fail=1 #! $SHELL # Generated by $as_me. $2 SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$1 <<\_ASEOF || lt_write_fail=1 AS_SHELL_SANITIZE _AS_PREPARE exec AS_MESSAGE_FD>&1 _ASEOF test 0 = "$lt_write_fail" && chmod +x $1[]dnl m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT # LT_OUTPUT # --------- # This macro allows early generation of the libtool script (before # AC_OUTPUT is called), incase it is used in configure for compilation # tests. AC_DEFUN([LT_OUTPUT], [: ${CONFIG_LT=./config.lt} AC_MSG_NOTICE([creating $CONFIG_LT]) _LT_GENERATED_FILE_INIT(["$CONFIG_LT"], [# Run this file to recreate a libtool stub with the current configuration.]) cat >>"$CONFIG_LT" <<\_LTEOF lt_cl_silent=false exec AS_MESSAGE_LOG_FD>>config.log { echo AS_BOX([Running $as_me.]) } >&AS_MESSAGE_LOG_FD lt_cl_help="\ '$as_me' creates a local libtool stub from the current configuration, for use in further configure time tests before the real libtool is generated. Usage: $[0] [[OPTIONS]] -h, --help print this help, then exit -V, --version print version number, then exit -q, --quiet do not print progress messages -d, --debug don't remove temporary files Report bugs to ." lt_cl_version="\ m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) configured by $[0], generated by m4_PACKAGE_STRING. Copyright (C) 2011 Free Software Foundation, Inc. This config.lt script is free software; the Free Software Foundation gives unlimited permision to copy, distribute and modify it." while test 0 != $[#] do case $[1] in --version | --v* | -V ) echo "$lt_cl_version"; exit 0 ;; --help | --h* | -h ) echo "$lt_cl_help"; exit 0 ;; --debug | --d* | -d ) debug=: ;; --quiet | --q* | --silent | --s* | -q ) lt_cl_silent=: ;; -*) AC_MSG_ERROR([unrecognized option: $[1] Try '$[0] --help' for more information.]) ;; *) AC_MSG_ERROR([unrecognized argument: $[1] Try '$[0] --help' for more information.]) ;; esac shift done if $lt_cl_silent; then exec AS_MESSAGE_FD>/dev/null fi _LTEOF cat >>"$CONFIG_LT" <<_LTEOF _LT_OUTPUT_LIBTOOL_COMMANDS_INIT _LTEOF cat >>"$CONFIG_LT" <<\_LTEOF AC_MSG_NOTICE([creating $ofile]) _LT_OUTPUT_LIBTOOL_COMMANDS AS_EXIT(0) _LTEOF chmod +x "$CONFIG_LT" # configure is writing to config.log, but config.lt does its own redirection, # appending to config.log, which fails on DOS, as config.log is still kept # open by configure. Here we exec the FD to /dev/null, effectively closing # config.log, so it can be properly (re)opened and appended to by config.lt. lt_cl_success=: test yes = "$silent" && lt_config_lt_args="$lt_config_lt_args --quiet" exec AS_MESSAGE_LOG_FD>/dev/null $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false exec AS_MESSAGE_LOG_FD>>config.log $lt_cl_success || AS_EXIT(1) ])# LT_OUTPUT # _LT_CONFIG(TAG) # --------------- # If TAG is the built-in tag, create an initial libtool script with a # default configuration from the untagged config vars. Otherwise add code # to config.status for appending the configuration named by TAG from the # matching tagged config vars. m4_defun([_LT_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_CONFIG_SAVE_COMMANDS([ m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl m4_if(_LT_TAG, [C], [ # See if we are running on zsh, and set the options that allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi cfgfile=${ofile}T trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # Generated automatically by $as_me ($PACKAGE) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # Provide generalized library-building support services. # Written by Gordon Matzigkeit, 1996 _LT_COPYING _LT_LIBTOOL_TAGS # Configured defaults for sys_lib_dlsearch_path munging. : \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"} # ### BEGIN LIBTOOL CONFIG _LT_LIBTOOL_CONFIG_VARS _LT_LIBTOOL_TAG_VARS # ### END LIBTOOL CONFIG _LT_EOF cat <<'_LT_EOF' >> "$cfgfile" # ### BEGIN FUNCTIONS SHARED WITH CONFIGURE _LT_PREPARE_MUNGE_PATH_LIST _LT_PREPARE_CC_BASENAME # ### END FUNCTIONS SHARED WITH CONFIGURE _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test set != "${COLLECT_NAMES+set}"; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac _LT_PROG_LTMAIN # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" ], [cat <<_LT_EOF >> "$ofile" dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded dnl in a comment (ie after a #). # ### BEGIN LIBTOOL TAG CONFIG: $1 _LT_LIBTOOL_TAG_VARS(_LT_TAG) # ### END LIBTOOL TAG CONFIG: $1 _LT_EOF ])dnl /m4_if ], [m4_if([$1], [], [ PACKAGE='$PACKAGE' VERSION='$VERSION' RM='$RM' ofile='$ofile'], []) ])dnl /_LT_CONFIG_SAVE_COMMANDS ])# _LT_CONFIG # LT_SUPPORTED_TAG(TAG) # --------------------- # Trace this macro to discover what tags are supported by the libtool # --tag option, using: # autoconf --trace 'LT_SUPPORTED_TAG:$1' AC_DEFUN([LT_SUPPORTED_TAG], []) # C support is built-in for now m4_define([_LT_LANG_C_enabled], []) m4_define([_LT_TAGS], []) # LT_LANG(LANG) # ------------- # Enable libtool support for the given language if not already enabled. AC_DEFUN([LT_LANG], [AC_BEFORE([$0], [LT_OUTPUT])dnl m4_case([$1], [C], [_LT_LANG(C)], [C++], [_LT_LANG(CXX)], [Go], [_LT_LANG(GO)], [Java], [_LT_LANG(GCJ)], [Fortran 77], [_LT_LANG(F77)], [Fortran], [_LT_LANG(FC)], [Windows Resource], [_LT_LANG(RC)], [m4_ifdef([_LT_LANG_]$1[_CONFIG], [_LT_LANG($1)], [m4_fatal([$0: unsupported language: "$1"])])])dnl ])# LT_LANG # _LT_LANG(LANGNAME) # ------------------ m4_defun([_LT_LANG], [m4_ifdef([_LT_LANG_]$1[_enabled], [], [LT_SUPPORTED_TAG([$1])dnl m4_append([_LT_TAGS], [$1 ])dnl m4_define([_LT_LANG_]$1[_enabled], [])dnl _LT_LANG_$1_CONFIG($1)])dnl ])# _LT_LANG m4_ifndef([AC_PROG_GO], [ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_GO. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # m4_defun([AC_PROG_GO], [AC_LANG_PUSH(Go)dnl AC_ARG_VAR([GOC], [Go compiler command])dnl AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl _AC_ARG_VAR_LDFLAGS()dnl AC_CHECK_TOOL(GOC, gccgo) if test -z "$GOC"; then if test -n "$ac_tool_prefix"; then AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo]) fi fi if test -z "$GOC"; then AC_CHECK_PROG(GOC, gccgo, gccgo, false) fi ])#m4_defun ])#m4_ifndef # _LT_LANG_DEFAULT_CONFIG # ----------------------- m4_defun([_LT_LANG_DEFAULT_CONFIG], [AC_PROVIDE_IFELSE([AC_PROG_CXX], [LT_LANG(CXX)], [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) AC_PROVIDE_IFELSE([AC_PROG_F77], [LT_LANG(F77)], [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) AC_PROVIDE_IFELSE([AC_PROG_FC], [LT_LANG(FC)], [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal dnl pulling things in needlessly. AC_PROVIDE_IFELSE([AC_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([LT_PROG_GCJ], [LT_LANG(GCJ)], [m4_ifdef([AC_PROG_GCJ], [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([A][M_PROG_GCJ], [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([LT_PROG_GCJ], [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) AC_PROVIDE_IFELSE([AC_PROG_GO], [LT_LANG(GO)], [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])]) AC_PROVIDE_IFELSE([LT_PROG_RC], [LT_LANG(RC)], [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) ])# _LT_LANG_DEFAULT_CONFIG # Obsolete macros: AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_CXX], []) dnl AC_DEFUN([AC_LIBTOOL_F77], []) dnl AC_DEFUN([AC_LIBTOOL_FC], []) dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) dnl AC_DEFUN([AC_LIBTOOL_RC], []) # _LT_TAG_COMPILER # ---------------- m4_defun([_LT_TAG_COMPILER], [AC_REQUIRE([AC_PROG_CC])dnl _LT_DECL([LTCC], [CC], [1], [A C compiler])dnl _LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl _LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl _LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC ])# _LT_TAG_COMPILER # _LT_COMPILER_BOILERPLATE # ------------------------ # Check for compiler boilerplate output or warnings with # the simple compiler test code. m4_defun([_LT_COMPILER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ])# _LT_COMPILER_BOILERPLATE # _LT_LINKER_BOILERPLATE # ---------------------- # Check for linker boilerplate output or warnings with # the simple link test code. m4_defun([_LT_LINKER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ])# _LT_LINKER_BOILERPLATE # _LT_REQUIRED_DARWIN_CHECKS # ------------------------- m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ case $host_os in rhapsody* | darwin*) AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) AC_CHECK_TOOL([LIPO], [lipo], [:]) AC_CHECK_TOOL([OTOOL], [otool], [:]) AC_CHECK_TOOL([OTOOL64], [otool64], [:]) _LT_DECL([], [DSYMUTIL], [1], [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) _LT_DECL([], [NMEDIT], [1], [Tool to change global to local symbols on Mac OS X]) _LT_DECL([], [LIPO], [1], [Tool to manipulate fat objects and archives on Mac OS X]) _LT_DECL([], [OTOOL], [1], [ldd/readelf like tool for Mach-O binaries on Mac OS X]) _LT_DECL([], [OTOOL64], [1], [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], [lt_cv_apple_cc_single_mod=no if test -z "$LT_MULTI_MODULE"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? # If there is a non-empty error log, and "single_module" # appears in it, assume the flag caused a linker warning if test -s conftest.err && $GREP single_module conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. elif test -f libconftest.dylib && test 0 = "$_lt_result"; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -rf libconftest.dylib* rm -f conftest.* fi]) AC_CACHE_CHECK([for -exported_symbols_list linker flag], [lt_cv_ld_exported_symbols_list], [lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [lt_cv_ld_exported_symbols_list=yes], [lt_cv_ld_exported_symbols_list=no]) LDFLAGS=$save_LDFLAGS ]) AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], [lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then lt_cv_ld_force_load=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM ]) case $host_os in rhapsody* | darwin1.[[012]]) _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; 10.[[012]][[,.]]*) _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test yes = "$lt_cv_apple_cc_single_mod"; then _lt_dar_single_mod='$single_module' fi if test yes = "$lt_cv_ld_exported_symbols_list"; then _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib' fi if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac ]) # _LT_DARWIN_LINKER_FEATURES([TAG]) # --------------------------------- # Checks for linker and compiler features on darwin m4_defun([_LT_DARWIN_LINKER_FEATURES], [ m4_require([_LT_REQUIRED_DARWIN_CHECKS]) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported if test yes = "$lt_cv_ld_force_load"; then _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes], [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes]) else _LT_TAGVAR(whole_archive_flag_spec, $1)='' fi _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=$_lt_dar_allow_undefined case $cc_basename in ifort*|nagfor*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test yes = "$_lt_dar_can_shared"; then output_verbose_link_cmd=func_echo_all _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" m4_if([$1], [CXX], [ if test yes != "$lt_cv_apple_cc_single_mod"; then _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil" _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil" fi ],[]) else _LT_TAGVAR(ld_shlibs, $1)=no fi ]) # _LT_SYS_MODULE_PATH_AIX([TAGNAME]) # ---------------------------------- # Links a minimal program and checks the executable # for the system default hardcoded library path. In most cases, # this is /usr/lib:/lib, but when the MPI compilers are used # the location of the communication and MPI libs are included too. # If we don't find anything, use the default library path according # to the aix ld manual. # Store the results from the different compilers for each TAGNAME. # Allow to override them for all tags through lt_cv_aix_libpath. m4_defun([_LT_SYS_MODULE_PATH_AIX], [m4_require([_LT_DECL_SED])dnl if test set = "${lt_cv_aix_libpath+set}"; then aix_libpath=$lt_cv_aix_libpath else AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], [AC_LINK_IFELSE([AC_LANG_PROGRAM],[ lt_aix_libpath_sed='[ /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }]' _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi],[]) if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=/usr/lib:/lib fi ]) aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) fi ])# _LT_SYS_MODULE_PATH_AIX # _LT_SHELL_INIT(ARG) # ------------------- m4_define([_LT_SHELL_INIT], [m4_divert_text([M4SH-INIT], [$1 ])])# _LT_SHELL_INIT # _LT_PROG_ECHO_BACKSLASH # ----------------------- # Find how we can fake an echo command that does not interpret backslash. # In particular, with Autoconf 2.60 or later we add some code to the start # of the generated configure script that will find a shell with a builtin # printf (that we can use as an echo command). m4_defun([_LT_PROG_ECHO_BACKSLASH], [ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO AC_MSG_CHECKING([how to print strings]) # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $[]1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } case $ECHO in printf*) AC_MSG_RESULT([printf]) ;; print*) AC_MSG_RESULT([print -r]) ;; *) AC_MSG_RESULT([cat]) ;; esac m4_ifdef([_AS_DETECT_SUGGESTED], [_AS_DETECT_SUGGESTED([ test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test "X`printf %s $ECHO`" = "X$ECHO" \ || test "X`print -r -- $ECHO`" = "X$ECHO" )])]) _LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) _LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) ])# _LT_PROG_ECHO_BACKSLASH # _LT_WITH_SYSROOT # ---------------- AC_DEFUN([_LT_WITH_SYSROOT], [AC_MSG_CHECKING([for sysroot]) AC_ARG_WITH([sysroot], [AS_HELP_STRING([--with-sysroot@<:@=DIR@:>@], [Search for dependent libraries within DIR (or the compiler's sysroot if not specified).])], [], [with_sysroot=no]) dnl lt_sysroot will always be passed unquoted. We quote it here dnl in case the user passed a directory name. lt_sysroot= case $with_sysroot in #( yes) if test yes = "$GCC"; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) AC_MSG_RESULT([$with_sysroot]) AC_MSG_ERROR([The sysroot must be an absolute path.]) ;; esac AC_MSG_RESULT([${lt_sysroot:-no}]) _LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl [dependent libraries, and where our libraries should be installed.])]) # _LT_ENABLE_LOCK # --------------- m4_defun([_LT_ENABLE_LOCK], [AC_ARG_ENABLE([libtool-lock], [AS_HELP_STRING([--disable-libtool-lock], [avoid locking (might break parallel builds)])]) test no = "$enable_libtool_lock" || enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out what ABI is being produced by ac_compile, and set mode # options accordingly. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE=32 ;; *ELF-64*) HPUX_IA64_MODE=64 ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then if test yes = "$lt_cv_prog_gnu_ld"; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; mips64*-*linux*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then emul=elf case `/usr/bin/file conftest.$ac_objext` in *32-bit*) emul="${emul}32" ;; *64-bit*) emul="${emul}64" ;; esac case `/usr/bin/file conftest.$ac_objext` in *MSB*) emul="${emul}btsmip" ;; *LSB*) emul="${emul}ltsmip" ;; esac case `/usr/bin/file conftest.$ac_objext` in *N32*) emul="${emul}n32" ;; esac LD="${LD-ld} -m $emul" fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. Note that the listed cases only cover the # situations where additional linker options are needed (such as when # doing 32-bit compilation for a host where ld defaults to 64-bit, or # vice versa); the common cases where no linker options are needed do # not appear in the list. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) case `/usr/bin/file conftest.o` in *x86-64*) LD="${LD-ld} -m elf32_x86_64" ;; *) LD="${LD-ld} -m elf_i386" ;; esac ;; powerpc64le-*linux*) LD="${LD-ld} -m elf32lppclinux" ;; powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; powerpcle-*linux*) LD="${LD-ld} -m elf64lppc" ;; powerpc-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS=$CFLAGS CFLAGS="$CFLAGS -belf" AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, [AC_LANG_PUSH(C) AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) AC_LANG_POP]) if test yes != "$lt_cv_cc_needs_belf"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS=$SAVE_CFLAGS fi ;; *-*solaris*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) case $host in i?86-*-solaris*|x86_64-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) LD="${LD-ld} -m elf64_sparc" ;; esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then LD=${LD-ld}_sol2 fi ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks=$enable_libtool_lock ])# _LT_ENABLE_LOCK # _LT_PROG_AR # ----------- m4_defun([_LT_PROG_AR], [AC_CHECK_TOOLS(AR, [ar], false) : ${AR=ar} : ${AR_FLAGS=cru} _LT_DECL([], [AR], [1], [The archiver]) _LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive]) AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], [lt_cv_ar_at_file=no AC_COMPILE_IFELSE([AC_LANG_PROGRAM], [echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' AC_TRY_EVAL([lt_ar_try]) if test 0 -eq "$ac_status"; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a AC_TRY_EVAL([lt_ar_try]) if test 0 -ne "$ac_status"; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a ]) ]) if test no = "$lt_cv_ar_at_file"; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi _LT_DECL([], [archiver_list_spec], [1], [How to feed a file listing to the archiver]) ])# _LT_PROG_AR # _LT_CMD_OLD_ARCHIVE # ------------------- m4_defun([_LT_CMD_OLD_ARCHIVE], [_LT_PROG_AR AC_CHECK_TOOL(STRIP, strip, :) test -z "$STRIP" && STRIP=: _LT_DECL([], [STRIP], [1], [A symbol stripping program]) AC_CHECK_TOOL(RANLIB, ranlib, :) test -z "$RANLIB" && RANLIB=: _LT_DECL([], [RANLIB], [1], [Commands used to install an old-style archive]) # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in bitrig* | openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac _LT_DECL([], [old_postinstall_cmds], [2]) _LT_DECL([], [old_postuninstall_cmds], [2]) _LT_TAGDECL([], [old_archive_cmds], [2], [Commands used to build an old-style archive]) _LT_DECL([], [lock_old_archive_extraction], [0], [Whether to use a lock for old archive extraction]) ])# _LT_CMD_OLD_ARCHIVE # _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------------------- # Check whether the given compiler option works AC_DEFUN([_LT_COMPILER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$3" ## exclude from sc_useless_quotes_in_assignment # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi fi $RM conftest* ]) if test yes = "[$]$2"; then m4_if([$5], , :, [$5]) else m4_if([$6], , :, [$6]) fi ])# _LT_COMPILER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) # _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------- # Check whether the given linker option works AC_DEFUN([_LT_LINKER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS $3" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&AS_MESSAGE_LOG_FD $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi else $2=yes fi fi $RM -r conftest* LDFLAGS=$save_LDFLAGS ]) if test yes = "[$]$2"; then m4_if([$4], , :, [$4]) else m4_if([$5], , :, [$5]) fi ])# _LT_LINKER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) # LT_CMD_MAX_LEN #--------------- AC_DEFUN([LT_CMD_MAX_LEN], [AC_REQUIRE([AC_CANONICAL_HOST])dnl # find the maximum length of command line arguments AC_MSG_CHECKING([the maximum length of command line arguments]) AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl i=0 teststring=ABCD case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; os2*) # The test takes a long time on OS/2. lt_cv_sys_max_cmd_len=8192 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len" && \ test undefined != "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test X`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test 17 != "$i" # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac ]) if test -n "$lt_cv_sys_max_cmd_len"; then AC_MSG_RESULT($lt_cv_sys_max_cmd_len) else AC_MSG_RESULT(none) fi max_cmd_len=$lt_cv_sys_max_cmd_len _LT_DECL([], [max_cmd_len], [0], [What is the maximum length of a command?]) ])# LT_CMD_MAX_LEN # Old name: AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) # _LT_HEADER_DLFCN # ---------------- m4_defun([_LT_HEADER_DLFCN], [AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl ])# _LT_HEADER_DLFCN # _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, # ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) # ---------------------------------------------------------------- m4_defun([_LT_TRY_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test yes = "$cross_compiling"; then : [$4] else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF [#line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisibility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; }] _LT_EOF if AC_TRY_EVAL(ac_link) && test -s "conftest$ac_exeext" 2>/dev/null; then (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) $1 ;; x$lt_dlneed_uscore) $2 ;; x$lt_dlunknown|x*) $3 ;; esac else : # compilation failed $3 fi fi rm -fr conftest* ])# _LT_TRY_DLOPEN_SELF # LT_SYS_DLOPEN_SELF # ------------------ AC_DEFUN([LT_SYS_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test yes != "$enable_dlopen"; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen=load_add_on lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen=LoadLibrary lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen=dlopen lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl],[ lt_cv_dlopen=dyld lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ]) ;; tpf*) # Don't try to run any link tests for TPF. We know it's impossible # because TPF is a cross-compiler, and we know how we open DSOs. lt_cv_dlopen=dlopen lt_cv_dlopen_libs= lt_cv_dlopen_self=no ;; *) AC_CHECK_FUNC([shl_load], [lt_cv_dlopen=shl_load], [AC_CHECK_LIB([dld], [shl_load], [lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld], [AC_CHECK_FUNC([dlopen], [lt_cv_dlopen=dlopen], [AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl], [AC_CHECK_LIB([svld], [dlopen], [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld], [AC_CHECK_LIB([dld], [dld_link], [lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld]) ]) ]) ]) ]) ]) ;; esac if test no = "$lt_cv_dlopen"; then enable_dlopen=no else enable_dlopen=yes fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS=$CPPFLAGS test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS=$LDFLAGS wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS=$LIBS LIBS="$lt_cv_dlopen_libs $LIBS" AC_CACHE_CHECK([whether a program can dlopen itself], lt_cv_dlopen_self, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) ]) if test yes = "$lt_cv_dlopen_self"; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" AC_CACHE_CHECK([whether a statically linked program can dlopen itself], lt_cv_dlopen_self_static, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) ]) fi CPPFLAGS=$save_CPPFLAGS LDFLAGS=$save_LDFLAGS LIBS=$save_LIBS ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi _LT_DECL([dlopen_support], [enable_dlopen], [0], [Whether dlopen is supported]) _LT_DECL([dlopen_self], [enable_dlopen_self], [0], [Whether dlopen of programs is supported]) _LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], [Whether dlopen of statically linked programs is supported]) ])# LT_SYS_DLOPEN_SELF # Old name: AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) # _LT_COMPILER_C_O([TAGNAME]) # --------------------------- # Check to see if options -c and -o are simultaneously supported by compiler. # This macro does not hard code the compiler like AC_PROG_CC_C_O. m4_defun([_LT_COMPILER_C_O], [m4_require([_LT_DECL_SED])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes fi fi chmod u+w . 2>&AS_MESSAGE_LOG_FD $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* ]) _LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], [Does compiler simultaneously support -c and -o options?]) ])# _LT_COMPILER_C_O # _LT_COMPILER_FILE_LOCKS([TAGNAME]) # ---------------------------------- # Check to see if we can do hard links to lock some files if needed m4_defun([_LT_COMPILER_FILE_LOCKS], [m4_require([_LT_ENABLE_LOCK])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_COMPILER_C_O([$1]) hard_links=nottested if test no = "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" && test no != "$need_locks"; then # do not overwrite the value of need_locks provided by the user AC_MSG_CHECKING([if we can lock with hard links]) hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no AC_MSG_RESULT([$hard_links]) if test no = "$hard_links"; then AC_MSG_WARN(['$CC' does not support '-c -o', so 'make -j' may be unsafe]) need_locks=warn fi else need_locks=no fi _LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) ])# _LT_COMPILER_FILE_LOCKS # _LT_CHECK_OBJDIR # ---------------- m4_defun([_LT_CHECK_OBJDIR], [AC_CACHE_CHECK([for objdir], [lt_cv_objdir], [rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null]) objdir=$lt_cv_objdir _LT_DECL([], [objdir], [0], [The name of the directory that contains temporary libtool files])dnl m4_pattern_allow([LT_OBJDIR])dnl AC_DEFINE_UNQUOTED([LT_OBJDIR], "$lt_cv_objdir/", [Define to the sub-directory where libtool stores uninstalled libraries.]) ])# _LT_CHECK_OBJDIR # _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) # -------------------------------------- # Check hardcoding attributes. m4_defun([_LT_LINKER_HARDCODE_LIBPATH], [AC_MSG_CHECKING([how to hardcode library paths into programs]) _LT_TAGVAR(hardcode_action, $1)= if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || test -n "$_LT_TAGVAR(runpath_var, $1)" || test yes = "$_LT_TAGVAR(hardcode_automatic, $1)"; then # We can hardcode non-existent directories. if test no != "$_LT_TAGVAR(hardcode_direct, $1)" && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" && test no != "$_LT_TAGVAR(hardcode_minus_L, $1)"; then # Linking always hardcodes the temporary library directory. _LT_TAGVAR(hardcode_action, $1)=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. _LT_TAGVAR(hardcode_action, $1)=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. _LT_TAGVAR(hardcode_action, $1)=unsupported fi AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) if test relink = "$_LT_TAGVAR(hardcode_action, $1)" || test yes = "$_LT_TAGVAR(inherit_rpath, $1)"; then # Fast installation is not supported enable_fast_install=no elif test yes = "$shlibpath_overrides_runpath" || test no = "$enable_shared"; then # Fast installation is not necessary enable_fast_install=needless fi _LT_TAGDECL([], [hardcode_action], [0], [How to hardcode a shared library path into an executable]) ])# _LT_LINKER_HARDCODE_LIBPATH # _LT_CMD_STRIPLIB # ---------------- m4_defun([_LT_CMD_STRIPLIB], [m4_require([_LT_DECL_EGREP]) striplib= old_striplib= AC_MSG_CHECKING([whether stripping libraries is possible]) if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" AC_MSG_RESULT([yes]) else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP"; then striplib="$STRIP -x" old_striplib="$STRIP -S" AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) fi ;; *) AC_MSG_RESULT([no]) ;; esac fi _LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) _LT_DECL([], [striplib], [1]) ])# _LT_CMD_STRIPLIB # _LT_PREPARE_MUNGE_PATH_LIST # --------------------------- # Make sure func_munge_path_list() is defined correctly. m4_defun([_LT_PREPARE_MUNGE_PATH_LIST], [[# func_munge_path_list VARIABLE PATH # ----------------------------------- # VARIABLE is name of variable containing _space_ separated list of # directories to be munged by the contents of PATH, which is string # having a format: # "DIR[:DIR]:" # string "DIR[ DIR]" will be prepended to VARIABLE # ":DIR[:DIR]" # string "DIR[ DIR]" will be appended to VARIABLE # "DIRP[:DIRP]::[DIRA:]DIRA" # string "DIRP[ DIRP]" will be prepended to VARIABLE and string # "DIRA[ DIRA]" will be appended to VARIABLE # "DIR[:DIR]" # VARIABLE will be replaced by "DIR[ DIR]" func_munge_path_list () { case x@S|@2 in x) ;; *:) eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'` \@S|@@S|@1\" ;; x:*) eval @S|@1=\"\@S|@@S|@1 `$ECHO @S|@2 | $SED 's/:/ /g'`\" ;; *::*) eval @S|@1=\"\@S|@@S|@1\ `$ECHO @S|@2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" eval @S|@1=\"`$ECHO @S|@2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \@S|@@S|@1\" ;; *) eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'`\" ;; esac } ]])# _LT_PREPARE_PATH_LIST # _LT_SYS_DYNAMIC_LINKER([TAG]) # ----------------------------- # PORTME Fill in your ld.so characteristics m4_defun([_LT_SYS_DYNAMIC_LINKER], [AC_REQUIRE([AC_CANONICAL_HOST])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_OBJDUMP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl m4_require([_LT_PREPARE_MUNGE_PATH_LIST])dnl AC_MSG_CHECKING([dynamic linker characteristics]) m4_if([$1], [], [ if test yes = "$GCC"; then case $host_os in darwin*) lt_awk_arg='/^libraries:/,/LR/' ;; *) lt_awk_arg='/^libraries:/' ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq='s|=\([[A-Za-z]]:\)|\1|g' ;; *) lt_sed_strip_eq='s|=/|/|g' ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary... lt_tmp_lt_search_path_spec= lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` # ...but if some path component already ends with the multilib dir we assume # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer). case "$lt_multi_os_dir; $lt_search_path_spec " in "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*) lt_multi_os_dir= ;; esac for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir" elif test -n "$lt_multi_os_dir"; then test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS = " "; FS = "/|\n";} { lt_foo = ""; lt_count = 0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo = "/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[[lt_foo]]++; } if (lt_freq[[lt_foo]] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's|/\([[A-Za-z]]:\)|\1|g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi]) library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=.so postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown AC_ARG_VAR([LT_SYS_LIBRARY_PATH], [User-defined run-time library search path.]) case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='$libname$release$shared_ext$major' ;; aix[[4-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test ia64 = "$host_cpu"; then # AIX 5 supports IA64 library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line '#! .'. This would cause the generated library to # depend on '.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[[01]] | aix4.[[01]].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # Using Import Files as archive members, it is possible to support # filename-based versioning of shared library archives on AIX. While # this would work for both with and without runtime linking, it will # prevent static linking of such archives. So we do filename-based # shared library versioning with .so extension only, which is used # when both runtime linking and shared linking is enabled. # Unfortunately, runtime linking may impact performance, so we do # not want this to be the default eventually. Also, we use the # versioned .so libs for executables only if there is the -brtl # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. # To allow for filename-based versioning support, we need to create # libNAME.so.V as an archive file, containing: # *) an Import File, referring to the versioned filename of the # archive as well as the shared archive member, telling the # bitwidth (32 or 64) of that shared object, and providing the # list of exported symbols of that shared object, eventually # decorated with the 'weak' keyword # *) the shared object with the F_LOADONLY flag set, to really avoid # it being seen by the linker. # At run time we better use the real file rather than another symlink, # but for link time we create the symlink libNAME.so -> libNAME.so.V case $with_aix_soname,$aix_use_runtimelinking in # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. aix,yes) # traditional libtool dynamic_linker='AIX unversionable lib.so' # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' ;; aix,no) # traditional AIX only dynamic_linker='AIX lib.a[(]lib.so.V[)]' # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='$libname$release.a $libname.a' soname_spec='$libname$release$shared_ext$major' ;; svr4,*) # full svr4 only dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)]" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,yes) # both, prefer svr4 dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)], lib.a[(]lib.so.V[)]" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # unpreferred sharedlib libNAME.a needs extra handling postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,no) # both, prefer aix dynamic_linker="AIX lib.a[(]lib.so.V[)], lib.so.V[(]$shared_archive_member_spec.o[)]" library_names_spec='$libname$release.a $libname.a' soname_spec='$libname$release$shared_ext$major' # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' ;; esac shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='$libname$shared_ext' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[[45]]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=.dll need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' library_names_spec='$libname.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec=$LIB if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' soname_spec='$libname$release$major$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[[23]].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[[01]]* | freebsdelf3.[[01]]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=no sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' if test 32 = "$HPUX_IA64_MODE"; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" sys_lib_dlsearch_path_spec=/usr/lib/hpux32 else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" sys_lib_dlsearch_path_spec=/usr/lib/hpux64 fi ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[[3-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test yes = "$lt_cv_prog_gnu_ld"; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='$libname$release$shared_ext$major' library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; linux*android*) version_type=none # Android doesn't support versioned libraries. need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext' soname_spec='$libname$release$shared_ext' finish_cmds= shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes dynamic_linker='Android linker' # Don't embed -rpath directories since the linker doesn't support them. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath], [lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], [lt_cv_shlibpath_overrides_runpath=yes])]) LDFLAGS=$save_LDFLAGS libdir=$save_libdir ]) shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Add ABI-specific directories to the system library path. sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib" # Ideally, we could use ldconfig to report *all* directores which are # searched for libraries, however this is still not possible. Aside from not # being certain /sbin/ldconfig is available, command # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, # even though it is searched at run-time. Try to do the best guess by # appending ld.so.conf contents (and includes) to the search path. if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd* | bitrig*) version_type=sunos sys_lib_dlsearch_path_spec=/usr/lib need_lib_prefix=no if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then need_version=no else need_version=yes fi library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; os2*) libname_spec='$name' version_type=windows shrext_cmds=.dll need_version=no need_lib_prefix=no # OS/2 can only load a DLL with a base name of 8 characters or less. soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; v=$($ECHO $release$versuffix | tr -d .-); n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); $ECHO $n$v`$shared_ext' library_names_spec='${libname}_dll.$libext' dynamic_linker='OS/2 ld.exe' shlibpath_var=BEGINLIBPATH sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='$libname$release$shared_ext$major' library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test yes = "$with_gnu_ld"; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec; then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' soname_spec='$libname$shared_ext.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=sco need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test yes = "$with_gnu_ld"; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac AC_MSG_RESULT([$dynamic_linker]) test no = "$dynamic_linker" && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test yes = "$GCC"; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec fi if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec fi # remember unaugmented sys_lib_dlsearch_path content for libtool script decls... configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec # ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" # to be used as default LT_SYS_LIBRARY_PATH value in generated libtool configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH _LT_DECL([], [variables_saved_for_relink], [1], [Variables whose values should be saved in libtool wrapper scripts and restored at link time]) _LT_DECL([], [need_lib_prefix], [0], [Do we need the "lib" prefix for modules?]) _LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) _LT_DECL([], [version_type], [0], [Library versioning type]) _LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) _LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) _LT_DECL([], [shlibpath_overrides_runpath], [0], [Is shlibpath searched before the hard-coded library search path?]) _LT_DECL([], [libname_spec], [1], [Format of library name prefix]) _LT_DECL([], [library_names_spec], [1], [[List of archive names. First name is the real one, the rest are links. The last name is the one that the linker finds with -lNAME]]) _LT_DECL([], [soname_spec], [1], [[The coded name of the library, if different from the real name]]) _LT_DECL([], [install_override_mode], [1], [Permission mode override for installation of shared libraries]) _LT_DECL([], [postinstall_cmds], [2], [Command to use after installation of a shared archive]) _LT_DECL([], [postuninstall_cmds], [2], [Command to use after uninstallation of a shared archive]) _LT_DECL([], [finish_cmds], [2], [Commands used to finish a libtool library installation in a directory]) _LT_DECL([], [finish_eval], [1], [[As "finish_cmds", except a single script fragment to be evaled but not shown]]) _LT_DECL([], [hardcode_into_libs], [0], [Whether we should hardcode library paths into libraries]) _LT_DECL([], [sys_lib_search_path_spec], [2], [Compile-time system search path for libraries]) _LT_DECL([sys_lib_dlsearch_path_spec], [configure_time_dlsearch_path], [2], [Detected run-time system search path for libraries]) _LT_DECL([], [configure_time_lt_sys_library_path], [2], [Explicit LT_SYS_LIBRARY_PATH set during ./configure time]) ])# _LT_SYS_DYNAMIC_LINKER # _LT_PATH_TOOL_PREFIX(TOOL) # -------------------------- # find a file program that can recognize shared library AC_DEFUN([_LT_PATH_TOOL_PREFIX], [m4_require([_LT_DECL_EGREP])dnl AC_MSG_CHECKING([for $1]) AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, [case $MAGIC_CMD in [[\\/*] | ?:[\\/]*]) lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD=$MAGIC_CMD lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR dnl $ac_dummy forces splitting on constant user-supplied paths. dnl POSIX.2 word splitting is done only on the output of word expansions, dnl not every word. This closes a longstanding sh security hole. ac_dummy="m4_if([$2], , $PATH, [$2])" for ac_dir in $ac_dummy; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$1"; then lt_cv_path_MAGIC_CMD=$ac_dir/"$1" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD=$lt_cv_path_MAGIC_CMD if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS=$lt_save_ifs MAGIC_CMD=$lt_save_MAGIC_CMD ;; esac]) MAGIC_CMD=$lt_cv_path_MAGIC_CMD if test -n "$MAGIC_CMD"; then AC_MSG_RESULT($MAGIC_CMD) else AC_MSG_RESULT(no) fi _LT_DECL([], [MAGIC_CMD], [0], [Used to examine libraries when file_magic_cmd begins with "file"])dnl ])# _LT_PATH_TOOL_PREFIX # Old name: AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) # _LT_PATH_MAGIC # -------------- # find a file program that can recognize a shared library m4_defun([_LT_PATH_MAGIC], [_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) else MAGIC_CMD=: fi fi ])# _LT_PATH_MAGIC # LT_PATH_LD # ---------- # find the pathname to the GNU or non-GNU linker AC_DEFUN([LT_PATH_LD], [AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PROG_ECHO_BACKSLASH])dnl AC_ARG_WITH([gnu-ld], [AS_HELP_STRING([--with-gnu-ld], [assume the C compiler uses GNU ld @<:@default=no@:>@])], [test no = "$withval" || with_gnu_ld=yes], [with_gnu_ld=no])dnl ac_prog=ld if test yes = "$GCC"; then # Check if gcc -print-prog-name=ld gives a path. AC_MSG_CHECKING([for ld used by $CC]) case $host in *-*-mingw*) # gcc leaves a trailing carriage return, which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [[\\/]]* | ?:[[\\/]]*) re_direlt='/[[^/]][[^/]]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD=$ac_prog ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test yes = "$with_gnu_ld"; then AC_MSG_CHECKING([for GNU ld]) else AC_MSG_CHECKING([for non-GNU ld]) fi AC_CACHE_VAL(lt_cv_path_LD, [if test -z "$LD"; then lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD=$ac_dir/$ac_prog # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &1 conftest.i cat conftest.i conftest.i >conftest2.i : ${lt_DD:=$DD} AC_PATH_PROGS_FEATURE_CHECK([lt_DD], [dd], [if "$ac_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then cmp -s conftest.i conftest.out \ && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=: fi]) rm -f conftest.i conftest2.i conftest.out]) ])# _LT_PATH_DD # _LT_CMD_TRUNCATE # ---------------- # find command to truncate a binary pipe m4_defun([_LT_CMD_TRUNCATE], [m4_require([_LT_PATH_DD]) AC_CACHE_CHECK([how to truncate binary pipes], [lt_cv_truncate_bin], [printf 0123456789abcdef0123456789abcdef >conftest.i cat conftest.i conftest.i >conftest2.i lt_cv_truncate_bin= if "$ac_cv_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then cmp -s conftest.i conftest.out \ && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1" fi rm -f conftest.i conftest2.i conftest.out test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q"]) _LT_DECL([lt_truncate_bin], [lt_cv_truncate_bin], [1], [Command to truncate a binary pipe]) ])# _LT_CMD_TRUNCATE # _LT_CHECK_MAGIC_METHOD # ---------------------- # how to check for library dependencies # -- PORTME fill in with the dynamic library characteristics m4_defun([_LT_CHECK_MAGIC_METHOD], [m4_require([_LT_DECL_EGREP]) m4_require([_LT_DECL_OBJDUMP]) AC_CACHE_CHECK([how to recognize dependent libraries], lt_cv_deplibs_check_method, [lt_cv_file_magic_cmd='$MAGIC_CMD' lt_cv_file_magic_test_file= lt_cv_deplibs_check_method='unknown' # Need to set the preceding variable on all platforms that support # interlibrary dependencies. # 'none' -- dependencies not supported. # 'unknown' -- same as none, but documents that we really don't know. # 'pass_all' -- all dependencies passed with no checks. # 'test_compile' -- check by making test program. # 'file_magic [[regex]]' -- check by looking for files in library path # that responds to the $file_magic_cmd with a given extended regex. # If you have 'file' or equivalent on your system and you're not sure # whether 'pass_all' will *always* work, you probably want this one. case $host_os in aix[[4-9]]*) lt_cv_deplibs_check_method=pass_all ;; beos*) lt_cv_deplibs_check_method=pass_all ;; bsdi[[45]]*) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)' lt_cv_file_magic_cmd='/usr/bin/file -L' lt_cv_file_magic_test_file=/shlib/libc.so ;; cygwin*) # func_win32_libid is a shell function defined in ltmain.sh lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' ;; mingw* | pw32*) # Base MSYS/MinGW do not provide the 'file' command needed by # func_win32_libid shell function, so use a weaker test based on 'objdump', # unless we find 'file', for example because we are cross-compiling. if ( file / ) >/dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'] lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[[3-9]]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) lt_cv_deplibs_check_method=pass_all ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd* | bitrig*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; os2*) lt_cv_deplibs_check_method=pass_all ;; esac ]) file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown _LT_DECL([], [deplibs_check_method], [1], [Method to check whether dependent libraries are shared objects]) _LT_DECL([], [file_magic_cmd], [1], [Command to use when deplibs_check_method = "file_magic"]) _LT_DECL([], [file_magic_glob], [1], [How to find potential files when deplibs_check_method = "file_magic"]) _LT_DECL([], [want_nocaseglob], [1], [Find potential files using nocaseglob when deplibs_check_method = "file_magic"]) ])# _LT_CHECK_MAGIC_METHOD # LT_PATH_NM # ---------- # find the pathname to a BSD- or MS-compatible name lister AC_DEFUN([LT_PATH_NM], [AC_REQUIRE([AC_PROG_CC])dnl AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, [if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM=$NM else lt_nm_to_check=${ac_tool_prefix}nm if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. tmp_nm=$ac_dir/$lt_tmp_nm if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then # Check to see if the nm accepts a BSD-compat flag. # Adding the 'sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty case $build_os in mingw*) lt_bad_file=conftest.nm/nofile ;; *) lt_bad_file=/dev/null ;; esac case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in *$lt_bad_file* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break 2 ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break 2 ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS=$lt_save_ifs done : ${lt_cv_path_NM=no} fi]) if test no != "$lt_cv_path_NM"; then NM=$lt_cv_path_NM else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols -headers" ;; *) DUMPBIN=: ;; esac fi AC_SUBST([DUMPBIN]) if test : != "$DUMPBIN"; then NM=$DUMPBIN fi fi test -z "$NM" && NM=nm AC_SUBST([NM]) _LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], [lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) cat conftest.out >&AS_MESSAGE_LOG_FD if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest*]) ])# LT_PATH_NM # Old names: AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_PROG_NM], []) dnl AC_DEFUN([AC_PROG_NM], []) # _LT_CHECK_SHAREDLIB_FROM_LINKLIB # -------------------------------- # how to determine the name of the shared library # associated with a specific link library. # -- PORTME fill in with the dynamic library characteristics m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB], [m4_require([_LT_DECL_EGREP]) m4_require([_LT_DECL_OBJDUMP]) m4_require([_LT_DECL_DLLTOOL]) AC_CACHE_CHECK([how to associate runtime and link libraries], lt_cv_sharedlib_from_linklib_cmd, [lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh; # decide which one to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd=$ECHO ;; esac ]) sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO _LT_DECL([], [sharedlib_from_linklib_cmd], [1], [Command to associate shared and link libraries]) ])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB # _LT_PATH_MANIFEST_TOOL # ---------------------- # locate the manifest tool m4_defun([_LT_PATH_MANIFEST_TOOL], [AC_CHECK_TOOL(MANIFEST_TOOL, mt, :) test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool], [lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&AS_MESSAGE_LOG_FD if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest*]) if test yes != "$lt_cv_path_mainfest_tool"; then MANIFEST_TOOL=: fi _LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl ])# _LT_PATH_MANIFEST_TOOL # _LT_DLL_DEF_P([FILE]) # --------------------- # True iff FILE is a Windows DLL '.def' file. # Keep in sync with func_dll_def_p in the libtool script AC_DEFUN([_LT_DLL_DEF_P], [dnl test DEF = "`$SED -n dnl -e '\''s/^[[ ]]*//'\'' dnl Strip leading whitespace -e '\''/^\(;.*\)*$/d'\'' dnl Delete empty lines and comments -e '\''s/^\(EXPORTS\|LIBRARY\)\([[ ]].*\)*$/DEF/p'\'' dnl -e q dnl Only consider the first "real" line $1`" dnl ])# _LT_DLL_DEF_P # LT_LIB_M # -------- # check for math library AC_DEFUN([LT_LIB_M], [AC_REQUIRE([AC_CANONICAL_HOST])dnl LIBM= case $host in *-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) # These system don't have libm, or don't need it ;; *-ncr-sysv4.3*) AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM=-lmw) AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") ;; *) AC_CHECK_LIB(m, cos, LIBM=-lm) ;; esac AC_SUBST([LIBM]) ])# LT_LIB_M # Old name: AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_CHECK_LIBM], []) # _LT_COMPILER_NO_RTTI([TAGNAME]) # ------------------------------- m4_defun([_LT_COMPILER_NO_RTTI], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= if test yes = "$GCC"; then case $cc_basename in nvcc*) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; *) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;; esac _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], lt_cv_prog_compiler_rtti_exceptions, [-fno-rtti -fno-exceptions], [], [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) fi _LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], [Compiler flag to turn off builtin functions]) ])# _LT_COMPILER_NO_RTTI # _LT_CMD_GLOBAL_SYMBOLS # ---------------------- m4_defun([_LT_CMD_GLOBAL_SYMBOLS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([LT_PATH_NM])dnl AC_REQUIRE([LT_PATH_LD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_TAG_COMPILER])dnl # Check for command to grab the raw symbol name followed by C symbol from nm. AC_MSG_CHECKING([command to parse $NM output from $compiler object]) AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], [ # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[[BCDEGRST]]' # Regexp to match symbols that can be accessed directly from C. sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[[BCDT]]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[[ABCDGISTW]]' ;; hpux*) if test ia64 = "$host_cpu"; then symcode='[[ABCDEGRST]]' fi ;; irix* | nonstopux*) symcode='[[BCDEGRST]]' ;; osf*) symcode='[[BCDEGQRST]]' ;; solaris*) symcode='[[BDRT]]' ;; sco3.2v5*) symcode='[[DT]]' ;; sysv4.2uw2*) symcode='[[DT]]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[[ABDT]]' ;; sysv4) symcode='[[DFNSTU]]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[[ABCDGIRSTW]]' ;; esac if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Gets list of data symbols to import. lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'" # Adjust the below global symbol transforms to fixup imported variables. lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'" lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'" lt_c_name_lib_hook="\ -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\ -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'" else # Disable hooks by default. lt_cv_sys_global_symbol_to_import= lt_cdecl_hook= lt_c_name_hook= lt_c_name_lib_hook= fi # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n"\ $lt_cdecl_hook\ " -e 's/^T .* \(.*\)$/extern int \1();/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n"\ $lt_c_name_hook\ " -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'" # Transform an extracted symbol line into symbol name with lib prefix and # symbol address. lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\ $lt_c_name_lib_hook\ " -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ " -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function, # D for any global variable and I for any imported variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK ['"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\ " /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\ " /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\ " {split(\$ 0,a,/\||\r/); split(a[2],s)};"\ " s[1]~/^[@?]/{print f,s[1],s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx]" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if AC_TRY_EVAL(ac_compile); then # Now try to grab the symbols. nlist=conftest.nm if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE /* DATA imports from DLLs on WIN32 can't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT@&t@_DLSYM_CONST #elif defined __osf__ /* This system does not cope well with relocations in const data. */ # define LT@&t@_DLSYM_CONST #else # define LT@&t@_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT@&t@_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[[]] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS=conftstm.$ac_objext CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" if AC_TRY_EVAL(ac_link) && test -s conftest$ac_exeext; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD fi else echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test yes = "$pipe_works"; then break else lt_cv_sys_global_symbol_pipe= fi done ]) if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then AC_MSG_RESULT(failed) else AC_MSG_RESULT(ok) fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then nm_file_list_spec='@' fi _LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], [Take the output of nm and produce a listing of raw symbols and C names]) _LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], [Transform the output of nm in a proper C declaration]) _LT_DECL([global_symbol_to_import], [lt_cv_sys_global_symbol_to_import], [1], [Transform the output of nm into a list of symbols to manually relocate]) _LT_DECL([global_symbol_to_c_name_address], [lt_cv_sys_global_symbol_to_c_name_address], [1], [Transform the output of nm in a C name address pair]) _LT_DECL([global_symbol_to_c_name_address_lib_prefix], [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], [Transform the output of nm in a C name address pair when lib prefix is needed]) _LT_DECL([nm_interface], [lt_cv_nm_interface], [1], [The name lister interface]) _LT_DECL([], [nm_file_list_spec], [1], [Specify filename containing input files for $NM]) ]) # _LT_CMD_GLOBAL_SYMBOLS # _LT_COMPILER_PIC([TAGNAME]) # --------------------------- m4_defun([_LT_COMPILER_PIC], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_wl, $1)= _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)= m4_if([$1], [CXX], [ # C++ specific cases for pic, static, wl, etc. if test yes = "$GXX"; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the '-m68020' flag to GCC prevents building anything better, # like '-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) case $host_os in os2*) _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' ;; esac ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac else case $host_os in aix[[4-9]]*) # All AIX code is PIC. if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; dgux*) case $cc_basename in ec++*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; ghcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; freebsd* | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' if test ia64 != "$host_cpu"; then _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' fi ;; aCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # KAI C++ Compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; ecpc* ) # old Intel C++ for x86_64, which still supported -KPIC. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; icpc* ) # Intel C++, used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL 8.0, 9.0 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' ;; *) ;; esac ;; netbsd*) ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; cxx*) # Digital/Compaq C++ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; lcc*) # Lucid _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; *) ;; esac ;; vxworks*) ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ], [ if test yes = "$GCC"; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the '-m68020' flag to GCC prevents building anything better, # like '-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) case $host_os in os2*) _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' ;; esac ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker ' if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' case $cc_basename in nagfor*) # NAG Fortran compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) case $host_os in os2*) _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' ;; esac ;; hpux9* | hpux10* | hpux11*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC (with -KPIC) is the default. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in # old Intel for x86_64, which still supported -KPIC. ecc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # Lahey Fortran 8.1. lf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' ;; nagfor*) # NAG Fortran compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; tcc*) # Fabrice Bellard et al's Tiny C Compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; ccc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All Alpha code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='' ;; *Sun\ F* | *Sun*Fortran*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ;; *Intel*\ [[CF]]*Compiler*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; *Portland\ Group*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; esac ;; newsos6) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All OSF/1 code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; rdos*) _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; solaris*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; *) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; esac ;; sunos4*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; unicos*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; uts4*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ]) case $host_os in # For platforms that do not support PIC, -DPIC is meaningless: *djgpp*) _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" ;; esac AC_CACHE_CHECK([for $compiler option to produce PIC], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) _LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1) # # Check to make sure the PIC flag actually works. # if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in "" | " "*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; esac], [_LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) fi _LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], [Additional compiler flags for building library objects]) _LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], [How to pass a linker flag through the compiler]) # # Check to make sure the static flag actually works. # wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" _LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), $lt_tmp_static_flag, [], [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) _LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], [Compiler flag to prevent dynamic linking]) ])# _LT_COMPILER_PIC # _LT_LINKER_SHLIBS([TAGNAME]) # ---------------------------- # See if the linker supports building shared libraries. m4_defun([_LT_LINKER_SHLIBS], [AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) m4_if([$1], [CXX], [ _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] case $host_os in aix[[4-9]]*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to GNU nm, but means don't demangle to AIX nm. # Without the "-l" option, or with the "-B" option, AIX nm treats # weak defined symbols like other global defined symbols, whereas # GNU nm marks them as "W". # While the 'weak' keyword is ignored in the Export File, we need # it in the Import File for the 'aix-soname' feature, so we have # to replace the "-B" option with "-P" for AIX nm. if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' fi ;; pw32*) _LT_TAGVAR(export_symbols_cmds, $1)=$ltdll_cmds ;; cygwin* | mingw* | cegcc*) case $cc_basename in cl*) _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] ;; esac ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac ], [ runpath_var= _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_cmds, $1)= _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(old_archive_from_new_cmds, $1)= _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= _LT_TAGVAR(thread_safe_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list _LT_TAGVAR(include_expsyms, $1)= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ' (' and ')$', so one must not match beginning or # end of line. Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc', # as well as any symbol that contains 'd'. _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. dnl Note also adjust exclude_expsyms for C++ above. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test yes != "$GCC"; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd* | bitrig*) with_gnu_ld=no ;; esac _LT_TAGVAR(ld_shlibs, $1)=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test yes = "$with_gnu_ld"; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;; *\ \(GNU\ Binutils\)\ [[3-9]]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test yes = "$lt_use_gnu_ld_interface"; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='$wl' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi supports_anon_versioning=no case `$LD -v | $SED -e 's/([^)]\+)\s\+//' 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[[3-9]]*) # On AIX/PPC, the GNU linker is very broken if test ia64 != "$host_cpu"; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file, use it as # is; otherwise, prepend EXPORTS... _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; os2*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=unsupported shrext_cmds=.dll _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test linux-dietlibc = "$host_os"; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test no = "$tmp_diet" then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 _LT_TAGVAR(whole_archive_flag_spec, $1)= tmp_sharedflag='--shared' ;; nagfor*) # NAGFOR 5.3 tmp_sharedflag='-Wl,-shared' ;; xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' if test yes = "$supports_anon_versioning"; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' fi case $cc_basename in tcc*) _LT_TAGVAR(export_dynamic_flag_spec, $1)='-rdynamic' ;; xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test yes = "$supports_anon_versioning"; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; sunos4*) _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac if test no = "$_LT_TAGVAR(ld_shlibs, $1)"; then runpath_var= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. _LT_TAGVAR(hardcode_minus_L, $1)=yes if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. _LT_TAGVAR(hardcode_direct, $1)=unsupported fi ;; aix[[4-9]]*) if test ia64 = "$host_cpu"; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag= else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to GNU nm, but means don't demangle to AIX nm. # Without the "-l" option, or with the "-B" option, AIX nm treats # weak defined symbols like other global defined symbols, whereas # GNU nm marks them as "W". # While the 'weak' keyword is ignored in the Export File, we need # it in the Import File for the 'aix-soname' feature, so we have # to replace the "-B" option with "-P" for AIX nm. if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # have runtime linking enabled, and use it for executables. # For shared libraries, we enable/disable runtime linking # depending on the kind of the shared library created - # when "with_aix_soname,aix_use_runtimelinking" is: # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables # "aix,yes" lib.so shared, rtl:yes, for executables # lib.a static archive # "both,no" lib.so.V(shr.o) shared, rtl:yes # lib.a(lib.so.V) shared, rtl:no, for executables # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a(lib.so.V) shared, rtl:no # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a static archive case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then aix_use_runtimelinking=yes break fi done if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then # With aix-soname=svr4, we create the lib.so.V shared archives only, # so we don't have lib.a shared libs to link our executables. # We have to force runtime linking in this case. aix_use_runtimelinking=yes LDFLAGS="$LDFLAGS -Wl,-brtl" fi ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='$wl-f,' case $with_aix_soname,$aix_use_runtimelinking in aix,*) ;; # traditional, no import file svr4,* | *,yes) # use import file # The Import File defines what to hardcode. _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no ;; esac if test yes = "$GCC"; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`$CC -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi ;; esac shared_flag='-shared' if test yes = "$aix_use_runtimelinking"; then shared_flag="$shared_flag "'$wl-G' fi # Need to ensure runtime linking is disabled for the traditional # shared library, or the linker may eventually find shared libraries # /with/ Import File - we do not want to mix them. shared_flag_aix='-shared' shared_flag_svr4='-shared $wl-G' else # not using gcc if test ia64 = "$host_cpu"; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test yes = "$aix_use_runtimelinking"; then shared_flag='$wl-G' else shared_flag='$wl-bM:SRE' fi shared_flag_aix='$wl-bM:SRE' shared_flag_svr4='$wl-G' fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. _LT_TAGVAR(always_export_symbols, $1)=yes if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag else if test ia64 = "$host_cpu"; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok' if test yes = "$with_gnu_ld"; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' # -brtl affects multiple linker settings, -berok does not and is overridden later compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`' if test svr4 != "$with_aix_soname"; then # This is similar to how AIX traditionally builds its shared libraries. _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' fi if test aix != "$with_aix_soname"; then _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' else # used by -dlpreopen to get the symbols _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV $output_objdir/$realname.d/$soname $output_objdir' fi _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; bsdi[[45]]*) _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl*) # Native MSVC _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then cp "$export_symbols" "$output_objdir/$soname.def"; echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; else $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile=$lt_outputfile.exe lt_tool_outputfile=$lt_tool_outputfile.exe ;; esac~ if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' # FIXME: Should let the user specify the lib program. _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; dgux*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; hpux9*) if test yes = "$GCC"; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' else _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' ;; hpux10*) if test yes,no = "$GCC,$with_gnu_ld"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test no = "$with_gnu_ld"; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes fi ;; hpux11*) if test yes,no = "$GCC,$with_gnu_ld"; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) m4_if($1, [], [ # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) _LT_LINKER_OPTION([if $CC understands -b], _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])], [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) ;; esac fi if test no = "$with_gnu_ld"; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test yes = "$GCC"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], [lt_cv_irix_exported_symbol], [save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null" AC_LINK_IFELSE( [AC_LANG_SOURCE( [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], [C++], [[int foo (void) { return 0; }]], [Fortran 77], [[ subroutine foo end]], [Fortran], [[ subroutine foo end]])])], [lt_cv_irix_exported_symbol=yes], [lt_cv_irix_exported_symbol=no]) LDFLAGS=$save_LDFLAGS]) if test yes = "$lt_cv_irix_exported_symbol"; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib' fi else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes _LT_TAGVAR(link_all_deplibs, $1)=yes ;; linux*) case $cc_basename in tcc*) # Fabrice Bellard et al's Tiny C Compiler _LT_TAGVAR(ld_shlibs, $1)=yes _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; newsos6) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *nto* | *qnx*) ;; openbsd* | bitrig*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' fi else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; os2*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=unsupported shrext_cmds=.dll _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; osf3*) if test yes = "$GCC"; then _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test yes = "$GCC"; then _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; solaris*) _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' if test yes = "$GCC"; then wlarc='$wl' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' _LT_TAGVAR(archive_cmds, $1)='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='$wl' _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands '-z linker_flag'. GCC discards it without '$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test yes = "$GCC"; then _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' else _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' fi ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes ;; sunos4*) if test sequent = "$host_vendor"; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4) case $host_vendor in sni) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' _LT_TAGVAR(hardcode_direct, $1)=no ;; motorola) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4.3*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes _LT_TAGVAR(ld_shlibs, $1)=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' if test yes = "$GCC"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We CANNOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport' runpath_var='LD_RUN_PATH' if test yes = "$GCC"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(ld_shlibs, $1)=no ;; esac if test sni = "$host_vendor"; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Blargedynsym' ;; esac fi fi ]) AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no _LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld _LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl _LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl _LT_DECL([], [extract_expsyms_cmds], [2], [The commands to extract the exported symbol list from a shared archive]) # # Do we need to explicitly link libc? # case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in x|xyes) # Assume -lc should be added _LT_TAGVAR(archive_cmds_need_lc, $1)=yes if test yes,yes = "$GCC,$enable_shared"; then case $_LT_TAGVAR(archive_cmds, $1) in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. AC_CACHE_CHECK([whether -lc should be explicitly linked in], [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1), [$RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if AC_TRY_EVAL(ac_compile) 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) _LT_TAGVAR(allow_undefined_flag, $1)= if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) then lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no else lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes fi _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* ]) _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1) ;; esac fi ;; esac _LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], [Whether or not to add -lc for building shared libraries]) _LT_TAGDECL([allow_libtool_libs_with_static_runtimes], [enable_shared_with_static_runtimes], [0], [Whether or not to disallow shared libs when runtime libs are static]) _LT_TAGDECL([], [export_dynamic_flag_spec], [1], [Compiler flag to allow reflexive dlopens]) _LT_TAGDECL([], [whole_archive_flag_spec], [1], [Compiler flag to generate shared objects directly from archives]) _LT_TAGDECL([], [compiler_needs_object], [1], [Whether the compiler copes with passing no objects directly]) _LT_TAGDECL([], [old_archive_from_new_cmds], [2], [Create an old-style archive from a shared archive]) _LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], [Create a temporary old-style archive to link instead of a shared archive]) _LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) _LT_TAGDECL([], [archive_expsym_cmds], [2]) _LT_TAGDECL([], [module_cmds], [2], [Commands used to build a loadable module if different from building a shared archive.]) _LT_TAGDECL([], [module_expsym_cmds], [2]) _LT_TAGDECL([], [with_gnu_ld], [1], [Whether we are building with GNU ld or not]) _LT_TAGDECL([], [allow_undefined_flag], [1], [Flag that allows shared libraries with undefined symbols to be built]) _LT_TAGDECL([], [no_undefined_flag], [1], [Flag that enforces no undefined symbols]) _LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], [Flag to hardcode $libdir into a binary during linking. This must work even if $libdir does not exist]) _LT_TAGDECL([], [hardcode_libdir_separator], [1], [Whether we need a single "-rpath" flag with a separated argument]) _LT_TAGDECL([], [hardcode_direct], [0], [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_direct_absolute], [0], [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes DIR into the resulting binary and the resulting library dependency is "absolute", i.e impossible to change by setting $shlibpath_var if the library is relocated]) _LT_TAGDECL([], [hardcode_minus_L], [0], [Set to "yes" if using the -LDIR flag during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_shlibpath_var], [0], [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_automatic], [0], [Set to "yes" if building a shared library automatically hardcodes DIR into the library and all subsequent libraries and executables linked against it]) _LT_TAGDECL([], [inherit_rpath], [0], [Set to yes if linker adds runtime paths of dependent libraries to runtime path list]) _LT_TAGDECL([], [link_all_deplibs], [0], [Whether libtool must link a program against all its dependency libraries]) _LT_TAGDECL([], [always_export_symbols], [0], [Set to "yes" if exported symbols are required]) _LT_TAGDECL([], [export_symbols_cmds], [2], [The commands to list exported symbols]) _LT_TAGDECL([], [exclude_expsyms], [1], [Symbols that should not be listed in the preloaded symbols]) _LT_TAGDECL([], [include_expsyms], [1], [Symbols that must always be exported]) _LT_TAGDECL([], [prelink_cmds], [2], [Commands necessary for linking programs (against libraries) with templates]) _LT_TAGDECL([], [postlink_cmds], [2], [Commands necessary for finishing linking programs]) _LT_TAGDECL([], [file_list_spec], [1], [Specify filename containing input files]) dnl FIXME: Not yet implemented dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], dnl [Compiler flag to generate thread safe objects]) ])# _LT_LINKER_SHLIBS # _LT_LANG_C_CONFIG([TAG]) # ------------------------ # Ensure that the configuration variables for a C compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to 'libtool'. m4_defun([_LT_LANG_C_CONFIG], [m4_require([_LT_DECL_EGREP])dnl lt_save_CC=$CC AC_LANG_PUSH(C) # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' _LT_TAG_COMPILER # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) LT_SYS_DLOPEN_SELF _LT_CMD_STRIPLIB # Report what library types will actually be built AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test no = "$can_build_shared" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test yes = "$enable_shared" && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test ia64 != "$host_cpu"; then case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in yes,aix,yes) ;; # shared object as lib.so file only yes,svr4,*) ;; # shared object as lib.so archive member only yes,*) enable_static=no ;; # shared object in lib.a archive as well esac fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test yes = "$enable_shared" || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_CONFIG($1) fi AC_LANG_POP CC=$lt_save_CC ])# _LT_LANG_C_CONFIG # _LT_LANG_CXX_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a C++ compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to 'libtool'. m4_defun([_LT_LANG_CXX_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl if test -n "$CXX" && ( test no != "$CXX" && ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) || (test g++ != "$CXX"))); then AC_PROG_CXXCPP else _lt_caught_CXX_error=yes fi AC_LANG_PUSH(C++) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the CXX compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test yes != "$_lt_caught_CXX_error"; then # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} CFLAGS=$CXXFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately if test yes = "$GXX"; then _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' else _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= fi if test yes = "$GXX"; then # Set up default GNU C++ configuration LT_PATH_LD # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test yes = "$with_gnu_ld"; then _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='$wl' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) _LT_TAGVAR(ld_shlibs, $1)=yes case $host_os in aix3*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aix[[4-9]]*) if test ia64 = "$host_cpu"; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag= else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # have runtime linking enabled, and use it for executables. # For shared libraries, we enable/disable runtime linking # depending on the kind of the shared library created - # when "with_aix_soname,aix_use_runtimelinking" is: # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables # "aix,yes" lib.so shared, rtl:yes, for executables # lib.a static archive # "both,no" lib.so.V(shr.o) shared, rtl:yes # lib.a(lib.so.V) shared, rtl:no, for executables # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a(lib.so.V) shared, rtl:no # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a static archive case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then # With aix-soname=svr4, we create the lib.so.V shared archives only, # so we don't have lib.a shared libs to link our executables. # We have to force runtime linking in this case. aix_use_runtimelinking=yes LDFLAGS="$LDFLAGS -Wl,-brtl" fi ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='$wl-f,' case $with_aix_soname,$aix_use_runtimelinking in aix,*) ;; # no import file svr4,* | *,yes) # use import file # The Import File defines what to hardcode. _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no ;; esac if test yes = "$GXX"; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`$CC -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi esac shared_flag='-shared' if test yes = "$aix_use_runtimelinking"; then shared_flag=$shared_flag' $wl-G' fi # Need to ensure runtime linking is disabled for the traditional # shared library, or the linker may eventually find shared libraries # /with/ Import File - we do not want to mix them. shared_flag_aix='-shared' shared_flag_svr4='-shared $wl-G' else # not using gcc if test ia64 = "$host_cpu"; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test yes = "$aix_use_runtimelinking"; then shared_flag='$wl-G' else shared_flag='$wl-bM:SRE' fi shared_flag_aix='$wl-bM:SRE' shared_flag_svr4='$wl-G' fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to # export. _LT_TAGVAR(always_export_symbols, $1)=yes if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. # The "-G" linker flag allows undefined symbols. _LT_TAGVAR(no_undefined_flag, $1)='-bernotok' # Determine the default libpath from the value encoded in an empty # executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag else if test ia64 = "$host_cpu"; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok' if test yes = "$with_gnu_ld"; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' # -brtl affects multiple linker settings, -berok does not and is overridden later compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`' if test svr4 != "$with_aix_soname"; then # This is similar to how AIX traditionally builds its shared # libraries. Need -bnortl late, we may have -brtl in LDFLAGS. _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' fi if test aix != "$with_aix_soname"; then _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' else # used by -dlpreopen to get the symbols _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV $output_objdir/$realname.d/$soname $output_objdir' fi _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d' fi fi ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; cygwin* | mingw* | pw32* | cegcc*) case $GXX,$cc_basename in ,cl* | no,cl*) # Native MSVC # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then cp "$export_symbols" "$output_objdir/$soname.def"; echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; else $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile=$lt_outputfile.exe lt_tool_outputfile=$lt_tool_outputfile.exe ;; esac~ func_to_tool_file "$lt_outputfile"~ if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # g++ # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file, use it as # is; otherwise, prepend EXPORTS... _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; os2*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=unsupported shrext_cmds=.dll _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; freebsd2.*) # C++ shared libraries reported to be fairly broken before # switch to ELF _LT_TAGVAR(ld_shlibs, $1)=no ;; freebsd-elf*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; freebsd* | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions _LT_TAGVAR(ld_shlibs, $1)=yes ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; hpux9*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test yes = "$GXX"; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; hpux10*|hpux11*) if test no = "$with_gnu_ld"; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) ;; *) _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test yes = "$GXX"; then if test no = "$with_gnu_ld"; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test yes = "$GXX"; then if test no = "$with_gnu_ld"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` -o $lib' fi fi _LT_TAGVAR(link_all_deplibs, $1)=yes ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib $wl-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc* | ecpc* ) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; esac _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ $RANLIB $oldlib' _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 6 and above use weak symbols _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl--rpath $wl$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' ;; cxx*) # Compaq C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib $wl-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' ;; xl* | mpixl* | bgxl*) # IBM XL 8.0 on PPC, with GNU ld _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' if test yes = "$supports_anon_versioning"; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' fi ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file $wl$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; m88k*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; *nto* | *qnx*) _LT_TAGVAR(ld_shlibs, $1)=yes ;; openbsd* | bitrig*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`"; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file,$export_symbols -o $lib' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' fi output_verbose_link_cmd=func_echo_all else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Archives containing C++ object files must be created using # the KAI C++ compiler. case $host in osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; esac ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; cxx*) case $host in osf3*) _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $soname `test -n "$verstring" && func_echo_all "$wl-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' ;; *) _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname $wl-input $wl$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~ $RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' ;; esac _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test yes,no = "$GXX,$with_gnu_ld"; then _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' case $host in osf3*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(archive_cmds_need_lc,$1)=yes _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G$allow_undefined_flag $wl-M $wl$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands '-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test yes,no = "$GXX,$with_gnu_ld"; then _LT_TAGVAR(no_undefined_flag, $1)=' $wl-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # g++ 2.7 appears to require '-G' NOT '-shared' on this # platform. _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $wl$libdir' case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We CANNOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ '"$_LT_TAGVAR(old_archive_cmds, $1)" _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ '"$_LT_TAGVAR(reload_cmds, $1)" ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no _LT_TAGVAR(GCC, $1)=$GXX _LT_TAGVAR(LD, $1)=$LD ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld fi # test yes != "$_lt_caught_CXX_error" AC_LANG_POP ])# _LT_LANG_CXX_CONFIG # _LT_FUNC_STRIPNAME_CNF # ---------------------- # func_stripname_cnf prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). # # This function is identical to the (non-XSI) version of func_stripname, # except this one can be used by m4 code that may be executed by configure, # rather than the libtool script. m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl AC_REQUIRE([_LT_DECL_SED]) AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) func_stripname_cnf () { case @S|@2 in .*) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%\\\\@S|@2\$%%"`;; *) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%@S|@2\$%%"`;; esac } # func_stripname_cnf ])# _LT_FUNC_STRIPNAME_CNF # _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) # --------------------------------- # Figure out "hidden" library dependencies from verbose # compiler output when linking a shared library. # Parse the compiler output and extract the necessary # objects, libraries and library flags. m4_defun([_LT_SYS_HIDDEN_LIBDEPS], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl # Dependencies to place before and after the object being linked: _LT_TAGVAR(predep_objects, $1)= _LT_TAGVAR(postdep_objects, $1)= _LT_TAGVAR(predeps, $1)= _LT_TAGVAR(postdeps, $1)= _LT_TAGVAR(compiler_lib_search_path, $1)= dnl we can't use the lt_simple_compile_test_code here, dnl because it contains code intended for an executable, dnl not a library. It's possible we should let each dnl tag define a new lt_????_link_test_code variable, dnl but it's only used here... m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF int a; void foo (void) { a = 0; } _LT_EOF ], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF class Foo { public: Foo (void) { a = 0; } private: int a; }; _LT_EOF ], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer*4 a a=0 return end _LT_EOF ], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer a a=0 return end _LT_EOF ], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF public class foo { private int a; public void bar (void) { a = 0; } }; _LT_EOF ], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF package foo func foo() { } _LT_EOF ]) _lt_libdeps_save_CFLAGS=$CFLAGS case "$CC $CFLAGS " in #( *\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; *\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; *\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; esac dnl Parse the compiler output and extract the necessary dnl objects, libraries and library flags. if AC_TRY_EVAL(ac_compile); then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do case $prev$p in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test x-L = "$p" || test x-R = "$p"; then prev=$p continue fi # Expand the sysroot to ease extracting the directories later. if test -z "$prev"; then case $p in -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; esac fi case $p in =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; esac if test no = "$pre_test_object_deps_done"; then case $prev in -L | -R) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then _LT_TAGVAR(compiler_lib_search_path, $1)=$prev$p else _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} $prev$p" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$_LT_TAGVAR(postdeps, $1)"; then _LT_TAGVAR(postdeps, $1)=$prev$p else _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} $prev$p" fi fi prev= ;; *.lto.$objext) ;; # Ignore GCC LTO objects *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test no = "$pre_test_object_deps_done"; then if test -z "$_LT_TAGVAR(predep_objects, $1)"; then _LT_TAGVAR(predep_objects, $1)=$p else _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" fi else if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then _LT_TAGVAR(postdep_objects, $1)=$p else _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling $1 test program" fi $RM -f confest.$objext CFLAGS=$_lt_libdeps_save_CFLAGS # PORTME: override above test on systems where it is broken m4_if([$1], [CXX], [case $host_os in interix[[3-9]]*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. _LT_TAGVAR(predep_objects,$1)= _LT_TAGVAR(postdep_objects,$1)= _LT_TAGVAR(postdeps,$1)= ;; esac ]) case " $_LT_TAGVAR(postdeps, $1) " in *" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; esac _LT_TAGVAR(compiler_lib_search_dirs, $1)= if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | $SED -e 's! -L! !g' -e 's!^ !!'` fi _LT_TAGDECL([], [compiler_lib_search_dirs], [1], [The directories searched by this compiler when creating a shared library]) _LT_TAGDECL([], [predep_objects], [1], [Dependencies to place before and after the objects being linked to create a shared library]) _LT_TAGDECL([], [postdep_objects], [1]) _LT_TAGDECL([], [predeps], [1]) _LT_TAGDECL([], [postdeps], [1]) _LT_TAGDECL([], [compiler_lib_search_path], [1], [The library search path used internally by the compiler when linking a shared library]) ])# _LT_SYS_HIDDEN_LIBDEPS # _LT_LANG_F77_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a Fortran 77 compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to 'libtool'. m4_defun([_LT_LANG_F77_CONFIG], [AC_LANG_PUSH(Fortran 77) if test -z "$F77" || test no = "$F77"; then _lt_disable_F77=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for f77 test sources. ac_ext=f # Object file extension for compiled f77 test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the F77 compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test yes != "$_lt_disable_F77"; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${F77-"f77"} CFLAGS=$FFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) GCC=$G77 if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test no = "$can_build_shared" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test yes = "$enable_shared" && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test ia64 != "$host_cpu"; then case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in yes,aix,yes) ;; # shared object as lib.so file only yes,svr4,*) ;; # shared object as lib.so archive member only yes,*) enable_static=no ;; # shared object in lib.a archive as well esac fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test yes = "$enable_shared" || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)=$G77 _LT_TAGVAR(LD, $1)=$LD ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS fi # test yes != "$_lt_disable_F77" AC_LANG_POP ])# _LT_LANG_F77_CONFIG # _LT_LANG_FC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for a Fortran compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to 'libtool'. m4_defun([_LT_LANG_FC_CONFIG], [AC_LANG_PUSH(Fortran) if test -z "$FC" || test no = "$FC"; then _lt_disable_FC=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for fc test sources. ac_ext=${ac_fc_srcext-f} # Object file extension for compiled fc test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the FC compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test yes != "$_lt_disable_FC"; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${FC-"f95"} CFLAGS=$FCFLAGS compiler=$CC GCC=$ac_cv_fc_compiler_gnu _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test no = "$can_build_shared" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test yes = "$enable_shared" && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test ia64 != "$host_cpu"; then case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in yes,aix,yes) ;; # shared object as lib.so file only yes,svr4,*) ;; # shared object as lib.so archive member only yes,*) enable_static=no ;; # shared object in lib.a archive as well esac fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test yes = "$enable_shared" || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)=$ac_cv_fc_compiler_gnu _LT_TAGVAR(LD, $1)=$LD ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS fi # test yes != "$_lt_disable_FC" AC_LANG_POP ])# _LT_LANG_FC_CONFIG # _LT_LANG_GCJ_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Java Compiler compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to 'libtool'. m4_defun([_LT_LANG_GCJ_CONFIG], [AC_REQUIRE([LT_PROG_GCJ])dnl AC_LANG_SAVE # Source file extension for Java test sources. ac_ext=java # Object file extension for compiled Java test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="class foo {}" # Code to be used in simple link tests lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GCJ-"gcj"} CFLAGS=$GCJFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)=$LD _LT_CC_BASENAME([$compiler]) # GCJ did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GCJ_CONFIG # _LT_LANG_GO_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Go compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to 'libtool'. m4_defun([_LT_LANG_GO_CONFIG], [AC_REQUIRE([LT_PROG_GO])dnl AC_LANG_SAVE # Source file extension for Go test sources. ac_ext=go # Object file extension for compiled Go test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="package main; func main() { }" # Code to be used in simple link tests lt_simple_link_test_code='package main; func main() { }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GOC-"gccgo"} CFLAGS=$GOFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)=$LD _LT_CC_BASENAME([$compiler]) # Go did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GO_CONFIG # _LT_LANG_RC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for the Windows resource compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to 'libtool'. m4_defun([_LT_LANG_RC_CONFIG], [AC_REQUIRE([LT_PROG_RC])dnl AC_LANG_SAVE # Source file extension for RC test sources. ac_ext=rc # Object file extension for compiled RC test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' # Code to be used in simple link tests lt_simple_link_test_code=$lt_simple_compile_test_code # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC= CC=${RC-"windres"} CFLAGS= compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes if test -n "$compiler"; then : _LT_CONFIG($1) fi GCC=$lt_save_GCC AC_LANG_RESTORE CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_RC_CONFIG # LT_PROG_GCJ # ----------- AC_DEFUN([LT_PROG_GCJ], [m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], [AC_CHECK_TOOL(GCJ, gcj,) test set = "${GCJFLAGS+set}" || GCJFLAGS="-g -O2" AC_SUBST(GCJFLAGS)])])[]dnl ]) # Old name: AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_GCJ], []) # LT_PROG_GO # ---------- AC_DEFUN([LT_PROG_GO], [AC_CHECK_TOOL(GOC, gccgo,) ]) # LT_PROG_RC # ---------- AC_DEFUN([LT_PROG_RC], [AC_CHECK_TOOL(RC, windres,) ]) # Old name: AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_RC], []) # _LT_DECL_EGREP # -------------- # If we don't have a new enough Autoconf to choose the best grep # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_EGREP], [AC_REQUIRE([AC_PROG_EGREP])dnl AC_REQUIRE([AC_PROG_FGREP])dnl test -z "$GREP" && GREP=grep _LT_DECL([], [GREP], [1], [A grep program that handles long lines]) _LT_DECL([], [EGREP], [1], [An ERE matcher]) _LT_DECL([], [FGREP], [1], [A literal string matcher]) dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too AC_SUBST([GREP]) ]) # _LT_DECL_OBJDUMP # -------------- # If we don't have a new enough Autoconf to choose the best objdump # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_OBJDUMP], [AC_CHECK_TOOL(OBJDUMP, objdump, false) test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) AC_SUBST([OBJDUMP]) ]) # _LT_DECL_DLLTOOL # ---------------- # Ensure DLLTOOL variable is set. m4_defun([_LT_DECL_DLLTOOL], [AC_CHECK_TOOL(DLLTOOL, dlltool, false) test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program]) AC_SUBST([DLLTOOL]) ]) # _LT_DECL_SED # ------------ # Check for a fully-functional sed program, that truncates # as few characters as possible. Prefer GNU sed if found. m4_defun([_LT_DECL_SED], [AC_PROG_SED test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" _LT_DECL([], [SED], [1], [A sed program that does not truncate output]) _LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], [Sed that helps us avoid accidentally triggering echo(1) options like -n]) ])# _LT_DECL_SED m4_ifndef([AC_PROG_SED], [ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_SED. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # m4_defun([AC_PROG_SED], [AC_MSG_CHECKING([for a sed that does not truncate output]) AC_CACHE_VAL(lt_cv_path_SED, [# Loop through the user's path and test for sed and gsed. # Then use that list of sed's as ones to test for truncation. as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for lt_ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" fi done done done IFS=$as_save_IFS lt_ac_max=0 lt_ac_count=0 # Add /usr/xpg4/bin/sed as it is typically found on Solaris # along with /bin/sed that truncates output. for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do test ! -f "$lt_ac_sed" && continue cat /dev/null > conftest.in lt_ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >conftest.in # Check for GNU sed and select it if it is found. if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then lt_cv_path_SED=$lt_ac_sed break fi while true; do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo >>conftest.nl $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break cmp -s conftest.out conftest.nl || break # 10000 chars as input seems more than enough test 10 -lt "$lt_ac_count" && break lt_ac_count=`expr $lt_ac_count + 1` if test "$lt_ac_count" -gt "$lt_ac_max"; then lt_ac_max=$lt_ac_count lt_cv_path_SED=$lt_ac_sed fi done done ]) SED=$lt_cv_path_SED AC_SUBST([SED]) AC_MSG_RESULT([$SED]) ])#AC_PROG_SED ])#m4_ifndef # Old name: AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_SED], []) # _LT_CHECK_SHELL_FEATURES # ------------------------ # Find out whether the shell is Bourne or XSI compatible, # or has some other useful features. m4_defun([_LT_CHECK_SHELL_FEATURES], [if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi _LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac _LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl _LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl ])# _LT_CHECK_SHELL_FEATURES # _LT_PATH_CONVERSION_FUNCTIONS # ----------------------------- # Determine what file name conversion functions should be used by # func_to_host_file (and, implicitly, by func_to_host_path). These are needed # for certain cross-compile configurations and native mingw. m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_MSG_CHECKING([how to convert $build file names to $host format]) AC_CACHE_VAL(lt_cv_to_host_file_cmd, [case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac ]) to_host_file_cmd=$lt_cv_to_host_file_cmd AC_MSG_RESULT([$lt_cv_to_host_file_cmd]) _LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd], [0], [convert $build file names to $host format])dnl AC_MSG_CHECKING([how to convert $build file names to toolchain format]) AC_CACHE_VAL(lt_cv_to_tool_file_cmd, [#assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac ]) to_tool_file_cmd=$lt_cv_to_tool_file_cmd AC_MSG_RESULT([$lt_cv_to_tool_file_cmd]) _LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], [0], [convert $build files to toolchain format])dnl ])# _LT_PATH_CONVERSION_FUNCTIONS # Helper functions for option handling. -*- Autoconf -*- # # Copyright (C) 2004-2005, 2007-2009, 2011-2015 Free Software # Foundation, Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 8 ltoptions.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) # _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) # ------------------------------------------ m4_define([_LT_MANGLE_OPTION], [[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) # _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) # --------------------------------------- # Set option OPTION-NAME for macro MACRO-NAME, and if there is a # matching handler defined, dispatch to it. Other OPTION-NAMEs are # saved as a flag. m4_define([_LT_SET_OPTION], [m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), _LT_MANGLE_DEFUN([$1], [$2]), [m4_warning([Unknown $1 option '$2'])])[]dnl ]) # _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) # ------------------------------------------------------------ # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. m4_define([_LT_IF_OPTION], [m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) # _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) # ------------------------------------------------------- # Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME # are set. m4_define([_LT_UNLESS_OPTIONS], [m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), [m4_define([$0_found])])])[]dnl m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 ])[]dnl ]) # _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) # ---------------------------------------- # OPTION-LIST is a space-separated list of Libtool options associated # with MACRO-NAME. If any OPTION has a matching handler declared with # LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about # the unknown option and exit. m4_defun([_LT_SET_OPTIONS], [# Set options m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [_LT_SET_OPTION([$1], _LT_Option)]) m4_if([$1],[LT_INIT],[ dnl dnl Simply set some default values (i.e off) if boolean options were not dnl specified: _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no ]) _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no ]) dnl dnl If no reference was made to various pairs of opposing options, then dnl we run the default mode handler for the pair. For example, if neither dnl 'shared' nor 'disable-shared' was passed, we enable building of shared dnl archives by default: _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], [_LT_ENABLE_FAST_INSTALL]) _LT_UNLESS_OPTIONS([LT_INIT], [aix-soname=aix aix-soname=both aix-soname=svr4], [_LT_WITH_AIX_SONAME([aix])]) ]) ])# _LT_SET_OPTIONS # _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) # ----------------------------------------- m4_define([_LT_MANGLE_DEFUN], [[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) # LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) # ----------------------------------------------- m4_define([LT_OPTION_DEFINE], [m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl ])# LT_OPTION_DEFINE # dlopen # ------ LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes ]) AU_DEFUN([AC_LIBTOOL_DLOPEN], [_LT_SET_OPTION([LT_INIT], [dlopen]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the 'dlopen' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) # win32-dll # --------- # Declare package support for building win32 dll's. LT_OPTION_DEFINE([LT_INIT], [win32-dll], [enable_win32_dll=yes case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) AC_CHECK_TOOL(AS, as, false) AC_CHECK_TOOL(DLLTOOL, dlltool, false) AC_CHECK_TOOL(OBJDUMP, objdump, false) ;; esac test -z "$AS" && AS=as _LT_DECL([], [AS], [1], [Assembler program])dnl test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl ])# win32-dll AU_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_REQUIRE([AC_CANONICAL_HOST])dnl _LT_SET_OPTION([LT_INIT], [win32-dll]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the 'win32-dll' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) # _LT_ENABLE_SHARED([DEFAULT]) # ---------------------------- # implement the --enable-shared flag, and supports the 'shared' and # 'disable-shared' LT_INIT options. # DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. m4_define([_LT_ENABLE_SHARED], [m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([shared], [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS=$lt_save_ifs ;; esac], [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) _LT_DECL([build_libtool_libs], [enable_shared], [0], [Whether or not to build shared libraries]) ])# _LT_ENABLE_SHARED LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) # Old names: AC_DEFUN([AC_ENABLE_SHARED], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) ]) AC_DEFUN([AC_DISABLE_SHARED], [_LT_SET_OPTION([LT_INIT], [disable-shared]) ]) AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_SHARED], []) dnl AC_DEFUN([AM_DISABLE_SHARED], []) # _LT_ENABLE_STATIC([DEFAULT]) # ---------------------------- # implement the --enable-static flag, and support the 'static' and # 'disable-static' LT_INIT options. # DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. m4_define([_LT_ENABLE_STATIC], [m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([static], [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS=$lt_save_ifs ;; esac], [enable_static=]_LT_ENABLE_STATIC_DEFAULT) _LT_DECL([build_old_libs], [enable_static], [0], [Whether or not to build static libraries]) ])# _LT_ENABLE_STATIC LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) # Old names: AC_DEFUN([AC_ENABLE_STATIC], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) ]) AC_DEFUN([AC_DISABLE_STATIC], [_LT_SET_OPTION([LT_INIT], [disable-static]) ]) AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_STATIC], []) dnl AC_DEFUN([AM_DISABLE_STATIC], []) # _LT_ENABLE_FAST_INSTALL([DEFAULT]) # ---------------------------------- # implement the --enable-fast-install flag, and support the 'fast-install' # and 'disable-fast-install' LT_INIT options. # DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. m4_define([_LT_ENABLE_FAST_INSTALL], [m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([fast-install], [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS=$lt_save_ifs ;; esac], [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) _LT_DECL([fast_install], [enable_fast_install], [0], [Whether or not to optimize for fast installation])dnl ])# _LT_ENABLE_FAST_INSTALL LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) # Old names: AU_DEFUN([AC_ENABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the 'fast-install' option into LT_INIT's first parameter.]) ]) AU_DEFUN([AC_DISABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], [disable-fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the 'disable-fast-install' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) # _LT_WITH_AIX_SONAME([DEFAULT]) # ---------------------------------- # implement the --with-aix-soname flag, and support the `aix-soname=aix' # and `aix-soname=both' and `aix-soname=svr4' LT_INIT options. DEFAULT # is either `aix', `both' or `svr4'. If omitted, it defaults to `aix'. m4_define([_LT_WITH_AIX_SONAME], [m4_define([_LT_WITH_AIX_SONAME_DEFAULT], [m4_if($1, svr4, svr4, m4_if($1, both, both, aix))])dnl shared_archive_member_spec= case $host,$enable_shared in power*-*-aix[[5-9]]*,yes) AC_MSG_CHECKING([which variant of shared library versioning to provide]) AC_ARG_WITH([aix-soname], [AS_HELP_STRING([--with-aix-soname=aix|svr4|both], [shared library versioning (aka "SONAME") variant to provide on AIX, @<:@default=]_LT_WITH_AIX_SONAME_DEFAULT[@:>@.])], [case $withval in aix|svr4|both) ;; *) AC_MSG_ERROR([Unknown argument to --with-aix-soname]) ;; esac lt_cv_with_aix_soname=$with_aix_soname], [AC_CACHE_VAL([lt_cv_with_aix_soname], [lt_cv_with_aix_soname=]_LT_WITH_AIX_SONAME_DEFAULT) with_aix_soname=$lt_cv_with_aix_soname]) AC_MSG_RESULT([$with_aix_soname]) if test aix != "$with_aix_soname"; then # For the AIX way of multilib, we name the shared archive member # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o', # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File. # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag, # the AIX toolchain works better with OBJECT_MODE set (default 32). if test 64 = "${OBJECT_MODE-32}"; then shared_archive_member_spec=shr_64 else shared_archive_member_spec=shr fi fi ;; *) with_aix_soname=aix ;; esac _LT_DECL([], [shared_archive_member_spec], [0], [Shared archive member basename, for filename based shared library versioning on AIX])dnl ])# _LT_WITH_AIX_SONAME LT_OPTION_DEFINE([LT_INIT], [aix-soname=aix], [_LT_WITH_AIX_SONAME([aix])]) LT_OPTION_DEFINE([LT_INIT], [aix-soname=both], [_LT_WITH_AIX_SONAME([both])]) LT_OPTION_DEFINE([LT_INIT], [aix-soname=svr4], [_LT_WITH_AIX_SONAME([svr4])]) # _LT_WITH_PIC([MODE]) # -------------------- # implement the --with-pic flag, and support the 'pic-only' and 'no-pic' # LT_INIT options. # MODE is either 'yes' or 'no'. If omitted, it defaults to 'both'. m4_define([_LT_WITH_PIC], [AC_ARG_WITH([pic], [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@], [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], [lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for lt_pkg in $withval; do IFS=$lt_save_ifs if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS=$lt_save_ifs ;; esac], [pic_mode=m4_default([$1], [default])]) _LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl ])# _LT_WITH_PIC LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) # Old name: AU_DEFUN([AC_LIBTOOL_PICMODE], [_LT_SET_OPTION([LT_INIT], [pic-only]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the 'pic-only' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) m4_define([_LTDL_MODE], []) LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], [m4_define([_LTDL_MODE], [nonrecursive])]) LT_OPTION_DEFINE([LTDL_INIT], [recursive], [m4_define([_LTDL_MODE], [recursive])]) LT_OPTION_DEFINE([LTDL_INIT], [subproject], [m4_define([_LTDL_MODE], [subproject])]) m4_define([_LTDL_TYPE], []) LT_OPTION_DEFINE([LTDL_INIT], [installable], [m4_define([_LTDL_TYPE], [installable])]) LT_OPTION_DEFINE([LTDL_INIT], [convenience], [m4_define([_LTDL_TYPE], [convenience])]) # ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- # # Copyright (C) 2004-2005, 2007-2008, 2011-2015 Free Software # Foundation, Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 6 ltsugar.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) # lt_join(SEP, ARG1, [ARG2...]) # ----------------------------- # Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their # associated separator. # Needed until we can rely on m4_join from Autoconf 2.62, since all earlier # versions in m4sugar had bugs. m4_define([lt_join], [m4_if([$#], [1], [], [$#], [2], [[$2]], [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) m4_define([_lt_join], [m4_if([$#$2], [2], [], [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) # lt_car(LIST) # lt_cdr(LIST) # ------------ # Manipulate m4 lists. # These macros are necessary as long as will still need to support # Autoconf-2.59, which quotes differently. m4_define([lt_car], [[$1]]) m4_define([lt_cdr], [m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], [$#], 1, [], [m4_dquote(m4_shift($@))])]) m4_define([lt_unquote], $1) # lt_append(MACRO-NAME, STRING, [SEPARATOR]) # ------------------------------------------ # Redefine MACRO-NAME to hold its former content plus 'SEPARATOR''STRING'. # Note that neither SEPARATOR nor STRING are expanded; they are appended # to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). # No SEPARATOR is output if MACRO-NAME was previously undefined (different # than defined and empty). # # This macro is needed until we can rely on Autoconf 2.62, since earlier # versions of m4sugar mistakenly expanded SEPARATOR but not STRING. m4_define([lt_append], [m4_define([$1], m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) # lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) # ---------------------------------------------------------- # Produce a SEP delimited list of all paired combinations of elements of # PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list # has the form PREFIXmINFIXSUFFIXn. # Needed until we can rely on m4_combine added in Autoconf 2.62. m4_define([lt_combine], [m4_if(m4_eval([$# > 3]), [1], [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl [[m4_foreach([_Lt_prefix], [$2], [m4_foreach([_Lt_suffix], ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) # lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) # ----------------------------------------------------------------------- # Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited # by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. m4_define([lt_if_append_uniq], [m4_ifdef([$1], [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], [lt_append([$1], [$2], [$3])$4], [$5])], [lt_append([$1], [$2], [$3])$4])]) # lt_dict_add(DICT, KEY, VALUE) # ----------------------------- m4_define([lt_dict_add], [m4_define([$1($2)], [$3])]) # lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) # -------------------------------------------- m4_define([lt_dict_add_subkey], [m4_define([$1($2:$3)], [$4])]) # lt_dict_fetch(DICT, KEY, [SUBKEY]) # ---------------------------------- m4_define([lt_dict_fetch], [m4_ifval([$3], m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) # lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) # ----------------------------------------------------------------- m4_define([lt_if_dict_fetch], [m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], [$5], [$6])]) # lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) # -------------------------------------------------------------- m4_define([lt_dict_filter], [m4_if([$5], [], [], [lt_join(m4_quote(m4_default([$4], [[, ]])), lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl ]) # ltversion.m4 -- version numbers -*- Autoconf -*- # # Copyright (C) 2004, 2011-2015 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # @configure_input@ # serial 4179 ltversion.m4 # This file is part of GNU Libtool m4_define([LT_PACKAGE_VERSION], [2.4.6]) m4_define([LT_PACKAGE_REVISION], [2.4.6]) AC_DEFUN([LTVERSION_VERSION], [macro_version='2.4.6' macro_revision='2.4.6' _LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) _LT_DECL(, macro_revision, 0) ]) # lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- # # Copyright (C) 2004-2005, 2007, 2009, 2011-2015 Free Software # Foundation, Inc. # Written by Scott James Remnant, 2004. # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 5 lt~obsolete.m4 # These exist entirely to fool aclocal when bootstrapping libtool. # # In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN), # which have later been changed to m4_define as they aren't part of the # exported API, or moved to Autoconf or Automake where they belong. # # The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN # in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us # using a macro with the same name in our local m4/libtool.m4 it'll # pull the old libtool.m4 in (it doesn't see our shiny new m4_define # and doesn't know about Autoconf macros at all.) # # So we provide this file, which has a silly filename so it's always # included after everything else. This provides aclocal with the # AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything # because those macros already exist, or will be overwritten later. # We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. # # Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. # Yes, that means every name once taken will need to remain here until # we give up compatibility with versions before 1.7, at which point # we need to keep only those names which we still refer to. # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])]) m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])]) m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])]) m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) # Copyright (C) 2002-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.15' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.15], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) # _AM_AUTOCONF_VERSION(VERSION) # ----------------------------- # aclocal traces this macro to find the Autoconf version. # This is a private macro too. Using m4_define simplifies # the logic in aclocal, which can simply ignore this definition. m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.15])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to # '$srcdir', '$srcdir/..', or '$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is '.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl # Expand $ac_aux_dir to an absolute path. am_aux_dir=`cd "$ac_aux_dir" && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ([2.52])dnl m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Copyright (C) 1999-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], [$1], [CXX], [depcc="$CXX" am_compiler_list=], [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], [$1], [UPC], [depcc="$UPC" am_compiler_list=], [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi am__universal=false m4_case([$1], [CC], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac], [CXX], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac]) for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES. AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE([dependency-tracking], [dnl AS_HELP_STRING( [--enable-dependency-tracking], [do not reject slow dependency extractors]) AS_HELP_STRING( [--disable-dependency-tracking], [speeds up one-time build])]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl AC_SUBST([am__nodep])dnl _AM_SUBST_NOTMAKE([am__nodep])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`AS_DIRNAME("$mf")` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` AS_MKDIR_P([$dirpart/$fdir]) # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking # is enabled. FIXME. This creates each '.P' file that we will # need in order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O. m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC]) [_AM_PROG_CC_C_O ]) # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.65])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [AC_DIAGNOSE([obsolete], [$0: two- and three-arguments forms are deprecated.]) m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if( m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), [ok:ok],, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) AM_MISSING_PROG([AUTOCONF], [autoconf]) AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) AM_MISSING_PROG([AUTOHEADER], [autoheader]) AM_MISSING_PROG([MAKEINFO], [makeinfo]) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # AC_SUBST([mkdir_p], ['$(MKDIR_P)']) # We need awk for the "check" target (and possibly the TAP driver). The # system "awk" is bad on some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES([CC])], [m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES([CXX])], [m4_define([AC_PROG_CXX], m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES([OBJC])], [m4_define([AC_PROG_OBJC], m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], [_AM_DEPENDENCIES([OBJCXX])], [m4_define([AC_PROG_OBJCXX], m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl ]) AC_REQUIRE([AM_SILENT_RULES])dnl dnl The testsuite driver may need to know about EXEEXT, so add the dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) fi fi dnl The trailing newline in this macro's definition is deliberate, for dnl backward compatibility and to allow trailing 'dnl'-style comments dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841. ]) dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST([install_sh])]) # Copyright (C) 2003-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. AC_MSG_CHECKING([for style of include used by $am_make]) am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi AC_SUBST([am__include]) AC_SUBST([am__quote]) AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it is modern enough. # If it is, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= AC_MSG_WARN(['missing' script is too old or missing]) fi ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # -------------------- # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), [1])]) # _AM_SET_OPTIONS(OPTIONS) # ------------------------ # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Copyright (C) 1999-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_CC_C_O # --------------- # Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC # to automatically call this. AC_DEFUN([_AM_PROG_CC_C_O], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([compile])dnl AC_LANG_PUSH([C])dnl AC_CACHE_CHECK( [whether $CC understands -c and -o together], [am_cv_prog_cc_c_o], [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i]) if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi AC_LANG_POP([C])]) # For backward compatibility. AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) # Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_RUN_LOG(COMMAND) # ------------------- # Run COMMAND, save the exit status in ac_status, and log it. # (This has been adapted from Autoconf's _AC_RUN_LOG macro.) AC_DEFUN([AM_RUN_LOG], [{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD (exit $ac_status); }]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi if test "$[2]" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT([yes]) # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi AC_CONFIG_COMMANDS_PRE( [AC_MSG_CHECKING([that generated files are newer than configure]) if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi AC_MSG_RESULT([done])]) rm -f conftest.file ]) # Copyright (C) 2009-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SILENT_RULES([DEFAULT]) # -------------------------- # Enable less verbose build rules; with the default set to DEFAULT # ("yes" being less verbose, "no" or empty being verbose). AC_DEFUN([AM_SILENT_RULES], [AC_ARG_ENABLE([silent-rules], [dnl AS_HELP_STRING( [--enable-silent-rules], [less verbose build output (undo: "make V=1")]) AS_HELP_STRING( [--disable-silent-rules], [verbose build output (undo: "make V=0")])dnl ]) case $enable_silent_rules in @%:@ ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; esac dnl dnl A few 'make' implementations (e.g., NonStop OS and NextStep) dnl do not support nested variable expansions. dnl See automake bug#9928 and bug#10237. am_make=${MAKE-make} AC_CACHE_CHECK([whether $am_make supports nested variables], [am_cv_make_support_nested_variables], [if AS_ECHO([['TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi]) if test $am_cv_make_support_nested_variables = yes; then dnl Using '$V' instead of '$(V)' breaks IRIX make. AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AC_SUBST([AM_V])dnl AM_SUBST_NOTMAKE([AM_V])dnl AC_SUBST([AM_DEFAULT_V])dnl AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl AC_SUBST([AM_DEFAULT_VERBOSITY])dnl AM_BACKSLASH='\' AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) # Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor 'install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in "make install-strip", and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Copyright (C) 2006-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) # -------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of 'v7', 'ustar', or 'pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar # AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar], [# The POSIX 1988 'ustar' format is defined with fixed-size fields. # There is notably a 21 bits limit for the UID and the GID. In fact, # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 # and bug#13588). am_max_uid=2097151 # 2^21 - 1 am_max_gid=$am_max_uid # The $UID and $GID variables are not portable, so we need to resort # to the POSIX-mandated id(1) utility. Errors in the 'id' calls # below are definitely unexpected, so allow the users to see them # (that is, avoid stderr redirection). am_uid=`id -u || echo unknown` am_gid=`id -g || echo unknown` AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) if test $am_uid -le $am_max_uid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) if test $am_gid -le $am_max_gid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi], [pax], [], [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Go ahead even if we have the value already cached. We do so because we # need to set the values for the 'am__tar' and 'am__untar' variables. _am_tools=${am_cv_prog_tar_$1-$_am_tools} for _am_tool in $_am_tools; do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works. rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR pkg-config-0.29.1/main.c0000664000175000017500000006003612652721354011656 00000000000000/* * Copyright (C) 2001, 2002 Red Hat 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 of the * License, 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. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "pkg.h" #include "parse.h" #include #include #include #include #ifdef G_OS_WIN32 #define STRICT #include #undef STRICT #endif char *pcsysrootdir = NULL; char *pkg_config_pc_path = NULL; static gboolean want_my_version = FALSE; static gboolean want_version = FALSE; static FlagType pkg_flags = 0; static gboolean want_list = FALSE; static gboolean want_static_lib_list = ENABLE_INDIRECT_DEPS; static gboolean want_short_errors = FALSE; static gboolean want_uninstalled = FALSE; static char *variable_name = NULL; static gboolean want_exists = FALSE; static gboolean want_provides = FALSE; static gboolean want_requires = FALSE; static gboolean want_requires_private = FALSE; static gboolean want_validate = FALSE; static char *required_atleast_version = NULL; static char *required_exact_version = NULL; static char *required_max_version = NULL; static char *required_pkgconfig_version = NULL; static gboolean want_silence_errors = FALSE; static gboolean want_variable_list = FALSE; static gboolean want_debug_spew = FALSE; static gboolean want_verbose_errors = FALSE; static gboolean want_stdout_errors = FALSE; static gboolean output_opt_set = FALSE; void debug_spew (const char *format, ...) { va_list args; gchar *str; FILE* stream; g_return_if_fail (format != NULL); if (!want_debug_spew) return; va_start (args, format); str = g_strdup_vprintf (format, args); va_end (args); if (want_stdout_errors) stream = stdout; else stream = stderr; fputs (str, stream); fflush (stream); g_free (str); } void verbose_error (const char *format, ...) { va_list args; gchar *str; FILE* stream; g_return_if_fail (format != NULL); if (!want_verbose_errors) return; va_start (args, format); str = g_strdup_vprintf (format, args); va_end (args); if (want_stdout_errors) stream = stdout; else stream = stderr; fputs (str, stream); fflush (stream); g_free (str); } static gboolean define_variable_cb (const char *opt, const char *arg, gpointer data, GError **error) { char *varname; char *varval; char *tmp; tmp = g_strdup (arg); varname = tmp; while (*varname && isspace ((guchar)*varname)) ++varname; varval = varname; while (*varval && *varval != '=' && *varval != ' ') ++varval; while (*varval && (*varval == '=' || *varval == ' ')) { *varval = '\0'; ++varval; } if (*varval == '\0') { fprintf (stderr, "--define-variable argument does not have a value " "for the variable\n"); exit (1); } define_global_variable (varname, varval); g_free (tmp); return TRUE; } static gboolean output_opt_cb (const char *opt, const char *arg, gpointer data, GError **error) { static gboolean vercmp_opt_set = FALSE; /* only allow one output mode, with a few exceptions */ if (output_opt_set) { gboolean bad_opt = TRUE; /* multiple flag options (--cflags --libs-only-l) allowed */ if (pkg_flags != 0 && (strcmp (opt, "--libs") == 0 || strcmp (opt, "--libs-only-l") == 0 || strcmp (opt, "--libs-only-other") == 0 || strcmp (opt, "--libs-only-L") == 0 || strcmp (opt, "--cflags") == 0 || strcmp (opt, "--cflags-only-I") == 0 || strcmp (opt, "--cflags-only-other") == 0)) bad_opt = FALSE; /* --print-requires and --print-requires-private allowed */ if ((want_requires && strcmp (opt, "--print-requires-private") == 0) || (want_requires_private && strcmp (opt, "--print-requires") == 0)) bad_opt = FALSE; /* --exists allowed with --atleast/exact/max-version */ if (want_exists && !vercmp_opt_set && (strcmp (opt, "--atleast-version") == 0 || strcmp (opt, "--exact-version") == 0 || strcmp (opt, "--max-version") == 0)) bad_opt = FALSE; if (bad_opt) { fprintf (stderr, "Ignoring incompatible output option \"%s\"\n", opt); fflush (stderr); return TRUE; } } if (strcmp (opt, "--version") == 0) want_my_version = TRUE; else if (strcmp (opt, "--modversion") == 0) want_version = TRUE; else if (strcmp (opt, "--libs") == 0) pkg_flags |= LIBS_ANY; else if (strcmp (opt, "--libs-only-l") == 0) pkg_flags |= LIBS_l; else if (strcmp (opt, "--libs-only-other") == 0) pkg_flags |= LIBS_OTHER; else if (strcmp (opt, "--libs-only-L") == 0) pkg_flags |= LIBS_L; else if (strcmp (opt, "--cflags") == 0) pkg_flags |= CFLAGS_ANY; else if (strcmp (opt, "--cflags-only-I") == 0) pkg_flags |= CFLAGS_I; else if (strcmp (opt, "--cflags-only-other") == 0) pkg_flags |= CFLAGS_OTHER; else if (strcmp (opt, "--variable") == 0) variable_name = g_strdup (arg); else if (strcmp (opt, "--exists") == 0) want_exists = TRUE; else if (strcmp (opt, "--print-variables") == 0) want_variable_list = TRUE; else if (strcmp (opt, "--uninstalled") == 0) want_uninstalled = TRUE; else if (strcmp (opt, "--atleast-version") == 0) { required_atleast_version = g_strdup (arg); want_exists = TRUE; vercmp_opt_set = TRUE; } else if (strcmp (opt, "--exact-version") == 0) { required_exact_version = g_strdup (arg); want_exists = TRUE; vercmp_opt_set = TRUE; } else if (strcmp (opt, "--max-version") == 0) { required_max_version = g_strdup (arg); want_exists = TRUE; vercmp_opt_set = TRUE; } else if (strcmp (opt, "--list-all") == 0) want_list = TRUE; else if (strcmp (opt, "--print-provides") == 0) want_provides = TRUE; else if (strcmp (opt, "--print-requires") == 0) want_requires = TRUE; else if (strcmp (opt, "--print-requires-private") == 0) want_requires_private = TRUE; else if (strcmp (opt, "--validate") == 0) want_validate = TRUE; else return FALSE; output_opt_set = TRUE; return TRUE; } static gboolean pkg_uninstalled (Package *pkg) { /* See if > 0 pkgs were uninstalled */ GList *tmp; if (pkg->uninstalled) return TRUE; tmp = pkg->requires; while (tmp != NULL) { Package *pkg = tmp->data; if (pkg_uninstalled (pkg)) return TRUE; tmp = g_list_next (tmp); } return FALSE; } void print_list_data (gpointer data, gpointer user_data) { g_print ("%s\n", (gchar *)data); } static void init_pc_path (void) { #ifdef G_OS_WIN32 char *instdir, *lpath, *shpath; instdir = g_win32_get_package_installation_directory_of_module (NULL); if (instdir == NULL) { /* This only happens when GetModuleFilename() fails. If it does, that * failure should be investigated and fixed. */ debug_spew ("g_win32_get_package_installation_directory_of_module failed\n"); return; } lpath = g_build_filename (instdir, "lib", "pkgconfig", NULL); shpath = g_build_filename (instdir, "share", "pkgconfig", NULL); pkg_config_pc_path = g_strconcat (lpath, G_SEARCHPATH_SEPARATOR_S, shpath, NULL); g_free (instdir); g_free (lpath); g_free (shpath); #else pkg_config_pc_path = PKG_CONFIG_PC_PATH; #endif } static gboolean process_package_args (const char *cmdline, GList **packages, FILE *log) { gboolean success = TRUE; GList *reqs; reqs = parse_module_list (NULL, cmdline, "(command line arguments)"); if (reqs == NULL) { fprintf (stderr, "Must specify package names on the command line\n"); fflush (stderr); return FALSE; } for (; reqs != NULL; reqs = g_list_next (reqs)) { Package *req; RequiredVersion *ver = reqs->data; /* override requested versions with cmdline options */ if (required_exact_version) { g_free (ver->version); ver->comparison = EQUAL; ver->version = g_strdup (required_exact_version); } else if (required_atleast_version) { g_free (ver->version); ver->comparison = GREATER_THAN_EQUAL; ver->version = g_strdup (required_atleast_version); } else if (required_max_version) { g_free (ver->version); ver->comparison = LESS_THAN_EQUAL; ver->version = g_strdup (required_max_version); } if (want_short_errors) req = get_package_quiet (ver->name); else req = get_package (ver->name); if (log != NULL) { if (req == NULL) fprintf (log, "%s NOT-FOUND\n", ver->name); else fprintf (log, "%s %s %s\n", ver->name, comparison_to_str (ver->comparison), (ver->version == NULL) ? "(null)" : ver->version); } if (req == NULL) { success = FALSE; verbose_error ("No package '%s' found\n", ver->name); continue; } if (!version_test (ver->comparison, req->version, ver->version)) { success = FALSE; verbose_error ("Requested '%s %s %s' but version of %s is %s\n", ver->name, comparison_to_str (ver->comparison), ver->version, req->name, req->version); if (req->url) verbose_error ("You may find new versions of %s at %s\n", req->name, req->url); continue; } *packages = g_list_prepend (*packages, req); } *packages = g_list_reverse (*packages); return success; } static const GOptionEntry options_table[] = { { "version", 0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, &output_opt_cb, "output version of pkg-config", NULL }, { "modversion", 0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, &output_opt_cb, "output version for package", NULL }, { "atleast-pkgconfig-version", 0, 0, G_OPTION_ARG_STRING, &required_pkgconfig_version, "require given version of pkg-config", "VERSION" }, { "libs", 0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, &output_opt_cb, "output all linker flags", NULL }, { "static", 0, 0, G_OPTION_ARG_NONE, &want_static_lib_list, "output linker flags for static linking", NULL }, { "short-errors", 0, 0, G_OPTION_ARG_NONE, &want_short_errors, "print short errors", NULL }, { "libs-only-l", 0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, &output_opt_cb, "output -l flags", NULL }, { "libs-only-other", 0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, &output_opt_cb, "output other libs (e.g. -pthread)", NULL }, { "libs-only-L", 0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, &output_opt_cb, "output -L flags", NULL }, { "cflags", 0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, &output_opt_cb, "output all pre-processor and compiler flags", NULL }, { "cflags-only-I", 0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, &output_opt_cb, "output -I flags", NULL }, { "cflags-only-other", 0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, &output_opt_cb, "output cflags not covered by the cflags-only-I option", NULL }, { "variable", 0, 0, G_OPTION_ARG_CALLBACK, &output_opt_cb, "get the value of variable named NAME", "NAME" }, { "define-variable", 0, 0, G_OPTION_ARG_CALLBACK, &define_variable_cb, "set variable NAME to VALUE", "NAME=VALUE" }, { "exists", 0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, &output_opt_cb, "return 0 if the module(s) exist", NULL }, { "print-variables", 0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, &output_opt_cb, "output list of variables defined by the module", NULL }, { "uninstalled", 0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, &output_opt_cb, "return 0 if the uninstalled version of one or more " "module(s) or their dependencies will be used", NULL }, { "atleast-version", 0, 0, G_OPTION_ARG_CALLBACK, &output_opt_cb, "return 0 if the module is at least version VERSION", "VERSION" }, { "exact-version", 0, 0, G_OPTION_ARG_CALLBACK, &output_opt_cb, "return 0 if the module is at exactly version VERSION", "VERSION" }, { "max-version", 0, 0, G_OPTION_ARG_CALLBACK, &output_opt_cb, "return 0 if the module is at no newer than version VERSION", "VERSION" }, { "list-all", 0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, &output_opt_cb, "list all known packages", NULL }, { "debug", 0, 0, G_OPTION_ARG_NONE, &want_debug_spew, "show verbose debug information", NULL }, { "print-errors", 0, 0, G_OPTION_ARG_NONE, &want_verbose_errors, "show verbose information about missing or conflicting packages " "(default unless --exists or --atleast/exact/max-version given on the " "command line)", NULL }, { "silence-errors", 0, 0, G_OPTION_ARG_NONE, &want_silence_errors, "be silent about errors (default when --exists or " "--atleast/exact/max-version given on the command line)", NULL }, { "errors-to-stdout", 0, 0, G_OPTION_ARG_NONE, &want_stdout_errors, "print errors from --print-errors to stdout not stderr", NULL }, { "print-provides", 0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, &output_opt_cb, "print which packages the package provides", NULL }, { "print-requires", 0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, &output_opt_cb, "print which packages the package requires", NULL }, { "print-requires-private", 0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, &output_opt_cb, "print which packages the package requires for static " "linking", NULL }, { "validate", 0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, &output_opt_cb, "validate a package's .pc file", NULL }, { "define-prefix", 0, 0, G_OPTION_ARG_NONE, &define_prefix, "try to override the value of prefix for each .pc file found with a " "guesstimated value based on the location of the .pc file", NULL }, { "dont-define-prefix", 0, G_OPTION_FLAG_REVERSE, G_OPTION_ARG_NONE, &define_prefix, "don't try to override the value of prefix for each .pc " "file found with a guesstimated value based on the location of the .pc " "file", NULL }, { "prefix-variable", 0, 0, G_OPTION_ARG_STRING, &prefix_variable, "set the name of the variable that pkg-config automatically sets", "PREFIX" }, #ifdef G_OS_WIN32 { "msvc-syntax", 0, 0, G_OPTION_ARG_NONE, &msvc_syntax, "output -l and -L flags for the Microsoft compiler (cl)", NULL }, #endif { NULL, 0, 0, 0, NULL, NULL, NULL } }; int main (int argc, char **argv) { GString *str; GList *packages = NULL; char *search_path; char *pcbuilddir; gboolean need_newline; FILE *log = NULL; GError *error = NULL; GOptionContext *opt_context; /* This is here so that we get debug spew from the start, * during arg parsing */ if (getenv ("PKG_CONFIG_DEBUG_SPEW")) { want_debug_spew = TRUE; want_verbose_errors = TRUE; want_silence_errors = FALSE; debug_spew ("PKG_CONFIG_DEBUG_SPEW variable enabling debug spew\n"); } /* Get the built-in search path */ init_pc_path (); if (pkg_config_pc_path == NULL) { /* Even when we override the built-in search path, we still use it later * to add pc_path to the virtual pkg-config package. */ verbose_error ("Failed to get default search path\n"); exit (1); } search_path = getenv ("PKG_CONFIG_PATH"); if (search_path) { add_search_dirs(search_path, G_SEARCHPATH_SEPARATOR_S); } if (getenv("PKG_CONFIG_LIBDIR") != NULL) { add_search_dirs(getenv("PKG_CONFIG_LIBDIR"), G_SEARCHPATH_SEPARATOR_S); } else { add_search_dirs(pkg_config_pc_path, G_SEARCHPATH_SEPARATOR_S); } pcsysrootdir = getenv ("PKG_CONFIG_SYSROOT_DIR"); if (pcsysrootdir) { define_global_variable ("pc_sysrootdir", pcsysrootdir); } else { define_global_variable ("pc_sysrootdir", "/"); } pcbuilddir = getenv ("PKG_CONFIG_TOP_BUILD_DIR"); if (pcbuilddir) { define_global_variable ("pc_top_builddir", pcbuilddir); } else { /* Default appropriate for automake */ define_global_variable ("pc_top_builddir", "$(top_builddir)"); } if (getenv ("PKG_CONFIG_DISABLE_UNINSTALLED")) { debug_spew ("disabling auto-preference for uninstalled packages\n"); disable_uninstalled = TRUE; } /* Parse options */ opt_context = g_option_context_new (NULL); g_option_context_add_main_entries (opt_context, options_table, NULL); if (!g_option_context_parse(opt_context, &argc, &argv, &error)) { fprintf (stderr, "%s\n", error->message); return 1; } /* If no output option was set, then --exists is the default. */ if (!output_opt_set) { debug_spew ("no output option set, defaulting to --exists\n"); want_exists = TRUE; } /* Error printing is determined as follows: * - for --exists, --*-version, --list-all and no options at all, * it's off by default and --print-errors will turn it on * - for all other output options, it's on by default and * --silence-errors can turn it off */ if (want_exists || want_list) { debug_spew ("Error printing disabled by default due to use of output " "options --exists, --atleast/exact/max-version, " "--list-all or no output option at all. Value of " "--print-errors: %d\n", want_verbose_errors); /* Leave want_verbose_errors unchanged, reflecting --print-errors */ } else { debug_spew ("Error printing enabled by default due to use of output " "options besides --exists, --atleast/exact/max-version or " "--list-all. Value of --silence-errors: %d\n", want_silence_errors); if (want_silence_errors && getenv ("PKG_CONFIG_DEBUG_SPEW") == NULL) want_verbose_errors = FALSE; else want_verbose_errors = TRUE; } if (want_verbose_errors) debug_spew ("Error printing enabled\n"); else debug_spew ("Error printing disabled\n"); if (want_static_lib_list) enable_private_libs(); else disable_private_libs(); /* honor Requires.private if any Cflags are requested or any static * libs are requested */ if (pkg_flags & CFLAGS_ANY || want_requires_private || want_exists || (want_static_lib_list && (pkg_flags & LIBS_ANY))) enable_requires_private(); /* ignore Requires if no Cflags or Libs are requested */ if (pkg_flags == 0 && !want_requires && !want_exists) disable_requires(); /* Allow errors in .pc files when listing all. */ if (want_list) parse_strict = FALSE; if (want_my_version) { printf ("%s\n", VERSION); return 0; } if (required_pkgconfig_version) { if (compare_versions (VERSION, required_pkgconfig_version) >= 0) return 0; else return 1; } package_init (); if (want_list) { print_package_list (); return 0; } /* Collect packages from remaining args */ str = g_string_new (""); while (argc > 1) { argc--; argv++; g_string_append (str, *argv); g_string_append (str, " "); } g_option_context_free (opt_context); g_strstrip (str->str); if (getenv("PKG_CONFIG_LOG") != NULL) { log = fopen (getenv ("PKG_CONFIG_LOG"), "a"); if (log == NULL) { fprintf (stderr, "Cannot open log file: %s\n", getenv ("PKG_CONFIG_LOG")); exit (1); } } /* find and parse each of the packages specified */ if (!process_package_args (str->str, &packages, log)) return 1; if (log != NULL) fclose (log); g_string_free (str, TRUE); /* If the user just wants to check package existence or validate its .pc * file, we're all done. */ if (want_exists || want_validate) return 0; if (want_variable_list) { GList *tmp; tmp = packages; while (tmp != NULL) { Package *pkg = tmp->data; if (pkg->vars != NULL) { /* Sort variables for consistent output */ GList *keys = g_hash_table_get_keys (pkg->vars); keys = g_list_sort (keys, (GCompareFunc)g_strcmp0); g_list_foreach (keys, print_list_data, NULL); g_list_free (keys); } tmp = g_list_next (tmp); if (tmp) printf ("\n"); } need_newline = FALSE; } if (want_uninstalled) { /* See if > 0 pkgs (including dependencies recursively) were uninstalled */ GList *tmp; tmp = packages; while (tmp != NULL) { Package *pkg = tmp->data; if (pkg_uninstalled (pkg)) return 0; tmp = g_list_next (tmp); } return 1; } if (want_version) { GList *tmp; tmp = packages; while (tmp != NULL) { Package *pkg = tmp->data; printf ("%s\n", pkg->version); tmp = g_list_next (tmp); } } if (want_provides) { GList *tmp; tmp = packages; while (tmp != NULL) { Package *pkg = tmp->data; char *key; key = pkg->key; while (*key == '/') key++; if (strlen(key) > 0) printf ("%s = %s\n", key, pkg->version); tmp = g_list_next (tmp); } } if (want_requires) { GList *pkgtmp; for (pkgtmp = packages; pkgtmp != NULL; pkgtmp = g_list_next (pkgtmp)) { Package *pkg = pkgtmp->data; GList *reqtmp; /* process Requires: */ for (reqtmp = pkg->requires; reqtmp != NULL; reqtmp = g_list_next (reqtmp)) { Package *deppkg = reqtmp->data; RequiredVersion *req; req = g_hash_table_lookup(pkg->required_versions, deppkg->key); if ((req == NULL) || (req->comparison == ALWAYS_MATCH)) printf ("%s\n", deppkg->key); else printf ("%s %s %s\n", deppkg->key, comparison_to_str(req->comparison), req->version); } } } if (want_requires_private) { GList *pkgtmp; for (pkgtmp = packages; pkgtmp != NULL; pkgtmp = g_list_next (pkgtmp)) { Package *pkg = pkgtmp->data; GList *reqtmp; /* process Requires.private: */ for (reqtmp = pkg->requires_private; reqtmp != NULL; reqtmp = g_list_next (reqtmp)) { Package *deppkg = reqtmp->data; RequiredVersion *req; if (g_list_find (pkg->requires, reqtmp->data)) continue; req = g_hash_table_lookup(pkg->required_versions, deppkg->key); if ((req == NULL) || (req->comparison == ALWAYS_MATCH)) printf ("%s\n", deppkg->key); else printf ("%s %s %s\n", deppkg->key, comparison_to_str(req->comparison), req->version); } } } /* Print all flags; then print a newline at the end. */ need_newline = FALSE; if (variable_name) { char *str = packages_get_var (packages, variable_name); printf ("%s", str); g_free (str); need_newline = TRUE; } if (pkg_flags != 0) { char *str = packages_get_flags (packages, pkg_flags); printf ("%s", str); g_free (str); need_newline = TRUE; } if (need_newline) printf ("\n"); return 0; } pkg-config-0.29.1/detectenv-msvc.mak0000664000175000017500000000325712651243607014210 00000000000000# Check to see we are configured to build with MSVC (MSDEVDIR, MSVCDIR or # VCINSTALLDIR) or with the MS Platform SDK (MSSDK or WindowsSDKDir) !if !defined(VCINSTALLDIR) && !defined(WINDOWSSDKDIR) MSG = ^ This Makefile is only for Visual Studio 2008 and later.^ You need to ensure that the Visual Studio Environment is properly set up^ before running this Makefile. !error $(MSG) !endif ERRNUL = 2>NUL _HASH=^# !if ![echo VCVERSION=_MSC_VER > vercl.x] \ && ![echo $(_HASH)if defined(_M_IX86) >> vercl.x] \ && ![echo PLAT=Win32 >> vercl.x] \ && ![echo $(_HASH)elif defined(_M_AMD64) >> vercl.x] \ && ![echo PLAT=x64 >> vercl.x] \ && ![echo $(_HASH)endif >> vercl.x] \ && ![cl -nologo -TC -P vercl.x $(ERRNUL)] !include vercl.i !if ![echo VCVER= ^\> vercl.vc] \ && ![set /a $(VCVERSION) / 100 - 6 >> vercl.vc] !include vercl.vc !endif !endif !if ![del $(ERRNUL) /q/f vercl.x vercl.i vercl.vc] !endif !if $(VCVERSION) > 1499 && $(VCVERSION) < 1600 VSVER = 9 !elseif $(VCVERSION) > 1599 && $(VCVERSION) < 1700 VSVER = 10 !elseif $(VCVERSION) > 1699 && $(VCVERSION) < 1800 VSVER = 11 !elseif $(VCVERSION) > 1799 && $(VCVERSION) < 1900 VSVER = 12 !elseif $(VCVERSION) > 1899 && $(VCVERSION) < 2000 VSVER = 14 !else VSVER = 0 !endif !if "$(VSVER)" == "0" MSG = ^ This NMake Makefile set supports Visual Studio^ 9 (2008) through 14 (2015). Your Visual Studio^ version is not supported. !error $(MSG) !endif VALID_CFGSET = FALSE !if "$(CFG)" == "release" || "$(CFG)" == "debug" VALID_CFGSET = TRUE !endif !if "$(CFG)" == "release" CFLAGS_ADD = /MD /O2 /GL !else CFLAGS_ADD = /MDd /Od !endif !if "$(PLAT)" == "x64" LDFLAGS_ARCH = /machine:x64 !else LDFLAGS_ARCH = /machine:x86 !endif pkg-config-0.29.1/README.win320000664000175000017500000000455512651243607012412 00000000000000pkg-config on Win32 =================== This file describes pkg-config for "native" Win32. (On Cygwin, pkg-config builds fine right out of the box. Cygwin is just another Unix variant, as far as pkg-config is concerned.) I don't call this "native" Win32 target MinGW, as pkg-config on Windows is supposed to be useable also by MSVC users. When pkg-config.exe is invoked, it uses the glib function g_win32_get_package_installation_directory_of_module() to find the directory it's being run from. It then adds the "lib" and "share" subdirectories to the pkg-config search path unless PKG_CONFIG_LIBDIR is set in the environment. This allows pkg-config to adjust to being relocated on Windows. For each .pc file encountered, pkg-config will replace the prefix variable to the base of it's currently installed directory unless the command line option --dont-define-prefix is set. It will take the .pc directory and strip off either lib\pkgconfig or share\pkgconfig to determine the prefix. This allows the paths encoded in .pc files at build time to be replaced with appropriate values at runtime. In order to use the output of pkg-config with MSVC, the option --msvc-syntax can be used to convert UNIX style library output to arguments that work with MSVC. This means -Lfoo will be converted to /libpath:foo, and -lfoo will be converted to foo.lib. Building pkg-config is now supported on Visual Studio/MSVC as well. To build it, you will need to have a glib installation. Note that MSVC builds of glib does not have a build-time dependency on pkg-config, unlike the normal autotools builds. The headers and libs either need to be found in your default %INCLUDE% and %LIB% respectively, or they need to be found in $(GLIB_PREFIX)\include and $(GLIB_PREFIX)\lib respectively; please see Makefile.vc for adjusting $(GLIB_PREFIX) to suit your needs. To build pkg-config with MSVC, run in a Visual Studio command prompt: "nmake /f Makefile.vc CFG=release" (release builds) -or- "nmake /f Makefile.vc CFG=debug" (debug builds) The resulting pkg-config.exe will be found in [release|debug]\[win32|x64]; a 'clean' target is supported to clean up the build. MSVC 2008 through 2015 is supported; older versions may work as well but is not tested. Note that building with the glib bundled with this source distribution is not currently supported-the glib DLL and all of its dependent DLLs are required at runtime. pkg-config-0.29.1/config.h.win320000664000175000017500000000527412665370327013154 00000000000000/* config.h.in. Generated from configure.ac by autoheader. */ /* Define ${prefix} in .pc files at runtime */ #define ENABLE_DEFINE_PREFIX 1 /* Link library to all dependent libraries, not only directly needed ones */ #define ENABLE_INDIRECT_DEPS 1 /* Define to 1 if you have the header file. */ #ifndef _MSC_VER #define HAVE_DIRENT_H 1 #endif /* Define to 1 if you have the header file. */ /* #undef HAVE_DLFCN_H */ /* Define to 1 if you have the header file. */ #if !defined (_MSC_VER) || (_MSC_VER >= 1800) #define HAVE_INTTYPES_H 1 #endif /* Define to 1 if you have the header file. */ #define HAVE_MALLOC_H 1 /* Define to 1 if you have the header file. */ #define HAVE_MEMORY_H 1 /* Define to 1 if you have the header file. */ #if (!defined(_MSC_VER) || (_MSC_VER >= 1600)) #define HAVE_STDINT_H 1 #endif /* Define to 1 if you have the header file. */ #define HAVE_STDLIB_H 1 /* Define to 1 if you have the header file. */ #ifndef _MSC_VER #define HAVE_STRINGS_H 1 #endif /* Define to 1 if you have the header file. */ #define HAVE_STRING_H 1 /* Define to 1 if you have the header file. */ #define HAVE_SYS_STAT_H 1 /* Define to 1 if you have the header file. */ #define HAVE_SYS_TYPES_H 1 /* Define to 1 if you have the header file. */ /* #undef HAVE_SYS_WAIT_H */ /* Define to 1 if you have the header file. */ #ifndef _MSC_VER #define HAVE_UNISTD_H 1 #endif /* Define to the sub-directory in which libtool stores uninstalled libraries. */ #define LT_OBJDIR ".libs/" /* Name of package */ #define PACKAGE "pkg-config" /* Define to the address where bug reports for this package should be sent. */ #define PACKAGE_BUGREPORT "https://bugs.freedesktop.org/enter_bug.cgi?product=pkg-config" /* Define to the full name of this package. */ #define PACKAGE_NAME "pkg-config" /* Define to the full name and version of this package. */ #define PACKAGE_STRING "pkg-config 0.29.1" /* Define to the one symbol short name of this package. */ #define PACKAGE_TARNAME "pkg-config" /* Define to the home page for this package. */ #define PACKAGE_URL "" /* Define to the version of this package. */ #define PACKAGE_VERSION "0.29.1" /* Define to 1 if you have the ANSI C header files. */ #define STDC_HEADERS 1 /* Version number of package */ #define VERSION "0.29.1" /* Enable large inode numbers on Mac OS X 10.5. */ #ifndef _DARWIN_USE_64_BIT_INODE # define _DARWIN_USE_64_BIT_INODE 1 #endif /* Number of bits in a file offset, on hosts where this is settable. */ /* #undef _FILE_OFFSET_BITS */ /* Define for large files, on AIX-style hosts. */ /* #undef _LARGE_FILES */ pkg-config-0.29.1/glib/0000775000175000017500000000000012665370350011556 500000000000000pkg-config-0.29.1/glib/config.guess0000755000175000017500000012367212601774025014024 00000000000000#! /bin/sh # Attempt to guess a canonical system name. # Copyright 1992-2015 Free Software Foundation, Inc. timestamp='2015-01-01' # This file 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 3 of the License, 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, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # # Originally written by Per Bothner; maintained since 2000 by Ben Elliston. # # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD # # Please send patches to . me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright 1992-2015 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." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown case "${UNAME_SYSTEM}" in Linux|GNU|GNU/*) # If the system lacks a compiler, then just pick glibc. # We could probably try harder. LIBC=gnu eval $set_cc_for_build cat <<-EOF > $dummy.c #include #if defined(__UCLIBC__) LIBC=uclibc #elif defined(__dietlibc__) LIBC=dietlibc #else LIBC=gnu #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC' | sed 's, ,,g'` ;; esac # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ELF__ then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit ;; *:Bitrig:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE} exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; *:SolidBSD:*:*) echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd${UNAME_RELEASE} exit ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` # Reset EXIT trap before exiting to avoid spurious non-zero exit code. exitcode=$? trap '' 0 exit $exitcode ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; arm*:riscos:*:*|arm*:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; s390x:SunOS:*:*) echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) echo i386-pc-auroraux${UNAME_RELEASE} exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) eval $set_cc_for_build SUN_ARCH="i386" # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH="x86_64" fi fi echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`$dummy $dummyarg` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[4567]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/lslpp ] ; then IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then eval $set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) UNAME_PROCESSOR=`/usr/bin/uname -p` case ${UNAME_PROCESSOR} in amd64) echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; *:MINGW64*:*) echo ${UNAME_MACHINE}-pc-mingw64 exit ;; *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; *:MSYS*:*) echo ${UNAME_MACHINE}-pc-msys exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; *:Interix*:*) case ${UNAME_MACHINE} in x86) echo i586-pc-interix${UNAME_RELEASE} exit ;; authenticamd | genuineintel | EM64T) echo x86_64-unknown-interix${UNAME_RELEASE} exit ;; IA64) echo ia64-unknown-interix${UNAME_RELEASE} exit ;; esac ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; 8664:Windows_NT:*) echo x86_64-pc-mks exit ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC} exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; aarch64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 if test "$?" = 0 ; then LIBC="gnulibc1" ; fi echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; arc:Linux:*:* | arceb:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; arm*:Linux:*:*) eval $set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then echo ${UNAME_MACHINE}-unknown-linux-${LIBC} else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi else echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf fi fi exit ;; avr32*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; cris:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; crisv32:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; frv:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; hexagon:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; i*86:Linux:*:*) echo ${UNAME_MACHINE}-pc-linux-${LIBC} exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; mips:Linux:*:* | mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef ${UNAME_MACHINE} #undef ${UNAME_MACHINE}el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=${UNAME_MACHINE}el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=${UNAME_MACHINE} #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } ;; openrisc*:Linux:*:*) echo or1k-unknown-linux-${LIBC} exit ;; or32:Linux:*:* | or1k*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; padre:Linux:*:*) echo sparc-unknown-linux-${LIBC} exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-${LIBC} exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-${LIBC} ;; PA8*) echo hppa2.0-unknown-linux-${LIBC} ;; *) echo hppa-unknown-linux-${LIBC} ;; esac exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-${LIBC} exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-${LIBC} exit ;; ppc64le:Linux:*:*) echo powerpc64le-unknown-linux-${LIBC} exit ;; ppcle:Linux:*:*) echo powerpcle-unknown-linux-${LIBC} exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux-${LIBC} exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; tile*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-${LIBC} exit ;; x86_64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; xtensa*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub # prints for the "djgpp" host, or else GDB configury will decide that # this is a cross-build. echo i586-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; NCR*:*:4.2:* | MPRAS*:*:4.2:*) OS_REL='.3' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. echo i586-pc-haiku exit ;; x86_64:Haiku:*:*) echo x86_64-unknown-haiku exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux${UNAME_RELEASE} exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux${UNAME_RELEASE} exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux${UNAME_RELEASE} exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown eval $set_cc_for_build if test "$UNAME_PROCESSOR" = unknown ; then UNAME_PROCESSOR=powerpc fi if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then case $UNAME_PROCESSOR in i386) UNAME_PROCESSOR=x86_64 ;; powerpc) UNAME_PROCESSOR=powerpc64 ;; esac fi fi elif test "$UNAME_PROCESSOR" = i386 ; then # Avoid executing cc on OS X 10.9, as it ships with a stub # that puts up a graphical alert prompting to install # developer tools. Any system running Mac OS X 10.7 or # later (Darwin 11 and later) is required to have a 64-bit # processor. This is not true of the ARM version of Darwin # that Apple uses in portable devices. UNAME_PROCESSOR=x86_64 fi echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NEO-?:NONSTOP_KERNEL:*:*) echo neo-tandem-nsk${UNAME_RELEASE} exit ;; NSE-*:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos exit ;; i*86:AROS:*:*) echo ${UNAME_MACHINE}-pc-aros exit ;; x86_64:VMkernel:*:*) echo ${UNAME_MACHINE}-unknown-esx exit ;; esac cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: pkg-config-0.29.1/glib/glib.mk0000664000175000017500000002424512651243552012751 00000000000000# 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 ; \ echo '' >> $@.xml ; \ echo '' >> $@.xml ; \ echo ' $(PACKAGE)' >> $@.xml ; \ echo ' $(VERSION)' >> $@.xml ; \ echo " $$REVISION" >> $@.xml ; \ echo '' >> $@.xml ; \ for lf in `ls -L "$$GTESTER_LOGDIR"/.` ; do \ sed '1,1s/^?]*?>//' <"$$GTESTER_LOGDIR"/"$$lf" >> $@.xml ; \ done ; \ echo >> $@.xml ; \ echo '' >> $@.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 pkg-config-0.29.1/glib/depcomp0000755000175000017500000005601612601774026013057 00000000000000#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2013-05-30.07; # UTC # Copyright (C) 1999-2014 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, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by 'PROGRAMS ARGS'. object Object file output by 'PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputting dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac # Get the directory component of the given path, and save it in the # global variables '$dir'. Note that this directory component will # be either empty or ending with a '/' character. This is deliberate. set_dir_from () { case $1 in */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; *) dir=;; esac } # Get the suffix-stripped basename of the given path, and save it the # global variable '$base'. set_base_from () { base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` } # If no dependency file was actually created by the compiler invocation, # we still have to create a dummy depfile, to avoid errors with the # Makefile "include basename.Plo" scheme. make_dummy_depfile () { echo "#dummy" > "$depfile" } # Factor out some common post-processing of the generated depfile. # Requires the auxiliary global variable '$tmpdepfile' to be set. aix_post_process_depfile () { # If the compiler actually managed to produce a dependency file, # post-process it. if test -f "$tmpdepfile"; then # Each line is of the form 'foo.o: dependency.h'. # Do two passes, one to just change these to # $object: dependency.h # and one to simply output # dependency.h: # which is needed to avoid the deleted-header problem. { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" } > "$depfile" rm -f "$tmpdepfile" else make_dummy_depfile fi } # A tabulation character. tab=' ' # A newline character. nl=' ' # Character ranges might be problematic outside the C locale. # These definitions help. upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ lower=abcdefghijklmnopqrstuvwxyz digits=0123456789 alpha=${upper}${lower} if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Avoid interferences from the environment. gccflag= dashmflag= # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi cygpath_u="cygpath -u -f -" if test "$depmode" = msvcmsys; then # This is just like msvisualcpp but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvisualcpp fi if test "$depmode" = msvc7msys; then # This is just like msvc7 but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvc7 fi if test "$depmode" = xlc; then # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. gccflag=-qmakedep=gcc,-MF depmode=gcc fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. ## Unfortunately, FreeBSD c89 acceptance of flags depends upon ## the command line argument order; so add the flags where they ## appear in depend2.am. Note that the slowdown incurred here ## affects only configure: in makefiles, %FASTDEP% shortcuts this. for arg do case $arg in -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; *) set fnord "$@" "$arg" ;; esac shift # fnord shift # $arg done "$@" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. ## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. ## (see the conditional assignment to $gccflag above). ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). Also, it might not be ## supported by the other compilers which use the 'gcc' depmode. ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The second -e expression handles DOS-style file names with drive # letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the "deleted header file" problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. ## Some versions of gcc put a space before the ':'. On the theory ## that the space means something, we add a space to the output as ## well. hp depmode also adds that space, but also prefixes the VPATH ## to the object. Take care to not repeat it in the output. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like '#:fec' to the end of the # dependency line. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ | tr "$nl" ' ' >> "$depfile" echo >> "$depfile" # The second pass generates a dummy entry for each header file. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" ;; xlc) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts '$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.u tmpdepfile2=$base.u tmpdepfile3=$dir.libs/$base.u "$@" -Wc,-M else tmpdepfile1=$dir$base.u tmpdepfile2=$dir$base.u tmpdepfile3=$dir$base.u "$@" -M fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done aix_post_process_depfile ;; tcc) # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 # FIXME: That version still under development at the moment of writing. # Make that this statement remains true also for stable, released # versions. # It will wrap lines (doesn't matter whether long or short) with a # trailing '\', as in: # # foo.o : \ # foo.c \ # foo.h \ # # It will put a trailing '\' even on the last line, and will use leading # spaces rather than leading tabs (at least since its commit 0394caf7 # "Emit spaces for -MD"). "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. # We have to change lines of the first kind to '$object: \'. sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" # And for each line of the second kind, we have to emit a 'dep.h:' # dummy dependency, to avoid the deleted-header problem. sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" rm -f "$tmpdepfile" ;; ## The order of this option in the case statement is important, since the ## shell code in configure will try each of these formats in the order ## listed in this file. A plain '-MD' option would be understood by many ## compilers, so we must ensure this comes after the gcc and icc options. pgcc) # Portland's C compiler understands '-MD'. # Will always output deps to 'file.d' where file is the root name of the # source file under compilation, even if file resides in a subdirectory. # The object file name does not affect the name of the '.d' file. # pgcc 10.2 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using '\' : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... set_dir_from "$object" # Use the source, not the object, to determine the base name, since # that's sadly what pgcc will do too. set_base_from "$source" tmpdepfile=$base.d # For projects that build the same source file twice into different object # files, the pgcc approach of using the *source* file root name can cause # problems in parallel builds. Use a locking strategy to avoid stomping on # the same $tmpdepfile. lockdir=$base.d-lock trap " echo '$0: caught signal, cleaning up...' >&2 rmdir '$lockdir' exit 1 " 1 2 13 15 numtries=100 i=$numtries while test $i -gt 0; do # mkdir is a portable test-and-set. if mkdir "$lockdir" 2>/dev/null; then # This process acquired the lock. "$@" -MD stat=$? # Release the lock. rmdir "$lockdir" break else # If the lock is being held by a different process, wait # until the winning process is done or we timeout. while test -d "$lockdir" && test $i -gt 0; do sleep 1 i=`expr $i - 1` done fi i=`expr $i - 1` done trap - 1 2 13 15 if test $i -le 0; then echo "$0: failed to acquire lock after $numtries attempts" >&2 echo "$0: check lockdir '$lockdir'" >&2 exit 1 fi if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form `foo.o: dependent.h', # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp2) # The "hp" stanza above does not work with aCC (C++) and HP's ia64 # compilers, which have integrated preprocessors. The correct option # to use with these is +Maked; it writes dependencies to a file named # 'foo.d', which lands next to the object file, wherever that # happens to be. # Much of this is similar to the tru64 case; see comments there. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.d tmpdepfile2=$dir.libs/$base.d "$@" -Wc,+Maked else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d "$@" +Maked fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" # Add 'dependent.h:' lines. sed -ne '2,${ s/^ *// s/ \\*$// s/$/:/ p }' "$tmpdepfile" >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" "$tmpdepfile2" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in 'foo.d' instead, so we check for that too. # Subdirectories are respected. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then # Libtool generates 2 separate objects for the 2 libraries. These # two compilations output dependencies in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is # automatically cleaned when .libs/ is deleted, while ignoring # the former would cause a distcleancheck panic. tmpdepfile1=$dir$base.o.d # libtool 1.5 tmpdepfile2=$dir.libs/$base.o.d # Likewise. tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d "$@" -MD fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done # Same post-processing that is required for AIX mode. aix_post_process_depfile ;; msvc7) if test "$libtool" = yes; then showIncludes=-Wc,-showIncludes else showIncludes=-showIncludes fi "$@" $showIncludes > "$tmpdepfile" stat=$? grep -v '^Note: including file: ' "$tmpdepfile" if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The first sed program below extracts the file names and escapes # backslashes for cygpath. The second sed program outputs the file # name when reading, but also accumulates all include files in the # hold buffer in order to output them again at the end. This only # works with sed implementations that can handle large buffers. sed < "$tmpdepfile" -n ' /^Note: including file: *\(.*\)/ { s//\1/ s/\\/\\\\/g p }' | $cygpath_u | sort -u | sed -n ' s/ /\\ /g s/\(.*\)/'"$tab"'\1 \\/p s/.\(.*\) \\/\1:/ H $ { s/.*/'"$tab"'/ G p }' >> "$depfile" echo >> "$depfile" # make sure the fragment doesn't end with a backslash rm -f "$tmpdepfile" ;; msvc7msys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for ':' # in the target name. This is to cope with DOS-style filenames: # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. "$@" $dashmflag | sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this sed invocation # correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # X makedepend shift cleared=no eat=no for arg do case $cleared in no) set ""; shift cleared=yes ;; esac if test $eat = yes; then eat=no continue fi case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -arch) eat=yes ;; -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix=`echo "$object" | sed 's/^.*\././'` touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" # makedepend may prepend the VPATH from the source file name to the object. # No need to regex-escape $object, excess matching of '.' is harmless. sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process the last invocation # correctly. Breaking it into two sed invocations is a workaround. sed '1,2d' "$tmpdepfile" \ | tr ' ' "$nl" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E \ | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi IFS=" " for arg do case "$arg" in -o) shift ;; $object) shift ;; "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E 2>/dev/null | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" echo "$tab" >> "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; msvcmsys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # 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: pkg-config-0.29.1/glib/aclocal.m40000664000175000017500000014736212665370331013352 00000000000000# generated automatically by aclocal 1.15 -*- Autoconf -*- # Copyright (C) 1996-2014 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, [m4_warning([this file was generated for autoconf 2.69. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically 'autoreconf'.])]) # Copyright (C) 2002-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.15' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.15], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) # _AM_AUTOCONF_VERSION(VERSION) # ----------------------------- # aclocal traces this macro to find the Autoconf version. # This is a private macro too. Using m4_define simplifies # the logic in aclocal, which can simply ignore this definition. m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.15])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to # '$srcdir', '$srcdir/..', or '$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is '.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl # Expand $ac_aux_dir to an absolute path. am_aux_dir=`cd "$ac_aux_dir" && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ([2.52])dnl m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Copyright (C) 1999-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], [$1], [CXX], [depcc="$CXX" am_compiler_list=], [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], [$1], [UPC], [depcc="$UPC" am_compiler_list=], [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi am__universal=false m4_case([$1], [CC], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac], [CXX], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac]) for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES. AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE([dependency-tracking], [dnl AS_HELP_STRING( [--enable-dependency-tracking], [do not reject slow dependency extractors]) AS_HELP_STRING( [--disable-dependency-tracking], [speeds up one-time build])]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl AC_SUBST([am__nodep])dnl _AM_SUBST_NOTMAKE([am__nodep])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`AS_DIRNAME("$mf")` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` AS_MKDIR_P([$dirpart/$fdir]) # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking # is enabled. FIXME. This creates each '.P' file that we will # need in order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O. m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC]) [_AM_PROG_CC_C_O ]) # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.65])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [AC_DIAGNOSE([obsolete], [$0: two- and three-arguments forms are deprecated.]) m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if( m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), [ok:ok],, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) AM_MISSING_PROG([AUTOCONF], [autoconf]) AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) AM_MISSING_PROG([AUTOHEADER], [autoheader]) AM_MISSING_PROG([MAKEINFO], [makeinfo]) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # AC_SUBST([mkdir_p], ['$(MKDIR_P)']) # We need awk for the "check" target (and possibly the TAP driver). The # system "awk" is bad on some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES([CC])], [m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES([CXX])], [m4_define([AC_PROG_CXX], m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES([OBJC])], [m4_define([AC_PROG_OBJC], m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], [_AM_DEPENDENCIES([OBJCXX])], [m4_define([AC_PROG_OBJCXX], m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl ]) AC_REQUIRE([AM_SILENT_RULES])dnl dnl The testsuite driver may need to know about EXEEXT, so add the dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) fi fi dnl The trailing newline in this macro's definition is deliberate, for dnl backward compatibility and to allow trailing 'dnl'-style comments dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841. ]) dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST([install_sh])]) # Copyright (C) 2003-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Add --enable-maintainer-mode option to configure. -*- Autoconf -*- # From Jim Meyering # Copyright (C) 1996-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MAINTAINER_MODE([DEFAULT-MODE]) # ---------------------------------- # Control maintainer-specific portions of Makefiles. # Default is to disable them, unless 'enable' is passed literally. # For symmetry, 'disable' may be passed as well. Anyway, the user # can override the default with the --enable/--disable switch. AC_DEFUN([AM_MAINTAINER_MODE], [m4_case(m4_default([$1], [disable]), [enable], [m4_define([am_maintainer_other], [disable])], [disable], [m4_define([am_maintainer_other], [enable])], [m4_define([am_maintainer_other], [enable]) m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])]) AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) dnl maintainer-mode's default is 'disable' unless 'enable' is passed AC_ARG_ENABLE([maintainer-mode], [AS_HELP_STRING([--]am_maintainer_other[-maintainer-mode], am_maintainer_other[ make rules and dependencies not useful (and sometimes confusing) to the casual installer])], [USE_MAINTAINER_MODE=$enableval], [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes])) AC_MSG_RESULT([$USE_MAINTAINER_MODE]) AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes]) MAINT=$MAINTAINER_MODE_TRUE AC_SUBST([MAINT])dnl ] ) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. AC_MSG_CHECKING([for style of include used by $am_make]) am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi AC_SUBST([am__include]) AC_SUBST([am__quote]) AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it is modern enough. # If it is, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= AC_MSG_WARN(['missing' script is too old or missing]) fi ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # -------------------- # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), [1])]) # _AM_SET_OPTIONS(OPTIONS) # ------------------------ # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Copyright (C) 1999-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_CC_C_O # --------------- # Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC # to automatically call this. AC_DEFUN([_AM_PROG_CC_C_O], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([compile])dnl AC_LANG_PUSH([C])dnl AC_CACHE_CHECK( [whether $CC understands -c and -o together], [am_cv_prog_cc_c_o], [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i]) if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi AC_LANG_POP([C])]) # For backward compatibility. AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) # Copyright (C) 1999-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PATH_PYTHON([MINIMUM-VERSION], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) # --------------------------------------------------------------------------- # Adds support for distributing Python modules and packages. To # install modules, copy them to $(pythondir), using the python_PYTHON # automake variable. To install a package with the same name as the # automake package, install to $(pkgpythondir), or use the # pkgpython_PYTHON automake variable. # # The variables $(pyexecdir) and $(pkgpyexecdir) are provided as # locations to install python extension modules (shared libraries). # Another macro is required to find the appropriate flags to compile # extension modules. # # If your package is configured with a different prefix to python, # users will have to add the install directory to the PYTHONPATH # environment variable, or create a .pth file (see the python # documentation for details). # # If the MINIMUM-VERSION argument is passed, AM_PATH_PYTHON will # cause an error if the version of python installed on the system # doesn't meet the requirement. MINIMUM-VERSION should consist of # numbers and dots only. AC_DEFUN([AM_PATH_PYTHON], [ dnl Find a Python interpreter. Python versions prior to 2.0 are not dnl supported. (2.0 was released on October 16, 2000). m4_define_default([_AM_PYTHON_INTERPRETER_LIST], [python python2 python3 python3.3 python3.2 python3.1 python3.0 python2.7 dnl python2.6 python2.5 python2.4 python2.3 python2.2 python2.1 python2.0]) AC_ARG_VAR([PYTHON], [the Python interpreter]) m4_if([$1],[],[ dnl No version check is needed. # Find any Python interpreter. if test -z "$PYTHON"; then AC_PATH_PROGS([PYTHON], _AM_PYTHON_INTERPRETER_LIST, :) fi am_display_PYTHON=python ], [ dnl A version check is needed. if test -n "$PYTHON"; then # If the user set $PYTHON, use it and don't search something else. AC_MSG_CHECKING([whether $PYTHON version is >= $1]) AM_PYTHON_CHECK_VERSION([$PYTHON], [$1], [AC_MSG_RESULT([yes])], [AC_MSG_RESULT([no]) AC_MSG_ERROR([Python interpreter is too old])]) am_display_PYTHON=$PYTHON else # Otherwise, try each interpreter until we find one that satisfies # VERSION. AC_CACHE_CHECK([for a Python interpreter with version >= $1], [am_cv_pathless_PYTHON],[ for am_cv_pathless_PYTHON in _AM_PYTHON_INTERPRETER_LIST none; do test "$am_cv_pathless_PYTHON" = none && break AM_PYTHON_CHECK_VERSION([$am_cv_pathless_PYTHON], [$1], [break]) done]) # Set $PYTHON to the absolute path of $am_cv_pathless_PYTHON. if test "$am_cv_pathless_PYTHON" = none; then PYTHON=: else AC_PATH_PROG([PYTHON], [$am_cv_pathless_PYTHON]) fi am_display_PYTHON=$am_cv_pathless_PYTHON fi ]) if test "$PYTHON" = :; then dnl Run any user-specified action, or abort. m4_default([$3], [AC_MSG_ERROR([no suitable Python interpreter found])]) else dnl Query Python for its version number. Getting [:3] seems to be dnl the best way to do this; it's what "site.py" does in the standard dnl library. AC_CACHE_CHECK([for $am_display_PYTHON version], [am_cv_python_version], [am_cv_python_version=`$PYTHON -c "import sys; sys.stdout.write(sys.version[[:3]])"`]) AC_SUBST([PYTHON_VERSION], [$am_cv_python_version]) dnl Use the values of $prefix and $exec_prefix for the corresponding dnl values of PYTHON_PREFIX and PYTHON_EXEC_PREFIX. These are made dnl distinct variables so they can be overridden if need be. However, dnl general consensus is that you shouldn't need this ability. AC_SUBST([PYTHON_PREFIX], ['${prefix}']) AC_SUBST([PYTHON_EXEC_PREFIX], ['${exec_prefix}']) dnl At times (like when building shared libraries) you may want dnl to know which OS platform Python thinks this is. AC_CACHE_CHECK([for $am_display_PYTHON platform], [am_cv_python_platform], [am_cv_python_platform=`$PYTHON -c "import sys; sys.stdout.write(sys.platform)"`]) AC_SUBST([PYTHON_PLATFORM], [$am_cv_python_platform]) # Just factor out some code duplication. am_python_setup_sysconfig="\ import sys # Prefer sysconfig over distutils.sysconfig, for better compatibility # with python 3.x. See automake bug#10227. try: import sysconfig except ImportError: can_use_sysconfig = 0 else: can_use_sysconfig = 1 # Can't use sysconfig in CPython 2.7, since it's broken in virtualenvs: # try: from platform import python_implementation if python_implementation() == 'CPython' and sys.version[[:3]] == '2.7': can_use_sysconfig = 0 except ImportError: pass" dnl Set up 4 directories: dnl pythondir -- where to install python scripts. This is the dnl site-packages directory, not the python standard library dnl directory like in previous automake betas. This behavior dnl is more consistent with lispdir.m4 for example. dnl Query distutils for this directory. AC_CACHE_CHECK([for $am_display_PYTHON script directory], [am_cv_python_pythondir], [if test "x$prefix" = xNONE then am_py_prefix=$ac_default_prefix else am_py_prefix=$prefix fi am_cv_python_pythondir=`$PYTHON -c " $am_python_setup_sysconfig if can_use_sysconfig: sitedir = sysconfig.get_path('purelib', vars={'base':'$am_py_prefix'}) else: from distutils import sysconfig sitedir = sysconfig.get_python_lib(0, 0, prefix='$am_py_prefix') sys.stdout.write(sitedir)"` case $am_cv_python_pythondir in $am_py_prefix*) am__strip_prefix=`echo "$am_py_prefix" | sed 's|.|.|g'` am_cv_python_pythondir=`echo "$am_cv_python_pythondir" | sed "s,^$am__strip_prefix,$PYTHON_PREFIX,"` ;; *) case $am_py_prefix in /usr|/System*) ;; *) am_cv_python_pythondir=$PYTHON_PREFIX/lib/python$PYTHON_VERSION/site-packages ;; esac ;; esac ]) AC_SUBST([pythondir], [$am_cv_python_pythondir]) dnl pkgpythondir -- $PACKAGE directory under pythondir. Was dnl PYTHON_SITE_PACKAGE in previous betas, but this naming is dnl more consistent with the rest of automake. AC_SUBST([pkgpythondir], [\${pythondir}/$PACKAGE]) dnl pyexecdir -- directory for installing python extension modules dnl (shared libraries) dnl Query distutils for this directory. AC_CACHE_CHECK([for $am_display_PYTHON extension module directory], [am_cv_python_pyexecdir], [if test "x$exec_prefix" = xNONE then am_py_exec_prefix=$am_py_prefix else am_py_exec_prefix=$exec_prefix fi am_cv_python_pyexecdir=`$PYTHON -c " $am_python_setup_sysconfig if can_use_sysconfig: sitedir = sysconfig.get_path('platlib', vars={'platbase':'$am_py_prefix'}) else: from distutils import sysconfig sitedir = sysconfig.get_python_lib(1, 0, prefix='$am_py_prefix') sys.stdout.write(sitedir)"` case $am_cv_python_pyexecdir in $am_py_exec_prefix*) am__strip_prefix=`echo "$am_py_exec_prefix" | sed 's|.|.|g'` am_cv_python_pyexecdir=`echo "$am_cv_python_pyexecdir" | sed "s,^$am__strip_prefix,$PYTHON_EXEC_PREFIX,"` ;; *) case $am_py_exec_prefix in /usr|/System*) ;; *) am_cv_python_pyexecdir=$PYTHON_EXEC_PREFIX/lib/python$PYTHON_VERSION/site-packages ;; esac ;; esac ]) AC_SUBST([pyexecdir], [$am_cv_python_pyexecdir]) dnl pkgpyexecdir -- $(pyexecdir)/$(PACKAGE) AC_SUBST([pkgpyexecdir], [\${pyexecdir}/$PACKAGE]) dnl Run any user-specified action. $2 fi ]) # AM_PYTHON_CHECK_VERSION(PROG, VERSION, [ACTION-IF-TRUE], [ACTION-IF-FALSE]) # --------------------------------------------------------------------------- # Run ACTION-IF-TRUE if the Python interpreter PROG has version >= VERSION. # Run ACTION-IF-FALSE otherwise. # This test uses sys.hexversion instead of the string equivalent (first # word of sys.version), in order to cope with versions such as 2.2c1. # This supports Python 2.0 or higher. (2.0 was released on October 16, 2000). AC_DEFUN([AM_PYTHON_CHECK_VERSION], [prog="import sys # split strings by '.' and convert to numeric. Append some zeros # because we need at least 4 digits for the hex conversion. # map returns an iterator in Python 3.0 and a list in 2.x minver = list(map(int, '$2'.split('.'))) + [[0, 0, 0]] minverhex = 0 # xrange is not present in Python 3.0 and range returns an iterator for i in list(range(0, 4)): minverhex = (minverhex << 8) + minver[[i]] sys.exit(sys.hexversion < minverhex)" AS_IF([AM_RUN_LOG([$1 -c "$prog"])], [$3], [$4])]) # Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_RUN_LOG(COMMAND) # ------------------- # Run COMMAND, save the exit status in ac_status, and log it. # (This has been adapted from Autoconf's _AC_RUN_LOG macro.) AC_DEFUN([AM_RUN_LOG], [{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD (exit $ac_status); }]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi if test "$[2]" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT([yes]) # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi AC_CONFIG_COMMANDS_PRE( [AC_MSG_CHECKING([that generated files are newer than configure]) if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi AC_MSG_RESULT([done])]) rm -f conftest.file ]) # Copyright (C) 2009-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SILENT_RULES([DEFAULT]) # -------------------------- # Enable less verbose build rules; with the default set to DEFAULT # ("yes" being less verbose, "no" or empty being verbose). AC_DEFUN([AM_SILENT_RULES], [AC_ARG_ENABLE([silent-rules], [dnl AS_HELP_STRING( [--enable-silent-rules], [less verbose build output (undo: "make V=1")]) AS_HELP_STRING( [--disable-silent-rules], [verbose build output (undo: "make V=0")])dnl ]) case $enable_silent_rules in @%:@ ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; esac dnl dnl A few 'make' implementations (e.g., NonStop OS and NextStep) dnl do not support nested variable expansions. dnl See automake bug#9928 and bug#10237. am_make=${MAKE-make} AC_CACHE_CHECK([whether $am_make supports nested variables], [am_cv_make_support_nested_variables], [if AS_ECHO([['TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi]) if test $am_cv_make_support_nested_variables = yes; then dnl Using '$V' instead of '$(V)' breaks IRIX make. AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AC_SUBST([AM_V])dnl AM_SUBST_NOTMAKE([AM_V])dnl AC_SUBST([AM_DEFAULT_V])dnl AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl AC_SUBST([AM_DEFAULT_VERBOSITY])dnl AM_BACKSLASH='\' AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) # Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor 'install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in "make install-strip", and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Copyright (C) 2006-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) # -------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of 'v7', 'ustar', or 'pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar # AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar], [# The POSIX 1988 'ustar' format is defined with fixed-size fields. # There is notably a 21 bits limit for the UID and the GID. In fact, # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 # and bug#13588). am_max_uid=2097151 # 2^21 - 1 am_max_gid=$am_max_uid # The $UID and $GID variables are not portable, so we need to resort # to the POSIX-mandated id(1) utility. Errors in the 'id' calls # below are definitely unexpected, so allow the users to see them # (that is, avoid stderr redirection). am_uid=`id -u || echo unknown` am_gid=`id -g || echo unknown` AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) if test $am_uid -le $am_max_uid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) if test $am_gid -le $am_max_gid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi], [pax], [], [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Go ahead even if we have the value already cached. We do so because we # need to set the values for the 'am__tar' and 'am__untar' variables. _am_tools=${am_cv_prog_tar_$1-$_am_tools} for _am_tool in $_am_tools; do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works. rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR m4_include([m4macros/attributes.m4]) m4_include([m4macros/glibtests.m4]) m4_include([m4macros/libtool.m4]) m4_include([m4macros/ltoptions.m4]) m4_include([m4macros/ltsugar.m4]) m4_include([m4macros/ltversion.m4]) m4_include([m4macros/lt~obsolete.m4]) m4_include([acinclude.m4]) pkg-config-0.29.1/glib/acglib.m40000664000175000017500000001070112275467762013173 00000000000000## Portability defines that help interoperate with classic and modern autoconfs ifdef([AC_TR_SH],[ define([GLIB_TR_SH],[AC_TR_SH([$1])]) define([GLIB_TR_CPP],[AC_TR_CPP([$1])]) ], [ define([GLIB_TR_SH], [patsubst(translit([[$1]], [*+], [pp]), [[^a-zA-Z0-9_]], [_])]) define([GLIB_TR_CPP], [patsubst(translit([[$1]], [*abcdefghijklmnopqrstuvwxyz], [PABCDEFGHIJKLMNOPQRSTUVWXYZ]), [[^A-Z0-9_]], [_])]) ]) # GLIB_AC_DIVERT_BEFORE_HELP(STUFF) # --------------------------------- # Put STUFF early enough so that they are available for $ac_help expansion. # Handle both classic (<= v2.13) and modern autoconf AC_DEFUN([GLIB_AC_DIVERT_BEFORE_HELP], [ifdef([m4_divert_text], [m4_divert_text([NOTICE],[$1])], [ifdef([AC_DIVERT], [AC_DIVERT([NOTICE],[$1])], [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)dnl $1 AC_DIVERT_POP()])])]) dnl GLIB_IF_VAR_EQ (ENV_VAR, VALUE [, EQUALS_ACTION] [, ELSE_ACTION]) AC_DEFUN([GLIB_IF_VAR_EQ],[ case "$[$1]" in "[$2]"[)] [$3] ;; *[)] [$4] ;; esac ]) dnl GLIB_STR_CONTAINS (SRC_STRING, SUB_STRING [, CONTAINS_ACTION] [, ELSE_ACTION]) AC_DEFUN([GLIB_STR_CONTAINS],[ case "[$1]" in *"[$2]"*[)] [$3] ;; *[)] [$4] ;; esac ]) dnl GLIB_ADD_TO_VAR (ENV_VARIABLE, CHECK_STRING, ADD_STRING) AC_DEFUN([GLIB_ADD_TO_VAR],[ GLIB_STR_CONTAINS($[$1], [$2], [$1]="$[$1]", [$1]="$[$1] [$3]") ]) # GLIB_SIZEOF (INCLUDES, TYPE, ALIAS) # --------------------------------------------------------------- # The definition here is based of that of AC_CHECK_SIZEOF AC_DEFUN([GLIB_SIZEOF], [AS_LITERAL_IF([$3], [], [AC_FATAL([$0: requires literal arguments])])dnl AC_CACHE_CHECK([size of $2], AS_TR_SH([glib_cv_sizeof_$3]), [ # The cast to unsigned long works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. _AC_COMPUTE_INT([(long) (sizeof ($2))], [AS_TR_SH([glib_cv_sizeof_$3])], [AC_INCLUDES_DEFAULT([$1])], [AC_MSG_ERROR([cannot compute sizeof ($2), 77])]) ])dnl AC_DEFINE_UNQUOTED(GLIB_TR_CPP(glib_sizeof_$3), $AS_TR_SH([glib_cv_sizeof_$3]), [The size of $3, as computed by sizeof.]) ])# GLIB_SIZEOF dnl GLIB_BYTE_CONTENTS (INCLUDES, TYPE, ALIAS, N_BYTES, INITIALIZER) AC_DEFUN([GLIB_BYTE_CONTENTS], [pushdef([glib_ByteContents], GLIB_TR_SH([glib_cv_byte_contents_$3]))dnl AC_CACHE_CHECK([byte contents of $5], glib_ByteContents, [AC_TRY_RUN([#include $1 main() { static $2 tv = $5; char *p = (char*) &tv; int i; FILE *f=fopen("conftestval", "w"); if (!f) exit(1); for (i = 0; i < $4; i++) fprintf(f, "%s%d", i?",":"", *(p++)); fprintf(f, "\n"); exit(0); }], [glib_ByteContents=`cat conftestval` dnl'' ], [glib_ByteContents=no], [glib_ByteContents=no])]) AC_DEFINE_UNQUOTED(GLIB_TR_CPP(glib_byte_contents_$3), [$[]glib_ByteContents], [Byte contents of $3]) popdef([glib_ByteContents])dnl ]) # GLIB_CHECK_VALUE(SYMBOL, INCLUDES, ACTION-IF-FAIL) # --------------------------------------------------------------- AC_DEFUN([GLIB_CHECK_VALUE], [AC_CACHE_CHECK([value of $1], AS_TR_SH([glib_cv_value_$1]), [_AC_COMPUTE_INT([$1], AS_TR_SH([glib_cv_value_$1]), [$2], [$3])]) ])dnl # GLIB_CHECK_COMPILE_WARNINGS(PROGRAM, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) # --------------------------------------------------------------------- # Try to compile PROGRAM, check for warnings m4_define([GLIB_CHECK_COMPILE_WARNINGS], [m4_ifvaln([$1], [AC_LANG_CONFTEST([$1])])dnl rm -f conftest.$ac_objext glib_ac_compile_save="$ac_compile" ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext' AS_IF([_AC_EVAL_STDERR($ac_compile) && AC_TRY_COMMAND([(if test -s conftest.err; then false ; else true; fi)])], [$2], [echo "$as_me: failed program was:" >&AS_MESSAGE_LOG_FD cat conftest.$ac_ext >&AS_MESSAGE_LOG_FD m4_ifvaln([$3],[$3])dnl]) ac_compile="$glib_ac_compile_save" rm -f conftest.$ac_objext conftest.err m4_ifval([$1], [conftest.$ac_ext])[]dnl ])# GLIB_CHECK_COMPILE_WARNINGS # GLIB_ASSERT_SET(VARIABLE) # ------------------------- AC_DEFUN([GLIB_ASSERT_SET], [if test "x${$1+set}" != "xset" ; then AC_MSG_ERROR($1 [must be set in cache file when cross-compiling.]) fi ])dnl pkg-config-0.29.1/glib/glib/0000775000175000017500000000000012665370350012473 500000000000000pkg-config-0.29.1/glib/glib/gmappedfile.h0000664000175000017500000000404412651243552015041 00000000000000/* GLIB - Library of useful routines for C programming * gmappedfile.h: Simplified wrapper around the mmap function * * Copyright 2005 Matthias Clasen * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __G_MAPPED_FILE_H__ #define __G_MAPPED_FILE_H__ #if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) #error "Only can be included directly." #endif #include #include 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) void g_mapped_file_free (GMappedFile *file); G_END_DECLS #endif /* __G_MAPPED_FILE_H__ */ pkg-config-0.29.1/glib/glib/gvariant.c0000664000175000017500000046457712651243552014417 00000000000000/* * Copyright © 2007, 2008 Ryan Lortie * Copyright © 2010 Codethink Limited * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the licence, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * * Author: Ryan Lortie */ /* Prologue {{{1 */ #include "config.h" #include #include "gvariant-internal.h" #include #include #include #include #include #include #include /** * SECTION:gvariant * @title: GVariant * @short_description: strongly typed value datatype * @see_also: GVariantType * * #GVariant is a variant datatype; it stores a value along with * information about the type of that value. The range of possible * values is determined by the type. The type system used by #GVariant * is #GVariantType. * * #GVariant instances always have a type and a value (which are given * at construction time). The type and value of a #GVariant instance * can never change other than by the #GVariant itself being * destroyed. A #GVariant cannot contain a pointer. * * #GVariant is reference counted using g_variant_ref() and * g_variant_unref(). #GVariant also has floating reference counts -- * see g_variant_ref_sink(). * * #GVariant is completely threadsafe. A #GVariant instance can be * concurrently accessed in any way from any number of threads without * problems. * * #GVariant is heavily optimised for dealing with data in serialised * form. It works particularly well with data located in memory-mapped * files. It can perform nearly all deserialisation operations in a * small constant time, usually touching only a single memory page. * Serialised #GVariant data can also be sent over the network. * * #GVariant is largely compatible with D-Bus. Almost all types of * #GVariant instances can be sent over D-Bus. See #GVariantType for * exceptions. (However, #GVariant's serialisation format is not the same * as the serialisation format of a D-Bus message body: use #GDBusMessage, * in the gio library, for those.) * * For space-efficiency, the #GVariant serialisation format does not * automatically include the variant's type or endianness, which must * either be implied from context (such as knowledge that a particular * file format always contains a little-endian %G_VARIANT_TYPE_VARIANT) * or supplied out-of-band (for instance, a type and/or endianness * indicator could be placed at the beginning of a file, network message * or network stream). * * A #GVariant's size is limited mainly by any lower level operating * system constraints, such as the number of bits in #gsize. For * example, it is reasonable to have a 2GB file mapped into memory * with #GMappedFile, and call g_variant_new_from_data() on it. * * For convenience to C programmers, #GVariant features powerful * varargs-based value construction and destruction. This feature is * designed to be embedded in other libraries. * * There is a Python-inspired text language for describing #GVariant * values. #GVariant includes a printer for this language and a parser * with type inferencing. * * * Memory Use * * #GVariant tries to be quite efficient with respect to memory use. * This section gives a rough idea of how much memory is used by the * current implementation. The information here is subject to change * in the future. * * * The memory allocated by #GVariant can be grouped into 4 broad * purposes: memory for serialised data, memory for the type * information cache, buffer management memory and memory for the * #GVariant structure itself. * * * Serialised Data Memory * * This is the memory that is used for storing GVariant data in * serialised form. This is what would be sent over the network or * what would end up on disk. * * * The amount of memory required to store a boolean is 1 byte. 16, * 32 and 64 bit integers and double precision floating point numbers * use their "natural" size. Strings (including object path and * signature strings) are stored with a nul terminator, and as such * use the length of the string plus 1 byte. * * * Maybe types use no space at all to represent the null value and * use the same amount of space (sometimes plus one byte) as the * equivalent non-maybe-typed value to represent the non-null case. * * * Arrays use the amount of space required to store each of their * members, concatenated. Additionally, if the items stored in an * array are not of a fixed-size (ie: strings, other arrays, etc) * then an additional framing offset is stored for each item. The * size of this offset is either 1, 2 or 4 bytes depending on the * overall size of the container. Additionally, extra padding bytes * are added as required for alignment of child values. * * * Tuples (including dictionary entries) use the amount of space * required to store each of their members, concatenated, plus one * framing offset (as per arrays) for each non-fixed-sized item in * the tuple, except for the last one. Additionally, extra padding * bytes are added as required for alignment of child values. * * * Variants use the same amount of space as the item inside of the * variant, plus 1 byte, plus the length of the type string for the * item inside the variant. * * * As an example, consider a dictionary mapping strings to variants. * In the case that the dictionary is empty, 0 bytes are required for * the serialisation. * * * If we add an item "width" that maps to the int32 value of 500 then * we will use 4 byte to store the int32 (so 6 for the variant * containing it) and 6 bytes for the string. The variant must be * aligned to 8 after the 6 bytes of the string, so that's 2 extra * bytes. 6 (string) + 2 (padding) + 6 (variant) is 14 bytes used * for the dictionary entry. An additional 1 byte is added to the * array as a framing offset making a total of 15 bytes. * * * If we add another entry, "title" that maps to a nullable string * that happens to have a value of null, then we use 0 bytes for the * null value (and 3 bytes for the variant to contain it along with * its type string) plus 6 bytes for the string. Again, we need 2 * padding bytes. That makes a total of 6 + 2 + 3 = 11 bytes. * * * We now require extra padding between the two items in the array. * After the 14 bytes of the first item, that's 2 bytes required. We * now require 2 framing offsets for an extra two bytes. 14 + 2 + 11 * + 2 = 29 bytes to encode the entire two-item dictionary. * * * * Type Information Cache * * For each GVariant type that currently exists in the program a type * information structure is kept in the type information cache. The * type information structure is required for rapid deserialisation. * * * Continuing with the above example, if a #GVariant exists with the * type "a{sv}" then a type information struct will exist for * "a{sv}", "{sv}", "s", and "v". Multiple uses of the same type * will share the same type information. Additionally, all * single-digit types are stored in read-only static memory and do * not contribute to the writable memory footprint of a program using * #GVariant. * * * Aside from the type information structures stored in read-only * memory, there are two forms of type information. One is used for * container types where there is a single element type: arrays and * maybe types. The other is used for container types where there * are multiple element types: tuples and dictionary entries. * * * Array type info structures are 6 * sizeof (void *), plus the * memory required to store the type string itself. This means that * on 32bit systems, the cache entry for "a{sv}" would require 30 * bytes of memory (plus malloc overhead). * * * Tuple type info structures are 6 * sizeof (void *), plus 4 * * sizeof (void *) for each item in the tuple, plus the memory * required to store the type string itself. A 2-item tuple, for * example, would have a type information structure that consumed * writable memory in the size of 14 * sizeof (void *) (plus type * string) This means that on 32bit systems, the cache entry for * "{sv}" would require 61 bytes of memory (plus malloc overhead). * * * This means that in total, for our "a{sv}" example, 91 bytes of * type information would be allocated. * * * The type information cache, additionally, uses a #GHashTable to * store and lookup the cached items and stores a pointer to this * hash table in static storage. The hash table is freed when there * are zero items in the type cache. * * * Although these sizes may seem large it is important to remember * that a program will probably only have a very small number of * different types of values in it and that only one type information * structure is required for many different values of the same type. * * * * Buffer Management Memory * * #GVariant uses an internal buffer management structure to deal * with the various different possible sources of serialised data * that it uses. The buffer is responsible for ensuring that the * correct call is made when the data is no longer in use by * #GVariant. This may involve a g_free() or a g_slice_free() or * even g_mapped_file_unref(). * * * One buffer management structure is used for each chunk of * serialised data. The size of the buffer management structure is 4 * * (void *). On 32bit systems, that's 16 bytes. * * * * GVariant structure * * The size of a #GVariant structure is 6 * (void *). On 32 bit * systems, that's 24 bytes. * * * #GVariant structures only exist if they are explicitly created * with API calls. For example, if a #GVariant is constructed out of * serialised data for the example given above (with the dictionary) * then although there are 9 individual values that comprise the * entire dictionary (two keys, two values, two variants containing * the values, two dictionary entries, plus the dictionary itself), * only 1 #GVariant instance exists -- the one referring to the * dictionary. * * * If calls are made to start accessing the other values then * #GVariant instances will exist for those values only for as long * as they are in use (ie: until you call g_variant_unref()). The * type information is shared. The serialised data and the buffer * management structure for that serialised data is shared by the * child. * * * * Summary * * To put the entire example together, for our dictionary mapping * strings to variants (with two entries, as given above), we are * using 91 bytes of memory for type information, 29 byes of memory * for the serialised data, 16 bytes for buffer management and 24 * bytes for the #GVariant instance, or a total of 160 bytes, plus * malloc overhead. If we were to use g_variant_get_child_value() to * access the two dictionary entries, we would use an additional 48 * bytes. If we were to have other dictionaries of the same type, we * would use more memory for the serialised data and buffer * management for those dictionaries, but the type information would * be shared. * * * */ /* definition of GVariant structure is in gvariant-core.c */ /* this is a g_return_val_if_fail() for making * sure a (GVariant *) has the required type. */ #define TYPE_CHECK(value, TYPE, val) \ if G_UNLIKELY (!g_variant_is_of_type (value, TYPE)) { \ g_return_if_fail_warning (G_LOG_DOMAIN, G_STRFUNC, \ "g_variant_is_of_type (" #value \ ", " #TYPE ")"); \ return val; \ } /* Numeric Type Constructor/Getters {{{1 */ /* < private > * g_variant_new_from_trusted: * @type: the #GVariantType * @data: the data to use * @size: the size of @data * * Constructs a new trusted #GVariant instance from the provided data. * This is used to implement g_variant_new_* for all the basic types. * * Returns: a new floating #GVariant */ static GVariant * g_variant_new_from_trusted (const GVariantType *type, gconstpointer data, gsize size) { GVariant *value; GBytes *bytes; bytes = g_bytes_new (data, size); value = g_variant_new_from_bytes (type, bytes, TRUE); g_bytes_unref (bytes); return value; } /** * g_variant_new_boolean: * @value: a #gboolean value * * Creates a new boolean #GVariant instance -- either %TRUE or %FALSE. * * Returns: (transfer none): a floating reference to a new boolean #GVariant instance * * Since: 2.24 **/ GVariant * g_variant_new_boolean (gboolean value) { guchar v = value; return g_variant_new_from_trusted (G_VARIANT_TYPE_BOOLEAN, &v, 1); } /** * g_variant_get_boolean: * @value: a boolean #GVariant instance * * Returns the boolean value of @value. * * It is an error to call this function with a @value of any type * other than %G_VARIANT_TYPE_BOOLEAN. * * Returns: %TRUE or %FALSE * * Since: 2.24 **/ gboolean g_variant_get_boolean (GVariant *value) { const guchar *data; TYPE_CHECK (value, G_VARIANT_TYPE_BOOLEAN, FALSE); data = g_variant_get_data (value); return data != NULL ? *data != 0 : FALSE; } /* the constructors and accessors for byte, int{16,32,64}, handles and * doubles all look pretty much exactly the same, so we reduce * copy/pasting here. */ #define NUMERIC_TYPE(TYPE, type, ctype) \ GVariant *g_variant_new_##type (ctype value) { \ return g_variant_new_from_trusted (G_VARIANT_TYPE_##TYPE, \ &value, sizeof value); \ } \ ctype g_variant_get_##type (GVariant *value) { \ const ctype *data; \ TYPE_CHECK (value, G_VARIANT_TYPE_ ## TYPE, 0); \ data = g_variant_get_data (value); \ return data != NULL ? *data : 0; \ } /** * g_variant_new_byte: * @value: a #guint8 value * * Creates a new byte #GVariant instance. * * Returns: (transfer none): a floating reference to a new byte #GVariant instance * * Since: 2.24 **/ /** * g_variant_get_byte: * @value: a byte #GVariant instance * * Returns the byte value of @value. * * It is an error to call this function with a @value of any type * other than %G_VARIANT_TYPE_BYTE. * * Returns: a #guchar * * Since: 2.24 **/ NUMERIC_TYPE (BYTE, byte, guchar) /** * g_variant_new_int16: * @value: a #gint16 value * * Creates a new int16 #GVariant instance. * * Returns: (transfer none): a floating reference to a new int16 #GVariant instance * * Since: 2.24 **/ /** * g_variant_get_int16: * @value: a int16 #GVariant instance * * Returns the 16-bit signed integer value of @value. * * It is an error to call this function with a @value of any type * other than %G_VARIANT_TYPE_INT16. * * Returns: a #gint16 * * Since: 2.24 **/ NUMERIC_TYPE (INT16, int16, gint16) /** * g_variant_new_uint16: * @value: a #guint16 value * * Creates a new uint16 #GVariant instance. * * Returns: (transfer none): a floating reference to a new uint16 #GVariant instance * * Since: 2.24 **/ /** * g_variant_get_uint16: * @value: a uint16 #GVariant instance * * Returns the 16-bit unsigned integer value of @value. * * It is an error to call this function with a @value of any type * other than %G_VARIANT_TYPE_UINT16. * * Returns: a #guint16 * * Since: 2.24 **/ NUMERIC_TYPE (UINT16, uint16, guint16) /** * g_variant_new_int32: * @value: a #gint32 value * * Creates a new int32 #GVariant instance. * * Returns: (transfer none): a floating reference to a new int32 #GVariant instance * * Since: 2.24 **/ /** * g_variant_get_int32: * @value: a int32 #GVariant instance * * Returns the 32-bit signed integer value of @value. * * It is an error to call this function with a @value of any type * other than %G_VARIANT_TYPE_INT32. * * Returns: a #gint32 * * Since: 2.24 **/ NUMERIC_TYPE (INT32, int32, gint32) /** * g_variant_new_uint32: * @value: a #guint32 value * * Creates a new uint32 #GVariant instance. * * Returns: (transfer none): a floating reference to a new uint32 #GVariant instance * * Since: 2.24 **/ /** * g_variant_get_uint32: * @value: a uint32 #GVariant instance * * Returns the 32-bit unsigned integer value of @value. * * It is an error to call this function with a @value of any type * other than %G_VARIANT_TYPE_UINT32. * * Returns: a #guint32 * * Since: 2.24 **/ NUMERIC_TYPE (UINT32, uint32, guint32) /** * g_variant_new_int64: * @value: a #gint64 value * * Creates a new int64 #GVariant instance. * * Returns: (transfer none): a floating reference to a new int64 #GVariant instance * * Since: 2.24 **/ /** * g_variant_get_int64: * @value: a int64 #GVariant instance * * Returns the 64-bit signed integer value of @value. * * It is an error to call this function with a @value of any type * other than %G_VARIANT_TYPE_INT64. * * Returns: a #gint64 * * Since: 2.24 **/ NUMERIC_TYPE (INT64, int64, gint64) /** * g_variant_new_uint64: * @value: a #guint64 value * * Creates a new uint64 #GVariant instance. * * Returns: (transfer none): a floating reference to a new uint64 #GVariant instance * * Since: 2.24 **/ /** * g_variant_get_uint64: * @value: a uint64 #GVariant instance * * Returns the 64-bit unsigned integer value of @value. * * It is an error to call this function with a @value of any type * other than %G_VARIANT_TYPE_UINT64. * * Returns: a #guint64 * * Since: 2.24 **/ NUMERIC_TYPE (UINT64, uint64, guint64) /** * g_variant_new_handle: * @value: a #gint32 value * * Creates a new handle #GVariant instance. * * By convention, handles are indexes into an array of file descriptors * that are sent alongside a D-Bus message. If you're not interacting * with D-Bus, you probably don't need them. * * Returns: (transfer none): a floating reference to a new handle #GVariant instance * * Since: 2.24 **/ /** * g_variant_get_handle: * @value: a handle #GVariant instance * * Returns the 32-bit signed integer value of @value. * * It is an error to call this function with a @value of any type other * than %G_VARIANT_TYPE_HANDLE. * * By convention, handles are indexes into an array of file descriptors * that are sent alongside a D-Bus message. If you're not interacting * with D-Bus, you probably don't need them. * * Returns: a #gint32 * * Since: 2.24 **/ NUMERIC_TYPE (HANDLE, handle, gint32) /** * g_variant_new_double: * @value: a #gdouble floating point value * * Creates a new double #GVariant instance. * * Returns: (transfer none): a floating reference to a new double #GVariant instance * * Since: 2.24 **/ /** * g_variant_get_double: * @value: a double #GVariant instance * * Returns the double precision floating point value of @value. * * It is an error to call this function with a @value of any type * other than %G_VARIANT_TYPE_DOUBLE. * * Returns: a #gdouble * * Since: 2.24 **/ NUMERIC_TYPE (DOUBLE, double, gdouble) /* Container type Constructor / Deconstructors {{{1 */ /** * g_variant_new_maybe: * @child_type: (allow-none): the #GVariantType of the child, or %NULL * @child: (allow-none): the child value, or %NULL * * Depending on if @child is %NULL, either wraps @child inside of a * maybe container or creates a Nothing instance for the given @type. * * At least one of @child_type and @child must be non-%NULL. * If @child_type is non-%NULL then it must be a definite type. * If they are both non-%NULL then @child_type must be the type * of @child. * * If @child is a floating reference (see g_variant_ref_sink()), the new * instance takes ownership of @child. * * Returns: (transfer none): a floating reference to a new #GVariant maybe instance * * Since: 2.24 **/ GVariant * g_variant_new_maybe (const GVariantType *child_type, GVariant *child) { GVariantType *maybe_type; GVariant *value; g_return_val_if_fail (child_type == NULL || g_variant_type_is_definite (child_type), 0); g_return_val_if_fail (child_type != NULL || child != NULL, NULL); g_return_val_if_fail (child_type == NULL || child == NULL || g_variant_is_of_type (child, child_type), NULL); if (child_type == NULL) child_type = g_variant_get_type (child); maybe_type = g_variant_type_new_maybe (child_type); if (child != NULL) { GVariant **children; gboolean trusted; children = g_new (GVariant *, 1); children[0] = g_variant_ref_sink (child); trusted = g_variant_is_trusted (children[0]); value = g_variant_new_from_children (maybe_type, children, 1, trusted); } else value = g_variant_new_from_children (maybe_type, NULL, 0, TRUE); g_variant_type_free (maybe_type); return value; } /** * g_variant_get_maybe: * @value: a maybe-typed value * * Given a maybe-typed #GVariant instance, extract its value. If the * value is Nothing, then this function returns %NULL. * * Returns: (allow-none) (transfer full): the contents of @value, or %NULL * * Since: 2.24 **/ GVariant * g_variant_get_maybe (GVariant *value) { TYPE_CHECK (value, G_VARIANT_TYPE_MAYBE, NULL); if (g_variant_n_children (value)) return g_variant_get_child_value (value, 0); return NULL; } /** * g_variant_new_variant: (constructor) * @value: a #GVariant instance * * Boxes @value. The result is a #GVariant instance representing a * variant containing the original value. * * If @child is a floating reference (see g_variant_ref_sink()), the new * instance takes ownership of @child. * * Returns: (transfer none): a floating reference to a new variant #GVariant instance * * Since: 2.24 **/ GVariant * g_variant_new_variant (GVariant *value) { g_return_val_if_fail (value != NULL, NULL); g_variant_ref_sink (value); return g_variant_new_from_children (G_VARIANT_TYPE_VARIANT, g_memdup (&value, sizeof value), 1, g_variant_is_trusted (value)); } /** * g_variant_get_variant: * @value: a variant #GVariant instance * * Unboxes @value. The result is the #GVariant instance that was * contained in @value. * * Returns: (transfer full): the item contained in the variant * * Since: 2.24 **/ GVariant * g_variant_get_variant (GVariant *value) { TYPE_CHECK (value, G_VARIANT_TYPE_VARIANT, NULL); return g_variant_get_child_value (value, 0); } /** * g_variant_new_array: * @child_type: (allow-none): the element type of the new array * @children: (allow-none) (array length=n_children): an array of * #GVariant pointers, the children * @n_children: the length of @children * * Creates a new #GVariant array from @children. * * @child_type must be non-%NULL if @n_children is zero. Otherwise, the * child type is determined by inspecting the first element of the * @children array. If @child_type is non-%NULL then it must be a * definite type. * * The items of the array are taken from the @children array. No entry * in the @children array may be %NULL. * * All items in the array must have the same type, which must be the * same as @child_type, if given. * * If the @children are floating references (see g_variant_ref_sink()), the * new instance takes ownership of them as if via g_variant_ref_sink(). * * Returns: (transfer none): a floating reference to a new #GVariant array * * Since: 2.24 **/ GVariant * g_variant_new_array (const GVariantType *child_type, GVariant * const *children, gsize n_children) { GVariantType *array_type; GVariant **my_children; gboolean trusted; GVariant *value; gsize i; g_return_val_if_fail (n_children > 0 || child_type != NULL, NULL); g_return_val_if_fail (n_children == 0 || children != NULL, NULL); g_return_val_if_fail (child_type == NULL || g_variant_type_is_definite (child_type), NULL); my_children = g_new (GVariant *, n_children); trusted = TRUE; if (child_type == NULL) child_type = g_variant_get_type (children[0]); array_type = g_variant_type_new_array (child_type); for (i = 0; i < n_children; i++) { TYPE_CHECK (children[i], child_type, NULL); my_children[i] = g_variant_ref_sink (children[i]); trusted &= g_variant_is_trusted (children[i]); } value = g_variant_new_from_children (array_type, my_children, n_children, trusted); g_variant_type_free (array_type); return value; } /*< private > * g_variant_make_tuple_type: * @children: (array length=n_children): an array of GVariant * * @n_children: the length of @children * * Return the type of a tuple containing @children as its items. **/ static GVariantType * g_variant_make_tuple_type (GVariant * const *children, gsize n_children) { const GVariantType **types; GVariantType *type; gsize i; types = g_new (const GVariantType *, n_children); for (i = 0; i < n_children; i++) types[i] = g_variant_get_type (children[i]); type = g_variant_type_new_tuple (types, n_children); g_free (types); return type; } /** * g_variant_new_tuple: * @children: (array length=n_children): the items to make the tuple out of * @n_children: the length of @children * * Creates a new tuple #GVariant out of the items in @children. The * type is determined from the types of @children. No entry in the * @children array may be %NULL. * * If @n_children is 0 then the unit tuple is constructed. * * If the @children are floating references (see g_variant_ref_sink()), the * new instance takes ownership of them as if via g_variant_ref_sink(). * * Returns: (transfer none): a floating reference to a new #GVariant tuple * * Since: 2.24 **/ GVariant * g_variant_new_tuple (GVariant * const *children, gsize n_children) { GVariantType *tuple_type; GVariant **my_children; gboolean trusted; GVariant *value; gsize i; g_return_val_if_fail (n_children == 0 || children != NULL, NULL); my_children = g_new (GVariant *, n_children); trusted = TRUE; for (i = 0; i < n_children; i++) { my_children[i] = g_variant_ref_sink (children[i]); trusted &= g_variant_is_trusted (children[i]); } tuple_type = g_variant_make_tuple_type (children, n_children); value = g_variant_new_from_children (tuple_type, my_children, n_children, trusted); g_variant_type_free (tuple_type); return value; } /*< private > * g_variant_make_dict_entry_type: * @key: a #GVariant, the key * @val: a #GVariant, the value * * Return the type of a dictionary entry containing @key and @val as its * children. **/ static GVariantType * g_variant_make_dict_entry_type (GVariant *key, GVariant *val) { return g_variant_type_new_dict_entry (g_variant_get_type (key), g_variant_get_type (val)); } /** * g_variant_new_dict_entry: (constructor) * @key: a basic #GVariant, the key * @value: a #GVariant, the value * * Creates a new dictionary entry #GVariant. @key and @value must be * non-%NULL. @key must be a value of a basic type (ie: not a container). * * If the @key or @value are floating references (see g_variant_ref_sink()), * the new instance takes ownership of them as if via g_variant_ref_sink(). * * Returns: (transfer none): a floating reference to a new dictionary entry #GVariant * * Since: 2.24 **/ GVariant * g_variant_new_dict_entry (GVariant *key, GVariant *value) { GVariantType *dict_type; GVariant **children; gboolean trusted; g_return_val_if_fail (key != NULL && value != NULL, NULL); g_return_val_if_fail (!g_variant_is_container (key), NULL); children = g_new (GVariant *, 2); children[0] = g_variant_ref_sink (key); children[1] = g_variant_ref_sink (value); trusted = g_variant_is_trusted (key) && g_variant_is_trusted (value); dict_type = g_variant_make_dict_entry_type (key, value); value = g_variant_new_from_children (dict_type, children, 2, trusted); g_variant_type_free (dict_type); return value; } /** * g_variant_lookup: (skip) * @dictionary: a dictionary #GVariant * @key: the key to lookup in the dictionary * @format_string: a GVariant format string * @...: the arguments to unpack the value into * * Looks up a value in a dictionary #GVariant. * * This function is a wrapper around g_variant_lookup_value() and * g_variant_get(). In the case that %NULL would have been returned, * this function returns %FALSE. Otherwise, it unpacks the returned * value and returns %TRUE. * * @format_string determines the C types that are used for unpacking * the values and also determines if the values are copied or borrowed, * see the section on * GVariant Format Strings. * * Returns: %TRUE if a value was unpacked * * Since: 2.28 */ gboolean g_variant_lookup (GVariant *dictionary, const gchar *key, const gchar *format_string, ...) { GVariantType *type; GVariant *value; /* flatten */ g_variant_get_data (dictionary); type = g_variant_format_string_scan_type (format_string, NULL, NULL); value = g_variant_lookup_value (dictionary, key, type); g_variant_type_free (type); if (value) { va_list ap; va_start (ap, format_string); g_variant_get_va (value, format_string, NULL, &ap); g_variant_unref (value); va_end (ap); return TRUE; } else return FALSE; } /** * g_variant_lookup_value: * @dictionary: a dictionary #GVariant * @key: the key to lookup in the dictionary * @expected_type: (allow-none): a #GVariantType, or %NULL * * Looks up a value in a dictionary #GVariant. * * This function works with dictionaries of the type * a{s*} (and equally well with type * a{o*}, but we only further discuss the string case * for sake of clarity). * * In the event that @dictionary has the type a{sv}, * the @expected_type string specifies what type of value is expected to * be inside of the variant. If the value inside the variant has a * different type then %NULL is returned. In the event that @dictionary * has a value type other than v then @expected_type * must directly match the key type and it is used to unpack the value * directly or an error occurs. * * In either case, if @key is not found in @dictionary, %NULL is * returned. * * If the key is found and the value has the correct type, it is * returned. If @expected_type was specified then any non-%NULL return * value will have this type. * * Returns: (transfer full): the value of the dictionary key, or %NULL * * Since: 2.28 */ GVariant * g_variant_lookup_value (GVariant *dictionary, const gchar *key, const GVariantType *expected_type) { GVariantIter iter; GVariant *entry; GVariant *value; g_return_val_if_fail (g_variant_is_of_type (dictionary, G_VARIANT_TYPE ("a{s*}")) || g_variant_is_of_type (dictionary, G_VARIANT_TYPE ("a{o*}")), NULL); g_variant_iter_init (&iter, dictionary); while ((entry = g_variant_iter_next_value (&iter))) { GVariant *entry_key; gboolean matches; entry_key = g_variant_get_child_value (entry, 0); matches = strcmp (g_variant_get_string (entry_key, NULL), key) == 0; g_variant_unref (entry_key); if (matches) break; g_variant_unref (entry); } if (entry == NULL) return NULL; value = g_variant_get_child_value (entry, 1); g_variant_unref (entry); if (g_variant_is_of_type (value, G_VARIANT_TYPE_VARIANT)) { GVariant *tmp; tmp = g_variant_get_variant (value); g_variant_unref (value); if (expected_type && !g_variant_is_of_type (tmp, expected_type)) { g_variant_unref (tmp); tmp = NULL; } value = tmp; } g_return_val_if_fail (expected_type == NULL || value == NULL || g_variant_is_of_type (value, expected_type), NULL); return value; } /** * g_variant_get_fixed_array: * @value: a #GVariant array with fixed-sized elements * @n_elements: (out): a pointer to the location to store the number of items * @element_size: the size of each element * * Provides access to the serialised data for an array of fixed-sized * items. * * @value must be an array with fixed-sized elements. Numeric types are * fixed-size, as are tuples containing only other fixed-sized types. * * @element_size must be the size of a single element in the array, * as given by the section on * Serialised Data * Memory. * * In particular, arrays of these fixed-sized types can be interpreted * as an array of the given C type, with @element_size set to * sizeof the appropriate type: * * * * element type C type * * %G_VARIANT_TYPE_INT16 (etc.) * #gint16 (etc.) * %G_VARIANT_TYPE_BOOLEAN * #guchar (not #gboolean!) * %G_VARIANT_TYPE_BYTE #guchar * %G_VARIANT_TYPE_HANDLE #guint32 * %G_VARIANT_TYPE_DOUBLE #gdouble * * * * * For example, if calling this function for an array of 32 bit integers, * you might say sizeof (gint32). This value isn't used * except for the purpose of a double-check that the form of the * serialised data matches the caller's expectation. * * @n_elements, which must be non-%NULL is set equal to the number of * items in the array. * * Returns: (array length=n_elements) (transfer none): a pointer to * the fixed array * * Since: 2.24 **/ gconstpointer g_variant_get_fixed_array (GVariant *value, gsize *n_elements, gsize element_size) { GVariantTypeInfo *array_info; gsize array_element_size; gconstpointer data; gsize size; TYPE_CHECK (value, G_VARIANT_TYPE_ARRAY, NULL); g_return_val_if_fail (n_elements != NULL, NULL); g_return_val_if_fail (element_size > 0, NULL); array_info = g_variant_get_type_info (value); g_variant_type_info_query_element (array_info, NULL, &array_element_size); g_return_val_if_fail (array_element_size, NULL); if G_UNLIKELY (array_element_size != element_size) { if (array_element_size) g_critical ("g_variant_get_fixed_array: assertion " "'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)' " "failed: array does not have fixed size."); } data = g_variant_get_data (value); size = g_variant_get_size (value); if (size % element_size) *n_elements = 0; else *n_elements = size / element_size; if (*n_elements) return data; return NULL; } /** * g_variant_new_fixed_array: * @element_type: the #GVariantType of each element * @elements: a pointer to the fixed array of contiguous elements * @n_elements: the number of elements * @element_size: the size of each element * * Provides access to the serialised data for an array of fixed-sized * items. * * @value must be an array with fixed-sized elements. Numeric types are * fixed-size as are tuples containing only other fixed-sized types. * * @element_size must be the size of a single element in the array. For * example, if calling this function for an array of 32 bit integers, * you might say sizeof (gint32). This value isn't used * except for the purpose of a double-check that the form of the * serialised data matches the caller's expectation. * * @n_elements, which must be non-%NULL is set equal to the number of * items in the array. * * Returns: (transfer none): a floating reference to a new array #GVariant instance * * Since: 2.32 **/ GVariant * g_variant_new_fixed_array (const GVariantType *element_type, gconstpointer elements, gsize n_elements, gsize element_size) { GVariantType *array_type; gsize array_element_size; GVariantTypeInfo *array_info; GVariant *value; gpointer data; g_return_val_if_fail (g_variant_type_is_definite (element_type), NULL); g_return_val_if_fail (element_size > 0, NULL); array_type = g_variant_type_new_array (element_type); array_info = g_variant_type_info_get (array_type); g_variant_type_info_query_element (array_info, NULL, &array_element_size); if G_UNLIKELY (array_element_size != element_size) { if (array_element_size) g_critical ("g_variant_new_fixed_array: 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: array does not have fixed size."); return NULL; } data = g_memdup (elements, n_elements * element_size); value = g_variant_new_from_data (array_type, data, n_elements * element_size, FALSE, g_free, data); g_variant_type_free (array_type); g_variant_type_info_unref (array_info); return value; } /* String type constructor/getters/validation {{{1 */ /** * g_variant_new_string: * @string: a normal utf8 nul-terminated string * * Creates a string #GVariant with the contents of @string. * * @string must be valid utf8. * * Returns: (transfer none): a floating reference to a new string #GVariant instance * * Since: 2.24 **/ GVariant * g_variant_new_string (const gchar *string) { g_return_val_if_fail (string != NULL, NULL); g_return_val_if_fail (g_utf8_validate (string, -1, NULL), NULL); return g_variant_new_from_trusted (G_VARIANT_TYPE_STRING, string, strlen (string) + 1); } /** * 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 * * Creates a D-Bus object path #GVariant with the contents of @string. * @string must be a valid D-Bus object path. Use * g_variant_is_object_path() if you're not sure. * * Returns: (transfer none): a floating reference to a new object path #GVariant instance * * Since: 2.24 **/ GVariant * g_variant_new_object_path (const gchar *object_path) { g_return_val_if_fail (g_variant_is_object_path (object_path), NULL); return g_variant_new_from_trusted (G_VARIANT_TYPE_OBJECT_PATH, object_path, strlen (object_path) + 1); } /** * g_variant_is_object_path: * @string: a normal C nul-terminated string * * Determines if a given string is a valid D-Bus object path. You * should ensure that a string is a valid D-Bus object path before * passing it to g_variant_new_object_path(). * * A valid object path starts with '/' followed by zero or more * sequences of characters separated by '/' characters. Each sequence * must contain only the characters "[A-Z][a-z][0-9]_". No sequence * (including the one following the final '/' character) may be empty. * * Returns: %TRUE if @string is a D-Bus object path * * Since: 2.24 **/ gboolean g_variant_is_object_path (const gchar *string) { g_return_val_if_fail (string != NULL, FALSE); return g_variant_serialiser_is_object_path (string, strlen (string) + 1); } /** * g_variant_new_signature: * @signature: a normal C nul-terminated string * * Creates a D-Bus type signature #GVariant with the contents of * @string. @string must be a valid D-Bus type signature. Use * g_variant_is_signature() if you're not sure. * * Returns: (transfer none): a floating reference to a new signature #GVariant instance * * Since: 2.24 **/ GVariant * g_variant_new_signature (const gchar *signature) { g_return_val_if_fail (g_variant_is_signature (signature), NULL); return g_variant_new_from_trusted (G_VARIANT_TYPE_SIGNATURE, signature, strlen (signature) + 1); } /** * g_variant_is_signature: * @string: a normal C nul-terminated string * * Determines if a given string is a valid D-Bus type signature. You * should ensure that a string is a valid D-Bus type signature before * passing it to g_variant_new_signature(). * * D-Bus type signatures consist of zero or more definite #GVariantType * strings in sequence. * * Returns: %TRUE if @string is a D-Bus type signature * * Since: 2.24 **/ gboolean g_variant_is_signature (const gchar *string) { g_return_val_if_fail (string != NULL, FALSE); return g_variant_serialiser_is_signature (string, strlen (string) + 1); } /** * g_variant_get_string: * @value: a string #GVariant instance * @length: (allow-none) (default 0) (out): a pointer to a #gsize, * to store the length * * Returns the string value of a #GVariant instance with a string * type. This includes the types %G_VARIANT_TYPE_STRING, * %G_VARIANT_TYPE_OBJECT_PATH and %G_VARIANT_TYPE_SIGNATURE. * * The string will always be utf8 encoded. * * If @length is non-%NULL then the length of the string (in bytes) is * returned there. For trusted values, this information is already * known. For untrusted values, a strlen() will be performed. * * It is an error to call this function with a @value of any type * other than those three. * * The return value remains valid as long as @value exists. * * Returns: (transfer none): the constant string, utf8 encoded * * Since: 2.24 **/ const gchar * g_variant_get_string (GVariant *value, gsize *length) { gconstpointer data; gsize size; g_return_val_if_fail (value != NULL, NULL); g_return_val_if_fail ( g_variant_is_of_type (value, G_VARIANT_TYPE_STRING) || g_variant_is_of_type (value, G_VARIANT_TYPE_OBJECT_PATH) || g_variant_is_of_type (value, G_VARIANT_TYPE_SIGNATURE), NULL); data = g_variant_get_data (value); size = g_variant_get_size (value); if (!g_variant_is_trusted (value)) { switch (g_variant_classify (value)) { case G_VARIANT_CLASS_STRING: if (g_variant_serialiser_is_string (data, size)) break; data = ""; size = 1; break; case G_VARIANT_CLASS_OBJECT_PATH: if (g_variant_serialiser_is_object_path (data, size)) break; data = "/"; size = 2; break; case G_VARIANT_CLASS_SIGNATURE: if (g_variant_serialiser_is_signature (data, size)) break; data = ""; size = 1; break; default: g_assert_not_reached (); } } if (length) *length = size - 1; return data; } /** * g_variant_dup_string: * @value: a string #GVariant instance * @length: (out): a pointer to a #gsize, to store the length * * Similar to g_variant_get_string() except that instead of returning * a constant string, the string is duplicated. * * The string will always be utf8 encoded. * * The return value must be freed using g_free(). * * Returns: (transfer full): a newly allocated string, utf8 encoded * * Since: 2.24 **/ gchar * g_variant_dup_string (GVariant *value, gsize *length) { return g_strdup (g_variant_get_string (value, length)); } /** * g_variant_new_strv: * @strv: (array length=length) (element-type utf8): an array of strings * @length: the length of @strv, or -1 * * Constructs an array of strings #GVariant from the given array of * strings. * * If @length is -1 then @strv is %NULL-terminated. * * Returns: (transfer none): a new floating #GVariant instance * * Since: 2.24 **/ GVariant * g_variant_new_strv (const gchar * const *strv, gssize length) { GVariant **strings; gsize i; g_return_val_if_fail (length == 0 || strv != NULL, NULL); if (length < 0) length = g_strv_length ((gchar **) strv); strings = g_new (GVariant *, length); for (i = 0; i < length; i++) strings[i] = g_variant_ref_sink (g_variant_new_string (strv[i])); return g_variant_new_from_children (G_VARIANT_TYPE_STRING_ARRAY, strings, length, TRUE); } /** * g_variant_get_strv: * @value: an array of strings #GVariant * @length: (out) (allow-none): the length of the result, or %NULL * * Gets the contents of an array of strings #GVariant. This call * makes a shallow copy; the return result should be released with * g_free(), but the individual strings must not be modified. * * If @length is non-%NULL then the number of elements in the result * is stored there. In any case, the resulting array will be * %NULL-terminated. * * For an empty array, @length will be set to 0 and a pointer to a * %NULL pointer will be returned. * * Returns: (array length=length zero-terminated=1) (transfer container): an array of constant strings * * Since: 2.24 **/ const gchar ** g_variant_get_strv (GVariant *value, gsize *length) { const gchar **strv; gsize n; gsize i; TYPE_CHECK (value, G_VARIANT_TYPE_STRING_ARRAY, NULL); g_variant_get_data (value); n = g_variant_n_children (value); strv = g_new (const gchar *, n + 1); for (i = 0; i < n; i++) { GVariant *string; string = g_variant_get_child_value (value, i); strv[i] = g_variant_get_string (string, NULL); g_variant_unref (string); } strv[i] = NULL; if (length) *length = n; return strv; } /** * g_variant_dup_strv: * @value: an array of strings #GVariant * @length: (out) (allow-none): the length of the result, or %NULL * * Gets the contents of an array of strings #GVariant. This call * makes a deep copy; the return result should be released with * g_strfreev(). * * If @length is non-%NULL then the number of elements in the result * is stored there. In any case, the resulting array will be * %NULL-terminated. * * For an empty array, @length will be set to 0 and a pointer to a * %NULL pointer will be returned. * * Returns: (array length=length zero-terminated=1) (transfer full): an array of strings * * Since: 2.24 **/ gchar ** g_variant_dup_strv (GVariant *value, gsize *length) { gchar **strv; gsize n; gsize i; TYPE_CHECK (value, G_VARIANT_TYPE_STRING_ARRAY, NULL); n = g_variant_n_children (value); strv = g_new (gchar *, n + 1); for (i = 0; i < n; i++) { GVariant *string; string = g_variant_get_child_value (value, i); strv[i] = g_variant_dup_string (string, NULL); g_variant_unref (string); } strv[i] = NULL; if (length) *length = n; return strv; } /** * g_variant_new_objv: * @strv: (array length=length) (element-type utf8): an array of strings * @length: the length of @strv, or -1 * * Constructs an array of object paths #GVariant from the given array of * strings. * * Each string must be a valid #GVariant object path; see * g_variant_is_object_path(). * * If @length is -1 then @strv is %NULL-terminated. * * Returns: (transfer none): a new floating #GVariant instance * * Since: 2.30 **/ GVariant * g_variant_new_objv (const gchar * const *strv, gssize length) { GVariant **strings; gsize i; g_return_val_if_fail (length == 0 || strv != NULL, NULL); if (length < 0) length = g_strv_length ((gchar **) strv); strings = g_new (GVariant *, length); for (i = 0; i < length; i++) strings[i] = g_variant_ref_sink (g_variant_new_object_path (strv[i])); return g_variant_new_from_children (G_VARIANT_TYPE_OBJECT_PATH_ARRAY, strings, length, TRUE); } /** * g_variant_get_objv: * @value: an array of object paths #GVariant * @length: (out) (allow-none): the length of the result, or %NULL * * Gets the contents of an array of object paths #GVariant. This call * makes a shallow copy; the return result should be released with * g_free(), but the individual strings must not be modified. * * If @length is non-%NULL then the number of elements in the result * is stored there. In any case, the resulting array will be * %NULL-terminated. * * For an empty array, @length will be set to 0 and a pointer to a * %NULL pointer will be returned. * * Returns: (array length=length zero-terminated=1) (transfer container): an array of constant strings * * Since: 2.30 **/ const gchar ** g_variant_get_objv (GVariant *value, gsize *length) { const gchar **strv; gsize n; gsize i; TYPE_CHECK (value, G_VARIANT_TYPE_OBJECT_PATH_ARRAY, NULL); g_variant_get_data (value); n = g_variant_n_children (value); strv = g_new (const gchar *, n + 1); for (i = 0; i < n; i++) { GVariant *string; string = g_variant_get_child_value (value, i); strv[i] = g_variant_get_string (string, NULL); g_variant_unref (string); } strv[i] = NULL; if (length) *length = n; return strv; } /** * g_variant_dup_objv: * @value: an array of object paths #GVariant * @length: (out) (allow-none): the length of the result, or %NULL * * Gets the contents of an array of object paths #GVariant. This call * makes a deep copy; the return result should be released with * g_strfreev(). * * If @length is non-%NULL then the number of elements in the result * is stored there. In any case, the resulting array will be * %NULL-terminated. * * For an empty array, @length will be set to 0 and a pointer to a * %NULL pointer will be returned. * * Returns: (array length=length zero-terminated=1) (transfer full): an array of strings * * Since: 2.30 **/ gchar ** g_variant_dup_objv (GVariant *value, gsize *length) { gchar **strv; gsize n; gsize i; TYPE_CHECK (value, G_VARIANT_TYPE_OBJECT_PATH_ARRAY, NULL); n = g_variant_n_children (value); strv = g_new (gchar *, n + 1); for (i = 0; i < n; i++) { GVariant *string; string = g_variant_get_child_value (value, i); strv[i] = g_variant_dup_string (string, NULL); g_variant_unref (string); } strv[i] = NULL; if (length) *length = n; return strv; } /** * g_variant_new_bytestring: * @string: (array zero-terminated=1) (element-type guint8): a normal * nul-terminated string in no particular encoding * * Creates an array-of-bytes #GVariant with the contents of @string. * This function is just like g_variant_new_string() except that the * string need not be valid utf8. * * The nul terminator character at the end of the string is stored in * the array. * * Returns: (transfer none): a floating reference to a new bytestring #GVariant instance * * Since: 2.26 **/ GVariant * g_variant_new_bytestring (const gchar *string) { g_return_val_if_fail (string != NULL, NULL); return g_variant_new_from_trusted (G_VARIANT_TYPE_BYTESTRING, string, strlen (string) + 1); } /** * g_variant_get_bytestring: * @value: an array-of-bytes #GVariant instance * * Returns the string value of a #GVariant instance with an * array-of-bytes type. The string has no particular encoding. * * If the array does not end with a nul terminator character, the empty * string is returned. For this reason, you can always trust that a * non-%NULL nul-terminated string will be returned by this function. * * If the array contains a nul terminator character somewhere other than * the last byte then the returned string is the string, up to the first * such nul character. * * It is an error to call this function with a @value that is not an * array of bytes. * * The return value remains valid as long as @value exists. * * Returns: (transfer none) (array zero-terminated=1) (element-type guint8): * the constant string * * Since: 2.26 **/ const gchar * g_variant_get_bytestring (GVariant *value) { const gchar *string; gsize size; TYPE_CHECK (value, G_VARIANT_TYPE_BYTESTRING, NULL); /* Won't be NULL since this is an array type */ string = g_variant_get_data (value); size = g_variant_get_size (value); if (size && string[size - 1] == '\0') return string; else return ""; } /** * g_variant_dup_bytestring: * @value: an array-of-bytes #GVariant instance * @length: (out) (allow-none) (default NULL): a pointer to a #gsize, to store * the length (not including the nul terminator) * * Similar to g_variant_get_bytestring() except that instead of * returning a constant string, the string is duplicated. * * The return value must be freed using g_free(). * * Returns: (transfer full) (array zero-terminated=1 length=length) (element-type guint8): * a newly allocated string * * Since: 2.26 **/ gchar * g_variant_dup_bytestring (GVariant *value, gsize *length) { const gchar *original = g_variant_get_bytestring (value); gsize size; /* don't crash in case get_bytestring() had an assert failure */ if (original == NULL) return NULL; size = strlen (original); if (length) *length = size; return g_memdup (original, size + 1); } /** * g_variant_new_bytestring_array: * @strv: (array length=length): an array of strings * @length: the length of @strv, or -1 * * Constructs an array of bytestring #GVariant from the given array of * strings. * * If @length is -1 then @strv is %NULL-terminated. * * Returns: (transfer none): a new floating #GVariant instance * * Since: 2.26 **/ GVariant * g_variant_new_bytestring_array (const gchar * const *strv, gssize length) { GVariant **strings; gsize i; g_return_val_if_fail (length == 0 || strv != NULL, NULL); if (length < 0) length = g_strv_length ((gchar **) strv); strings = g_new (GVariant *, length); for (i = 0; i < length; i++) strings[i] = g_variant_ref_sink (g_variant_new_bytestring (strv[i])); return g_variant_new_from_children (G_VARIANT_TYPE_BYTESTRING_ARRAY, strings, length, TRUE); } /** * g_variant_get_bytestring_array: * @value: an array of array of bytes #GVariant ('aay') * @length: (out) (allow-none): the length of the result, or %NULL * * Gets the contents of an array of array of bytes #GVariant. This call * makes a shallow copy; the return result should be released with * g_free(), but the individual strings must not be modified. * * If @length is non-%NULL then the number of elements in the result is * stored there. In any case, the resulting array will be * %NULL-terminated. * * For an empty array, @length will be set to 0 and a pointer to a * %NULL pointer will be returned. * * Returns: (array length=length) (transfer container): an array of constant strings * * Since: 2.26 **/ const gchar ** g_variant_get_bytestring_array (GVariant *value, gsize *length) { const gchar **strv; gsize n; gsize i; TYPE_CHECK (value, G_VARIANT_TYPE_BYTESTRING_ARRAY, NULL); g_variant_get_data (value); n = g_variant_n_children (value); strv = g_new (const gchar *, n + 1); for (i = 0; i < n; i++) { GVariant *string; string = g_variant_get_child_value (value, i); strv[i] = g_variant_get_bytestring (string); g_variant_unref (string); } strv[i] = NULL; if (length) *length = n; return strv; } /** * g_variant_dup_bytestring_array: * @value: an array of array of bytes #GVariant ('aay') * @length: (out) (allow-none): the length of the result, or %NULL * * Gets the contents of an array of array of bytes #GVariant. This call * makes a deep copy; the return result should be released with * g_strfreev(). * * If @length is non-%NULL then the number of elements in the result is * stored there. In any case, the resulting array will be * %NULL-terminated. * * For an empty array, @length will be set to 0 and a pointer to a * %NULL pointer will be returned. * * Returns: (array length=length) (transfer full): an array of strings * * Since: 2.26 **/ gchar ** g_variant_dup_bytestring_array (GVariant *value, gsize *length) { gchar **strv; gsize n; gsize i; TYPE_CHECK (value, G_VARIANT_TYPE_BYTESTRING_ARRAY, NULL); g_variant_get_data (value); n = g_variant_n_children (value); strv = g_new (gchar *, n + 1); for (i = 0; i < n; i++) { GVariant *string; string = g_variant_get_child_value (value, i); strv[i] = g_variant_dup_bytestring (string, NULL); g_variant_unref (string); } strv[i] = NULL; if (length) *length = n; return strv; } /* Type checking and querying {{{1 */ /** * g_variant_get_type: * @value: a #GVariant * * Determines the type of @value. * * The return value is valid for the lifetime of @value and must not * be freed. * * Returns: a #GVariantType * * Since: 2.24 **/ const GVariantType * g_variant_get_type (GVariant *value) { GVariantTypeInfo *type_info; g_return_val_if_fail (value != NULL, NULL); type_info = g_variant_get_type_info (value); return (GVariantType *) g_variant_type_info_get_type_string (type_info); } /** * g_variant_get_type_string: * @value: a #GVariant * * Returns the type string of @value. Unlike the result of calling * g_variant_type_peek_string(), this string is nul-terminated. This * string belongs to #GVariant and must not be freed. * * Returns: the type string for the type of @value * * Since: 2.24 **/ const gchar * g_variant_get_type_string (GVariant *value) { GVariantTypeInfo *type_info; g_return_val_if_fail (value != NULL, NULL); type_info = g_variant_get_type_info (value); return g_variant_type_info_get_type_string (type_info); } /** * g_variant_is_of_type: * @value: a #GVariant instance * @type: a #GVariantType * * Checks if a value has a type matching the provided type. * * Returns: %TRUE if the type of @value matches @type * * Since: 2.24 **/ gboolean g_variant_is_of_type (GVariant *value, const GVariantType *type) { return g_variant_type_is_subtype_of (g_variant_get_type (value), type); } /** * g_variant_is_container: * @value: a #GVariant instance * * Checks if @value is a container. * * Returns: %TRUE if @value is a container * * Since: 2.24 */ gboolean g_variant_is_container (GVariant *value) { return g_variant_type_is_container (g_variant_get_type (value)); } /** * g_variant_classify: * @value: a #GVariant * * Classifies @value according to its top-level type. * * Returns: the #GVariantClass of @value * * Since: 2.24 **/ /** * GVariantClass: * @G_VARIANT_CLASS_BOOLEAN: The #GVariant is a boolean. * @G_VARIANT_CLASS_BYTE: The #GVariant is a byte. * @G_VARIANT_CLASS_INT16: The #GVariant is a signed 16 bit integer. * @G_VARIANT_CLASS_UINT16: The #GVariant is an unsigned 16 bit integer. * @G_VARIANT_CLASS_INT32: The #GVariant is a signed 32 bit integer. * @G_VARIANT_CLASS_UINT32: The #GVariant is an unsigned 32 bit integer. * @G_VARIANT_CLASS_INT64: The #GVariant is a signed 64 bit integer. * @G_VARIANT_CLASS_UINT64: The #GVariant is an unsigned 64 bit integer. * @G_VARIANT_CLASS_HANDLE: The #GVariant is a file handle index. * @G_VARIANT_CLASS_DOUBLE: The #GVariant is a double precision floating * point value. * @G_VARIANT_CLASS_STRING: The #GVariant is a normal string. * @G_VARIANT_CLASS_OBJECT_PATH: The #GVariant is a D-Bus object path * string. * @G_VARIANT_CLASS_SIGNATURE: The #GVariant is a D-Bus signature string. * @G_VARIANT_CLASS_VARIANT: The #GVariant is a variant. * @G_VARIANT_CLASS_MAYBE: The #GVariant is a maybe-typed value. * @G_VARIANT_CLASS_ARRAY: The #GVariant is an array. * @G_VARIANT_CLASS_TUPLE: The #GVariant is a tuple. * @G_VARIANT_CLASS_DICT_ENTRY: The #GVariant is a dictionary entry. * * The range of possible top-level types of #GVariant instances. * * Since: 2.24 **/ GVariantClass g_variant_classify (GVariant *value) { g_return_val_if_fail (value != NULL, 0); return *g_variant_get_type_string (value); } /* Pretty printer {{{1 */ /* This function is not introspectable because if @string is NULL, @returns is (transfer full), otherwise it is (transfer none), which is not supported by GObjectIntrospection */ /** * g_variant_print_string: (skip) * @value: a #GVariant * @string: (allow-none) (default NULL): a #GString, or %NULL * @type_annotate: %TRUE if type information should be included in * the output * * Behaves as g_variant_print(), but operates on a #GString. * * If @string is non-%NULL then it is appended to and returned. Else, * a new empty #GString is allocated and it is returned. * * Returns: a #GString containing the string * * Since: 2.24 **/ GString * g_variant_print_string (GVariant *value, GString *string, gboolean type_annotate) { if G_UNLIKELY (string == NULL) string = g_string_new (NULL); switch (g_variant_classify (value)) { case G_VARIANT_CLASS_MAYBE: if (type_annotate) g_string_append_printf (string, "@%s ", g_variant_get_type_string (value)); if (g_variant_n_children (value)) { gchar *printed_child; GVariant *element; /* Nested maybes: * * Consider the case of the type "mmi". In this case we could * write "just just 4", but "4" alone is totally unambiguous, * so we try to drop "just" where possible. * * We have to be careful not to always drop "just", though, * since "nothing" needs to be distinguishable from "just * nothing". The case where we need to ensure we keep the * "just" is actually exactly the case where we have a nested * Nothing. * * Instead of searching for that nested Nothing, we just print * the contained value into a separate string and see if we * end up with "nothing" at the end of it. If so, we need to * add "just" at our level. */ element = g_variant_get_child_value (value, 0); printed_child = g_variant_print (element, FALSE); g_variant_unref (element); if (g_str_has_suffix (printed_child, "nothing")) g_string_append (string, "just "); g_string_append (string, printed_child); g_free (printed_child); } else g_string_append (string, "nothing"); break; case G_VARIANT_CLASS_ARRAY: /* it's an array so the first character of the type string is 'a' * * if the first two characters are 'ay' then it's a bytestring. * under certain conditions we print those as strings. */ if (g_variant_get_type_string (value)[1] == 'y') { const gchar *str; gsize size; gsize i; /* first determine if it is a byte string. * that's when there's a single nul character: at the end. */ str = g_variant_get_data (value); size = g_variant_get_size (value); for (i = 0; i < size; i++) if (str[i] == '\0') break; /* first nul byte is the last byte -> it's a byte string. */ if (i == size - 1) { gchar *escaped = g_strescape (str, NULL); /* use double quotes only if a ' is in the string */ if (strchr (str, '\'')) g_string_append_printf (string, "b\"%s\"", escaped); else g_string_append_printf (string, "b'%s'", escaped); g_free (escaped); break; } else /* fall through and handle normally... */; } /* * if the first two characters are 'a{' then it's an array of * dictionary entries (ie: a dictionary) so we print that * differently. */ if (g_variant_get_type_string (value)[1] == '{') /* dictionary */ { const gchar *comma = ""; gsize n, i; if ((n = g_variant_n_children (value)) == 0) { if (type_annotate) g_string_append_printf (string, "@%s ", g_variant_get_type_string (value)); g_string_append (string, "{}"); break; } g_string_append_c (string, '{'); for (i = 0; i < n; i++) { GVariant *entry, *key, *val; g_string_append (string, comma); comma = ", "; entry = g_variant_get_child_value (value, i); key = g_variant_get_child_value (entry, 0); val = g_variant_get_child_value (entry, 1); g_variant_unref (entry); g_variant_print_string (key, string, type_annotate); g_variant_unref (key); g_string_append (string, ": "); g_variant_print_string (val, string, type_annotate); g_variant_unref (val); type_annotate = FALSE; } g_string_append_c (string, '}'); } else /* normal (non-dictionary) array */ { const gchar *comma = ""; gsize n, i; if ((n = g_variant_n_children (value)) == 0) { if (type_annotate) g_string_append_printf (string, "@%s ", g_variant_get_type_string (value)); g_string_append (string, "[]"); break; } g_string_append_c (string, '['); for (i = 0; i < n; i++) { GVariant *element; g_string_append (string, comma); comma = ", "; element = g_variant_get_child_value (value, i); g_variant_print_string (element, string, type_annotate); g_variant_unref (element); type_annotate = FALSE; } g_string_append_c (string, ']'); } break; case G_VARIANT_CLASS_TUPLE: { gsize n, i; n = g_variant_n_children (value); g_string_append_c (string, '('); for (i = 0; i < n; i++) { GVariant *element; element = g_variant_get_child_value (value, i); g_variant_print_string (element, string, type_annotate); g_string_append (string, ", "); g_variant_unref (element); } /* for >1 item: remove final ", " * for 1 item: remove final " ", but leave the "," * for 0 items: there is only "(", so remove nothing */ g_string_truncate (string, string->len - (n > 0) - (n > 1)); g_string_append_c (string, ')'); } break; case G_VARIANT_CLASS_DICT_ENTRY: { GVariant *element; g_string_append_c (string, '{'); element = g_variant_get_child_value (value, 0); g_variant_print_string (element, string, type_annotate); g_variant_unref (element); g_string_append (string, ", "); element = g_variant_get_child_value (value, 1); g_variant_print_string (element, string, type_annotate); g_variant_unref (element); g_string_append_c (string, '}'); } break; case G_VARIANT_CLASS_VARIANT: { GVariant *child = g_variant_get_variant (value); /* Always annotate types in nested variants, because they are * (by nature) of variable type. */ g_string_append_c (string, '<'); g_variant_print_string (child, string, TRUE); g_string_append_c (string, '>'); g_variant_unref (child); } break; case G_VARIANT_CLASS_BOOLEAN: if (g_variant_get_boolean (value)) g_string_append (string, "true"); else g_string_append (string, "false"); break; case G_VARIANT_CLASS_STRING: { const gchar *str = g_variant_get_string (value, NULL); gunichar quote = strchr (str, '\'') ? '"' : '\''; g_string_append_c (string, quote); while (*str) { gunichar c = g_utf8_get_char (str); if (c == quote || c == '\\') g_string_append_c (string, '\\'); if (g_unichar_isprint (c)) g_string_append_unichar (string, c); else { g_string_append_c (string, '\\'); if (c < 0x10000) switch (c) { case '\a': g_string_append_c (string, 'a'); break; case '\b': g_string_append_c (string, 'b'); break; case '\f': g_string_append_c (string, 'f'); break; case '\n': g_string_append_c (string, 'n'); break; case '\r': g_string_append_c (string, 'r'); break; case '\t': g_string_append_c (string, 't'); break; case '\v': g_string_append_c (string, 'v'); break; default: g_string_append_printf (string, "u%04x", c); break; } else g_string_append_printf (string, "U%08x", c); } str = g_utf8_next_char (str); } g_string_append_c (string, quote); } break; case G_VARIANT_CLASS_BYTE: if (type_annotate) g_string_append (string, "byte "); g_string_append_printf (string, "0x%02x", g_variant_get_byte (value)); break; case G_VARIANT_CLASS_INT16: if (type_annotate) g_string_append (string, "int16 "); g_string_append_printf (string, "%"G_GINT16_FORMAT, g_variant_get_int16 (value)); break; case G_VARIANT_CLASS_UINT16: if (type_annotate) g_string_append (string, "uint16 "); g_string_append_printf (string, "%"G_GUINT16_FORMAT, g_variant_get_uint16 (value)); break; case G_VARIANT_CLASS_INT32: /* Never annotate this type because it is the default for numbers * (and this is a *pretty* printer) */ g_string_append_printf (string, "%"G_GINT32_FORMAT, g_variant_get_int32 (value)); break; case G_VARIANT_CLASS_HANDLE: if (type_annotate) g_string_append (string, "handle "); g_string_append_printf (string, "%"G_GINT32_FORMAT, g_variant_get_handle (value)); break; case G_VARIANT_CLASS_UINT32: if (type_annotate) g_string_append (string, "uint32 "); g_string_append_printf (string, "%"G_GUINT32_FORMAT, g_variant_get_uint32 (value)); break; case G_VARIANT_CLASS_INT64: if (type_annotate) g_string_append (string, "int64 "); g_string_append_printf (string, "%"G_GINT64_FORMAT, g_variant_get_int64 (value)); break; case G_VARIANT_CLASS_UINT64: if (type_annotate) g_string_append (string, "uint64 "); g_string_append_printf (string, "%"G_GUINT64_FORMAT, g_variant_get_uint64 (value)); break; case G_VARIANT_CLASS_DOUBLE: { gchar buffer[100]; gint i; g_ascii_dtostr (buffer, sizeof buffer, g_variant_get_double (value)); for (i = 0; buffer[i]; i++) if (buffer[i] == '.' || buffer[i] == 'e' || buffer[i] == 'n' || buffer[i] == 'N') break; /* if there is no '.' or 'e' in the float then add one */ if (buffer[i] == '\0') { buffer[i++] = '.'; buffer[i++] = '0'; buffer[i++] = '\0'; } g_string_append (string, buffer); } break; case G_VARIANT_CLASS_OBJECT_PATH: if (type_annotate) g_string_append (string, "objectpath "); g_string_append_printf (string, "\'%s\'", g_variant_get_string (value, NULL)); break; case G_VARIANT_CLASS_SIGNATURE: if (type_annotate) g_string_append (string, "signature "); g_string_append_printf (string, "\'%s\'", g_variant_get_string (value, NULL)); break; default: g_assert_not_reached (); } return string; } /** * g_variant_print: * @value: a #GVariant * @type_annotate: %TRUE if type information should be included in * the output * * Pretty-prints @value in the format understood by g_variant_parse(). * * The format is described here. * * If @type_annotate is %TRUE, then type information is included in * the output. * * Returns: (transfer full): a newly-allocated string holding the result. * * Since: 2.24 */ gchar * g_variant_print (GVariant *value, gboolean type_annotate) { return g_string_free (g_variant_print_string (value, NULL, type_annotate), FALSE); }; /* Hash, Equal, Compare {{{1 */ /** * g_variant_hash: * @value: (type GVariant): a basic #GVariant value as a #gconstpointer * * Generates a hash value for a #GVariant instance. * * The output of this function is guaranteed to be the same for a given * value only per-process. It may change between different processor * architectures or even different versions of GLib. Do not use this * function as a basis for building protocols or file formats. * * The type of @value is #gconstpointer only to allow use of this * function with #GHashTable. @value must be a #GVariant. * * Returns: a hash value corresponding to @value * * Since: 2.24 **/ guint g_variant_hash (gconstpointer value_) { GVariant *value = (GVariant *) value_; switch (g_variant_classify (value)) { case G_VARIANT_CLASS_STRING: case G_VARIANT_CLASS_OBJECT_PATH: case G_VARIANT_CLASS_SIGNATURE: return g_str_hash (g_variant_get_string (value, NULL)); case G_VARIANT_CLASS_BOOLEAN: /* this is a very odd thing to hash... */ return g_variant_get_boolean (value); case G_VARIANT_CLASS_BYTE: return g_variant_get_byte (value); case G_VARIANT_CLASS_INT16: case G_VARIANT_CLASS_UINT16: { const guint16 *ptr; ptr = g_variant_get_data (value); if (ptr) return *ptr; else return 0; } case G_VARIANT_CLASS_INT32: case G_VARIANT_CLASS_UINT32: case G_VARIANT_CLASS_HANDLE: { const guint *ptr; ptr = g_variant_get_data (value); if (ptr) return *ptr; else return 0; } case G_VARIANT_CLASS_INT64: case G_VARIANT_CLASS_UINT64: case G_VARIANT_CLASS_DOUBLE: /* need a separate case for these guys because otherwise * performance could be quite bad on big endian systems */ { const guint *ptr; ptr = g_variant_get_data (value); if (ptr) return ptr[0] + ptr[1]; else return 0; } default: g_return_val_if_fail (!g_variant_is_container (value), 0); g_assert_not_reached (); } } /** * g_variant_equal: * @one: (type GVariant): a #GVariant instance * @two: (type GVariant): a #GVariant instance * * Checks if @one and @two have the same type and value. * * The types of @one and @two are #gconstpointer only to allow use of * this function with #GHashTable. They must each be a #GVariant. * * Returns: %TRUE if @one and @two are equal * * Since: 2.24 **/ gboolean g_variant_equal (gconstpointer one, gconstpointer two) { gboolean equal; g_return_val_if_fail (one != NULL && two != NULL, FALSE); if (g_variant_get_type_info ((GVariant *) one) != g_variant_get_type_info ((GVariant *) two)) return FALSE; /* if both values are trusted to be in their canonical serialised form * then a simple memcmp() of their serialised data will answer the * question. * * if not, then this might generate a false negative (since it is * possible for two different byte sequences to represent the same * value). for now we solve this by pretty-printing both values and * comparing the result. */ if (g_variant_is_trusted ((GVariant *) one) && g_variant_is_trusted ((GVariant *) two)) { gconstpointer data_one, data_two; gsize size_one, size_two; size_one = g_variant_get_size ((GVariant *) one); size_two = g_variant_get_size ((GVariant *) two); if (size_one != size_two) return FALSE; data_one = g_variant_get_data ((GVariant *) one); data_two = g_variant_get_data ((GVariant *) two); equal = memcmp (data_one, data_two, size_one) == 0; } else { gchar *strone, *strtwo; strone = g_variant_print ((GVariant *) one, FALSE); strtwo = g_variant_print ((GVariant *) two, FALSE); equal = strcmp (strone, strtwo) == 0; g_free (strone); g_free (strtwo); } return equal; } /** * g_variant_compare: * @one: (type GVariant): a basic-typed #GVariant instance * @two: (type GVariant): a #GVariant instance of the same type * * Compares @one and @two. * * The types of @one and @two are #gconstpointer only to allow use of * this function with #GTree, #GPtrArray, etc. They must each be a * #GVariant. * * Comparison is only defined for basic types (ie: booleans, numbers, * strings). For booleans, %FALSE is less than %TRUE. Numbers are * ordered in the usual way. Strings are in ASCII lexographical order. * * It is a programmer error to attempt to compare container values or * two values that have types that are not exactly equal. For example, * you cannot compare a 32-bit signed integer with a 32-bit unsigned * integer. Also note that this function is not particularly * well-behaved when it comes to comparison of doubles; in particular, * the handling of incomparable values (ie: NaN) is undefined. * * If you only require an equality comparison, g_variant_equal() is more * general. * * Returns: negative value if a < b; * zero if a = b; * positive value if a > b. * * Since: 2.26 **/ gint g_variant_compare (gconstpointer one, gconstpointer two) { GVariant *a = (GVariant *) one; GVariant *b = (GVariant *) two; g_return_val_if_fail (g_variant_classify (a) == g_variant_classify (b), 0); switch (g_variant_classify (a)) { case G_VARIANT_CLASS_BOOLEAN: return g_variant_get_boolean (a) - g_variant_get_boolean (b); case G_VARIANT_CLASS_BYTE: return ((gint) g_variant_get_byte (a)) - ((gint) g_variant_get_byte (b)); case G_VARIANT_CLASS_INT16: return ((gint) g_variant_get_int16 (a)) - ((gint) g_variant_get_int16 (b)); case G_VARIANT_CLASS_UINT16: return ((gint) g_variant_get_uint16 (a)) - ((gint) g_variant_get_uint16 (b)); case G_VARIANT_CLASS_INT32: { gint32 a_val = g_variant_get_int32 (a); gint32 b_val = g_variant_get_int32 (b); return (a_val == b_val) ? 0 : (a_val > b_val) ? 1 : -1; } case G_VARIANT_CLASS_UINT32: { guint32 a_val = g_variant_get_uint32 (a); guint32 b_val = g_variant_get_uint32 (b); return (a_val == b_val) ? 0 : (a_val > b_val) ? 1 : -1; } case G_VARIANT_CLASS_INT64: { gint64 a_val = g_variant_get_int64 (a); gint64 b_val = g_variant_get_int64 (b); return (a_val == b_val) ? 0 : (a_val > b_val) ? 1 : -1; } case G_VARIANT_CLASS_UINT64: { guint64 a_val = g_variant_get_uint64 (a); guint64 b_val = g_variant_get_uint64 (b); return (a_val == b_val) ? 0 : (a_val > b_val) ? 1 : -1; } case G_VARIANT_CLASS_DOUBLE: { gdouble a_val = g_variant_get_double (a); gdouble b_val = g_variant_get_double (b); return (a_val == b_val) ? 0 : (a_val > b_val) ? 1 : -1; } case G_VARIANT_CLASS_STRING: case G_VARIANT_CLASS_OBJECT_PATH: case G_VARIANT_CLASS_SIGNATURE: return strcmp (g_variant_get_string (a, NULL), g_variant_get_string (b, NULL)); default: g_return_val_if_fail (!g_variant_is_container (a), 0); g_assert_not_reached (); } } /* GVariantIter {{{1 */ /** * GVariantIter: (skip) * * #GVariantIter is an opaque data structure and can only be accessed * using the following functions. **/ struct stack_iter { GVariant *value; gssize n, i; const gchar *loop_format; gsize padding[3]; gsize magic; }; G_STATIC_ASSERT (sizeof (struct stack_iter) <= sizeof (GVariantIter)); struct heap_iter { struct stack_iter iter; GVariant *value_ref; gsize magic; }; #define GVSI(i) ((struct stack_iter *) (i)) #define GVHI(i) ((struct heap_iter *) (i)) #define GVSI_MAGIC ((gsize) 3579507750u) #define GVHI_MAGIC ((gsize) 1450270775u) #define is_valid_iter(i) (i != NULL && \ GVSI(i)->magic == GVSI_MAGIC) #define is_valid_heap_iter(i) (GVHI(i)->magic == GVHI_MAGIC && \ is_valid_iter(i)) /** * g_variant_iter_new: * @value: a container #GVariant * * Creates a heap-allocated #GVariantIter for iterating over the items * in @value. * * Use g_variant_iter_free() to free the return value when you no longer * need it. * * A reference is taken to @value and will be released only when * g_variant_iter_free() is called. * * Returns: (transfer full): a new heap-allocated #GVariantIter * * Since: 2.24 **/ GVariantIter * g_variant_iter_new (GVariant *value) { GVariantIter *iter; iter = (GVariantIter *) g_slice_new (struct heap_iter); GVHI(iter)->value_ref = g_variant_ref (value); GVHI(iter)->magic = GVHI_MAGIC; g_variant_iter_init (iter, value); return iter; } /** * g_variant_iter_init: (skip) * @iter: a pointer to a #GVariantIter * @value: a container #GVariant * * Initialises (without allocating) a #GVariantIter. @iter may be * completely uninitialised prior to this call; its old value is * ignored. * * The iterator remains valid for as long as @value exists, and need not * be freed in any way. * * Returns: the number of items in @value * * Since: 2.24 **/ gsize g_variant_iter_init (GVariantIter *iter, GVariant *value) { GVSI(iter)->magic = GVSI_MAGIC; GVSI(iter)->value = value; GVSI(iter)->n = g_variant_n_children (value); GVSI(iter)->i = -1; GVSI(iter)->loop_format = NULL; return GVSI(iter)->n; } /** * g_variant_iter_copy: * @iter: a #GVariantIter * * Creates a new heap-allocated #GVariantIter to iterate over the * container that was being iterated over by @iter. Iteration begins on * the new iterator from the current position of the old iterator but * the two copies are independent past that point. * * Use g_variant_iter_free() to free the return value when you no longer * need it. * * A reference is taken to the container that @iter is iterating over * and will be releated only when g_variant_iter_free() is called. * * Returns: (transfer full): a new heap-allocated #GVariantIter * * Since: 2.24 **/ GVariantIter * g_variant_iter_copy (GVariantIter *iter) { GVariantIter *copy; g_return_val_if_fail (is_valid_iter (iter), 0); copy = g_variant_iter_new (GVSI(iter)->value); GVSI(copy)->i = GVSI(iter)->i; return copy; } /** * g_variant_iter_n_children: * @iter: a #GVariantIter * * Queries the number of child items in the container that we are * iterating over. This is the total number of items -- not the number * of items remaining. * * This function might be useful for preallocation of arrays. * * Returns: the number of children in the container * * Since: 2.24 **/ gsize g_variant_iter_n_children (GVariantIter *iter) { g_return_val_if_fail (is_valid_iter (iter), 0); return GVSI(iter)->n; } /** * g_variant_iter_free: * @iter: (transfer full): a heap-allocated #GVariantIter * * Frees a heap-allocated #GVariantIter. Only call this function on * iterators that were returned by g_variant_iter_new() or * g_variant_iter_copy(). * * Since: 2.24 **/ void g_variant_iter_free (GVariantIter *iter) { g_return_if_fail (is_valid_heap_iter (iter)); g_variant_unref (GVHI(iter)->value_ref); GVHI(iter)->magic = 0; g_slice_free (struct heap_iter, GVHI(iter)); } /** * g_variant_iter_next_value: * @iter: a #GVariantIter * * Gets the next item in the container. If no more items remain then * %NULL is returned. * * Use g_variant_unref() to drop your reference on the return value when * you no longer need it. * * * Iterating with g_variant_iter_next_value() * * /* recursively iterate a container */ * void * iterate_container_recursive (GVariant *container) * { * GVariantIter iter; * GVariant *child; * * g_variant_iter_init (&iter, container); * while ((child = g_variant_iter_next_value (&iter))) * { * g_print ("type '%s'\n", g_variant_get_type_string (child)); * * if (g_variant_is_container (child)) * iterate_container_recursive (child); * * g_variant_unref (child); * } * } * * * * Returns: (allow-none) (transfer full): a #GVariant, or %NULL * * Since: 2.24 **/ GVariant * g_variant_iter_next_value (GVariantIter *iter) { g_return_val_if_fail (is_valid_iter (iter), FALSE); if G_UNLIKELY (GVSI(iter)->i >= GVSI(iter)->n) { g_critical ("g_variant_iter_next_value: must not be called again " "after NULL has already been returned."); return NULL; } GVSI(iter)->i++; if (GVSI(iter)->i < GVSI(iter)->n) return g_variant_get_child_value (GVSI(iter)->value, GVSI(iter)->i); return NULL; } /* GVariantBuilder {{{1 */ /** * GVariantBuilder: * * A utility type for constructing container-type #GVariant instances. * * This is an opaque structure and may only be accessed using the * following functions. * * #GVariantBuilder is not threadsafe in any way. Do not attempt to * access it from more than one thread. **/ struct stack_builder { GVariantBuilder *parent; GVariantType *type; /* type constraint explicitly specified by 'type'. * for tuple types, this moves along as we add more items. */ const GVariantType *expected_type; /* type constraint implied by previous array item. */ const GVariantType *prev_item_type; /* constraints on the number of children. max = -1 for unlimited. */ gsize min_items; gsize max_items; /* dynamically-growing pointer array */ GVariant **children; gsize allocated_children; gsize offset; /* set to '1' if all items in the container will have the same type * (ie: maybe, array, variant) '0' if not (ie: tuple, dict entry) */ guint uniform_item_types : 1; /* set to '1' initially and changed to '0' if an untrusted value is * added */ guint trusted : 1; gsize magic; }; G_STATIC_ASSERT (sizeof (struct stack_builder) <= sizeof (GVariantBuilder)); struct heap_builder { GVariantBuilder builder; gsize magic; gint ref_count; }; #define GVSB(b) ((struct stack_builder *) (b)) #define GVHB(b) ((struct heap_builder *) (b)) #define GVSB_MAGIC ((gsize) 1033660112u) #define GVHB_MAGIC ((gsize) 3087242682u) #define is_valid_builder(b) (b != NULL && \ GVSB(b)->magic == GVSB_MAGIC) #define is_valid_heap_builder(b) (GVHB(b)->magic == GVHB_MAGIC) /** * g_variant_builder_new: * @type: a container type * * Allocates and initialises a new #GVariantBuilder. * * You should call g_variant_builder_unref() on the return value when it * is no longer needed. The memory will not be automatically freed by * any other call. * * In most cases it is easier to place a #GVariantBuilder directly on * the stack of the calling function and initialise it with * g_variant_builder_init(). * * Returns: (transfer full): a #GVariantBuilder * * Since: 2.24 **/ GVariantBuilder * g_variant_builder_new (const GVariantType *type) { GVariantBuilder *builder; builder = (GVariantBuilder *) g_slice_new (struct heap_builder); g_variant_builder_init (builder, type); GVHB(builder)->magic = GVHB_MAGIC; GVHB(builder)->ref_count = 1; return builder; } /** * g_variant_builder_unref: * @builder: (transfer full): a #GVariantBuilder allocated by g_variant_builder_new() * * Decreases the reference count on @builder. * * In the event that there are no more references, releases all memory * associated with the #GVariantBuilder. * * Don't call this on stack-allocated #GVariantBuilder instances or bad * things will happen. * * Since: 2.24 **/ void g_variant_builder_unref (GVariantBuilder *builder) { g_return_if_fail (is_valid_heap_builder (builder)); if (--GVHB(builder)->ref_count) return; g_variant_builder_clear (builder); GVHB(builder)->magic = 0; g_slice_free (struct heap_builder, GVHB(builder)); } /** * g_variant_builder_ref: * @builder: a #GVariantBuilder allocated by g_variant_builder_new() * * Increases the reference count on @builder. * * Don't call this on stack-allocated #GVariantBuilder instances or bad * things will happen. * * Returns: (transfer full): a new reference to @builder * * Since: 2.24 **/ GVariantBuilder * g_variant_builder_ref (GVariantBuilder *builder) { g_return_val_if_fail (is_valid_heap_builder (builder), NULL); GVHB(builder)->ref_count++; return builder; } /** * g_variant_builder_clear: (skip) * @builder: a #GVariantBuilder * * Releases all memory associated with a #GVariantBuilder without * freeing the #GVariantBuilder structure itself. * * It typically only makes sense to do this on a stack-allocated * #GVariantBuilder if you want to abort building the value part-way * through. This function need not be called if you call * g_variant_builder_end() and it also doesn't need to be called on * builders allocated with g_variant_builder_new (see * g_variant_builder_unref() for that). * * This function leaves the #GVariantBuilder structure set to all-zeros. * It is valid to call this function on either an initialised * #GVariantBuilder or one that is set to all-zeros but it is not valid * to call this function on uninitialised memory. * * Since: 2.24 **/ void g_variant_builder_clear (GVariantBuilder *builder) { gsize i; if (GVSB(builder)->magic == 0) /* all-zeros case */ return; g_return_if_fail (is_valid_builder (builder)); g_variant_type_free (GVSB(builder)->type); for (i = 0; i < GVSB(builder)->offset; i++) g_variant_unref (GVSB(builder)->children[i]); g_free (GVSB(builder)->children); if (GVSB(builder)->parent) { g_variant_builder_clear (GVSB(builder)->parent); g_slice_free (GVariantBuilder, GVSB(builder)->parent); } memset (builder, 0, sizeof (GVariantBuilder)); } /** * g_variant_builder_init: (skip) * @builder: a #GVariantBuilder * @type: a container type * * Initialises a #GVariantBuilder structure. * * @type must be non-%NULL. It specifies the type of container to * construct. It can be an indefinite type such as * %G_VARIANT_TYPE_ARRAY or a definite type such as "as" or "(ii)". * Maybe, array, tuple, dictionary entry and variant-typed values may be * constructed. * * After the builder is initialised, values are added using * g_variant_builder_add_value() or g_variant_builder_add(). * * After all the child values are added, g_variant_builder_end() frees * the memory associated with the builder and returns the #GVariant that * was created. * * This function completely ignores the previous contents of @builder. * On one hand this means that it is valid to pass in completely * uninitialised memory. On the other hand, this means that if you are * initialising over top of an existing #GVariantBuilder you need to * first call g_variant_builder_clear() in order to avoid leaking * memory. * * You must not call g_variant_builder_ref() or * g_variant_builder_unref() on a #GVariantBuilder that was initialised * with this function. If you ever pass a reference to a * #GVariantBuilder outside of the control of your own code then you * should assume that the person receiving that reference may try to use * reference counting; you should use g_variant_builder_new() instead of * this function. * * Since: 2.24 **/ void g_variant_builder_init (GVariantBuilder *builder, const GVariantType *type) { g_return_if_fail (type != NULL); g_return_if_fail (g_variant_type_is_container (type)); memset (builder, 0, sizeof (GVariantBuilder)); GVSB(builder)->type = g_variant_type_copy (type); GVSB(builder)->magic = GVSB_MAGIC; GVSB(builder)->trusted = TRUE; switch (*(const gchar *) type) { case G_VARIANT_CLASS_VARIANT: GVSB(builder)->uniform_item_types = TRUE; GVSB(builder)->allocated_children = 1; GVSB(builder)->expected_type = NULL; GVSB(builder)->min_items = 1; GVSB(builder)->max_items = 1; break; case G_VARIANT_CLASS_ARRAY: GVSB(builder)->uniform_item_types = TRUE; GVSB(builder)->allocated_children = 8; GVSB(builder)->expected_type = g_variant_type_element (GVSB(builder)->type); GVSB(builder)->min_items = 0; GVSB(builder)->max_items = -1; break; case G_VARIANT_CLASS_MAYBE: GVSB(builder)->uniform_item_types = TRUE; GVSB(builder)->allocated_children = 1; GVSB(builder)->expected_type = g_variant_type_element (GVSB(builder)->type); GVSB(builder)->min_items = 0; GVSB(builder)->max_items = 1; break; case G_VARIANT_CLASS_DICT_ENTRY: GVSB(builder)->uniform_item_types = FALSE; GVSB(builder)->allocated_children = 2; GVSB(builder)->expected_type = g_variant_type_key (GVSB(builder)->type); GVSB(builder)->min_items = 2; GVSB(builder)->max_items = 2; break; case 'r': /* G_VARIANT_TYPE_TUPLE was given */ GVSB(builder)->uniform_item_types = FALSE; GVSB(builder)->allocated_children = 8; GVSB(builder)->expected_type = NULL; GVSB(builder)->min_items = 0; GVSB(builder)->max_items = -1; break; case G_VARIANT_CLASS_TUPLE: /* a definite tuple type was given */ GVSB(builder)->allocated_children = g_variant_type_n_items (type); GVSB(builder)->expected_type = g_variant_type_first (GVSB(builder)->type); GVSB(builder)->min_items = GVSB(builder)->allocated_children; GVSB(builder)->max_items = GVSB(builder)->allocated_children; GVSB(builder)->uniform_item_types = FALSE; break; default: g_assert_not_reached (); } GVSB(builder)->children = g_new (GVariant *, GVSB(builder)->allocated_children); } static void g_variant_builder_make_room (struct stack_builder *builder) { if (builder->offset == builder->allocated_children) { builder->allocated_children *= 2; builder->children = g_renew (GVariant *, builder->children, builder->allocated_children); } } /** * g_variant_builder_add_value: * @builder: a #GVariantBuilder * @value: a #GVariant * * Adds @value to @builder. * * It is an error to call this function in any way that would create an * inconsistent value to be constructed. Some examples of this are * putting different types of items into an array, putting the wrong * types or number of items in a tuple, putting more than one value into * a variant, etc. * * If @value is a floating reference (see g_variant_ref_sink()), * the @builder instance takes ownership of @value. * * Since: 2.24 **/ void g_variant_builder_add_value (GVariantBuilder *builder, GVariant *value) { g_return_if_fail (is_valid_builder (builder)); g_return_if_fail (GVSB(builder)->offset < GVSB(builder)->max_items); g_return_if_fail (!GVSB(builder)->expected_type || g_variant_is_of_type (value, GVSB(builder)->expected_type)); g_return_if_fail (!GVSB(builder)->prev_item_type || g_variant_is_of_type (value, GVSB(builder)->prev_item_type)); GVSB(builder)->trusted &= g_variant_is_trusted (value); if (!GVSB(builder)->uniform_item_types) { /* advance our expected type pointers */ if (GVSB(builder)->expected_type) GVSB(builder)->expected_type = g_variant_type_next (GVSB(builder)->expected_type); if (GVSB(builder)->prev_item_type) GVSB(builder)->prev_item_type = g_variant_type_next (GVSB(builder)->prev_item_type); } else GVSB(builder)->prev_item_type = g_variant_get_type (value); g_variant_builder_make_room (GVSB(builder)); GVSB(builder)->children[GVSB(builder)->offset++] = g_variant_ref_sink (value); } /** * g_variant_builder_open: * @builder: a #GVariantBuilder * @type: a #GVariantType * * Opens a subcontainer inside the given @builder. When done adding * items to the subcontainer, g_variant_builder_close() must be called. * * It is an error to call this function in any way that would cause an * inconsistent value to be constructed (ie: adding too many values or * a value of an incorrect type). * * Since: 2.24 **/ void g_variant_builder_open (GVariantBuilder *builder, const GVariantType *type) { GVariantBuilder *parent; g_return_if_fail (is_valid_builder (builder)); g_return_if_fail (GVSB(builder)->offset < GVSB(builder)->max_items); g_return_if_fail (!GVSB(builder)->expected_type || g_variant_type_is_subtype_of (type, GVSB(builder)->expected_type)); g_return_if_fail (!GVSB(builder)->prev_item_type || g_variant_type_is_subtype_of (GVSB(builder)->prev_item_type, type)); parent = g_slice_dup (GVariantBuilder, builder); g_variant_builder_init (builder, type); GVSB(builder)->parent = parent; /* push the prev_item_type down into the subcontainer */ if (GVSB(parent)->prev_item_type) { if (!GVSB(builder)->uniform_item_types) /* tuples and dict entries */ GVSB(builder)->prev_item_type = g_variant_type_first (GVSB(parent)->prev_item_type); else if (!g_variant_type_is_variant (GVSB(builder)->type)) /* maybes and arrays */ GVSB(builder)->prev_item_type = g_variant_type_element (GVSB(parent)->prev_item_type); } } /** * g_variant_builder_close: * @builder: a #GVariantBuilder * * Closes the subcontainer inside the given @builder that was opened by * the most recent call to g_variant_builder_open(). * * It is an error to call this function in any way that would create an * inconsistent value to be constructed (ie: too few values added to the * subcontainer). * * Since: 2.24 **/ void g_variant_builder_close (GVariantBuilder *builder) { GVariantBuilder *parent; g_return_if_fail (is_valid_builder (builder)); g_return_if_fail (GVSB(builder)->parent != NULL); parent = GVSB(builder)->parent; GVSB(builder)->parent = NULL; g_variant_builder_add_value (parent, g_variant_builder_end (builder)); *builder = *parent; g_slice_free (GVariantBuilder, parent); } /*< private > * g_variant_make_maybe_type: * @element: a #GVariant * * Return the type of a maybe containing @element. */ static GVariantType * g_variant_make_maybe_type (GVariant *element) { return g_variant_type_new_maybe (g_variant_get_type (element)); } /*< private > * g_variant_make_array_type: * @element: a #GVariant * * Return the type of an array containing @element. */ static GVariantType * g_variant_make_array_type (GVariant *element) { return g_variant_type_new_array (g_variant_get_type (element)); } /** * g_variant_builder_end: * @builder: a #GVariantBuilder * * Ends the builder process and returns the constructed value. * * It is not permissible to use @builder in any way after this call * except for reference counting operations (in the case of a * heap-allocated #GVariantBuilder) or by reinitialising it with * g_variant_builder_init() (in the case of stack-allocated). * * It is an error to call this function in any way that would create an * inconsistent value to be constructed (ie: insufficient number of * items added to a container with a specific number of children * required). It is also an error to call this function if the builder * was created with an indefinite array or maybe type and no children * have been added; in this case it is impossible to infer the type of * the empty array. * * Returns: (transfer none): a new, floating, #GVariant * * Since: 2.24 **/ GVariant * g_variant_builder_end (GVariantBuilder *builder) { GVariantType *my_type; GVariant *value; g_return_val_if_fail (is_valid_builder (builder), NULL); g_return_val_if_fail (GVSB(builder)->offset >= GVSB(builder)->min_items, NULL); g_return_val_if_fail (!GVSB(builder)->uniform_item_types || GVSB(builder)->prev_item_type != NULL || g_variant_type_is_definite (GVSB(builder)->type), NULL); if (g_variant_type_is_definite (GVSB(builder)->type)) my_type = g_variant_type_copy (GVSB(builder)->type); else if (g_variant_type_is_maybe (GVSB(builder)->type)) my_type = g_variant_make_maybe_type (GVSB(builder)->children[0]); else if (g_variant_type_is_array (GVSB(builder)->type)) my_type = g_variant_make_array_type (GVSB(builder)->children[0]); else if (g_variant_type_is_tuple (GVSB(builder)->type)) my_type = g_variant_make_tuple_type (GVSB(builder)->children, GVSB(builder)->offset); else if (g_variant_type_is_dict_entry (GVSB(builder)->type)) my_type = g_variant_make_dict_entry_type (GVSB(builder)->children[0], GVSB(builder)->children[1]); else g_assert_not_reached (); value = g_variant_new_from_children (my_type, g_renew (GVariant *, GVSB(builder)->children, GVSB(builder)->offset), GVSB(builder)->offset, GVSB(builder)->trusted); GVSB(builder)->children = NULL; GVSB(builder)->offset = 0; g_variant_builder_clear (builder); g_variant_type_free (my_type); return value; } /* Format strings {{{1 */ /*< private > * g_variant_format_string_scan: * @string: a string that may be prefixed with a format string * @limit: (allow-none) (default NULL): a pointer to the end of @string, * or %NULL * @endptr: (allow-none) (default NULL): location to store the end pointer, * or %NULL * * Checks the string pointed to by @string for starting with a properly * formed #GVariant varargs format string. If no valid format string is * found then %FALSE is returned. * * If @string does start with a valid format string then %TRUE is * returned. If @endptr is non-%NULL then it is updated to point to the * first character after the format string. * * If @limit is non-%NULL then @limit (and any charater after it) will * not be accessed and the effect is otherwise equivalent to if the * character at @limit were nul. * * See the section on GVariant * Format Strings. * * Returns: %TRUE if there was a valid format string * * Since: 2.24 */ gboolean g_variant_format_string_scan (const gchar *string, const gchar *limit, const gchar **endptr) { #define next_char() (string == limit ? '\0' : *string++) #define peek_char() (string == limit ? '\0' : *string) char c; switch (next_char()) { case 'b': case 'y': case 'n': case 'q': case 'i': case 'u': case 'x': case 't': case 'h': case 'd': case 's': case 'o': case 'g': case 'v': case '*': case '?': case 'r': break; case 'm': return g_variant_format_string_scan (string, limit, endptr); case 'a': case '@': return g_variant_type_string_scan (string, limit, endptr); case '(': while (peek_char() != ')') if (!g_variant_format_string_scan (string, limit, &string)) return FALSE; next_char(); /* consume ')' */ break; case '{': c = next_char(); if (c == '&') { c = next_char (); if (c != 's' && c != 'o' && c != 'g') return FALSE; } else { if (c == '@') c = next_char (); /* ISO/IEC 9899:1999 (C99) §7.21.5.2: * The terminating null character is considered to be * part of the string. */ if (c != '\0' && strchr ("bynqiuxthdsog?", c) == NULL) return FALSE; } if (!g_variant_format_string_scan (string, limit, &string)) return FALSE; if (next_char() != '}') return FALSE; break; case '^': if ((c = next_char()) == 'a') { if ((c = next_char()) == '&') { if ((c = next_char()) == 'a') { if ((c = next_char()) == 'y') break; /* '^a&ay' */ } else if (c == 's' || c == 'o') break; /* '^a&s', '^a&o' */ } else if (c == 'a') { if ((c = next_char()) == 'y') break; /* '^aay' */ } else if (c == 's' || c == 'o') break; /* '^as', '^ao' */ else if (c == 'y') break; /* '^ay' */ } else if (c == '&') { if ((c = next_char()) == 'a') { if ((c = next_char()) == 'y') break; /* '^&ay' */ } } return FALSE; case '&': c = next_char(); if (c != 's' && c != 'o' && c != 'g') return FALSE; break; default: return FALSE; } if (endptr != NULL) *endptr = string; #undef next_char #undef peek_char 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 * @limit: (allow-none) (default NULL): a pointer to the end of @string, * or %NULL * @endptr: (allow-none) (default NULL): location to store the end pointer, * or %NULL * * If @string starts with a valid format string then this function will * return the type that the format string corresponds to. Otherwise * this function returns %NULL. * * Use g_variant_type_free() to free the return value when you no longer * need it. * * This function is otherwise exactly like * g_variant_format_string_scan(). * * Returns: (allow-none): a #GVariantType if there was a valid format string * * Since: 2.24 */ GVariantType * g_variant_format_string_scan_type (const gchar *string, const gchar *limit, const gchar **endptr) { const gchar *my_end; gchar *dest; gchar *new; if (endptr == NULL) endptr = &my_end; if (!g_variant_format_string_scan (string, limit, endptr)) return NULL; dest = new = g_malloc (*endptr - string + 1); while (string != *endptr) { if (*string != '@' && *string != '&' && *string != '^') *dest++ = *string; string++; } *dest = '\0'; return (GVariantType *) G_VARIANT_TYPE (new); } static gboolean valid_format_string (const gchar *format_string, gboolean single, GVariant *value) { const gchar *endptr; GVariantType *type; type = g_variant_format_string_scan_type (format_string, NULL, &endptr); if G_UNLIKELY (type == NULL || (single && *endptr != '\0')) { if (single) g_critical ("'%s' is not a valid GVariant format string", format_string); else g_critical ("'%s' does not have a valid GVariant format " "string as a prefix", format_string); if (type != NULL) g_variant_type_free (type); return FALSE; } if G_UNLIKELY (value && !g_variant_is_of_type (value, type)) { gchar *fragment; gchar *typestr; 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'", fragment, typestr, g_variant_get_type_string (value)); g_variant_type_free (type); g_free (fragment); g_free (typestr); return FALSE; } g_variant_type_free (type); return TRUE; } /* Variable Arguments {{{1 */ /* We consider 2 main classes of format strings: * * - recursive format strings * these are ones that result in recursion and the collection of * possibly more than one argument. Maybe types, tuples, * dictionary entries. * * - leaf format string * these result in the collection of a single argument. * * Leaf format strings are further subdivided into two categories: * * - single non-null pointer ("nnp") * these either collect or return a single non-null pointer. * * - other * these collect or return something else (bool, number, etc). * * Based on the above, the varargs handling code is split into 4 main parts: * * - nnp handling code * - leaf handling code (which may invoke nnp code) * - generic handling code (may be recursive, may invoke leaf code) * - user-facing API (which invokes the generic code) * * Each section implements some of the following functions: * * - skip: * collect the arguments for the format string as if * g_variant_new() had been called, but do nothing with them. used * for skipping over arguments when constructing a Nothing maybe * type. * * - new: * create a GVariant * * * - get: * unpack a GVariant * * * - free (nnp only): * free a previously allocated item */ static gboolean g_variant_format_string_is_leaf (const gchar *str) { return str[0] != 'm' && str[0] != '(' && str[0] != '{'; } static gboolean g_variant_format_string_is_nnp (const gchar *str) { return str[0] == 'a' || str[0] == 's' || str[0] == 'o' || str[0] == 'g' || str[0] == '^' || str[0] == '@' || str[0] == '*' || str[0] == '?' || str[0] == 'r' || str[0] == 'v' || str[0] == '&'; } /* Single non-null pointer ("nnp") {{{2 */ static void g_variant_valist_free_nnp (const gchar *str, gpointer ptr) { switch (*str) { case 'a': g_variant_iter_free (ptr); break; case '^': if (str[2] != '&') /* '^as', '^ao' */ g_strfreev (ptr); else /* '^a&s', '^a&o' */ g_free (ptr); break; case 's': case 'o': case 'g': g_free (ptr); break; case '@': case '*': case '?': case 'v': g_variant_unref (ptr); break; case '&': break; default: g_assert_not_reached (); } } static gchar g_variant_scan_convenience (const gchar **str, gboolean *constant, guint *arrays) { *constant = FALSE; *arrays = 0; for (;;) { char c = *(*str)++; if (c == '&') *constant = TRUE; else if (c == 'a') (*arrays)++; else return c; } } static GVariant * g_variant_valist_new_nnp (const gchar **str, gpointer ptr) { if (**str == '&') (*str)++; switch (*(*str)++) { case 'a': if (ptr != NULL) { const GVariantType *type; GVariant *value; value = g_variant_builder_end (ptr); type = g_variant_get_type (value); if G_UNLIKELY (!g_variant_type_is_array (type)) g_error ("g_variant_new: expected array GVariantBuilder but " "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'", g_variant_type_dup_string ((GVariantType *) *str), g_variant_get_type_string (value) + 1); g_variant_type_string_scan (*str, NULL, str); return value; } else /* special case: NULL pointer for empty array */ { const GVariantType *type = (GVariantType *) *str; g_variant_type_string_scan (*str, NULL, str); if G_UNLIKELY (!g_variant_type_is_definite (type)) g_error ("g_variant_new: NULL pointer given with indefinite " "array type; unable to determine which type of empty " "array to construct."); return g_variant_new_array (type, NULL, 0); } case 's': { GVariant *value; value = g_variant_new_string (ptr); if (value == NULL) value = g_variant_new_string ("[Invalid UTF-8]"); return value; } case 'o': return g_variant_new_object_path (ptr); case 'g': return g_variant_new_signature (ptr); case '^': { gboolean constant; guint arrays; gchar type; type = g_variant_scan_convenience (str, &constant, &arrays); if (type == 's') return g_variant_new_strv (ptr, -1); if (type == 'o') return g_variant_new_objv (ptr, -1); if (arrays > 1) return g_variant_new_bytestring_array (ptr, -1); return g_variant_new_bytestring (ptr); } 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_variant_type_dup_string ((GVariantType *) *str), g_variant_get_type_string (ptr)); g_variant_type_string_scan (*str, NULL, str); return ptr; case '*': return ptr; 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_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_variant_get_type_string (ptr)); return ptr; case 'v': return g_variant_new_variant (ptr); default: g_assert_not_reached (); } } static gpointer g_variant_valist_get_nnp (const gchar **str, GVariant *value) { switch (*(*str)++) { case 'a': g_variant_type_string_scan (*str, NULL, str); return g_variant_iter_new (value); case '&': (*str)++; return (gchar *) g_variant_get_string (value, NULL); case 's': case 'o': case 'g': return g_variant_dup_string (value, NULL); case '^': { gboolean constant; guint arrays; gchar type; type = g_variant_scan_convenience (str, &constant, &arrays); if (type == 's') { if (constant) return g_variant_get_strv (value, NULL); else return g_variant_dup_strv (value, NULL); } else if (type == 'o') { if (constant) return g_variant_get_objv (value, NULL); else return g_variant_dup_objv (value, NULL); } else if (arrays > 1) { if (constant) return g_variant_get_bytestring_array (value, NULL); else return g_variant_dup_bytestring_array (value, NULL); } else { if (constant) return (gchar *) g_variant_get_bytestring (value); else return g_variant_dup_bytestring (value, NULL); } } case '@': g_variant_type_string_scan (*str, NULL, str); /* fall through */ case '*': case '?': case 'r': return g_variant_ref (value); case 'v': return g_variant_get_variant (value); default: g_assert_not_reached (); } } /* Leaves {{{2 */ static void g_variant_valist_skip_leaf (const gchar **str, va_list *app) { if (g_variant_format_string_is_nnp (*str)) { g_variant_format_string_scan (*str, NULL, str); va_arg (*app, gpointer); return; } switch (*(*str)++) { case 'b': case 'y': case 'n': case 'q': case 'i': case 'u': case 'h': va_arg (*app, int); return; case 'x': case 't': va_arg (*app, guint64); return; case 'd': va_arg (*app, gdouble); return; default: g_assert_not_reached (); } } static GVariant * g_variant_valist_new_leaf (const gchar **str, va_list *app) { if (g_variant_format_string_is_nnp (*str)) return g_variant_valist_new_nnp (str, va_arg (*app, gpointer)); switch (*(*str)++) { case 'b': return g_variant_new_boolean (va_arg (*app, gboolean)); case 'y': return g_variant_new_byte (va_arg (*app, guint)); case 'n': return g_variant_new_int16 (va_arg (*app, gint)); case 'q': return g_variant_new_uint16 (va_arg (*app, guint)); case 'i': return g_variant_new_int32 (va_arg (*app, gint)); case 'u': return g_variant_new_uint32 (va_arg (*app, guint)); case 'x': return g_variant_new_int64 (va_arg (*app, gint64)); case 't': return g_variant_new_uint64 (va_arg (*app, guint64)); case 'h': return g_variant_new_handle (va_arg (*app, gint)); case 'd': return g_variant_new_double (va_arg (*app, gdouble)); default: g_assert_not_reached (); } } /* The code below assumes this */ G_STATIC_ASSERT (sizeof (gboolean) == sizeof (guint32)); G_STATIC_ASSERT (sizeof (gdouble) == sizeof (guint64)); static void g_variant_valist_get_leaf (const gchar **str, GVariant *value, gboolean free, va_list *app) { gpointer ptr = va_arg (*app, gpointer); if (ptr == NULL) { g_variant_format_string_scan (*str, NULL, str); return; } if (g_variant_format_string_is_nnp (*str)) { gpointer *nnp = (gpointer *) ptr; if (free && *nnp != NULL) g_variant_valist_free_nnp (*str, *nnp); *nnp = NULL; if (value != NULL) *nnp = g_variant_valist_get_nnp (str, value); else g_variant_format_string_scan (*str, NULL, str); return; } if (value != NULL) { switch (*(*str)++) { case 'b': *(gboolean *) ptr = g_variant_get_boolean (value); return; case 'y': *(guchar *) ptr = g_variant_get_byte (value); return; case 'n': *(gint16 *) ptr = g_variant_get_int16 (value); return; case 'q': *(guint16 *) ptr = g_variant_get_uint16 (value); return; case 'i': *(gint32 *) ptr = g_variant_get_int32 (value); return; case 'u': *(guint32 *) ptr = g_variant_get_uint32 (value); return; case 'x': *(gint64 *) ptr = g_variant_get_int64 (value); return; case 't': *(guint64 *) ptr = g_variant_get_uint64 (value); return; case 'h': *(gint32 *) ptr = g_variant_get_handle (value); return; case 'd': *(gdouble *) ptr = g_variant_get_double (value); return; } } else { switch (*(*str)++) { case 'y': *(guchar *) ptr = 0; return; case 'n': case 'q': *(guint16 *) ptr = 0; return; case 'i': case 'u': case 'h': case 'b': *(guint32 *) ptr = 0; return; case 'x': case 't': case 'd': *(guint64 *) ptr = 0; return; } } g_assert_not_reached (); } /* Generic (recursive) {{{2 */ static void g_variant_valist_skip (const gchar **str, va_list *app) { if (g_variant_format_string_is_leaf (*str)) g_variant_valist_skip_leaf (str, app); else if (**str == 'm') /* maybe */ { (*str)++; if (!g_variant_format_string_is_nnp (*str)) va_arg (*app, gboolean); g_variant_valist_skip (str, app); } else /* tuple, dictionary entry */ { g_assert (**str == '(' || **str == '{'); (*str)++; while (**str != ')' && **str != '}') g_variant_valist_skip (str, app); (*str)++; } } static GVariant * g_variant_valist_new (const gchar **str, va_list *app) { if (g_variant_format_string_is_leaf (*str)) return g_variant_valist_new_leaf (str, app); if (**str == 'm') /* maybe */ { GVariantType *type = NULL; GVariant *value = NULL; (*str)++; if (g_variant_format_string_is_nnp (*str)) { gpointer nnp = va_arg (*app, gpointer); if (nnp != NULL) value = g_variant_valist_new_nnp (str, nnp); else type = g_variant_format_string_scan_type (*str, NULL, str); } else { gboolean just = va_arg (*app, gboolean); if (just) value = g_variant_valist_new (str, app); else { type = g_variant_format_string_scan_type (*str, NULL, NULL); g_variant_valist_skip (str, app); } } value = g_variant_new_maybe (type, value); if (type != NULL) g_variant_type_free (type); return value; } else /* tuple, dictionary entry */ { GVariantBuilder b; if (**str == '(') g_variant_builder_init (&b, G_VARIANT_TYPE_TUPLE); else { g_assert (**str == '{'); g_variant_builder_init (&b, G_VARIANT_TYPE_DICT_ENTRY); } (*str)++; /* '(' */ while (**str != ')' && **str != '}') g_variant_builder_add_value (&b, g_variant_valist_new (str, app)); (*str)++; /* ')' */ return g_variant_builder_end (&b); } } static void g_variant_valist_get (const gchar **str, GVariant *value, gboolean free, va_list *app) { if (g_variant_format_string_is_leaf (*str)) g_variant_valist_get_leaf (str, value, free, app); else if (**str == 'm') { (*str)++; if (value != NULL) value = g_variant_get_maybe (value); if (!g_variant_format_string_is_nnp (*str)) { gboolean *ptr = va_arg (*app, gboolean *); if (ptr != NULL) *ptr = value != NULL; } g_variant_valist_get (str, value, free, app); if (value != NULL) g_variant_unref (value); } else /* tuple, dictionary entry */ { gint index = 0; g_assert (**str == '(' || **str == '{'); (*str)++; while (**str != ')' && **str != '}') { if (value != NULL) { GVariant *child = g_variant_get_child_value (value, index++); g_variant_valist_get (str, child, free, app); g_variant_unref (child); } else g_variant_valist_get (str, NULL, free, app); } (*str)++; } } /* User-facing API {{{2 */ /** * g_variant_new: (skip) * @format_string: a #GVariant format string * @...: arguments, as per @format_string * * Creates a new #GVariant instance. * * Think of this function as an analogue to g_strdup_printf(). * * The type of the created instance and the arguments that are * expected by this function are determined by @format_string. See the * section on GVariant Format * Strings. Please note that the syntax of the format string is * very likely to be extended in the future. * * The first character of the format string must not be '*' '?' '@' or * 'r'; in essence, a new #GVariant must always be constructed by this * function (and not merely passed through it unmodified). * * Returns: a new floating #GVariant instance * * Since: 2.24 **/ GVariant * g_variant_new (const gchar *format_string, ...) { GVariant *value; va_list ap; g_return_val_if_fail (valid_format_string (format_string, TRUE, NULL) && format_string[0] != '?' && format_string[0] != '@' && format_string[0] != '*' && format_string[0] != 'r', NULL); va_start (ap, format_string); value = g_variant_new_va (format_string, NULL, &ap); va_end (ap); return value; } /** * g_variant_new_va: (skip) * @format_string: a string that is prefixed with a format string * @endptr: (allow-none) (default NULL): location to store the end pointer, * or %NULL * @app: a pointer to a #va_list * * This function is intended to be used by libraries based on * #GVariant that want to provide g_variant_new()-like functionality * to their users. * * The API is more general than g_variant_new() to allow a wider range * of possible uses. * * @format_string must still point to a valid format string, but it only * needs to be nul-terminated if @endptr is %NULL. If @endptr is * non-%NULL then it is updated to point to the first character past the * end of the format string. * * @app is a pointer to a #va_list. The arguments, according to * @format_string, are collected from this #va_list and the list is left * pointing to the argument following the last. * * These two generalisations allow mixing of multiple calls to * g_variant_new_va() and g_variant_get_va() within a single actual * varargs call by the user. * * The return value will be floating if it was a newly created GVariant * instance (for example, if the format string was "(ii)"). In the case * that the format_string was '*', '?', 'r', or a format starting with * '@' then the collected #GVariant pointer will be returned unmodified, * without adding any additional references. * * In order to behave correctly in all cases it is necessary for the * calling function to g_variant_ref_sink() the return result before * returning control to the user that originally provided the pointer. * At this point, the caller will have their own full reference to the * result. This can also be done by adding the result to a container, * or by passing it to another g_variant_new() call. * * Returns: a new, usually floating, #GVariant * * Since: 2.24 **/ GVariant * g_variant_new_va (const gchar *format_string, const gchar **endptr, va_list *app) { GVariant *value; g_return_val_if_fail (valid_format_string (format_string, !endptr, NULL), NULL); g_return_val_if_fail (app != NULL, NULL); value = g_variant_valist_new (&format_string, app); if (endptr != NULL) *endptr = format_string; return value; } /** * g_variant_get: (skip) * @value: a #GVariant instance * @format_string: a #GVariant format string * @...: arguments, as per @format_string * * Deconstructs a #GVariant instance. * * Think of this function as an analogue to scanf(). * * The arguments that are expected by this function are entirely * determined by @format_string. @format_string also restricts the * permissible types of @value. It is an error to give a value with * an incompatible type. See the section on GVariant Format Strings. * Please note that the syntax of the format string is very likely to be * extended in the future. * * @format_string determines the C types that are used for unpacking * the values and also determines if the values are copied or borrowed, * see the section on * GVariant Format Strings. * * Since: 2.24 **/ void g_variant_get (GVariant *value, const gchar *format_string, ...) { va_list ap; g_return_if_fail (valid_format_string (format_string, TRUE, value)); /* if any direct-pointer-access formats are in use, flatten first */ if (strchr (format_string, '&')) g_variant_get_data (value); va_start (ap, format_string); g_variant_get_va (value, format_string, NULL, &ap); va_end (ap); } /** * g_variant_get_va: (skip) * @value: a #GVariant * @format_string: a string that is prefixed with a format string * @endptr: (allow-none) (default NULL): location to store the end pointer, * or %NULL * @app: a pointer to a #va_list * * This function is intended to be used by libraries based on #GVariant * that want to provide g_variant_get()-like functionality to their * users. * * The API is more general than g_variant_get() to allow a wider range * of possible uses. * * @format_string must still point to a valid format string, but it only * need to be nul-terminated if @endptr is %NULL. If @endptr is * non-%NULL then it is updated to point to the first character past the * end of the format string. * * @app is a pointer to a #va_list. The arguments, according to * @format_string, are collected from this #va_list and the list is left * pointing to the argument following the last. * * These two generalisations allow mixing of multiple calls to * g_variant_new_va() and g_variant_get_va() within a single actual * varargs call by the user. * * @format_string determines the C types that are used for unpacking * the values and also determines if the values are copied or borrowed, * see the section on * GVariant Format Strings. * * Since: 2.24 **/ void g_variant_get_va (GVariant *value, const gchar *format_string, const gchar **endptr, va_list *app) { g_return_if_fail (valid_format_string (format_string, !endptr, value)); g_return_if_fail (value != NULL); g_return_if_fail (app != NULL); /* if any direct-pointer-access formats are in use, flatten first */ if (strchr (format_string, '&')) g_variant_get_data (value); g_variant_valist_get (&format_string, value, FALSE, app); if (endptr != NULL) *endptr = format_string; } /* Varargs-enabled Utility Functions {{{1 */ /** * g_variant_builder_add: (skp) * @builder: a #GVariantBuilder * @format_string: a #GVariant varargs format string * @...: arguments, as per @format_string * * Adds to a #GVariantBuilder. * * This call is a convenience wrapper that is exactly equivalent to * calling g_variant_new() followed by g_variant_builder_add_value(). * * This function might be used as follows: * * * GVariant * * make_pointless_dictionary (void) * { * GVariantBuilder *builder; * int i; * * builder = g_variant_builder_new (G_VARIANT_TYPE_ARRAY); * for (i = 0; i < 16; i++) * { * gchar buf[3]; * * sprintf (buf, "%d", i); * g_variant_builder_add (builder, "{is}", i, buf); * } * * return g_variant_builder_end (builder); * } * * * Since: 2.24 **/ void g_variant_builder_add (GVariantBuilder *builder, const gchar *format_string, ...) { GVariant *variant; va_list ap; va_start (ap, format_string); variant = g_variant_new_va (format_string, NULL, &ap); va_end (ap); g_variant_builder_add_value (builder, variant); } /** * g_variant_get_child: (skip) * @value: a container #GVariant * @index_: the index of the child to deconstruct * @format_string: a #GVariant format string * @...: arguments, as per @format_string * * Reads a child item out of a container #GVariant instance and * deconstructs it according to @format_string. This call is * essentially a combination of g_variant_get_child_value() and * g_variant_get(). * * @format_string determines the C types that are used for unpacking * the values and also determines if the values are copied or borrowed, * see the section on * GVariant Format Strings. * * Since: 2.24 **/ void g_variant_get_child (GVariant *value, gsize index_, const gchar *format_string, ...) { GVariant *child; va_list ap; child = g_variant_get_child_value (value, index_); g_return_if_fail (valid_format_string (format_string, TRUE, child)); va_start (ap, format_string); g_variant_get_va (child, format_string, NULL, &ap); va_end (ap); g_variant_unref (child); } /** * g_variant_iter_next: (skip) * @iter: a #GVariantIter * @format_string: a GVariant format string * @...: the arguments to unpack the value into * * Gets the next item in the container and unpacks it into the variable * argument list according to @format_string, returning %TRUE. * * If no more items remain then %FALSE is returned. * * All of the pointers given on the variable arguments list of this * function are assumed to point at uninitialised memory. It is the * responsibility of the caller to free all of the values returned by * the unpacking process. * * See the section on GVariant * Format Strings. * * * Memory management with g_variant_iter_next() * * /* Iterates a dictionary of type 'a{sv}' */ * void * iterate_dictionary (GVariant *dictionary) * { * GVariantIter iter; * GVariant *value; * gchar *key; * * g_variant_iter_init (&iter, dictionary); * while (g_variant_iter_next (&iter, "{sv}", &key, &value)) * { * g_print ("Item '%s' has type '%s'\n", key, * g_variant_get_type_string (value)); * * /* must free data for ourselves */ * g_variant_unref (value); * g_free (key); * } * } * * * * For a solution that is likely to be more convenient to C programmers * when dealing with loops, see g_variant_iter_loop(). * * @format_string determines the C types that are used for unpacking * the values and also determines if the values are copied or borrowed, * see the section on * GVariant Format Strings. * * Returns: %TRUE if a value was unpacked, or %FALSE if there as no value * * Since: 2.24 **/ gboolean g_variant_iter_next (GVariantIter *iter, const gchar *format_string, ...) { GVariant *value; value = g_variant_iter_next_value (iter); g_return_val_if_fail (valid_format_string (format_string, TRUE, value), FALSE); if (value != NULL) { va_list ap; va_start (ap, format_string); g_variant_valist_get (&format_string, value, FALSE, &ap); va_end (ap); g_variant_unref (value); } return value != NULL; } /** * g_variant_iter_loop: (skip) * @iter: a #GVariantIter * @format_string: a GVariant format string * @...: the arguments to unpack the value into * * Gets the next item in the container and unpacks it into the variable * argument list according to @format_string, returning %TRUE. * * If no more items remain then %FALSE is returned. * * On the first call to this function, the pointers appearing on the * variable argument list are assumed to point at uninitialised memory. * On the second and later calls, it is assumed that the same pointers * will be given and that they will point to the memory as set by the * previous call to this function. This allows the previous values to * be freed, as appropriate. * * This function is intended to be used with a while loop as * demonstrated in the following example. This function can only be * used when iterating over an array. It is only valid to call this * function with a string constant for the format string and the same * string constant must be used each time. Mixing calls to this * function and g_variant_iter_next() or g_variant_iter_next_value() on * the same iterator causes undefined behavior. * * If you break out of a such a while loop using g_variant_iter_loop() then * you must free or unreference all the unpacked values as you would with * g_variant_get(). Failure to do so will cause a memory leak. * * See the section on GVariant * Format Strings. * * * Memory management with g_variant_iter_loop() * * /* Iterates a dictionary of type 'a{sv}' */ * void * iterate_dictionary (GVariant *dictionary) * { * GVariantIter iter; * GVariant *value; * gchar *key; * * g_variant_iter_init (&iter, dictionary); * while (g_variant_iter_loop (&iter, "{sv}", &key, &value)) * { * g_print ("Item '%s' has type '%s'\n", key, * g_variant_get_type_string (value)); * * /* no need to free 'key' and 'value' here */ * /* unless breaking out of this loop */ * } * } * * * * For most cases you should use g_variant_iter_next(). * * This function is really only useful when unpacking into #GVariant or * #GVariantIter in order to allow you to skip the call to * g_variant_unref() or g_variant_iter_free(). * * For example, if you are only looping over simple integer and string * types, g_variant_iter_next() is definitely preferred. For string * types, use the '&' prefix to avoid allocating any memory at all (and * thereby avoiding the need to free anything as well). * * @format_string determines the C types that are used for unpacking * the values and also determines if the values are copied or borrowed, * see the section on * GVariant Format Strings. * * Returns: %TRUE if a value was unpacked, or %FALSE if there was no * value * * Since: 2.24 **/ gboolean g_variant_iter_loop (GVariantIter *iter, const gchar *format_string, ...) { gboolean first_time = GVSI(iter)->loop_format == NULL; GVariant *value; va_list ap; g_return_val_if_fail (first_time || format_string == GVSI(iter)->loop_format, FALSE); if (first_time) { TYPE_CHECK (GVSI(iter)->value, G_VARIANT_TYPE_ARRAY, FALSE); GVSI(iter)->loop_format = format_string; if (strchr (format_string, '&')) g_variant_get_data (GVSI(iter)->value); } value = g_variant_iter_next_value (iter); g_return_val_if_fail (!first_time || valid_format_string (format_string, TRUE, value), FALSE); va_start (ap, format_string); g_variant_valist_get (&format_string, value, !first_time, &ap); va_end (ap); if (value != NULL) g_variant_unref (value); return value != NULL; } /* Serialised data {{{1 */ static GVariant * g_variant_deep_copy (GVariant *value) { switch (g_variant_classify (value)) { case G_VARIANT_CLASS_MAYBE: case G_VARIANT_CLASS_ARRAY: case G_VARIANT_CLASS_TUPLE: case G_VARIANT_CLASS_DICT_ENTRY: case G_VARIANT_CLASS_VARIANT: { GVariantBuilder builder; GVariantIter iter; GVariant *child; g_variant_builder_init (&builder, g_variant_get_type (value)); g_variant_iter_init (&iter, value); while ((child = g_variant_iter_next_value (&iter))) { g_variant_builder_add_value (&builder, g_variant_deep_copy (child)); g_variant_unref (child); } return g_variant_builder_end (&builder); } case G_VARIANT_CLASS_BOOLEAN: return g_variant_new_boolean (g_variant_get_boolean (value)); case G_VARIANT_CLASS_BYTE: return g_variant_new_byte (g_variant_get_byte (value)); case G_VARIANT_CLASS_INT16: return g_variant_new_int16 (g_variant_get_int16 (value)); case G_VARIANT_CLASS_UINT16: return g_variant_new_uint16 (g_variant_get_uint16 (value)); case G_VARIANT_CLASS_INT32: return g_variant_new_int32 (g_variant_get_int32 (value)); case G_VARIANT_CLASS_UINT32: return g_variant_new_uint32 (g_variant_get_uint32 (value)); case G_VARIANT_CLASS_INT64: return g_variant_new_int64 (g_variant_get_int64 (value)); case G_VARIANT_CLASS_UINT64: return g_variant_new_uint64 (g_variant_get_uint64 (value)); case G_VARIANT_CLASS_HANDLE: return g_variant_new_handle (g_variant_get_handle (value)); case G_VARIANT_CLASS_DOUBLE: return g_variant_new_double (g_variant_get_double (value)); case G_VARIANT_CLASS_STRING: return g_variant_new_string (g_variant_get_string (value, NULL)); case G_VARIANT_CLASS_OBJECT_PATH: return g_variant_new_object_path (g_variant_get_string (value, NULL)); case G_VARIANT_CLASS_SIGNATURE: return g_variant_new_signature (g_variant_get_string (value, NULL)); } g_assert_not_reached (); } /** * g_variant_get_normal_form: * @value: a #GVariant * * Gets a #GVariant instance that has the same value as @value and is * trusted to be in normal form. * * If @value is already trusted to be in normal form then a new * reference to @value is returned. * * If @value is not already trusted, then it is scanned to check if it * is in normal form. If it is found to be in normal form then it is * marked as trusted and a new reference to it is returned. * * If @value is found not to be in normal form then a new trusted * #GVariant is created with the same value as @value. * * It makes sense to call this function if you've received #GVariant * data from untrusted sources and you want to ensure your serialised * output is definitely in normal form. * * Returns: (transfer full): a trusted #GVariant * * Since: 2.24 **/ GVariant * g_variant_get_normal_form (GVariant *value) { GVariant *trusted; if (g_variant_is_normal_form (value)) return g_variant_ref (value); trusted = g_variant_deep_copy (value); g_assert (g_variant_is_trusted (trusted)); return g_variant_ref_sink (trusted); } /** * g_variant_byteswap: * @value: a #GVariant * * Performs a byteswapping operation on the contents of @value. The * result is that all multi-byte numeric data contained in @value is * byteswapped. That includes 16, 32, and 64bit signed and unsigned * integers as well as file handles and double precision floating point * values. * * This function is an identity mapping on any value that does not * contain multi-byte numeric data. That include strings, booleans, * bytes and containers containing only these things (recursively). * * The returned value is always in normal form and is marked as trusted. * * Returns: (transfer full): the byteswapped form of @value * * Since: 2.24 **/ GVariant * g_variant_byteswap (GVariant *value) { GVariantTypeInfo *type_info; guint alignment; GVariant *new; type_info = g_variant_get_type_info (value); g_variant_type_info_query (type_info, &alignment, NULL); if (alignment) /* (potentially) contains multi-byte numeric data */ { GVariantSerialised serialised; GVariant *trusted; GBytes *bytes; trusted = g_variant_get_normal_form (value); serialised.type_info = g_variant_get_type_info (trusted); serialised.size = g_variant_get_size (trusted); serialised.data = g_malloc (serialised.size); g_variant_store (trusted, serialised.data); g_variant_unref (trusted); g_variant_serialised_byteswap (serialised); bytes = g_bytes_new_take (serialised.data, serialised.size); new = g_variant_new_from_bytes (g_variant_get_type (value), bytes, TRUE); g_bytes_unref (bytes); } else /* contains no multi-byte data */ new = value; return g_variant_ref_sink (new); } /** * g_variant_new_from_data: * @type: a definite #GVariantType * @data: (array length=size) (element-type guint8): the serialised data * @size: the size of @data * @trusted: %TRUE if @data is definitely in normal form * @notify: (scope async): function to call when @data is no longer needed * @user_data: data for @notify * * Creates a new #GVariant instance from serialised data. * * @type is the type of #GVariant instance that will be constructed. * The interpretation of @data depends on knowing the type. * * @data is not modified by this function and must remain valid with an * unchanging value until such a time as @notify is called with * @user_data. If the contents of @data change before that time then * the result is undefined. * * If @data is trusted to be serialised data in normal form then * @trusted should be %TRUE. This applies to serialised data created * within this process or read from a trusted location on the disk (such * as a file installed in /usr/lib alongside your application). You * should set trusted to %FALSE if @data is read from the network, a * file in the user's home directory, etc. * * If @data was not stored in this machine's native endianness, any multi-byte * numeric values in the returned variant will also be in non-native * endianness. g_variant_byteswap() can be used to recover the original values. * * @notify will be called with @user_data when @data is no longer * needed. The exact time of this call is unspecified and might even be * before this function returns. * * Returns: (transfer none): a new floating #GVariant of type @type * * Since: 2.24 **/ GVariant * g_variant_new_from_data (const GVariantType *type, gconstpointer data, gsize size, gboolean trusted, GDestroyNotify notify, gpointer user_data) { GVariant *value; GBytes *bytes; g_return_val_if_fail (g_variant_type_is_definite (type), NULL); g_return_val_if_fail (data != NULL || size == 0, NULL); if (notify) bytes = g_bytes_new_with_free_func (data, size, notify, user_data); else bytes = g_bytes_new_static (data, size); value = g_variant_new_from_bytes (type, bytes, trusted); g_bytes_unref (bytes); return value; } /* Epilogue {{{1 */ /* vim:set foldmethod=marker: */ pkg-config-0.29.1/glib/glib/gmarkup.h0000664000175000017500000002457612651243552014246 00000000000000/* gmarkup.h - Simple XML-like string parser/writer * * Copyright 2000 Red Hat, Inc. * * GLib is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * GLib is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with GLib; see the file COPYING.LIB. If not, * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __G_MARKUP_H__ #define __G_MARKUP_H__ #if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) #error "Only can be included directly." #endif #include #include #include G_BEGIN_DECLS /** * GMarkupError: * @G_MARKUP_ERROR_BAD_UTF8: text being parsed was not valid UTF-8 * @G_MARKUP_ERROR_EMPTY: document contained nothing, or only whitespace * @G_MARKUP_ERROR_PARSE: document was ill-formed * @G_MARKUP_ERROR_UNKNOWN_ELEMENT: error should be set by #GMarkupParser * functions; element wasn't known * @G_MARKUP_ERROR_UNKNOWN_ATTRIBUTE: error should be set by #GMarkupParser * functions; attribute wasn't known * @G_MARKUP_ERROR_INVALID_CONTENT: error should be set by #GMarkupParser * functions; content was invalid * @G_MARKUP_ERROR_MISSING_ATTRIBUTE: error should be set by #GMarkupParser * functions; a required attribute was missing * * Error codes returned by markup parsing. */ typedef enum { G_MARKUP_ERROR_BAD_UTF8, G_MARKUP_ERROR_EMPTY, G_MARKUP_ERROR_PARSE, /* The following are primarily intended for specific GMarkupParser * implementations to set. */ G_MARKUP_ERROR_UNKNOWN_ELEMENT, G_MARKUP_ERROR_UNKNOWN_ATTRIBUTE, G_MARKUP_ERROR_INVALID_CONTENT, G_MARKUP_ERROR_MISSING_ATTRIBUTE } GMarkupError; /** * G_MARKUP_ERROR: * * Error domain for markup parsing. * Errors in this domain will be from the #GMarkupError enumeration. * See #GError for information on error domains. */ #define G_MARKUP_ERROR g_markup_error_quark () GLIB_AVAILABLE_IN_ALL GQuark g_markup_error_quark (void); /** * GMarkupParseFlags: * @G_MARKUP_DO_NOT_USE_THIS_UNSUPPORTED_FLAG: flag you should not use * @G_MARKUP_TREAT_CDATA_AS_TEXT: When this flag is set, CDATA marked * sections are not passed literally to the @passthrough function of * the parser. Instead, the content of the section (without the * <![CDATA[ and ]]>) is * passed to the @text function. This flag was added in GLib 2.12 * @G_MARKUP_PREFIX_ERROR_POSITION: Normally errors caught by GMarkup * itself have line/column information prefixed to them to let the * caller know the location of the error. When this flag is set the * location information is also prefixed to errors generated by the * #GMarkupParser implementation functions * * Flags that affect the behaviour of the parser. */ typedef enum { G_MARKUP_DO_NOT_USE_THIS_UNSUPPORTED_FLAG = 1 << 0, G_MARKUP_TREAT_CDATA_AS_TEXT = 1 << 1, G_MARKUP_PREFIX_ERROR_POSITION = 1 << 2 } GMarkupParseFlags; /** * GMarkupParseContext: * * A parse context is used to parse a stream of bytes that * you expect to contain marked-up text. * * See g_markup_parse_context_new(), #GMarkupParser, and so * on for more details. */ typedef struct _GMarkupParseContext GMarkupParseContext; typedef struct _GMarkupParser GMarkupParser; /** * GMarkupParser: * @start_element: Callback to invoke when the opening tag of an element * is seen. * @end_element: Callback to invoke when the closing tag of an element * is seen. Note that this is also called for empty tags like * <empty/>. * @text: Callback to invoke when some text is seen (text is always * inside an element). Note that the text of an element may be spread * over multiple calls of this function. If the * %G_MARKUP_TREAT_CDATA_AS_TEXT flag is set, this function is also * called for the content of CDATA marked sections. * @passthrough: Callback to invoke for comments, processing instructions * and doctype declarations; if you're re-writing the parsed document, * write the passthrough text back out in the same position. If the * %G_MARKUP_TREAT_CDATA_AS_TEXT flag is not set, this function is also * called for CDATA marked sections. * @error: Callback to invoke when an error occurs. * * Any of the fields in #GMarkupParser can be %NULL, in which case they * will be ignored. Except for the @error function, any of these callbacks * can set an error; in particular the %G_MARKUP_ERROR_UNKNOWN_ELEMENT, * %G_MARKUP_ERROR_UNKNOWN_ATTRIBUTE, and %G_MARKUP_ERROR_INVALID_CONTENT * errors are intended to be set from these callbacks. If you set an error * from a callback, g_markup_parse_context_parse() will report that error * back to its caller. */ struct _GMarkupParser { /* Called for open tags */ void (*start_element) (GMarkupParseContext *context, const gchar *element_name, const gchar **attribute_names, const gchar **attribute_values, gpointer user_data, GError **error); /* Called for close tags */ void (*end_element) (GMarkupParseContext *context, const gchar *element_name, gpointer user_data, GError **error); /* Called for character data */ /* text is not nul-terminated */ void (*text) (GMarkupParseContext *context, const gchar *text, gsize text_len, gpointer user_data, GError **error); /* Called for strings that should be re-saved verbatim in this same * position, but are not otherwise interpretable. At the moment * this includes comments and processing instructions. */ /* text is not nul-terminated. */ void (*passthrough) (GMarkupParseContext *context, const gchar *passthrough_text, gsize text_len, gpointer user_data, GError **error); /* Called on error, including one set by other * methods in the vtable. The GError should not be freed. */ void (*error) (GMarkupParseContext *context, GError *error, gpointer user_data); }; 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) G_GNUC_PRINTF(1, 0); typedef enum { G_MARKUP_COLLECT_INVALID, G_MARKUP_COLLECT_STRING, G_MARKUP_COLLECT_STRDUP, G_MARKUP_COLLECT_BOOLEAN, G_MARKUP_COLLECT_TRISTATE, G_MARKUP_COLLECT_OPTIONAL = (1 << 16) } GMarkupCollectType; /* 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, GError **error, GMarkupCollectType first_type, const gchar *first_attr, ...); G_END_DECLS #endif /* __G_MARKUP_H__ */ pkg-config-0.29.1/glib/glib/gshell.c0000664000175000017500000004765712651243552014056 00000000000000/* gshell.c - Shell-related utilities * * Copyright 2000 Red Hat, Inc. * g_execvpe implementation based on GNU libc execvp: * Copyright 1991, 92, 95, 96, 97, 98, 99 Free Software Foundation, Inc. * * GLib is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * GLib is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with GLib; see the file COPYING.LIB. If not, write * to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "config.h" #include #include "gshell.h" #include "gslist.h" #include "gstrfuncs.h" #include "gstring.h" #include "gtestutils.h" #include "glibintl.h" #include "gthread.h" /** * SECTION:shell * @title: Shell-related Utilities * @short_description: shell-like commandline handling **/ /** * G_SHELL_ERROR: * * Error domain for shell functions. Errors in this domain will be from * the #GShellError enumeration. See #GError for information on error * domains. **/ /** * GShellError: * @G_SHELL_ERROR_BAD_QUOTING: Mismatched or otherwise mangled quoting. * @G_SHELL_ERROR_EMPTY_STRING: String to be parsed was empty. * @G_SHELL_ERROR_FAILED: Some other error. * * Error codes returned by shell functions. **/ 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 ' * in the quoted text, you have to do something like 'foo'\''bar' * * Double quotes allow $ ` " \ and newline to be escaped with backslash. * Otherwise double quotes preserve things literally. */ static gboolean unquote_string_inplace (gchar* str, gchar** end, GError** err) { gchar* dest; gchar* s; gchar quote_char; g_return_val_if_fail(end != NULL, FALSE); g_return_val_if_fail(err == NULL || *err == NULL, FALSE); g_return_val_if_fail(str != NULL, FALSE); dest = s = str; quote_char = *s; if (!(*s == '"' || *s == '\'')) { g_set_error_literal (err, G_SHELL_ERROR, G_SHELL_ERROR_BAD_QUOTING, _("Quoted text doesn't begin with a quotation mark")); *end = str; return FALSE; } /* Skip the initial quote mark */ ++s; if (quote_char == '"') { while (*s) { g_assert(s > dest); /* loop invariant */ switch (*s) { case '"': /* End of the string, return now */ *dest = '\0'; ++s; *end = s; return TRUE; break; case '\\': /* Possible escaped quote or \ */ ++s; switch (*s) { case '"': case '\\': case '`': case '$': case '\n': *dest = *s; ++s; ++dest; break; default: /* not an escaped char */ *dest = '\\'; ++dest; /* ++s already done. */ break; } break; default: *dest = *s; ++dest; ++s; break; } g_assert(s > dest); /* loop invariant */ } } else { while (*s) { g_assert(s > dest); /* loop invariant */ if (*s == '\'') { /* End of the string, return now */ *dest = '\0'; ++s; *end = s; return TRUE; } else { *dest = *s; ++dest; ++s; } g_assert(s > dest); /* loop invariant */ } } /* If we reach here this means the close quote was never encountered */ *dest = '\0'; g_set_error_literal (err, G_SHELL_ERROR, G_SHELL_ERROR_BAD_QUOTING, _("Unmatched quotation mark in command line or other shell-quoted text")); *end = s; return FALSE; } /** * g_shell_quote: * @unquoted_string: a literal string * * Quotes a string so that the shell (/bin/sh) will interpret the * quoted string to mean @unquoted_string. If you pass a filename to * the shell, for example, you should first quote it with this * function. The return value must be freed with g_free(). The * quoting style used is undefined (single or double quotes may be * used). * * Return value: quoted string **/ gchar* g_shell_quote (const gchar *unquoted_string) { /* We always use single quotes, because the algorithm is cheesier. * We could use double if we felt like it, that might be more * human-readable. */ const gchar *p; GString *dest; g_return_val_if_fail (unquoted_string != NULL, NULL); dest = g_string_new ("'"); p = unquoted_string; /* could speed this up a lot by appending chunks of text at a * time. */ while (*p) { /* Replace literal ' with a close ', a \', and a open ' */ if (*p == '\'') g_string_append (dest, "'\\''"); else g_string_append_c (dest, *p); ++p; } /* close the quote */ g_string_append_c (dest, '\''); return g_string_free (dest, FALSE); } /** * g_shell_unquote: * @quoted_string: shell-quoted string * @error: error return location or NULL * * Unquotes a string as the shell (/bin/sh) would. Only handles * quotes; if a string contains file globs, arithmetic operators, * variables, backticks, redirections, or other special-to-the-shell * features, the result will be different from the result a real shell * would produce (the variables, backticks, etc. will be passed * through literally instead of being expanded). This function is * guaranteed to succeed if applied to the result of * g_shell_quote(). If it fails, it returns %NULL and sets the * error. The @quoted_string need not actually contain quoted or * escaped text; g_shell_unquote() simply goes through the string and * unquotes/unescapes anything that the shell would. Both single and * double quotes are handled, as are escapes including escaped * newlines. The return value must be freed with g_free(). Possible * errors are in the #G_SHELL_ERROR domain. * * Shell quoting rules are a bit strange. Single quotes preserve the * literal string exactly. escape sequences are not allowed; not even * \' - if you want a ' in the quoted text, you have to do something * like 'foo'\''bar'. Double quotes allow $, `, ", \, and newline to * be escaped with backslash. Otherwise double quotes preserve things * literally. * * Return value: an unquoted string **/ gchar* g_shell_unquote (const gchar *quoted_string, GError **error) { gchar *unquoted; gchar *end; gchar *start; GString *retval; g_return_val_if_fail (quoted_string != NULL, NULL); unquoted = g_strdup (quoted_string); start = unquoted; end = unquoted; retval = g_string_new (NULL); /* The loop allows cases such as * "foo"blah blah'bar'woo foo"baz"la la la\'\''foo' */ while (*start) { /* Append all non-quoted chars, honoring backslash escape */ while (*start && !(*start == '"' || *start == '\'')) { if (*start == '\\') { /* all characters can get escaped by backslash, * except newline, which is removed if it follows * a backslash outside of quotes */ ++start; if (*start) { if (*start != '\n') g_string_append_c (retval, *start); ++start; } } else { g_string_append_c (retval, *start); ++start; } } if (*start) { if (!unquote_string_inplace (start, &end, error)) { goto error; } else { g_string_append (retval, start); start = end; } } } g_free (unquoted); return g_string_free (retval, FALSE); error: g_assert (error == NULL || *error != NULL); g_free (unquoted); g_string_free (retval, TRUE); return NULL; } /* g_parse_argv() does a semi-arbitrary weird subset of the way * the shell parses a command line. We don't do variable expansion, * don't understand that operators are tokens, don't do tilde expansion, * don't do command substitution, no arithmetic expansion, IFS gets ignored, * don't do filename globs, don't remove redirection stuff, etc. * * READ THE UNIX98 SPEC on "Shell Command Language" before changing * the behavior of this code. * * Steps to parsing the argv string: * * - tokenize the string (but since we ignore operators, * our tokenization may diverge from what the shell would do) * note that tokenization ignores the internals of a quoted * word and it always splits on spaces, not on IFS even * if we used IFS. We also ignore "end of input indicator" * (I guess this is control-D?) * * Tokenization steps, from UNIX98 with operator stuff removed, * are: * * 1) "If the current character is backslash, single-quote or * double-quote (\, ' or ") and it is not quoted, it will affect * quoting for subsequent characters up to the end of the quoted * text. The rules for quoting are as described in Quoting * . During token recognition no substitutions will be actually * performed, and the result token will contain exactly the * characters that appear in the input (except for newline * character joining), unmodified, including any embedded or * enclosing quotes or substitution operators, between the quote * mark and the end of the quoted text. The token will not be * delimited by the end of the quoted field." * * 2) "If the current character is an unquoted newline character, * the current token will be delimited." * * 3) "If the current character is an unquoted blank character, any * token containing the previous character is delimited and the * current character will be discarded." * * 4) "If the previous character was part of a word, the current * character will be appended to that word." * * 5) "If the current character is a "#", it and all subsequent * characters up to, but excluding, the next newline character * will be discarded as a comment. The newline character that * ends the line is not considered part of the comment. The * "#" starts a comment only when it is at the beginning of a * token. Since the search for the end-of-comment does not * consider an escaped newline character specially, a comment * cannot be continued to the next line." * * 6) "The current character will be used as the start of a new word." * * * - for each token (word), perform portions of word expansion, namely * field splitting (using default whitespace IFS) and quote * removal. Field splitting may increase the number of words. * Quote removal does not increase the number of words. * * "If the complete expansion appropriate for a word results in an * empty field, that empty field will be deleted from the list of * fields that form the completely expanded command, unless the * original word contained single-quote or double-quote characters." * - UNIX98 spec * * */ static inline void ensure_token (GString **token) { if (*token == NULL) *token = g_string_new (NULL); } static void delimit_token (GString **token, GSList **retval) { if (*token == NULL) return; *retval = g_slist_prepend (*retval, g_string_free (*token, FALSE)); *token = NULL; } static GSList* tokenize_command_line (const gchar *command_line, GError **error) { gchar current_quote; const gchar *p; GString *current_token = NULL; GSList *retval = NULL; gboolean quoted; current_quote = '\0'; quoted = FALSE; p = command_line; while (*p) { if (current_quote == '\\') { if (*p == '\n') { /* we append nothing; backslash-newline become nothing */ } else { /* we append the backslash and the current char, * to be interpreted later after tokenization */ ensure_token (¤t_token); g_string_append_c (current_token, '\\'); g_string_append_c (current_token, *p); } current_quote = '\0'; } else if (current_quote == '#') { /* Discard up to and including next newline */ while (*p && *p != '\n') ++p; current_quote = '\0'; if (*p == '\0') break; } else if (current_quote) { if (*p == current_quote && /* check that it isn't an escaped double quote */ !(current_quote == '"' && quoted)) { /* close the quote */ current_quote = '\0'; } /* Everything inside quotes, and the close quote, * gets appended literally. */ ensure_token (¤t_token); g_string_append_c (current_token, *p); } else { switch (*p) { case '\n': delimit_token (¤t_token, &retval); break; case ' ': case '\t': /* If the current token contains the previous char, delimit * the current token. A nonzero length * token should always contain the previous char. */ if (current_token && current_token->len > 0) { delimit_token (¤t_token, &retval); } /* discard all unquoted blanks (don't add them to a token) */ break; /* single/double quotes are appended to the token, * escapes are maybe appended next time through the loop, * comment chars are never appended. */ case '\'': case '"': ensure_token (¤t_token); g_string_append_c (current_token, *p); /* FALL THRU */ case '\\': 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 (¤t_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. */ ensure_token (¤t_token); g_string_append_c (current_token, *p); break; } } /* We need to count consecutive backslashes mod 2, * to detect escaped doublequotes. */ if (*p != '\\') quoted = FALSE; else quoted = !quoted; ++p; } delimit_token (¤t_token, &retval); if (current_quote) { if (current_quote == '\\') g_set_error (error, G_SHELL_ERROR, G_SHELL_ERROR_BAD_QUOTING, _("Text ended just after a '\\' character." " (The text was '%s')"), command_line); else g_set_error (error, G_SHELL_ERROR, G_SHELL_ERROR_BAD_QUOTING, _("Text ended before matching quote was found for %c." " (The text was '%s')"), current_quote, command_line); goto error; } if (retval == NULL) { g_set_error_literal (error, G_SHELL_ERROR, G_SHELL_ERROR_EMPTY_STRING, _("Text was empty (or contained only whitespace)")); goto error; } /* we appended backward */ retval = g_slist_reverse (retval); return retval; error: g_assert (error == NULL || *error != NULL); g_slist_free_full (retval, g_free); return NULL; } /** * g_shell_parse_argv: * @command_line: command line to parse * @argcp: (out): return location for number of args * @argvp: (out) (array length=argcp zero-terminated=1): return location for array of args * @error: return location for error * * Parses a command line into an argument vector, in much the same way * the shell would, but without many of the expansions the shell would * perform (variable expansion, globs, operators, filename expansion, * etc. are not supported). The results are defined to be the same as * those you would get from a UNIX98 /bin/sh, as long as the input * contains none of the unsupported shell expansions. If the input * does contain such expansions, they are passed through * literally. Possible errors are those from the #G_SHELL_ERROR * domain. Free the returned vector with g_strfreev(). * * Return value: %TRUE on success, %FALSE if error set **/ gboolean g_shell_parse_argv (const gchar *command_line, gint *argcp, gchar ***argvp, GError **error) { /* Code based on poptParseArgvString() from libpopt */ gint argc = 0; gchar **argv = NULL; GSList *tokens = NULL; gint i; GSList *tmp_list; g_return_val_if_fail (command_line != NULL, FALSE); tokens = tokenize_command_line (command_line, error); if (tokens == NULL) return FALSE; /* Because we can't have introduced any new blank space into the * tokens (we didn't do any new expansions), we don't need to * perform field splitting. If we were going to honor IFS or do any * expansions, we would have to do field splitting on each word * here. Also, if we were going to do any expansion we would need to * remove any zero-length words that didn't contain quotes * originally; but since there's no expansion we know all words have * nonzero length, unless they contain quotes. * * So, we simply remove quotes, and don't do any field splitting or * empty word removal, since we know there was no way to introduce * such things. */ argc = g_slist_length (tokens); argv = g_new0 (gchar*, argc + 1); i = 0; tmp_list = tokens; while (tmp_list) { argv[i] = g_shell_unquote (tmp_list->data, error); /* Since we already checked that quotes matched up in the * tokenizer, this shouldn't be possible to reach I guess. */ if (argv[i] == NULL) goto failed; tmp_list = g_slist_next (tmp_list); ++i; } g_slist_free_full (tokens, g_free); if (argcp) *argcp = argc; if (argvp) *argvp = argv; else g_strfreev (argv); return TRUE; failed: g_assert (error == NULL || *error != NULL); g_strfreev (argv); g_slist_free_full (tokens, g_free); return FALSE; } pkg-config-0.29.1/glib/glib/gdatetime.h0000664000175000017500000002753112651243552014535 00000000000000/* * Copyright (C) 2009-2010 Christian Hergert * Copyright © 2010 Codethink Limited * * This library is free software; you can redistribute it 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 * licence, or (at your option) any later version. * * This is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public * License for more details. * * You should 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. * * Authors: Christian Hergert * Thiago Santos * Emmanuele Bassi * Ryan Lortie */ #ifndef __G_DATE_TIME_H__ #define __G_DATE_TIME_H__ #if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) #error "Only can be included directly." #endif #include G_BEGIN_DECLS /** * G_TIME_SPAN_DAY: * * Evaluates to a time span of one day. * * Since: 2.26 */ #define G_TIME_SPAN_DAY (G_GINT64_CONSTANT (86400000000)) /** * G_TIME_SPAN_HOUR: * * Evaluates to a time span of one hour. * * Since: 2.26 */ #define G_TIME_SPAN_HOUR (G_GINT64_CONSTANT (3600000000)) /** * G_TIME_SPAN_MINUTE: * * Evaluates to a time span of one minute. * * Since: 2.26 */ #define G_TIME_SPAN_MINUTE (G_GINT64_CONSTANT (60000000)) /** * G_TIME_SPAN_SECOND: * * Evaluates to a time span of one second. * * Since: 2.26 */ #define G_TIME_SPAN_SECOND (G_GINT64_CONSTANT (1000000)) /** * G_TIME_SPAN_MILLISECOND: * * Evaluates to a time span of one millisecond. * * Since: 2.26 */ #define G_TIME_SPAN_MILLISECOND (G_GINT64_CONSTANT (1000)) /** * GTimeSpan: * * A value representing an interval of time, in microseconds. * * Since: 2.26 */ typedef gint64 GTimeSpan; /** * GDateTime: * * GDateTime is an opaque structure whose members * cannot be accessed directly. * * Since: 2.26 */ 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, gint day, 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, gint hour, 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, gint months, gint days, gint hours, 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; G_END_DECLS #endif /* __G_DATE_TIME_H__ */ pkg-config-0.29.1/glib/glib/gthread-win32.c0000664000175000017500000006262112651243552015142 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * gthread.c: solaris thread system implementation * Copyright 1998-2001 Sebastian Wilhelmi; University of Karlsruhe * Copyright 2001 Hans Breuer * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the GLib Team and others 1997-2000. See the AUTHORS * file for a list of people on the GLib Team. See the ChangeLog * files for a list of changes. These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/. */ /* The GMutex and GCond implementations in this file are some of the * lowest-level code in GLib. All other parts of GLib (messages, * memory, slices, etc) assume that they can freely use these facilities * without risking recursion. * * As such, these functions are NOT permitted to call any other part of * GLib. * * The thread manipulation functions (create, exit, join, etc.) have * more freedom -- they can do as they please. */ #include "config.h" #include "glib.h" #include "glib-init.h" #include "gthread.h" #include "gthreadprivate.h" #include "gslice.h" #include #include #include #include static void g_thread_abort (gint status, const gchar *function) { fprintf (stderr, "GLib (gthread-win32.c): Unexpected error from C library during '%s': %s. Aborting.\n", strerror (status), function); abort (); } /* Starting with Vista and Windows 2008, we have access to the * CONDITION_VARIABLE and SRWLock primatives on Windows, which are * pretty reasonable approximations of the primatives specified in * POSIX 2001 (pthread_cond_t and pthread_mutex_t respectively). * * Both of these types are structs containing a single pointer. That * pointer is used as an atomic bitfield to support user-space mutexes * that only get the kernel involved in cases of contention (similar * to how futex()-based mutexes work on Linux). The biggest advantage * of these new types is that they can be statically initialised to * zero. That means that they are completely ABI compatible with our * GMutex and GCond APIs. * * Unfortunately, Windows XP lacks these facilities and GLib still * needs to support Windows XP. Our approach here is as follows: * * - avoid depending on structure declarations at compile-time by * declaring our own GMutex and GCond strutures to be * ABI-compatible with SRWLock and CONDITION_VARIABLE and using * those instead * * - avoid a hard dependency on the symbols used to manipulate these * structures by doing a dynamic lookup of those symbols at * runtime * * - if the symbols are not available, emulate them using other * primatives * * Using this approach also allows us to easily build a GLib that lacks * support for Windows XP or to remove this code entirely when XP is no * longer supported (end of line is currently April 8, 2014). */ typedef struct { void (__stdcall * CallThisOnThreadExit) (void); /* fake */ void (__stdcall * InitializeSRWLock) (gpointer lock); void (__stdcall * DeleteSRWLock) (gpointer lock); /* fake */ void (__stdcall * AcquireSRWLockExclusive) (gpointer lock); BOOLEAN (__stdcall * TryAcquireSRWLockExclusive) (gpointer lock); void (__stdcall * ReleaseSRWLockExclusive) (gpointer lock); void (__stdcall * AcquireSRWLockShared) (gpointer lock); BOOLEAN (__stdcall * TryAcquireSRWLockShared) (gpointer lock); void (__stdcall * ReleaseSRWLockShared) (gpointer lock); void (__stdcall * InitializeConditionVariable) (gpointer cond); void (__stdcall * DeleteConditionVariable) (gpointer cond); /* fake */ BOOL (__stdcall * SleepConditionVariableSRW) (gpointer cond, gpointer lock, DWORD timeout, ULONG flags); void (__stdcall * WakeAllConditionVariable) (gpointer cond); void (__stdcall * WakeConditionVariable) (gpointer cond); } GThreadImplVtable; static GThreadImplVtable g_thread_impl_vtable; /* {{{1 GMutex */ void g_mutex_init (GMutex *mutex) { g_thread_impl_vtable.InitializeSRWLock (mutex); } void g_mutex_clear (GMutex *mutex) { if (g_thread_impl_vtable.DeleteSRWLock != NULL) g_thread_impl_vtable.DeleteSRWLock (mutex); } void g_mutex_lock (GMutex *mutex) { g_thread_impl_vtable.AcquireSRWLockExclusive (mutex); } gboolean g_mutex_trylock (GMutex *mutex) { return g_thread_impl_vtable.TryAcquireSRWLockExclusive (mutex); } void g_mutex_unlock (GMutex *mutex) { g_thread_impl_vtable.ReleaseSRWLockExclusive (mutex); } /* {{{1 GRecMutex */ static CRITICAL_SECTION * g_rec_mutex_impl_new (void) { CRITICAL_SECTION *cs; cs = g_slice_new (CRITICAL_SECTION); InitializeCriticalSection (cs); return cs; } static void g_rec_mutex_impl_free (CRITICAL_SECTION *cs) { DeleteCriticalSection (cs); g_slice_free (CRITICAL_SECTION, cs); } static CRITICAL_SECTION * g_rec_mutex_get_impl (GRecMutex *mutex) { CRITICAL_SECTION *impl = mutex->p; if G_UNLIKELY (mutex->p == NULL) { impl = g_rec_mutex_impl_new (); if (InterlockedCompareExchangePointer (&mutex->p, impl, NULL) != NULL) g_rec_mutex_impl_free (impl); impl = mutex->p; } return impl; } void g_rec_mutex_init (GRecMutex *mutex) { mutex->p = g_rec_mutex_impl_new (); } void g_rec_mutex_clear (GRecMutex *mutex) { g_rec_mutex_impl_free (mutex->p); } void g_rec_mutex_lock (GRecMutex *mutex) { EnterCriticalSection (g_rec_mutex_get_impl (mutex)); } void g_rec_mutex_unlock (GRecMutex *mutex) { LeaveCriticalSection (mutex->p); } gboolean g_rec_mutex_trylock (GRecMutex *mutex) { return TryEnterCriticalSection (g_rec_mutex_get_impl (mutex)); } /* {{{1 GRWLock */ void g_rw_lock_init (GRWLock *lock) { g_thread_impl_vtable.InitializeSRWLock (lock); } void g_rw_lock_clear (GRWLock *lock) { if (g_thread_impl_vtable.DeleteSRWLock != NULL) g_thread_impl_vtable.DeleteSRWLock (lock); } void g_rw_lock_writer_lock (GRWLock *lock) { g_thread_impl_vtable.AcquireSRWLockExclusive (lock); } gboolean g_rw_lock_writer_trylock (GRWLock *lock) { return g_thread_impl_vtable.TryAcquireSRWLockExclusive (lock); } void g_rw_lock_writer_unlock (GRWLock *lock) { g_thread_impl_vtable.ReleaseSRWLockExclusive (lock); } void g_rw_lock_reader_lock (GRWLock *lock) { g_thread_impl_vtable.AcquireSRWLockShared (lock); } gboolean g_rw_lock_reader_trylock (GRWLock *lock) { return g_thread_impl_vtable.TryAcquireSRWLockShared (lock); } void g_rw_lock_reader_unlock (GRWLock *lock) { g_thread_impl_vtable.ReleaseSRWLockShared (lock); } /* {{{1 GCond */ void g_cond_init (GCond *cond) { g_thread_impl_vtable.InitializeConditionVariable (cond); } void g_cond_clear (GCond *cond) { if (g_thread_impl_vtable.DeleteConditionVariable) g_thread_impl_vtable.DeleteConditionVariable (cond); } void g_cond_signal (GCond *cond) { g_thread_impl_vtable.WakeConditionVariable (cond); } void g_cond_broadcast (GCond *cond) { g_thread_impl_vtable.WakeAllConditionVariable (cond); } void g_cond_wait (GCond *cond, GMutex *entered_mutex) { g_thread_impl_vtable.SleepConditionVariableSRW (cond, entered_mutex, INFINITE, 0); } gboolean g_cond_wait_until (GCond *cond, GMutex *entered_mutex, gint64 end_time) { gint64 span; span = end_time - g_get_monotonic_time (); if G_UNLIKELY (span < 0) span = 0; if G_UNLIKELY (span > G_GINT64_CONSTANT (1000) * G_MAXINT32) span = INFINITE; return g_thread_impl_vtable.SleepConditionVariableSRW (cond, entered_mutex, span / 1000, 0); } /* {{{1 GPrivate */ typedef struct _GPrivateDestructor GPrivateDestructor; struct _GPrivateDestructor { DWORD index; GDestroyNotify notify; GPrivateDestructor *next; }; static GPrivateDestructor * volatile g_private_destructors; static CRITICAL_SECTION g_private_lock; static DWORD g_private_get_impl (GPrivate *key) { DWORD impl = (DWORD) key->p; if G_UNLIKELY (impl == 0) { EnterCriticalSection (&g_private_lock); impl = (DWORD) key->p; if (impl == 0) { GPrivateDestructor *destructor; impl = TlsAlloc (); if (impl == TLS_OUT_OF_INDEXES) g_thread_abort (0, "TlsAlloc"); if (key->notify != NULL) { destructor = malloc (sizeof (GPrivateDestructor)); if G_UNLIKELY (destructor == NULL) g_thread_abort (errno, "malloc"); destructor->index = impl; destructor->notify = key->notify; destructor->next = g_private_destructors; /* We need to do an atomic store due to the unlocked * access to the destructor list from the thread exit * function. * * It can double as a sanity check... */ if (InterlockedCompareExchangePointer (&g_private_destructors, destructor, destructor->next) != destructor->next) g_thread_abort (0, "g_private_get_impl(1)"); } /* Ditto, due to the unlocked access on the fast path */ if (InterlockedCompareExchangePointer (&key->p, impl, NULL) != NULL) g_thread_abort (0, "g_private_get_impl(2)"); } LeaveCriticalSection (&g_private_lock); } return impl; } gpointer g_private_get (GPrivate *key) { return TlsGetValue (g_private_get_impl (key)); } void g_private_set (GPrivate *key, gpointer value) { TlsSetValue (g_private_get_impl (key), value); } void g_private_replace (GPrivate *key, gpointer value) { DWORD impl = g_private_get_impl (key); gpointer old; old = TlsGetValue (impl); if (old && key->notify) key->notify (old); TlsSetValue (impl, value); } /* {{{1 GThread */ #define win32_check_for_error(what) G_STMT_START{ \ if (!(what)) \ g_error ("file %s: line %d (%s): error %s during %s", \ __FILE__, __LINE__, G_STRFUNC, \ g_win32_error_message (GetLastError ()), #what); \ }G_STMT_END #define G_MUTEX_SIZE (sizeof (gpointer)) typedef BOOL (__stdcall *GTryEnterCriticalSectionFunc) (CRITICAL_SECTION *); typedef struct { GRealThread thread; GThreadFunc proxy; HANDLE handle; } GThreadWin32; void g_system_thread_free (GRealThread *thread) { GThreadWin32 *wt = (GThreadWin32 *) thread; win32_check_for_error (CloseHandle (wt->handle)); g_slice_free (GThreadWin32, wt); } void g_system_thread_exit (void) { _endthreadex (0); } static guint __stdcall g_thread_win32_proxy (gpointer data) { GThreadWin32 *self = data; self->proxy (self); g_system_thread_exit (); g_assert_not_reached (); return 0; } GRealThread * g_system_thread_new (GThreadFunc func, gulong stack_size, GError **error) { GThreadWin32 *thread; guint ignore; thread = g_slice_new0 (GThreadWin32); thread->proxy = func; thread->handle = (HANDLE) _beginthreadex (NULL, stack_size, g_thread_win32_proxy, thread, 0, &ignore); if (thread->handle == NULL) { gchar *win_error = g_win32_error_message (GetLastError ()); g_set_error (error, G_THREAD_ERROR, G_THREAD_ERROR_AGAIN, "Error creating thread: %s", win_error); g_free (win_error); g_slice_free (GThreadWin32, thread); return NULL; } return (GRealThread *) thread; } void g_thread_yield (void) { Sleep(0); } void g_system_thread_wait (GRealThread *thread) { GThreadWin32 *wt = (GThreadWin32 *) thread; win32_check_for_error (WAIT_FAILED != WaitForSingleObject (wt->handle, INFINITE)); } void g_system_thread_set_name (const gchar *name) { /* FIXME: implement */ } /* {{{1 SRWLock and CONDITION_VARIABLE emulation (for Windows XP) */ static CRITICAL_SECTION g_thread_xp_lock; static DWORD g_thread_xp_waiter_tls; /* {{{2 GThreadWaiter utility class for CONDITION_VARIABLE emulation */ typedef struct _GThreadXpWaiter GThreadXpWaiter; struct _GThreadXpWaiter { HANDLE event; volatile GThreadXpWaiter *next; volatile GThreadXpWaiter **my_owner; }; static GThreadXpWaiter * g_thread_xp_waiter_get (void) { GThreadXpWaiter *waiter; waiter = TlsGetValue (g_thread_xp_waiter_tls); if G_UNLIKELY (waiter == NULL) { waiter = malloc (sizeof (GThreadXpWaiter)); if (waiter == NULL) g_thread_abort (GetLastError (), "malloc"); waiter->event = CreateEvent (0, FALSE, FALSE, NULL); if (waiter->event == NULL) g_thread_abort (GetLastError (), "CreateEvent"); waiter->my_owner = NULL; TlsSetValue (g_thread_xp_waiter_tls, waiter); } return waiter; } static void __stdcall g_thread_xp_CallThisOnThreadExit (void) { GThreadXpWaiter *waiter; waiter = TlsGetValue (g_thread_xp_waiter_tls); if (waiter != NULL) { TlsSetValue (g_thread_xp_waiter_tls, NULL); CloseHandle (waiter->event); free (waiter); } } /* {{{2 SRWLock emulation */ typedef struct { CRITICAL_SECTION writer_lock; gboolean ever_shared; /* protected by writer_lock */ gboolean writer_locked; /* protected by writer_lock */ /* below is only ever touched if ever_shared becomes true */ CRITICAL_SECTION atomicity; GThreadXpWaiter *queued_writer; /* protected by atomicity lock */ gint num_readers; /* protected by atomicity lock */ } GThreadSRWLock; static void __stdcall g_thread_xp_InitializeSRWLock (gpointer mutex) { *(GThreadSRWLock * volatile *) mutex = NULL; } static void __stdcall g_thread_xp_DeleteSRWLock (gpointer mutex) { GThreadSRWLock *lock = *(GThreadSRWLock * volatile *) mutex; if (lock) { if (lock->ever_shared) DeleteCriticalSection (&lock->atomicity); DeleteCriticalSection (&lock->writer_lock); free (lock); } } static GThreadSRWLock * __stdcall g_thread_xp_get_srwlock (GThreadSRWLock * volatile *lock) { GThreadSRWLock *result; /* It looks like we're missing some barriers here, but this code only * ever runs on Windows XP, which in turn only ever runs on hardware * with a relatively rigid memory model. The 'volatile' will take * care of the compiler. */ result = *lock; if G_UNLIKELY (result == NULL) { EnterCriticalSection (&g_thread_xp_lock); /* Check again */ result = *lock; if (result == NULL) { result = malloc (sizeof (GThreadSRWLock)); if (result == NULL) g_thread_abort (errno, "malloc"); InitializeCriticalSection (&result->writer_lock); result->writer_locked = FALSE; result->ever_shared = FALSE; *lock = result; } LeaveCriticalSection (&g_thread_xp_lock); } return result; } static void __stdcall g_thread_xp_AcquireSRWLockExclusive (gpointer mutex) { GThreadSRWLock *lock = g_thread_xp_get_srwlock (mutex); EnterCriticalSection (&lock->writer_lock); /* CRITICAL_SECTION is reentrant, but SRWLock is not. * Detect the deadlock that would occur on later Windows version. */ g_assert (!lock->writer_locked); lock->writer_locked = TRUE; if (lock->ever_shared) { GThreadXpWaiter *waiter = NULL; EnterCriticalSection (&lock->atomicity); if (lock->num_readers > 0) lock->queued_writer = waiter = g_thread_xp_waiter_get (); LeaveCriticalSection (&lock->atomicity); if (waiter != NULL) WaitForSingleObject (waiter->event, INFINITE); lock->queued_writer = NULL; } } static BOOLEAN __stdcall g_thread_xp_TryAcquireSRWLockExclusive (gpointer mutex) { GThreadSRWLock *lock = g_thread_xp_get_srwlock (mutex); if (!TryEnterCriticalSection (&lock->writer_lock)) return FALSE; /* CRITICAL_SECTION is reentrant, but SRWLock is not. * Ensure that this properly returns FALSE (as SRWLock would). */ if G_UNLIKELY (lock->writer_locked) { LeaveCriticalSection (&lock->writer_lock); return FALSE; } lock->writer_locked = TRUE; if (lock->ever_shared) { gboolean available; EnterCriticalSection (&lock->atomicity); available = lock->num_readers == 0; LeaveCriticalSection (&lock->atomicity); if (!available) { LeaveCriticalSection (&lock->writer_lock); return FALSE; } } return TRUE; } static void __stdcall g_thread_xp_ReleaseSRWLockExclusive (gpointer mutex) { GThreadSRWLock *lock = *(GThreadSRWLock * volatile *) mutex; lock->writer_locked = FALSE; /* We need this until we fix some weird parts of GLib that try to * unlock freshly-allocated mutexes. */ if (lock != NULL) LeaveCriticalSection (&lock->writer_lock); } static void g_thread_xp_srwlock_become_reader (GThreadSRWLock *lock) { if G_UNLIKELY (!lock->ever_shared) { InitializeCriticalSection (&lock->atomicity); lock->queued_writer = NULL; lock->num_readers = 0; lock->ever_shared = TRUE; } EnterCriticalSection (&lock->atomicity); lock->num_readers++; LeaveCriticalSection (&lock->atomicity); } static void __stdcall g_thread_xp_AcquireSRWLockShared (gpointer mutex) { GThreadSRWLock *lock = g_thread_xp_get_srwlock (mutex); EnterCriticalSection (&lock->writer_lock); /* See g_thread_xp_AcquireSRWLockExclusive */ g_assert (!lock->writer_locked); g_thread_xp_srwlock_become_reader (lock); LeaveCriticalSection (&lock->writer_lock); } static BOOLEAN __stdcall g_thread_xp_TryAcquireSRWLockShared (gpointer mutex) { GThreadSRWLock *lock = g_thread_xp_get_srwlock (mutex); if (!TryEnterCriticalSection (&lock->writer_lock)) return FALSE; /* See g_thread_xp_AcquireSRWLockExclusive */ if G_UNLIKELY (lock->writer_locked) { LeaveCriticalSection (&lock->writer_lock); return FALSE; } g_thread_xp_srwlock_become_reader (lock); LeaveCriticalSection (&lock->writer_lock); return TRUE; } static void __stdcall g_thread_xp_ReleaseSRWLockShared (gpointer mutex) { GThreadSRWLock *lock = g_thread_xp_get_srwlock (mutex); EnterCriticalSection (&lock->atomicity); lock->num_readers--; if (lock->num_readers == 0 && lock->queued_writer) SetEvent (lock->queued_writer->event); LeaveCriticalSection (&lock->atomicity); } /* {{{2 CONDITION_VARIABLE emulation */ typedef struct { volatile GThreadXpWaiter *first; volatile GThreadXpWaiter **last_ptr; } GThreadXpCONDITION_VARIABLE; static void __stdcall g_thread_xp_InitializeConditionVariable (gpointer cond) { *(GThreadXpCONDITION_VARIABLE * volatile *) cond = NULL; } static void __stdcall g_thread_xp_DeleteConditionVariable (gpointer cond) { GThreadXpCONDITION_VARIABLE *cv = *(GThreadXpCONDITION_VARIABLE * volatile *) cond; if (cv) free (cv); } static GThreadXpCONDITION_VARIABLE * __stdcall g_thread_xp_get_condition_variable (GThreadXpCONDITION_VARIABLE * volatile *cond) { GThreadXpCONDITION_VARIABLE *result; /* It looks like we're missing some barriers here, but this code only * ever runs on Windows XP, which in turn only ever runs on hardware * with a relatively rigid memory model. The 'volatile' will take * care of the compiler. */ result = *cond; if G_UNLIKELY (result == NULL) { result = malloc (sizeof (GThreadXpCONDITION_VARIABLE)); if (result == NULL) g_thread_abort (errno, "malloc"); result->first = NULL; result->last_ptr = &result->first; if (InterlockedCompareExchangePointer (cond, result, NULL) != NULL) { free (result); result = *cond; } } return result; } static BOOL __stdcall g_thread_xp_SleepConditionVariableSRW (gpointer cond, gpointer mutex, DWORD timeout, ULONG flags) { GThreadXpCONDITION_VARIABLE *cv = g_thread_xp_get_condition_variable (cond); GThreadXpWaiter *waiter = g_thread_xp_waiter_get (); DWORD status; waiter->next = NULL; EnterCriticalSection (&g_thread_xp_lock); waiter->my_owner = cv->last_ptr; *cv->last_ptr = waiter; cv->last_ptr = &waiter->next; LeaveCriticalSection (&g_thread_xp_lock); g_mutex_unlock (mutex); status = WaitForSingleObject (waiter->event, timeout); if (status != WAIT_TIMEOUT && status != WAIT_OBJECT_0) g_thread_abort (GetLastError (), "WaitForSingleObject"); g_mutex_lock (mutex); if (status == WAIT_TIMEOUT) { EnterCriticalSection (&g_thread_xp_lock); if (waiter->my_owner) { if (waiter->next) waiter->next->my_owner = waiter->my_owner; else cv->last_ptr = waiter->my_owner; *waiter->my_owner = waiter->next; waiter->my_owner = NULL; } LeaveCriticalSection (&g_thread_xp_lock); } return status == WAIT_OBJECT_0; } static void __stdcall g_thread_xp_WakeConditionVariable (gpointer cond) { GThreadXpCONDITION_VARIABLE *cv = g_thread_xp_get_condition_variable (cond); volatile GThreadXpWaiter *waiter; EnterCriticalSection (&g_thread_xp_lock); waiter = cv->first; if (waiter != NULL) { waiter->my_owner = NULL; cv->first = waiter->next; if (cv->first != NULL) cv->first->my_owner = &cv->first; else cv->last_ptr = &cv->first; } if (waiter != NULL) SetEvent (waiter->event); LeaveCriticalSection (&g_thread_xp_lock); } static void __stdcall g_thread_xp_WakeAllConditionVariable (gpointer cond) { GThreadXpCONDITION_VARIABLE *cv = g_thread_xp_get_condition_variable (cond); volatile GThreadXpWaiter *waiter; EnterCriticalSection (&g_thread_xp_lock); waiter = cv->first; cv->first = NULL; cv->last_ptr = &cv->first; while (waiter != NULL) { volatile GThreadXpWaiter *next; next = waiter->next; SetEvent (waiter->event); waiter->my_owner = NULL; waiter = next; } LeaveCriticalSection (&g_thread_xp_lock); } /* {{{2 XP Setup */ static void g_thread_xp_init (void) { static const GThreadImplVtable g_thread_xp_impl_vtable = { g_thread_xp_CallThisOnThreadExit, g_thread_xp_InitializeSRWLock, g_thread_xp_DeleteSRWLock, g_thread_xp_AcquireSRWLockExclusive, g_thread_xp_TryAcquireSRWLockExclusive, g_thread_xp_ReleaseSRWLockExclusive, g_thread_xp_AcquireSRWLockShared, g_thread_xp_TryAcquireSRWLockShared, g_thread_xp_ReleaseSRWLockShared, g_thread_xp_InitializeConditionVariable, g_thread_xp_DeleteConditionVariable, g_thread_xp_SleepConditionVariableSRW, g_thread_xp_WakeAllConditionVariable, g_thread_xp_WakeConditionVariable }; InitializeCriticalSection (&g_thread_xp_lock); g_thread_xp_waiter_tls = TlsAlloc (); g_thread_impl_vtable = g_thread_xp_impl_vtable; } /* {{{1 Epilogue */ static gboolean g_thread_lookup_native_funcs (void) { GThreadImplVtable native_vtable = { 0, }; HMODULE kernel32; kernel32 = GetModuleHandle ("KERNEL32.DLL"); if (kernel32 == NULL) return FALSE; #define GET_FUNC(name) if ((native_vtable.name = (void *) GetProcAddress (kernel32, #name)) == NULL) return FALSE GET_FUNC(InitializeSRWLock); GET_FUNC(AcquireSRWLockExclusive); GET_FUNC(TryAcquireSRWLockExclusive); GET_FUNC(ReleaseSRWLockExclusive); GET_FUNC(AcquireSRWLockShared); GET_FUNC(TryAcquireSRWLockShared); GET_FUNC(ReleaseSRWLockShared); GET_FUNC(InitializeConditionVariable); GET_FUNC(SleepConditionVariableSRW); GET_FUNC(WakeAllConditionVariable); GET_FUNC(WakeConditionVariable); #undef GET_FUNC g_thread_impl_vtable = native_vtable; return TRUE; } void g_thread_win32_init (void) { if (!g_thread_lookup_native_funcs ()) g_thread_xp_init (); InitializeCriticalSection (&g_private_lock); } void g_thread_win32_thread_detach (void) { gboolean dtors_called; do { GPrivateDestructor *dtor; /* We go by the POSIX book on this one. * * If we call a destructor then there is a chance that some new * TLS variables got set by code called in that destructor. * * Loop until nothing is left. */ dtors_called = FALSE; for (dtor = g_private_destructors; dtor; dtor = dtor->next) { gpointer value; value = TlsGetValue (dtor->index); if (value != NULL && dtor->notify != NULL) { /* POSIX says to clear this before the call */ TlsSetValue (dtor->index, NULL); dtor->notify (value); dtors_called = TRUE; } } } while (dtors_called); if (g_thread_impl_vtable.CallThisOnThreadExit) g_thread_impl_vtable.CallThisOnThreadExit (); } /* vim:set foldmethod=marker: */ pkg-config-0.29.1/glib/glib/gsequence.c0000664000175000017500000014172412651243552014545 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007 * Soeren Sandmann (sandmann@daimi.au.dk) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "config.h" #include "gsequence.h" #include "gmem.h" #include "gtestutils.h" #include "gslice.h" /** * SECTION:sequence * @title: Sequences * @short_description: scalable lists * * The #GSequence data structure has the API of a list, but is * implemented internally with a balanced binary tree. This means that * it is possible to maintain a sorted list of n elements in time O(n * log n). The data contained in each element can be either integer * values, by using of the Type Conversion Macros, * or simply pointers to any type of data. * * A #GSequence is accessed through iterators, * represented by a #GSequenceIter. An iterator represents a position * between two elements of the sequence. For example, the * begin iterator represents the gap immediately * before the first element of the sequence, and the * end iterator represents the gap immediately * after the last element. In an empty sequence, the begin and end * iterators are the same. * * Some methods on #GSequence operate on ranges of items. For example * g_sequence_foreach_range() will call a user-specified function on * each element with the given range. The range is delimited by the * gaps represented by the passed-in iterators, so if you pass in the * begin and end iterators, the range in question is the entire * sequence. * * The function g_sequence_get() is used with an iterator to access the * element immediately following the gap that the iterator represents. * The iterator is said to point to that element. * * Iterators are stable across most operations on a #GSequence. For * example an iterator pointing to some element of a sequence will * continue to point to that element even after the sequence is sorted. * Even moving an element to another sequence using for example * g_sequence_move_range() will not invalidate the iterators pointing * to it. The only operation that will invalidate an iterator is when * the element it points to is removed from any sequence. **/ /** * GSequenceIter: * * The #GSequenceIter struct is an opaque data type representing an * iterator pointing into a #GSequence. **/ /** * GSequenceIterCompareFunc: * @a: a #GSequenceIter * @b: a #GSequenceIter * @data: user data * * 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; /** * GSequence: * * The #GSequence struct is an opaque data type representing a * Sequence data type. **/ struct _GSequence { GSequenceNode * end_node; GDestroyNotify data_destroy_notify; gboolean access_prohibited; /* The 'real_sequence' is used when temporary sequences are created * to hold nodes that are being rearranged. The 'real_sequence' of such * a temporary sequence points to the sequence that is actually being * manipulated. The only reason we need this is so that when the * sort/sort_changed/search_iter() functions call out to the application * g_sequence_iter_get_sequence() will return the correct sequence. */ GSequence * real_sequence; }; struct _GSequenceNode { gint n_nodes; GSequenceNode * parent; GSequenceNode * left; GSequenceNode * right; gpointer data; /* For the end node, this field points * to the sequence */ }; /* * Declaration of GSequenceNode methods */ static GSequenceNode *node_new (gpointer data); static GSequenceNode *node_get_first (GSequenceNode *node); static GSequenceNode *node_get_last (GSequenceNode *node); static GSequenceNode *node_get_prev (GSequenceNode *node); static GSequenceNode *node_get_next (GSequenceNode *node); static gint node_get_pos (GSequenceNode *node); static GSequenceNode *node_get_by_pos (GSequenceNode *node, gint pos); static GSequenceNode *node_find (GSequenceNode *haystack, GSequenceNode *needle, GSequenceNode *end, GSequenceIterCompareFunc cmp, gpointer user_data); static GSequenceNode *node_find_closest (GSequenceNode *haystack, GSequenceNode *needle, GSequenceNode *end, GSequenceIterCompareFunc cmp, gpointer user_data); static gint node_get_length (GSequenceNode *node); static void node_free (GSequenceNode *node, GSequence *seq); static void node_cut (GSequenceNode *split); static void node_insert_before (GSequenceNode *node, GSequenceNode *new); static void node_unlink (GSequenceNode *node); static void node_join (GSequenceNode *left, GSequenceNode *right); static void node_insert_sorted (GSequenceNode *node, GSequenceNode *new, GSequenceNode *end, GSequenceIterCompareFunc cmp_func, gpointer cmp_data); /* * Various helper functions */ static void check_seq_access (GSequence *seq) { if (G_UNLIKELY (seq->access_prohibited)) { g_warning ("Accessing a sequence while it is " "being sorted or searched is not allowed"); } } static GSequence * get_sequence (GSequenceNode *node) { return (GSequence *)node_get_last (node)->data; } static void check_iter_access (GSequenceIter *iter) { check_seq_access (get_sequence (iter)); } static gboolean is_end (GSequenceIter *iter) { GSequence *seq; if (iter->right) return FALSE; if (!iter->parent) return TRUE; if (iter->parent->right != iter) return FALSE; seq = get_sequence (iter); return seq->end_node == iter; } typedef struct { GCompareDataFunc cmp_func; gpointer cmp_data; GSequenceNode *end_node; } SortInfo; /* This function compares two iters using a normal compare * function and user_data passed in in a SortInfo struct */ static gint iter_compare (GSequenceIter *node1, GSequenceIter *node2, gpointer data) { const SortInfo *info = data; gint retval; if (node1 == info->end_node) return 1; if (node2 == info->end_node) return -1; retval = info->cmp_func (node1->data, node2->data, info->cmp_data); return retval; } /* * Public API */ /** * g_sequence_new: * @data_destroy: (allow-none): a #GDestroyNotify function, or %NULL * * Creates a new GSequence. The @data_destroy function, if non-%NULL will * be called on all items when the sequence is destroyed and on items that * are removed from the sequence. * * Return value: a new #GSequence * * Since: 2.14 **/ GSequence * g_sequence_new (GDestroyNotify data_destroy) { GSequence *seq = g_new (GSequence, 1); seq->data_destroy_notify = data_destroy; seq->end_node = node_new (seq); seq->access_prohibited = FALSE; seq->real_sequence = seq; return seq; } /** * g_sequence_free: * @seq: a #GSequence * * Frees the memory allocated for @seq. If @seq has a data destroy * function associated with it, that function is called on all items in * @seq. * * Since: 2.14 **/ void g_sequence_free (GSequence *seq) { g_return_if_fail (seq != NULL); check_seq_access (seq); node_free (seq->end_node, seq); g_free (seq); } /** * g_sequence_foreach_range: * @begin: a #GSequenceIter * @end: a #GSequenceIter * @func: a #GFunc * @user_data: user data passed to @func * * Calls @func for each item in the range (@begin, @end) passing * @user_data to the function. * * Since: 2.14 **/ void g_sequence_foreach_range (GSequenceIter *begin, GSequenceIter *end, GFunc func, gpointer user_data) { GSequence *seq; GSequenceIter *iter; g_return_if_fail (func != NULL); g_return_if_fail (begin != NULL); g_return_if_fail (end != NULL); seq = get_sequence (begin); seq->access_prohibited = TRUE; iter = begin; while (iter != end) { GSequenceIter *next = node_get_next (iter); func (iter->data, user_data); iter = next; } seq->access_prohibited = FALSE; } /** * g_sequence_foreach: * @seq: a #GSequence * @func: the function to call for each item in @seq * @user_data: user data passed to @func * * Calls @func for each item in the sequence passing @user_data * to the function. * * Since: 2.14 **/ void g_sequence_foreach (GSequence *seq, GFunc func, gpointer user_data) { GSequenceIter *begin, *end; check_seq_access (seq); begin = g_sequence_get_begin_iter (seq); end = g_sequence_get_end_iter (seq); g_sequence_foreach_range (begin, end, func, user_data); } /** * g_sequence_range_get_midpoint: * @begin: a #GSequenceIter * @end: a #GSequenceIter * * Finds an iterator somewhere in the range (@begin, @end). This * iterator will be close to the middle of the range, but is not * guaranteed to be exactly in the middle. * * The @begin and @end iterators must both point to the same sequence and * @begin must come before or be equal to @end in the sequence. * * Return value: A #GSequenceIter pointing somewhere in the * (@begin, @end) range. * * Since: 2.14 **/ GSequenceIter * g_sequence_range_get_midpoint (GSequenceIter *begin, GSequenceIter *end) { int begin_pos, end_pos, mid_pos; g_return_val_if_fail (begin != NULL, NULL); g_return_val_if_fail (end != NULL, NULL); g_return_val_if_fail (get_sequence (begin) == get_sequence (end), NULL); begin_pos = node_get_pos (begin); end_pos = node_get_pos (end); g_return_val_if_fail (end_pos >= begin_pos, NULL); mid_pos = begin_pos + (end_pos - begin_pos) / 2; return node_get_by_pos (begin, mid_pos); } /** * g_sequence_iter_compare: * @a: a #GSequenceIter * @b: a #GSequenceIter * * Returns a negative number if @a comes before @b, 0 if they are equal, * and a positive number if @a comes after @b. * * The @a and @b iterators must point into the same sequence. * * Return value: A negative number if @a comes before @b, 0 if they are * equal, and a positive number if @a comes after @b. * * Since: 2.14 **/ gint g_sequence_iter_compare (GSequenceIter *a, GSequenceIter *b) { gint a_pos, b_pos; g_return_val_if_fail (a != NULL, 0); g_return_val_if_fail (b != NULL, 0); g_return_val_if_fail (get_sequence (a) == get_sequence (b), 0); check_iter_access (a); check_iter_access (b); a_pos = node_get_pos (a); b_pos = node_get_pos (b); if (a_pos == b_pos) return 0; else if (a_pos > b_pos) return 1; else return -1; } /** * g_sequence_append: * @seq: a #GSequence * @data: the data for the new item * * Adds a new item to the end of @seq. * * Return value: an iterator pointing to the new item * * Since: 2.14 **/ GSequenceIter * g_sequence_append (GSequence *seq, gpointer data) { GSequenceNode *node; g_return_val_if_fail (seq != NULL, NULL); check_seq_access (seq); node = node_new (data); node_insert_before (seq->end_node, node); return node; } /** * g_sequence_prepend: * @seq: a #GSequence * @data: the data for the new item * * Adds a new item to the front of @seq * * Return value: an iterator pointing to the new item * * Since: 2.14 **/ GSequenceIter * g_sequence_prepend (GSequence *seq, gpointer data) { GSequenceNode *node, *first; g_return_val_if_fail (seq != NULL, NULL); check_seq_access (seq); node = node_new (data); first = node_get_first (seq->end_node); node_insert_before (first, node); return node; } /** * g_sequence_insert_before: * @iter: a #GSequenceIter * @data: the data for the new item * * Inserts a new item just before the item pointed to by @iter. * * Return value: an iterator pointing to the new item * * Since: 2.14 **/ GSequenceIter * g_sequence_insert_before (GSequenceIter *iter, gpointer data) { GSequenceNode *node; g_return_val_if_fail (iter != NULL, NULL); check_iter_access (iter); node = node_new (data); node_insert_before (iter, node); return node; } /** * g_sequence_remove: * @iter: a #GSequenceIter * * Removes the item pointed to by @iter. It is an error to pass the * end iterator to this function. * * If the sequence has a data destroy function associated with it, this * function is called on the data for the removed item. * * Since: 2.14 **/ void g_sequence_remove (GSequenceIter *iter) { GSequence *seq; g_return_if_fail (iter != NULL); g_return_if_fail (!is_end (iter)); check_iter_access (iter); seq = get_sequence (iter); node_unlink (iter); node_free (iter, seq); } /** * g_sequence_remove_range: * @begin: a #GSequenceIter * @end: a #GSequenceIter * * Removes all items in the (@begin, @end) range. * * If the sequence has a data destroy function associated with it, this * function is called on the data for the removed items. * * Since: 2.14 **/ void g_sequence_remove_range (GSequenceIter *begin, GSequenceIter *end) { g_return_if_fail (get_sequence (begin) == get_sequence (end)); check_iter_access (begin); check_iter_access (end); g_sequence_move_range (NULL, begin, end); } /** * g_sequence_move_range: * @dest: a #GSequenceIter * @begin: a #GSequenceIter * @end: a #GSequenceIter * * Inserts the (@begin, @end) range at the destination pointed to by ptr. * The @begin and @end iters must point into the same sequence. It is * allowed for @dest to point to a different sequence than the one pointed * into by @begin and @end. * * If @dest is NULL, the range indicated by @begin and @end is * removed from the sequence. If @dest iter points to a place within * the (@begin, @end) range, the range does not move. * * Since: 2.14 **/ void g_sequence_move_range (GSequenceIter *dest, GSequenceIter *begin, GSequenceIter *end) { GSequence *src_seq; GSequenceNode *first; g_return_if_fail (begin != NULL); g_return_if_fail (end != NULL); check_iter_access (begin); check_iter_access (end); if (dest) check_iter_access (dest); src_seq = get_sequence (begin); g_return_if_fail (src_seq == get_sequence (end)); /* Dest points to begin or end? */ if (dest == begin || dest == end) return; /* begin comes after end? */ if (g_sequence_iter_compare (begin, end) >= 0) return; /* dest points somewhere in the (begin, end) range? */ if (dest && get_sequence (dest) == src_seq && g_sequence_iter_compare (dest, begin) > 0 && g_sequence_iter_compare (dest, end) < 0) { return; } src_seq = get_sequence (begin); first = node_get_first (begin); node_cut (begin); node_cut (end); if (first != begin) node_join (first, end); if (dest) { first = node_get_first (dest); node_cut (dest); node_join (begin, dest); if (dest != first) node_join (first, begin); } else { node_free (begin, src_seq); } } /** * g_sequence_sort: * @seq: a #GSequence * @cmp_func: the function used to sort the sequence * @cmp_data: user data passed to @cmp_func * * Sorts @seq using @cmp_func. * * @cmp_func is passed two items of @seq and should * return 0 if they are equal, a negative value if the * first comes before the second, and a positive value * if the second comes before the first. * * Since: 2.14 **/ void g_sequence_sort (GSequence *seq, GCompareDataFunc cmp_func, gpointer cmp_data) { SortInfo info; info.cmp_func = cmp_func; info.cmp_data = cmp_data; info.end_node = seq->end_node; check_seq_access (seq); g_sequence_sort_iter (seq, iter_compare, &info); } /** * g_sequence_insert_sorted: * @seq: a #GSequence * @data: the data to insert * @cmp_func: the function used to compare items in the sequence * @cmp_data: user data passed to @cmp_func. * * Inserts @data into @sequence using @func to determine the new * position. The sequence must already be sorted according to @cmp_func; * otherwise the new position of @data is undefined. * * @cmp_func is called with two items of the @seq and @user_data. * It should return 0 if the items are equal, a negative value * if the first item comes before the second, and a positive value * if the second item comes before the first. * * Return value: a #GSequenceIter pointing to the new item. * * Since: 2.14 **/ GSequenceIter * g_sequence_insert_sorted (GSequence *seq, gpointer data, GCompareDataFunc cmp_func, gpointer cmp_data) { SortInfo info; g_return_val_if_fail (seq != NULL, NULL); g_return_val_if_fail (cmp_func != NULL, NULL); info.cmp_func = cmp_func; info.cmp_data = cmp_data; info.end_node = seq->end_node; check_seq_access (seq); return g_sequence_insert_sorted_iter (seq, data, iter_compare, &info); } /** * g_sequence_sort_changed: * @iter: A #GSequenceIter * @cmp_func: the function used to compare items in the sequence * @cmp_data: user data passed to @cmp_func. * * Moves the data pointed to a new position as indicated by @cmp_func. This * function should be called for items in a sequence already sorted according * to @cmp_func whenever some aspect of an item changes so that @cmp_func * may return different values for that item. * * @cmp_func is called with two items of the @seq and @user_data. * It should return 0 if the items are equal, a negative value if * the first item comes before the second, and a positive value if * the second item comes before the first. * * Since: 2.14 **/ void g_sequence_sort_changed (GSequenceIter *iter, GCompareDataFunc cmp_func, gpointer cmp_data) { SortInfo info; g_return_if_fail (!is_end (iter)); info.cmp_func = cmp_func; info.cmp_data = cmp_data; info.end_node = get_sequence (iter)->end_node; check_iter_access (iter); g_sequence_sort_changed_iter (iter, iter_compare, &info); } /** * g_sequence_search: * @seq: a #GSequence * @data: data for the new item * @cmp_func: the function used to compare items in the sequence * @cmp_data: user data passed to @cmp_func. * * Returns an iterator pointing to the position where @data would * be inserted according to @cmp_func and @cmp_data. * * @cmp_func is called with two items of the @seq and @user_data. * It should return 0 if the items are equal, a negative value if * the first item comes before the second, and a positive value if * the second item comes before the first. * * If you are simply searching for an existing element of the sequence, * consider using g_sequence_lookup(). * * * This function will fail if the data contained in the sequence is * unsorted. Use g_sequence_insert_sorted() or * g_sequence_insert_sorted_iter() to add data to your sequence or, if * you want to add a large amount of data, call g_sequence_sort() after * doing unsorted insertions. * * * Return value: an #GSequenceIter pointing to the position where @data * would have been inserted according to @cmp_func and @cmp_data. * * Since: 2.14 **/ GSequenceIter * g_sequence_search (GSequence *seq, gpointer data, GCompareDataFunc cmp_func, gpointer cmp_data) { SortInfo info; g_return_val_if_fail (seq != NULL, NULL); info.cmp_func = cmp_func; info.cmp_data = cmp_data; info.end_node = seq->end_node; check_seq_access (seq); return g_sequence_search_iter (seq, data, iter_compare, &info); } /** * g_sequence_lookup: * @seq: a #GSequence * @data: data to lookup * @cmp_func: the function used to compare items in the sequence * @cmp_data: user data passed to @cmp_func. * * Returns an iterator pointing to the position of the first item found * equal to @data according to @cmp_func and @cmp_data. If more than one * item is equal, it is not guaranteed that it is the first which is * returned. In that case, you can use g_sequence_iter_next() and * g_sequence_iter_prev() to get others. * * @cmp_func is called with two items of the @seq and @user_data. * It should return 0 if the items are equal, a negative value if * the first item comes before the second, and a positive value if * the second item comes before the first. * * * This function will fail if the data contained in the sequence is * unsorted. Use g_sequence_insert_sorted() or * g_sequence_insert_sorted_iter() to add data to your sequence or, if * you want to add a large amount of data, call g_sequence_sort() after * doing unsorted insertions. * * * Return value: an #GSequenceIter pointing to the position of the * first item found equal to @data according to @cmp_func and * @cmp_data, or %NULL if no such item exists. * * Since: 2.28 **/ GSequenceIter * g_sequence_lookup (GSequence *seq, gpointer data, GCompareDataFunc cmp_func, gpointer cmp_data) { SortInfo info; g_return_val_if_fail (seq != NULL, NULL); info.cmp_func = cmp_func; info.cmp_data = cmp_data; info.end_node = seq->end_node; check_seq_access (seq); return g_sequence_lookup_iter (seq, data, iter_compare, &info); } /** * g_sequence_sort_iter: * @seq: a #GSequence * @cmp_func: the function used to compare iterators in the sequence * @cmp_data: user data passed to @cmp_func * * Like g_sequence_sort(), but uses a #GSequenceIterCompareFunc instead * of a GCompareDataFunc as the compare function * * @cmp_func is called with two iterators pointing into @seq. It should * return 0 if the iterators are equal, a negative value if the first * iterator comes before the second, and a positive value if the second * iterator comes before the first. * * Since: 2.14 **/ void g_sequence_sort_iter (GSequence *seq, GSequenceIterCompareFunc cmp_func, gpointer cmp_data) { GSequence *tmp; GSequenceNode *begin, *end; g_return_if_fail (seq != NULL); g_return_if_fail (cmp_func != NULL); check_seq_access (seq); begin = g_sequence_get_begin_iter (seq); end = g_sequence_get_end_iter (seq); tmp = g_sequence_new (NULL); tmp->real_sequence = seq; g_sequence_move_range (g_sequence_get_begin_iter (tmp), begin, end); seq->access_prohibited = TRUE; tmp->access_prohibited = TRUE; while (g_sequence_get_length (tmp) > 0) { GSequenceNode *node = g_sequence_get_begin_iter (tmp); node_insert_sorted (seq->end_node, node, seq->end_node, cmp_func, cmp_data); } tmp->access_prohibited = FALSE; seq->access_prohibited = FALSE; g_sequence_free (tmp); } /** * g_sequence_sort_changed_iter: * @iter: a #GSequenceIter * @iter_cmp: the function used to compare iterators in the sequence * @cmp_data: user data passed to @cmp_func * * Like g_sequence_sort_changed(), but uses * a #GSequenceIterCompareFunc instead of a #GCompareDataFunc as * the compare function. * * @iter_cmp is called with two iterators pointing into @seq. It should * return 0 if the iterators are equal, a negative value if the first * iterator comes before the second, and a positive value if the second * iterator comes before the first. * * Since: 2.14 **/ void g_sequence_sort_changed_iter (GSequenceIter *iter, GSequenceIterCompareFunc iter_cmp, gpointer cmp_data) { GSequence *seq, *tmp_seq; GSequenceIter *next, *prev; g_return_if_fail (iter != NULL); g_return_if_fail (!is_end (iter)); g_return_if_fail (iter_cmp != NULL); check_iter_access (iter); /* If one of the neighbours is equal to iter, then * don't move it. This ensures that sort_changed() is * a stable operation. */ next = node_get_next (iter); prev = node_get_prev (iter); if (prev != iter && iter_cmp (prev, iter, cmp_data) == 0) return; if (!is_end (next) && iter_cmp (next, iter, cmp_data) == 0) return; seq = get_sequence (iter); seq->access_prohibited = TRUE; tmp_seq = g_sequence_new (NULL); tmp_seq->real_sequence = seq; node_unlink (iter); node_insert_before (tmp_seq->end_node, iter); node_insert_sorted (seq->end_node, iter, seq->end_node, iter_cmp, cmp_data); g_sequence_free (tmp_seq); seq->access_prohibited = FALSE; } /** * g_sequence_insert_sorted_iter: * @seq: a #GSequence * @data: data for the new item * @iter_cmp: the function used to compare iterators in the sequence * @cmp_data: user data passed to @cmp_func * * Like g_sequence_insert_sorted(), but uses * a #GSequenceIterCompareFunc instead of a #GCompareDataFunc as * the compare function. * * @iter_cmp is called with two iterators pointing into @seq. * It should return 0 if the iterators are equal, a negative * value if the first iterator comes before the second, and a * positive value if the second iterator comes before the first. * * It is called with two iterators pointing into @seq. It should * return 0 if the iterators are equal, a negative value if the * first iterator comes before the second, and a positive value * if the second iterator comes before the first. * * Return value: a #GSequenceIter pointing to the new item * * Since: 2.14 **/ GSequenceIter * g_sequence_insert_sorted_iter (GSequence *seq, gpointer data, GSequenceIterCompareFunc iter_cmp, gpointer cmp_data) { GSequenceNode *new_node; GSequence *tmp_seq; g_return_val_if_fail (seq != NULL, NULL); g_return_val_if_fail (iter_cmp != NULL, NULL); check_seq_access (seq); seq->access_prohibited = TRUE; /* Create a new temporary sequence and put the new node into * that. The reason for this is that the user compare function * will be called with the new node, and if it dereferences, * "is_end" will be called on it. But that will crash if the * node is not actually in a sequence. * * node_insert_sorted() makes sure the node is unlinked before * it is inserted. * * The reason we need the "iter" versions at all is that that * is the only kind of compare functions GtkTreeView can use. */ tmp_seq = g_sequence_new (NULL); tmp_seq->real_sequence = seq; new_node = g_sequence_append (tmp_seq, data); node_insert_sorted (seq->end_node, new_node, seq->end_node, iter_cmp, cmp_data); g_sequence_free (tmp_seq); seq->access_prohibited = FALSE; return new_node; } /** * g_sequence_search_iter: * @seq: a #GSequence * @data: data for the new item * @iter_cmp: the function used to compare iterators in the sequence * @cmp_data: user data passed to @iter_cmp * * Like g_sequence_search(), but uses a #GSequenceIterCompareFunc * instead of a #GCompareDataFunc as the compare function. * * @iter_cmp is called with two iterators pointing into @seq. * It should return 0 if the iterators are equal, a negative value * if the first iterator comes before the second, and a positive * value if the second iterator comes before the first. * * If you are simply searching for an existing element of the sequence, * consider using g_sequence_lookup_iter(). * * * This function will fail if the data contained in the sequence is * unsorted. Use g_sequence_insert_sorted() or * g_sequence_insert_sorted_iter() to add data to your sequence or, if * you want to add a large amount of data, call g_sequence_sort() after * doing unsorted insertions. * * * Return value: a #GSequenceIter pointing to the position in @seq * where @data would have been inserted according to @iter_cmp * and @cmp_data. * * Since: 2.14 **/ GSequenceIter * g_sequence_search_iter (GSequence *seq, gpointer data, GSequenceIterCompareFunc iter_cmp, gpointer cmp_data) { GSequenceNode *node; GSequenceNode *dummy; GSequence *tmp_seq; g_return_val_if_fail (seq != NULL, NULL); check_seq_access (seq); seq->access_prohibited = TRUE; tmp_seq = g_sequence_new (NULL); tmp_seq->real_sequence = seq; dummy = g_sequence_append (tmp_seq, data); node = node_find_closest (seq->end_node, dummy, seq->end_node, iter_cmp, cmp_data); g_sequence_free (tmp_seq); seq->access_prohibited = FALSE; return node; } /** * g_sequence_lookup_iter: * @seq: a #GSequence * @data: data to lookup * @iter_cmp: the function used to compare iterators in the sequence * @cmp_data: user data passed to @iter_cmp * * Like g_sequence_lookup(), but uses a #GSequenceIterCompareFunc * instead of a #GCompareDataFunc as the compare function. * * @iter_cmp is called with two iterators pointing into @seq. * It should return 0 if the iterators are equal, a negative value * if the first iterator comes before the second, and a positive * value if the second iterator comes before the first. * * * This function will fail if the data contained in the sequence is * unsorted. Use g_sequence_insert_sorted() or * g_sequence_insert_sorted_iter() to add data to your sequence or, if * you want to add a large amount of data, call g_sequence_sort() after * doing unsorted insertions. * * * Return value: an #GSequenceIter pointing to the position of * the first item found equal to @data according to @cmp_func * and @cmp_data, or %NULL if no such item exists. * * Since: 2.28 **/ GSequenceIter * g_sequence_lookup_iter (GSequence *seq, gpointer data, GSequenceIterCompareFunc iter_cmp, gpointer cmp_data) { GSequenceNode *node; GSequenceNode *dummy; GSequence *tmp_seq; g_return_val_if_fail (seq != NULL, NULL); check_seq_access (seq); seq->access_prohibited = TRUE; tmp_seq = g_sequence_new (NULL); tmp_seq->real_sequence = seq; dummy = g_sequence_append (tmp_seq, data); node = node_find (seq->end_node, dummy, seq->end_node, iter_cmp, cmp_data); g_sequence_free (tmp_seq); seq->access_prohibited = FALSE; return node; } /** * g_sequence_iter_get_sequence: * @iter: a #GSequenceIter * * Returns the #GSequence that @iter points into. * * Return value: the #GSequence that @iter points into. * * Since: 2.14 **/ GSequence * g_sequence_iter_get_sequence (GSequenceIter *iter) { GSequence *seq; g_return_val_if_fail (iter != NULL, NULL); seq = get_sequence (iter); /* For temporary sequences, this points to the sequence that * is actually being manipulated */ return seq->real_sequence; } /** * g_sequence_get: * @iter: a #GSequenceIter * * Returns the data that @iter points to. * * Return value: the data that @iter points to * * Since: 2.14 **/ gpointer g_sequence_get (GSequenceIter *iter) { g_return_val_if_fail (iter != NULL, NULL); g_return_val_if_fail (!is_end (iter), NULL); return iter->data; } /** * g_sequence_set: * @iter: a #GSequenceIter * @data: new data for the item * * Changes the data for the item pointed to by @iter to be @data. If * the sequence has a data destroy function associated with it, that * function is called on the existing data that @iter pointed to. * * Since: 2.14 **/ void g_sequence_set (GSequenceIter *iter, gpointer data) { GSequence *seq; g_return_if_fail (iter != NULL); g_return_if_fail (!is_end (iter)); seq = get_sequence (iter); /* If @data is identical to iter->data, it is destroyed * here. This will work right in case of ref-counted objects. Also * it is similar to what ghashtables do. * * For non-refcounted data it's a little less convenient, but * code relying on self-setting not destroying would be * pretty dubious anyway ... */ if (seq->data_destroy_notify) seq->data_destroy_notify (iter->data); iter->data = data; } /** * g_sequence_get_length: * @seq: a #GSequence * * Returns the length of @seq * * Return value: the length of @seq * * Since: 2.14 **/ gint g_sequence_get_length (GSequence *seq) { return node_get_length (seq->end_node) - 1; } /** * g_sequence_get_end_iter: * @seq: a #GSequence * * Returns the end iterator for @seg * * Return value: the end iterator for @seq * * Since: 2.14 **/ GSequenceIter * g_sequence_get_end_iter (GSequence *seq) { g_return_val_if_fail (seq != NULL, NULL); return seq->end_node; } /** * g_sequence_get_begin_iter: * @seq: a #GSequence * * Returns the begin iterator for @seq. * * Return value: the begin iterator for @seq. * * Since: 2.14 **/ GSequenceIter * g_sequence_get_begin_iter (GSequence *seq) { g_return_val_if_fail (seq != NULL, NULL); return node_get_first (seq->end_node); } static int clamp_position (GSequence *seq, int pos) { gint len = g_sequence_get_length (seq); if (pos > len || pos < 0) pos = len; return pos; } /* * if pos > number of items or -1, will return end pointer */ /** * g_sequence_get_iter_at_pos: * @seq: a #GSequence * @pos: a position in @seq, or -1 for the end. * * Returns the iterator at position @pos. If @pos is negative or larger * than the number of items in @seq, the end iterator is returned. * * Return value: The #GSequenceIter at position @pos * * Since: 2.14 **/ GSequenceIter * g_sequence_get_iter_at_pos (GSequence *seq, gint pos) { g_return_val_if_fail (seq != NULL, NULL); pos = clamp_position (seq, pos); return node_get_by_pos (seq->end_node, pos); } /** * g_sequence_move: * @src: a #GSequenceIter pointing to the item to move * @dest: a #GSequenceIter pointing to the position to which * the item is moved. * * Moves the item pointed to by @src to the position indicated by @dest. * After calling this function @dest will point to the position immediately * after @src. It is allowed for @src and @dest to point into different * sequences. * * Since: 2.14 **/ void g_sequence_move (GSequenceIter *src, GSequenceIter *dest) { g_return_if_fail (src != NULL); g_return_if_fail (dest != NULL); g_return_if_fail (!is_end (src)); if (src == dest) return; node_unlink (src); node_insert_before (dest, src); } /* GSequenceIter */ /** * g_sequence_iter_is_end: * @iter: a #GSequenceIter * * Returns whether @iter is the end iterator * * Return value: Whether @iter is the end iterator. * * Since: 2.14 **/ gboolean g_sequence_iter_is_end (GSequenceIter *iter) { g_return_val_if_fail (iter != NULL, FALSE); return is_end (iter); } /** * g_sequence_iter_is_begin: * @iter: a #GSequenceIter * * Returns whether @iter is the begin iterator * * Return value: whether @iter is the begin iterator * * Since: 2.14 **/ gboolean g_sequence_iter_is_begin (GSequenceIter *iter) { g_return_val_if_fail (iter != NULL, FALSE); return (node_get_prev (iter) == iter); } /** * g_sequence_iter_get_position: * @iter: a #GSequenceIter * * Returns the position of @iter * * Return value: the position of @iter * * Since: 2.14 **/ gint g_sequence_iter_get_position (GSequenceIter *iter) { g_return_val_if_fail (iter != NULL, -1); return node_get_pos (iter); } /** * g_sequence_iter_next: * @iter: a #GSequenceIter * * Returns an iterator pointing to the next position after @iter. If * @iter is the end iterator, the end iterator is returned. * * Return value: a #GSequenceIter pointing to the next position after @iter. * * Since: 2.14 **/ GSequenceIter * g_sequence_iter_next (GSequenceIter *iter) { g_return_val_if_fail (iter != NULL, NULL); return node_get_next (iter); } /** * g_sequence_iter_prev: * @iter: a #GSequenceIter * * Returns an iterator pointing to the previous position before @iter. If * @iter is the begin iterator, the begin iterator is returned. * * Return value: a #GSequenceIter pointing to the previous position before * @iter. * * Since: 2.14 **/ GSequenceIter * g_sequence_iter_prev (GSequenceIter *iter) { g_return_val_if_fail (iter != NULL, NULL); return node_get_prev (iter); } /** * g_sequence_iter_move: * @iter: a #GSequenceIter * @delta: A positive or negative number indicating how many positions away * from @iter the returned #GSequenceIter will be. * * Returns the #GSequenceIter which is @delta positions away from @iter. * If @iter is closer than -@delta positions to the beginning of the sequence, * the begin iterator is returned. If @iter is closer than @delta positions * to the end of the sequence, the end iterator is returned. * * Return value: a #GSequenceIter which is @delta positions away from @iter. * * Since: 2.14 **/ GSequenceIter * g_sequence_iter_move (GSequenceIter *iter, gint delta) { gint new_pos; gint len; g_return_val_if_fail (iter != NULL, NULL); len = g_sequence_get_length (get_sequence (iter)); new_pos = node_get_pos (iter) + delta; if (new_pos < 0) new_pos = 0; else if (new_pos > len) new_pos = len; return node_get_by_pos (iter, new_pos); } /** * g_sequence_swap: * @a: a #GSequenceIter * @b: a #GSequenceIter * * Swaps the items pointed to by @a and @b. It is allowed for @a and @b * to point into difference sequences. * * Since: 2.14 **/ void g_sequence_swap (GSequenceIter *a, GSequenceIter *b) { GSequenceNode *leftmost, *rightmost, *rightmost_next; int a_pos, b_pos; g_return_if_fail (!g_sequence_iter_is_end (a)); g_return_if_fail (!g_sequence_iter_is_end (b)); if (a == b) return; a_pos = g_sequence_iter_get_position (a); b_pos = g_sequence_iter_get_position (b); if (a_pos > b_pos) { leftmost = b; rightmost = a; } else { leftmost = a; rightmost = b; } rightmost_next = node_get_next (rightmost); /* The situation is now like this: * * ..., leftmost, ......., rightmost, rightmost_next, ... * */ g_sequence_move (rightmost, leftmost); g_sequence_move (leftmost, rightmost_next); } /* * Implementation of a treap * * */ static guint get_priority (GSequenceNode *node) { guint key = GPOINTER_TO_UINT (node); /* This hash function is based on one found on Thomas Wang's * web page at * * http://www.concentric.net/~Ttwang/tech/inthash.htm * */ key = (key << 15) - key - 1; key = key ^ (key >> 12); key = key + (key << 2); key = key ^ (key >> 4); key = key + (key << 3) + (key << 11); key = key ^ (key >> 16); /* We rely on 0 being less than all other priorities */ return key? key : 1; } static GSequenceNode * find_root (GSequenceNode *node) { while (node->parent) node = node->parent; return node; } static GSequenceNode * node_new (gpointer data) { GSequenceNode *node = g_slice_new0 (GSequenceNode); node->n_nodes = 1; node->data = data; node->left = NULL; node->right = NULL; node->parent = NULL; return node; } static GSequenceNode * node_get_first (GSequenceNode *node) { node = find_root (node); while (node->left) node = node->left; return node; } static GSequenceNode * node_get_last (GSequenceNode *node) { node = find_root (node); while (node->right) node = node->right; return node; } #define NODE_LEFT_CHILD(n) (((n)->parent) && ((n)->parent->left) == (n)) #define NODE_RIGHT_CHILD(n) (((n)->parent) && ((n)->parent->right) == (n)) static GSequenceNode * node_get_next (GSequenceNode *node) { GSequenceNode *n = node; if (n->right) { n = n->right; while (n->left) n = n->left; } else { while (NODE_RIGHT_CHILD (n)) n = n->parent; if (n->parent) n = n->parent; else n = node; } return n; } static GSequenceNode * node_get_prev (GSequenceNode *node) { GSequenceNode *n = node; if (n->left) { n = n->left; while (n->right) n = n->right; } else { while (NODE_LEFT_CHILD (n)) n = n->parent; if (n->parent) n = n->parent; else n = node; } return n; } #define N_NODES(n) ((n)? (n)->n_nodes : 0) static gint node_get_pos (GSequenceNode *node) { int n_smaller = 0; if (node->left) n_smaller = node->left->n_nodes; while (node) { if (NODE_RIGHT_CHILD (node)) n_smaller += N_NODES (node->parent->left) + 1; node = node->parent; } return n_smaller; } static GSequenceNode * node_get_by_pos (GSequenceNode *node, gint pos) { int i; node = find_root (node); while ((i = N_NODES (node->left)) != pos) { if (i < pos) { node = node->right; pos -= (i + 1); } else { node = node->left; } } return node; } static GSequenceNode * node_find (GSequenceNode *haystack, GSequenceNode *needle, GSequenceNode *end, GSequenceIterCompareFunc iter_cmp, gpointer cmp_data) { gint c; haystack = find_root (haystack); do { /* iter_cmp can't be passed the end node, since the function may * be user-supplied */ if (haystack == end) c = 1; else c = iter_cmp (haystack, needle, cmp_data); if (c == 0) break; if (c > 0) haystack = haystack->left; else haystack = haystack->right; } while (haystack != NULL); return haystack; } static GSequenceNode * node_find_closest (GSequenceNode *haystack, GSequenceNode *needle, GSequenceNode *end, GSequenceIterCompareFunc iter_cmp, gpointer cmp_data) { GSequenceNode *best; gint c; haystack = find_root (haystack); do { best = haystack; /* iter_cmp can't be passed the end node, since the function may * be user-supplied */ if (haystack == end) c = 1; else c = iter_cmp (haystack, needle, cmp_data); /* In the following we don't break even if c == 0. Instead we go on * searching along the 'bigger' nodes, so that we find the last one * that is equal to the needle. */ if (c > 0) haystack = haystack->left; else haystack = haystack->right; } while (haystack != NULL); /* If the best node is smaller or equal to the data, then move one step * to the right to make sure the best one is strictly bigger than the data */ if (best != end && c <= 0) best = node_get_next (best); return best; } static gint node_get_length (GSequenceNode *node) { node = find_root (node); return node->n_nodes; } static void real_node_free (GSequenceNode *node, GSequence *seq) { if (node) { real_node_free (node->left, seq); real_node_free (node->right, seq); if (seq && seq->data_destroy_notify && node != seq->end_node) seq->data_destroy_notify (node->data); g_slice_free (GSequenceNode, node); } } static void node_free (GSequenceNode *node, GSequence *seq) { node = find_root (node); real_node_free (node, seq); } static void node_update_fields (GSequenceNode *node) { int n_nodes = 1; n_nodes += N_NODES (node->left); n_nodes += N_NODES (node->right); node->n_nodes = n_nodes; } static void node_rotate (GSequenceNode *node) { GSequenceNode *tmp, *old; g_assert (node->parent); g_assert (node->parent != node); if (NODE_LEFT_CHILD (node)) { /* rotate right */ tmp = node->right; node->right = node->parent; node->parent = node->parent->parent; if (node->parent) { if (node->parent->left == node->right) node->parent->left = node; else node->parent->right = node; } g_assert (node->right); node->right->parent = node; node->right->left = tmp; if (node->right->left) node->right->left->parent = node->right; old = node->right; } else { /* rotate left */ tmp = node->left; node->left = node->parent; node->parent = node->parent->parent; if (node->parent) { if (node->parent->right == node->left) node->parent->right = node; else node->parent->left = node; } g_assert (node->left); node->left->parent = node; node->left->right = tmp; if (node->left->right) node->left->right->parent = node->left; old = node->left; } node_update_fields (old); node_update_fields (node); } static void node_update_fields_deep (GSequenceNode *node) { if (node) { node_update_fields (node); node_update_fields_deep (node->parent); } } static void rotate_down (GSequenceNode *node, guint priority) { guint left, right; left = node->left ? get_priority (node->left) : 0; right = node->right ? get_priority (node->right) : 0; while (priority < left || priority < right) { if (left > right) node_rotate (node->left); else node_rotate (node->right); left = node->left ? get_priority (node->left) : 0; right = node->right ? get_priority (node->right) : 0; } } static void node_cut (GSequenceNode *node) { while (node->parent) node_rotate (node); if (node->left) node->left->parent = NULL; node->left = NULL; node_update_fields (node); rotate_down (node, get_priority (node)); } static void node_join (GSequenceNode *left, GSequenceNode *right) { GSequenceNode *fake = node_new (NULL); fake->left = find_root (left); fake->right = find_root (right); fake->left->parent = fake; fake->right->parent = fake; node_update_fields (fake); node_unlink (fake); node_free (fake, NULL); } static void node_insert_before (GSequenceNode *node, GSequenceNode *new) { new->left = node->left; if (new->left) new->left->parent = new; new->parent = node; node->left = new; node_update_fields_deep (new); while (new->parent && get_priority (new) > get_priority (new->parent)) node_rotate (new); rotate_down (new, get_priority (new)); } static void node_unlink (GSequenceNode *node) { rotate_down (node, 0); if (NODE_RIGHT_CHILD (node)) node->parent->right = NULL; else if (NODE_LEFT_CHILD (node)) node->parent->left = NULL; if (node->parent) node_update_fields_deep (node->parent); node->parent = NULL; } static void node_insert_sorted (GSequenceNode *node, GSequenceNode *new, GSequenceNode *end, GSequenceIterCompareFunc iter_cmp, gpointer cmp_data) { GSequenceNode *closest; closest = node_find_closest (node, new, end, iter_cmp, cmp_data); node_unlink (new); node_insert_before (closest, new); } pkg-config-0.29.1/glib/glib/gmacros.h0000664000175000017500000003045012651243552014217 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the GLib Team and others 1997-2000. See the AUTHORS * file for a list of people on the GLib Team. See the ChangeLog * files for a list of changes. These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/. */ /* This file must not include any other glib header file and must thus * not refer to variables from glibconfig.h */ #ifndef __G_MACROS_H__ #define __G_MACROS_H__ #if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) #error "Only can be included directly." #endif /* We include stddef.h to get the system's definition of NULL */ #include /* Here we provide G_GNUC_EXTENSION as an alias for __extension__, * where this is valid. This allows for warningless compilation of * "long long" types even in the presence of '-ansi -pedantic'. */ #if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 8) # define G_GNUC_EXTENSION __extension__ #else # define G_GNUC_EXTENSION #endif /* Provide macros to feature the GCC function attribute. */ #if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96) #define G_GNUC_PURE \ __attribute__((__pure__)) #define G_GNUC_MALLOC \ __attribute__((__malloc__)) #else #define G_GNUC_PURE #define G_GNUC_MALLOC #endif #if __GNUC__ >= 4 #define G_GNUC_NULL_TERMINATED __attribute__((__sentinel__)) #else #define G_GNUC_NULL_TERMINATED #endif #if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) #define G_GNUC_ALLOC_SIZE(x) __attribute__((__alloc_size__(x))) #define G_GNUC_ALLOC_SIZE2(x,y) __attribute__((__alloc_size__(x,y))) #else #define G_GNUC_ALLOC_SIZE(x) #define G_GNUC_ALLOC_SIZE2(x,y) #endif #if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ > 4) #define G_GNUC_PRINTF( format_idx, arg_idx ) \ __attribute__((__format__ (__printf__, format_idx, arg_idx))) #define G_GNUC_SCANF( format_idx, arg_idx ) \ __attribute__((__format__ (__scanf__, format_idx, arg_idx))) #define G_GNUC_FORMAT( arg_idx ) \ __attribute__((__format_arg__ (arg_idx))) #define G_GNUC_NORETURN \ __attribute__((__noreturn__)) #define G_GNUC_CONST \ __attribute__((__const__)) #define G_GNUC_UNUSED \ __attribute__((__unused__)) #define G_GNUC_NO_INSTRUMENT \ __attribute__((__no_instrument_function__)) #else /* !__GNUC__ */ #define G_GNUC_PRINTF( format_idx, arg_idx ) #define G_GNUC_SCANF( format_idx, arg_idx ) #define G_GNUC_FORMAT( arg_idx ) #define G_GNUC_NORETURN #define G_GNUC_CONST #define G_GNUC_UNUSED #define G_GNUC_NO_INSTRUMENT #endif /* !__GNUC__ */ #if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1) #define G_GNUC_DEPRECATED \ __attribute__((__deprecated__)) #else #define G_GNUC_DEPRECATED #endif /* __GNUC__ */ #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5) #define G_GNUC_DEPRECATED_FOR(f) \ __attribute__((deprecated("Use " #f " instead"))) #else #define G_GNUC_DEPRECATED_FOR(f) G_GNUC_DEPRECATED #endif /* __GNUC__ */ #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6) #define G_GNUC_BEGIN_IGNORE_DEPRECATIONS \ _Pragma ("GCC diagnostic push") \ _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 #endif #if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) # define G_GNUC_MAY_ALIAS __attribute__((may_alias)) #else # define G_GNUC_MAY_ALIAS #endif #if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) #define G_GNUC_WARN_UNUSED_RESULT \ __attribute__((warn_unused_result)) #else #define G_GNUC_WARN_UNUSED_RESULT #endif /* __GNUC__ */ #ifndef G_DISABLE_DEPRECATED /* Wrap the gcc __PRETTY_FUNCTION__ and __FUNCTION__ variables with * macros, so we can refer to them as strings unconditionally. * usage not-recommended since gcc-3.0 */ #if defined (__GNUC__) && (__GNUC__ < 3) #define G_GNUC_FUNCTION __FUNCTION__ #define G_GNUC_PRETTY_FUNCTION __PRETTY_FUNCTION__ #else /* !__GNUC__ */ #define G_GNUC_FUNCTION "" #define G_GNUC_PRETTY_FUNCTION "" #endif /* !__GNUC__ */ #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 #ifndef __GI_SCANNER__ /* The static assert macro really confuses the introspection parser */ #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] G_GNUC_UNUSED #else #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 /* Provide a string identifying the current code position */ #if defined(__GNUC__) && (__GNUC__ < 3) && !defined(__cplusplus) # define G_STRLOC __FILE__ ":" G_STRINGIFY (__LINE__) ":" __PRETTY_FUNCTION__ "()" #else # define G_STRLOC __FILE__ ":" G_STRINGIFY (__LINE__) #endif /* Provide a string identifying the current function, non-concatenatable */ #if defined (__GNUC__) && defined (__cplusplus) # define G_STRFUNC ((const char*) (__PRETTY_FUNCTION__)) #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 19901L # define G_STRFUNC ((const char*) (__func__)) #elif defined (__GNUC__) || (defined(_MSC_VER) && (_MSC_VER > 1300)) # define G_STRFUNC ((const char*) (__FUNCTION__)) #else # define G_STRFUNC ((const char*) ("???")) #endif /* Guard C code in headers, while including them from C++ */ #ifdef __cplusplus # define G_BEGIN_DECLS extern "C" { # define G_END_DECLS } #else # define G_BEGIN_DECLS # define G_END_DECLS #endif /* Provide definitions for some commonly used macros. * Some of them are only provided if they haven't already * been defined. It is assumed that if they are already * defined then the current definition is correct. */ #ifndef NULL # ifdef __cplusplus # define NULL (0L) # else /* !__cplusplus */ # define NULL ((void*) 0) # endif /* !__cplusplus */ #endif #ifndef FALSE #define FALSE (0) #endif #ifndef TRUE #define TRUE (!FALSE) #endif #undef MAX #define MAX(a, b) (((a) > (b)) ? (a) : (b)) #undef MIN #define MIN(a, b) (((a) < (b)) ? (a) : (b)) #undef ABS #define ABS(a) (((a) < 0) ? -(a) : (a)) #undef CLAMP #define CLAMP(x, low, high) (((x) > (high)) ? (high) : (((x) < (low)) ? (low) : (x))) /* Count the number of elements in an array. The array must be defined * as such; using this with a dynamically allocated array will give * incorrect results. */ #define G_N_ELEMENTS(arr) (sizeof (arr) / sizeof ((arr)[0])) /* Macros by analogy to GINT_TO_POINTER, GPOINTER_TO_INT */ #define GPOINTER_TO_SIZE(p) ((gsize) (p)) #define GSIZE_TO_POINTER(s) ((gpointer) (gsize) (s)) /* Provide convenience macros for handling structure * fields through their offsets. */ #if defined(__GNUC__) && __GNUC__ >= 4 # define G_STRUCT_OFFSET(struct_type, member) \ ((glong) offsetof (struct_type, member)) #else # define G_STRUCT_OFFSET(struct_type, member) \ ((glong) ((guint8*) &((struct_type*) 0)->member)) #endif #define G_STRUCT_MEMBER_P(struct_p, struct_offset) \ ((gpointer) ((guint8*) (struct_p) + (glong) (struct_offset))) #define G_STRUCT_MEMBER(member_type, struct_p, struct_offset) \ (*(member_type*) G_STRUCT_MEMBER_P ((struct_p), (struct_offset))) /* Provide simple macro statement wrappers: * G_STMT_START { statements; } G_STMT_END; * This can be used as a single statement, like: * if (x) G_STMT_START { ... } G_STMT_END; else ... * This intentionally does not use compiler extensions like GCC's '({...})' to * avoid portability issue or side effects when compiled with different compilers. */ #if !(defined (G_STMT_START) && defined (G_STMT_END)) # define G_STMT_START do # define G_STMT_END while (0) #endif /* Deprecated -- do not use. */ #ifndef G_DISABLE_DEPRECATED #ifdef G_DISABLE_CONST_RETURNS #define G_CONST_RETURN #else #define G_CONST_RETURN const #endif #endif /* * The G_LIKELY and G_UNLIKELY macros let the programmer give hints to * the compiler about the expected result of an expression. Some compilers * can use this information for optimizations. * * The _G_BOOLEAN_EXPR macro is intended to trigger a gcc warning when * putting assignments in g_return_if_fail (). */ #if defined(__GNUC__) && (__GNUC__ > 2) && defined(__OPTIMIZE__) #define _G_BOOLEAN_EXPR(expr) \ G_GNUC_EXTENSION ({ \ int _g_boolean_var_; \ if (expr) \ _g_boolean_var_ = 1; \ else \ _g_boolean_var_ = 0; \ _g_boolean_var_; \ }) #define G_LIKELY(expr) (__builtin_expect (_G_BOOLEAN_EXPR(expr), 1)) #define G_UNLIKELY(expr) (__builtin_expect (_G_BOOLEAN_EXPR(expr), 0)) #else #define G_LIKELY(expr) (expr) #define G_UNLIKELY(expr) (expr) #endif #if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1) #define G_DEPRECATED __attribute__((__deprecated__)) #elif defined(_MSC_VER) && (_MSC_VER >= 1300) #define G_DEPRECATED __declspec(deprecated) #else #define G_DEPRECATED #endif #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5) #define G_DEPRECATED_FOR(f) __attribute__((__deprecated__("Use '" #f "' instead"))) #elif defined(_MSC_FULL_VER) && (_MSC_FULL_VER > 140050320) #define G_DEPRECATED_FOR(f) __declspec(deprecated("is deprecated. Use '" #f "' instead")) #else #define G_DEPRECATED_FOR(f) G_DEPRECATED #endif #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5) #define G_UNAVAILABLE(maj,min) __attribute__((deprecated("Not available before " #maj "." #min))) #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) G_DEPRECATED #endif #ifndef _GLIB_EXTERN #define _GLIB_EXTERN extern #endif /* These macros are used to mark deprecated functions in GLib headers, * and thus have to be exposed in installed headers. But please * do *not* use them in other projects. Instead, use G_DEPRECATED * or define your own wrappers around it. */ #ifdef GLIB_DISABLE_DEPRECATION_WARNINGS #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 _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__ */ pkg-config-0.29.1/glib/glib/gbookmarkfile.c0000664000175000017500000030174512651243552015403 00000000000000/* gbookmarkfile.c: parsing and building desktop bookmarks * * Copyright (C) 2005-2006 Emmanuele Bassi * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, */ #include "config.h" #include "gbookmarkfile.h" #include #include #include #include #include #include #include #include #include #include #ifdef HAVE_UNISTD_H #include #endif #include "gconvert.h" #include "gdataset.h" #include "gerror.h" #include "gfileutils.h" #include "ghash.h" #include "glibintl.h" #include "glist.h" #include "gslist.h" #include "gmain.h" #include "gmarkup.h" #include "gmem.h" #include "gmessages.h" #include "gshell.h" #include "gslice.h" #include "gstdio.h" #include "gstring.h" #include "gstrfuncs.h" #include "gtimer.h" #include "gutils.h" /** * SECTION:bookmarkfile * @title: Bookmark file parser * @short_description: parses files containing bookmarks * * GBookmarkFile lets you parse, edit or create files containing bookmarks * to URI, along with some meta-data about the resource pointed by the URI * like its MIME type, the application that is registering the bookmark and * the icon that should be used to represent the bookmark. The data is stored * using the * Desktop Bookmark * Specification. * * The syntax of the bookmark files is described in detail inside the Desktop * Bookmark Specification, here is a quick summary: bookmark files use a * sub-class of the XML Bookmark Exchange Language * specification, consisting of valid UTF-8 encoded XML, under the * xbel root element; each bookmark is stored inside a * bookmark element, using its URI: no relative paths can * be used inside a bookmark file. The bookmark may have a user defined title * and description, to be used instead of the URI. Under the * metadata element, with its owner * attribute set to http://freedesktop.org, is stored the * meta-data about a resource pointed by its URI. The meta-data consists of * the resource's MIME type; the applications that have registered a bookmark; * the groups to which a bookmark belongs to; a visibility flag, used to set * the bookmark as "private" to the applications and groups that has it * registered; the URI and MIME type of an icon, to be used when displaying * the bookmark inside a GUI. * |[FIXME: MISSING XINCLUDE CONTENT]| * * A bookmark file might contain more than one bookmark; each bookmark * is accessed through its URI. * * The important caveat of bookmark files is that when you add a new * bookmark you must also add the application that is registering it, using * g_bookmark_file_add_application() or g_bookmark_file_set_app_info(). * If a bookmark has no applications then it won't be dumped when creating * the on disk representation, using g_bookmark_file_to_data() or * g_bookmark_file_to_file(). * * The #GBookmarkFile parser was added in GLib 2.12. */ /* XBEL 1.0 standard entities */ #define XBEL_VERSION "1.0" #define XBEL_DTD_NICK "xbel" #define XBEL_DTD_SYSTEM "+//IDN python.org//DTD XML Bookmark " \ "Exchange Language 1.0//EN//XML" #define XBEL_DTD_URI "http://www.python.org/topics/xml/dtds/xbel-1.0.dtd" #define XBEL_ROOT_ELEMENT "xbel" #define XBEL_FOLDER_ELEMENT "folder" /* unused */ #define XBEL_BOOKMARK_ELEMENT "bookmark" #define XBEL_ALIAS_ELEMENT "alias" /* unused */ #define XBEL_SEPARATOR_ELEMENT "separator" /* unused */ #define XBEL_TITLE_ELEMENT "title" #define XBEL_DESC_ELEMENT "desc" #define XBEL_INFO_ELEMENT "info" #define XBEL_METADATA_ELEMENT "metadata" #define XBEL_VERSION_ATTRIBUTE "version" #define XBEL_FOLDED_ATTRIBUTE "folded" /* unused */ #define XBEL_OWNER_ATTRIBUTE "owner" #define XBEL_ADDED_ATTRIBUTE "added" #define XBEL_VISITED_ATTRIBUTE "visited" #define XBEL_MODIFIED_ATTRIBUTE "modified" #define XBEL_ID_ATTRIBUTE "id" #define XBEL_HREF_ATTRIBUTE "href" #define XBEL_REF_ATTRIBUTE "ref" /* unused */ #define XBEL_YES_VALUE "yes" #define XBEL_NO_VALUE "no" /* Desktop bookmark spec entities */ #define BOOKMARK_METADATA_OWNER "http://freedesktop.org" #define BOOKMARK_NAMESPACE_NAME "bookmark" #define BOOKMARK_NAMESPACE_URI "http://www.freedesktop.org/standards/desktop-bookmarks" #define BOOKMARK_GROUPS_ELEMENT "groups" #define BOOKMARK_GROUP_ELEMENT "group" #define BOOKMARK_APPLICATIONS_ELEMENT "applications" #define BOOKMARK_APPLICATION_ELEMENT "application" #define BOOKMARK_ICON_ELEMENT "icon" #define BOOKMARK_PRIVATE_ELEMENT "private" #define BOOKMARK_NAME_ATTRIBUTE "name" #define BOOKMARK_EXEC_ATTRIBUTE "exec" #define BOOKMARK_COUNT_ATTRIBUTE "count" #define BOOKMARK_TIMESTAMP_ATTRIBUTE "timestamp" /* deprecated by "modified" */ #define BOOKMARK_MODIFIED_ATTRIBUTE "modified" #define BOOKMARK_HREF_ATTRIBUTE "href" #define BOOKMARK_TYPE_ATTRIBUTE "type" /* Shared MIME Info entities */ #define MIME_NAMESPACE_NAME "mime" #define MIME_NAMESPACE_URI "http://www.freedesktop.org/standards/shared-mime-info" #define MIME_TYPE_ELEMENT "mime-type" #define MIME_TYPE_ATTRIBUTE "type" typedef struct _BookmarkAppInfo BookmarkAppInfo; typedef struct _BookmarkMetadata BookmarkMetadata; typedef struct _BookmarkItem BookmarkItem; typedef struct _ParseData ParseData; struct _BookmarkAppInfo { gchar *name; gchar *exec; guint count; time_t stamp; }; struct _BookmarkMetadata { gchar *mime_type; GList *groups; GList *applications; GHashTable *apps_by_name; gchar *icon_href; gchar *icon_mime; guint is_private : 1; }; struct _BookmarkItem { gchar *uri; gchar *title; gchar *description; time_t added; time_t modified; time_t visited; BookmarkMetadata *metadata; }; struct _GBookmarkFile { gchar *title; gchar *description; /* we store our items in a list and keep a copy inside * an hash table for faster lookup performances */ GList *items; GHashTable *items_by_uri; }; /* parser state machine */ enum { STATE_STARTED = 0, STATE_ROOT, STATE_BOOKMARK, STATE_TITLE, STATE_DESC, STATE_INFO, STATE_METADATA, STATE_APPLICATIONS, STATE_APPLICATION, STATE_GROUPS, STATE_GROUP, STATE_MIME, STATE_ICON, STATE_FINISHED }; static void g_bookmark_file_init (GBookmarkFile *bookmark); static void g_bookmark_file_clear (GBookmarkFile *bookmark); static gboolean g_bookmark_file_parse (GBookmarkFile *bookmark, const gchar *buffer, gsize length, GError **error); static gchar * g_bookmark_file_dump (GBookmarkFile *bookmark, gsize *length, GError **error); static BookmarkItem *g_bookmark_file_lookup_item (GBookmarkFile *bookmark, const gchar *uri); static void g_bookmark_file_add_item (GBookmarkFile *bookmark, BookmarkItem *item, GError **error); static time_t timestamp_from_iso8601 (const gchar *iso_date); static gchar * timestamp_to_iso8601 (time_t timestamp); /******************************** * BookmarkAppInfo * * * * Application metadata storage * ********************************/ static BookmarkAppInfo * bookmark_app_info_new (const gchar *name) { BookmarkAppInfo *retval; g_warn_if_fail (name != NULL); retval = g_slice_new (BookmarkAppInfo); retval->name = g_strdup (name); retval->exec = NULL; retval->count = 0; retval->stamp = 0; return retval; } static void bookmark_app_info_free (BookmarkAppInfo *app_info) { if (!app_info) return; g_free (app_info->name); g_free (app_info->exec); g_slice_free (BookmarkAppInfo, app_info); } static gchar * bookmark_app_info_dump (BookmarkAppInfo *app_info) { gchar *retval; gchar *name, *exec, *modified, *count; g_warn_if_fail (app_info != NULL); if (app_info->count == 0) return NULL; name = g_markup_escape_text (app_info->name, -1); exec = g_markup_escape_text (app_info->exec, -1); modified = timestamp_to_iso8601 (app_info->stamp); count = g_strdup_printf ("%u", app_info->count); retval = g_strconcat (" " "<" BOOKMARK_NAMESPACE_NAME ":" BOOKMARK_APPLICATION_ELEMENT " " BOOKMARK_NAME_ATTRIBUTE "=\"", name, "\"" " " BOOKMARK_EXEC_ATTRIBUTE "=\"", exec, "\"" " " BOOKMARK_MODIFIED_ATTRIBUTE "=\"", modified, "\"" " " BOOKMARK_COUNT_ATTRIBUTE "=\"", count, "\"/>\n", NULL); g_free (name); g_free (exec); g_free (modified); g_free (count); return retval; } /*********************** * BookmarkMetadata * * * * Metadata storage * ***********************/ static BookmarkMetadata * bookmark_metadata_new (void) { BookmarkMetadata *retval; retval = g_slice_new (BookmarkMetadata); retval->mime_type = NULL; retval->groups = NULL; retval->applications = NULL; retval->apps_by_name = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, NULL); retval->is_private = FALSE; retval->icon_href = NULL; retval->icon_mime = NULL; return retval; } static void bookmark_metadata_free (BookmarkMetadata *metadata) { if (!metadata) return; g_free (metadata->mime_type); g_list_free_full (metadata->groups, g_free); g_list_free_full (metadata->applications, (GDestroyNotify) bookmark_app_info_free); g_hash_table_destroy (metadata->apps_by_name); g_free (metadata->icon_href); g_free (metadata->icon_mime); g_slice_free (BookmarkMetadata, metadata); } static gchar * bookmark_metadata_dump (BookmarkMetadata *metadata) { GString *retval; gchar *buffer; if (!metadata->applications) return NULL; retval = g_string_sized_new (1024); /* metadata container */ g_string_append (retval, " " "<" XBEL_METADATA_ELEMENT " " XBEL_OWNER_ATTRIBUTE "=\"" BOOKMARK_METADATA_OWNER "\">\n"); /* mime type */ if (metadata->mime_type) { buffer = g_strconcat (" " "<" MIME_NAMESPACE_NAME ":" MIME_TYPE_ELEMENT " " MIME_TYPE_ATTRIBUTE "=\"", metadata->mime_type, "\"/>\n", NULL); g_string_append (retval, buffer); g_free (buffer); } if (metadata->groups) { GList *l; /* open groups container */ g_string_append (retval, " " "<" BOOKMARK_NAMESPACE_NAME ":" BOOKMARK_GROUPS_ELEMENT ">\n"); for (l = g_list_last (metadata->groups); l != NULL; l = l->prev) { gchar *group_name; group_name = g_markup_escape_text ((gchar *) l->data, -1); buffer = g_strconcat (" " "<" BOOKMARK_NAMESPACE_NAME ":" BOOKMARK_GROUP_ELEMENT ">", group_name, "\n", NULL); g_string_append (retval, buffer); g_free (buffer); g_free (group_name); } /* close groups container */ g_string_append (retval, " " "\n"); } if (metadata->applications) { GList *l; /* open applications container */ g_string_append (retval, " " "<" BOOKMARK_NAMESPACE_NAME ":" BOOKMARK_APPLICATIONS_ELEMENT ">\n"); for (l = g_list_last (metadata->applications); l != NULL; l = l->prev) { BookmarkAppInfo *app_info = (BookmarkAppInfo *) l->data; gchar *app_data; g_warn_if_fail (app_info != NULL); app_data = bookmark_app_info_dump (app_info); if (app_data) { retval = g_string_append (retval, app_data); g_free (app_data); } } /* close applications container */ g_string_append (retval, " " "\n"); } /* icon */ if (metadata->icon_href) { if (!metadata->icon_mime) metadata->icon_mime = g_strdup ("application/octet-stream"); buffer = g_strconcat (" " "<" BOOKMARK_NAMESPACE_NAME ":" BOOKMARK_ICON_ELEMENT " " BOOKMARK_HREF_ATTRIBUTE "=\"", metadata->icon_href, "\" " BOOKMARK_TYPE_ATTRIBUTE "=\"", metadata->icon_mime, "\"/>\n", NULL); g_string_append (retval, buffer); g_free (buffer); } /* private hint */ if (metadata->is_private) g_string_append (retval, " " "<" BOOKMARK_NAMESPACE_NAME ":" BOOKMARK_PRIVATE_ELEMENT "/>\n"); /* close metadata container */ g_string_append (retval, " " "\n"); return g_string_free (retval, FALSE); } /****************************************************** * BookmarkItem * * * * Storage for a single bookmark item inside the list * ******************************************************/ static BookmarkItem * bookmark_item_new (const gchar *uri) { BookmarkItem *item; g_warn_if_fail (uri != NULL); item = g_slice_new (BookmarkItem); item->uri = g_strdup (uri); item->title = NULL; item->description = NULL; item->added = (time_t) -1; item->modified = (time_t) -1; item->visited = (time_t) -1; item->metadata = NULL; return item; } static void bookmark_item_free (BookmarkItem *item) { if (!item) return; g_free (item->uri); g_free (item->title); g_free (item->description); if (item->metadata) bookmark_metadata_free (item->metadata); g_slice_free (BookmarkItem, item); } static gchar * bookmark_item_dump (BookmarkItem *item) { GString *retval; gchar *added, *visited, *modified; gchar *escaped_uri; gchar *buffer; /* at this point, we must have at least a registered application; if we don't * we don't screw up the bookmark file, and just skip this item */ if (!item->metadata || !item->metadata->applications) { g_warning ("Item for URI '%s' has no registered applications: skipping.\n", item->uri); return NULL; } retval = g_string_sized_new (4096); added = timestamp_to_iso8601 (item->added); modified = timestamp_to_iso8601 (item->modified); visited = timestamp_to_iso8601 (item->visited); escaped_uri = g_markup_escape_text (item->uri, -1); buffer = g_strconcat (" <" XBEL_BOOKMARK_ELEMENT " " XBEL_HREF_ATTRIBUTE "=\"", escaped_uri, "\" " XBEL_ADDED_ATTRIBUTE "=\"", added, "\" " XBEL_MODIFIED_ATTRIBUTE "=\"", modified, "\" " XBEL_VISITED_ATTRIBUTE "=\"", visited, "\">\n", NULL); g_string_append (retval, buffer); g_free (escaped_uri); g_free (visited); g_free (modified); g_free (added); g_free (buffer); if (item->title) { gchar *escaped_title; escaped_title = g_markup_escape_text (item->title, -1); buffer = g_strconcat (" " "<" XBEL_TITLE_ELEMENT ">", escaped_title, "\n", NULL); g_string_append (retval, buffer); g_free (escaped_title); g_free (buffer); } if (item->description) { gchar *escaped_desc; escaped_desc = g_markup_escape_text (item->description, -1); buffer = g_strconcat (" " "<" XBEL_DESC_ELEMENT ">", escaped_desc, "\n", NULL); g_string_append (retval, buffer); g_free (escaped_desc); g_free (buffer); } if (item->metadata) { gchar *metadata; metadata = bookmark_metadata_dump (item->metadata); if (metadata) { buffer = g_strconcat (" " "<" XBEL_INFO_ELEMENT ">\n", metadata, " " "\n", NULL); retval = g_string_append (retval, buffer); g_free (buffer); g_free (metadata); } } g_string_append (retval, " \n"); return g_string_free (retval, FALSE); } static BookmarkAppInfo * bookmark_item_lookup_app_info (BookmarkItem *item, const gchar *app_name) { g_warn_if_fail (item != NULL && app_name != NULL); if (!item->metadata) return NULL; return g_hash_table_lookup (item->metadata->apps_by_name, app_name); } /************************* * GBookmarkFile * *************************/ static void g_bookmark_file_init (GBookmarkFile *bookmark) { bookmark->title = NULL; bookmark->description = NULL; bookmark->items = NULL; bookmark->items_by_uri = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, NULL); } static void g_bookmark_file_clear (GBookmarkFile *bookmark) { g_free (bookmark->title); g_free (bookmark->description); g_list_free_full (bookmark->items, (GDestroyNotify) bookmark_item_free); bookmark->items = NULL; if (bookmark->items_by_uri) { g_hash_table_destroy (bookmark->items_by_uri); bookmark->items_by_uri = NULL; } } struct _ParseData { gint state; GHashTable *namespaces; GBookmarkFile *bookmark_file; BookmarkItem *current_item; }; static ParseData * parse_data_new (void) { ParseData *retval; retval = g_new (ParseData, 1); retval->state = STATE_STARTED; retval->namespaces = g_hash_table_new_full (g_str_hash, g_str_equal, (GDestroyNotify) g_free, (GDestroyNotify) g_free); retval->bookmark_file = NULL; retval->current_item = NULL; return retval; } static void parse_data_free (ParseData *parse_data) { g_hash_table_destroy (parse_data->namespaces); g_free (parse_data); } #define IS_ATTRIBUTE(s,a) ((0 == strcmp ((s), (a)))) static void parse_bookmark_element (GMarkupParseContext *context, ParseData *parse_data, const gchar **attribute_names, const gchar **attribute_values, GError **error) { const gchar *uri, *added, *modified, *visited; const gchar *attr; gint i; BookmarkItem *item; GError *add_error; g_warn_if_fail ((parse_data != NULL) && (parse_data->state == STATE_BOOKMARK)); i = 0; uri = added = modified = visited = NULL; for (attr = attribute_names[i]; attr != NULL; attr = attribute_names[++i]) { if (IS_ATTRIBUTE (attr, XBEL_HREF_ATTRIBUTE)) uri = attribute_values[i]; else if (IS_ATTRIBUTE (attr, XBEL_ADDED_ATTRIBUTE)) added = attribute_values[i]; else if (IS_ATTRIBUTE (attr, XBEL_MODIFIED_ATTRIBUTE)) modified = attribute_values[i]; else if (IS_ATTRIBUTE (attr, XBEL_VISITED_ATTRIBUTE)) visited = attribute_values[i]; else { /* bookmark is defined by the XBEL spec, so we need * to error out if the element has different or * missing attributes */ g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_UNKNOWN_ATTRIBUTE, _("Unexpected attribute '%s' for element '%s'"), attr, XBEL_BOOKMARK_ELEMENT); return; } } if (!uri) { g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, _("Attribute '%s' of element '%s' not found"), XBEL_HREF_ATTRIBUTE, XBEL_BOOKMARK_ELEMENT); return; } g_warn_if_fail (parse_data->current_item == NULL); item = bookmark_item_new (uri); if (added) item->added = timestamp_from_iso8601 (added); if (modified) item->modified = timestamp_from_iso8601 (modified); if (visited) item->visited = timestamp_from_iso8601 (visited); add_error = NULL; g_bookmark_file_add_item (parse_data->bookmark_file, item, &add_error); if (add_error) { bookmark_item_free (item); g_propagate_error (error, add_error); return; } parse_data->current_item = item; } static void parse_application_element (GMarkupParseContext *context, ParseData *parse_data, const gchar **attribute_names, const gchar **attribute_values, GError **error) { const gchar *name, *exec, *count, *stamp, *modified; const gchar *attr; gint i; BookmarkItem *item; BookmarkAppInfo *ai; g_warn_if_fail ((parse_data != NULL) && (parse_data->state == STATE_APPLICATION)); i = 0; name = exec = count = stamp = modified = NULL; for (attr = attribute_names[i]; attr != NULL; attr = attribute_names[++i]) { if (IS_ATTRIBUTE (attr, BOOKMARK_NAME_ATTRIBUTE)) name = attribute_values[i]; else if (IS_ATTRIBUTE (attr, BOOKMARK_EXEC_ATTRIBUTE)) exec = attribute_values[i]; else if (IS_ATTRIBUTE (attr, BOOKMARK_COUNT_ATTRIBUTE)) count = attribute_values[i]; else if (IS_ATTRIBUTE (attr, BOOKMARK_TIMESTAMP_ATTRIBUTE)) stamp = attribute_values[i]; else if (IS_ATTRIBUTE (attr, BOOKMARK_MODIFIED_ATTRIBUTE)) modified = attribute_values[i]; } /* the "name" and "exec" attributes are mandatory */ if (!name) { g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, _("Attribute '%s' of element '%s' not found"), BOOKMARK_NAME_ATTRIBUTE, BOOKMARK_APPLICATION_ELEMENT); return; } if (!exec) { g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, _("Attribute '%s' of element '%s' not found"), BOOKMARK_EXEC_ATTRIBUTE, BOOKMARK_APPLICATION_ELEMENT); return; } g_warn_if_fail (parse_data->current_item != NULL); item = parse_data->current_item; ai = bookmark_item_lookup_app_info (item, name); if (!ai) { ai = bookmark_app_info_new (name); if (!item->metadata) item->metadata = bookmark_metadata_new (); item->metadata->applications = g_list_prepend (item->metadata->applications, ai); g_hash_table_replace (item->metadata->apps_by_name, ai->name, ai); } ai->exec = g_strdup (exec); if (count) ai->count = atoi (count); else ai->count = 1; if (modified) ai->stamp = timestamp_from_iso8601 (modified); else { /* the timestamp attribute has been deprecated but we still parse * it for backward compatibility */ if (stamp) ai->stamp = (time_t) atol (stamp); else ai->stamp = time (NULL); } } static void parse_mime_type_element (GMarkupParseContext *context, ParseData *parse_data, const gchar **attribute_names, const gchar **attribute_values, GError **error) { const gchar *type; const gchar *attr; gint i; BookmarkItem *item; g_warn_if_fail ((parse_data != NULL) && (parse_data->state == STATE_MIME)); i = 0; type = NULL; for (attr = attribute_names[i]; attr != NULL; attr = attribute_names[++i]) { if (IS_ATTRIBUTE (attr, MIME_TYPE_ATTRIBUTE)) type = attribute_values[i]; } if (!type) type = "application/octet-stream"; g_warn_if_fail (parse_data->current_item != NULL); item = parse_data->current_item; if (!item->metadata) item->metadata = bookmark_metadata_new (); item->metadata->mime_type = g_strdup (type); } static void parse_icon_element (GMarkupParseContext *context, ParseData *parse_data, const gchar **attribute_names, const gchar **attribute_values, GError **error) { const gchar *href; const gchar *type; const gchar *attr; gint i; BookmarkItem *item; g_warn_if_fail ((parse_data != NULL) && (parse_data->state == STATE_ICON)); i = 0; href = NULL; type = NULL; for (attr = attribute_names[i]; attr != NULL; attr = attribute_names[++i]) { if (IS_ATTRIBUTE (attr, BOOKMARK_HREF_ATTRIBUTE)) href = attribute_values[i]; else if (IS_ATTRIBUTE (attr, BOOKMARK_TYPE_ATTRIBUTE)) type = attribute_values[i]; } /* the "href" attribute is mandatory */ if (!href) { g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, _("Attribute '%s' of element '%s' not found"), BOOKMARK_HREF_ATTRIBUTE, BOOKMARK_ICON_ELEMENT); return; } if (!type) type = "application/octet-stream"; g_warn_if_fail (parse_data->current_item != NULL); item = parse_data->current_item; if (!item->metadata) item->metadata = bookmark_metadata_new (); item->metadata->icon_href = g_strdup (href); item->metadata->icon_mime = g_strdup (type); } /* scans through the attributes of an element for the "xmlns" pragma, and * adds any resulting namespace declaration to a per-parser hashtable, using * the namespace name as a key for the namespace URI; if no key was found, * the namespace is considered as default, and stored under the "default" key. * * FIXME: this works on the assumption that the generator of the XBEL file * is either this code or is smart enough to place the namespace declarations * inside the main root node or inside the metadata node and does not redefine * a namespace inside an inner node; this does *not* conform to the * XML-NS standard, although is a close approximation. In order to make this * conformant to the XML-NS specification we should use a per-element * namespace table inside GMarkup and ask it to resolve the namespaces for us. */ static void map_namespace_to_name (ParseData *parse_data, const gchar **attribute_names, const gchar **attribute_values) { const gchar *attr; gint i; g_warn_if_fail (parse_data != NULL); if (!attribute_names || !attribute_names[0]) return; i = 0; for (attr = attribute_names[i]; attr; attr = attribute_names[++i]) { if (g_str_has_prefix (attr, "xmlns")) { gchar *namespace_name, *namespace_uri; gchar *p; p = g_utf8_strchr (attr, -1, ':'); if (p) p = g_utf8_next_char (p); else p = "default"; namespace_name = g_strdup (p); namespace_uri = g_strdup (attribute_values[i]); g_hash_table_replace (parse_data->namespaces, namespace_name, namespace_uri); } } } /* checks whether @element_full is equal to @element. * * if @namespace is set, it tries to resolve the namespace to a known URI, * and if found is prepended to the element name, from which is separated * using the character specified in the @sep parameter. */ static gboolean is_element_full (ParseData *parse_data, const gchar *element_full, const gchar *namespace, const gchar *element, const gchar sep) { gchar *ns_uri, *ns_name; const gchar *p, *element_name; gboolean retval; g_warn_if_fail (parse_data != NULL); g_warn_if_fail (element_full != NULL); if (!element) return FALSE; /* no namespace requested: dumb element compare */ if (!namespace) return (0 == strcmp (element_full, element)); /* search for namespace separator; if none found, assume we are under the * default namespace, and set ns_name to our "default" marker; if no default * namespace has been set, just do a plain comparison between @full_element * and @element. */ p = g_utf8_strchr (element_full, -1, ':'); if (p) { ns_name = g_strndup (element_full, p - element_full); element_name = g_utf8_next_char (p); } else { ns_name = g_strdup ("default"); element_name = element_full; } ns_uri = g_hash_table_lookup (parse_data->namespaces, ns_name); if (!ns_uri) { /* no default namespace found */ g_free (ns_name); return (0 == strcmp (element_full, element)); } retval = (0 == strcmp (ns_uri, namespace) && 0 == strcmp (element_name, element)); g_free (ns_name); return retval; } #define IS_ELEMENT(p,s,e) (is_element_full ((p), (s), NULL, (e), '\0')) #define IS_ELEMENT_NS(p,s,n,e) (is_element_full ((p), (s), (n), (e), '|')) static void start_element_raw_cb (GMarkupParseContext *context, const gchar *element_name, const gchar **attribute_names, const gchar **attribute_values, gpointer user_data, GError **error) { ParseData *parse_data = (ParseData *) user_data; /* we must check for namespace declarations first * * XXX - we could speed up things by checking for namespace declarations * only on the root node, where they usually are; this would probably break * on streams not produced by us or by "smart" generators */ map_namespace_to_name (parse_data, attribute_names, attribute_values); switch (parse_data->state) { case STATE_STARTED: if (IS_ELEMENT (parse_data, element_name, XBEL_ROOT_ELEMENT)) { const gchar *attr; gint i; i = 0; for (attr = attribute_names[i]; attr; attr = attribute_names[++i]) { if ((IS_ATTRIBUTE (attr, XBEL_VERSION_ATTRIBUTE)) && (0 == strcmp (attribute_values[i], XBEL_VERSION))) parse_data->state = STATE_ROOT; } } else g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, _("Unexpected tag '%s', tag '%s' expected"), element_name, XBEL_ROOT_ELEMENT); break; case STATE_ROOT: if (IS_ELEMENT (parse_data, element_name, XBEL_TITLE_ELEMENT)) parse_data->state = STATE_TITLE; else if (IS_ELEMENT (parse_data, element_name, XBEL_DESC_ELEMENT)) parse_data->state = STATE_DESC; else if (IS_ELEMENT (parse_data, element_name, XBEL_BOOKMARK_ELEMENT)) { GError *inner_error = NULL; parse_data->state = STATE_BOOKMARK; parse_bookmark_element (context, parse_data, attribute_names, attribute_values, &inner_error); if (inner_error) g_propagate_error (error, inner_error); } else g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, _("Unexpected tag '%s' inside '%s'"), element_name, XBEL_ROOT_ELEMENT); break; case STATE_BOOKMARK: if (IS_ELEMENT (parse_data, element_name, XBEL_TITLE_ELEMENT)) parse_data->state = STATE_TITLE; else if (IS_ELEMENT (parse_data, element_name, XBEL_DESC_ELEMENT)) parse_data->state = STATE_DESC; else if (IS_ELEMENT (parse_data, element_name, XBEL_INFO_ELEMENT)) parse_data->state = STATE_INFO; else g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, _("Unexpected tag '%s' inside '%s'"), element_name, XBEL_BOOKMARK_ELEMENT); break; case STATE_INFO: if (IS_ELEMENT (parse_data, element_name, XBEL_METADATA_ELEMENT)) { const gchar *attr; gint i; i = 0; for (attr = attribute_names[i]; attr; attr = attribute_names[++i]) { if ((IS_ATTRIBUTE (attr, XBEL_OWNER_ATTRIBUTE)) && (0 == strcmp (attribute_values[i], BOOKMARK_METADATA_OWNER))) { parse_data->state = STATE_METADATA; if (!parse_data->current_item->metadata) parse_data->current_item->metadata = bookmark_metadata_new (); } } } else g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, _("Unexpected tag '%s', tag '%s' expected"), element_name, XBEL_METADATA_ELEMENT); break; case STATE_METADATA: if (IS_ELEMENT_NS (parse_data, element_name, BOOKMARK_NAMESPACE_URI, BOOKMARK_APPLICATIONS_ELEMENT)) parse_data->state = STATE_APPLICATIONS; else if (IS_ELEMENT_NS (parse_data, element_name, BOOKMARK_NAMESPACE_URI, BOOKMARK_GROUPS_ELEMENT)) parse_data->state = STATE_GROUPS; else if (IS_ELEMENT_NS (parse_data, element_name, BOOKMARK_NAMESPACE_URI, BOOKMARK_PRIVATE_ELEMENT)) parse_data->current_item->metadata->is_private = TRUE; else if (IS_ELEMENT_NS (parse_data, element_name, BOOKMARK_NAMESPACE_URI, BOOKMARK_ICON_ELEMENT)) { GError *inner_error = NULL; parse_data->state = STATE_ICON; parse_icon_element (context, parse_data, attribute_names, attribute_values, &inner_error); if (inner_error) g_propagate_error (error, inner_error); } else if (IS_ELEMENT_NS (parse_data, element_name, MIME_NAMESPACE_URI, MIME_TYPE_ELEMENT)) { GError *inner_error = NULL; parse_data->state = STATE_MIME; parse_mime_type_element (context, parse_data, attribute_names, attribute_values, &inner_error); if (inner_error) g_propagate_error (error, inner_error); } else g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_UNKNOWN_ELEMENT, _("Unexpected tag '%s' inside '%s'"), element_name, XBEL_METADATA_ELEMENT); break; case STATE_APPLICATIONS: if (IS_ELEMENT_NS (parse_data, element_name, BOOKMARK_NAMESPACE_URI, BOOKMARK_APPLICATION_ELEMENT)) { GError *inner_error = NULL; parse_data->state = STATE_APPLICATION; parse_application_element (context, parse_data, attribute_names, attribute_values, &inner_error); if (inner_error) g_propagate_error (error, inner_error); } else g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, _("Unexpected tag '%s', tag '%s' expected"), element_name, BOOKMARK_APPLICATION_ELEMENT); break; case STATE_GROUPS: if (IS_ELEMENT_NS (parse_data, element_name, BOOKMARK_NAMESPACE_URI, BOOKMARK_GROUP_ELEMENT)) parse_data->state = STATE_GROUP; else g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, _("Unexpected tag '%s', tag '%s' expected"), element_name, BOOKMARK_GROUP_ELEMENT); break; case STATE_ICON: if (IS_ELEMENT_NS (parse_data, element_name, BOOKMARK_NAMESPACE_URI, BOOKMARK_ICON_ELEMENT)) { GError *inner_error = NULL; parse_icon_element (context, parse_data, attribute_names, attribute_values, &inner_error); if (inner_error) g_propagate_error (error, inner_error); } else g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_UNKNOWN_ELEMENT, _("Unexpected tag '%s' inside '%s'"), element_name, XBEL_METADATA_ELEMENT); break; default: g_warn_if_reached (); break; } } static void end_element_raw_cb (GMarkupParseContext *context, const gchar *element_name, gpointer user_data, GError **error) { ParseData *parse_data = (ParseData *) user_data; if (IS_ELEMENT (parse_data, element_name, XBEL_ROOT_ELEMENT)) parse_data->state = STATE_FINISHED; else if (IS_ELEMENT (parse_data, element_name, XBEL_BOOKMARK_ELEMENT)) { parse_data->current_item = NULL; parse_data->state = STATE_ROOT; } else if ((IS_ELEMENT (parse_data, element_name, XBEL_INFO_ELEMENT)) || (IS_ELEMENT (parse_data, element_name, XBEL_TITLE_ELEMENT)) || (IS_ELEMENT (parse_data, element_name, XBEL_DESC_ELEMENT))) { if (parse_data->current_item) parse_data->state = STATE_BOOKMARK; else parse_data->state = STATE_ROOT; } else if (IS_ELEMENT (parse_data, element_name, XBEL_METADATA_ELEMENT)) parse_data->state = STATE_INFO; else if (IS_ELEMENT_NS (parse_data, element_name, BOOKMARK_NAMESPACE_URI, BOOKMARK_APPLICATION_ELEMENT)) parse_data->state = STATE_APPLICATIONS; else if (IS_ELEMENT_NS (parse_data, element_name, BOOKMARK_NAMESPACE_URI, BOOKMARK_GROUP_ELEMENT)) parse_data->state = STATE_GROUPS; else if ((IS_ELEMENT_NS (parse_data, element_name, BOOKMARK_NAMESPACE_URI, BOOKMARK_APPLICATIONS_ELEMENT)) || (IS_ELEMENT_NS (parse_data, element_name, BOOKMARK_NAMESPACE_URI, BOOKMARK_GROUPS_ELEMENT)) || (IS_ELEMENT_NS (parse_data, element_name, BOOKMARK_NAMESPACE_URI, BOOKMARK_PRIVATE_ELEMENT)) || (IS_ELEMENT_NS (parse_data, element_name, BOOKMARK_NAMESPACE_URI, BOOKMARK_ICON_ELEMENT)) || (IS_ELEMENT_NS (parse_data, element_name, MIME_NAMESPACE_URI, MIME_TYPE_ELEMENT))) parse_data->state = STATE_METADATA; } static void text_raw_cb (GMarkupParseContext *context, const gchar *text, gsize length, gpointer user_data, GError **error) { ParseData *parse_data = (ParseData *) user_data; gchar *payload; payload = g_strndup (text, length); switch (parse_data->state) { case STATE_TITLE: if (parse_data->current_item) { g_free (parse_data->current_item->title); parse_data->current_item->title = g_strdup (payload); } else { g_free (parse_data->bookmark_file->title); parse_data->bookmark_file->title = g_strdup (payload); } break; case STATE_DESC: if (parse_data->current_item) { g_free (parse_data->current_item->description); parse_data->current_item->description = g_strdup (payload); } else { g_free (parse_data->bookmark_file->description); parse_data->bookmark_file->description = g_strdup (payload); } break; case STATE_GROUP: { GList *groups; g_warn_if_fail (parse_data->current_item != NULL); if (!parse_data->current_item->metadata) parse_data->current_item->metadata = bookmark_metadata_new (); groups = parse_data->current_item->metadata->groups; parse_data->current_item->metadata->groups = g_list_prepend (groups, g_strdup (payload)); } break; case STATE_ROOT: case STATE_BOOKMARK: case STATE_INFO: case STATE_METADATA: case STATE_APPLICATIONS: case STATE_APPLICATION: case STATE_GROUPS: case STATE_MIME: case STATE_ICON: break; default: g_warn_if_reached (); break; } g_free (payload); } static const GMarkupParser markup_parser = { start_element_raw_cb, /* start_element */ end_element_raw_cb, /* end_element */ text_raw_cb, /* text */ NULL, /* passthrough */ NULL }; static gboolean g_bookmark_file_parse (GBookmarkFile *bookmark, const gchar *buffer, gsize length, GError **error) { GMarkupParseContext *context; ParseData *parse_data; GError *parse_error, *end_error; gboolean retval; g_warn_if_fail (bookmark != NULL); if (!buffer) return FALSE; parse_error = NULL; end_error = NULL; if (length == (gsize) -1) length = strlen (buffer); parse_data = parse_data_new (); parse_data->bookmark_file = bookmark; context = g_markup_parse_context_new (&markup_parser, 0, parse_data, (GDestroyNotify) parse_data_free); retval = g_markup_parse_context_parse (context, buffer, length, &parse_error); if (!retval) g_propagate_error (error, parse_error); else { retval = g_markup_parse_context_end_parse (context, &end_error); if (!retval) g_propagate_error (error, end_error); } g_markup_parse_context_free (context); return retval; } static gchar * g_bookmark_file_dump (GBookmarkFile *bookmark, gsize *length, GError **error) { GString *retval; gchar *buffer; GList *l; retval = g_string_sized_new (4096); g_string_append (retval, "\n" #if 0 /* XXX - do we really need the doctype? */ "\n" #endif "<" XBEL_ROOT_ELEMENT " " XBEL_VERSION_ATTRIBUTE "=\"" XBEL_VERSION "\"\n" " xmlns:" BOOKMARK_NAMESPACE_NAME "=\"" BOOKMARK_NAMESPACE_URI "\"\n" " xmlns:" MIME_NAMESPACE_NAME "=\"" MIME_NAMESPACE_URI "\"\n>"); if (bookmark->title) { gchar *escaped_title; escaped_title = g_markup_escape_text (bookmark->title, -1); buffer = g_strconcat (" " "<" XBEL_TITLE_ELEMENT ">", escaped_title, "\n", NULL); g_string_append (retval, buffer); g_free (buffer); g_free (escaped_title); } if (bookmark->description) { gchar *escaped_desc; escaped_desc = g_markup_escape_text (bookmark->description, -1); buffer = g_strconcat (" " "<" XBEL_DESC_ELEMENT ">", escaped_desc, "\n", NULL); g_string_append (retval, buffer); g_free (buffer); g_free (escaped_desc); } if (!bookmark->items) goto out; else retval = g_string_append (retval, "\n"); /* the items are stored in reverse order */ for (l = g_list_last (bookmark->items); l != NULL; l = l->prev) { BookmarkItem *item = (BookmarkItem *) l->data; gchar *item_dump; item_dump = bookmark_item_dump (item); if (!item_dump) continue; retval = g_string_append (retval, item_dump); g_free (item_dump); } out: g_string_append (retval, ""); if (length) *length = retval->len; return g_string_free (retval, FALSE); } /************** * Misc * **************/ /* converts a Unix timestamp in a ISO 8601 compliant string; you * should free the returned string. */ static gchar * timestamp_to_iso8601 (time_t timestamp) { GTimeVal stamp; if (timestamp == (time_t) -1) g_get_current_time (&stamp); else { stamp.tv_sec = timestamp; stamp.tv_usec = 0; } return g_time_val_to_iso8601 (&stamp); } static time_t timestamp_from_iso8601 (const gchar *iso_date) { GTimeVal stamp; if (!g_time_val_from_iso8601 (iso_date, &stamp)) return (time_t) -1; return (time_t) stamp.tv_sec; } G_DEFINE_QUARK (g-bookmark-file-error-quark, g_bookmark_file_error) /******************** * Public API * ********************/ /** * g_bookmark_file_new: * * Creates a new empty #GBookmarkFile object. * * Use g_bookmark_file_load_from_file(), g_bookmark_file_load_from_data() * or g_bookmark_file_load_from_data_dirs() to read an existing bookmark * file. * * Return value: an empty #GBookmarkFile * * Since: 2.12 */ GBookmarkFile * g_bookmark_file_new (void) { GBookmarkFile *bookmark; bookmark = g_new (GBookmarkFile, 1); g_bookmark_file_init (bookmark); return bookmark; } /** * g_bookmark_file_free: * @bookmark: a #GBookmarkFile * * Frees a #GBookmarkFile. * * Since: 2.12 */ void g_bookmark_file_free (GBookmarkFile *bookmark) { if (!bookmark) return; g_bookmark_file_clear (bookmark); g_free (bookmark); } /** * g_bookmark_file_load_from_data: * @bookmark: an empty #GBookmarkFile struct * @data: desktop bookmarks loaded in memory * @length: the length of @data in bytes * @error: return location for a #GError, or %NULL * * Loads a bookmark file from memory into an empty #GBookmarkFile * structure. If the object cannot be created then @error is set to a * #GBookmarkFileError. * * Return value: %TRUE if a desktop bookmark could be loaded. * * Since: 2.12 */ gboolean g_bookmark_file_load_from_data (GBookmarkFile *bookmark, const gchar *data, gsize length, GError **error) { GError *parse_error; gboolean retval; g_return_val_if_fail (bookmark != NULL, FALSE); if (length == (gsize) -1) length = strlen (data); if (bookmark->items) { g_bookmark_file_clear (bookmark); g_bookmark_file_init (bookmark); } parse_error = NULL; retval = g_bookmark_file_parse (bookmark, data, length, &parse_error); if (!retval) g_propagate_error (error, parse_error); return retval; } /** * g_bookmark_file_load_from_file: * @bookmark: an empty #GBookmarkFile struct * @filename: the path of a filename to load, in the GLib file name encoding * @error: return location for a #GError, or %NULL * * Loads a desktop bookmark file into an empty #GBookmarkFile structure. * If the file could not be loaded then @error is set to either a #GFileError * or #GBookmarkFileError. * * Return value: %TRUE if a desktop bookmark file could be loaded * * Since: 2.12 */ gboolean g_bookmark_file_load_from_file (GBookmarkFile *bookmark, const gchar *filename, GError **error) { gchar *buffer; gsize len; GError *read_error; gboolean retval; g_return_val_if_fail (bookmark != NULL, FALSE); g_return_val_if_fail (filename != NULL, FALSE); read_error = NULL; g_file_get_contents (filename, &buffer, &len, &read_error); if (read_error) { g_propagate_error (error, read_error); return FALSE; } read_error = NULL; retval = g_bookmark_file_load_from_data (bookmark, buffer, len, &read_error); if (read_error) { g_propagate_error (error, read_error); g_free (buffer); return FALSE; } g_free (buffer); return retval; } /* Iterates through all the directories in *dirs trying to * find file. When it successfully locates file, returns a * string its absolute path. It also leaves the unchecked * directories in *dirs. You should free the returned string * * Adapted from gkeyfile.c */ static gchar * find_file_in_data_dirs (const gchar *file, gchar ***dirs, GError **error) { gchar **data_dirs, *data_dir, *path; path = NULL; if (dirs == NULL) return NULL; data_dirs = *dirs; path = NULL; while (data_dirs && (data_dir = *data_dirs) && !path) { gchar *candidate_file, *sub_dir; candidate_file = (gchar *) file; sub_dir = g_strdup (""); while (candidate_file != NULL && !path) { gchar *p; path = g_build_filename (data_dir, sub_dir, candidate_file, NULL); candidate_file = strchr (candidate_file, '-'); if (candidate_file == NULL) break; candidate_file++; g_free (sub_dir); sub_dir = g_strndup (file, candidate_file - file - 1); for (p = sub_dir; *p != '\0'; p++) { if (*p == '-') *p = G_DIR_SEPARATOR; } } g_free (sub_dir); data_dirs++; } *dirs = data_dirs; if (!path) { g_set_error_literal (error, G_BOOKMARK_FILE_ERROR, G_BOOKMARK_FILE_ERROR_FILE_NOT_FOUND, _("No valid bookmark file found in data dirs")); return NULL; } return path; } /** * g_bookmark_file_load_from_data_dirs: * @bookmark: a #GBookmarkFile * @file: a relative path to a filename to open and parse * @full_path: (allow-none): return location for a string containing the full path * of the file, or %NULL * @error: return location for a #GError, or %NULL * * This function looks for a desktop bookmark file named @file in the * paths returned from g_get_user_data_dir() and g_get_system_data_dirs(), * loads the file into @bookmark and returns the file's full path in * @full_path. If the file could not be loaded then an %error is * set to either a #GFileError or #GBookmarkFileError. * * Return value: %TRUE if a key file could be loaded, %FALSE otherwise * * Since: 2.12 */ gboolean g_bookmark_file_load_from_data_dirs (GBookmarkFile *bookmark, const gchar *file, gchar **full_path, GError **error) { GError *file_error = NULL; gchar **all_data_dirs, **data_dirs; const gchar *user_data_dir; const gchar * const * system_data_dirs; gsize i, j; gchar *output_path; gboolean found_file; g_return_val_if_fail (bookmark != NULL, FALSE); g_return_val_if_fail (!g_path_is_absolute (file), FALSE); user_data_dir = g_get_user_data_dir (); system_data_dirs = g_get_system_data_dirs (); all_data_dirs = g_new0 (gchar *, g_strv_length ((gchar **)system_data_dirs) + 2); i = 0; all_data_dirs[i++] = g_strdup (user_data_dir); j = 0; while (system_data_dirs[j] != NULL) all_data_dirs[i++] = g_strdup (system_data_dirs[j++]); found_file = FALSE; data_dirs = all_data_dirs; output_path = NULL; while (*data_dirs != NULL && !found_file) { g_free (output_path); output_path = find_file_in_data_dirs (file, &data_dirs, &file_error); if (file_error) { g_propagate_error (error, file_error); break; } found_file = g_bookmark_file_load_from_file (bookmark, output_path, &file_error); if (file_error) { g_propagate_error (error, file_error); break; } } if (found_file && full_path) *full_path = output_path; else g_free (output_path); g_strfreev (all_data_dirs); return found_file; } /** * g_bookmark_file_to_data: * @bookmark: a #GBookmarkFile * @length: (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. * * Return value: a newly allocated string holding * the contents of the #GBookmarkFile * * Since: 2.12 */ gchar * g_bookmark_file_to_data (GBookmarkFile *bookmark, gsize *length, GError **error) { GError *write_error = NULL; gchar *retval; g_return_val_if_fail (bookmark != NULL, NULL); retval = g_bookmark_file_dump (bookmark, length, &write_error); if (write_error) { g_propagate_error (error, write_error); return NULL; } return retval; } /** * g_bookmark_file_to_file: * @bookmark: a #GBookmarkFile * @filename: path of the output file * @error: return location for a #GError, or %NULL * * This function outputs @bookmark into a file. The write process is * guaranteed to be atomic by using g_file_set_contents() internally. * * Return value: %TRUE if the file was successfully written. * * Since: 2.12 */ gboolean g_bookmark_file_to_file (GBookmarkFile *bookmark, const gchar *filename, GError **error) { gchar *data; GError *data_error, *write_error; gsize len; gboolean retval; g_return_val_if_fail (bookmark != NULL, FALSE); g_return_val_if_fail (filename != NULL, FALSE); data_error = NULL; data = g_bookmark_file_to_data (bookmark, &len, &data_error); if (data_error) { g_propagate_error (error, data_error); return FALSE; } write_error = NULL; g_file_set_contents (filename, data, len, &write_error); if (write_error) { g_propagate_error (error, write_error); retval = FALSE; } else retval = TRUE; g_free (data); return retval; } static BookmarkItem * g_bookmark_file_lookup_item (GBookmarkFile *bookmark, const gchar *uri) { g_warn_if_fail (bookmark != NULL && uri != NULL); return g_hash_table_lookup (bookmark->items_by_uri, uri); } /* this function adds a new item to the list */ static void g_bookmark_file_add_item (GBookmarkFile *bookmark, BookmarkItem *item, GError **error) { g_warn_if_fail (bookmark != NULL); g_warn_if_fail (item != NULL); /* this should never happen; and if it does, then we are * screwing up something big time. */ if (G_UNLIKELY (g_bookmark_file_has_item (bookmark, item->uri))) { g_set_error (error, G_BOOKMARK_FILE_ERROR, G_BOOKMARK_FILE_ERROR_INVALID_URI, _("A bookmark for URI '%s' already exists"), item->uri); return; } bookmark->items = g_list_prepend (bookmark->items, item); g_hash_table_replace (bookmark->items_by_uri, item->uri, item); if (item->added == (time_t) -1) item->added = time (NULL); if (item->modified == (time_t) -1) item->modified = time (NULL); } /** * g_bookmark_file_remove_item: * @bookmark: a #GBookmarkFile * @uri: a valid URI * @error: return location for a #GError, or %NULL * * Removes the bookmark for @uri from the bookmark file @bookmark. * * Return value: %TRUE if the bookmark was removed successfully. * * Since: 2.12 */ gboolean g_bookmark_file_remove_item (GBookmarkFile *bookmark, const gchar *uri, GError **error) { BookmarkItem *item; g_return_val_if_fail (bookmark != NULL, FALSE); g_return_val_if_fail (uri != NULL, FALSE); item = g_bookmark_file_lookup_item (bookmark, uri); if (!item) { g_set_error (error, G_BOOKMARK_FILE_ERROR, G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND, _("No bookmark found for URI '%s'"), uri); return FALSE; } bookmark->items = g_list_remove (bookmark->items, item); g_hash_table_remove (bookmark->items_by_uri, item->uri); bookmark_item_free (item); return TRUE; } /** * g_bookmark_file_has_item: * @bookmark: a #GBookmarkFile * @uri: a valid URI * * Looks whether the desktop bookmark has an item with its URI set to @uri. * * Return value: %TRUE if @uri is inside @bookmark, %FALSE otherwise * * Since: 2.12 */ gboolean g_bookmark_file_has_item (GBookmarkFile *bookmark, const gchar *uri) { g_return_val_if_fail (bookmark != NULL, FALSE); g_return_val_if_fail (uri != NULL, FALSE); return (NULL != g_hash_table_lookup (bookmark->items_by_uri, uri)); } /** * g_bookmark_file_get_uris: * @bookmark: a #GBookmarkFile * @length: (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: (array length=length) (transfer full): a newly allocated %NULL-terminated array of strings. * Use g_strfreev() to free it. * * Since: 2.12 */ gchar ** g_bookmark_file_get_uris (GBookmarkFile *bookmark, gsize *length) { GList *l; gchar **uris; gsize i, n_items; g_return_val_if_fail (bookmark != NULL, NULL); n_items = g_list_length (bookmark->items); uris = g_new0 (gchar *, n_items + 1); /* the items are stored in reverse order, so we walk the list backward */ for (l = g_list_last (bookmark->items), i = 0; l != NULL; l = l->prev) { BookmarkItem *item = (BookmarkItem *) l->data; g_warn_if_fail (item != NULL); uris[i++] = g_strdup (item->uri); } uris[i] = NULL; if (length) *length = i; return uris; } /** * g_bookmark_file_set_title: * @bookmark: a #GBookmarkFile * @uri: (allow-none): a valid URI or %NULL * @title: a UTF-8 encoded string * * Sets @title as the title of the bookmark for @uri inside the * bookmark file @bookmark. * * If @uri is %NULL, the title of @bookmark is set. * * If a bookmark for @uri cannot be found then it is created. * * Since: 2.12 */ void g_bookmark_file_set_title (GBookmarkFile *bookmark, const gchar *uri, const gchar *title) { g_return_if_fail (bookmark != NULL); if (!uri) { g_free (bookmark->title); bookmark->title = g_strdup (title); } else { BookmarkItem *item; item = g_bookmark_file_lookup_item (bookmark, uri); if (!item) { item = bookmark_item_new (uri); g_bookmark_file_add_item (bookmark, item, NULL); } g_free (item->title); item->title = g_strdup (title); item->modified = time (NULL); } } /** * g_bookmark_file_get_title: * @bookmark: a #GBookmarkFile * @uri: (allow-none): a valid URI or %NULL * @error: return location for a #GError, or %NULL * * Returns the title of the bookmark for @uri. * * If @uri is %NULL, the title of @bookmark is returned. * * In the event the URI cannot be found, %NULL is returned and * @error is set to #G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND. * * Return value: a newly allocated string or %NULL if the specified * URI cannot be found. * * Since: 2.12 */ gchar * g_bookmark_file_get_title (GBookmarkFile *bookmark, const gchar *uri, GError **error) { BookmarkItem *item; g_return_val_if_fail (bookmark != NULL, NULL); if (!uri) return g_strdup (bookmark->title); item = g_bookmark_file_lookup_item (bookmark, uri); if (!item) { g_set_error (error, G_BOOKMARK_FILE_ERROR, G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND, _("No bookmark found for URI '%s'"), uri); return NULL; } return g_strdup (item->title); } /** * g_bookmark_file_set_description: * @bookmark: a #GBookmarkFile * @uri: (allow-none): a valid URI or %NULL * @description: a string * * Sets @description as the description of the bookmark for @uri. * * If @uri is %NULL, the description of @bookmark is set. * * If a bookmark for @uri cannot be found then it is created. * * Since: 2.12 */ void g_bookmark_file_set_description (GBookmarkFile *bookmark, const gchar *uri, const gchar *description) { g_return_if_fail (bookmark != NULL); if (!uri) { g_free (bookmark->description); bookmark->description = g_strdup (description); } else { BookmarkItem *item; item = g_bookmark_file_lookup_item (bookmark, uri); if (!item) { item = bookmark_item_new (uri); g_bookmark_file_add_item (bookmark, item, NULL); } g_free (item->description); item->description = g_strdup (description); item->modified = time (NULL); } } /** * g_bookmark_file_get_description: * @bookmark: a #GBookmarkFile * @uri: a valid URI * @error: return location for a #GError, or %NULL * * Retrieves the description of the bookmark for @uri. * * In the event the URI cannot be found, %NULL is returned and * @error is set to #G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND. * * Return value: a newly allocated string or %NULL if the specified * URI cannot be found. * * Since: 2.12 */ gchar * g_bookmark_file_get_description (GBookmarkFile *bookmark, const gchar *uri, GError **error) { BookmarkItem *item; g_return_val_if_fail (bookmark != NULL, NULL); if (!uri) return g_strdup (bookmark->description); item = g_bookmark_file_lookup_item (bookmark, uri); if (!item) { g_set_error (error, G_BOOKMARK_FILE_ERROR, G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND, _("No bookmark found for URI '%s'"), uri); return NULL; } return g_strdup (item->description); } /** * g_bookmark_file_set_mime_type: * @bookmark: a #GBookmarkFile * @uri: a valid URI * @mime_type: a MIME type * * Sets @mime_type as the MIME type of the bookmark for @uri. * * If a bookmark for @uri cannot be found then it is created. * * Since: 2.12 */ void g_bookmark_file_set_mime_type (GBookmarkFile *bookmark, const gchar *uri, const gchar *mime_type) { BookmarkItem *item; g_return_if_fail (bookmark != NULL); g_return_if_fail (uri != NULL); g_return_if_fail (mime_type != NULL); item = g_bookmark_file_lookup_item (bookmark, uri); if (!item) { item = bookmark_item_new (uri); g_bookmark_file_add_item (bookmark, item, NULL); } if (!item->metadata) item->metadata = bookmark_metadata_new (); g_free (item->metadata->mime_type); item->metadata->mime_type = g_strdup (mime_type); item->modified = time (NULL); } /** * g_bookmark_file_get_mime_type: * @bookmark: a #GBookmarkFile * @uri: a valid URI * @error: return location for a #GError, or %NULL * * Retrieves the MIME type of the resource pointed by @uri. * * In the event the URI cannot be found, %NULL is returned and * @error is set to #G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND. In the * event that the MIME type cannot be found, %NULL is returned and * @error is set to #G_BOOKMARK_FILE_ERROR_INVALID_VALUE. * * Return value: a newly allocated string or %NULL if the specified * URI cannot be found. * * Since: 2.12 */ gchar * g_bookmark_file_get_mime_type (GBookmarkFile *bookmark, const gchar *uri, GError **error) { BookmarkItem *item; g_return_val_if_fail (bookmark != NULL, NULL); g_return_val_if_fail (uri != NULL, NULL); item = g_bookmark_file_lookup_item (bookmark, uri); if (!item) { g_set_error (error, G_BOOKMARK_FILE_ERROR, G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND, _("No bookmark found for URI '%s'"), uri); return NULL; } if (!item->metadata) { g_set_error (error, G_BOOKMARK_FILE_ERROR, G_BOOKMARK_FILE_ERROR_INVALID_VALUE, _("No MIME type defined in the bookmark for URI '%s'"), uri); return NULL; } return g_strdup (item->metadata->mime_type); } /** * g_bookmark_file_set_is_private: * @bookmark: a #GBookmarkFile * @uri: a valid URI * @is_private: %TRUE if the bookmark should be marked as private * * Sets the private flag of the bookmark for @uri. * * If a bookmark for @uri cannot be found then it is created. * * Since: 2.12 */ void g_bookmark_file_set_is_private (GBookmarkFile *bookmark, const gchar *uri, gboolean is_private) { BookmarkItem *item; g_return_if_fail (bookmark != NULL); g_return_if_fail (uri != NULL); item = g_bookmark_file_lookup_item (bookmark, uri); if (!item) { item = bookmark_item_new (uri); g_bookmark_file_add_item (bookmark, item, NULL); } if (!item->metadata) item->metadata = bookmark_metadata_new (); item->metadata->is_private = (is_private == TRUE); item->modified = time (NULL); } /** * g_bookmark_file_get_is_private: * @bookmark: a #GBookmarkFile * @uri: a valid URI * @error: return location for a #GError, or %NULL * * Gets whether the private flag of the bookmark for @uri is set. * * In the event the URI cannot be found, %FALSE is returned and * @error is set to #G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND. In the * event that the private flag cannot be found, %FALSE is returned and * @error is set to #G_BOOKMARK_FILE_ERROR_INVALID_VALUE. * * Return value: %TRUE if the private flag is set, %FALSE otherwise. * * Since: 2.12 */ gboolean g_bookmark_file_get_is_private (GBookmarkFile *bookmark, const gchar *uri, GError **error) { BookmarkItem *item; g_return_val_if_fail (bookmark != NULL, FALSE); g_return_val_if_fail (uri != NULL, FALSE); item = g_bookmark_file_lookup_item (bookmark, uri); if (!item) { g_set_error (error, G_BOOKMARK_FILE_ERROR, G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND, _("No bookmark found for URI '%s'"), uri); return FALSE; } if (!item->metadata) { g_set_error (error, G_BOOKMARK_FILE_ERROR, G_BOOKMARK_FILE_ERROR_INVALID_VALUE, _("No private flag has been defined in bookmark for URI '%s'"), uri); return FALSE; } return item->metadata->is_private; } /** * g_bookmark_file_set_added: * @bookmark: a #GBookmarkFile * @uri: a valid URI * @added: a timestamp or -1 to use the current time * * Sets the time the bookmark for @uri was added into @bookmark. * * If no bookmark for @uri is found then it is created. * * Since: 2.12 */ void g_bookmark_file_set_added (GBookmarkFile *bookmark, const gchar *uri, time_t added) { BookmarkItem *item; g_return_if_fail (bookmark != NULL); g_return_if_fail (uri != NULL); item = g_bookmark_file_lookup_item (bookmark, uri); if (!item) { item = bookmark_item_new (uri); g_bookmark_file_add_item (bookmark, item, NULL); } if (added == (time_t) -1) time (&added); item->added = added; item->modified = added; } /** * g_bookmark_file_get_added: * @bookmark: a #GBookmarkFile * @uri: a valid URI * @error: return location for a #GError, or %NULL * * Gets the time the bookmark for @uri was added to @bookmark * * In the event the URI cannot be found, -1 is returned and * @error is set to #G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND. * * Return value: a timestamp * * Since: 2.12 */ time_t g_bookmark_file_get_added (GBookmarkFile *bookmark, const gchar *uri, GError **error) { BookmarkItem *item; g_return_val_if_fail (bookmark != NULL, (time_t) -1); g_return_val_if_fail (uri != NULL, (time_t) -1); item = g_bookmark_file_lookup_item (bookmark, uri); if (!item) { g_set_error (error, G_BOOKMARK_FILE_ERROR, G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND, _("No bookmark found for URI '%s'"), uri); return (time_t) -1; } return item->added; } /** * g_bookmark_file_set_modified: * @bookmark: a #GBookmarkFile * @uri: a valid URI * @modified: a timestamp or -1 to use the current time * * Sets the last time the bookmark for @uri was last modified. * * If no bookmark for @uri is found then it is created. * * The "modified" time should only be set when the bookmark's meta-data * was actually changed. Every function of #GBookmarkFile that * modifies a bookmark also changes the modification time, except for * g_bookmark_file_set_visited(). * * Since: 2.12 */ void g_bookmark_file_set_modified (GBookmarkFile *bookmark, const gchar *uri, time_t modified) { BookmarkItem *item; g_return_if_fail (bookmark != NULL); g_return_if_fail (uri != NULL); item = g_bookmark_file_lookup_item (bookmark, uri); if (!item) { item = bookmark_item_new (uri); g_bookmark_file_add_item (bookmark, item, NULL); } if (modified == (time_t) -1) time (&modified); item->modified = modified; } /** * g_bookmark_file_get_modified: * @bookmark: a #GBookmarkFile * @uri: a valid URI * @error: return location for a #GError, or %NULL * * Gets the time when the bookmark for @uri was last modified. * * In the event the URI cannot be found, -1 is returned and * @error is set to #G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND. * * Return value: a timestamp * * Since: 2.12 */ time_t g_bookmark_file_get_modified (GBookmarkFile *bookmark, const gchar *uri, GError **error) { BookmarkItem *item; g_return_val_if_fail (bookmark != NULL, (time_t) -1); g_return_val_if_fail (uri != NULL, (time_t) -1); item = g_bookmark_file_lookup_item (bookmark, uri); if (!item) { g_set_error (error, G_BOOKMARK_FILE_ERROR, G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND, _("No bookmark found for URI '%s'"), uri); return (time_t) -1; } return item->modified; } /** * g_bookmark_file_set_visited: * @bookmark: a #GBookmarkFile * @uri: a valid URI * @visited: a timestamp or -1 to use the current time * * Sets the time the bookmark for @uri was last visited. * * If no bookmark for @uri is found then it is created. * * The "visited" time should only be set if the bookmark was launched, * either using the command line retrieved by g_bookmark_file_get_app_info() * or by the default application for the bookmark's MIME type, retrieved * using g_bookmark_file_get_mime_type(). Changing the "visited" time * does not affect the "modified" time. * * Since: 2.12 */ void g_bookmark_file_set_visited (GBookmarkFile *bookmark, const gchar *uri, time_t visited) { BookmarkItem *item; g_return_if_fail (bookmark != NULL); g_return_if_fail (uri != NULL); item = g_bookmark_file_lookup_item (bookmark, uri); if (!item) { item = bookmark_item_new (uri); g_bookmark_file_add_item (bookmark, item, NULL); } if (visited == (time_t) -1) time (&visited); item->visited = visited; } /** * g_bookmark_file_get_visited: * @bookmark: a #GBookmarkFile * @uri: a valid URI * @error: return location for a #GError, or %NULL * * Gets the time the bookmark for @uri was last visited. * * In the event the URI cannot be found, -1 is returned and * @error is set to #G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND. * * Return value: a timestamp. * * Since: 2.12 */ time_t g_bookmark_file_get_visited (GBookmarkFile *bookmark, const gchar *uri, GError **error) { BookmarkItem *item; g_return_val_if_fail (bookmark != NULL, (time_t) -1); g_return_val_if_fail (uri != NULL, (time_t) -1); item = g_bookmark_file_lookup_item (bookmark, uri); if (!item) { g_set_error (error, G_BOOKMARK_FILE_ERROR, G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND, _("No bookmark found for URI '%s'"), uri); return (time_t) -1; } return item->visited; } /** * g_bookmark_file_has_group: * @bookmark: a #GBookmarkFile * @uri: a valid URI * @group: the group name to be searched * @error: return location for a #GError, or %NULL * * Checks whether @group appears in the list of groups to which * the bookmark for @uri belongs to. * * In the event the URI cannot be found, %FALSE is returned and * @error is set to #G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND. * * Return value: %TRUE if @group was found. * * Since: 2.12 */ gboolean g_bookmark_file_has_group (GBookmarkFile *bookmark, const gchar *uri, const gchar *group, GError **error) { BookmarkItem *item; GList *l; g_return_val_if_fail (bookmark != NULL, FALSE); g_return_val_if_fail (uri != NULL, FALSE); item = g_bookmark_file_lookup_item (bookmark, uri); if (!item) { g_set_error (error, G_BOOKMARK_FILE_ERROR, G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND, _("No bookmark found for URI '%s'"), uri); return FALSE; } if (!item->metadata) return FALSE; for (l = item->metadata->groups; l != NULL; l = l->next) { if (strcmp (l->data, group) == 0) return TRUE; } return FALSE; } /** * g_bookmark_file_add_group: * @bookmark: a #GBookmarkFile * @uri: a valid URI * @group: the group name to be added * * Adds @group to the list of groups to which the bookmark for @uri * belongs to. * * If no bookmark for @uri is found then it is created. * * Since: 2.12 */ void g_bookmark_file_add_group (GBookmarkFile *bookmark, const gchar *uri, const gchar *group) { BookmarkItem *item; g_return_if_fail (bookmark != NULL); g_return_if_fail (uri != NULL); g_return_if_fail (group != NULL && group[0] != '\0'); item = g_bookmark_file_lookup_item (bookmark, uri); if (!item) { item = bookmark_item_new (uri); g_bookmark_file_add_item (bookmark, item, NULL); } if (!item->metadata) item->metadata = bookmark_metadata_new (); if (!g_bookmark_file_has_group (bookmark, uri, group, NULL)) { item->metadata->groups = g_list_prepend (item->metadata->groups, g_strdup (group)); item->modified = time (NULL); } } /** * g_bookmark_file_remove_group: * @bookmark: a #GBookmarkFile * @uri: a valid URI * @group: the group name to be removed * @error: return location for a #GError, or %NULL * * Removes @group from the list of groups to which the bookmark * for @uri belongs to. * * In the event the URI cannot be found, %FALSE is returned and * @error is set to #G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND. * In the event no group was defined, %FALSE is returned and * @error is set to #G_BOOKMARK_FILE_ERROR_INVALID_VALUE. * * Return value: %TRUE if @group was successfully removed. * * Since: 2.12 */ gboolean g_bookmark_file_remove_group (GBookmarkFile *bookmark, const gchar *uri, const gchar *group, GError **error) { BookmarkItem *item; GList *l; g_return_val_if_fail (bookmark != NULL, FALSE); g_return_val_if_fail (uri != NULL, FALSE); item = g_bookmark_file_lookup_item (bookmark, uri); if (!item) { g_set_error (error, G_BOOKMARK_FILE_ERROR, G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND, _("No bookmark found for URI '%s'"), uri); return FALSE; } if (!item->metadata) { g_set_error (error, G_BOOKMARK_FILE_ERROR, G_BOOKMARK_FILE_ERROR_INVALID_VALUE, _("No groups set in bookmark for URI '%s'"), uri); return FALSE; } for (l = item->metadata->groups; l != NULL; l = l->next) { if (strcmp (l->data, group) == 0) { item->metadata->groups = g_list_remove_link (item->metadata->groups, l); g_free (l->data); g_list_free_1 (l); item->modified = time (NULL); return TRUE; } } return FALSE; } /** * g_bookmark_file_set_groups: * @bookmark: a #GBookmarkFile * @uri: an item's URI * @groups: (allow-none): an array of group names, or %NULL to remove all groups * @length: number of group name values in @groups * * Sets a list of group names for the item with URI @uri. Each previously * set group name list is removed. * * If @uri cannot be found then an item for it is created. * * Since: 2.12 */ void g_bookmark_file_set_groups (GBookmarkFile *bookmark, const gchar *uri, const gchar **groups, gsize length) { BookmarkItem *item; gsize i; g_return_if_fail (bookmark != NULL); g_return_if_fail (uri != NULL); g_return_if_fail (groups != NULL); item = g_bookmark_file_lookup_item (bookmark, uri); if (!item) { item = bookmark_item_new (uri); g_bookmark_file_add_item (bookmark, item, NULL); } if (!item->metadata) item->metadata = bookmark_metadata_new (); g_list_free_full (item->metadata->groups, g_free); item->metadata->groups = NULL; if (groups) { for (i = 0; groups[i] != NULL && i < length; i++) item->metadata->groups = g_list_append (item->metadata->groups, g_strdup (groups[i])); } item->modified = time (NULL); } /** * g_bookmark_file_get_groups: * @bookmark: a #GBookmarkFile * @uri: a valid URI * @length: (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. * * In the event the URI cannot be found, %NULL is returned and * @error is set to #G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND. * * The returned array is %NULL terminated, so @length may optionally * be %NULL. * * Return value: (array length=length) (transfer full): a newly allocated %NULL-terminated array of group names. * Use g_strfreev() to free it. * * Since: 2.12 */ gchar ** g_bookmark_file_get_groups (GBookmarkFile *bookmark, const gchar *uri, gsize *length, GError **error) { BookmarkItem *item; GList *l; gsize len, i; gchar **retval; g_return_val_if_fail (bookmark != NULL, NULL); g_return_val_if_fail (uri != NULL, NULL); item = g_bookmark_file_lookup_item (bookmark, uri); if (!item) { g_set_error (error, G_BOOKMARK_FILE_ERROR, G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND, _("No bookmark found for URI '%s'"), uri); return NULL; } if (!item->metadata) { if (length) *length = 0; return NULL; } len = g_list_length (item->metadata->groups); retval = g_new0 (gchar *, len + 1); for (l = g_list_last (item->metadata->groups), i = 0; l != NULL; l = l->prev) { gchar *group_name = (gchar *) l->data; g_warn_if_fail (group_name != NULL); retval[i++] = g_strdup (group_name); } retval[i] = NULL; if (length) *length = len; return retval; } /** * g_bookmark_file_add_application: * @bookmark: a #GBookmarkFile * @uri: a valid URI * @name: (allow-none): the name of the application registering the bookmark * or %NULL * @exec: (allow-none): command line to be used to launch the bookmark or %NULL * * Adds the application with @name and @exec to the list of * applications that have registered a bookmark for @uri into * @bookmark. * * Every bookmark inside a #GBookmarkFile must have at least an * application registered. Each application must provide a name, a * command line useful for launching the bookmark, the number of times * the bookmark has been registered by the application and the last * time the application registered this bookmark. * * If @name is %NULL, the name of the application will be the * same returned by g_get_application_name(); if @exec is %NULL, the * command line will be a composition of the program name as * returned by g_get_prgname() and the "\%u" modifier, which will be * expanded to the bookmark's URI. * * This function will automatically take care of updating the * registrations count and timestamping in case an application * with the same @name had already registered a bookmark for * @uri inside @bookmark. * * If no bookmark for @uri is found, one is created. * * Since: 2.12 */ void g_bookmark_file_add_application (GBookmarkFile *bookmark, const gchar *uri, const gchar *name, const gchar *exec) { BookmarkItem *item; gchar *app_name, *app_exec; g_return_if_fail (bookmark != NULL); g_return_if_fail (uri != NULL); item = g_bookmark_file_lookup_item (bookmark, uri); if (!item) { item = bookmark_item_new (uri); g_bookmark_file_add_item (bookmark, item, NULL); } if (name && name[0] != '\0') app_name = g_strdup (name); else app_name = g_strdup (g_get_application_name ()); if (exec && exec[0] != '\0') app_exec = g_strdup (exec); else app_exec = g_strjoin (" ", g_get_prgname(), "%u", NULL); g_bookmark_file_set_app_info (bookmark, uri, app_name, app_exec, -1, (time_t) -1, NULL); g_free (app_exec); g_free (app_name); } /** * g_bookmark_file_remove_application: * @bookmark: a #GBookmarkFile * @uri: a valid URI * @name: the name of the application * @error: return location for a #GError or %NULL * * Removes application registered with @name from the list of applications * that have registered a bookmark for @uri inside @bookmark. * * In the event the URI cannot be found, %FALSE is returned and * @error is set to #G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND. * In the event that no application with name @app_name has registered * a bookmark for @uri, %FALSE is returned and error is set to * #G_BOOKMARK_FILE_ERROR_APP_NOT_REGISTERED. * * Return value: %TRUE if the application was successfully removed. * * Since: 2.12 */ gboolean g_bookmark_file_remove_application (GBookmarkFile *bookmark, const gchar *uri, const gchar *name, GError **error) { GError *set_error; gboolean retval; g_return_val_if_fail (bookmark != NULL, FALSE); g_return_val_if_fail (uri != NULL, FALSE); g_return_val_if_fail (name != NULL, FALSE); set_error = NULL; retval = g_bookmark_file_set_app_info (bookmark, uri, name, "", 0, (time_t) -1, &set_error); if (set_error) { g_propagate_error (error, set_error); return FALSE; } return retval; } /** * g_bookmark_file_has_application: * @bookmark: a #GBookmarkFile * @uri: a valid URI * @name: the name of the application * @error: return location for a #GError or %NULL * * Checks whether the bookmark for @uri inside @bookmark has been * registered by application @name. * * In the event the URI cannot be found, %FALSE is returned and * @error is set to #G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND. * * Return value: %TRUE if the application @name was found * * Since: 2.12 */ gboolean g_bookmark_file_has_application (GBookmarkFile *bookmark, const gchar *uri, const gchar *name, GError **error) { BookmarkItem *item; g_return_val_if_fail (bookmark != NULL, FALSE); g_return_val_if_fail (uri != NULL, FALSE); g_return_val_if_fail (name != NULL, FALSE); item = g_bookmark_file_lookup_item (bookmark, uri); if (!item) { g_set_error (error, G_BOOKMARK_FILE_ERROR, G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND, _("No bookmark found for URI '%s'"), uri); return FALSE; } return (NULL != bookmark_item_lookup_app_info (item, name)); } /** * g_bookmark_file_set_app_info: * @bookmark: a #GBookmarkFile * @uri: a valid URI * @name: an application's name * @exec: an application's command line * @count: the number of registrations done for this application * @stamp: the time of the last registration for this application * @error: return location for a #GError or %NULL * * Sets the meta-data of application @name inside the list of * applications that have registered a bookmark for @uri inside * @bookmark. * * You should rarely use this function; use g_bookmark_file_add_application() * and g_bookmark_file_remove_application() instead. * * @name can be any UTF-8 encoded string used to identify an * application. * @exec can have one of these two modifiers: "\%f", which will * be expanded as the local file name retrieved from the bookmark's * URI; "\%u", which will be expanded as the bookmark's URI. * The expansion is done automatically when retrieving the stored * command line using the g_bookmark_file_get_app_info() function. * @count is the number of times the application has registered the * bookmark; if is < 0, the current registration count will be increased * by one, if is 0, the application with @name will be removed from * the list of registered applications. * @stamp is the Unix time of the last registration; if it is -1, the * current time will be used. * * If you try to remove an application by setting its registration count to * zero, and no bookmark for @uri is found, %FALSE is returned and * @error is set to #G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND; similarly, * in the event that no application @name has registered a bookmark * for @uri, %FALSE is returned and error is set to * #G_BOOKMARK_FILE_ERROR_APP_NOT_REGISTERED. Otherwise, if no bookmark * for @uri is found, one is created. * * Return value: %TRUE if the application's meta-data was successfully * changed. * * Since: 2.12 */ gboolean g_bookmark_file_set_app_info (GBookmarkFile *bookmark, const gchar *uri, const gchar *name, const gchar *exec, gint count, time_t stamp, GError **error) { BookmarkItem *item; BookmarkAppInfo *ai; g_return_val_if_fail (bookmark != NULL, FALSE); g_return_val_if_fail (uri != NULL, FALSE); g_return_val_if_fail (name != NULL, FALSE); g_return_val_if_fail (exec != NULL, FALSE); item = g_bookmark_file_lookup_item (bookmark, uri); if (!item) { if (count == 0) { g_set_error (error, G_BOOKMARK_FILE_ERROR, G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND, _("No bookmark found for URI '%s'"), uri); return FALSE; } else { item = bookmark_item_new (uri); g_bookmark_file_add_item (bookmark, item, NULL); } } if (!item->metadata) item->metadata = bookmark_metadata_new (); ai = bookmark_item_lookup_app_info (item, name); if (!ai) { if (count == 0) { g_set_error (error, G_BOOKMARK_FILE_ERROR, G_BOOKMARK_FILE_ERROR_APP_NOT_REGISTERED, _("No application with name '%s' registered a bookmark for '%s'"), name, uri); return FALSE; } else { ai = bookmark_app_info_new (name); item->metadata->applications = g_list_prepend (item->metadata->applications, ai); g_hash_table_replace (item->metadata->apps_by_name, ai->name, ai); } } if (count == 0) { item->metadata->applications = g_list_remove (item->metadata->applications, ai); g_hash_table_remove (item->metadata->apps_by_name, ai->name); bookmark_app_info_free (ai); item->modified = time (NULL); return TRUE; } else if (count > 0) ai->count = count; else ai->count += 1; if (stamp != (time_t) -1) ai->stamp = stamp; else ai->stamp = time (NULL); if (exec && exec[0] != '\0') { g_free (ai->exec); ai->exec = g_shell_quote (exec); } item->modified = time (NULL); return TRUE; } /* expands the application's command line */ static gchar * expand_exec_line (const gchar *exec_fmt, const gchar *uri) { GString *exec; gchar ch; exec = g_string_sized_new (512); while ((ch = *exec_fmt++) != '\0') { if (ch != '%') { exec = g_string_append_c (exec, ch); continue; } ch = *exec_fmt++; switch (ch) { case '\0': goto out; case 'U': case 'u': g_string_append (exec, uri); break; case 'F': case 'f': { gchar *file = g_filename_from_uri (uri, NULL, NULL); if (file) { g_string_append (exec, file); g_free (file); } else { g_string_free (exec, TRUE); return NULL; } } break; case '%': default: exec = g_string_append_c (exec, ch); break; } } out: return g_string_free (exec, FALSE); } /** * g_bookmark_file_get_app_info: * @bookmark: a #GBookmarkFile * @uri: a valid URI * @name: an application's name * @exec: (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 * @uri. See g_bookmark_file_set_app_info() for more informations about * the returned data. * * The string returned in @app_exec must be freed. * * In the event the URI cannot be found, %FALSE is returned and * @error is set to #G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND. In the * event that no application with name @app_name has registered a bookmark * for @uri, %FALSE is returned and error is set to * #G_BOOKMARK_FILE_ERROR_APP_NOT_REGISTERED. In the event that unquoting * the command line fails, an error of the #G_SHELL_ERROR domain is * set and %FALSE is returned. * * Return value: %TRUE on success. * * Since: 2.12 */ gboolean g_bookmark_file_get_app_info (GBookmarkFile *bookmark, const gchar *uri, const gchar *name, gchar **exec, guint *count, time_t *stamp, GError **error) { BookmarkItem *item; BookmarkAppInfo *ai; g_return_val_if_fail (bookmark != NULL, FALSE); g_return_val_if_fail (uri != NULL, FALSE); g_return_val_if_fail (name != NULL, FALSE); item = g_bookmark_file_lookup_item (bookmark, uri); if (!item) { g_set_error (error, G_BOOKMARK_FILE_ERROR, G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND, _("No bookmark found for URI '%s'"), uri); return FALSE; } ai = bookmark_item_lookup_app_info (item, name); if (!ai) { g_set_error (error, G_BOOKMARK_FILE_ERROR, G_BOOKMARK_FILE_ERROR_APP_NOT_REGISTERED, _("No application with name '%s' registered a bookmark for '%s'"), name, uri); return FALSE; } if (exec) { GError *unquote_error = NULL; gchar *command_line; command_line = g_shell_unquote (ai->exec, &unquote_error); if (unquote_error) { g_propagate_error (error, unquote_error); return FALSE; } *exec = expand_exec_line (command_line, uri); if (!*exec) { g_set_error (error, G_BOOKMARK_FILE_ERROR, G_BOOKMARK_FILE_ERROR_INVALID_URI, _("Failed to expand exec line '%s' with URI '%s'"), ai->exec, uri); g_free (command_line); return FALSE; } else g_free (command_line); } if (count) *count = ai->count; if (stamp) *stamp = ai->stamp; return TRUE; } /** * g_bookmark_file_get_applications: * @bookmark: a #GBookmarkFile * @uri: a valid URI * @length: (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 * bookmark for @uri. * * In the event the URI cannot be found, %NULL is returned and * @error is set to #G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND. * * Return value: (array length=length) (transfer full): a newly allocated %NULL-terminated array of strings. * Use g_strfreev() to free it. * * Since: 2.12 */ gchar ** g_bookmark_file_get_applications (GBookmarkFile *bookmark, const gchar *uri, gsize *length, GError **error) { BookmarkItem *item; GList *l; gchar **apps; gsize i, n_apps; g_return_val_if_fail (bookmark != NULL, NULL); g_return_val_if_fail (uri != NULL, NULL); item = g_bookmark_file_lookup_item (bookmark, uri); if (!item) { g_set_error (error, G_BOOKMARK_FILE_ERROR, G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND, _("No bookmark found for URI '%s'"), uri); return NULL; } if (!item->metadata) { if (length) *length = 0; return NULL; } n_apps = g_list_length (item->metadata->applications); apps = g_new0 (gchar *, n_apps + 1); for (l = g_list_last (item->metadata->applications), i = 0; l != NULL; l = l->prev) { BookmarkAppInfo *ai; ai = (BookmarkAppInfo *) l->data; g_warn_if_fail (ai != NULL); g_warn_if_fail (ai->name != NULL); apps[i++] = g_strdup (ai->name); } apps[i] = NULL; if (length) *length = i; return apps; } /** * g_bookmark_file_get_size: * @bookmark: a #GBookmarkFile * * Gets the number of bookmarks inside @bookmark. * * Return value: the number of bookmarks * * Since: 2.12 */ gint g_bookmark_file_get_size (GBookmarkFile *bookmark) { g_return_val_if_fail (bookmark != NULL, 0); return g_list_length (bookmark->items); } /** * g_bookmark_file_move_item: * @bookmark: a #GBookmarkFile * @old_uri: a valid URI * @new_uri: (allow-none): a valid URI, or %NULL * @error: return location for a #GError or %NULL * * Changes the URI of a bookmark item from @old_uri to @new_uri. Any * existing bookmark for @new_uri will be overwritten. If @new_uri is * %NULL, then the bookmark is removed. * * In the event the URI cannot be found, %FALSE is returned and * @error is set to #G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND. * * Return value: %TRUE if the URI was successfully changed * * Since: 2.12 */ gboolean g_bookmark_file_move_item (GBookmarkFile *bookmark, const gchar *old_uri, const gchar *new_uri, GError **error) { BookmarkItem *item; GError *remove_error; g_return_val_if_fail (bookmark != NULL, FALSE); g_return_val_if_fail (old_uri != NULL, FALSE); item = g_bookmark_file_lookup_item (bookmark, old_uri); if (!item) { g_set_error (error, G_BOOKMARK_FILE_ERROR, G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND, _("No bookmark found for URI '%s'"), old_uri); return FALSE; } if (new_uri && new_uri[0] != '\0') { if (g_bookmark_file_has_item (bookmark, new_uri)) { remove_error = NULL; g_bookmark_file_remove_item (bookmark, new_uri, &remove_error); if (remove_error) { g_propagate_error (error, remove_error); return FALSE; } } g_hash_table_steal (bookmark->items_by_uri, item->uri); g_free (item->uri); item->uri = g_strdup (new_uri); item->modified = time (NULL); g_hash_table_replace (bookmark->items_by_uri, item->uri, item); return TRUE; } else { remove_error = NULL; g_bookmark_file_remove_item (bookmark, old_uri, &remove_error); if (remove_error) { g_propagate_error (error, remove_error); return FALSE; } return TRUE; } } /** * g_bookmark_file_set_icon: * @bookmark: a #GBookmarkFile * @uri: a valid URI * @href: (allow-none): the URI of the icon for the bookmark, or %NULL * @mime_type: the MIME type of the icon for the bookmark * * Sets the icon for the bookmark for @uri. If @href is %NULL, unsets * the currently set icon. @href can either be a full URL for the icon * file or the icon name following the Icon Naming specification. * * If no bookmark for @uri is found one is created. * * Since: 2.12 */ void g_bookmark_file_set_icon (GBookmarkFile *bookmark, const gchar *uri, const gchar *href, const gchar *mime_type) { BookmarkItem *item; g_return_if_fail (bookmark != NULL); g_return_if_fail (uri != NULL); item = g_bookmark_file_lookup_item (bookmark, uri); if (!item) { item = bookmark_item_new (uri); g_bookmark_file_add_item (bookmark, item, NULL); } if (!item->metadata) item->metadata = bookmark_metadata_new (); g_free (item->metadata->icon_href); g_free (item->metadata->icon_mime); item->metadata->icon_href = g_strdup (href); if (mime_type && mime_type[0] != '\0') item->metadata->icon_mime = g_strdup (mime_type); else item->metadata->icon_mime = g_strdup ("application/octet-stream"); item->modified = time (NULL); } /** * g_bookmark_file_get_icon: * @bookmark: a #GBookmarkFile * @uri: a valid URI * @href: (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. * * In the event the URI cannot be found, %FALSE is returned and * @error is set to #G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND. * * Return value: %TRUE if the icon for the bookmark for the URI was found. * You should free the returned strings. * * Since: 2.12 */ gboolean g_bookmark_file_get_icon (GBookmarkFile *bookmark, const gchar *uri, gchar **href, gchar **mime_type, GError **error) { BookmarkItem *item; g_return_val_if_fail (bookmark != NULL, FALSE); g_return_val_if_fail (uri != NULL, FALSE); item = g_bookmark_file_lookup_item (bookmark, uri); if (!item) { g_set_error (error, G_BOOKMARK_FILE_ERROR, G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND, _("No bookmark found for URI '%s'"), uri); return FALSE; } if ((!item->metadata) || (!item->metadata->icon_href)) return FALSE; if (href) *href = g_strdup (item->metadata->icon_href); if (mime_type) *mime_type = g_strdup (item->metadata->icon_mime); return TRUE; } pkg-config-0.29.1/glib/glib/gbookmarkfile.h0000664000175000017500000002274412651243552015407 00000000000000/* gbookmarkfile.h: parsing and building desktop bookmarks * * Copyright (C) 2005-2006 Emmanuele Bassi * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, */ #ifndef __G_BOOKMARK_FILE_H__ #define __G_BOOKMARK_FILE_H__ #if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) #error "Only can be included directly." #endif #include #include G_BEGIN_DECLS /** * G_BOOKMARK_FILE_ERROR: * * Error domain for bookmark file parsing. * Errors in this domain will be from the #GBookmarkFileError * enumeration. See #GError for information on error domains. */ #define G_BOOKMARK_FILE_ERROR (g_bookmark_file_error_quark ()) /** * GBookmarkFileError: * @G_BOOKMARK_FILE_ERROR_INVALID_URI: URI was ill-formed * @G_BOOKMARK_FILE_ERROR_INVALID_VALUE: a requested field was not found * @G_BOOKMARK_FILE_ERROR_APP_NOT_REGISTERED: a requested application did * not register a bookmark * @G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND: a requested URI was not found * @G_BOOKMARK_FILE_ERROR_READ: document was ill formed * @G_BOOKMARK_FILE_ERROR_UNKNOWN_ENCODING: the text being parsed was * in an unknown encoding * @G_BOOKMARK_FILE_ERROR_WRITE: an error occurred while writing * @G_BOOKMARK_FILE_ERROR_FILE_NOT_FOUND: requested file was not found * * Error codes returned by bookmark file parsing. */ typedef enum { G_BOOKMARK_FILE_ERROR_INVALID_URI, G_BOOKMARK_FILE_ERROR_INVALID_VALUE, G_BOOKMARK_FILE_ERROR_APP_NOT_REGISTERED, G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND, G_BOOKMARK_FILE_ERROR_READ, G_BOOKMARK_FILE_ERROR_UNKNOWN_ENCODING, G_BOOKMARK_FILE_ERROR_WRITE, G_BOOKMARK_FILE_ERROR_FILE_NOT_FOUND } GBookmarkFileError; GLIB_AVAILABLE_IN_ALL GQuark g_bookmark_file_error_quark (void); /** * GBookmarkFile: * * The GBookmarkFile struct contains only * private data and should not be directly accessed. */ 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, const gchar *exec, 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, gchar **exec, 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, GError **error); G_END_DECLS #endif /* __G_BOOKMARK_FILE_H__ */ pkg-config-0.29.1/glib/glib/gmappedfile.c0000664000175000017500000002514512651243552015041 00000000000000/* GLIB - Library of useful routines for C programming * gmappedfile.c: Simplified wrapper around the mmap() function. * * Copyright 2005 Matthias Clasen * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "config.h" #include #include #include #include #ifdef HAVE_UNISTD_H #include #endif #ifdef HAVE_MMAP #include #endif #include "glibconfig.h" #ifdef G_OS_WIN32 #include #include #undef fstat #define fstat(a,b) _fstati64(a,b) #undef stat #define stat _stati64 #ifndef S_ISREG #define S_ISREG(m) (((m) & _S_IFMT) == _S_IFREG) #endif #endif #include "gconvert.h" #include "gerror.h" #include "gfileutils.h" #include "gmappedfile.h" #include "gmem.h" #include "gmessages.h" #include "gstdio.h" #include "gstrfuncs.h" #include "gatomic.h" #include "glibintl.h" #ifndef _O_BINARY #define _O_BINARY 0 #endif #ifndef MAP_FAILED #define MAP_FAILED ((void *) -1) #endif /** * GMappedFile: * * The #GMappedFile represents a file mapping created with * g_mapped_file_new(). It has only private members and should * not be accessed directly. */ struct _GMappedFile { gchar *contents; gsize length; gpointer free_func; int ref_count; #ifdef G_OS_WIN32 HANDLE mapping; #endif }; static void g_mapped_file_destroy (GMappedFile *file) { if (file->length) { #ifdef HAVE_MMAP munmap (file->contents, file->length); #endif #ifdef G_OS_WIN32 UnmapViewOfFile (file->contents); CloseHandle (file->mapping); #endif } g_slice_free (GMappedFile, file); } static GMappedFile* mapped_file_new_from_fd (int fd, gboolean writable, const gchar *filename, GError **error) { GMappedFile *file; struct stat st; file = g_slice_new0 (GMappedFile); file->ref_count = 1; file->free_func = g_mapped_file_destroy; if (fstat (fd, &st) == -1) { int save_errno = errno; gchar *display_filename = filename ? g_filename_display_name (filename) : NULL; g_set_error (error, G_FILE_ERROR, g_file_error_from_errno (save_errno), _("Failed to get attributes of file '%s%s%s%s': fstat() failed: %s"), display_filename ? display_filename : "fd", display_filename ? "' " : "", display_filename ? display_filename : "", display_filename ? "'" : "", g_strerror (save_errno)); g_free (display_filename); goto out; } /* mmap() on size 0 will fail with EINVAL, so we avoid calling mmap() * in that case -- but only if we have a regular file; we still want * attempts to mmap a character device to fail, for example. */ if (st.st_size == 0 && S_ISREG (st.st_mode)) { file->length = 0; file->contents = NULL; return file; } file->contents = MAP_FAILED; #ifdef HAVE_MMAP if (st.st_size > G_MAXSIZE) { errno = EINVAL; } else { file->length = (gsize) st.st_size; file->contents = (gchar *) mmap (NULL, file->length, writable ? PROT_READ|PROT_WRITE : PROT_READ, MAP_PRIVATE, fd, 0); } #endif #ifdef G_OS_WIN32 file->length = st.st_size; file->mapping = CreateFileMapping ((HANDLE) _get_osfhandle (fd), NULL, writable ? PAGE_WRITECOPY : PAGE_READONLY, 0, 0, NULL); if (file->mapping != NULL) { file->contents = MapViewOfFile (file->mapping, writable ? FILE_MAP_COPY : FILE_MAP_READ, 0, 0, 0); if (file->contents == NULL) { file->contents = MAP_FAILED; CloseHandle (file->mapping); file->mapping = NULL; } } #endif if (file->contents == MAP_FAILED) { int save_errno = errno; gchar *display_filename = filename ? g_filename_display_name (filename) : NULL; g_set_error (error, G_FILE_ERROR, g_file_error_from_errno (save_errno), _("Failed to map %s%s%s%s: mmap() failed: %s"), display_filename ? display_filename : "fd", display_filename ? "' " : "", display_filename ? display_filename : "", display_filename ? "'" : "", g_strerror (save_errno)); g_free (display_filename); goto out; } return file; out: g_slice_free (GMappedFile, file); return NULL; } /** * g_mapped_file_new: * @filename: The path of the file to load, in the GLib filename encoding * @writable: whether the mapping should be writable * @error: return location for a #GError, or %NULL * * Maps a file into memory. On UNIX, this is using the mmap() function. * * If @writable is %TRUE, the mapped buffer may be modified, otherwise * it is an error to modify the mapped buffer. Modifications to the buffer * are not visible to other processes mapping the same file, and are not * written back to the file. * * Note that modifications of the underlying file might affect the contents * of the #GMappedFile. Therefore, mapping should only be used if the file * will not be modified, or if all modifications of the file are done * atomically (e.g. using g_file_set_contents()). * * If @filename is the name of an empty, regular file, the function * will successfully return an empty #GMappedFile. In other cases of * size 0 (e.g. device files such as /dev/null), @error will be set * to the #GFileError value #G_FILE_ERROR_INVAL. * * Return value: a newly allocated #GMappedFile which must be unref'd * with g_mapped_file_unref(), or %NULL if the mapping failed. * * Since: 2.8 */ GMappedFile * g_mapped_file_new (const gchar *filename, gboolean writable, GError **error) { GMappedFile *file; int fd; g_return_val_if_fail (filename != NULL, NULL); g_return_val_if_fail (!error || *error == NULL, NULL); fd = g_open (filename, (writable ? O_RDWR : O_RDONLY) | _O_BINARY, 0); if (fd == -1) { int save_errno = errno; gchar *display_filename = g_filename_display_name (filename); g_set_error (error, G_FILE_ERROR, g_file_error_from_errno (save_errno), _("Failed to open file '%s': open() failed: %s"), display_filename, g_strerror (save_errno)); g_free (display_filename); return NULL; } file = mapped_file_new_from_fd (fd, writable, filename, error); close (fd); return file; } /** * g_mapped_file_new_from_fd: * @fd: The file descriptor of the file to load * @writable: whether the mapping should be writable * @error: return location for a #GError, or %NULL * * Maps a file into memory. On UNIX, this is using the mmap() function. * * If @writable is %TRUE, the mapped buffer may be modified, otherwise * it is an error to modify the mapped buffer. Modifications to the buffer * are not visible to other processes mapping the same file, and are not * written back to the file. * * Note that modifications of the underlying file might affect the contents * of the #GMappedFile. Therefore, mapping should only be used if the file * will not be modified, or if all modifications of the file are done * atomically (e.g. using g_file_set_contents()). * * Return value: a newly allocated #GMappedFile which must be unref'd * with g_mapped_file_unref(), or %NULL if the mapping failed. * * Since: 2.32 */ GMappedFile * g_mapped_file_new_from_fd (gint fd, gboolean writable, GError **error) { return mapped_file_new_from_fd (fd, writable, NULL, error); } /** * g_mapped_file_get_length: * @file: a #GMappedFile * * Returns the length of the contents of a #GMappedFile. * * Returns: the length of the contents of @file. * * Since: 2.8 */ gsize g_mapped_file_get_length (GMappedFile *file) { g_return_val_if_fail (file != NULL, 0); return file->length; } /** * g_mapped_file_get_contents: * @file: a #GMappedFile * * Returns the contents of a #GMappedFile. * * Note that the contents may not be zero-terminated, * even if the #GMappedFile is backed by a text file. * * If the file is empty then %NULL is returned. * * Returns: the contents of @file, or %NULL. * * Since: 2.8 */ gchar * g_mapped_file_get_contents (GMappedFile *file) { g_return_val_if_fail (file != NULL, NULL); return file->contents; } /** * g_mapped_file_free: * @file: a #GMappedFile * * This call existed before #GMappedFile had refcounting and is currently * exactly the same as g_mapped_file_unref(). * * Since: 2.8 * Deprecated:2.22: Use g_mapped_file_unref() instead. */ void g_mapped_file_free (GMappedFile *file) { g_mapped_file_unref (file); } /** * g_mapped_file_ref: * @file: a #GMappedFile * * Increments the reference count of @file by one. It is safe to call * this function from any thread. * * Return value: the passed in #GMappedFile. * * Since: 2.22 **/ GMappedFile * g_mapped_file_ref (GMappedFile *file) { g_return_val_if_fail (file != NULL, NULL); g_atomic_int_inc (&file->ref_count); return file; } /** * g_mapped_file_unref: * @file: a #GMappedFile * * Decrements the reference count of @file by one. If the reference count * drops to 0, unmaps the buffer of @file and frees it. * * It is safe to call this function from any thread. * * Since 2.22 **/ void g_mapped_file_unref (GMappedFile *file) { g_return_if_fail (file != NULL); 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)); } pkg-config-0.29.1/glib/glib/gpattern.h0000664000175000017500000000347412651243552014416 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997, 1999 Peter Mattis, Red Hat, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __G_PATTERN_H__ #define __G_PATTERN_H__ #if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) #error "Only can be included directly." #endif #include 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); G_END_DECLS #endif /* __G_PATTERN_H__ */ pkg-config-0.29.1/glib/glib/gcharset.c0000664000175000017500000003562412651243552014367 00000000000000/* gcharset.c - Charset information * * Copyright (C) 2011 Red Hat, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "config.h" #include "gcharsetprivate.h" #include "garray.h" #include "genviron.h" #include "ghash.h" #include "gmessages.h" #include "gstrfuncs.h" #include "gthread.h" #ifdef G_OS_WIN32 #include "gwin32.h" #endif #include "libcharset/libcharset.h" #include #include G_LOCK_DEFINE_STATIC (aliases); static GHashTable * get_alias_hash (void) { static GHashTable *alias_hash = NULL; const char *aliases; G_LOCK (aliases); if (!alias_hash) { alias_hash = g_hash_table_new (g_str_hash, g_str_equal); aliases = _g_locale_get_charset_aliases (); while (*aliases != '\0') { const char *canonical; const char *alias; const char **alias_array; int count = 0; alias = aliases; aliases += strlen (aliases) + 1; canonical = aliases; aliases += strlen (aliases) + 1; alias_array = g_hash_table_lookup (alias_hash, canonical); if (alias_array) { while (alias_array[count]) count++; } alias_array = g_renew (const char *, alias_array, count + 2); alias_array[count] = alias; alias_array[count + 1] = NULL; g_hash_table_insert (alias_hash, (char *)canonical, alias_array); } } G_UNLOCK (aliases); return alias_hash; } /* As an abuse of the alias table, the following routines gets * the charsets that are aliases for the canonical name. */ const char ** _g_charset_get_aliases (const char *canonical_name) { GHashTable *alias_hash = get_alias_hash (); return g_hash_table_lookup (alias_hash, canonical_name); } static gboolean g_utf8_get_charset_internal (const char *raw_data, const char **a) { const char *charset = g_getenv ("CHARSET"); if (charset && *charset) { *a = charset; if (charset && strstr (charset, "UTF-8")) return TRUE; else return FALSE; } /* The libcharset code tries to be thread-safe without * a lock, but has a memory leak and a missing memory * barrier, so we lock for it */ G_LOCK (aliases); charset = _g_locale_charset_unalias (raw_data); G_UNLOCK (aliases); if (charset && *charset) { *a = charset; if (charset && strstr (charset, "UTF-8")) return TRUE; else return FALSE; } /* Assume this for compatibility at present. */ *a = "US-ASCII"; return FALSE; } typedef struct _GCharsetCache GCharsetCache; struct _GCharsetCache { gboolean is_utf8; gchar *raw; gchar *charset; }; static void charset_cache_free (gpointer data) { GCharsetCache *cache = data; g_free (cache->raw); g_free (cache->charset); g_free (cache); } /** * g_get_charset: * @charset: return location for character set name * * Obtains the character set for the current * locale; you might use this character set as an argument to * g_convert(), to convert from the current locale's encoding to some * other encoding. (Frequently g_locale_to_utf8() and g_locale_from_utf8() * are nice shortcuts, though.) * * On Windows the character set returned by this function is the * so-called system default ANSI code-page. That is the character set * used by the "narrow" versions of C library and Win32 functions that * handle file names. It might be different from the character set * used by the C library's current locale. * * The return value is %TRUE if the locale's encoding is UTF-8, in that * case you can perhaps avoid calling g_convert(). * * The string returned in @charset is not allocated, and should not be * freed. * * Return value: %TRUE if the returned charset is UTF-8 */ gboolean g_get_charset (const char **charset) { static GPrivate cache_private = G_PRIVATE_INIT (charset_cache_free); GCharsetCache *cache = g_private_get (&cache_private); const gchar *raw; if (!cache) { cache = g_new0 (GCharsetCache, 1); g_private_set (&cache_private, cache); } G_LOCK (aliases); raw = _g_locale_charset_raw (); G_UNLOCK (aliases); if (!(cache->raw && strcmp (cache->raw, raw) == 0)) { const gchar *new_charset; g_free (cache->raw); g_free (cache->charset); cache->raw = g_strdup (raw); cache->is_utf8 = g_utf8_get_charset_internal (raw, &new_charset); cache->charset = g_strdup (new_charset); } if (charset) *charset = cache->charset; return cache->is_utf8; } /** * g_get_codeset: * * Gets the character set for the current locale. * * Return value: a newly allocated string containing the name * of the character set. This string must be freed with g_free(). */ gchar * g_get_codeset (void) { const gchar *charset; g_get_charset (&charset); return g_strdup (charset); } #ifndef G_OS_WIN32 static GHashTable *alias_table = NULL; /* read an alias file for the locales */ static void read_aliases (gchar *file) { FILE *fp; char buf[256]; if (!alias_table) alias_table = g_hash_table_new (g_str_hash, g_str_equal); fp = fopen (file,"r"); if (!fp) return; while (fgets (buf, 256, fp)) { char *p, *q; g_strstrip (buf); /* Line is a comment */ if ((buf[0] == '#') || (buf[0] == '\0')) continue; /* Reads first column */ for (p = buf, q = NULL; *p; p++) { if ((*p == '\t') || (*p == ' ') || (*p == ':')) { *p = '\0'; q = p+1; while ((*q == '\t') || (*q == ' ')) { q++; } break; } } /* The line only had one column */ if (!q || *q == '\0') continue; /* Read second column */ for (p = q; *p; p++) { if ((*p == '\t') || (*p == ' ')) { *p = '\0'; break; } } /* Add to alias table if necessary */ if (!g_hash_table_lookup (alias_table, buf)) { g_hash_table_insert (alias_table, g_strdup (buf), g_strdup (q)); } } fclose (fp); } #endif static char * unalias_lang (char *lang) { #ifndef G_OS_WIN32 char *p; int i; if (!alias_table) read_aliases ("/usr/share/locale/locale.alias"); i = 0; while ((p = g_hash_table_lookup (alias_table, lang)) && (strcmp (p, lang) != 0)) { lang = p; if (i++ == 30) { static gboolean said_before = FALSE; if (!said_before) g_warning ("Too many alias levels for a locale, " "may indicate a loop"); said_before = TRUE; return lang; } } #endif return lang; } /* Mask for components of locale spec. The ordering here is from * least significant to most significant */ enum { COMPONENT_CODESET = 1 << 0, COMPONENT_TERRITORY = 1 << 1, COMPONENT_MODIFIER = 1 << 2 }; /* Break an X/Open style locale specification into components */ static guint explode_locale (const gchar *locale, gchar **language, gchar **territory, gchar **codeset, gchar **modifier) { const gchar *uscore_pos; const gchar *at_pos; const gchar *dot_pos; guint mask = 0; uscore_pos = strchr (locale, '_'); dot_pos = strchr (uscore_pos ? uscore_pos : locale, '.'); at_pos = strchr (dot_pos ? dot_pos : (uscore_pos ? uscore_pos : locale), '@'); if (at_pos) { mask |= COMPONENT_MODIFIER; *modifier = g_strdup (at_pos); } else at_pos = locale + strlen (locale); if (dot_pos) { mask |= COMPONENT_CODESET; *codeset = g_strndup (dot_pos, at_pos - dot_pos); } else dot_pos = at_pos; if (uscore_pos) { mask |= COMPONENT_TERRITORY; *territory = g_strndup (uscore_pos, dot_pos - uscore_pos); } else uscore_pos = dot_pos; *language = g_strndup (locale, uscore_pos - locale); return mask; } /* * Compute all interesting variants for a given locale name - * by stripping off different components of the value. * * For simplicity, we assume that the locale is in * X/Open format: language[_territory][.codeset][@modifier] * * TODO: Extend this to handle the CEN format (see the GNUlibc docs) * as well. We could just copy the code from glibc wholesale * but it is big, ugly, and complicated, so I'm reluctant * to do so when this should handle 99% of the time... */ static void append_locale_variants (GPtrArray *array, const gchar *locale) { gchar *language = NULL; gchar *territory = NULL; gchar *codeset = NULL; gchar *modifier = NULL; guint mask; guint i, j; g_return_if_fail (locale != NULL); mask = explode_locale (locale, &language, &territory, &codeset, &modifier); /* Iterate through all possible combinations, from least attractive * to most attractive. */ for (j = 0; j <= mask; ++j) { i = mask - j; if ((i & ~mask) == 0) { gchar *val = g_strconcat (language, (i & COMPONENT_TERRITORY) ? territory : "", (i & COMPONENT_CODESET) ? codeset : "", (i & COMPONENT_MODIFIER) ? modifier : "", NULL); g_ptr_array_add (array, val); } } g_free (language); if (mask & COMPONENT_CODESET) g_free (codeset); if (mask & COMPONENT_TERRITORY) g_free (territory); if (mask & COMPONENT_MODIFIER) g_free (modifier); } /** * g_get_locale_variants: * @locale: a locale identifier * * Returns a list of derived variants of @locale, which can be used to * e.g. construct locale-dependent filenames or search paths. The returned * list is sorted from most desirable to least desirable. * This function handles territory, charset and extra locale modifiers. * * For example, if @locale is "fr_BE", then the returned list * is "fr_BE", "fr". * * If you need the list of variants for the current locale, * use g_get_language_names(). * * Returns: (transfer full) (array zero-terminated=1) (element-type utf8): a newly * allocated array of newly allocated strings with the locale variants. Free with * g_strfreev(). * * Since: 2.28 */ gchar ** g_get_locale_variants (const gchar *locale) { GPtrArray *array; g_return_val_if_fail (locale != NULL, NULL); array = g_ptr_array_sized_new (8); append_locale_variants (array, locale); g_ptr_array_add (array, NULL); return (gchar **) g_ptr_array_free (array, FALSE); } /* The following is (partly) taken from the gettext package. Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc. */ static const gchar * guess_category_value (const gchar *category_name) { const gchar *retval; /* The highest priority value is the 'LANGUAGE' environment variable. This is a GNU extension. */ retval = g_getenv ("LANGUAGE"); if ((retval != NULL) && (retval[0] != '\0')) return retval; /* 'LANGUAGE' is not set. So we have to proceed with the POSIX methods of looking to 'LC_ALL', 'LC_xxx', and 'LANG'. On some systems this can be done by the 'setlocale' function itself. */ /* Setting of LC_ALL overwrites all other. */ retval = g_getenv ("LC_ALL"); if ((retval != NULL) && (retval[0] != '\0')) return retval; /* Next comes the name of the desired category. */ retval = g_getenv (category_name); if ((retval != NULL) && (retval[0] != '\0')) return retval; /* Last possibility is the LANG environment variable. */ retval = g_getenv ("LANG"); if ((retval != NULL) && (retval[0] != '\0')) return retval; #ifdef G_PLATFORM_WIN32 /* g_win32_getlocale() first checks for LC_ALL, LC_MESSAGES and * LANG, which we already did above. Oh well. The main point of * calling g_win32_getlocale() is to get the thread's locale as used * by Windows and the Microsoft C runtime (in the "English_United * States" format) translated into the Unixish format. */ { char *locale = g_win32_getlocale (); retval = g_intern_string (locale); g_free (locale); return retval; } #endif return NULL; } typedef struct _GLanguageNamesCache GLanguageNamesCache; struct _GLanguageNamesCache { gchar *languages; gchar **language_names; }; static void language_names_cache_free (gpointer data) { GLanguageNamesCache *cache = data; g_free (cache->languages); g_strfreev (cache->language_names); g_free (cache); } /** * g_get_language_names: * * Computes a list of applicable locale names, which can be used to * e.g. construct locale-dependent filenames or search paths. The returned * list is sorted from most desirable to least desirable and always contains * the default locale "C". * * For example, if LANGUAGE=de:en_US, then the returned list is * "de", "en_US", "en", "C". * * This function consults the environment variables LANGUAGE, * LC_ALL, LC_MESSAGES and LANG * to find the list of locales specified by the user. * * Return value: (array zero-terminated=1) (transfer none): a %NULL-terminated array of strings owned by GLib * that must not be modified or freed. * * Since: 2.6 **/ const gchar * const * g_get_language_names (void) { static GPrivate cache_private = G_PRIVATE_INIT (language_names_cache_free); GLanguageNamesCache *cache = g_private_get (&cache_private); const gchar *value; if (!cache) { cache = g_new0 (GLanguageNamesCache, 1); g_private_set (&cache_private, cache); } value = guess_category_value ("LC_MESSAGES"); if (!value) value = "C"; if (!(cache->languages && strcmp (cache->languages, value) == 0)) { GPtrArray *array; gchar **alist, **a; g_free (cache->languages); g_strfreev (cache->language_names); cache->languages = g_strdup (value); array = g_ptr_array_sized_new (8); alist = g_strsplit (value, ":", 0); for (a = alist; *a; a++) append_locale_variants (array, unalias_lang (*a)); g_strfreev (alist); g_ptr_array_add (array, g_strdup ("C")); g_ptr_array_add (array, NULL); cache->language_names = (gchar **) g_ptr_array_free (array, FALSE); } return (const gchar * const *) cache->language_names; } pkg-config-0.29.1/glib/glib/gthreadpool.h0000664000175000017500000000721312651243552015075 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the GLib Team and others 1997-2000. See the AUTHORS * file for a list of people on the GLib Team. See the ChangeLog * files for a list of changes. These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/. */ #ifndef __G_THREADPOOL_H__ #define __G_THREADPOOL_H__ #if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) #error "Only can be included directly." #endif #include G_BEGIN_DECLS typedef struct _GThreadPool GThreadPool; /* Thread Pools */ struct _GThreadPool { GFunc func; gpointer user_data; 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 #endif /* __G_THREADPOOL_H__ */ pkg-config-0.29.1/glib/glib/glib-unix.c0000664000175000017500000002777412651243552014474 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 2011 Red Hat, Inc. * * glib-unix.c: UNIX specific API wrappers and convenience functions * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * * Authors: Colin Walters */ #include "config.h" /* To make bionic export pipe2() */ #ifndef _GNU_SOURCE #define _GNU_SOURCE 1 #endif #include "glib-unix.h" #include "gmain-internal.h" #include /** * SECTION:gunix * @title: UNIX-specific utilities and integration * @short_description: pipes, signal handling * @include: glib-unix.h * * Most of GLib is intended to be portable; in contrast, this set of * functions is designed for programs which explicitly target UNIX, * or are using it to build higher level abstractions which would be * conditionally compiled if the platform matches G_OS_UNIX. * * To use these functions, you must explicitly include the * "glib-unix.h" header. */ G_DEFINE_QUARK (g-unix-error-quark, g_unix_error) static gboolean g_unix_set_error_from_errno (GError **error, gint saved_errno) { g_set_error_literal (error, G_UNIX_ERROR, 0, g_strerror (saved_errno)); errno = saved_errno; return FALSE; } /** * g_unix_open_pipe: * @fds: Array of two integers * @flags: Bitfield of file descriptor flags, see "man 2 fcntl" * @error: a #GError * * Similar to the UNIX pipe() call, but on modern systems like Linux * uses the pipe2() system call, which atomically creates a pipe with * the configured flags. The only supported flag currently is * FD_CLOEXEC. If for example you want to configure * O_NONBLOCK, that must still be done separately with * fcntl(). * * This function does *not* take O_CLOEXEC, it takes * FD_CLOEXEC as if for fcntl(); these are * different on Linux/glibc. * * Returns: %TRUE on success, %FALSE if not (and errno will be set). * * Since: 2.30 */ gboolean g_unix_open_pipe (int *fds, int flags, GError **error) { int ecode; /* We only support FD_CLOEXEC */ g_return_val_if_fail ((flags & (FD_CLOEXEC)) == flags, FALSE); #ifdef HAVE_PIPE2 { int pipe2_flags = 0; if (flags & FD_CLOEXEC) pipe2_flags |= O_CLOEXEC; /* Atomic */ ecode = pipe2 (fds, pipe2_flags); if (ecode == -1 && errno != ENOSYS) return g_unix_set_error_from_errno (error, errno); else if (ecode == 0) return TRUE; /* Fall through on -ENOSYS, we must be running on an old kernel */ } #endif ecode = pipe (fds); if (ecode == -1) return g_unix_set_error_from_errno (error, errno); if (flags == 0) return TRUE; ecode = fcntl (fds[0], F_SETFD, flags); if (ecode == -1) { int saved_errno = errno; close (fds[0]); close (fds[1]); return g_unix_set_error_from_errno (error, saved_errno); } ecode = fcntl (fds[1], F_SETFD, flags); if (ecode == -1) { int saved_errno = errno; close (fds[0]); close (fds[1]); return g_unix_set_error_from_errno (error, saved_errno); } return TRUE; } /** * g_unix_set_fd_nonblocking: * @fd: A file descriptor * @nonblock: If %TRUE, set the descriptor to be non-blocking * @error: a #GError * * Control the non-blocking state of the given file descriptor, * according to @nonblock. On most systems this uses O_NONBLOCK, but * on some older ones may use O_NDELAY. * * Returns: %TRUE if successful * * Since: 2.30 */ gboolean g_unix_set_fd_nonblocking (gint fd, gboolean nonblock, GError **error) { #ifdef F_GETFL glong fcntl_flags; fcntl_flags = fcntl (fd, F_GETFL); if (fcntl_flags == -1) return g_unix_set_error_from_errno (error, errno); if (nonblock) { #ifdef O_NONBLOCK fcntl_flags |= O_NONBLOCK; #else fcntl_flags |= O_NDELAY; #endif } else { #ifdef O_NONBLOCK fcntl_flags &= ~O_NONBLOCK; #else fcntl_flags &= ~O_NDELAY; #endif } if (fcntl (fd, F_SETFL, fcntl_flags) == -1) return g_unix_set_error_from_errno (error, errno); return TRUE; #else return g_unix_set_error_from_errno (error, EINVAL); #endif } /** * g_unix_signal_source_new: * @signum: A signal number * * Create a #GSource that will be dispatched upon delivery of the UNIX * signal @signum. In GLib versions before 2.36, only * SIGHUP, SIGINT, * SIGTERM can be monitored. In GLib 2.36, * SIGUSR1 and SIGUSR2 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 SIGTERM * cleanly; flushing any outstanding files, and then calling * g_main_loop_quit (). It is not safe to do any of this a regular * UNIX signal handler; your handler may be invoked while malloc() or * another library function is running, causing reentrancy if you * attempt to use it from the handler. None of the GLib/GObject API * is safe against this kind of reentrancy. * * The interaction of this source when combined with native UNIX * functions like sigprocmask() is not defined. * * The source will not initially be associated with any #GMainContext * and must be added to one with g_source_attach() before it will be * executed. * * Returns: A newly created #GSource * * Since: 2.30 */ GSource * g_unix_signal_source_new (int signum) { g_return_val_if_fail (signum == SIGHUP || signum == SIGINT || signum == SIGTERM || signum == SIGUSR1 || signum == SIGUSR2, NULL); return _g_main_create_unix_signal_watch (signum); } /** * g_unix_signal_add_full: * @priority: the priority of the signal source. Typically this will be in * the range between #G_PRIORITY_DEFAULT and #G_PRIORITY_HIGH. * @signum: Signal number * @handler: Callback * @user_data: Data for @handler * @notify: #GDestroyNotify for @handler * * A convenience function for g_unix_signal_source_new(), which * attaches to the default #GMainContext. You can remove the watch * using g_source_remove(). * * Returns: An ID (greater than 0) for the event source * * Rename to: g_unix_signal_add * Since: 2.30 */ guint g_unix_signal_add_full (int priority, int signum, GSourceFunc handler, gpointer user_data, GDestroyNotify notify) { guint id; GSource *source; source = g_unix_signal_source_new (signum); if (priority != G_PRIORITY_DEFAULT) g_source_set_priority (source, priority); g_source_set_callback (source, handler, user_data, notify); id = g_source_attach (source, NULL); g_source_unref (source); return id; } /** * g_unix_signal_add: * @signum: Signal number * @handler: Callback * @user_data: Data for @handler * * A convenience function for g_unix_signal_source_new(), which * attaches to the default #GMainContext. You can remove the watch * using g_source_remove(). * * Returns: An ID (greater than 0) for the event source * * Since: 2.30 */ guint g_unix_signal_add (int signum, GSourceFunc handler, gpointer user_data) { 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); } pkg-config-0.29.1/glib/glib/gmessages.h0000664000175000017500000003363112651243552014546 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the GLib Team and others 1997-2000. See the AUTHORS * file for a list of people on the GLib Team. See the ChangeLog * files for a list of changes. These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/. */ #ifndef __G_MESSAGES_H__ #define __G_MESSAGES_H__ #if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) #error "Only can be included directly." #endif #include #include #include /* Suppress warnings when GCC is in -pedantic mode and not -std=c99 */ #if (__GNUC__ >= 3 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96)) #pragma GCC system_header #endif G_BEGIN_DECLS /* calculate a string size, guaranteed to fit format + args. */ GLIB_AVAILABLE_IN_ALL gsize g_printf_string_upper_bound (const gchar* format, va_list args) G_GNUC_PRINTF(1, 0); /* Log level shift offset for user defined * log levels (0-7 are used by GLib). */ #define G_LOG_LEVEL_USER_SHIFT (8) /* Glib log levels and flags. */ typedef enum { /* log flags */ G_LOG_FLAG_RECURSION = 1 << 0, G_LOG_FLAG_FATAL = 1 << 1, /* GLib log levels */ G_LOG_LEVEL_ERROR = 1 << 2, /* always fatal */ G_LOG_LEVEL_CRITICAL = 1 << 3, G_LOG_LEVEL_WARNING = 1 << 4, G_LOG_LEVEL_MESSAGE = 1 << 5, G_LOG_LEVEL_INFO = 1 << 6, G_LOG_LEVEL_DEBUG = 1 << 7, G_LOG_LEVEL_MASK = ~(G_LOG_FLAG_RECURSION | G_LOG_FLAG_FATAL) } GLogLevelFlags; /* GLib log levels that are considered fatal by default */ #define G_LOG_FATAL_MASK (G_LOG_FLAG_RECURSION | G_LOG_LEVEL_ERROR) typedef void (*GLogFunc) (const gchar *log_domain, GLogLevelFlags log_level, const gchar *message, gpointer user_data); /* Logging mechanism */ GLIB_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) 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 */ 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) 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) G_ANALYZER_NORETURN; GLIB_DEPRECATED void g_assert_warning (const char *log_domain, const char *file, const int line, const char *pretty_function, const char *expression) G_GNUC_NORETURN; #ifndef G_LOG_DOMAIN #define G_LOG_DOMAIN ((gchar*) 0) #endif /* G_LOG_DOMAIN */ #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. */ #define g_error(...) G_STMT_START { \ g_log (G_LOG_DOMAIN, \ G_LOG_LEVEL_ERROR, \ __VA_ARGS__); \ for (;;) ; \ } G_STMT_END #define g_message(...) g_log (G_LOG_DOMAIN, \ G_LOG_LEVEL_MESSAGE, \ __VA_ARGS__) #define g_critical(...) g_log (G_LOG_DOMAIN, \ G_LOG_LEVEL_CRITICAL, \ __VA_ARGS__) #define g_warning(...) g_log (G_LOG_DOMAIN, \ G_LOG_LEVEL_WARNING, \ __VA_ARGS__) #define g_debug(...) g_log (G_LOG_DOMAIN, \ G_LOG_LEVEL_DEBUG, \ __VA_ARGS__) #elif defined(G_HAVE_GNUC_VARARGS) && !G_ANALYZER_ANALYZING #define g_error(format...) G_STMT_START { \ g_log (G_LOG_DOMAIN, \ G_LOG_LEVEL_ERROR, \ format); \ for (;;) ; \ } G_STMT_END #define g_message(format...) g_log (G_LOG_DOMAIN, \ G_LOG_LEVEL_MESSAGE, \ format) #define g_critical(format...) g_log (G_LOG_DOMAIN, \ G_LOG_LEVEL_CRITICAL, \ format) #define g_warning(format...) g_log (G_LOG_DOMAIN, \ G_LOG_LEVEL_WARNING, \ format) #define g_debug(format...) g_log (G_LOG_DOMAIN, \ G_LOG_LEVEL_DEBUG, \ format) #else /* no varargs macros */ static void g_error (const gchar *format, ...) G_ANALYZER_NORETURN; static void g_critical (const gchar *format, ...) G_ANALYZER_NORETURN; static void g_error (const gchar *format, ...) { va_list args; va_start (args, format); g_logv (G_LOG_DOMAIN, G_LOG_LEVEL_ERROR, format, args); va_end (args); for(;;) ; } static void g_message (const gchar *format, ...) { va_list args; va_start (args, format); g_logv (G_LOG_DOMAIN, G_LOG_LEVEL_MESSAGE, format, args); va_end (args); } static void g_critical (const gchar *format, ...) { va_list args; va_start (args, format); g_logv (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL, format, args); va_end (args); } static void g_warning (const gchar *format, ...) { va_list args; va_start (args, format); g_logv (G_LOG_DOMAIN, G_LOG_LEVEL_WARNING, format, args); va_end (args); } static void g_debug (const gchar *format, ...) { va_list args; va_start (args, format); g_logv (G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, format, args); va_end (args); } #endif /* !__GNUC__ */ /** * GPrintFunc: * @string: the message to output * * Specifies the type of the print handler functions. * 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); /** * g_warn_if_reached: * * Logs a critical warning. * * Since: 2.16 */ #define g_warn_if_reached() \ do { \ g_warn_message (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, NULL); \ } while (0) /** * g_warn_if_fail: * @expr: the expression to check * * Logs a warning if the expression is not true. * * Since: 2.16 */ #define g_warn_if_fail(expr) \ do { \ if G_LIKELY (expr) ; \ else g_warn_message (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, #expr); \ } while (0) #ifdef G_DISABLE_CHECKS /** * g_return_if_fail: * @expr: the expression to check * * Verifies that the expression evaluates to %TRUE. If the expression * evaluates to %FALSE, a critical message is logged and the current * function returns. This can only be used in functions which do not * return a value. * * If G_DISABLE_CHECKS is defined then the check is not performed. You * should therefore not depend on any side effects of @expr. */ #define g_return_if_fail(expr) G_STMT_START{ (void)0; }G_STMT_END /** * g_return_val_if_fail: * @expr: the expression to check * @val: the value to return from the current function * if the expression is not true * * Verifies that the expression evaluates to %TRUE. If the expression * evaluates to %FALSE, a critical message is logged and @val is * returned from the current function. * * If G_DISABLE_CHECKS is defined then the check is not performed. You * should therefore not depend on any side effects of @expr. */ #define g_return_val_if_fail(expr,val) G_STMT_START{ (void)0; }G_STMT_END /** * g_return_if_reached: * * Logs a critical message and returns from the current function. * This can only be used in functions which do not return a value. */ #define g_return_if_reached() G_STMT_START{ return; }G_STMT_END /** * g_return_val_if_reached: * @val: the value to return from the current function * * Logs a critical message and returns @val. */ #define g_return_val_if_reached(val) G_STMT_START{ return (val); }G_STMT_END #else /* !G_DISABLE_CHECKS */ #ifdef __GNUC__ #define g_return_if_fail(expr) G_STMT_START{ \ if G_LIKELY(expr) { } else \ { \ g_return_if_fail_warning (G_LOG_DOMAIN, \ __PRETTY_FUNCTION__, \ #expr); \ return; \ }; }G_STMT_END #define g_return_val_if_fail(expr,val) G_STMT_START{ \ if G_LIKELY(expr) { } else \ { \ g_return_if_fail_warning (G_LOG_DOMAIN, \ __PRETTY_FUNCTION__, \ #expr); \ return (val); \ }; }G_STMT_END #define g_return_if_reached() G_STMT_START{ \ g_log (G_LOG_DOMAIN, \ G_LOG_LEVEL_CRITICAL, \ "file %s: line %d (%s): should not be reached", \ __FILE__, \ __LINE__, \ __PRETTY_FUNCTION__); \ return; }G_STMT_END #define g_return_val_if_reached(val) G_STMT_START{ \ g_log (G_LOG_DOMAIN, \ G_LOG_LEVEL_CRITICAL, \ "file %s: line %d (%s): should not be reached", \ __FILE__, \ __LINE__, \ __PRETTY_FUNCTION__); \ return (val); }G_STMT_END #else /* !__GNUC__ */ #define g_return_if_fail(expr) G_STMT_START{ \ if (expr) { } else \ { \ g_log (G_LOG_DOMAIN, \ G_LOG_LEVEL_CRITICAL, \ "file %s: line %d: assertion '%s' failed", \ __FILE__, \ __LINE__, \ #expr); \ return; \ }; }G_STMT_END #define g_return_val_if_fail(expr, val) G_STMT_START{ \ if (expr) { } else \ { \ g_log (G_LOG_DOMAIN, \ G_LOG_LEVEL_CRITICAL, \ "file %s: line %d: assertion '%s' failed", \ __FILE__, \ __LINE__, \ #expr); \ return (val); \ }; }G_STMT_END #define g_return_if_reached() G_STMT_START{ \ g_log (G_LOG_DOMAIN, \ G_LOG_LEVEL_CRITICAL, \ "file %s: line %d: should not be reached", \ __FILE__, \ __LINE__); \ return; }G_STMT_END #define g_return_val_if_reached(val) G_STMT_START{ \ g_log (G_LOG_DOMAIN, \ G_LOG_LEVEL_CRITICAL, \ "file %s: line %d: should not be reached", \ __FILE__, \ __LINE__); \ return (val); }G_STMT_END #endif /* !__GNUC__ */ #endif /* !G_DISABLE_CHECKS */ G_END_DECLS #endif /* __G_MESSAGES_H__ */ pkg-config-0.29.1/glib/glib/gspawn-win32.c0000664000175000017500000011410512651243552015016 00000000000000/* gspawn-win32.c - Process launching on Win32 * * Copyright 2000 Red Hat, Inc. * Copyright 2003 Tor Lillqvist * * GLib is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * GLib is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with GLib; see the file COPYING.LIB. If not, write * to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Implementation details on Win32. * * - There is no way to set the no-inherit flag for * a "file descriptor" in the MS C runtime. The flag is there, * and the dospawn() function uses it, but unfortunately * this flag can only be set when opening the file. * - As there is no fork(), we cannot reliably change directory * before starting the child process. (There might be several threads * running, and the current directory is common for all threads.) * * Thus, we must in many cases use a helper program to handle closing * of (inherited) file descriptors and changing of directory. The * helper process is also needed if the standard input, standard * output, or standard error of the process to be run are supposed to * be redirected somewhere. * * The structure of the source code in this file is a mess, I know. */ /* Define this to get some logging all the time */ /* #define G_SPAWN_WIN32_DEBUG */ #include "config.h" #include "glib.h" #include "glib-private.h" #include "gprintfint.h" #include "glibintl.h" #include "gthread.h" #include #include #include #include #include #include #include #include #include #include #ifndef GSPAWN_HELPER #ifdef G_SPAWN_WIN32_DEBUG static int debug = 1; #define SETUP_DEBUG() /* empty */ #else static int debug = -1; #define SETUP_DEBUG() \ G_STMT_START \ { \ if (debug == -1) \ { \ if (getenv ("G_SPAWN_WIN32_DEBUG") != NULL) \ debug = 1; \ else \ debug = 0; \ } \ } \ G_STMT_END #endif #endif enum { CHILD_NO_ERROR, CHILD_CHDIR_FAILED, CHILD_SPAWN_FAILED, }; enum { ARG_CHILD_ERR_REPORT = 1, ARG_HELPER_SYNC, ARG_STDIN, ARG_STDOUT, ARG_STDERR, ARG_WORKING_DIRECTORY, ARG_CLOSE_DESCRIPTORS, ARG_USE_PATH, ARG_WAIT, ARG_PROGRAM, ARG_COUNT = ARG_PROGRAM }; static int dup_noninherited (int fd, int mode) { HANDLE filehandle; DuplicateHandle (GetCurrentProcess (), (LPHANDLE) _get_osfhandle (fd), GetCurrentProcess (), &filehandle, 0, FALSE, DUPLICATE_SAME_ACCESS); close (fd); return _open_osfhandle ((gintptr) filehandle, mode | _O_NOINHERIT); } #ifndef GSPAWN_HELPER #ifdef _WIN64 #define HELPER_PROCESS "gspawn-win64-helper" #else #define HELPER_PROCESS "gspawn-win32-helper" #endif static gchar * protect_argv_string (const gchar *string) { const gchar *p = string; gchar *retval, *q; gint len = 0; gboolean need_dblquotes = FALSE; while (*p) { if (*p == ' ' || *p == '\t') need_dblquotes = TRUE; else if (*p == '"') len++; else if (*p == '\\') { const gchar *pp = p; while (*pp && *pp == '\\') pp++; if (*pp == '"') len++; } len++; p++; } q = retval = g_malloc (len + need_dblquotes*2 + 1); p = string; if (need_dblquotes) *q++ = '"'; while (*p) { if (*p == '"') *q++ = '\\'; else if (*p == '\\') { const gchar *pp = p; while (*pp && *pp == '\\') pp++; if (*pp == '"') *q++ = '\\'; } *q++ = *p; p++; } if (need_dblquotes) *q++ = '"'; *q++ = '\0'; return retval; } static gint protect_argv (gchar **argv, gchar ***new_argv) { gint i; gint argc = 0; while (argv[argc]) ++argc; *new_argv = g_new (gchar *, argc+1); /* Quote each argv element if necessary, so that it will get * reconstructed correctly in the C runtime startup code. Note that * the unquoting algorithm in the C runtime is really weird, and * rather different than what Unix shells do. See stdargv.c in the C * runtime sources (in the Platform SDK, in src/crt). * * Note that an new_argv[0] constructed by this function should * *not* be passed as the filename argument to a spawn* or exec* * family function. That argument should be the real file name * without any quoting. */ for (i = 0; i < argc; i++) (*new_argv)[i] = protect_argv_string (argv[i]); (*new_argv)[argc] = NULL; return argc; } 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, gchar **argv, gchar **envp, GSpawnFlags flags, GSpawnChildSetupFunc child_setup, gpointer user_data, GPid *child_handle, GError **error) { g_return_val_if_fail (argv != NULL, FALSE); return g_spawn_async_with_pipes_utf8 (working_directory, argv, envp, flags, child_setup, user_data, child_handle, NULL, NULL, NULL, error); } /* Avoids a danger in threaded situations (calling close() * on a file descriptor twice, and another thread has * re-opened it since the first close) */ static void close_and_invalidate (gint *fd) { if (*fd < 0) return; close (*fd); *fd = -1; } typedef enum { READ_FAILED = 0, /* FALSE */ READ_OK, READ_EOF } ReadResult; static ReadResult read_data (GString *str, GIOChannel *iochannel, GError **error) { GIOStatus giostatus; gsize bytes; gchar buf[4096]; again: giostatus = g_io_channel_read_chars (iochannel, buf, sizeof (buf), &bytes, NULL); if (bytes == 0) return READ_EOF; else if (bytes > 0) { g_string_append_len (str, buf, bytes); return READ_OK; } else if (giostatus == G_IO_STATUS_AGAIN) goto again; else if (giostatus == G_IO_STATUS_ERROR) { g_set_error_literal (error, G_SPAWN_ERROR, G_SPAWN_ERROR_READ, _("Failed to read data from child process")); return READ_FAILED; } else return READ_OK; } static gboolean make_pipe (gint p[2], GError **error) { if (_pipe (p, 4096, _O_BINARY) < 0) { int errsv = errno; g_set_error (error, G_SPAWN_ERROR, G_SPAWN_ERROR_FAILED, _("Failed to create pipe for communicating with child process (%s)"), g_strerror (errsv)); return FALSE; } else return TRUE; } /* The helper process writes a status report back to us, through a * pipe, consisting of two ints. */ static gboolean read_helper_report (int fd, gintptr report[2], GError **error) { gint bytes = 0; while (bytes < sizeof(gintptr)*2) { gint chunk; if (debug) g_print ("%s:read_helper_report: read %" G_GSIZE_FORMAT "...\n", __FILE__, sizeof(gintptr)*2 - bytes); chunk = read (fd, ((gchar*)report) + bytes, sizeof(gintptr)*2 - bytes); if (debug) g_print ("...got %d bytes\n", chunk); if (chunk < 0) { int errsv = errno; /* Some weird shit happened, bail out */ g_set_error (error, G_SPAWN_ERROR, G_SPAWN_ERROR_FAILED, _("Failed to read from child pipe (%s)"), g_strerror (errsv)); return FALSE; } else if (chunk == 0) { g_set_error (error, G_SPAWN_ERROR, G_SPAWN_ERROR_FAILED, _("Failed to read from child pipe (%s)"), "EOF"); break; /* EOF */ } else bytes += chunk; } if (bytes < sizeof(gintptr)*2) return FALSE; return TRUE; } static void set_child_error (gintptr report[2], const gchar *working_directory, GError **error) { switch (report[0]) { case CHILD_CHDIR_FAILED: g_set_error (error, G_SPAWN_ERROR, G_SPAWN_ERROR_CHDIR, _("Failed to change to directory '%s' (%s)"), working_directory, g_strerror (report[1])); break; case CHILD_SPAWN_FAILED: g_set_error (error, G_SPAWN_ERROR, G_SPAWN_ERROR_FAILED, _("Failed to execute child process (%s)"), g_strerror (report[1])); break; default: g_assert_not_reached (); } } static gboolean utf8_charv_to_wcharv (char **utf8_charv, wchar_t ***wcharv, int *error_index, GError **error) { wchar_t **retval = NULL; *wcharv = NULL; if (utf8_charv != NULL) { int n = 0, i; while (utf8_charv[n]) n++; retval = g_new (wchar_t *, n + 1); for (i = 0; i < n; i++) { retval[i] = g_utf8_to_utf16 (utf8_charv[i], -1, NULL, NULL, error); if (retval[i] == NULL) { if (error_index) *error_index = i; while (i) g_free (retval[--i]); g_free (retval); return FALSE; } } retval[n] = NULL; } *wcharv = retval; return TRUE; } static gboolean do_spawn_directly (gint *exit_status, gboolean do_return_handle, GSpawnFlags flags, gchar **argv, char **envp, char **protected_argv, GPid *child_handle, GError **error) { const int mode = (exit_status == NULL) ? P_NOWAIT : P_WAIT; char **new_argv; gintptr rc = -1; int saved_errno; GError *conv_error = NULL; gint conv_error_index; wchar_t *wargv0, **wargv, **wenvp; new_argv = (flags & G_SPAWN_FILE_AND_ARGV_ZERO) ? protected_argv + 1 : protected_argv; wargv0 = g_utf8_to_utf16 (argv[0], -1, NULL, NULL, &conv_error); if (wargv0 == NULL) { g_set_error (error, G_SPAWN_ERROR, G_SPAWN_ERROR_FAILED, _("Invalid program name: %s"), conv_error->message); g_error_free (conv_error); return FALSE; } if (!utf8_charv_to_wcharv (new_argv, &wargv, &conv_error_index, &conv_error)) { g_set_error (error, G_SPAWN_ERROR, G_SPAWN_ERROR_FAILED, _("Invalid string in argument vector at %d: %s"), conv_error_index, conv_error->message); g_error_free (conv_error); g_free (wargv0); return FALSE; } if (!utf8_charv_to_wcharv (envp, &wenvp, NULL, &conv_error)) { g_set_error (error, G_SPAWN_ERROR, G_SPAWN_ERROR_FAILED, _("Invalid string in environment: %s"), conv_error->message); g_error_free (conv_error); g_free (wargv0); g_strfreev ((gchar **) wargv); return FALSE; } if (flags & G_SPAWN_SEARCH_PATH) if (wenvp != NULL) rc = _wspawnvpe (mode, wargv0, (const wchar_t **) wargv, (const wchar_t **) wenvp); else rc = _wspawnvp (mode, wargv0, (const wchar_t **) wargv); else if (wenvp != NULL) rc = _wspawnve (mode, wargv0, (const wchar_t **) wargv, (const wchar_t **) wenvp); else rc = _wspawnv (mode, wargv0, (const wchar_t **) wargv); g_free (wargv0); g_strfreev ((gchar **) wargv); g_strfreev ((gchar **) wenvp); saved_errno = errno; if (rc == -1 && saved_errno != 0) { g_set_error (error, G_SPAWN_ERROR, G_SPAWN_ERROR_FAILED, _("Failed to execute child process (%s)"), g_strerror (saved_errno)); return FALSE; } if (exit_status == NULL) { if (child_handle && do_return_handle) *child_handle = (GPid) rc; else { CloseHandle ((HANDLE) rc); if (child_handle) *child_handle = 0; } } else *exit_status = rc; return TRUE; } static gboolean do_spawn_with_pipes (gint *exit_status, gboolean do_return_handle, const gchar *working_directory, gchar **argv, char **envp, GSpawnFlags flags, GSpawnChildSetupFunc child_setup, GPid *child_handle, gint *standard_input, gint *standard_output, gint *standard_error, gint *err_report, GError **error) { char **protected_argv; char args[ARG_COUNT][10]; char **new_argv; int i; gintptr rc = -1; int saved_errno; int argc; int stdin_pipe[2] = { -1, -1 }; int stdout_pipe[2] = { -1, -1 }; int stderr_pipe[2] = { -1, -1 }; int child_err_report_pipe[2] = { -1, -1 }; int helper_sync_pipe[2] = { -1, -1 }; gintptr helper_report[2]; static gboolean warned_about_child_setup = FALSE; GError *conv_error = NULL; gint conv_error_index; gchar *helper_process; CONSOLE_CURSOR_INFO cursor_info; wchar_t *whelper, **wargv, **wenvp; gchar *glib_dll_directory; if (child_setup && !warned_about_child_setup) { warned_about_child_setup = TRUE; g_warning ("passing a child setup function to the g_spawn functions is pointless on Windows and it is ignored"); } argc = protect_argv (argv, &protected_argv); if (!standard_input && !standard_output && !standard_error && (flags & G_SPAWN_CHILD_INHERITS_STDIN) && !(flags & G_SPAWN_STDOUT_TO_DEV_NULL) && !(flags & G_SPAWN_STDERR_TO_DEV_NULL) && (working_directory == NULL || !*working_directory) && (flags & G_SPAWN_LEAVE_DESCRIPTORS_OPEN)) { /* We can do without the helper process */ gboolean retval = do_spawn_directly (exit_status, do_return_handle, flags, argv, envp, protected_argv, child_handle, error); g_strfreev (protected_argv); return retval; } if (standard_input && !make_pipe (stdin_pipe, error)) goto cleanup_and_fail; if (standard_output && !make_pipe (stdout_pipe, error)) goto cleanup_and_fail; if (standard_error && !make_pipe (stderr_pipe, error)) goto cleanup_and_fail; if (!make_pipe (child_err_report_pipe, error)) goto cleanup_and_fail; if (!make_pipe (helper_sync_pipe, error)) goto cleanup_and_fail; new_argv = g_new (char *, argc + 1 + ARG_COUNT); if (GetConsoleCursorInfo (GetStdHandle (STD_OUTPUT_HANDLE), &cursor_info)) helper_process = HELPER_PROCESS "-console.exe"; else helper_process = HELPER_PROCESS ".exe"; glib_dll_directory = _glib_get_dll_directory (); if (glib_dll_directory != NULL) { helper_process = g_build_filename (glib_dll_directory, helper_process, NULL); g_free (glib_dll_directory); } else helper_process = g_strdup (helper_process); new_argv[0] = protect_argv_string (helper_process); _g_sprintf (args[ARG_CHILD_ERR_REPORT], "%d", child_err_report_pipe[1]); new_argv[ARG_CHILD_ERR_REPORT] = args[ARG_CHILD_ERR_REPORT]; /* Make the read end of the child error report pipe * noninherited. Otherwise it will needlessly be inherited by the * helper process, and the started actual user process. As such that * shouldn't harm, but it is unnecessary. */ child_err_report_pipe[0] = dup_noninherited (child_err_report_pipe[0], _O_RDONLY); if (flags & G_SPAWN_FILE_AND_ARGV_ZERO) { /* Overload ARG_CHILD_ERR_REPORT to also encode the * G_SPAWN_FILE_AND_ARGV_ZERO functionality. */ strcat (args[ARG_CHILD_ERR_REPORT], "#"); } _g_sprintf (args[ARG_HELPER_SYNC], "%d", helper_sync_pipe[0]); new_argv[ARG_HELPER_SYNC] = args[ARG_HELPER_SYNC]; /* Make the write end of the sync pipe noninherited. Otherwise the * helper process will inherit it, and thus if this process happens * to crash before writing the sync byte to the pipe, the helper * process won't read but won't get any EOF either, as it has the * write end open itself. */ helper_sync_pipe[1] = dup_noninherited (helper_sync_pipe[1], _O_WRONLY); if (standard_input) { _g_sprintf (args[ARG_STDIN], "%d", stdin_pipe[0]); new_argv[ARG_STDIN] = args[ARG_STDIN]; } else if (flags & G_SPAWN_CHILD_INHERITS_STDIN) { /* Let stdin be alone */ new_argv[ARG_STDIN] = "-"; } else { /* Keep process from blocking on a read of stdin */ new_argv[ARG_STDIN] = "z"; } if (standard_output) { _g_sprintf (args[ARG_STDOUT], "%d", stdout_pipe[1]); new_argv[ARG_STDOUT] = args[ARG_STDOUT]; } else if (flags & G_SPAWN_STDOUT_TO_DEV_NULL) { new_argv[ARG_STDOUT] = "z"; } else { new_argv[ARG_STDOUT] = "-"; } if (standard_error) { _g_sprintf (args[ARG_STDERR], "%d", stderr_pipe[1]); new_argv[ARG_STDERR] = args[ARG_STDERR]; } else if (flags & G_SPAWN_STDERR_TO_DEV_NULL) { new_argv[ARG_STDERR] = "z"; } else { new_argv[ARG_STDERR] = "-"; } if (working_directory && *working_directory) new_argv[ARG_WORKING_DIRECTORY] = protect_argv_string (working_directory); else new_argv[ARG_WORKING_DIRECTORY] = g_strdup ("-"); if (!(flags & G_SPAWN_LEAVE_DESCRIPTORS_OPEN)) new_argv[ARG_CLOSE_DESCRIPTORS] = "y"; else new_argv[ARG_CLOSE_DESCRIPTORS] = "-"; if (flags & G_SPAWN_SEARCH_PATH) new_argv[ARG_USE_PATH] = "y"; else new_argv[ARG_USE_PATH] = "-"; if (exit_status == NULL) new_argv[ARG_WAIT] = "-"; else new_argv[ARG_WAIT] = "w"; for (i = 0; i <= argc; i++) new_argv[ARG_PROGRAM + i] = protected_argv[i]; SETUP_DEBUG(); if (debug) { g_print ("calling %s with argv:\n", helper_process); for (i = 0; i < argc + 1 + ARG_COUNT; i++) g_print ("argv[%d]: %s\n", i, (new_argv[i] ? new_argv[i] : "NULL")); } if (!utf8_charv_to_wcharv (new_argv, &wargv, &conv_error_index, &conv_error)) { if (conv_error_index == ARG_WORKING_DIRECTORY) g_set_error (error, G_SPAWN_ERROR, G_SPAWN_ERROR_CHDIR, _("Invalid working directory: %s"), conv_error->message); else g_set_error (error, G_SPAWN_ERROR, G_SPAWN_ERROR_FAILED, _("Invalid string in argument vector at %d: %s"), conv_error_index - ARG_PROGRAM, conv_error->message); g_error_free (conv_error); g_strfreev (protected_argv); g_free (new_argv[0]); g_free (new_argv[ARG_WORKING_DIRECTORY]); g_free (new_argv); g_free (helper_process); goto cleanup_and_fail; } if (!utf8_charv_to_wcharv (envp, &wenvp, NULL, &conv_error)) { g_set_error (error, G_SPAWN_ERROR, G_SPAWN_ERROR_FAILED, _("Invalid string in environment: %s"), conv_error->message); g_error_free (conv_error); g_strfreev (protected_argv); g_free (new_argv[0]); g_free (new_argv[ARG_WORKING_DIRECTORY]); g_free (new_argv); g_free (helper_process); g_strfreev ((gchar **) wargv); goto cleanup_and_fail; } whelper = g_utf8_to_utf16 (helper_process, -1, NULL, NULL, NULL); g_free (helper_process); if (wenvp != NULL) rc = _wspawnvpe (P_NOWAIT, whelper, (const wchar_t **) wargv, (const wchar_t **) wenvp); else rc = _wspawnvp (P_NOWAIT, whelper, (const wchar_t **) wargv); saved_errno = errno; g_free (whelper); g_strfreev ((gchar **) wargv); g_strfreev ((gchar **) wenvp); /* Close the other process's ends of the pipes in this process, * otherwise the reader will never get EOF. */ close_and_invalidate (&child_err_report_pipe[1]); close_and_invalidate (&helper_sync_pipe[0]); close_and_invalidate (&stdin_pipe[0]); close_and_invalidate (&stdout_pipe[1]); close_and_invalidate (&stderr_pipe[1]); g_strfreev (protected_argv); g_free (new_argv[0]); g_free (new_argv[ARG_WORKING_DIRECTORY]); g_free (new_argv); /* Check if gspawn-win32-helper couldn't be run */ if (rc == -1 && saved_errno != 0) { g_set_error (error, G_SPAWN_ERROR, G_SPAWN_ERROR_FAILED, _("Failed to execute helper program (%s)"), g_strerror (saved_errno)); goto cleanup_and_fail; } if (exit_status != NULL) { /* Synchronous case. Pass helper's report pipe back to caller, * which takes care of reading it after the grandchild has * finished. */ g_assert (err_report != NULL); *err_report = child_err_report_pipe[0]; write (helper_sync_pipe[1], " ", 1); close_and_invalidate (&helper_sync_pipe[1]); } else { /* Asynchronous case. We read the helper's report right away. */ if (!read_helper_report (child_err_report_pipe[0], helper_report, error)) goto cleanup_and_fail; close_and_invalidate (&child_err_report_pipe[0]); switch (helper_report[0]) { case CHILD_NO_ERROR: if (child_handle && do_return_handle) { /* rc is our HANDLE for gspawn-win32-helper. It has * told us the HANDLE of its child. Duplicate that into * a HANDLE valid in this process. */ if (!DuplicateHandle ((HANDLE) rc, (HANDLE) helper_report[1], GetCurrentProcess (), (LPHANDLE) child_handle, 0, TRUE, DUPLICATE_SAME_ACCESS)) { char *emsg = g_win32_error_message (GetLastError ()); g_print("%s\n", emsg); *child_handle = 0; } } else if (child_handle) *child_handle = 0; write (helper_sync_pipe[1], " ", 1); close_and_invalidate (&helper_sync_pipe[1]); break; default: write (helper_sync_pipe[1], " ", 1); close_and_invalidate (&helper_sync_pipe[1]); set_child_error (helper_report, working_directory, error); goto cleanup_and_fail; } } /* Success against all odds! return the information */ if (standard_input) *standard_input = stdin_pipe[1]; if (standard_output) *standard_output = stdout_pipe[0]; if (standard_error) *standard_error = stderr_pipe[0]; if (rc != -1) CloseHandle ((HANDLE) rc); return TRUE; cleanup_and_fail: if (rc != -1) CloseHandle ((HANDLE) rc); if (child_err_report_pipe[0] != -1) close (child_err_report_pipe[0]); if (child_err_report_pipe[1] != -1) close (child_err_report_pipe[1]); if (helper_sync_pipe[0] != -1) close (helper_sync_pipe[0]); if (helper_sync_pipe[1] != -1) close (helper_sync_pipe[1]); if (stdin_pipe[0] != -1) close (stdin_pipe[0]); if (stdin_pipe[1] != -1) close (stdin_pipe[1]); if (stdout_pipe[0] != -1) close (stdout_pipe[0]); if (stdout_pipe[1] != -1) close (stdout_pipe[1]); if (stderr_pipe[0] != -1) close (stderr_pipe[0]); if (stderr_pipe[1] != -1) close (stderr_pipe[1]); return FALSE; } gboolean g_spawn_sync_utf8 (const gchar *working_directory, gchar **argv, gchar **envp, GSpawnFlags flags, GSpawnChildSetupFunc child_setup, gpointer user_data, gchar **standard_output, gchar **standard_error, gint *exit_status, GError **error) { gint outpipe = -1; gint errpipe = -1; gint reportpipe = -1; GIOChannel *outchannel = NULL; GIOChannel *errchannel = NULL; GPollFD outfd, errfd; GPollFD fds[2]; gint nfds; gint outindex = -1; gint errindex = -1; gint ret; GString *outstr = NULL; GString *errstr = NULL; gboolean failed; gint status; g_return_val_if_fail (argv != NULL, FALSE); g_return_val_if_fail (!(flags & G_SPAWN_DO_NOT_REAP_CHILD), FALSE); g_return_val_if_fail (standard_output == NULL || !(flags & G_SPAWN_STDOUT_TO_DEV_NULL), FALSE); g_return_val_if_fail (standard_error == NULL || !(flags & G_SPAWN_STDERR_TO_DEV_NULL), FALSE); /* Just to ensure segfaults if callers try to use * these when an error is reported. */ if (standard_output) *standard_output = NULL; if (standard_error) *standard_error = NULL; if (!do_spawn_with_pipes (&status, FALSE, working_directory, argv, envp, flags, child_setup, NULL, NULL, standard_output ? &outpipe : NULL, standard_error ? &errpipe : NULL, &reportpipe, error)) return FALSE; /* Read data from child. */ failed = FALSE; if (outpipe >= 0) { outstr = g_string_new (NULL); outchannel = g_io_channel_win32_new_fd (outpipe); g_io_channel_set_encoding (outchannel, NULL, NULL); g_io_channel_set_buffered (outchannel, FALSE); g_io_channel_win32_make_pollfd (outchannel, G_IO_IN | G_IO_ERR | G_IO_HUP, &outfd); if (debug) g_print ("outfd=%p\n", (HANDLE) outfd.fd); } if (errpipe >= 0) { errstr = g_string_new (NULL); errchannel = g_io_channel_win32_new_fd (errpipe); g_io_channel_set_encoding (errchannel, NULL, NULL); g_io_channel_set_buffered (errchannel, FALSE); g_io_channel_win32_make_pollfd (errchannel, G_IO_IN | G_IO_ERR | G_IO_HUP, &errfd); if (debug) g_print ("errfd=%p\n", (HANDLE) errfd.fd); } /* Read data until we get EOF on all pipes. */ while (!failed && (outpipe >= 0 || errpipe >= 0)) { nfds = 0; if (outpipe >= 0) { fds[nfds] = outfd; outindex = nfds; nfds++; } if (errpipe >= 0) { fds[nfds] = errfd; errindex = nfds; nfds++; } if (debug) g_print ("g_spawn_sync: calling g_io_channel_win32_poll, nfds=%d\n", nfds); ret = g_io_channel_win32_poll (fds, nfds, -1); if (ret < 0) { failed = TRUE; g_set_error_literal (error, G_SPAWN_ERROR, G_SPAWN_ERROR_READ, _("Unexpected error in g_io_channel_win32_poll() reading data from a child process")); break; } if (outpipe >= 0 && (fds[outindex].revents & G_IO_IN)) { switch (read_data (outstr, outchannel, error)) { case READ_FAILED: if (debug) g_print ("g_spawn_sync: outchannel: READ_FAILED\n"); failed = TRUE; break; case READ_EOF: if (debug) g_print ("g_spawn_sync: outchannel: READ_EOF\n"); g_io_channel_unref (outchannel); outchannel = NULL; close_and_invalidate (&outpipe); break; default: if (debug) g_print ("g_spawn_sync: outchannel: OK\n"); break; } if (failed) break; } if (errpipe >= 0 && (fds[errindex].revents & G_IO_IN)) { switch (read_data (errstr, errchannel, error)) { case READ_FAILED: if (debug) g_print ("g_spawn_sync: errchannel: READ_FAILED\n"); failed = TRUE; break; case READ_EOF: if (debug) g_print ("g_spawn_sync: errchannel: READ_EOF\n"); g_io_channel_unref (errchannel); errchannel = NULL; close_and_invalidate (&errpipe); break; default: if (debug) g_print ("g_spawn_sync: errchannel: OK\n"); break; } if (failed) break; } } if (reportpipe == -1) { /* No helper process, exit status of actual spawned process * already available. */ if (exit_status) *exit_status = status; } else { /* Helper process was involved. Read its report now after the * grandchild has finished. */ gintptr helper_report[2]; if (!read_helper_report (reportpipe, helper_report, error)) failed = TRUE; else { switch (helper_report[0]) { case CHILD_NO_ERROR: if (exit_status) *exit_status = helper_report[1]; break; default: set_child_error (helper_report, working_directory, error); failed = TRUE; break; } } close_and_invalidate (&reportpipe); } /* These should only be open still if we had an error. */ if (outchannel != NULL) g_io_channel_unref (outchannel); if (errchannel != NULL) g_io_channel_unref (errchannel); if (outpipe >= 0) close_and_invalidate (&outpipe); if (errpipe >= 0) close_and_invalidate (&errpipe); if (failed) { if (outstr) g_string_free (outstr, TRUE); if (errstr) g_string_free (errstr, TRUE); return FALSE; } else { if (standard_output) *standard_output = g_string_free (outstr, FALSE); if (standard_error) *standard_error = g_string_free (errstr, FALSE); return TRUE; } } gboolean g_spawn_async_with_pipes_utf8 (const gchar *working_directory, gchar **argv, gchar **envp, GSpawnFlags flags, GSpawnChildSetupFunc child_setup, gpointer user_data, GPid *child_handle, gint *standard_input, gint *standard_output, gint *standard_error, GError **error) { g_return_val_if_fail (argv != NULL, FALSE); g_return_val_if_fail (standard_output == NULL || !(flags & G_SPAWN_STDOUT_TO_DEV_NULL), FALSE); g_return_val_if_fail (standard_error == NULL || !(flags & G_SPAWN_STDERR_TO_DEV_NULL), FALSE); /* can't inherit stdin if we have an input pipe. */ g_return_val_if_fail (standard_input == NULL || !(flags & G_SPAWN_CHILD_INHERITS_STDIN), FALSE); return do_spawn_with_pipes (NULL, (flags & G_SPAWN_DO_NOT_REAP_CHILD), working_directory, argv, envp, flags, child_setup, child_handle, standard_input, standard_output, standard_error, NULL, error); } gboolean g_spawn_command_line_sync_utf8 (const gchar *command_line, gchar **standard_output, gchar **standard_error, gint *exit_status, GError **error) { gboolean retval; gchar **argv = 0; g_return_val_if_fail (command_line != NULL, FALSE); if (!g_shell_parse_argv (command_line, NULL, &argv, error)) return FALSE; retval = g_spawn_sync_utf8 (NULL, argv, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, standard_output, standard_error, exit_status, error); g_strfreev (argv); return retval; } gboolean g_spawn_command_line_async_utf8 (const gchar *command_line, GError **error) { gboolean retval; gchar **argv = 0; g_return_val_if_fail (command_line != NULL, FALSE); if (!g_shell_parse_argv (command_line, NULL, &argv, error)) return FALSE; retval = g_spawn_async_utf8 (NULL, argv, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, NULL, error); g_strfreev (argv); return retval; } void g_spawn_close_pid (GPid pid) { CloseHandle (pid); } 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, * argument vectors and environments. These get used only by code * built against 2.8.1 or earlier. Code built against 2.8.2 or later * will use the _utf8 versions above (see the #defines in gspawn.h). */ #undef g_spawn_async #undef g_spawn_async_with_pipes #undef g_spawn_sync #undef g_spawn_command_line_sync #undef g_spawn_command_line_async static gboolean setup_utf8_copies (const gchar *working_directory, gchar **utf8_working_directory, gchar **argv, gchar ***utf8_argv, gchar **envp, gchar ***utf8_envp, GError **error) { gint i, argc, envc; if (working_directory == NULL) *utf8_working_directory = NULL; else { GError *conv_error = NULL; *utf8_working_directory = g_locale_to_utf8 (working_directory, -1, NULL, NULL, &conv_error); if (*utf8_working_directory == NULL) { g_set_error (error, G_SPAWN_ERROR, G_SPAWN_ERROR_CHDIR, _("Invalid working directory: %s"), conv_error->message); g_error_free (conv_error); return FALSE; } } argc = 0; while (argv[argc]) ++argc; *utf8_argv = g_new (gchar *, argc + 1); for (i = 0; i < argc; i++) { GError *conv_error = NULL; (*utf8_argv)[i] = g_locale_to_utf8 (argv[i], -1, NULL, NULL, &conv_error); if ((*utf8_argv)[i] == NULL) { g_set_error (error, G_SPAWN_ERROR, G_SPAWN_ERROR_FAILED, _("Invalid string in argument vector at %d: %s"), i, conv_error->message); g_error_free (conv_error); g_strfreev (*utf8_argv); *utf8_argv = NULL; g_free (*utf8_working_directory); *utf8_working_directory = NULL; return FALSE; } } (*utf8_argv)[argc] = NULL; if (envp == NULL) { *utf8_envp = NULL; } else { envc = 0; while (envp[envc]) ++envc; *utf8_envp = g_new (gchar *, envc + 1); for (i = 0; i < envc; i++) { GError *conv_error = NULL; (*utf8_envp)[i] = g_locale_to_utf8 (envp[i], -1, NULL, NULL, &conv_error); if ((*utf8_envp)[i] == NULL) { g_set_error (error, G_SPAWN_ERROR, G_SPAWN_ERROR_FAILED, _("Invalid string in environment: %s"), conv_error->message); g_error_free (conv_error); g_strfreev (*utf8_envp); *utf8_envp = NULL; g_strfreev (*utf8_argv); *utf8_argv = NULL; g_free (*utf8_working_directory); *utf8_working_directory = NULL; return FALSE; } } (*utf8_envp)[envc] = NULL; } return TRUE; } static void free_utf8_copies (gchar *utf8_working_directory, gchar **utf8_argv, gchar **utf8_envp) { g_free (utf8_working_directory); g_strfreev (utf8_argv); g_strfreev (utf8_envp); } gboolean g_spawn_async_with_pipes (const gchar *working_directory, gchar **argv, gchar **envp, GSpawnFlags flags, GSpawnChildSetupFunc child_setup, gpointer user_data, GPid *child_handle, gint *standard_input, gint *standard_output, gint *standard_error, GError **error) { gchar *utf8_working_directory; gchar **utf8_argv; gchar **utf8_envp; gboolean retval; if (!setup_utf8_copies (working_directory, &utf8_working_directory, argv, &utf8_argv, envp, &utf8_envp, error)) return FALSE; retval = g_spawn_async_with_pipes_utf8 (utf8_working_directory, utf8_argv, utf8_envp, flags, child_setup, user_data, child_handle, standard_input, standard_output, standard_error, error); free_utf8_copies (utf8_working_directory, utf8_argv, utf8_envp); return retval; } gboolean g_spawn_async (const gchar *working_directory, gchar **argv, gchar **envp, GSpawnFlags flags, GSpawnChildSetupFunc child_setup, gpointer user_data, GPid *child_handle, GError **error) { return g_spawn_async_with_pipes (working_directory, argv, envp, flags, child_setup, user_data, child_handle, NULL, NULL, NULL, error); } gboolean g_spawn_sync (const gchar *working_directory, gchar **argv, gchar **envp, GSpawnFlags flags, GSpawnChildSetupFunc child_setup, gpointer user_data, gchar **standard_output, gchar **standard_error, gint *exit_status, GError **error) { gchar *utf8_working_directory; gchar **utf8_argv; gchar **utf8_envp; gboolean retval; if (!setup_utf8_copies (working_directory, &utf8_working_directory, argv, &utf8_argv, envp, &utf8_envp, error)) return FALSE; retval = g_spawn_sync_utf8 (utf8_working_directory, utf8_argv, utf8_envp, flags, child_setup, user_data, standard_output, standard_error, exit_status, error); free_utf8_copies (utf8_working_directory, utf8_argv, utf8_envp); return retval; } gboolean g_spawn_command_line_sync (const gchar *command_line, gchar **standard_output, gchar **standard_error, gint *exit_status, GError **error) { gboolean retval; gchar **argv = 0; g_return_val_if_fail (command_line != NULL, FALSE); if (!g_shell_parse_argv (command_line, NULL, &argv, error)) return FALSE; retval = g_spawn_sync (NULL, argv, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, standard_output, standard_error, exit_status, error); g_strfreev (argv); return retval; } gboolean g_spawn_command_line_async (const gchar *command_line, GError **error) { gboolean retval; gchar **argv = 0; g_return_val_if_fail (command_line != NULL, FALSE); if (!g_shell_parse_argv (command_line, NULL, &argv, error)) return FALSE; retval = g_spawn_async (NULL, argv, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, NULL, error); g_strfreev (argv); return retval; } #endif /* !_WIN64 */ #endif /* !GSPAWN_HELPER */ pkg-config-0.29.1/glib/glib/goption.c0000664000175000017500000021423012651243552014236 00000000000000/* goption.c - Option parser * * Copyright (C) 1999, 2003 Red Hat Software * Copyright (C) 2004 Anders Carlsson * * 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. */ /** * SECTION:option * @Short_description: parses commandline options * @Title: Commandline option parser * * The GOption commandline parser is intended to be a simpler replacement * for the popt library. It supports short and long commandline options, * as shown in the following example: * * testtreemodel -r 1 --max-size 20 --rand --display=:1.0 -vb -- file1 file2 * * The example demonstrates a number of features of the GOption * commandline parser * * Options can be single letters, prefixed by a single dash. Multiple * short options can be grouped behind a single dash. * * Long options are prefixed by two consecutive dashes. * * Options can have an extra argument, which can be a number, a string or * a filename. For long options, the extra argument can be appended with * an equals sign after the option name, which is useful if the extra * argument starts with a dash, which would otherwise cause it to be * interpreted as another option. * * Non-option arguments are returned to the application as rest arguments. * * An argument consisting solely of two dashes turns off further parsing, * any remaining arguments (even those starting with a dash) are returned * to the application as rest arguments. * * * Another important feature of GOption is that it can automatically * generate nicely formatted help output. Unless it is explicitly turned * off with g_option_context_set_help_enabled(), GOption will recognize * the , , * and * groupname options * (where groupname is the name of a * #GOptionGroup) and write a text similar to the one shown in the * following example to stdout. * * * Usage: * testtreemodel [OPTION...] - test tree model performance * * Help Options: * -h, --help Show help options * --help-all Show all help options * --help-gtk Show GTK+ Options * * Application Options: * -r, --repeats=N Average over N repetitions * -m, --max-size=M Test up to 2^M items * --display=DISPLAY X display to use * -v, --verbose Be verbose * -b, --beep Beep when done * --rand Randomize the data * * * GOption groups options in #GOptionGroups, which makes it easy to * incorporate options from multiple sources. The intended use for this is * to let applications collect option groups from the libraries it uses, * add them to their #GOptionContext, and parse all options by a single call * to g_option_context_parse(). See gtk_get_option_group() for an example. * * If an option is declared to be of type string or filename, GOption takes * care of converting it to the right encoding; strings are returned in * UTF-8, filenames are returned in the GLib filename encoding. Note that * this only works if setlocale() has been called before * g_option_context_parse(). * * Here is a complete example of setting up GOption to parse the example * commandline above and produce the example help output. * * * static gint repeats = 2; * static gint max_size = 8; * static gboolean verbose = FALSE; * static gboolean beep = FALSE; * static gboolean rand = FALSE; * * static GOptionEntry entries[] = * { * { "repeats", 'r', 0, G_OPTION_ARG_INT, &repeats, "Average over N repetitions", "N" }, * { "max-size", 'm', 0, G_OPTION_ARG_INT, &max_size, "Test up to 2^M items", "M" }, * { "verbose", 'v', 0, G_OPTION_ARG_NONE, &verbose, "Be verbose", NULL }, * { "beep", 'b', 0, G_OPTION_ARG_NONE, &beep, "Beep when done", NULL }, * { "rand", 0, 0, G_OPTION_ARG_NONE, &rand, "Randomize the data", NULL }, * { NULL } * }; * * int * main (int argc, char *argv[]) * { * GError *error = NULL; * GOptionContext *context; * * context = g_option_context_new ("- test tree model performance"); * g_option_context_add_main_entries (context, entries, GETTEXT_PACKAGE); * g_option_context_add_group (context, gtk_get_option_group (TRUE)); * if (!g_option_context_parse (context, &argc, &argv, &error)) * { * g_print ("option parsing failed: %s\n", error->message); * exit (1); * } * * /* ... */ * * } * */ #include "config.h" #include #include #include #include #if defined __OpenBSD__ #include #include #include #include #endif #include "goption.h" #include "gprintf.h" #include "glibintl.h" #define TRANSLATE(group, str) (((group)->translate_func ? (* (group)->translate_func) ((str), (group)->translate_data) : (str))) #define NO_ARG(entry) ((entry)->arg == G_OPTION_ARG_NONE || \ ((entry)->arg == G_OPTION_ARG_CALLBACK && \ ((entry)->flags & G_OPTION_FLAG_NO_ARG))) #define OPTIONAL_ARG(entry) ((entry)->arg == G_OPTION_ARG_CALLBACK && \ (entry)->flags & G_OPTION_FLAG_OPTIONAL_ARG) typedef struct { GOptionArg arg_type; gpointer arg_data; union { gboolean bool; gint integer; gchar *str; gchar **array; gdouble dbl; gint64 int64; } prev; union { gchar *str; struct { gint len; gchar **data; } array; } allocated; } Change; typedef struct { gchar **ptr; gchar *value; } PendingNull; struct _GOptionContext { GList *groups; gchar *parameter_string; gchar *summary; gchar *description; GTranslateFunc translate_func; GDestroyNotify translate_notify; gpointer translate_data; guint help_enabled : 1; guint ignore_unknown : 1; GOptionGroup *main_group; /* We keep a list of change so we can revert them */ GList *changes; /* We also keep track of all argv elements * that should be NULLed or modified. */ GList *pending_nulls; }; struct _GOptionGroup { gchar *name; gchar *description; gchar *help_description; GDestroyNotify destroy_notify; gpointer user_data; GTranslateFunc translate_func; GDestroyNotify translate_notify; gpointer translate_data; GOptionEntry *entries; gint n_entries; GOptionParseFunc pre_parse_func; GOptionParseFunc post_parse_func; GOptionErrorFunc error_func; }; static void free_changes_list (GOptionContext *context, gboolean revert); static void free_pending_nulls (GOptionContext *context, gboolean perform_nulls); static int _g_unichar_get_width (gunichar c) { if (G_UNLIKELY (g_unichar_iszerowidth (c))) return 0; /* we ignore the fact that we should call g_unichar_iswide_cjk() under * some locales (legacy East Asian ones) */ if (g_unichar_iswide (c)) return 2; return 1; } static glong _g_utf8_strwidth (const gchar *p) { glong len = 0; g_return_val_if_fail (p != NULL, 0); while (*p) { len += _g_unichar_get_width (g_utf8_get_char (p)); p = g_utf8_next_char (p); } return len; } G_DEFINE_QUARK (g-option-context-error-quark, g_option_error) /** * g_option_context_new: * @parameter_string: (allow-none): a string which is displayed in * the first line of output, after the * usage summary * programname [OPTION...] * * Creates a new option context. * * The @parameter_string can serve multiple purposes. It can be used * to add descriptions for "rest" arguments, which are not parsed by * the #GOptionContext, typically something like "FILES" or * "FILE1 FILE2...". If you are using #G_OPTION_REMAINING for * collecting "rest" arguments, GLib handles this automatically by * using the @arg_description of the corresponding #GOptionEntry in * the usage summary. * * Another usage is to give a short summary of the program * functionality, like " - frob the strings", which will be displayed * in the same line as the usage. For a longer description of the * program functionality that should be displayed as a paragraph * below the usage line, use g_option_context_set_summary(). * * Note that the @parameter_string is translated using the * function set with g_option_context_set_translate_func(), so * it should normally be passed untranslated. * * Returns: a newly created #GOptionContext, which must be * freed with g_option_context_free() after use. * * Since: 2.6 */ GOptionContext * g_option_context_new (const gchar *parameter_string) { GOptionContext *context; context = g_new0 (GOptionContext, 1); context->parameter_string = g_strdup (parameter_string); context->help_enabled = TRUE; context->ignore_unknown = FALSE; return context; } /** * g_option_context_free: * @context: a #GOptionContext * * Frees context and all the groups which have been * added to it. * * Please note that parsed arguments need to be freed separately (see * #GOptionEntry). * * Since: 2.6 */ void g_option_context_free (GOptionContext *context) { g_return_if_fail (context != NULL); g_list_free_full (context->groups, (GDestroyNotify) g_option_group_free); if (context->main_group) g_option_group_free (context->main_group); free_changes_list (context, FALSE); free_pending_nulls (context, FALSE); g_free (context->parameter_string); g_free (context->summary); g_free (context->description); if (context->translate_notify) (* context->translate_notify) (context->translate_data); g_free (context); } /** * g_option_context_set_help_enabled: * @context: a #GOptionContext * @help_enabled: %TRUE to enable , %FALSE to disable it * * Enables or disables automatic generation of * output. By default, g_option_context_parse() recognizes * , , * , * and groupname and creates * suitable output to stdout. * * Since: 2.6 */ void g_option_context_set_help_enabled (GOptionContext *context, gboolean help_enabled) { g_return_if_fail (context != NULL); context->help_enabled = help_enabled; } /** * g_option_context_get_help_enabled: * @context: a #GOptionContext * * Returns whether automatic generation * is turned on for @context. See g_option_context_set_help_enabled(). * * Returns: %TRUE if automatic help generation is turned on. * * Since: 2.6 */ gboolean g_option_context_get_help_enabled (GOptionContext *context) { g_return_val_if_fail (context != NULL, FALSE); return context->help_enabled; } /** * g_option_context_set_ignore_unknown_options: * @context: a #GOptionContext * @ignore_unknown: %TRUE to ignore unknown options, %FALSE to produce * an error when unknown options are met * * Sets whether to ignore unknown options or not. If an argument is * ignored, it is left in the @argv array after parsing. By default, * g_option_context_parse() treats unknown options as error. * * This setting does not affect non-option arguments (i.e. arguments * which don't start with a dash). But note that GOption cannot reliably * determine whether a non-option belongs to a preceding unknown option. * * Since: 2.6 **/ void g_option_context_set_ignore_unknown_options (GOptionContext *context, gboolean ignore_unknown) { g_return_if_fail (context != NULL); context->ignore_unknown = ignore_unknown; } /** * g_option_context_get_ignore_unknown_options: * @context: a #GOptionContext * * Returns whether unknown options are ignored or not. See * g_option_context_set_ignore_unknown_options(). * * Returns: %TRUE if unknown options are ignored. * * Since: 2.6 **/ gboolean g_option_context_get_ignore_unknown_options (GOptionContext *context) { g_return_val_if_fail (context != NULL, FALSE); return context->ignore_unknown; } /** * g_option_context_add_group: * @context: a #GOptionContext * @group: the group to add * * Adds a #GOptionGroup to the @context, so that parsing with @context * will recognize the options in the group. Note that the group will * be freed together with the context when g_option_context_free() is * called, so you must not free the group yourself after adding it * to a context. * * Since: 2.6 **/ void g_option_context_add_group (GOptionContext *context, GOptionGroup *group) { GList *list; g_return_if_fail (context != NULL); g_return_if_fail (group != NULL); g_return_if_fail (group->name != NULL); g_return_if_fail (group->description != NULL); g_return_if_fail (group->help_description != NULL); for (list = context->groups; list; list = list->next) { GOptionGroup *g = (GOptionGroup *)list->data; if ((group->name == NULL && g->name == NULL) || (group->name && g->name && strcmp (group->name, g->name) == 0)) g_warning ("A group named \"%s\" is already part of this GOptionContext", group->name); } context->groups = g_list_append (context->groups, group); } /** * g_option_context_set_main_group: * @context: a #GOptionContext * @group: the group to set as main group * * Sets a #GOptionGroup as main group of the @context. * This has the same effect as calling g_option_context_add_group(), * the only difference is that the options in the main group are * treated differently when generating output. * * Since: 2.6 **/ void g_option_context_set_main_group (GOptionContext *context, GOptionGroup *group) { g_return_if_fail (context != NULL); g_return_if_fail (group != NULL); if (context->main_group) { g_warning ("This GOptionContext already has a main group"); return; } context->main_group = group; } /** * g_option_context_get_main_group: * @context: a #GOptionContext * * Returns a pointer to the main group of @context. * * Return value: the main group of @context, or %NULL if @context doesn't * have a main group. Note that group belongs to @context and should * not be modified or freed. * * Since: 2.6 **/ GOptionGroup * g_option_context_get_main_group (GOptionContext *context) { g_return_val_if_fail (context != NULL, NULL); return context->main_group; } /** * g_option_context_add_main_entries: * @context: a #GOptionContext * @entries: a %NULL-terminated array of #GOptionEntrys * @translation_domain: (allow-none): a translation domain to use for translating * the output for the options in @entries * with gettext(), or %NULL * * A convenience function which creates a main group if it doesn't * exist, adds the @entries to it and sets the translation domain. * * Since: 2.6 **/ void g_option_context_add_main_entries (GOptionContext *context, const GOptionEntry *entries, const gchar *translation_domain) { g_return_if_fail (entries != NULL); if (!context->main_group) context->main_group = g_option_group_new (NULL, NULL, NULL, NULL, NULL); g_option_group_add_entries (context->main_group, entries); g_option_group_set_translation_domain (context->main_group, translation_domain); } static gint calculate_max_length (GOptionGroup *group, GHashTable *aliases) { GOptionEntry *entry; gint i, len, max_length; const gchar *long_name; max_length = 0; for (i = 0; i < group->n_entries; i++) { entry = &group->entries[i]; if (entry->flags & G_OPTION_FLAG_HIDDEN) continue; 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; if (!NO_ARG (entry) && entry->arg_description) len += 1 + _g_utf8_strwidth (TRANSLATE (group, entry->arg_description)); max_length = MAX (max_length, len); } return max_length; } static void print_entry (GOptionGroup *group, gint max_length, const GOptionEntry *entry, GString *string, GHashTable *aliases) { GString *str; const gchar *long_name; if (entry->flags & G_OPTION_FLAG_HIDDEN) return; 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, long_name); else g_string_append_printf (str, " --%s", long_name); if (entry->arg_description) g_string_append_printf (str, "=%s", TRANSLATE (group, entry->arg_description)); g_string_append_printf (string, "%s%*s %s\n", str->str, (int) (max_length + 4 - _g_utf8_strwidth (str->str)), "", entry->description ? TRANSLATE (group, entry->description) : ""); g_string_free (str, TRUE); } static gboolean group_has_visible_entries (GOptionContext *context, GOptionGroup *group, gboolean main_entries) { GOptionFlags reject_filter = G_OPTION_FLAG_HIDDEN; GOptionEntry *entry; gint i, l; gboolean main_group = group == context->main_group; if (!main_entries) reject_filter |= G_OPTION_FLAG_IN_MAIN; for (i = 0, l = (group ? group->n_entries : 0); i < l; i++) { entry = &group->entries[i]; 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; } return FALSE; } static gboolean group_list_has_visible_entries (GOptionContext *context, GList *group_list, gboolean main_entries) { while (group_list) { if (group_has_visible_entries (context, group_list->data, main_entries)) return TRUE; group_list = group_list->next; } return FALSE; } static gboolean context_has_h_entry (GOptionContext *context) { gsize i; GList *list; if (context->main_group) { for (i = 0; i < context->main_group->n_entries; i++) { if (context->main_group->entries[i].short_name == 'h') return TRUE; } } for (list = context->groups; list != NULL; list = g_list_next (list)) { GOptionGroup *group; group = (GOptionGroup*)list->data; for (i = 0; i < group->n_entries; i++) { if (group->entries[i].short_name == 'h') return TRUE; } } return FALSE; } /** * g_option_context_get_help: * @context: a #GOptionContext * @main_help: if %TRUE, only include the main group * @group: (allow-none): the #GOptionGroup to create help for, or %NULL * * Returns a formatted, translated help text for the given context. * To obtain the text produced by , call * g_option_context_get_help (context, TRUE, NULL). * To obtain the text produced by , call * g_option_context_get_help (context, FALSE, NULL). * To obtain the help text for an option group, call * g_option_context_get_help (context, FALSE, group). * * Returns: A newly allocated string containing the help text * * Since: 2.14 */ gchar * g_option_context_get_help (GOptionContext *context, gboolean main_help, GOptionGroup *group) { GList *list; gint max_length = 0, len; gint i; GOptionEntry *entry; GHashTable *shadow_map; GHashTable *aliases; gboolean seen[256]; const gchar *rest_description; GString *string; guchar token; string = g_string_sized_new (1024); rest_description = NULL; if (context->main_group) { for (i = 0; i < context->main_group->n_entries; i++) { entry = &context->main_group->entries[i]; if (entry->long_name[0] == 0) { rest_description = TRANSLATE (context->main_group, entry->arg_description); break; } } } g_string_append_printf (string, "%s\n %s %s", _("Usage:"), g_get_prgname(), _("[OPTION...]")); if (rest_description) { g_string_append (string, " "); g_string_append (string, rest_description); } if (context->parameter_string) { g_string_append (string, " "); g_string_append (string, TRANSLATE (context, context->parameter_string)); } g_string_append (string, "\n\n"); if (context->summary) { g_string_append (string, TRANSLATE (context, context->summary)); g_string_append (string, "\n\n"); } memset (seen, 0, sizeof (gboolean) * 256); shadow_map = g_hash_table_new (g_str_hash, g_str_equal); aliases = g_hash_table_new_full (NULL, NULL, NULL, g_free); if (context->main_group) { for (i = 0; i < context->main_group->n_entries; i++) { entry = &context->main_group->entries[i]; g_hash_table_insert (shadow_map, (gpointer)entry->long_name, entry); if (seen[(guchar)entry->short_name]) entry->short_name = 0; else seen[(guchar)entry->short_name] = TRUE; } } list = context->groups; while (list != NULL) { GOptionGroup *g = list->data; for (i = 0; i < g->n_entries; i++) { entry = &g->entries[i]; if (g_hash_table_lookup (shadow_map, entry->long_name) && !(entry->flags & G_OPTION_FLAG_NOALIAS)) { 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); if (seen[(guchar)entry->short_name] && !(entry->flags & G_OPTION_FLAG_NOALIAS)) entry->short_name = 0; else seen[(guchar)entry->short_name] = TRUE; } list = list->next; } g_hash_table_destroy (shadow_map); list = context->groups; if (context->help_enabled) { 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, aliases); max_length = MAX (max_length, len); } while (list != NULL) { GOptionGroup *g = list->data; if (context->help_enabled) { /* First, we check the --help- 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, aliases); max_length = MAX (max_length, len); list = list->next; } /* Add a bit of padding */ max_length += 4; if (!group && context->help_enabled) { list = context->groups; token = context_has_h_entry (context) ? '?' : 'h'; g_string_append_printf (string, "%s\n -%c, --%-*s %s\n", _("Help Options:"), token, max_length - 4, "help", _("Show help options")); /* We only want --help-all when there are groups */ if (list) g_string_append_printf (string, " --%-*s %s\n", max_length, "help-all", _("Show all help options")); while (list) { GOptionGroup *g = list->data; if (group_has_visible_entries (context, g, FALSE)) g_string_append_printf (string, " --help-%-*s %s\n", max_length - 5, g->name, TRANSLATE (g, g->help_description)); list = list->next; } g_string_append (string, "\n"); } if (group) { /* Print a certain group */ if (group_has_visible_entries (context, group, FALSE)) { 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, aliases); g_string_append (string, "\n"); } } else if (!main_help) { /* Print all groups */ list = context->groups; while (list) { GOptionGroup *g = list->data; if (group_has_visible_entries (context, g, FALSE)) { g_string_append (string, g->description); 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, aliases); g_string_append (string, "\n"); } list = list->next; } } /* Print application options if --help or --help-all has been specified */ if ((main_help || !group) && (group_has_visible_entries (context, context->main_group, TRUE) || group_list_has_visible_entries (context, context->groups, TRUE))) { list = context->groups; g_string_append (string, _("Application Options:")); g_string_append (string, "\n"); if (context->main_group) for (i = 0; i < context->main_group->n_entries; i++) print_entry (context->main_group, max_length, &context->main_group->entries[i], string, aliases); while (list != NULL) { GOptionGroup *g = list->data; /* 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, aliases); list = list->next; } g_string_append (string, "\n"); } if (context->description) { g_string_append (string, TRANSLATE (context, context->description)); g_string_append (string, "\n"); } g_hash_table_destroy (aliases); return g_string_free (string, FALSE); } G_GNUC_NORETURN static void print_help (GOptionContext *context, gboolean main_help, GOptionGroup *group) { gchar *help; help = g_option_context_get_help (context, main_help, group); g_print ("%s", help); g_free (help); exit (0); } static gboolean parse_int (const gchar *arg_name, const gchar *arg, gint *result, GError **error) { gchar *end; glong tmp; errno = 0; tmp = strtol (arg, &end, 0); if (*arg == '\0' || *end != '\0') { g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE, _("Cannot parse integer value '%s' for %s"), arg, arg_name); return FALSE; } *result = tmp; if (*result != tmp || errno == ERANGE) { g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE, _("Integer value '%s' for %s out of range"), arg, arg_name); return FALSE; } return TRUE; } static gboolean parse_double (const gchar *arg_name, const gchar *arg, gdouble *result, GError **error) { gchar *end; gdouble tmp; errno = 0; tmp = g_strtod (arg, &end); if (*arg == '\0' || *end != '\0') { g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE, _("Cannot parse double value '%s' for %s"), arg, arg_name); return FALSE; } if (errno == ERANGE) { g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE, _("Double value '%s' for %s out of range"), arg, arg_name); return FALSE; } *result = tmp; return TRUE; } static gboolean parse_int64 (const gchar *arg_name, const gchar *arg, gint64 *result, GError **error) { gchar *end; gint64 tmp; errno = 0; tmp = g_ascii_strtoll (arg, &end, 0); if (*arg == '\0' || *end != '\0') { g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE, _("Cannot parse integer value '%s' for %s"), arg, arg_name); return FALSE; } if (errno == ERANGE) { g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE, _("Integer value '%s' for %s out of range"), arg, arg_name); return FALSE; } *result = tmp; return TRUE; } static Change * get_change (GOptionContext *context, GOptionArg arg_type, gpointer arg_data) { GList *list; Change *change = NULL; for (list = context->changes; list != NULL; list = list->next) { change = list->data; if (change->arg_data == arg_data) goto found; } change = g_new0 (Change, 1); change->arg_type = arg_type; change->arg_data = arg_data; context->changes = g_list_prepend (context->changes, change); found: return change; } static void add_pending_null (GOptionContext *context, gchar **ptr, gchar *value) { PendingNull *n; n = g_new0 (PendingNull, 1); n->ptr = ptr; n->value = value; context->pending_nulls = g_list_prepend (context->pending_nulls, n); } static gboolean parse_arg (GOptionContext *context, GOptionGroup *group, GOptionEntry *entry, const gchar *value, const gchar *option_name, GError **error) { Change *change; g_assert (value || OPTIONAL_ARG (entry) || NO_ARG (entry)); switch (entry->arg) { case G_OPTION_ARG_NONE: { change = get_change (context, G_OPTION_ARG_NONE, entry->arg_data); *(gboolean *)entry->arg_data = !(entry->flags & G_OPTION_FLAG_REVERSE); break; } case G_OPTION_ARG_STRING: { gchar *data; data = g_locale_to_utf8 (value, -1, NULL, NULL, error); if (!data) return FALSE; change = get_change (context, G_OPTION_ARG_STRING, entry->arg_data); g_free (change->allocated.str); change->prev.str = *(gchar **)entry->arg_data; change->allocated.str = data; *(gchar **)entry->arg_data = data; break; } case G_OPTION_ARG_STRING_ARRAY: { gchar *data; data = g_locale_to_utf8 (value, -1, NULL, NULL, error); if (!data) return FALSE; change = get_change (context, G_OPTION_ARG_STRING_ARRAY, entry->arg_data); if (change->allocated.array.len == 0) { change->prev.array = *(gchar ***)entry->arg_data; change->allocated.array.data = g_new (gchar *, 2); } else change->allocated.array.data = g_renew (gchar *, change->allocated.array.data, change->allocated.array.len + 2); change->allocated.array.data[change->allocated.array.len] = data; change->allocated.array.data[change->allocated.array.len + 1] = NULL; change->allocated.array.len ++; *(gchar ***)entry->arg_data = change->allocated.array.data; break; } case G_OPTION_ARG_FILENAME: { gchar *data; #ifdef G_OS_WIN32 data = g_locale_to_utf8 (value, -1, NULL, NULL, error); if (!data) return FALSE; #else data = g_strdup (value); #endif change = get_change (context, G_OPTION_ARG_FILENAME, entry->arg_data); g_free (change->allocated.str); change->prev.str = *(gchar **)entry->arg_data; change->allocated.str = data; *(gchar **)entry->arg_data = data; break; } case G_OPTION_ARG_FILENAME_ARRAY: { gchar *data; #ifdef G_OS_WIN32 data = g_locale_to_utf8 (value, -1, NULL, NULL, error); if (!data) return FALSE; #else data = g_strdup (value); #endif change = get_change (context, G_OPTION_ARG_STRING_ARRAY, entry->arg_data); if (change->allocated.array.len == 0) { change->prev.array = *(gchar ***)entry->arg_data; change->allocated.array.data = g_new (gchar *, 2); } else change->allocated.array.data = g_renew (gchar *, change->allocated.array.data, change->allocated.array.len + 2); change->allocated.array.data[change->allocated.array.len] = data; change->allocated.array.data[change->allocated.array.len + 1] = NULL; change->allocated.array.len ++; *(gchar ***)entry->arg_data = change->allocated.array.data; break; } case G_OPTION_ARG_INT: { gint data; if (!parse_int (option_name, value, &data, error)) return FALSE; change = get_change (context, G_OPTION_ARG_INT, entry->arg_data); change->prev.integer = *(gint *)entry->arg_data; *(gint *)entry->arg_data = data; break; } case G_OPTION_ARG_CALLBACK: { gchar *data; gboolean retval; if (!value && entry->flags & G_OPTION_FLAG_OPTIONAL_ARG) data = NULL; else if (entry->flags & G_OPTION_FLAG_NO_ARG) data = NULL; else if (entry->flags & G_OPTION_FLAG_FILENAME) { #ifdef G_OS_WIN32 data = g_locale_to_utf8 (value, -1, NULL, NULL, error); #else data = g_strdup (value); #endif } else data = g_locale_to_utf8 (value, -1, NULL, NULL, error); if (!(entry->flags & (G_OPTION_FLAG_NO_ARG|G_OPTION_FLAG_OPTIONAL_ARG)) && !data) return FALSE; retval = (* (GOptionArgFunc) entry->arg_data) (option_name, data, group->user_data, error); if (!retval && error != NULL && *error == NULL) g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_FAILED, _("Error parsing option %s"), option_name); g_free (data); return retval; break; } case G_OPTION_ARG_DOUBLE: { gdouble data; if (!parse_double (option_name, value, &data, error)) { return FALSE; } change = get_change (context, G_OPTION_ARG_DOUBLE, entry->arg_data); change->prev.dbl = *(gdouble *)entry->arg_data; *(gdouble *)entry->arg_data = data; break; } case G_OPTION_ARG_INT64: { gint64 data; if (!parse_int64 (option_name, value, &data, error)) { return FALSE; } change = get_change (context, G_OPTION_ARG_INT64, entry->arg_data); change->prev.int64 = *(gint64 *)entry->arg_data; *(gint64 *)entry->arg_data = data; break; } default: g_assert_not_reached (); } return TRUE; } static gboolean parse_short_option (GOptionContext *context, GOptionGroup *group, gint idx, gint *new_idx, gchar arg, gint *argc, gchar ***argv, GError **error, gboolean *parsed) { gint j; for (j = 0; j < group->n_entries; j++) { if (arg == group->entries[j].short_name) { gchar *option_name; gchar *value = NULL; option_name = g_strdup_printf ("-%c", group->entries[j].short_name); if (NO_ARG (&group->entries[j])) value = NULL; else { if (*new_idx > idx) { g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_FAILED, _("Error parsing option %s"), option_name); g_free (option_name); return FALSE; } if (idx < *argc - 1) { if (!OPTIONAL_ARG (&group->entries[j])) { value = (*argv)[idx + 1]; add_pending_null (context, &((*argv)[idx + 1]), NULL); *new_idx = idx + 1; } else { if ((*argv)[idx + 1][0] == '-') value = NULL; else { value = (*argv)[idx + 1]; add_pending_null (context, &((*argv)[idx + 1]), NULL); *new_idx = idx + 1; } } } else if (idx >= *argc - 1 && OPTIONAL_ARG (&group->entries[j])) value = NULL; else { g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE, _("Missing argument for %s"), option_name); g_free (option_name); return FALSE; } } if (!parse_arg (context, group, &group->entries[j], value, option_name, error)) { g_free (option_name); return FALSE; } g_free (option_name); *parsed = TRUE; } } return TRUE; } static gboolean parse_long_option (GOptionContext *context, GOptionGroup *group, gint *idx, gchar *arg, gboolean aliased, gint *argc, gchar ***argv, GError **error, gboolean *parsed) { gint j; for (j = 0; j < group->n_entries; j++) { if (*idx >= *argc) return TRUE; if (aliased && (group->entries[j].flags & G_OPTION_FLAG_NOALIAS)) continue; if (NO_ARG (&group->entries[j]) && strcmp (arg, group->entries[j].long_name) == 0) { gchar *option_name; gboolean retval; option_name = g_strconcat ("--", group->entries[j].long_name, NULL); retval = parse_arg (context, group, &group->entries[j], NULL, option_name, error); g_free (option_name); add_pending_null (context, &((*argv)[*idx]), NULL); *parsed = TRUE; return retval; } else { gint len = strlen (group->entries[j].long_name); if (strncmp (arg, group->entries[j].long_name, len) == 0 && (arg[len] == '=' || arg[len] == 0)) { gchar *value = NULL; gchar *option_name; add_pending_null (context, &((*argv)[*idx]), NULL); option_name = g_strconcat ("--", group->entries[j].long_name, NULL); if (arg[len] == '=') value = arg + len + 1; else if (*idx < *argc - 1) { if (!OPTIONAL_ARG (&group->entries[j])) { value = (*argv)[*idx + 1]; add_pending_null (context, &((*argv)[*idx + 1]), NULL); (*idx)++; } else { if ((*argv)[*idx + 1][0] == '-') { gboolean retval; retval = parse_arg (context, group, &group->entries[j], NULL, option_name, error); *parsed = TRUE; g_free (option_name); return retval; } else { value = (*argv)[*idx + 1]; add_pending_null (context, &((*argv)[*idx + 1]), NULL); (*idx)++; } } } else if (*idx >= *argc - 1 && OPTIONAL_ARG (&group->entries[j])) { gboolean retval; retval = parse_arg (context, group, &group->entries[j], NULL, option_name, error); *parsed = TRUE; g_free (option_name); return retval; } else { g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE, _("Missing argument for %s"), option_name); g_free (option_name); return FALSE; } if (!parse_arg (context, group, &group->entries[j], value, option_name, error)) { g_free (option_name); return FALSE; } g_free (option_name); *parsed = TRUE; } } } return TRUE; } static gboolean parse_remaining_arg (GOptionContext *context, GOptionGroup *group, gint *idx, gint *argc, gchar ***argv, GError **error, gboolean *parsed) { gint j; for (j = 0; j < group->n_entries; j++) { if (*idx >= *argc) return TRUE; if (group->entries[j].long_name[0]) continue; g_return_val_if_fail (group->entries[j].arg == G_OPTION_ARG_CALLBACK || group->entries[j].arg == G_OPTION_ARG_STRING_ARRAY || group->entries[j].arg == G_OPTION_ARG_FILENAME_ARRAY, FALSE); add_pending_null (context, &((*argv)[*idx]), NULL); if (!parse_arg (context, group, &group->entries[j], (*argv)[*idx], "", error)) return FALSE; *parsed = TRUE; return TRUE; } return TRUE; } static void free_changes_list (GOptionContext *context, gboolean revert) { GList *list; for (list = context->changes; list != NULL; list = list->next) { Change *change = list->data; if (revert) { switch (change->arg_type) { case G_OPTION_ARG_NONE: *(gboolean *)change->arg_data = change->prev.bool; break; case G_OPTION_ARG_INT: *(gint *)change->arg_data = change->prev.integer; break; case G_OPTION_ARG_STRING: case G_OPTION_ARG_FILENAME: g_free (change->allocated.str); *(gchar **)change->arg_data = change->prev.str; break; case G_OPTION_ARG_STRING_ARRAY: case G_OPTION_ARG_FILENAME_ARRAY: g_strfreev (change->allocated.array.data); *(gchar ***)change->arg_data = change->prev.array; break; case G_OPTION_ARG_DOUBLE: *(gdouble *)change->arg_data = change->prev.dbl; break; case G_OPTION_ARG_INT64: *(gint64 *)change->arg_data = change->prev.int64; break; default: g_assert_not_reached (); } } g_free (change); } g_list_free (context->changes); context->changes = NULL; } static void free_pending_nulls (GOptionContext *context, gboolean perform_nulls) { GList *list; for (list = context->pending_nulls; list != NULL; list = list->next) { PendingNull *n = list->data; if (perform_nulls) { if (n->value) { /* Copy back the short options */ *(n->ptr)[0] = '-'; strcpy (*n->ptr + 1, n->value); } else *n->ptr = NULL; } g_free (n->value); g_free (n); } g_list_free (context->pending_nulls); context->pending_nulls = NULL; } /* Use a platform-specific mechanism to look up the first argument to * the current process. * Note if you implement this for other platforms, also add it to * tests/option-argv0.c */ static char * platform_get_argv0 (void) { #if defined __linux char *cmdline; char *base_arg0; gsize len; if (!g_file_get_contents ("/proc/self/cmdline", &cmdline, &len, NULL)) return NULL; /* Sanity check for a NUL terminator. */ if (!memchr (cmdline, 0, len)) return NULL; /* We could just return cmdline, but I think it's better * to hold on to a smaller malloc block; the arguments * could be large. */ base_arg0 = g_path_get_basename (cmdline); g_free (cmdline); return base_arg0; #elif defined __OpenBSD__ char **cmdline = NULL; char *base_arg0; gsize len = PATH_MAX; int mib[] = { CTL_KERN, KERN_PROC_ARGS, getpid(), KERN_PROC_ARGV }; cmdline = (char **) realloc (cmdline, len); if (sysctl (mib, G_N_ELEMENTS (mib), cmdline, &len, NULL, 0) == -1) { g_free (cmdline); return NULL; } /* We could just return cmdline, but I think it's better * to hold on to a smaller malloc block; the arguments * could be large. */ base_arg0 = g_path_get_basename (*cmdline); g_free (cmdline); return base_arg0; #endif return NULL; } /** * g_option_context_parse: * @context: a #GOptionContext * @argc: (inout) (allow-none): a pointer to the number of command line arguments * @argv: (inout) (array length=argc) (allow-none): a pointer to the array of command line arguments * @error: a return location for errors * * Parses the command line arguments, recognizing options * which have been added to @context. A side-effect of * calling this function is that g_set_prgname() will be * called. * * If the parsing is successful, any parsed arguments are * removed from the array and @argc and @argv are updated * accordingly. A '--' option is stripped from @argv * unless there are unparsed options before and after it, * or some of the options after it start with '-'. In case * of an error, @argc and @argv are left unmodified. * * If automatic support is enabled * (see g_option_context_set_help_enabled()), and the * @argv array contains one of the recognized help options, * this function will produce help output to stdout and * call exit (0). * * Note that function depends on the * current locale for * automatic character set conversion of string and filename * arguments. * * Return value: %TRUE if the parsing was successful, * %FALSE if an error occurred * * Since: 2.6 **/ gboolean g_option_context_parse (GOptionContext *context, gint *argc, gchar ***argv, GError **error) { gint i, j, k; GList *list; /* Set program name */ if (!g_get_prgname()) { gchar *prgname; if (argc && argv && *argc) prgname = g_path_get_basename ((*argv)[0]); else prgname = platform_get_argv0 (); if (prgname) g_set_prgname (prgname); else g_set_prgname (""); g_free (prgname); } /* Call pre-parse hooks */ list = context->groups; while (list) { GOptionGroup *group = list->data; if (group->pre_parse_func) { if (!(* group->pre_parse_func) (context, group, group->user_data, error)) goto fail; } list = list->next; } if (context->main_group && context->main_group->pre_parse_func) { if (!(* context->main_group->pre_parse_func) (context, context->main_group, context->main_group->user_data, error)) goto fail; } if (argc && argv) { gboolean stop_parsing = FALSE; gboolean has_unknown = FALSE; gint separator_pos = 0; for (i = 1; i < *argc; i++) { gchar *arg, *dash; gboolean parsed = FALSE; if ((*argv)[i][0] == '-' && (*argv)[i][1] != '\0' && !stop_parsing) { if ((*argv)[i][1] == '-') { /* -- option */ arg = (*argv)[i] + 2; /* '--' terminates list of arguments */ if (*arg == 0) { separator_pos = i; stop_parsing = TRUE; continue; } /* Handle help options */ if (context->help_enabled) { if (strcmp (arg, "help") == 0) print_help (context, TRUE, NULL); else if (strcmp (arg, "help-all") == 0) print_help (context, FALSE, NULL); else if (strncmp (arg, "help-", 5) == 0) { list = context->groups; while (list) { GOptionGroup *group = list->data; if (strcmp (arg + 5, group->name) == 0) print_help (context, FALSE, group); list = list->next; } } } if (context->main_group && !parse_long_option (context, context->main_group, &i, arg, FALSE, argc, argv, error, &parsed)) goto fail; if (parsed) continue; /* Try the groups */ list = context->groups; while (list) { GOptionGroup *group = list->data; if (!parse_long_option (context, group, &i, arg, FALSE, argc, argv, error, &parsed)) goto fail; if (parsed) break; list = list->next; } if (parsed) continue; /* Now look for ---@name * @description: a description for this group to be shown in * . This string is translated using the translation * domain or translation function of the group * @help_description: a description for the @name option. * This string is translated using the translation domain or translation function * of the group * @user_data: (allow-none): user data that will be passed to the pre- and post-parse hooks, * the error hook and to callbacks of %G_OPTION_ARG_CALLBACK options, or %NULL * @destroy: (allow-none): a function that will be called to free @user_data, or %NULL * * Creates a new #GOptionGroup. * * Return value: a newly created option group. It should be added * to a #GOptionContext or freed with g_option_group_free(). * * Since: 2.6 **/ GOptionGroup * g_option_group_new (const gchar *name, const gchar *description, const gchar *help_description, gpointer user_data, GDestroyNotify destroy) { GOptionGroup *group; group = g_new0 (GOptionGroup, 1); group->name = g_strdup (name); group->description = g_strdup (description); group->help_description = g_strdup (help_description); group->user_data = user_data; group->destroy_notify = destroy; return group; } /** * g_option_group_free: * @group: a #GOptionGroup * * Frees a #GOptionGroup. Note that you must not * free groups which have been added to a #GOptionContext. * * Since: 2.6 **/ void g_option_group_free (GOptionGroup *group) { g_return_if_fail (group != NULL); g_free (group->name); g_free (group->description); g_free (group->help_description); g_free (group->entries); if (group->destroy_notify) (* group->destroy_notify) (group->user_data); if (group->translate_notify) (* group->translate_notify) (group->translate_data); g_free (group); } /** * g_option_group_add_entries: * @group: a #GOptionGroup * @entries: a %NULL-terminated array of #GOptionEntrys * * Adds the options specified in @entries to @group. * * Since: 2.6 **/ void g_option_group_add_entries (GOptionGroup *group, const GOptionEntry *entries) { gint i, n_entries; g_return_if_fail (entries != NULL); for (n_entries = 0; entries[n_entries].long_name != NULL; n_entries++) ; group->entries = g_renew (GOptionEntry, group->entries, group->n_entries + n_entries); memcpy (group->entries + group->n_entries, entries, sizeof (GOptionEntry) * n_entries); for (i = group->n_entries; i < group->n_entries + n_entries; i++) { gchar c = group->entries[i].short_name; if (c == '-' || (c != 0 && !g_ascii_isprint (c))) { g_warning (G_STRLOC ": ignoring invalid short option '%c' (%d) in entry %s:%s", c, c, group->name, group->entries[i].long_name); group->entries[i].short_name = '\0'; } if (group->entries[i].arg != G_OPTION_ARG_NONE && (group->entries[i].flags & G_OPTION_FLAG_REVERSE) != 0) { g_warning (G_STRLOC ": ignoring reverse flag on option of arg-type %d in entry %s:%s", group->entries[i].arg, group->name, group->entries[i].long_name); group->entries[i].flags &= ~G_OPTION_FLAG_REVERSE; } if (group->entries[i].arg != G_OPTION_ARG_CALLBACK && (group->entries[i].flags & (G_OPTION_FLAG_NO_ARG|G_OPTION_FLAG_OPTIONAL_ARG|G_OPTION_FLAG_FILENAME)) != 0) { g_warning (G_STRLOC ": ignoring no-arg, optional-arg or filename flags (%d) on option of arg-type %d in entry %s:%s", group->entries[i].flags, group->entries[i].arg, group->name, group->entries[i].long_name); group->entries[i].flags &= ~(G_OPTION_FLAG_NO_ARG|G_OPTION_FLAG_OPTIONAL_ARG|G_OPTION_FLAG_FILENAME); } } group->n_entries += n_entries; } /** * g_option_group_set_parse_hooks: * @group: a #GOptionGroup * @pre_parse_func: (allow-none): a function to call before parsing, or %NULL * @post_parse_func: (allow-none): a function to call after parsing, or %NULL * * Associates two functions with @group which will be called * from g_option_context_parse() before the first option is parsed * and after the last option has been parsed, respectively. * * Note that the user data to be passed to @pre_parse_func and * @post_parse_func can be specified when constructing the group * with g_option_group_new(). * * Since: 2.6 **/ void g_option_group_set_parse_hooks (GOptionGroup *group, GOptionParseFunc pre_parse_func, GOptionParseFunc post_parse_func) { g_return_if_fail (group != NULL); group->pre_parse_func = pre_parse_func; group->post_parse_func = post_parse_func; } /** * g_option_group_set_error_hook: * @group: a #GOptionGroup * @error_func: a function to call when an error occurs * * Associates a function with @group which will be called * from g_option_context_parse() when an error occurs. * * Note that the user data to be passed to @error_func can be * specified when constructing the group with g_option_group_new(). * * Since: 2.6 **/ void g_option_group_set_error_hook (GOptionGroup *group, GOptionErrorFunc error_func) { g_return_if_fail (group != NULL); group->error_func = error_func; } /** * g_option_group_set_translate_func: * @group: a #GOptionGroup * @func: (allow-none): the #GTranslateFunc, or %NULL * @data: (allow-none): user data to pass to @func, or %NULL * @destroy_notify: (allow-none): a function which gets called to free @data, or %NULL * * Sets the function which is used to translate user-visible * strings, for output. Different * groups can use different #GTranslateFuncs. If @func * is %NULL, strings are not translated. * * If you are using gettext(), you only need to set the translation * domain, see g_option_group_set_translation_domain(). * * Since: 2.6 **/ void g_option_group_set_translate_func (GOptionGroup *group, GTranslateFunc func, gpointer data, GDestroyNotify destroy_notify) { g_return_if_fail (group != NULL); if (group->translate_notify) group->translate_notify (group->translate_data); group->translate_func = func; group->translate_data = data; group->translate_notify = destroy_notify; } static const gchar * dgettext_swapped (const gchar *msgid, const gchar *domainname) { return g_dgettext (domainname, msgid); } /** * g_option_group_set_translation_domain: * @group: a #GOptionGroup * @domain: the domain to use * * A convenience function to use gettext() for translating * user-visible strings. * * Since: 2.6 **/ void g_option_group_set_translation_domain (GOptionGroup *group, const gchar *domain) { g_return_if_fail (group != NULL); g_option_group_set_translate_func (group, (GTranslateFunc)dgettext_swapped, g_strdup (domain), g_free); } /** * g_option_context_set_translate_func: * @context: a #GOptionContext * @func: (allow-none): the #GTranslateFunc, or %NULL * @data: (allow-none): user data to pass to @func, or %NULL * @destroy_notify: (allow-none): a function which gets called to free @data, or %NULL * * Sets the function which is used to translate the contexts * user-visible strings, for output. * If @func is %NULL, strings are not translated. * * Note that option groups have their own translation functions, * this function only affects the @parameter_string (see g_option_context_new()), * the summary (see g_option_context_set_summary()) and the description * (see g_option_context_set_description()). * * If you are using gettext(), you only need to set the translation * domain, see g_option_context_set_translation_domain(). * * Since: 2.12 **/ void g_option_context_set_translate_func (GOptionContext *context, GTranslateFunc func, gpointer data, GDestroyNotify destroy_notify) { g_return_if_fail (context != NULL); if (context->translate_notify) context->translate_notify (context->translate_data); context->translate_func = func; context->translate_data = data; context->translate_notify = destroy_notify; } /** * g_option_context_set_translation_domain: * @context: a #GOptionContext * @domain: the domain to use * * A convenience function to use gettext() for translating * user-visible strings. * * Since: 2.12 **/ void g_option_context_set_translation_domain (GOptionContext *context, const gchar *domain) { g_return_if_fail (context != NULL); g_option_context_set_translate_func (context, (GTranslateFunc)dgettext_swapped, g_strdup (domain), g_free); } /** * g_option_context_set_summary: * @context: a #GOptionContext * @summary: (allow-none): a string to be shown in output * before the list of options, or %NULL * * Adds a string to be displayed in output * before the list of options. This is typically a summary of the * program functionality. * * Note that the summary is translated (see * g_option_context_set_translate_func() and * g_option_context_set_translation_domain()). * * Since: 2.12 */ void g_option_context_set_summary (GOptionContext *context, const gchar *summary) { g_return_if_fail (context != NULL); g_free (context->summary); context->summary = g_strdup (summary); } /** * g_option_context_get_summary: * @context: a #GOptionContext * * Returns the summary. See g_option_context_set_summary(). * * Returns: the summary * * Since: 2.12 */ const gchar * g_option_context_get_summary (GOptionContext *context) { g_return_val_if_fail (context != NULL, NULL); return context->summary; } /** * g_option_context_set_description: * @context: a #GOptionContext * @description: (allow-none): a string to be shown in output * after the list of options, or %NULL * * Adds a string to be displayed in output * after the list of options. This text often includes a bug reporting * address. * * Note that the summary is translated (see * g_option_context_set_translate_func()). * * Since: 2.12 */ void g_option_context_set_description (GOptionContext *context, const gchar *description) { g_return_if_fail (context != NULL); g_free (context->description); context->description = g_strdup (description); } /** * g_option_context_get_description: * @context: a #GOptionContext * * Returns the description. See g_option_context_set_description(). * * Returns: the description * * Since: 2.12 */ const gchar * g_option_context_get_description (GOptionContext *context) { g_return_val_if_fail (context != NULL, NULL); return context->description; } pkg-config-0.29.1/glib/glib/glib-private.c0000664000175000017500000000265212651243552015147 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 2011 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. * * Author: Colin Walters */ #include "config.h" #include "glib-private.h" /** * glib__private__: * @arg: Do not use this argument * * Do not call this function; it is used to share private * API between glib, gobject, and gio. */ GLibPrivateVTable * glib__private__ (void) { static GLibPrivateVTable table = { g_wakeup_new, g_wakeup_free, g_wakeup_get_pollfd, g_wakeup_signal, g_wakeup_acknowledge, 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; } pkg-config-0.29.1/glib/glib/gbacktrace.c0000664000175000017500000002165612651243552014655 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the GLib Team and others 1997-2000. See the AUTHORS * file for a list of people on the GLib Team. See the ChangeLog * files for a list of changes. These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/. */ /* * MT safe ; except for g_on_error_stack_trace, but who wants thread safety * then */ #include "config.h" #include "glibconfig.h" #include #include #include #include #ifdef HAVE_SYS_TIME_H #include #endif #ifdef HAVE_SYS_TIMES_H #include #endif #include #ifdef HAVE_SYS_WAIT_H #include #endif #include #ifdef HAVE_UNISTD_H #include #endif #ifdef HAVE_SYS_SELECT_H #include #endif /* HAVE_SYS_SELECT_H */ #include /* for bzero on BSD systems */ #ifdef G_OS_WIN32 # define STRICT /* Strict typing, please */ # define _WIN32_WINDOWS 0x0401 /* to get IsDebuggerPresent */ # include # undef STRICT #endif #include "gbacktrace.h" #include "gtypes.h" #include "gmain.h" #include "gprintfint.h" #include "gutils.h" #ifndef NO_FD_SET # define SELECT_MASK fd_set #else # if defined(_IBMR2) # define SELECT_MASK void # else # define SELECT_MASK int # endif #endif #ifndef G_OS_WIN32 static void stack_trace (char **args); #endif /* 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; /** * g_on_error_query: * @prg_name: the program name, needed by gdb * for the [S]tack trace option. If @prg_name is %NULL, g_get_prgname() * is called to get the program name (which will work correctly if * gdk_init() or gtk_init() has been called) * * Prompts the user with * [E]xit, [H]alt, show [S]tack trace or [P]roceed. * This function is intended to be used for debugging use only. * The following example shows how it can be used together with * the g_log() functions. * * |[ * #include <glib.h> * * static void * log_handler (const gchar *log_domain, * GLogLevelFlags log_level, * const gchar *message, * gpointer user_data) * { * g_log_default_handler (log_domain, log_level, message, user_data); * * g_on_error_query (MY_PROGRAM_NAME); * } * * int * main (int argc, char *argv[]) * { * g_log_set_handler (MY_LOG_DOMAIN, * G_LOG_LEVEL_WARNING | * G_LOG_LEVEL_ERROR | * G_LOG_LEVEL_CRITICAL, * log_handler, * NULL); * /* ... */ * ]| * * If [E]xit is selected, the application terminates with a call * to _exit(0). * * If [S]tack trace is selected, g_on_error_stack_trace() is called. * This invokes gdb, which attaches to the current * process and shows a stack trace. The prompt is then shown again. * * If [P]roceed is selected, the function returns. * * This function may cause different actions on non-UNIX platforms. */ void g_on_error_query (const gchar *prg_name) { #ifndef G_OS_WIN32 static const gchar * const query1 = "[E]xit, [H]alt"; static const gchar * const query2 = ", show [S]tack trace"; static const gchar * const query3 = " or [P]roceed"; gchar buf[16]; if (!prg_name) prg_name = g_get_prgname (); retry: if (prg_name) _g_fprintf (stdout, "%s (pid:%u): %s%s%s: ", prg_name, (guint) getpid (), query1, query2, query3); else _g_fprintf (stdout, "(process:%u): %s%s: ", (guint) getpid (), query1, query3); fflush (stdout); if (isatty(0) && isatty(1)) fgets (buf, 8, stdin); else strcpy (buf, "E\n"); if ((buf[0] == 'E' || buf[0] == 'e') && buf[1] == '\n') _exit (0); else if ((buf[0] == 'P' || buf[0] == 'p') && buf[1] == '\n') return; else if (prg_name && (buf[0] == 'S' || buf[0] == 's') && buf[1] == '\n') { g_on_error_stack_trace (prg_name); goto retry; } else if ((buf[0] == 'H' || buf[0] == 'h') && buf[1] == '\n') { while (glib_on_error_halt) ; glib_on_error_halt = TRUE; return; } else goto retry; #else if (!prg_name) prg_name = g_get_prgname (); MessageBox (NULL, "g_on_error_query called, program terminating", (prg_name && *prg_name) ? prg_name : NULL, MB_OK|MB_ICONERROR); _exit(0); #endif } /** * g_on_error_stack_trace: * @prg_name: the program name, needed by gdb * for the [S]tack trace option. * * Invokes gdb, which attaches to the current * process and shows a stack trace. Called by g_on_error_query() * when the [S]tack trace option is selected. You can get the current * process's "program name" with g_get_prgname(), assuming that you * have called gtk_init() or gdk_init(). * * This function may cause different actions on non-UNIX platforms. */ void g_on_error_stack_trace (const gchar *prg_name) { #if defined(G_OS_UNIX) || defined(G_OS_BEOS) pid_t pid; gchar buf[16]; gchar *args[4] = { "gdb", NULL, NULL, NULL }; int status; if (!prg_name) return; _g_sprintf (buf, "%u", (guint) getpid ()); args[1] = (gchar*) prg_name; args[2] = buf; pid = fork (); if (pid == 0) { stack_trace (args); _exit (0); } else if (pid == (pid_t) -1) { perror ("unable to fork gdb"); return; } waitpid (pid, &status, 0); #else if (IsDebuggerPresent ()) G_BREAKPOINT (); else abort (); #endif } #ifndef G_OS_WIN32 static gboolean stack_trace_done = FALSE; static void stack_trace_sigchld (int signum) { stack_trace_done = TRUE; } static void stack_trace (char **args) { pid_t pid; int in_fd[2]; int out_fd[2]; SELECT_MASK fdset; SELECT_MASK readset; struct timeval tv; int sel, idx, state; char buffer[256]; char c; stack_trace_done = FALSE; signal (SIGCHLD, stack_trace_sigchld); if ((pipe (in_fd) == -1) || (pipe (out_fd) == -1)) { perror ("unable to open pipe"); _exit (0); } pid = fork (); if (pid == 0) { close (0); dup (in_fd[0]); /* set the stdin to the in pipe */ close (1); dup (out_fd[1]); /* set the stdout to the out pipe */ close (2); dup (out_fd[1]); /* set the stderr to the out pipe */ execvp (args[0], args); /* exec gdb */ perror ("exec failed"); _exit (0); } else if (pid == (pid_t) -1) { perror ("unable to fork"); _exit (0); } FD_ZERO (&fdset); FD_SET (out_fd[0], &fdset); write (in_fd[1], "backtrace\n", 10); write (in_fd[1], "p x = 0\n", 8); write (in_fd[1], "quit\n", 5); idx = 0; state = 0; while (1) { readset = fdset; tv.tv_sec = 1; tv.tv_usec = 0; sel = select (FD_SETSIZE, &readset, NULL, NULL, &tv); if (sel == -1) break; if ((sel > 0) && (FD_ISSET (out_fd[0], &readset))) { if (read (out_fd[0], &c, 1)) { switch (state) { case 0: if (c == '#') { state = 1; idx = 0; buffer[idx++] = c; } break; case 1: buffer[idx++] = c; if ((c == '\n') || (c == '\r')) { buffer[idx] = 0; _g_fprintf (stdout, "%s", buffer); state = 0; idx = 0; } break; default: break; } } } else if (stack_trace_done) break; } close (in_fd[0]); close (in_fd[1]); close (out_fd[0]); close (out_fd[1]); _exit (0); } #endif /* !G_OS_WIN32 */ pkg-config-0.29.1/glib/glib/glib-unix.h0000664000175000017500000001051712651243552014464 00000000000000/* glib-unix.h - Unix specific integration * Copyright (C) 2011 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_UNIX_H__ #define __G_UNIX_H__ /* We need to include the UNIX headers needed to use the APIs below, * but we also take this opportunity to include a wide selection of * other UNIX headers. If one of the headers below is broken on some * system, work around it here (or better, fix the system or tell * people to use a better one). */ #include #include #include #include #include #include #ifndef G_OS_UNIX #error "This header may only be used on UNIX" #endif G_BEGIN_DECLS /** * G_UNIX_ERROR: * * Error domain for API in the "g_unix_" namespace. Note that there is * no exported enumeration mapping %errno. Instead, all functions * ensure that %errno is relevant. The code for all #G_UNIX_ERROR is * always 0, and the error message is always * generated via g_strerror(). * * It is expected that most code will not look at %errno from these * APIs. Important cases where one would want to differentiate between * errors are already covered by existing cross-platform GLib API, * such as e.g. #GFile wrapping ENOENT. However, it is * provided for completeness, at least. */ #define G_UNIX_ERROR (g_unix_error_quark()) GLIB_AVAILABLE_IN_2_30 GQuark g_unix_error_quark (void); GLIB_AVAILABLE_IN_2_30 gboolean g_unix_open_pipe (gint *fds, gint flags, GError **error); GLIB_AVAILABLE_IN_2_30 gboolean g_unix_set_fd_nonblocking (gint fd, gboolean nonblock, GError **error); GLIB_AVAILABLE_IN_2_30 GSource *g_unix_signal_source_new (gint signum); GLIB_AVAILABLE_IN_2_30 guint g_unix_signal_add_full (gint priority, gint signum, GSourceFunc handler, gpointer user_data, GDestroyNotify notify); GLIB_AVAILABLE_IN_2_30 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__ */ pkg-config-0.29.1/glib/glib/gurifuncs.h0000664000175000017500000000534112651243552014572 00000000000000/* GIO - GLib Input, Output and Streaming Library * * Copyright (C) 2006-2007 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. * * Author: Alexander Larsson */ #ifndef __G_URI_FUNCS_H__ #define __G_URI_FUNCS_H__ #if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) #error "Only can be included directly." #endif #include G_BEGIN_DECLS /** * G_URI_RESERVED_CHARS_GENERIC_DELIMITERS: * * Generic delimiters characters as defined in RFC 3986. Includes ":/?#[]@". **/ #define G_URI_RESERVED_CHARS_GENERIC_DELIMITERS ":/?#[]@" /** * G_URI_RESERVED_CHARS_SUBCOMPONENT_DELIMITERS: * * Subcomponent delimiter characters as defined in RFC 3986. Includes "!$&'()*+,;=". **/ #define G_URI_RESERVED_CHARS_SUBCOMPONENT_DELIMITERS "!$&'()*+,;=" /** * G_URI_RESERVED_CHARS_ALLOWED_IN_PATH_ELEMENT: * * Allowed characters in path elements. Includes "!$&'()*+,;=:@". **/ #define G_URI_RESERVED_CHARS_ALLOWED_IN_PATH_ELEMENT G_URI_RESERVED_CHARS_SUBCOMPONENT_DELIMITERS ":@" /** * G_URI_RESERVED_CHARS_ALLOWED_IN_PATH: * * Allowed characters in a path. Includes "!$&'()*+,;=:@/". **/ #define G_URI_RESERVED_CHARS_ALLOWED_IN_PATH G_URI_RESERVED_CHARS_ALLOWED_IN_PATH_ELEMENT "/" /** * G_URI_RESERVED_CHARS_ALLOWED_IN_USERINFO: * * Allowed characters in userinfo as defined in RFC 3986. Includes "!$&'()*+,;=:". **/ #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); G_END_DECLS #endif /* __G_URI_FUNCS_H__ */ pkg-config-0.29.1/glib/glib/docs.c0000664000175000017500000016542112651243552013516 00000000000000/* * Copyright © 2011 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 licence, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * * Author: Matthias Clasen */ /* This file collects documentation for macros, typedefs and * the like, which have no good home in any of the 'real' source * files. */ /* Basic types {{{1 */ /** * SECTION:types * @title: Basic Types * @short_description: standard GLib types, defined for ease-of-use * and portability * * GLib defines a number of commonly used types, which can be divided * into 4 groups: * - New types which are not part of standard C (but are defined in * various C standard library header files) - #gboolean, #gsize, * #gssize, #goffset, #gintptr, #guintptr. * - Integer types which are guaranteed to be the same size across * all platforms - #gint8, #guint8, #gint16, #guint16, #gint32, * #guint32, #gint64, #guint64. * - Types which are easier to use than their standard C counterparts - * #gpointer, #gconstpointer, #guchar, #guint, #gushort, #gulong. * - Types which correspond exactly to standard C types, but are * included for completeness - #gchar, #gint, #gshort, #glong, * #gfloat, #gdouble. * * GLib also defines macros for the limits of some of the standard * integer and floating point types, as well as macros for suitable * printf() formats for these types. */ /** * gboolean: * * A standard boolean type. * Variables of this type should only contain the value * %TRUE or %FALSE. */ /** * gpointer: * * An untyped pointer. * #gpointer looks better and is easier to use * than void*. */ /** * gconstpointer: * * An untyped pointer to constant data. * The data pointed to should not be changed. * * This is typically used in function prototypes to indicate * that the data pointed to will not be altered by the function. */ /** * gchar: * * Corresponds to the standard C char type. */ /** * guchar: * * Corresponds to the standard C unsigned char type. */ /** * gint: * * Corresponds to the standard C int type. * Values of this type can range from #G_MININT to #G_MAXINT. */ /** * G_MININT: * * The minimum value which can be held in a #gint. */ /** * G_MAXINT: * * The maximum value which can be held in a #gint. */ /** * guint: * * Corresponds to the standard C unsigned int type. * Values of this type can range from 0 to #G_MAXUINT. */ /** * G_MAXUINT: * * The maximum value which can be held in a #guint. */ /** * gshort: * * Corresponds to the standard C short type. * Values of this type can range from #G_MINSHORT to #G_MAXSHORT. */ /** * G_MINSHORT: * * The minimum value which can be held in a #gshort. */ /** * G_MAXSHORT: * * The maximum value which can be held in a #gshort. */ /** * gushort: * * Corresponds to the standard C unsigned short type. * Values of this type can range from 0 to #G_MAXUSHORT. */ /** * G_MAXUSHORT: * * The maximum value which can be held in a #gushort. */ /** * glong: * * Corresponds to the standard C long type. * Values of this type can range from #G_MINLONG to #G_MAXLONG. */ /** * G_MINLONG: * * The minimum value which can be held in a #glong. */ /** * G_MAXLONG: * * The maximum value which can be held in a #glong. */ /** * gulong: * * Corresponds to the standard C unsigned long type. * Values of this type can range from 0 to #G_MAXULONG. */ /** * G_MAXULONG: * * The maximum value which can be held in a #gulong. */ /** * gint8: * * A signed integer guaranteed to be 8 bits on all platforms. * Values of this type can range from #G_MININT8 (= -128) to * #G_MAXINT8 (= 127). */ /** * G_MININT8: * * The minimum value which can be held in a #gint8. * * Since: 2.4 */ /** * G_MAXINT8: * * The maximum value which can be held in a #gint8. * * Since: 2.4 */ /** * guint8: * * An unsigned integer guaranteed to be 8 bits on all platforms. * Values of this type can range from 0 to #G_MAXUINT8 (= 255). */ /** * G_MAXUINT8: * * The maximum value which can be held in a #guint8. * * Since: 2.4 */ /** * gint16: * * A signed integer guaranteed to be 16 bits on all platforms. * Values of this type can range from #G_MININT16 (= -32,768) to * #G_MAXINT16 (= 32,767). * * To print or scan values of this type, use * %G_GINT16_MODIFIER and/or %G_GINT16_FORMAT. */ /** * G_MININT16: * * The minimum value which can be held in a #gint16. * * Since: 2.4 */ /** * G_MAXINT16: * * The maximum value which can be held in a #gint16. * * Since: 2.4 */ /** * G_GINT16_MODIFIER: * * The platform dependent length modifier for conversion specifiers * for scanning and printing values of type #gint16 or #guint16. It * is a string literal, but doesn't include the percent-sign, such * that you can add precision and length modifiers between percent-sign * and conversion specifier and append a conversion specifier. * * The following example prints "0x7b"; * |[ * gint16 value = 123; * g_print ("%#" G_GINT16_MODIFIER "x", value); * ]| * * Since: 2.4 */ /** * G_GINT16_FORMAT: * * This is the platform dependent conversion specifier for scanning and * printing values of type #gint16. It is a string literal, but doesn't * include the percent-sign, such that you can add precision and length * modifiers between percent-sign and conversion specifier. * * |[ * gint16 in; * gint32 out; * sscanf ("42", "%" G_GINT16_FORMAT, &in) * out = in * 1000; * g_print ("%" G_GINT32_FORMAT, out); * ]| */ /** * guint16: * * An unsigned integer guaranteed to be 16 bits on all platforms. * Values of this type can range from 0 to #G_MAXUINT16 (= 65,535). * * To print or scan values of this type, use * %G_GINT16_MODIFIER and/or %G_GUINT16_FORMAT. */ /** * G_MAXUINT16: * * The maximum value which can be held in a #guint16. * * Since: 2.4 */ /** * G_GUINT16_FORMAT: * * This is the platform dependent conversion specifier for scanning * and printing values of type #guint16. See also #G_GINT16_FORMAT */ /** * gint32: * * A signed integer guaranteed to be 32 bits on all platforms. * Values of this type can range from #G_MININT32 (= -2,147,483,648) * to #G_MAXINT32 (= 2,147,483,647). * * To print or scan values of this type, use * %G_GINT32_MODIFIER and/or %G_GINT32_FORMAT. */ /** * G_MININT32: * * The minimum value which can be held in a #gint32. * * Since: 2.4 */ /** * G_MAXINT32: * * The maximum value which can be held in a #gint32. * * Since: 2.4 */ /** * G_GINT32_MODIFIER: * * The platform dependent length modifier for conversion specifiers * for scanning and printing values of type #gint32 or #guint32. It * is a string literal. See also #G_GINT16_MODIFIER. * * Since: 2.4 */ /** * G_GINT32_FORMAT: * * This is the platform dependent conversion specifier for scanning * and printing values of type #gint32. See also #G_GINT16_FORMAT. */ /** * guint32: * * An unsigned integer guaranteed to be 32 bits on all platforms. * Values of this type can range from 0 to #G_MAXUINT32 (= 4,294,967,295). * * To print or scan values of this type, use * %G_GINT32_MODIFIER and/or %G_GUINT32_FORMAT. */ /** * G_MAXUINT32: * * The maximum value which can be held in a #guint32. * * Since: 2.4 */ /** * G_GUINT32_FORMAT: * * This is the platform dependent conversion specifier for scanning * and printing values of type #guint32. See also #G_GINT16_FORMAT. */ /** * gint64: * * A signed integer guaranteed to be 64 bits on all platforms. * Values of this type can range from #G_MININT64 * (= -9,223,372,036,854,775,808) to #G_MAXINT64 * (= 9,223,372,036,854,775,807). * * To print or scan values of this type, use * %G_GINT64_MODIFIER and/or %G_GINT64_FORMAT. */ /** * G_MININT64: * * The minimum value which can be held in a #gint64. */ /** * G_MAXINT64: * * The maximum value which can be held in a #gint64. */ /** * G_GINT64_MODIFIER: * * The platform dependent length modifier for conversion specifiers * for scanning and printing values of type #gint64 or #guint64. * It is a string literal. * * * Some platforms do not support printing 64 bit integers, even * though the types are supported. On such platforms #G_GINT64_MODIFIER * is not defined. * * * Since: 2.4 */ /** * G_GINT64_FORMAT: * * This is the platform dependent conversion specifier for scanning * and printing values of type #gint64. See also #G_GINT16_FORMAT. * * * Some platforms do not support scanning and printing 64 bit integers, * even though the types are supported. On such platforms #G_GINT64_FORMAT * is not defined. Note that scanf() may not support 64 bit integers, even * if #G_GINT64_FORMAT is defined. Due to its weak error handling, scanf() * is not recommended for parsing anyway; consider using g_ascii_strtoull() * instead. * */ /** * guint64: * * An unsigned integer guaranteed to be 64 bits on all platforms. * Values of this type can range from 0 to #G_MAXUINT64 * (= 18,446,744,073,709,551,615). * * To print or scan values of this type, use * %G_GINT64_MODIFIER and/or %G_GUINT64_FORMAT. */ /** * G_MAXUINT64: * * The maximum value which can be held in a #guint64. */ /** * G_GUINT64_FORMAT: * * This is the platform dependent conversion specifier for scanning * and printing values of type #guint64. See also #G_GINT16_FORMAT. * * * Some platforms do not support scanning and printing 64 bit integers, * even though the types are supported. On such platforms #G_GUINT64_FORMAT * is not defined. Note that scanf() may not support 64 bit integers, even * if #G_GINT64_FORMAT is defined. Due to its weak error handling, scanf() * is not recommended for parsing anyway; consider using g_ascii_strtoull() * instead. * */ /** * G_GINT64_CONSTANT: * @val: a literal integer value, e.g. 0x1d636b02300a7aa7 * * This macro is used to insert 64-bit integer literals * into the source code. */ /** * G_GUINT64_CONSTANT: * @val: a literal integer value, e.g. 0x1d636b02300a7aa7U * * This macro is used to insert 64-bit unsigned integer * literals into the source code. * * Since: 2.10 */ /** * gfloat: * * Corresponds to the standard C float type. * Values of this type can range from -#G_MAXFLOAT to #G_MAXFLOAT. */ /** * G_MINFLOAT: * * The minimum positive value which can be held in a #gfloat. * * If you are interested in the smallest value which can be held * in a #gfloat, use -G_MAXFLOAT. */ /** * G_MAXFLOAT: * * The maximum value which can be held in a #gfloat. */ /** * gdouble: * * Corresponds to the standard C double type. * Values of this type can range from -#G_MAXDOUBLE to #G_MAXDOUBLE. */ /** * G_MINDOUBLE: * * The minimum positive value which can be held in a #gdouble. * * If you are interested in the smallest value which can be held * in a #gdouble, use -G_MAXDOUBLE. */ /** * G_MAXDOUBLE: * * The maximum value which can be held in a #gdouble. */ /** * gsize: * * An unsigned integer type of the result of the sizeof operator, * corresponding to the size_t type defined in C99. * This type is wide enough to hold the numeric value of a pointer, * so it is usually 32bit wide on a 32bit platform and 64bit wide * on a 64bit platform. Values of this type can range from 0 to * #G_MAXSIZE. * * To print or scan values of this type, use * %G_GSIZE_MODIFIER and/or %G_GSIZE_FORMAT. */ /** * G_MAXSIZE: * * The maximum value which can be held in a #gsize. * * Since: 2.4 */ /** * G_GSIZE_MODIFIER: * * The platform dependent length modifier for conversion specifiers * for scanning and printing values of type #gsize or #gssize. It * is a string literal. * * Since: 2.6 */ /** * G_GSIZE_FORMAT: * * This is the platform dependent conversion specifier for scanning * and printing values of type #gsize. See also #G_GINT16_FORMAT. * * Since: 2.6 */ /** * gssize: * * A signed variant of #gsize, corresponding to the * ssize_t defined on most platforms. * Values of this type can range from #G_MINSSIZE * to #G_MAXSSIZE. * * To print or scan values of this type, use * %G_GSIZE_MODIFIER and/or %G_GSSIZE_FORMAT. */ /** * G_MINSSIZE: * * The minimum value which can be held in a #gssize. * * Since: 2.14 */ /** * G_MAXSSIZE: * * The maximum value which can be held in a #gssize. * * Since: 2.14 */ /** * G_GSSIZE_FORMAT: * * This is the platform dependent conversion specifier for scanning * and printing values of type #gssize. See also #G_GINT16_FORMAT. * * Since: 2.6 */ /** * goffset: * * A signed integer type that is used for file offsets, * corresponding to the C99 type off64_t. * Values of this type can range from #G_MINOFFSET to * #G_MAXOFFSET. * * To print or scan values of this type, use * %G_GOFFSET_MODIFIER and/or %G_GOFFSET_FORMAT. * * Since: 2.14 */ /** * G_MINOFFSET: * * The minimum value which can be held in a #goffset. */ /** * G_MAXOFFSET: * * The maximum value which can be held in a #goffset. */ /** * G_GOFFSET_MODIFIER: * * The platform dependent length modifier for conversion specifiers * for scanning and printing values of type #goffset. It is a string * literal. See also #G_GINT64_MODIFIER. * * Since: 2.20 */ /** * G_GOFFSET_FORMAT: * * This is the platform dependent conversion specifier for scanning * and printing values of type #goffset. See also #G_GINT64_FORMAT. * * Since: 2.20 */ /** * G_GOFFSET_CONSTANT: * @val: a literal integer value, e.g. 0x1d636b02300a7aa7 * * This macro is used to insert #goffset 64-bit integer literals * into the source code. * * See also #G_GINT64_CONSTANT. * * Since: 2.20 */ /** * gintptr: * * Corresponds to the C99 type intptr_t, * a signed integer type that can hold any pointer. * * To print or scan values of this type, use * %G_GINTPTR_MODIFIER and/or %G_GINTPTR_FORMAT. * * Since: 2.18 */ /** * G_GINTPTR_MODIFIER: * * The platform dependent length modifier for conversion specifiers * for scanning and printing values of type #gintptr or #guintptr. * It is a string literal. * * Since: 2.22 */ /** * G_GINTPTR_FORMAT: * * This is the platform dependent conversion specifier for scanning * and printing values of type #gintptr. * * Since: 2.22 */ /** * guintptr: * * Corresponds to the C99 type uintptr_t, * an unsigned integer type that can hold any pointer. * * To print or scan values of this type, use * %G_GINTPTR_MODIFIER and/or %G_GUINTPTR_FORMAT. * * Since: 2.18 */ /** * G_GUINTPTR_FORMAT: * * This is the platform dependent conversion specifier * for scanning and printing values of type #guintptr. * * Since: 2.22 */ /* Type conversion {{{1 */ /** * SECTION:type_conversion * @title: Type Conversion Macros * @short_description: portably storing integers in pointer variables * * Many times GLib, GTK+, and other libraries allow you to pass "user * data" to a callback, in the form of a void pointer. From time to time * you want to pass an integer instead of a pointer. You could allocate * an integer, with something like: * |[ * int *ip = g_new (int, 1); * *ip = 42; * ]| * But this is inconvenient, and it's annoying to have to free the * memory at some later time. * * Pointers are always at least 32 bits in size (on all platforms GLib * intends to support). Thus you can store at least 32-bit integer values * in a pointer value. Naively, you might try this, but it's incorrect: * |[ * gpointer p; * int i; * p = (void*) 42; * i = (int) p; * ]| * Again, that example was not correct, don't copy it. * The problem is that on some systems you need to do this: * |[ * gpointer p; * int i; * p = (void*) (long) 42; * i = (int) (long) p; * ]| * The GLib macros GPOINTER_TO_INT(), GINT_TO_POINTER(), etc. take care * to do the right thing on the every platform. * * You may not store pointers in integers. This is not * portable in any way, shape or form. These macros only * allow storing integers in pointers, and only preserve 32 bits of the * integer; values outside the range of a 32-bit integer will be mangled. * */ /** * GINT_TO_POINTER: * @i: integer to stuff into a pointer * * Stuffs an integer into a pointer type. * * Remember, you may not store pointers in integers. This is not portable * in any way, shape or form. These macros only allow * storing integers in pointers, and only preserve 32 bits of the * integer; values outside the range of a 32-bit integer will be mangled. */ /** * GPOINTER_TO_INT: * @p: pointer containing an integer * * Extracts an integer from a pointer. The integer must have * been stored in the pointer with GINT_TO_POINTER(). * * Remember, you may not store pointers in integers. This is not portable * in any way, shape or form. These macros only allow * storing integers in pointers, and only preserve 32 bits of the * integer; values outside the range of a 32-bit integer will be mangled. */ /** * GUINT_TO_POINTER: * @u: unsigned integer to stuff into the pointer * * Stuffs an unsigned integer into a pointer type. */ /** * GPOINTER_TO_UINT: * @p: pointer to extract an unsigned integer from * * Extracts an unsigned integer from a pointer. The integer must have * been stored in the pointer with GUINT_TO_POINTER(). */ /** * GSIZE_TO_POINTER: * @s: #gsize to stuff into the pointer * * Stuffs a #gsize into a pointer type. */ /** * GPOINTER_TO_SIZE: * @p: pointer to extract a #gsize from * * Extracts a #gsize from a pointer. The #gsize must have * been stored in the pointer with GSIZE_TO_POINTER(). */ /* Byte order {{{1 */ /** * SECTION:byte_order * @title: Byte Order Macros * @short_description: a portable way to convert between different byte orders * * These macros provide a portable way to determine the host byte order * and to convert values between different byte orders. * * The byte order is the order in which bytes are stored to create larger * data types such as the #gint and #glong values. * The host byte order is the byte order used on the current machine. * * Some processors store the most significant bytes (i.e. the bytes that * hold the largest part of the value) first. These are known as big-endian * processors. Other processors (notably the x86 family) store the most * significant byte last. These are known as little-endian processors. * * Finally, to complicate matters, some other processors store the bytes in * a rather curious order known as PDP-endian. For a 4-byte word, the 3rd * most significant byte is stored first, then the 4th, then the 1st and * finally the 2nd. * * Obviously there is a problem when these different processors communicate * with each other, for example over networks or by using binary file formats. * This is where these macros come in. They are typically used to convert * values into a byte order which has been agreed on for use when * communicating between different processors. The Internet uses what is * known as 'network byte order' as the standard byte order (which is in * fact the big-endian byte order). * * Note that the byte order conversion macros may evaluate their arguments * multiple times, thus you should not use them with arguments which have * side-effects. */ /** * G_BYTE_ORDER: * * The host byte order. * This can be either #G_LITTLE_ENDIAN or #G_BIG_ENDIAN (support for * #G_PDP_ENDIAN may be added in future.) */ /** * G_LITTLE_ENDIAN: * * Specifies one of the possible types of byte order. * See #G_BYTE_ORDER. */ /** * G_BIG_ENDIAN: * * Specifies one of the possible types of byte order. * See #G_BYTE_ORDER. */ /** * G_PDP_ENDIAN: * * Specifies one of the possible types of byte order * (currently unused). See #G_BYTE_ORDER. */ /** * g_htonl: * @val: a 32-bit integer value in host byte order * * Converts a 32-bit integer value from host to network byte order. * * Returns: @val converted to network byte order */ /** * g_htons: * @val: a 16-bit integer value in host byte order * * Converts a 16-bit integer value from host to network byte order. * * Returns: @val converted to network byte order */ /** * g_ntohl: * @val: a 32-bit integer value in network byte order * * Converts a 32-bit integer value from network to host byte order. * * Returns: @val converted to host byte order. */ /** * g_ntohs: * @val: a 16-bit integer value in network byte order * * Converts a 16-bit integer value from network to host byte order. * * Returns: @val converted to host byte order */ /** * GINT_FROM_BE: * @val: a #gint value in big-endian byte order * * Converts a #gint value from big-endian to host byte order. * * Returns: @val converted to host byte order */ /** * GINT_FROM_LE: * @val: a #gint value in little-endian byte order * * Converts a #gint value from little-endian to host byte order. * * Returns: @val converted to host byte order */ /** * GINT_TO_BE: * @val: a #gint value in host byte order * * Converts a #gint value from host byte order to big-endian. * * Returns: @val converted to big-endian byte order */ /** * GINT_TO_LE: * @val: a #gint value in host byte order * * Converts a #gint value from host byte order to little-endian. * * Returns: @val converted to little-endian byte order */ /** * GUINT_FROM_BE: * @val: a #guint value in big-endian byte order * * Converts a #guint value from big-endian to host byte order. * * Returns: @val converted to host byte order */ /** * GUINT_FROM_LE: * @val: a #guint value in little-endian byte order * * Converts a #guint value from little-endian to host byte order. * * Returns: @val converted to host byte order */ /** * GUINT_TO_BE: * @val: a #guint value in host byte order * * Converts a #guint value from host byte order to big-endian. * * Returns: @val converted to big-endian byte order */ /** * GUINT_TO_LE: * @val: a #guint value in host byte order * * Converts a #guint value from host byte order to little-endian. * * Returns: @val converted to little-endian byte order. */ /** * GLONG_FROM_BE: * @val: a #glong value in big-endian byte order * * Converts a #glong value from big-endian to the host byte order. * * Returns: @val converted to host byte order */ /** * GLONG_FROM_LE: * @val: a #glong value in little-endian byte order * * Converts a #glong value from little-endian to host byte order. * * Returns: @val converted to host byte order */ /** * GLONG_TO_BE: * @val: a #glong value in host byte order * * Converts a #glong value from host byte order to big-endian. * * Returns: @val converted to big-endian byte order */ /** * GLONG_TO_LE: * @val: a #glong value in host byte order * * Converts a #glong value from host byte order to little-endian. * * Returns: @val converted to little-endian */ /** * GULONG_FROM_BE: * @val: a #gulong value in big-endian byte order * * Converts a #gulong value from big-endian to host byte order. * * Returns: @val converted to host byte order */ /** * GULONG_FROM_LE: * @val: a #gulong value in little-endian byte order * * Converts a #gulong value from little-endian to host byte order. * * Returns: @val converted to host byte order */ /** * GULONG_TO_BE: * @val: a #gulong value in host byte order * * Converts a #gulong value from host byte order to big-endian. * * Returns: @val converted to big-endian */ /** * GULONG_TO_LE: * @val: a #gulong value in host byte order * * Converts a #gulong value from host byte order to little-endian. * * Returns: @val converted to little-endian */ /** * GSIZE_FROM_BE: * @val: a #gsize value in big-endian byte order * * Converts a #gsize value from big-endian to the host byte order. * * Returns: @val converted to host byte order */ /** * GSIZE_FROM_LE: * @val: a #gsize value in little-endian byte order * * Converts a #gsize value from little-endian to host byte order. * * Returns: @val converted to host byte order */ /** * GSIZE_TO_BE: * @val: a #gsize value in host byte order * * Converts a #gsize value from host byte order to big-endian. * * Returns: @val converted to big-endian byte order */ /** * GSIZE_TO_LE: * @val: a #gsize value in host byte order * * Converts a #gsize value from host byte order to little-endian. * * Returns: @val converted to little-endian */ /** * GSSIZE_FROM_BE: * @val: a #gssize value in big-endian byte order * * Converts a #gssize value from big-endian to host byte order. * * Returns: @val converted to host byte order */ /** * GSSIZE_FROM_LE: * @val: a #gssize value in little-endian byte order * * Converts a #gssize value from little-endian to host byte order. * * Returns: @val converted to host byte order */ /** * GSSIZE_TO_BE: * @val: a #gssize value in host byte order * * Converts a #gssize value from host byte order to big-endian. * * Returns: @val converted to big-endian */ /** * GSSIZE_TO_LE: * @val: a #gssize value in host byte order * * Converts a #gssize value from host byte order to little-endian. * * Returns: @val converted to little-endian */ /** * GINT16_FROM_BE: * @val: a #gint16 value in big-endian byte order * * Converts a #gint16 value from big-endian to host byte order. * * Returns: @val converted to host byte order */ /** * GINT16_FROM_LE: * @val: a #gint16 value in little-endian byte order * * Converts a #gint16 value from little-endian to host byte order. * * Returns: @val converted to host byte order */ /** * GINT16_TO_BE: * @val: a #gint16 value in host byte order * * Converts a #gint16 value from host byte order to big-endian. * * Returns: @val converted to big-endian */ /** * GINT16_TO_LE: * @val: a #gint16 value in host byte order * * Converts a #gint16 value from host byte order to little-endian. * * Returns: @val converted to little-endian */ /** * GUINT16_FROM_BE: * @val: a #guint16 value in big-endian byte order * * Converts a #guint16 value from big-endian to host byte order. * * Returns: @val converted to host byte order */ /** * GUINT16_FROM_LE: * @val: a #guint16 value in little-endian byte order * * Converts a #guint16 value from little-endian to host byte order. * * Returns: @val converted to host byte order */ /** * GUINT16_TO_BE: * @val: a #guint16 value in host byte order * * Converts a #guint16 value from host byte order to big-endian. * * Returns: @val converted to big-endian */ /** * GUINT16_TO_LE: * @val: a #guint16 value in host byte order * * Converts a #guint16 value from host byte order to little-endian. * * Returns: @val converted to little-endian */ /** * GINT32_FROM_BE: * @val: a #gint32 value in big-endian byte order * * Converts a #gint32 value from big-endian to host byte order. * * Returns: @val converted to host byte order */ /** * GINT32_FROM_LE: * @val: a #gint32 value in little-endian byte order * * Converts a #gint32 value from little-endian to host byte order. * * Returns: @val converted to host byte order */ /** * GINT32_TO_BE: * @val: a #gint32 value in host byte order * * Converts a #gint32 value from host byte order to big-endian. * * Returns: @val converted to big-endian */ /** * GINT32_TO_LE: * @val: a #gint32 value in host byte order * * Converts a #gint32 value from host byte order to little-endian. * * Returns: @val converted to little-endian */ /** * GUINT32_FROM_BE: * @val: a #guint32 value in big-endian byte order * * Converts a #guint32 value from big-endian to host byte order. * * Returns: @val converted to host byte order */ /** * GUINT32_FROM_LE: * @val: a #guint32 value in little-endian byte order * * Converts a #guint32 value from little-endian to host byte order. * * Returns: @val converted to host byte order */ /** * GUINT32_TO_BE: * @val: a #guint32 value in host byte order * * Converts a #guint32 value from host byte order to big-endian. * * Returns: @val converted to big-endian */ /** * GUINT32_TO_LE: * @val: a #guint32 value in host byte order * * Converts a #guint32 value from host byte order to little-endian. * * Returns: @val converted to little-endian */ /** * GINT64_FROM_BE: * @val: a #gint64 value in big-endian byte order * * Converts a #gint64 value from big-endian to host byte order. * * Returns: @val converted to host byte order */ /** * GINT64_FROM_LE: * @val: a #gint64 value in little-endian byte order * * Converts a #gint64 value from little-endian to host byte order. * * Returns: @val converted to host byte order */ /** * GINT64_TO_BE: * @val: a #gint64 value in host byte order * * Converts a #gint64 value from host byte order to big-endian. * * Returns: @val converted to big-endian */ /** * GINT64_TO_LE: * @val: a #gint64 value in host byte order * * Converts a #gint64 value from host byte order to little-endian. * * Returns: @val converted to little-endian */ /** * GUINT64_FROM_BE: * @val: a #guint64 value in big-endian byte order * * Converts a #guint64 value from big-endian to host byte order. * * Returns: @val converted to host byte order */ /** * GUINT64_FROM_LE: * @val: a #guint64 value in little-endian byte order * * Converts a #guint64 value from little-endian to host byte order. * * Returns: @val converted to host byte order */ /** * GUINT64_TO_BE: * @val: a #guint64 value in host byte order * * Converts a #guint64 value from host byte order to big-endian. * * Returns: @val converted to big-endian */ /** * GUINT64_TO_LE: * @val: a #guint64 value in host byte order * * Converts a #guint64 value from host byte order to little-endian. * * Returns: @val converted to little-endian */ /** * GUINT16_SWAP_BE_PDP: * @val: a #guint16 value in big-endian or pdp-endian byte order * * Converts a #guint16 value between big-endian and pdp-endian byte order. * The conversion is symmetric so it can be used both ways. * * Returns: @val converted to the opposite byte order */ /** * GUINT16_SWAP_LE_BE: * @val: a #guint16 value in little-endian or big-endian byte order * * Converts a #guint16 value between little-endian and big-endian byte order. * The conversion is symmetric so it can be used both ways. * * Returns: @val converted to the opposite byte order */ /** * GUINT16_SWAP_LE_PDP: * @val: a #guint16 value in little-endian or pdp-endian byte order * * Converts a #guint16 value between little-endian and pdp-endian byte order. * The conversion is symmetric so it can be used both ways. * * Returns: @val converted to the opposite byte order */ /** * GUINT32_SWAP_BE_PDP: * @val: a #guint32 value in big-endian or pdp-endian byte order * * Converts a #guint32 value between big-endian and pdp-endian byte order. * The conversion is symmetric so it can be used both ways. * * Returns: @val converted to the opposite byte order */ /** * GUINT32_SWAP_LE_BE: * @val: a #guint32 value in little-endian or big-endian byte order * * Converts a #guint32 value between little-endian and big-endian byte order. * The conversion is symmetric so it can be used both ways. * * Returns: @val converted to the opposite byte order */ /** * GUINT32_SWAP_LE_PDP: * @val: a #guint32 value in little-endian or pdp-endian byte order * * Converts a #guint32 value between little-endian and pdp-endian byte order. * The conversion is symmetric so it can be used both ways. * * Returns: @val converted to the opposite byte order */ /** * GUINT64_SWAP_LE_BE: * @val: a #guint64 value in little-endian or big-endian byte order * * Converts a #guint64 value between little-endian and big-endian byte order. * The conversion is symmetric so it can be used both ways. * * Returns: @val converted to the opposite byte order */ /* Numerical Definitions {{{1 */ /** * SECTION:numerical * @title: Numerical Definitions * @short_description: mathematical constants, and floating point decomposition * * GLib offers mathematical constants such as #G_PI for the value of pi; * many platforms have these in the C library, but some don't, the GLib * versions always exist. * * The #GFloatIEEE754 and #GDoubleIEEE754 unions are used to access the * sign, mantissa and exponent of IEEE floats and doubles. These unions are * defined as appropriate for a given platform. IEEE floats and doubles are * supported (used for storage) by at least Intel, PPC and Sparc. See * IEEE 754-2008 * for more information about IEEE number formats. */ /** * G_IEEE754_FLOAT_BIAS: * * The bias by which exponents in single-precision floats are offset. */ /** * G_IEEE754_DOUBLE_BIAS: * * The bias by which exponents in double-precision floats are offset. */ /** * GFloatIEEE754: * @v_float: the double value * * The #GFloatIEEE754 and #GDoubleIEEE754 unions are used to access the sign, * mantissa and exponent of IEEE floats and doubles. These unions are defined * as appropriate for a given platform. IEEE floats and doubles are supported * (used for storage) by at least Intel, PPC and Sparc. */ /** * GDoubleIEEE754: * @v_double: the double value * * The #GFloatIEEE754 and #GDoubleIEEE754 unions are used to access the sign, * mantissa and exponent of IEEE floats and doubles. These unions are defined * as appropriate for a given platform. IEEE floats and doubles are supported * (used for storage) by at least Intel, PPC and Sparc. */ /** * G_E: * * The base of natural logarithms. */ /** * G_LN2: * * The natural logarithm of 2. */ /** * G_LN10: * * The natural logarithm of 10. */ /** * G_PI: * * The value of pi (ratio of circle's circumference to its diameter). */ /** * G_PI_2: * * Pi divided by 2. */ /** * G_PI_4: * * Pi divided by 4. */ /** * G_SQRT2: * * The square root of two. */ /** * G_LOG_2_BASE_10: * * Multiplying the base 2 exponent by this number yields the base 10 exponent. */ /* Macros {{{1 */ /** * SECTION:macros * @title: Standard Macros * @short_description: commonly-used macros * * These macros provide a few commonly-used features. */ /** * G_OS_WIN32: * * This macro is defined only on Windows. So you can bracket * Windows-specific code in "#ifdef G_OS_WIN32". */ /** * G_OS_BEOS: * * This macro is defined only on BeOS. So you can bracket * BeOS-specific code in "#ifdef G_OS_BEOS". */ /** * G_OS_UNIX: * * This macro is defined only on UNIX. So you can bracket * UNIX-specific code in "#ifdef G_OS_UNIX". */ /** * G_DIR_SEPARATOR: * * The directory separator character. * This is '/' on UNIX machines and '\' under Windows. */ /** * G_DIR_SEPARATOR_S: * * The directory separator as a string. * This is "/" on UNIX machines and "\" under Windows. */ /** * G_IS_DIR_SEPARATOR: * @c: a character * * Checks whether a character is a directory * separator. It returns %TRUE for '/' on UNIX * machines and for '\' or '/' under Windows. * * Since: 2.6 */ /** * G_SEARCHPATH_SEPARATOR: * * The search path separator character. * This is ':' on UNIX machines and ';' under Windows. */ /** * G_SEARCHPATH_SEPARATOR_S: * * The search path separator as a string. * This is ":" on UNIX machines and ";" under Windows. */ /** * TRUE: * * Defines the %TRUE value for the #gboolean type. */ /** * FALSE: * * Defines the %FALSE value for the #gboolean type. */ /** * NULL: * * Defines the standard %NULL pointer. */ /** * MIN: * @a: a numeric value * @b: a numeric value * * Calculates the minimum of @a and @b. * * Returns: the minimum of @a and @b. */ /** * MAX: * @a: a numeric value * @b: a numeric value * * Calculates the maximum of @a and @b. * * Returns: the maximum of @a and @b. */ /** * ABS: * @a: a numeric value * * Calculates the absolute value of @a. * The absolute value is simply the number with any negative sign taken away. * * For example, * - ABS(-10) is 10. * - ABS(10) is also 10. * * Returns: the absolute value of @a. */ /** * CLAMP: * @x: the value to clamp * @low: the minimum value allowed * @high: the maximum value allowed * * Ensures that @x is between the limits set by @low and @high. If @low is * greater than @high the result is undefined. * * For example, * - CLAMP(5, 10, 15) is 10. * - CLAMP(15, 5, 10) is 10. * - CLAMP(20, 15, 25) is 20. * * Returns: the value of @x clamped to the range between @low and @high */ /** * G_STRUCT_MEMBER: * @member_type: the type of the struct field * @struct_p: a pointer to a struct * @struct_offset: the offset of the field from the start of the struct, * in bytes * * Returns a member of a structure at a given offset, using the given type. * * Returns: the struct member */ /** * G_STRUCT_MEMBER_P: * @struct_p: a pointer to a struct * @struct_offset: the offset from the start of the struct, in bytes * * Returns an untyped pointer to a given offset of a struct. * * Returns: an untyped pointer to @struct_p plus @struct_offset bytes */ /** * G_STRUCT_OFFSET: * @struct_type: a structure type, e.g. GtkWidget * @member: a field in the structure, e.g. window * * Returns the offset, in bytes, of a member of a struct. * * Returns: the offset of @member from the start of @struct_type */ /** * G_CONST_RETURN: * * If G_DISABLE_CONST_RETURNS is defined, this macro expands * to nothing. By default, the macro expands to const. * The macro should be used in place of const for * functions that return a value that should not be modified. The * purpose of this macro is to allow us to turn on const * for returned constant strings by default, while allowing programmers * who find that annoying to turn it off. This macro should only be used * for return values and for out parameters, it doesn't * make sense for in parameters. * * Deprecated: 2.30: API providers should replace all existing uses with * const and API consumers should adjust their code * accordingly */ /** * G_N_ELEMENTS: * @arr: the array * * Determines the number of elements in an array. The array must be * declared so the compiler knows its size at compile-time; this * macro will not work on an array allocated on the heap, only static * arrays or arrays on the stack. */ /* Miscellaneous Macros {{{1 */ /** * SECTION:macros_misc * @title: Miscellaneous Macros * @short_description: specialized macros which are not used often * * These macros provide more specialized features which are not * needed so often by application programmers. */ /** * G_INLINE_FUNC: * * This macro is used to export function prototypes so they can be linked * with an external version when no inlining is performed. The file which * implements the functions should define G_IMPLEMENTS_INLINES * before including the headers which contain %G_INLINE_FUNC declarations. * Since inlining is very compiler-dependent using these macros correctly * is very difficult. Their use is strongly discouraged. * * This macro is often mistaken for a replacement for the inline keyword; * inline is already declared in a portable manner in the GLib headers * and can be used normally. */ /** * G_STMT_START: * * Used within multi-statement macros so that they can be used in places * where only one statement is expected by the compiler. */ /** * G_STMT_END: * * Used within multi-statement macros so that they can be used in places * where only one statement is expected by the compiler. */ /** * G_BEGIN_DECLS: * * Used (along with #G_END_DECLS) to bracket header files. If the * compiler in use is a C++ compiler, adds extern "C" * around the header. */ /** * G_END_DECLS: * * Used (along with #G_BEGIN_DECLS) to bracket header files. If the * compiler in use is a C++ compiler, adds extern "C" * around the header. */ /** * G_VA_COPY: * @ap1: the va_list variable to place a copy of @ap2 in * @ap2: a va_list * * Portable way to copy va_list variables. * * In order to use this function, you must include * string.h yourself, because this macro may * use memmove() and GLib does not include string.h * for you. */ /** * G_STRINGIFY: * @macro_or_string: a macro or a string * * Accepts a macro or a string and converts it into a string after * preprocessor argument expansion. For example, the following code: * * |[ * #define AGE 27 * const gchar *greeting = G_STRINGIFY (AGE) " today!"; * ]| * * is transformed by the preprocessor into (code equivalent to): * * |[ * const gchar *greeting = "27 today!"; * ]| */ /** * G_PASTE: * @identifier1: an identifier * @identifier2: an identifier * * Yields a new preprocessor pasted identifier * identifier1identifier2 from its expanded * arguments @identifier1 and @identifier2. For example, * the following code: * |[ * #define GET(traveller,method) G_PASTE(traveller_get_, method) (traveller) * const gchar *name = GET (traveller, name); * const gchar *quest = GET (traveller, quest); * GdkColor *favourite = GET (traveller, favourite_colour); * ]| * * is transformed by the preprocessor into: * |[ * const gchar *name = traveller_get_name (traveller); * const gchar *quest = traveller_get_quest (traveller); * GdkColor *favourite = traveller_get_favourite_colour (traveller); * ]| * * Since: 2.20 */ /** * G_STATIC_ASSERT: * @expr: a constant expression * * The G_STATIC_ASSERT macro lets the programmer check * a condition at compile time, the condition needs to * be compile time computable. The macro can be used in * any place where a typedef is valid. * * * A typedef is generally allowed in * exactly the same places that a variable declaration is * allowed. For this reason, you should not use * G_STATIC_ASSERT in the middle of * blocks of code. * * * The macro should only be used once per source code line. * * Since: 2.20 */ /** * G_STATIC_ASSERT_EXPR: * @expr: a constant expression * * The G_STATIC_ASSERT_EXPR macro lets the programmer check * a condition at compile time. The condition needs to be * compile time computable. * * Unlike G_STATIC_ASSERT, this macro * evaluates to an expression and, as such, can be used in * the middle of other expressions. Its value should be * ignored. This can be accomplished by placing it as * the first argument of a comma expression. * * |[ * #define ADD_ONE_TO_INT(x) \ * (G_STATIC_ASSERT_EXPR(sizeof (x) == sizeof (int)), ((x) + 1)) * ]| * * Since: 2.30 */ /** * G_GNUC_EXTENSION: * * Expands to __extension__ when gcc * is used as the compiler. This simply tells gcc not * to warn about the following non-standard code when compiling with the * option. */ /** * G_GNUC_CONST: * * Expands to the GNU C const function attribute if * the compiler is gcc. 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. * * Place the attribute after the declaration, just before the semicolon. * * See the GNU C documentation for more details. * * * A function that has pointer arguments and examines the data pointed to * must not be declared const. Likewise, a function * that calls a non-const function usually must not be const. It doesn't * make sense for a const function to return void. * */ /** * G_GNUC_PURE: * * Expands to the GNU C pure function attribute if the * compiler is gcc. 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. * * Place the attribute after the declaration, just before the semicolon. * * See the GNU C documentation for more details. */ /** * G_GNUC_MALLOC: * * Expands to the GNU C malloc function attribute if the * compiler is gcc. Declaring a function as malloc enables * better optimization of the function. A function can have the malloc * attribute if it returns a pointer which is guaranteed to not alias with * any other pointer when the function returns (in practice, this means newly * allocated memory). * * Place the attribute after the declaration, just before the semicolon. * * See the GNU C documentation for more details. * * Since: 2.6 */ /** * G_GNUC_ALLOC_SIZE: * @x: the index of the argument specifying the allocation size * * Expands to the GNU C alloc_size function attribute * if the compiler is a new enough gcc. This attribute * tells the compiler that the function returns a pointer to memory of a * size that is specified by the @xth function parameter. * * Place the attribute after the function declaration, just before the * semicolon. * * See the GNU C documentation for more details. * * Since: 2.18 */ /** * G_GNUC_ALLOC_SIZE2: * @x: the index of the argument specifying one factor of the allocation size * @y: the index of the argument specifying the second factor of the allocation size * * Expands to the GNU C alloc_size function attribute * if the compiler is a new enough gcc. 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. * * Place the attribute after the function declaration, just before the * semicolon. * * See the GNU C documentation for more details. * * Since: 2.18 */ /** * G_GNUC_DEPRECATED: * * Expands to the GNU C deprecated attribute if the * compiler is gcc. It can be used to mark typedefs, * variables and functions as deprecated. When called with the * option, the compiler will * generate warnings when deprecated interfaces are used. * * Place the attribute after the declaration, just before the semicolon. * * See the GNU C documentation for more details. * * Since: 2.2 */ /** * G_GNUC_DEPRECATED_FOR: * @f: the intended replacement for the deprecated symbol, * such as the name of a function * * Like %G_GNUC_DEPRECATED, but names the intended replacement for the * deprecated symbol if the version of gcc in use is * new enough to support custom deprecation messages. * * 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 * in the warning, but it's better than showing the macro expansion.) * * Since: 2.26 */ /** * G_GNUC_BEGIN_IGNORE_DEPRECATIONS: * * Tells gcc (if it is a new enough version) to * temporarily stop emitting warnings when functions marked with * %G_GNUC_DEPRECATED or %G_GNUC_DEPRECATED_FOR are called. This is * useful for when you have one deprecated function calling another * one, or when you still have regression tests for deprecated * functions. * * Use %G_GNUC_END_IGNORE_DEPRECATIONS to begin warning again. (If you * are not compiling with -Wdeprecated-declarations * then neither macro has any effect.) * * This macro can be used either inside or outside of a function body, * but must appear on a line by itself. * * Since: 2.32 */ /** * G_GNUC_END_IGNORE_DEPRECATIONS: * * Undoes the effect of %G_GNUC_BEGIN_IGNORE_DEPRECATIONS, telling * gcc to begin outputting warnings again * (assuming those warnings had been enabled to begin with). * * This macro can be used either inside or outside of a function body, * but must appear on a line by itself. * * Since: 2.32 */ /** * G_DEPRECATED: * * This macro is similar to %G_GNUC_DEPRECATED, and can be used to mark * functions declarations as deprecated. Unlike %G_GNUC_DEPRECATED, it is * meant to be portable across different compilers and must be placed * before the function declaration. * * Since: 2.32 */ /** * 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 * meant to be portable across different compilers and must be placed * before the function declaration. * * Since: 2.32 */ /** * 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 * that has been annotated with this macros will produce a compiler warning. * * Since: 2.32 */ /** * GLIB_DISABLE_DEPRECATION_WARNINGS: * * A macro that should be defined before including the glib.h header. * If it is defined, no compiler warnings will be produced for uses * of deprecated GLib APIs. */ /** * G_GNUC_NORETURN: * * Expands to the GNU C noreturn function attribute * if the compiler is gcc. It is used for declaring * functions which never return. It enables optimization of the function, * and avoids possible compiler warnings. * * Place the attribute after the declaration, just before the semicolon. * * See the GNU C documentation for more details. */ /** * G_GNUC_UNUSED: * * Expands to the GNU C unused function attribute if * the compiler is gcc. It is used for declaring * 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. */ /** * G_GNUC_PRINTF: * @format_idx: the index of the argument corresponding to the * format string (The arguments are numbered from 1) * @arg_idx: the index of the first of the format arguments * * Expands to the GNU C format function attribute * if the compiler is gcc. 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. * * Place the attribute after the function declaration, just before the * semicolon. * * See the GNU C documentation for more details. * * |[ * gint g_snprintf (gchar *string, * gulong n, * gchar const *format, * ...) G_GNUC_PRINTF (3, 4); * ]| */ /** * G_GNUC_SCANF: * @format_idx: the index of the argument corresponding to * the format string (The arguments are numbered from 1) * @arg_idx: the index of the first of the format arguments * * Expands to the GNU C format function attribute * if the compiler is gcc. This is used for declaring * functions which take a variable number of arguments, with the same * syntax as scanf(). It allows the compiler to type-check the arguments * passed to the function. See the GNU C documentation for details. */ /** * G_GNUC_FORMAT: * @arg_idx: the index of the argument * * Expands to the GNU C format_arg function attribute * if the compiler is gcc. This function attribute * specifies that a function takes a format string for a printf(), * scanf(), strftime() or strfmon() style function and modifies it, * 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). * * 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); * ]| */ /** * G_GNUC_NULL_TERMINATED: * * Expands to the GNU C sentinel function attribute * if the compiler is gcc, 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. * * Place the attribute after the declaration, just before the semicolon. * * See the GNU C documentation for more details. * * Since: 2.8 */ /** * G_GNUC_WARN_UNUSED_RESULT: * * Expands to the GNU C warn_unused_result function * attribute if the compiler is gcc, or "" if it isn't. * This function attribute makes the compiler emit a warning if the result * 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 */ /** * G_GNUC_FUNCTION: * * Expands to "" on all modern compilers, and to * __FUNCTION__ on gcc version 2.x. * Don't use it. * * Deprecated: 2.16: Use #G_STRFUNC instead */ /** * G_GNUC_PRETTY_FUNCTION: * * Expands to "" on all modern compilers, and to * __PRETTY_FUNCTION__ on gcc * version 2.x. Don't use it. * * Deprecated: 2.16: Use #G_STRFUNC instead */ /** * G_GNUC_NO_INSTRUMENT: * * Expands to the GNU C no_instrument_function function * attribute if the compiler is gcc. Functions with this * attribute will not be instrumented for profiling, when the compiler is * called with the option. * * Place the attribute after the declaration, just before the semicolon. * * See the GNU C documentation for more details. */ /** * G_GNUC_INTERNAL: * * This attribute can be used for marking library functions as being used * internally to the library only, which may allow the compiler to handle * function calls more efficiently. Note that static functions do not need * to be marked as internal in this way. See the GNU C documentation for * details. * * When using a compiler that supports the GNU C hidden visibility attribute, * this macro expands to __attribute__((visibility("hidden"))). * When using the Sun Studio compiler, it expands to __hidden. * * Note that for portability, the attribute should be placed before the * function declaration. While GCC allows the macro after the declaration, * Sun Studio does not. * * |[ * G_GNUC_INTERNAL * void _g_log_fallback_handler (const gchar *log_domain, * GLogLevelFlags log_level, * const gchar *message, * gpointer unused_data); * ]| * * Since: 2.6 */ /** * G_GNUC_MAY_ALIAS: * * Expands to the GNU C may_alias type attribute * if the compiler is gcc. Types with this attribute * will not be subjected to type-based alias analysis, but are assumed * to alias with any other type, just like char. * See the GNU C documentation for details. * * Since: 2.14 */ /** * G_LIKELY: * @expr: the expression * * Hints the compiler that the expression is likely to evaluate to * a true value. The compiler may use this information for optimizations. * * |[ * if (G_LIKELY (random () != 1)) * g_print ("not one"); * ]| * * Returns: the value of @expr * * Since: 2.2 */ /** * G_UNLIKELY: * @expr: the expression * * Hints the compiler that the expression is unlikely to evaluate to * a true value. The compiler may use this information for optimizations. * * |[ * if (G_UNLIKELY (random () == 1)) * g_print ("a random one"); * ]| * * Returns: the value of @expr * * Since: 2.2 */ /** * G_STRLOC: * * Expands to a string identifying the current code position. */ /** * G_STRFUNC: * * Expands to a string identifying the current function. * * Since: 2.4 */ /* Windows Compatibility Functions {{{1 */ /** * SECTION:windows * @title: Windows Compatibility Functions * @short_description: UNIX emulation on Windows * * These functions provide some level of UNIX emulation on the * Windows platform. If your application really needs the POSIX * APIs, we suggest you try the Cygwin project. */ /** * MAXPATHLEN: * * Provided for UNIX emulation on Windows; equivalent to UNIX * macro %MAXPATHLEN, which is the maximum length of a filename * (including full path). */ /** * G_WIN32_DLLMAIN_FOR_DLL_NAME: * @static: empty or "static" * @dll_name: the name of the (pointer to the) char array where * the DLL name will be stored. If this is used, you must also * include windows.h. If you need a more * complex DLL entry point function, you cannot use this * * On Windows, this macro defines a DllMain() function that stores * the actual DLL name that the code being compiled will be included in. * * On non-Windows platforms, expands to nothing. */ /** * G_WIN32_HAVE_WIDECHAR_API: * * On Windows, this macro defines an expression which evaluates to * %TRUE if the code is running on a version of Windows where the wide * character versions of the Win32 API functions, and the wide character * versions of the C library functions work. (They are always present in * the DLLs, but don't work on Windows 9x and Me.) * * On non-Windows platforms, it is not defined. * * Since: 2.6 */ /** * G_WIN32_IS_NT_BASED: * * On Windows, this macro defines an expression which evaluates to * %TRUE if the code is running on an NT-based Windows operating system. * * On non-Windows platforms, it is not defined. * * Since: 2.6 */ /* Epilogue {{{1 */ /* vim: set foldmethod=marker: */ pkg-config-0.29.1/glib/glib/gconstructor.h0000664000175000017500000000547312275467762015344 00000000000000/* If G_HAS_CONSTRUCTORS is true then the compiler support *both* constructors and destructors, in a sane way, including e.g. on library unload. If not you're on your own. Some compilers need #pragma to handle this, which does not work with macros, so the way you need to use this is (for constructors): #ifdef G_DEFINE_CONSTRUCTOR_NEEDS_PRAGMA #pragma G_DEFINE_CONSTRUCTOR_PRAGMA_ARGS(my_constructor) #endif G_DEFINE_CONSTRUCTOR(my_constructor) static void my_constructor(void) { ... } */ #if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7) #define G_HAS_CONSTRUCTORS 1 #define G_DEFINE_CONSTRUCTOR(_func) static void __attribute__((constructor)) _func (void); #define G_DEFINE_DESTRUCTOR(_func) static void __attribute__((destructor)) _func (void); #elif defined (_MSC_VER) && (_MSC_VER >= 1500) /* Visual studio 2008 and later has _Pragma */ #define G_HAS_CONSTRUCTORS 1 #define G_DEFINE_CONSTRUCTOR(_func) \ static void _func(void); \ static int _func ## _wrapper(void) { _func(); return 0; } \ __pragma(section(".CRT$XCU",read)) \ __declspec(allocate(".CRT$XCU")) static int (* _array ## _func)(void) = _func ## _wrapper; #define G_DEFINE_DESTRUCTOR(_func) \ static void _func(void); \ static int _func ## _constructor(void) { atexit (_func); return 0; } \ __pragma(section(".CRT$XCU",read)) \ __declspec(allocate(".CRT$XCU")) static int (* _array ## _func)(void) = _func ## _constructor; #elif defined (_MSC_VER) #define G_HAS_CONSTRUCTORS 1 /* Pre Visual studio 2008 must use #pragma section */ #define G_DEFINE_CONSTRUCTOR_NEEDS_PRAGMA 1 #define G_DEFINE_DESTRUCTOR_NEEDS_PRAGMA 1 #define G_DEFINE_CONSTRUCTOR_PRAGMA_ARGS(_func) \ section(".CRT$XCU",read) #define G_DEFINE_CONSTRUCTOR(_func) \ static void _func(void); \ static int _func ## _wrapper(void) { _func(); return 0; } \ __declspec(allocate(".CRT$XCU")) static int (*p)(void) = _func ## _wrapper; #define G_DEFINE_DESTRUCTOR_PRAGMA_ARGS(_func) \ section(".CRT$XCU",read) #define G_DEFINE_DESTRUCTOR(_func) \ static void _func(void); \ static int _func ## _constructor(void) { atexit (_func); return 0; } \ __declspec(allocate(".CRT$XCU")) static int (* _array ## _func)(void) = _func ## _constructor; #elif defined(__SUNPRO_C) /* This is not tested, but i believe it should work, based on: * http://opensource.apple.com/source/OpenSSL098/OpenSSL098-35/src/fips/fips_premain.c */ #define G_HAS_CONSTRUCTORS 1 #define G_DEFINE_CONSTRUCTOR_NEEDS_PRAGMA 1 #define G_DEFINE_DESTRUCTOR_NEEDS_PRAGMA 1 #define G_DEFINE_CONSTRUCTOR_PRAGMA_ARGS(_func) \ init(_func) #define G_DEFINE_CONSTRUCTOR(_func) \ static void _func(void); #define G_DEFINE_DESTRUCTOR_PRAGMA_ARGS(_func) \ fini(_func) #define G_DEFINE_DESTRUCTOR(_func) \ static void _func(void); #else /* constructors not supported for this compiler */ #endif pkg-config-0.29.1/glib/glib/gstringchunk.c0000664000175000017500000002106112275467762015300 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the GLib Team and others 1997-2000. See the AUTHORS * file for a list of people on the GLib Team. See the ChangeLog * files for a list of changes. These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/. */ /* * MT safe */ #include "config.h" #include #include "gstringchunk.h" #include "ghash.h" #include "gslist.h" #include "gmessages.h" #include "gutils.h" /** * SECTION:string_chunks * @title: String Chunks * @short_description: efficient storage of groups of strings * * String chunks are used to store groups of strings. Memory is * allocated in blocks, and as strings are added to the #GStringChunk * they are copied into the next free position in a block. When a block * is full a new block is allocated. * * When storing a large number of strings, string chunks are more * efficient than using g_strdup() since fewer calls to malloc() are * needed, and less memory is wasted in memory allocation overheads. * * By adding strings with g_string_chunk_insert_const() it is also * possible to remove duplicates. * * To create a new #GStringChunk use g_string_chunk_new(). * * To add strings to a #GStringChunk use g_string_chunk_insert(). * * To add strings to a #GStringChunk, but without duplicating strings * which are already in the #GStringChunk, use * g_string_chunk_insert_const(). * * To free the entire #GStringChunk use g_string_chunk_free(). It is * not possible to free individual strings. */ /** * GStringChunk: * * An opaque data structure representing String Chunks. * It should only be accessed by using the following functions. */ struct _GStringChunk { GHashTable *const_table; GSList *storage_list; gsize storage_next; gsize this_size; gsize default_size; }; #define MY_MAXSIZE ((gsize)-1) static inline gsize nearest_power (gsize base, gsize num) { if (num > MY_MAXSIZE / 2) { return MY_MAXSIZE; } else { gsize n = base; while (n < num) n <<= 1; return n; } } /** * g_string_chunk_new: * @size: the default size of the blocks of memory which are * allocated to store the strings. If a particular string * is larger than this default size, a larger block of * memory will be allocated for it. * * Creates a new #GStringChunk. * * Returns: a new #GStringChunk */ GStringChunk * g_string_chunk_new (gsize size) { GStringChunk *new_chunk = g_new (GStringChunk, 1); gsize actual_size = 1; actual_size = nearest_power (1, size); new_chunk->const_table = NULL; new_chunk->storage_list = NULL; new_chunk->storage_next = actual_size; new_chunk->default_size = actual_size; new_chunk->this_size = actual_size; return new_chunk; } /** * g_string_chunk_free: * @chunk: a #GStringChunk * * Frees all memory allocated by the #GStringChunk. * After calling g_string_chunk_free() it is not safe to * access any of the strings which were contained within it. */ void g_string_chunk_free (GStringChunk *chunk) { GSList *tmp_list; g_return_if_fail (chunk != NULL); if (chunk->storage_list) { for (tmp_list = chunk->storage_list; tmp_list; tmp_list = tmp_list->next) g_free (tmp_list->data); g_slist_free (chunk->storage_list); } if (chunk->const_table) g_hash_table_destroy (chunk->const_table); g_free (chunk); } /** * g_string_chunk_clear: * @chunk: a #GStringChunk * * Frees all strings contained within the #GStringChunk. * After calling g_string_chunk_clear() it is not safe to * access any of the strings which were contained within it. * * Since: 2.14 */ void g_string_chunk_clear (GStringChunk *chunk) { GSList *tmp_list; g_return_if_fail (chunk != NULL); if (chunk->storage_list) { for (tmp_list = chunk->storage_list; tmp_list; tmp_list = tmp_list->next) g_free (tmp_list->data); g_slist_free (chunk->storage_list); chunk->storage_list = NULL; chunk->storage_next = chunk->default_size; chunk->this_size = chunk->default_size; } if (chunk->const_table) g_hash_table_remove_all (chunk->const_table); } /** * g_string_chunk_insert: * @chunk: a #GStringChunk * @string: the string to add * * Adds a copy of @string to the #GStringChunk. * It returns a pointer to the new copy of the string * in the #GStringChunk. The characters in the string * can be changed, if necessary, though you should not * change anything after the end of the string. * * Unlike g_string_chunk_insert_const(), this function * does not check for duplicates. Also strings added * with g_string_chunk_insert() will not be searched * by g_string_chunk_insert_const() when looking for * duplicates. * * Returns: a pointer to the copy of @string within * the #GStringChunk */ gchar* g_string_chunk_insert (GStringChunk *chunk, const gchar *string) { g_return_val_if_fail (chunk != NULL, NULL); return g_string_chunk_insert_len (chunk, string, -1); } /** * g_string_chunk_insert_const: * @chunk: a #GStringChunk * @string: the string to add * * Adds a copy of @string to the #GStringChunk, unless the same * string has already been added to the #GStringChunk with * g_string_chunk_insert_const(). * * This function is useful if you need to copy a large number * of strings but do not want to waste space storing duplicates. * But you must remember that there may be several pointers to * the same string, and so any changes made to the strings * should be done very carefully. * * Note that g_string_chunk_insert_const() will not return a * pointer to a string added with g_string_chunk_insert(), even * if they do match. * * Returns: a pointer to the new or existing copy of @string * within the #GStringChunk */ gchar* g_string_chunk_insert_const (GStringChunk *chunk, const gchar *string) { char* lookup; g_return_val_if_fail (chunk != NULL, NULL); if (!chunk->const_table) chunk->const_table = g_hash_table_new (g_str_hash, g_str_equal); lookup = (char*) g_hash_table_lookup (chunk->const_table, (gchar *)string); if (!lookup) { lookup = g_string_chunk_insert (chunk, string); g_hash_table_insert (chunk->const_table, lookup, lookup); } return lookup; } /** * g_string_chunk_insert_len: * @chunk: a #GStringChunk * @string: bytes to insert * @len: number of bytes of @string to insert, or -1 to insert a * nul-terminated string * * Adds a copy of the first @len bytes of @string to the #GStringChunk. * The copy is nul-terminated. * * Since this function does not stop at nul bytes, it is the caller's * responsibility to ensure that @string has at least @len addressable * bytes. * * The characters in the returned string can be changed, if necessary, * though you should not change anything after the end of the string. * * Return value: a pointer to the copy of @string within the #GStringChunk * * Since: 2.4 */ gchar* g_string_chunk_insert_len (GStringChunk *chunk, const gchar *string, gssize len) { gssize size; gchar* pos; g_return_val_if_fail (chunk != NULL, NULL); if (len < 0) size = strlen (string); else size = len; if ((chunk->storage_next + size + 1) > chunk->this_size) { gsize new_size = nearest_power (chunk->default_size, size + 1); chunk->storage_list = g_slist_prepend (chunk->storage_list, g_new (gchar, new_size)); chunk->this_size = new_size; chunk->storage_next = 0; } pos = ((gchar *) chunk->storage_list->data) + chunk->storage_next; *(pos + size) = '\0'; memcpy (pos, string, size); chunk->storage_next += size + 1; return pos; } pkg-config-0.29.1/glib/glib/ghostutils.c0000664000175000017500000004740112275467762015005 00000000000000/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ /* GLIB - Library of useful routines for C programming * Copyright (C) 2008 Red Hat, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #include "config.h" #include #include "ghostutils.h" #include "garray.h" #include "gmem.h" #include "gstring.h" #include "gstrfuncs.h" #include "glibintl.h" /** * SECTION:ghostutils * @short_description: Internet hostname utilities * * Functions for manipulating internet hostnames; in particular, for * converting between Unicode and ASCII-encoded forms of * Internationalized Domain Names (IDNs). * * The Internationalized Domain * Names for Applications (IDNA) standards allow for the use * of Unicode domain names in applications, while providing * backward-compatibility with the old ASCII-only DNS, by defining an * ASCII-Compatible Encoding of any given Unicode name, which can be * used with non-IDN-aware applications and protocols. (For example, * "Παν語.org" maps to "xn--4wa8awb4637h.org".) **/ #define IDNA_ACE_PREFIX "xn--" #define IDNA_ACE_PREFIX_LEN 4 /* Punycode constants, from RFC 3492. */ #define PUNYCODE_BASE 36 #define PUNYCODE_TMIN 1 #define PUNYCODE_TMAX 26 #define PUNYCODE_SKEW 38 #define PUNYCODE_DAMP 700 #define PUNYCODE_INITIAL_BIAS 72 #define PUNYCODE_INITIAL_N 0x80 #define PUNYCODE_IS_BASIC(cp) ((guint)(cp) < 0x80) /* Encode/decode a single base-36 digit */ static inline gchar encode_digit (guint dig) { if (dig < 26) return dig + 'a'; else return dig - 26 + '0'; } static inline guint decode_digit (gchar dig) { if (dig >= 'A' && dig <= 'Z') return dig - 'A'; else if (dig >= 'a' && dig <= 'z') return dig - 'a'; else if (dig >= '0' && dig <= '9') return dig - '0' + 26; else return G_MAXUINT; } /* Punycode bias adaptation algorithm, RFC 3492 section 6.1 */ static guint adapt (guint delta, guint numpoints, gboolean firsttime) { guint k; delta = firsttime ? delta / PUNYCODE_DAMP : delta / 2; delta += delta / numpoints; k = 0; while (delta > ((PUNYCODE_BASE - PUNYCODE_TMIN) * PUNYCODE_TMAX) / 2) { delta /= PUNYCODE_BASE - PUNYCODE_TMIN; k += PUNYCODE_BASE; } return k + ((PUNYCODE_BASE - PUNYCODE_TMIN + 1) * delta / (delta + PUNYCODE_SKEW)); } /* Punycode encoder, RFC 3492 section 6.3. The algorithm is * sufficiently bizarre that it's not really worth trying to explain * here. */ static gboolean punycode_encode (const gchar *input_utf8, gsize input_utf8_length, GString *output) { guint delta, handled_chars, num_basic_chars, bias, j, q, k, t, digit; gunichar n, m, *input; glong input_length; gboolean success = FALSE; /* Convert from UTF-8 to Unicode code points */ input = g_utf8_to_ucs4 (input_utf8, input_utf8_length, NULL, &input_length, NULL); if (!input) return FALSE; /* Copy basic chars */ for (j = num_basic_chars = 0; j < input_length; j++) { if (PUNYCODE_IS_BASIC (input[j])) { g_string_append_c (output, g_ascii_tolower (input[j])); num_basic_chars++; } } if (num_basic_chars) g_string_append_c (output, '-'); handled_chars = num_basic_chars; /* Encode non-basic chars */ delta = 0; bias = PUNYCODE_INITIAL_BIAS; n = PUNYCODE_INITIAL_N; while (handled_chars < input_length) { /* let m = the minimum {non-basic} code point >= n in the input */ for (m = G_MAXUINT, j = 0; j < input_length; j++) { if (input[j] >= n && input[j] < m) m = input[j]; } if (m - n > (G_MAXUINT - delta) / (handled_chars + 1)) goto fail; delta += (m - n) * (handled_chars + 1); n = m; for (j = 0; j < input_length; j++) { if (input[j] < n) { if (++delta == 0) goto fail; } else if (input[j] == n) { q = delta; for (k = PUNYCODE_BASE; ; k += PUNYCODE_BASE) { if (k <= bias) t = PUNYCODE_TMIN; else if (k >= bias + PUNYCODE_TMAX) t = PUNYCODE_TMAX; else t = k - bias; if (q < t) break; digit = t + (q - t) % (PUNYCODE_BASE - t); g_string_append_c (output, encode_digit (digit)); q = (q - t) / (PUNYCODE_BASE - t); } g_string_append_c (output, encode_digit (q)); bias = adapt (delta, handled_chars + 1, handled_chars == num_basic_chars); delta = 0; handled_chars++; } } delta++; n++; } success = TRUE; fail: g_free (input); return success; } /* From RFC 3454, Table B.1 */ #define idna_is_junk(ch) ((ch) == 0x00AD || (ch) == 0x1806 || (ch) == 0x200B || (ch) == 0x2060 || (ch) == 0xFEFF || (ch) == 0x034F || (ch) == 0x180B || (ch) == 0x180C || (ch) == 0x180D || (ch) == 0x200C || (ch) == 0x200D || ((ch) >= 0xFE00 && (ch) <= 0xFE0F)) /* Scan @str for "junk" and return a cleaned-up string if any junk * is found. Else return %NULL. */ static gchar * remove_junk (const gchar *str, gint len) { GString *cleaned = NULL; const gchar *p; gunichar ch; for (p = str; len == -1 ? *p : p < str + len; p = g_utf8_next_char (p)) { ch = g_utf8_get_char (p); if (idna_is_junk (ch)) { if (!cleaned) { cleaned = g_string_new (NULL); g_string_append_len (cleaned, str, p - str); } } else if (cleaned) g_string_append_unichar (cleaned, ch); } if (cleaned) return g_string_free (cleaned, FALSE); else return NULL; } static inline gboolean contains_uppercase_letters (const gchar *str, gint len) { const gchar *p; for (p = str; len == -1 ? *p : p < str + len; p = g_utf8_next_char (p)) { if (g_unichar_isupper (g_utf8_get_char (p))) return TRUE; } return FALSE; } static inline gboolean contains_non_ascii (const gchar *str, gint len) { const gchar *p; for (p = str; len == -1 ? *p : p < str + len; p++) { if ((guchar)*p > 0x80) return TRUE; } return FALSE; } /* RFC 3454, Appendix C. ish. */ static inline gboolean idna_is_prohibited (gunichar ch) { switch (g_unichar_type (ch)) { case G_UNICODE_CONTROL: case G_UNICODE_FORMAT: case G_UNICODE_UNASSIGNED: case G_UNICODE_PRIVATE_USE: case G_UNICODE_SURROGATE: case G_UNICODE_LINE_SEPARATOR: case G_UNICODE_PARAGRAPH_SEPARATOR: case G_UNICODE_SPACE_SEPARATOR: return TRUE; case G_UNICODE_OTHER_SYMBOL: if (ch == 0xFFFC || ch == 0xFFFD || (ch >= 0x2FF0 && ch <= 0x2FFB)) return TRUE; return FALSE; case G_UNICODE_NON_SPACING_MARK: if (ch == 0x0340 || ch == 0x0341) return TRUE; return FALSE; default: return FALSE; } } /* RFC 3491 IDN cleanup algorithm. */ static gchar * nameprep (const gchar *hostname, gint len, gboolean *is_unicode) { gchar *name, *tmp = NULL, *p; /* It would be nice if we could do this without repeatedly * allocating strings and converting back and forth between * gunichars and UTF-8... The code does at least avoid doing most of * the sub-operations when they would just be equivalent to a * g_strdup(). */ /* Remove presentation-only characters */ name = remove_junk (hostname, len); if (name) { tmp = name; len = -1; } else name = (gchar *)hostname; /* Convert to lowercase */ if (contains_uppercase_letters (name, len)) { name = g_utf8_strdown (name, len); g_free (tmp); tmp = name; len = -1; } /* If there are no UTF8 characters, we're done. */ if (!contains_non_ascii (name, len)) { *is_unicode = FALSE; if (name == (gchar *)hostname) return len == -1 ? g_strdup (hostname) : g_strndup (hostname, len); else return name; } *is_unicode = TRUE; /* Normalize */ name = g_utf8_normalize (name, len, G_NORMALIZE_NFKC); g_free (tmp); tmp = name; if (!name) return NULL; /* KC normalization may have created more capital letters (eg, * angstrom -> capital A with ring). So we have to lowercasify a * second time. (This is more-or-less how the nameprep algorithm * does it. If tolower(nfkc(tolower(X))) is guaranteed to be the * same as tolower(nfkc(X)), then we could skip the first tolower, * but I'm not sure it is.) */ if (contains_uppercase_letters (name, -1)) { name = g_utf8_strdown (name, -1); g_free (tmp); tmp = name; } /* Check for prohibited characters */ for (p = name; *p; p = g_utf8_next_char (p)) { if (idna_is_prohibited (g_utf8_get_char (p))) { name = NULL; g_free (tmp); goto done; } } /* FIXME: We're supposed to verify certain constraints on bidi * characters, but glib does not appear to have that information. */ done: return name; } /* RFC 3490, section 3.1 says '.', 0x3002, 0xFF0E, and 0xFF61 count as * label-separating dots. @str must be '\0'-terminated. */ #define idna_is_dot(str) ( \ ((guchar)(str)[0] == '.') || \ ((guchar)(str)[0] == 0xE3 && (guchar)(str)[1] == 0x80 && (guchar)(str)[2] == 0x82) || \ ((guchar)(str)[0] == 0xEF && (guchar)(str)[1] == 0xBC && (guchar)(str)[2] == 0x8E) || \ ((guchar)(str)[0] == 0xEF && (guchar)(str)[1] == 0xBD && (guchar)(str)[2] == 0xA1) ) static const gchar * idna_end_of_label (const gchar *str) { for (; *str; str = g_utf8_next_char (str)) { if (idna_is_dot (str)) return str; } return str; } /** * g_hostname_to_ascii: * @hostname: a valid UTF-8 or ASCII hostname * * Converts @hostname to its canonical ASCII form; an ASCII-only * string containing no uppercase letters and not ending with a * trailing dot. * * Return value: an ASCII hostname, which must be freed, or %NULL if * @hostname is in some way invalid. * * Since: 2.22 **/ gchar * g_hostname_to_ascii (const gchar *hostname) { gchar *name, *label, *p; GString *out; gssize llen, oldlen; gboolean unicode; label = name = nameprep (hostname, -1, &unicode); if (!name || !unicode) return name; out = g_string_new (NULL); do { unicode = FALSE; for (p = label; *p && !idna_is_dot (p); p++) { if ((guchar)*p > 0x80) unicode = TRUE; } oldlen = out->len; llen = p - label; if (unicode) { if (!strncmp (label, IDNA_ACE_PREFIX, IDNA_ACE_PREFIX_LEN)) goto fail; g_string_append (out, IDNA_ACE_PREFIX); if (!punycode_encode (label, llen, out)) goto fail; } else g_string_append_len (out, label, llen); if (out->len - oldlen > 63) goto fail; label += llen; if (*label) label = g_utf8_next_char (label); if (*label) g_string_append_c (out, '.'); } while (*label); g_free (name); return g_string_free (out, FALSE); fail: g_free (name); g_string_free (out, TRUE); return NULL; } /** * g_hostname_is_non_ascii: * @hostname: a hostname * * Tests if @hostname contains Unicode characters. If this returns * %TRUE, you need to encode the hostname with g_hostname_to_ascii() * before using it in non-IDN-aware contexts. * * Note that a hostname might contain a mix of encoded and unencoded * segments, and so it is possible for g_hostname_is_non_ascii() and * g_hostname_is_ascii_encoded() to both return %TRUE for a name. * * Return value: %TRUE if @hostname contains any non-ASCII characters * * Since: 2.22 **/ gboolean g_hostname_is_non_ascii (const gchar *hostname) { return contains_non_ascii (hostname, -1); } /* Punycode decoder, RFC 3492 section 6.2. As with punycode_encode(), * read the RFC if you want to understand what this is actually doing. */ static gboolean punycode_decode (const gchar *input, gsize input_length, GString *output) { GArray *output_chars; gunichar n; guint i, bias; guint oldi, w, k, digit, t; const gchar *split; n = PUNYCODE_INITIAL_N; i = 0; bias = PUNYCODE_INITIAL_BIAS; split = input + input_length - 1; while (split > input && *split != '-') split--; if (split > input) { output_chars = g_array_sized_new (FALSE, FALSE, sizeof (gunichar), split - input); input_length -= (split - input) + 1; while (input < split) { gunichar ch = (gunichar)*input++; if (!PUNYCODE_IS_BASIC (ch)) goto fail; g_array_append_val (output_chars, ch); } input++; } else output_chars = g_array_new (FALSE, FALSE, sizeof (gunichar)); while (input_length) { oldi = i; w = 1; for (k = PUNYCODE_BASE; ; k += PUNYCODE_BASE) { if (!input_length--) goto fail; digit = decode_digit (*input++); if (digit >= PUNYCODE_BASE) goto fail; if (digit > (G_MAXUINT - i) / w) goto fail; i += digit * w; if (k <= bias) t = PUNYCODE_TMIN; else if (k >= bias + PUNYCODE_TMAX) t = PUNYCODE_TMAX; else t = k - bias; if (digit < t) break; if (w > G_MAXUINT / (PUNYCODE_BASE - t)) goto fail; w *= (PUNYCODE_BASE - t); } bias = adapt (i - oldi, output_chars->len + 1, oldi == 0); if (i / (output_chars->len + 1) > G_MAXUINT - n) goto fail; n += i / (output_chars->len + 1); i %= (output_chars->len + 1); g_array_insert_val (output_chars, i++, n); } for (i = 0; i < output_chars->len; i++) g_string_append_unichar (output, g_array_index (output_chars, gunichar, i)); g_array_free (output_chars, TRUE); return TRUE; fail: g_array_free (output_chars, TRUE); return FALSE; } /** * g_hostname_to_unicode: * @hostname: a valid UTF-8 or ASCII hostname * * Converts @hostname to its canonical presentation form; a UTF-8 * string in Unicode normalization form C, containing no uppercase * letters, no forbidden characters, and no ASCII-encoded segments, * and not ending with a trailing dot. * * Of course if @hostname is not an internationalized hostname, then * the canonical presentation form will be entirely ASCII. * * Return value: a UTF-8 hostname, which must be freed, or %NULL if * @hostname is in some way invalid. * * Since: 2.22 **/ gchar * g_hostname_to_unicode (const gchar *hostname) { GString *out; gssize llen; out = g_string_new (NULL); do { llen = idna_end_of_label (hostname) - hostname; if (!g_ascii_strncasecmp (hostname, IDNA_ACE_PREFIX, IDNA_ACE_PREFIX_LEN)) { hostname += IDNA_ACE_PREFIX_LEN; llen -= IDNA_ACE_PREFIX_LEN; if (!punycode_decode (hostname, llen, out)) { g_string_free (out, TRUE); return NULL; } } else { gboolean unicode; gchar *canonicalized = nameprep (hostname, llen, &unicode); if (!canonicalized) { g_string_free (out, TRUE); return NULL; } g_string_append (out, canonicalized); g_free (canonicalized); } hostname += llen; if (*hostname) hostname = g_utf8_next_char (hostname); if (*hostname) g_string_append_c (out, '.'); } while (*hostname); return g_string_free (out, FALSE); } /** * g_hostname_is_ascii_encoded: * @hostname: a hostname * * Tests if @hostname contains segments with an ASCII-compatible * encoding of an Internationalized Domain Name. If this returns * %TRUE, you should decode the hostname with g_hostname_to_unicode() * before displaying it to the user. * * Note that a hostname might contain a mix of encoded and unencoded * segments, and so it is possible for g_hostname_is_non_ascii() and * g_hostname_is_ascii_encoded() to both return %TRUE for a name. * * Return value: %TRUE if @hostname contains any ASCII-encoded * segments. * * Since: 2.22 **/ gboolean g_hostname_is_ascii_encoded (const gchar *hostname) { while (1) { if (!g_ascii_strncasecmp (hostname, IDNA_ACE_PREFIX, IDNA_ACE_PREFIX_LEN)) return TRUE; hostname = idna_end_of_label (hostname); if (*hostname) hostname = g_utf8_next_char (hostname); if (!*hostname) return FALSE; } } /** * g_hostname_is_ip_address: * @hostname: a hostname (or IP address in string form) * * Tests if @hostname is the string form of an IPv4 or IPv6 address. * (Eg, "192.168.0.1".) * * Return value: %TRUE if @hostname is an IP address * * Since: 2.22 **/ gboolean g_hostname_is_ip_address (const gchar *hostname) { gchar *p, *end; gint nsegments, octet; /* On Linux we could implement this using inet_pton, but the Windows * equivalent of that requires linking against winsock, so we just * figure this out ourselves. Tested by tests/hostutils.c. */ p = (char *)hostname; if (strchr (p, ':')) { gboolean skipped; /* If it contains a ':', it's an IPv6 address (assuming it's an * IP address at all). This consists of eight ':'-separated * segments, each containing a 1-4 digit hex number, except that * optionally: (a) the last two segments can be replaced by an * IPv4 address, and (b) a single span of 1 to 8 "0000" segments * can be replaced with just "::". */ nsegments = 0; skipped = FALSE; while (*p && nsegments < 8) { /* Each segment after the first must be preceded by a ':'. * (We also handle half of the "string starts with ::" case * here.) */ if (p != (char *)hostname || (p[0] == ':' && p[1] == ':')) { if (*p != ':') return FALSE; p++; } /* If there's another ':', it means we're skipping some segments */ if (*p == ':' && !skipped) { skipped = TRUE; nsegments++; /* Handle the "string ends with ::" case */ if (!p[1]) p++; continue; } /* Read the segment, make sure it's valid. */ for (end = p; g_ascii_isxdigit (*end); end++) ; if (end == p || end > p + 4) return FALSE; if (*end == '.') { if ((nsegments == 6 && !skipped) || (nsegments <= 6 && skipped)) goto parse_ipv4; else return FALSE; } nsegments++; p = end; } return !*p && (nsegments == 8 || skipped); } parse_ipv4: /* Parse IPv4: N.N.N.N, where each N <= 255 and doesn't have leading 0s. */ for (nsegments = 0; nsegments < 4; nsegments++) { if (nsegments != 0) { if (*p != '.') return FALSE; p++; } /* Check the segment; a little tricker than the IPv6 case since * we can't allow extra leading 0s, and we can't assume that all * strings of valid length are within range. */ octet = 0; if (*p == '0') end = p + 1; else { for (end = p; g_ascii_isdigit (*end); end++) octet = 10 * octet + (*end - '0'); } if (end == p || end > p + 3 || octet > 255) return FALSE; p = end; } /* If there's nothing left to parse, then it's ok. */ return !*p; } pkg-config-0.29.1/glib/glib/valgrind.h0000664000175000017500000105050212651243552014373 00000000000000/* -*- 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 /* 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 "**** " 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 */ pkg-config-0.29.1/glib/glib/gtimezone.c0000664000175000017500000014723412651243552014571 00000000000000/* * Copyright © 2010 Codethink Limited * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the licence, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * * Author: Ryan Lortie */ /* Prologue {{{1 */ #include "config.h" #include "gtimezone.h" #include #include #include #include "gmappedfile.h" #include "gtestutils.h" #include "gfileutils.h" #include "gstrfuncs.h" #include "ghash.h" #include "gthread.h" #include "gbytes.h" #include "gslice.h" #include "gdatetime.h" #include "gdate.h" #ifdef G_OS_WIN32 #define STRICT #include #endif /** * SECTION:timezone * @title: GTimeZone * @short_description: a structure representing a time zone * @see_also: #GDateTime * * #GTimeZone is a structure that represents a time zone, at no * particular point in time. It is refcounted and immutable. * * A time zone contains a number of intervals. Each interval has * an abbreviation to describe it, an offet to UTC and a flag indicating * if the daylight savings time is in effect during that interval. A * time zone always has at least one interval -- interval 0. * * Every UTC time is contained within exactly one interval, but a given * local time may be contained within zero, one or two intervals (due to * incontinuities associated with daylight savings time). * * An interval may refer to a specific period of time (eg: the duration * of daylight savings time during 2010) or it may refer to many periods * of time that share the same properties (eg: all periods of daylight * savings time). It is also possible (usually for political reasons) * that some properties (like the abbreviation) change between intervals * without other properties changing. * * #GTimeZone is available since GLib 2.26. */ /** * GTimeZone: * * #GTimeZone is an opaque structure whose members cannot be accessed * directly. * * Since: 2.26 **/ /* IANA zoneinfo file format {{{1 */ /* unaligned */ typedef struct { gchar bytes[8]; } gint64_be; typedef struct { gchar bytes[4]; } gint32_be; typedef struct { gchar bytes[4]; } guint32_be; static inline gint64 gint64_from_be (const gint64_be be) { gint64 tmp; memcpy (&tmp, &be, sizeof tmp); return GINT64_FROM_BE (tmp); } static inline gint32 gint32_from_be (const gint32_be be) { gint32 tmp; memcpy (&tmp, &be, sizeof tmp); return GINT32_FROM_BE (tmp); } 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]; gchar tzh_version; guchar tzh_reserved[15]; guint32_be tzh_ttisgmtcnt; guint32_be tzh_ttisstdcnt; guint32_be tzh_leapcnt; guint32_be tzh_timecnt; guint32_be tzh_typecnt; guint32_be tzh_charcnt; }; struct ttinfo { gint32_be tt_gmtoff; guint8 tt_isdst; guint8 tt_abbrind; }; /* 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 { 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 /* 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/**/ *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 * * Decreases the reference count on @tz. * * Since: 2.26 **/ void g_time_zone_unref (GTimeZone *tz) { int ref_count; again: ref_count = g_atomic_int_get (&tz->ref_count); g_assert (ref_count > 0); if (ref_count == 1) { if (tz->name != NULL) { G_LOCK(time_zones); /* someone else might have grabbed a ref in the meantime */ if G_UNLIKELY (g_atomic_int_get (&tz->ref_count) != 1) { G_UNLOCK(time_zones); goto again; } g_hash_table_remove (time_zones, tz->name); G_UNLOCK(time_zones); } 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); } else if G_UNLIKELY (!g_atomic_int_compare_and_exchange (&tz->ref_count, ref_count, ref_count - 1)) goto again; } /** * g_time_zone_ref: * @tz: a #GTimeZone * * Increases the reference count on @tz. * * Returns: a new reference to @tz. * * Since: 2.26 **/ GTimeZone * g_time_zone_ref (GTimeZone *tz) { g_assert (tz->ref_count > 0); g_atomic_int_inc (&tz->ref_count); return tz; } /* fake zoneinfo creation (for RFC3339/ISO 8601 timezones) {{{1 */ /* * 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' || '9' < *time_) return FALSE; *offset = 60 * 60 * (*time_++ - '0'); 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 += 10 * 60 * (*time_++ - '0'); if (*time_ < '0' || '9' < *time_) return FALSE; *offset += 60 * (*time_++ - '0'); if (*time_ == '\0') return TRUE; if (*time_ == ':') time_++; if (*time_ < '0' || '5' < *time_) return FALSE; *offset += 10 * (*time_++ - '0'); if (*time_ < '0' || '9' < *time_) return FALSE; *offset += *time_++ - '0'; return *time_ == '\0'; } 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': *offset = 0; return !*name; case '+': return parse_time (name, offset); case '-': if (parse_time (name, offset)) { *offset = -*offset; return TRUE; } default: return FALSE; } } static void zone_for_constant_offset (GTimeZone *gtz, const gchar *name) { gint32 offset; TransitionInfo info; if (name == NULL || !parse_constant_offset (name, &offset)) return; info.gmt_offset = offset; info.is_dst = FALSE; info.is_standard = TRUE; info.is_gmt = TRUE; info.abbrev = g_strdup (name); 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) ®tzi, &size) != ERROR_SUCCESS) { g_free (*rules); *rules = NULL; break; } g_free (s); if (year > first && memcmp (®tzi_prev, ®tzi, sizeof regtzi) == 0) continue; else memcpy (®tzi_prev, ®tzi, sizeof regtzi); register_tzi_to_tzi (®tzi, &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) ®tzi, &size) == ERROR_SUCCESS) { rules_num = 2; *rules = g_new0 (TimeZoneRule, 2); register_tzi_to_tzi (®tzi, &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 */ /** * g_time_zone_new: * @identifier: (allow-none): a timezone identifier * * Creates a #GTimeZone corresponding to @identifier. * * @identifier can either be an RFC3339/ISO 8601 time offset or * something that would pass as a valid value for the * TZ 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 "Z" (for UTC) or * "±hh:mm". ISO 8601 additionally specifies * "±hhmm" and "±hh". Offsets are * time values to be added to Coordinated Universal Time (UTC) to get * the local time. * * In Unix, the TZ 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 * "[±]hh[[:]mm[:ss]]". Dates are either * "Jn" (Julian day with n between 1 and 365, leap * years not counted), "n" (zero-based Julian day * with n between 0 and 365) or "Mm.w.d" (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. * * 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 * TZ environment variable. This function itself is * independent of the value of TZ, but if @identifier * is %NULL then /etc/localtime will be consulted * 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 * TZ 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 RFC3339 * §5.6 for a precise definition of valid RFC3339 time offsets * (the time-offset expansion) and ISO 8601 for the * full list of valid time offsets. See The * GNU C Library manual for an explanation of the possible * values of the TZ environment variable. See * Microsoft Time Zone Index Values 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. * * Returns: the requested timezone * * Since: 2.26 **/ GTimeZone * g_time_zone_new (const gchar *identifier) { 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); if (tz) { g_atomic_int_inc (&tz->ref_count); G_UNLOCK (time_zones); return tz; } } 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))) { init_zone_from_rules (tz, rules, rules_num); g_free (rules); } 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->t_info == NULL) { if (identifier) zone_for_constant_offset (tz, "UTC"); else { TIME_ZONE_INFORMATION tzi; if (GetTimeZoneInformation (&tzi) != TIME_ZONE_ID_INVALID) { rules = g_new0 (TimeZoneRule, 2); rule_from_windows_time_zone_info (&rules[0], &tzi); memset (rules[0].std_name, 0, NAME_SIZE); memset (rules[0].dlt_name, 0, NAME_SIZE); rules[0].start_year = MIN_TZYEAR; rules[1].start_year = MAX_TZYEAR; init_zone_from_rules (tz, rules, 2); g_free (rules); } } #endif } if (tz->t_info != NULL) { if (identifier) g_hash_table_insert (time_zones, tz->name, tz); } g_atomic_int_inc (&tz->ref_count); G_UNLOCK (time_zones); return tz; } /** * g_time_zone_new_utc: * * Creates a #GTimeZone corresponding to UTC. * * This is equivalent to calling g_time_zone_new() with a value like * "Z", "UTC", "+00", etc. * * You should release the return value by calling g_time_zone_unref() * when you are done with it. * * Returns: the universal timezone * * Since: 2.26 **/ GTimeZone * g_time_zone_new_utc (void) { return g_time_zone_new ("UTC"); } /** * g_time_zone_new_local: * * Creates a #GTimeZone corresponding to local time. The local time * zone may change between invocations to this function; for example, * if the system administrator changes it. * * This is equivalent to calling g_time_zone_new() with the value of the * TZ environment variable (including the possibility * of %NULL). * * You should release the return value by calling g_time_zone_unref() * when you are done with it. * * Returns: the local timezone * * Since: 2.26 **/ GTimeZone * 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 */ /* 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, guint interval) { 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 &(TRANSITION_INFO(index)); } inline static gint64 interval_start (GTimeZone *tz, guint interval) { 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, guint interval) { if (tz->transitions && interval < tz->transitions->len) return (TRANSITION(interval)).time - 1; return G_MAXINT64; } inline static gint32 interval_offset (GTimeZone *tz, guint interval) { g_return_val_if_fail (tz->t_info != NULL, 0); return interval_info (tz, interval)->gmt_offset; } inline static gboolean interval_isdst (GTimeZone *tz, guint interval) { g_return_val_if_fail (tz->t_info != NULL, 0); return interval_info (tz, interval)->is_dst; } inline static gboolean interval_isgmt (GTimeZone *tz, guint interval) { 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, guint interval) { if (interval) return interval_start (tz, interval) + interval_offset (tz, interval); return G_MININT64; } inline static gint64 interval_local_end (GTimeZone *tz, guint interval) { if (tz->transitions && interval < tz->transitions->len) return interval_end (tz, interval) + interval_offset (tz, interval); return G_MAXINT64; } static gboolean interval_valid (GTimeZone *tz, guint interval) { if ( tz->transitions == NULL) return interval == 0; return interval <= tz->transitions->len; } /* g_time_zone_find_interval() {{{1 */ /** * g_time_zone_adjust_time: * @tz: a #GTimeZone * @type: the #GTimeType of @time_ * @time_: a pointer to a number of seconds since January 1, 1970 * * Finds an interval within @tz that corresponds to the given @time_, * possibly adjusting @time_ if required to fit into an interval. * The meaning of @time_ depends on @type. * * This function is similar to g_time_zone_find_interval(), with the * difference that it always succeeds (by making the adjustments * described below). * * In any of the cases where g_time_zone_find_interval() succeeds then * this function returns the same value, without modifying @time_. * * This function may, however, modify @time_ in order to deal with * non-existent times. If the non-existent local @time_ of 02:30 were * requested on March 14th 2010 in Toronto then this function would * adjust @time_ to be 03:00 and return the interval containing the * adjusted time. * * Returns: the interval containing @time_, never -1 * * Since: 2.26 **/ gint g_time_zone_adjust_time (GTimeZone *tz, GTimeType type, gint64 *time_) { gint i; guint intervals; 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 <= intervals; i++) if (*time_ <= interval_end (tz, i)) break; g_assert (interval_start (tz, i) <= *time_ && *time_ <= interval_end (tz, i)); if (type != G_TIME_TYPE_UNIVERSAL) { if (*time_ < interval_local_start (tz, i)) /* if time came before the start of this interval... */ { i--; /* if it's not in the previous interval... */ if (*time_ > interval_local_end (tz, i)) { /* it doesn't exist. fast-forward it. */ i++; *time_ = interval_local_start (tz, i); } } else if (*time_ > interval_local_end (tz, i)) /* if time came after the end of this interval... */ { i++; /* if it's not in the next interval... */ if (*time_ < interval_local_start (tz, i)) /* it doesn't exist. fast-forward it. */ *time_ = interval_local_start (tz, i); } else if (interval_isdst (tz, i) != type) /* it's in this interval, but dst flag doesn't match. * check neighbours for a better fit. */ { if (i && *time_ <= interval_local_end (tz, i - 1)) i--; else if (i < intervals && *time_ >= interval_local_start (tz, i + 1)) i++; } } return i; } /** * g_time_zone_find_interval: * @tz: a #GTimeZone * @type: the #GTimeType of @time_ * @time_: a number of seconds since January 1, 1970 * * Finds an the interval within @tz that corresponds to the given @time_. * The meaning of @time_ depends on @type. * * If @type is %G_TIME_TYPE_UNIVERSAL then this function will always * succeed (since universal time is monotonic and continuous). * * Otherwise @time_ is treated is local time. The distinction between * %G_TIME_TYPE_STANDARD and %G_TIME_TYPE_DAYLIGHT is ignored except in * the case that the given @time_ is ambiguous. In Toronto, for example, * 01:30 on November 7th 2010 occurred twice (once inside of daylight * savings time and the next, an hour later, outside of daylight savings * time). In this case, the different value of @type would result in a * different interval being returned. * * It is still possible for this function to fail. In Toronto, for * example, 02:00 on March 14th 2010 does not exist (due to the leap * forward to begin daylight savings time). -1 is returned in that * case. * * Returns: the interval containing @time_, or -1 in case of failure * * Since: 2.26 */ gint g_time_zone_find_interval (GTimeZone *tz, GTimeType type, gint64 time_) { gint i; guint intervals; if (tz->transitions == NULL) return 0; intervals = tz->transitions->len; for (i = 0; i <= intervals; i++) if (time_ <= interval_end (tz, i)) break; if (type == G_TIME_TYPE_UNIVERSAL) return i; if (time_ < interval_local_start (tz, i)) { if (time_ > interval_local_end (tz, --i)) return -1; } else if (time_ > interval_local_end (tz, i)) { if (time_ < interval_local_start (tz, ++i)) return -1; } else if (interval_isdst (tz, i) != type) { if (i && time_ <= interval_local_end (tz, i - 1)) i--; else if (i < intervals && time_ >= interval_local_start (tz, i + 1)) i++; } return i; } /* Public API accessors {{{1 */ /** * g_time_zone_get_abbreviation: * @tz: a #GTimeZone * @interval: an interval within the timezone * * Determines the time zone abbreviation to be used during a particular * @interval of time in the time zone @tz. * * For example, in Toronto this is currently "EST" during the winter * months and "EDT" during the summer months when daylight savings time * is in effect. * * Returns: the time zone abbreviation, which belongs to @tz * * Since: 2.26 **/ const gchar * g_time_zone_get_abbreviation (GTimeZone *tz, gint interval) { g_return_val_if_fail (interval_valid (tz, (guint)interval), NULL); return interval_abbrev (tz, (guint)interval); } /** * g_time_zone_get_offset: * @tz: a #GTimeZone * @interval: an interval within the timezone * * Determines the offset to UTC in effect during a particular @interval * of time in the time zone @tz. * * The offset is the number of seconds that you add to UTC time to * arrive at local time for @tz (ie: negative numbers for time zones * west of GMT, positive numbers for east). * * Returns: the number of seconds that should be added to UTC to get the * local time in @tz * * Since: 2.26 **/ gint32 g_time_zone_get_offset (GTimeZone *tz, gint interval) { g_return_val_if_fail (interval_valid (tz, (guint)interval), 0); return interval_offset (tz, (guint)interval); } /** * g_time_zone_is_dst: * @tz: a #GTimeZone * @interval: an interval within the timezone * * Determines if daylight savings time is in effect during a particular * @interval of time in the time zone @tz. * * Returns: %TRUE if daylight savings time is in effect * * Since: 2.26 **/ gboolean g_time_zone_is_dst (GTimeZone *tz, gint interval) { g_return_val_if_fail (interval_valid (tz, interval), FALSE); if (tz->transitions == NULL) return FALSE; return interval_isdst (tz, (guint)interval); } /* Epilogue {{{1 */ /* vim:set foldmethod=marker: */ pkg-config-0.29.1/glib/glib/giochannel.c0000664000175000017500000023560212651243552014674 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * giochannel.c: IO Channel abstraction * Copyright 1998 Owen Taylor * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the GLib Team and others 1997-2000. See the AUTHORS * file for a list of people on the GLib Team. See the ChangeLog * files for a list of changes. These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/. */ /* * MT safe */ #include "config.h" #include #include #ifdef HAVE_UNISTD_H #include #endif #include "giochannel.h" #include "gstrfuncs.h" #include "gtestutils.h" #include "glibintl.h" /** * SECTION:iochannels * @title: IO Channels * @short_description: portable support for using files, pipes and * sockets * @see_also: * g_io_add_watch(), g_io_add_watch_full(), * g_source_remove() Convenience * functions for creating #GIOChannel instances and adding * them to the main * event loop. * * * The #GIOChannel data type aims to provide a portable method for * using file descriptors, pipes, and sockets, and integrating them * into the main event * loop. Currently full support is available on UNIX platforms, * support for Windows is only partially complete. * * To create a new #GIOChannel on UNIX systems use * g_io_channel_unix_new(). This works for plain file descriptors, * pipes and sockets. Alternatively, a channel can be created for a * file in a system independent manner using g_io_channel_new_file(). * * Once a #GIOChannel has been created, it can be used in a generic * manner with the functions g_io_channel_read_chars(), * g_io_channel_write_chars(), g_io_channel_seek_position(), and * g_io_channel_shutdown(). * * To add a #GIOChannel to the main event loop use * g_io_add_watch() or g_io_add_watch_full(). Here you specify which * events you are interested in on the #GIOChannel, and provide a * function to be called whenever these events occur. * * #GIOChannel instances are created with an initial reference count of * 1. g_io_channel_ref() and g_io_channel_unref() can be used to * increment or decrement the reference count respectively. When the * reference count falls to 0, the #GIOChannel is freed. (Though it * isn't closed automatically, unless it was created using * g_io_channel_new_file().) Using g_io_add_watch() or * g_io_add_watch_full() increments a channel's reference count. * * The new functions g_io_channel_read_chars(), * g_io_channel_read_line(), g_io_channel_read_line_string(), * g_io_channel_read_to_end(), g_io_channel_write_chars(), * g_io_channel_seek_position(), and g_io_channel_flush() should not be * mixed with the deprecated functions g_io_channel_read(), * g_io_channel_write(), and g_io_channel_seek() on the same channel. **/ /** * GIOChannel: * * A data structure representing an IO Channel. The fields should be * considered private and should only be accessed with the following * functions. **/ /** * GIOFuncs: * @io_read: reads raw bytes from the channel. This is called from * various functions such as g_io_channel_read_chars() to * read raw bytes from the channel. Encoding and buffering * issues are dealt with at a higher level. * @io_write: writes raw bytes to the channel. This is called from * various functions such as g_io_channel_write_chars() to * write raw bytes to the channel. Encoding and buffering * issues are dealt with at a higher level. * @io_seek: (optional) seeks the channel. This is called from * g_io_channel_seek() on channels that support it. * @io_close: closes the channel. This is called from * g_io_channel_close() after flushing the buffers. * @io_create_watch: creates a watch on the channel. This call * corresponds directly to g_io_create_watch(). * @io_free: called from g_io_channel_unref() when the channel needs to * be freed. This function must free the memory associated * with the channel, including freeing the #GIOChannel * structure itself. The channel buffers have been flushed * and possibly @io_close has been called by the time this * function is called. * @io_set_flags: sets the #GIOFlags on the channel. This is called * from g_io_channel_set_flags() with all flags except * for %G_IO_FLAG_APPEND and %G_IO_FLAG_NONBLOCK masked * out. * @io_get_flags: gets the #GIOFlags for the channel. This function * need only return the %G_IO_FLAG_APPEND and * %G_IO_FLAG_NONBLOCK flags; g_io_channel_get_flags() * automatically adds the others as appropriate. * * A table of functions used to handle different types of #GIOChannel * in a generic way. **/ /** * GIOStatus: * @G_IO_STATUS_ERROR: An error occurred. * @G_IO_STATUS_NORMAL: Success. * @G_IO_STATUS_EOF: End of file. * @G_IO_STATUS_AGAIN: Resource temporarily unavailable. * * Stati returned by most of the #GIOFuncs functions. **/ /** * GIOError: * @G_IO_ERROR_NONE: no error * @G_IO_ERROR_AGAIN: an EAGAIN error occurred * @G_IO_ERROR_INVAL: an EINVAL error occurred * @G_IO_ERROR_UNKNOWN: another error occurred * * #GIOError is only used by the deprecated functions * g_io_channel_read(), g_io_channel_write(), and g_io_channel_seek(). **/ #define G_IO_NICE_BUF_SIZE 1024 /* This needs to be as wide as the largest character in any possible encoding */ #define MAX_CHAR_SIZE 10 /* Some simplifying macros, which reduce the need to worry whether the * buffers have been allocated. These also make USE_BUF () an lvalue, * which is used in g_io_channel_read_to_end (). */ #define USE_BUF(channel) ((channel)->encoding ? (channel)->encoded_read_buf \ : (channel)->read_buf) #define BUF_LEN(string) ((string) ? (string)->len : 0) static GIOError g_io_error_get_from_g_error (GIOStatus status, GError *err); static void g_io_channel_purge (GIOChannel *channel); static GIOStatus g_io_channel_fill_buffer (GIOChannel *channel, GError **err); static GIOStatus g_io_channel_read_line_backend (GIOChannel *channel, gsize *length, gsize *terminator_pos, GError **error); /** * g_io_channel_init: * @channel: a #GIOChannel * * Initializes a #GIOChannel struct. * * This is called by each of the above functions when creating a * #GIOChannel, and so is not often needed by the application * programmer (unless you are creating a new type of #GIOChannel). */ void g_io_channel_init (GIOChannel *channel) { channel->ref_count = 1; channel->encoding = g_strdup ("UTF-8"); channel->line_term = NULL; channel->line_term_len = 0; channel->buf_size = G_IO_NICE_BUF_SIZE; channel->read_cd = (GIConv) -1; channel->write_cd = (GIConv) -1; channel->read_buf = NULL; /* Lazy allocate buffers */ channel->encoded_read_buf = NULL; channel->write_buf = NULL; channel->partial_write_buf[0] = '\0'; channel->use_buffer = TRUE; channel->do_encode = FALSE; channel->close_on_unref = FALSE; } /** * g_io_channel_ref: * @channel: a #GIOChannel * * Increments the reference count of a #GIOChannel. * * Returns: the @channel that was passed in (since 2.6) */ GIOChannel * g_io_channel_ref (GIOChannel *channel) { g_return_val_if_fail (channel != NULL, NULL); g_atomic_int_inc (&channel->ref_count); return channel; } /** * g_io_channel_unref: * @channel: a #GIOChannel * * Decrements the reference count of a #GIOChannel. */ void g_io_channel_unref (GIOChannel *channel) { gboolean is_zero; g_return_if_fail (channel != NULL); is_zero = g_atomic_int_dec_and_test (&channel->ref_count); if (G_UNLIKELY (is_zero)) { if (channel->close_on_unref) g_io_channel_shutdown (channel, TRUE, NULL); else g_io_channel_purge (channel); g_free (channel->encoding); if (channel->read_cd != (GIConv) -1) g_iconv_close (channel->read_cd); if (channel->write_cd != (GIConv) -1) g_iconv_close (channel->write_cd); g_free (channel->line_term); if (channel->read_buf) g_string_free (channel->read_buf, TRUE); if (channel->write_buf) g_string_free (channel->write_buf, TRUE); if (channel->encoded_read_buf) g_string_free (channel->encoded_read_buf, TRUE); channel->funcs->io_free (channel); } } static GIOError g_io_error_get_from_g_error (GIOStatus status, GError *err) { switch (status) { case G_IO_STATUS_NORMAL: case G_IO_STATUS_EOF: return G_IO_ERROR_NONE; case G_IO_STATUS_AGAIN: return G_IO_ERROR_AGAIN; case G_IO_STATUS_ERROR: g_return_val_if_fail (err != NULL, G_IO_ERROR_UNKNOWN); if (err->domain != G_IO_CHANNEL_ERROR) return G_IO_ERROR_UNKNOWN; switch (err->code) { case G_IO_CHANNEL_ERROR_INVAL: return G_IO_ERROR_INVAL; default: return G_IO_ERROR_UNKNOWN; } default: g_assert_not_reached (); } } /** * g_io_channel_read: * @channel: a #GIOChannel * @buf: a buffer to read the data into (which should be at least * count bytes long) * @count: the number of bytes to read from the #GIOChannel * @bytes_read: returns the number of bytes actually read * * Reads data from a #GIOChannel. * * Return value: %G_IO_ERROR_NONE if the operation was successful. * * Deprecated:2.2: Use g_io_channel_read_chars() instead. **/ GIOError g_io_channel_read (GIOChannel *channel, gchar *buf, gsize count, gsize *bytes_read) { GError *err = NULL; GIOError error; GIOStatus status; g_return_val_if_fail (channel != NULL, G_IO_ERROR_UNKNOWN); g_return_val_if_fail (bytes_read != NULL, G_IO_ERROR_UNKNOWN); if (count == 0) { if (bytes_read) *bytes_read = 0; return G_IO_ERROR_NONE; } g_return_val_if_fail (buf != NULL, G_IO_ERROR_UNKNOWN); status = channel->funcs->io_read (channel, buf, count, bytes_read, &err); error = g_io_error_get_from_g_error (status, err); if (err) g_error_free (err); return error; } /** * g_io_channel_write: * @channel: a #GIOChannel * @buf: the buffer containing the data to write * @count: the number of bytes to write * @bytes_written: the number of bytes actually written * * Writes data to a #GIOChannel. * * Return value: %G_IO_ERROR_NONE if the operation was successful. * * Deprecated:2.2: Use g_io_channel_write_chars() instead. **/ GIOError g_io_channel_write (GIOChannel *channel, const gchar *buf, gsize count, gsize *bytes_written) { GError *err = NULL; GIOError error; GIOStatus status; g_return_val_if_fail (channel != NULL, G_IO_ERROR_UNKNOWN); g_return_val_if_fail (bytes_written != NULL, G_IO_ERROR_UNKNOWN); status = channel->funcs->io_write (channel, buf, count, bytes_written, &err); error = g_io_error_get_from_g_error (status, err); if (err) g_error_free (err); return error; } /** * g_io_channel_seek: * @channel: a #GIOChannel * @offset: an offset, in bytes, which is added to the position specified * by @type * @type: the position in the file, which can be %G_SEEK_CUR (the current * position), %G_SEEK_SET (the start of the file), or %G_SEEK_END * (the end of the file) * * Sets the current position in the #GIOChannel, similar to the standard * library function fseek(). * * Return value: %G_IO_ERROR_NONE if the operation was successful. * * Deprecated:2.2: Use g_io_channel_seek_position() instead. **/ GIOError g_io_channel_seek (GIOChannel *channel, gint64 offset, GSeekType type) { GError *err = NULL; GIOError error; GIOStatus status; g_return_val_if_fail (channel != NULL, G_IO_ERROR_UNKNOWN); g_return_val_if_fail (channel->is_seekable, G_IO_ERROR_UNKNOWN); switch (type) { case G_SEEK_CUR: case G_SEEK_SET: case G_SEEK_END: break; default: g_warning ("g_io_channel_seek: unknown seek type"); return G_IO_ERROR_UNKNOWN; } status = channel->funcs->io_seek (channel, offset, type, &err); error = g_io_error_get_from_g_error (status, err); if (err) g_error_free (err); return error; } /* The function g_io_channel_new_file() is prototyped in both * giounix.c and giowin32.c, so we stick its documentation here. */ /** * g_io_channel_new_file: * @filename: A string containing the name of a file * @mode: One of "r", "w", "a", "r+", "w+", "a+". These have * the same meaning as in fopen() * @error: A location to return an error of type %G_FILE_ERROR * * Open a file @filename as a #GIOChannel using mode @mode. This * channel will be closed when the last reference to it is dropped, * so there is no need to call g_io_channel_close() (though doing * so will not cause problems, as long as no attempt is made to * access the channel after it is closed). * * Return value: A #GIOChannel on success, %NULL on failure. **/ /** * g_io_channel_close: * @channel: A #GIOChannel * * Close an IO channel. Any pending data to be written will be * flushed, ignoring errors. The channel will not be freed until the * last reference is dropped using g_io_channel_unref(). * * Deprecated:2.2: Use g_io_channel_shutdown() instead. **/ void g_io_channel_close (GIOChannel *channel) { GError *err = NULL; g_return_if_fail (channel != NULL); g_io_channel_purge (channel); channel->funcs->io_close (channel, &err); if (err) { /* No way to return the error */ g_warning ("Error closing channel: %s", err->message); g_error_free (err); } channel->close_on_unref = FALSE; /* Because we already did */ channel->is_readable = FALSE; channel->is_writeable = FALSE; channel->is_seekable = FALSE; } /** * g_io_channel_shutdown: * @channel: a #GIOChannel * @flush: if %TRUE, flush pending * @err: location to store a #GIOChannelError * * Close an IO channel. Any pending data to be written will be * flushed if @flush is %TRUE. The channel will not be freed until the * last reference is dropped using g_io_channel_unref(). * * Return value: the status of the operation. **/ GIOStatus g_io_channel_shutdown (GIOChannel *channel, gboolean flush, GError **err) { GIOStatus status, result; GError *tmperr = NULL; g_return_val_if_fail (channel != NULL, G_IO_STATUS_ERROR); g_return_val_if_fail (err == NULL || *err == NULL, G_IO_STATUS_ERROR); if (channel->write_buf && channel->write_buf->len > 0) { if (flush) { GIOFlags flags; /* Set the channel to blocking, to avoid a busy loop */ flags = g_io_channel_get_flags (channel); /* Ignore any errors here, they're irrelevant */ g_io_channel_set_flags (channel, flags & ~G_IO_FLAG_NONBLOCK, NULL); result = g_io_channel_flush (channel, &tmperr); } else result = G_IO_STATUS_NORMAL; g_string_truncate(channel->write_buf, 0); } else result = G_IO_STATUS_NORMAL; if (channel->partial_write_buf[0] != '\0') { if (flush) g_warning ("Partial character at end of write buffer not flushed.\n"); channel->partial_write_buf[0] = '\0'; } status = channel->funcs->io_close (channel, err); channel->close_on_unref = FALSE; /* Because we already did */ channel->is_readable = FALSE; channel->is_writeable = FALSE; channel->is_seekable = FALSE; if (status != G_IO_STATUS_NORMAL) { g_clear_error (&tmperr); return status; } else if (result != G_IO_STATUS_NORMAL) { g_propagate_error (err, tmperr); return result; } else return G_IO_STATUS_NORMAL; } /* This function is used for the final flush on close or unref */ static void g_io_channel_purge (GIOChannel *channel) { GError *err = NULL; GIOStatus status G_GNUC_UNUSED; g_return_if_fail (channel != NULL); if (channel->write_buf && channel->write_buf->len > 0) { GIOFlags flags; /* Set the channel to blocking, to avoid a busy loop */ flags = g_io_channel_get_flags (channel); g_io_channel_set_flags (channel, flags & ~G_IO_FLAG_NONBLOCK, NULL); status = g_io_channel_flush (channel, &err); if (err) { /* No way to return the error */ g_warning ("Error flushing string: %s", err->message); g_error_free (err); } } /* Flush these in case anyone tries to close without unrefing */ if (channel->read_buf) g_string_truncate (channel->read_buf, 0); if (channel->write_buf) g_string_truncate (channel->write_buf, 0); if (channel->encoding) { if (channel->encoded_read_buf) g_string_truncate (channel->encoded_read_buf, 0); if (channel->partial_write_buf[0] != '\0') { g_warning ("Partial character at end of write buffer not flushed.\n"); channel->partial_write_buf[0] = '\0'; } } } /** * g_io_create_watch: * @channel: a #GIOChannel to watch * @condition: conditions to watch for * * Creates a #GSource that's dispatched when @condition is met for the * given @channel. For example, if condition is #G_IO_IN, the source will * be dispatched when there's data available for reading. * * g_io_add_watch() is a simpler interface to this same functionality, for * the case where you want to add the source to the default main loop context * at the default priority. * * On Windows, polling a #GSource created to watch a channel for a socket * puts the socket in non-blocking mode. This is a side-effect of the * implementation and unavoidable. * * Returns: a new #GSource */ GSource * g_io_create_watch (GIOChannel *channel, GIOCondition condition) { g_return_val_if_fail (channel != NULL, NULL); return channel->funcs->io_create_watch (channel, condition); } /** * g_io_add_watch_full: * @channel: a #GIOChannel * @priority: the priority of the #GIOChannel source * @condition: the condition to watch for * @func: the function to call when the condition is satisfied * @user_data: user data to pass to @func * @notify: the function to call when the source is removed * * Adds the #GIOChannel into the default main loop context * with the given priority. * * This internally creates a main loop source using g_io_create_watch() * and attaches it to the main loop context with g_source_attach(). * You can do these steps manually if you need greater control. * * Returns: the event source id * Rename to: g_io_add_watch */ guint g_io_add_watch_full (GIOChannel *channel, gint priority, GIOCondition condition, GIOFunc func, gpointer user_data, GDestroyNotify notify) { GSource *source; guint id; g_return_val_if_fail (channel != NULL, 0); source = g_io_create_watch (channel, condition); if (priority != G_PRIORITY_DEFAULT) g_source_set_priority (source, priority); g_source_set_callback (source, (GSourceFunc)func, user_data, notify); id = g_source_attach (source, NULL); g_source_unref (source); return id; } /** * g_io_add_watch: * @channel: a #GIOChannel * @condition: the condition to watch for * @func: the function to call when the condition is satisfied * @user_data: user data to pass to @func * * Adds the #GIOChannel into the default main loop context * with the default priority. * * Returns: the event source id */ /** * GIOFunc: * @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() * * 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: * @G_IO_IN: There is data to read. * @G_IO_OUT: Data can be written (without blocking). * @G_IO_PRI: There is urgent data to read. * @G_IO_ERR: Error condition. * @G_IO_HUP: Hung up (the connection has been broken, usually for * pipes and sockets). * @G_IO_NVAL: Invalid request. The file descriptor is not open. * * A bitwise combination representing a condition to watch for on an * event source. **/ guint g_io_add_watch (GIOChannel *channel, GIOCondition condition, GIOFunc func, gpointer user_data) { return g_io_add_watch_full (channel, G_PRIORITY_DEFAULT, condition, func, user_data, NULL); } /** * g_io_channel_get_buffer_condition: * @channel: A #GIOChannel * * This function returns a #GIOCondition depending on whether there * is data to be read/space to write data in the internal buffers in * the #GIOChannel. Only the flags %G_IO_IN and %G_IO_OUT may be set. * * Return value: A #GIOCondition **/ GIOCondition g_io_channel_get_buffer_condition (GIOChannel *channel) { GIOCondition condition = 0; if (channel->encoding) { if (channel->encoded_read_buf && (channel->encoded_read_buf->len > 0)) condition |= G_IO_IN; /* Only return if we have full characters */ } else { if (channel->read_buf && (channel->read_buf->len > 0)) condition |= G_IO_IN; } if (channel->write_buf && (channel->write_buf->len < channel->buf_size)) condition |= G_IO_OUT; return condition; } /** * g_io_channel_error_from_errno: * @en: an errno error number, e.g. EINVAL * * Converts an errno error number to a #GIOChannelError. * * Return value: a #GIOChannelError error number, e.g. * %G_IO_CHANNEL_ERROR_INVAL. **/ GIOChannelError g_io_channel_error_from_errno (gint en) { #ifdef EAGAIN g_return_val_if_fail (en != EAGAIN, G_IO_CHANNEL_ERROR_FAILED); #endif switch (en) { #ifdef EBADF case EBADF: g_warning("Invalid file descriptor.\n"); return G_IO_CHANNEL_ERROR_FAILED; #endif #ifdef EFAULT case EFAULT: g_warning("Buffer outside valid address space.\n"); return G_IO_CHANNEL_ERROR_FAILED; #endif #ifdef EFBIG case EFBIG: return G_IO_CHANNEL_ERROR_FBIG; #endif #ifdef EINTR /* In general, we should catch EINTR before we get here, * but close() is allowed to return EINTR by POSIX, so * we need to catch it here; EINTR from close() is * unrecoverable, because it's undefined whether * the fd was actually closed or not, so we just return * a generic error code. */ case EINTR: return G_IO_CHANNEL_ERROR_FAILED; #endif #ifdef EINVAL case EINVAL: return G_IO_CHANNEL_ERROR_INVAL; #endif #ifdef EIO case EIO: return G_IO_CHANNEL_ERROR_IO; #endif #ifdef EISDIR case EISDIR: return G_IO_CHANNEL_ERROR_ISDIR; #endif #ifdef ENOSPC case ENOSPC: return G_IO_CHANNEL_ERROR_NOSPC; #endif #ifdef ENXIO case ENXIO: return G_IO_CHANNEL_ERROR_NXIO; #endif #ifdef EOVERFLOW #if EOVERFLOW != EFBIG case EOVERFLOW: return G_IO_CHANNEL_ERROR_OVERFLOW; #endif #endif #ifdef EPIPE case EPIPE: return G_IO_CHANNEL_ERROR_PIPE; #endif default: return G_IO_CHANNEL_ERROR_FAILED; } } /** * g_io_channel_set_buffer_size: * @channel: a #GIOChannel * @size: the size of the buffer, or 0 to let GLib pick a good size * * Sets the buffer size. **/ void g_io_channel_set_buffer_size (GIOChannel *channel, gsize size) { g_return_if_fail (channel != NULL); if (size == 0) size = G_IO_NICE_BUF_SIZE; if (size < MAX_CHAR_SIZE) size = MAX_CHAR_SIZE; channel->buf_size = size; } /** * g_io_channel_get_buffer_size: * @channel: a #GIOChannel * * Gets the buffer size. * * Return value: the size of the buffer. **/ gsize g_io_channel_get_buffer_size (GIOChannel *channel) { g_return_val_if_fail (channel != NULL, 0); return channel->buf_size; } /** * g_io_channel_set_line_term: * @channel: a #GIOChannel * @line_term: (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. * * This sets the string that #GIOChannel uses to determine * where in the file a line break occurs. **/ void g_io_channel_set_line_term (GIOChannel *channel, const gchar *line_term, gint length) { g_return_if_fail (channel != NULL); g_return_if_fail (line_term == NULL || length != 0); /* Disallow "" */ if (line_term == NULL) length = 0; else if (length < 0) length = strlen (line_term); g_free (channel->line_term); channel->line_term = line_term ? g_memdup (line_term, length) : NULL; channel->line_term_len = length; } /** * g_io_channel_get_line_term: * @channel: a #GIOChannel * @length: a location to return the length of the line terminator * * This returns the string that #GIOChannel uses to determine * where in the file a line break occurs. A value of %NULL * indicates autodetection. * * Return value: The line termination string. This value * is owned by GLib and must not be freed. **/ const gchar * g_io_channel_get_line_term (GIOChannel *channel, gint *length) { g_return_val_if_fail (channel != NULL, NULL); if (length) *length = channel->line_term_len; return channel->line_term; } /** * g_io_channel_set_flags: * @channel: a #GIOChannel * @flags: the flags to set on the IO channel * @error: A location to return an error of type #GIOChannelError * * Sets the (writeable) flags in @channel to (@flags & %G_IO_FLAG_SET_MASK). * * Return value: the status of the operation. **/ /** * GIOFlags: * @G_IO_FLAG_APPEND: turns on append mode, corresponds to O_APPEND * (see the documentation of the UNIX open() * syscall). * @G_IO_FLAG_NONBLOCK: turns on nonblocking mode, corresponds to * O_NONBLOCK/O_NDELAY * (see the documentation of the UNIX open() syscall). * @G_IO_FLAG_IS_READABLE: indicates that the io channel is readable. * This flag cannot be changed. * @G_IO_FLAG_IS_WRITABLE: indicates that the io channel is writable. * This flag cannot be changed. * @G_IO_FLAG_IS_SEEKABLE: indicates that the io channel is seekable, * i.e. that g_io_channel_seek_position() can * be used on it. This flag cannot be changed. * @G_IO_FLAG_MASK: the mask that specifies all the valid flags. * @G_IO_FLAG_GET_MASK: the mask of the flags that are returned from * g_io_channel_get_flags(). * @G_IO_FLAG_SET_MASK: the mask of the flags that the user can modify * with g_io_channel_set_flags(). * * Specifies properties of a #GIOChannel. Some of the flags can only be * read with g_io_channel_get_flags(), but not changed with * g_io_channel_set_flags(). **/ /** * G_IO_FLAG_IS_WRITEABLE: * * This is a misspelled version of G_IO_FLAG_IS_WRITABLE that existed * before the spelling was fixed in GLib 2.30. It is kept here for * compatibility reasons. * * Deprecated:2.30:Use G_IO_FLAG_IS_WRITABLE instead. **/ GIOStatus g_io_channel_set_flags (GIOChannel *channel, GIOFlags flags, GError **error) { g_return_val_if_fail (channel != NULL, G_IO_STATUS_ERROR); g_return_val_if_fail ((error == NULL) || (*error == NULL), G_IO_STATUS_ERROR); return (*channel->funcs->io_set_flags) (channel, flags & G_IO_FLAG_SET_MASK, error); } /** * g_io_channel_get_flags: * @channel: a #GIOChannel * * Gets the current flags for a #GIOChannel, including read-only * flags such as %G_IO_FLAG_IS_READABLE. * * The values of the flags %G_IO_FLAG_IS_READABLE and %G_IO_FLAG_IS_WRITABLE * are cached for internal use by the channel when it is created. * If they should change at some later point (e.g. partial shutdown * of a socket with the UNIX shutdown() function), the user * should immediately call g_io_channel_get_flags() to update * the internal values of these flags. * * Return value: the flags which are set on the channel **/ GIOFlags g_io_channel_get_flags (GIOChannel *channel) { GIOFlags flags; g_return_val_if_fail (channel != NULL, 0); flags = (* channel->funcs->io_get_flags) (channel); /* Cross implementation code */ if (channel->is_seekable) flags |= G_IO_FLAG_IS_SEEKABLE; if (channel->is_readable) flags |= G_IO_FLAG_IS_READABLE; if (channel->is_writeable) flags |= G_IO_FLAG_IS_WRITABLE; return flags; } /** * g_io_channel_set_close_on_unref: * @channel: a #GIOChannel * @do_close: Whether to close the channel on the final unref of * the GIOChannel data structure. The default value of * this is %TRUE for channels created by g_io_channel_new_file (), * and %FALSE for all other channels. * * Setting this flag to %TRUE for a channel you have already closed * can cause problems. **/ void g_io_channel_set_close_on_unref (GIOChannel *channel, gboolean do_close) { g_return_if_fail (channel != NULL); channel->close_on_unref = do_close; } /** * g_io_channel_get_close_on_unref: * @channel: a #GIOChannel. * * Returns whether the file/socket/whatever associated with @channel * will be closed when @channel receives its final unref and is * destroyed. The default value of this is %TRUE for channels created * by g_io_channel_new_file (), and %FALSE for all other channels. * * Return value: Whether the channel will be closed on the final unref of * the GIOChannel data structure. **/ gboolean g_io_channel_get_close_on_unref (GIOChannel *channel) { g_return_val_if_fail (channel != NULL, FALSE); return channel->close_on_unref; } /** * g_io_channel_seek_position: * @channel: a #GIOChannel * @offset: The offset in bytes from the position specified by @type * @type: a #GSeekType. The type %G_SEEK_CUR is only allowed in those * cases where a call to g_io_channel_set_encoding () * is allowed. See the documentation for * g_io_channel_set_encoding () for details. * @error: A location to return an error of type #GIOChannelError * * Replacement for g_io_channel_seek() with the new API. * * Return value: the status of the operation. **/ /** * GSeekType: * @G_SEEK_CUR: the current position in the file. * @G_SEEK_SET: the start of the file. * @G_SEEK_END: the end of the file. * * An enumeration specifying the base position for a * g_io_channel_seek_position() operation. **/ GIOStatus g_io_channel_seek_position (GIOChannel *channel, gint64 offset, GSeekType type, GError **error) { GIOStatus status; /* For files, only one of the read and write buffers can contain data. * For sockets, both can contain data. */ g_return_val_if_fail (channel != NULL, G_IO_STATUS_ERROR); g_return_val_if_fail ((error == NULL) || (*error == NULL), G_IO_STATUS_ERROR); g_return_val_if_fail (channel->is_seekable, G_IO_STATUS_ERROR); switch (type) { case G_SEEK_CUR: /* The user is seeking relative to the head of the buffer */ if (channel->use_buffer) { if (channel->do_encode && channel->encoded_read_buf && channel->encoded_read_buf->len > 0) { g_warning ("Seek type G_SEEK_CUR not allowed for this" " channel's encoding.\n"); return G_IO_STATUS_ERROR; } if (channel->read_buf) offset -= channel->read_buf->len; if (channel->encoded_read_buf) { g_assert (channel->encoded_read_buf->len == 0 || !channel->do_encode); /* If there's anything here, it's because the encoding is UTF-8, * so we can just subtract the buffer length, the same as for * the unencoded data. */ offset -= channel->encoded_read_buf->len; } } break; case G_SEEK_SET: case G_SEEK_END: break; default: g_warning ("g_io_channel_seek_position: unknown seek type"); return G_IO_STATUS_ERROR; } if (channel->use_buffer) { status = g_io_channel_flush (channel, error); if (status != G_IO_STATUS_NORMAL) return status; } status = channel->funcs->io_seek (channel, offset, type, error); if ((status == G_IO_STATUS_NORMAL) && (channel->use_buffer)) { if (channel->read_buf) g_string_truncate (channel->read_buf, 0); /* Conversion state no longer matches position in file */ if (channel->read_cd != (GIConv) -1) g_iconv (channel->read_cd, NULL, NULL, NULL, NULL); if (channel->write_cd != (GIConv) -1) g_iconv (channel->write_cd, NULL, NULL, NULL, NULL); if (channel->encoded_read_buf) { g_assert (channel->encoded_read_buf->len == 0 || !channel->do_encode); g_string_truncate (channel->encoded_read_buf, 0); } if (channel->partial_write_buf[0] != '\0') { g_warning ("Partial character at end of write buffer not flushed.\n"); channel->partial_write_buf[0] = '\0'; } } return status; } /** * g_io_channel_flush: * @channel: a #GIOChannel * @error: location to store an error of type #GIOChannelError * * Flushes the write buffer for the GIOChannel. * * Return value: the status of the operation: One of * #G_IO_STATUS_NORMAL, #G_IO_STATUS_AGAIN, or * #G_IO_STATUS_ERROR. **/ GIOStatus g_io_channel_flush (GIOChannel *channel, GError **error) { GIOStatus status; gsize this_time = 1, bytes_written = 0; g_return_val_if_fail (channel != NULL, G_IO_STATUS_ERROR); g_return_val_if_fail ((error == NULL) || (*error == NULL), G_IO_STATUS_ERROR); if (channel->write_buf == NULL || channel->write_buf->len == 0) return G_IO_STATUS_NORMAL; do { g_assert (this_time > 0); status = channel->funcs->io_write (channel, channel->write_buf->str + bytes_written, channel->write_buf->len - bytes_written, &this_time, error); bytes_written += this_time; } while ((bytes_written < channel->write_buf->len) && (status == G_IO_STATUS_NORMAL)); g_string_erase (channel->write_buf, 0, bytes_written); return status; } /** * g_io_channel_set_buffered: * @channel: a #GIOChannel * @buffered: whether to set the channel buffered or unbuffered * * The buffering state can only be set if the channel's encoding * is %NULL. For any other encoding, the channel must be buffered. * * A buffered channel can only be set unbuffered if the channel's * internal buffers have been flushed. Newly created channels or * channels which have returned %G_IO_STATUS_EOF * not require such a flush. For write-only channels, a call to * g_io_channel_flush () is sufficient. For all other channels, * the buffers may be flushed by a call to g_io_channel_seek_position (). * This includes the possibility of seeking with seek type %G_SEEK_CUR * and an offset of zero. Note that this means that socket-based * channels cannot be set unbuffered once they have had data * read from them. * * On unbuffered channels, it is safe to mix read and write * calls from the new and old APIs, if this is necessary for * maintaining old code. * * The default state of the channel is buffered. **/ void g_io_channel_set_buffered (GIOChannel *channel, gboolean buffered) { g_return_if_fail (channel != NULL); if (channel->encoding != NULL) { g_warning ("Need to have NULL encoding to set the buffering state of the " "channel.\n"); return; } g_return_if_fail (!channel->read_buf || channel->read_buf->len == 0); g_return_if_fail (!channel->write_buf || channel->write_buf->len == 0); channel->use_buffer = buffered; } /** * g_io_channel_get_buffered: * @channel: a #GIOChannel * * Returns whether @channel is buffered. * * Return Value: %TRUE if the @channel is buffered. **/ gboolean g_io_channel_get_buffered (GIOChannel *channel) { g_return_val_if_fail (channel != NULL, FALSE); return channel->use_buffer; } /** * g_io_channel_set_encoding: * @channel: a #GIOChannel * @encoding: (allow-none): the encoding type * @error: location to store an error of type #GConvertError * * Sets the encoding for the input/output of the channel. * The internal encoding is always UTF-8. The default encoding * for the external file is UTF-8. * * The encoding %NULL is safe to use with binary data. * * The encoding can only be set if one of the following conditions * is true: * * * The channel was just created, and has not been written to or read * from yet. * * * The channel is write-only. * * * The channel is a file, and the file pointer was just * repositioned by a call to g_io_channel_seek_position(). * (This flushes all the internal buffers.) * * * The current encoding is %NULL or UTF-8. * * * One of the (new API) read functions has just returned %G_IO_STATUS_EOF * (or, in the case of g_io_channel_read_to_end(), %G_IO_STATUS_NORMAL). * * * One of the functions g_io_channel_read_chars() or * g_io_channel_read_unichar() has returned %G_IO_STATUS_AGAIN or * %G_IO_STATUS_ERROR. This may be useful in the case of * %G_CONVERT_ERROR_ILLEGAL_SEQUENCE. * Returning one of these statuses from g_io_channel_read_line(), * g_io_channel_read_line_string(), or g_io_channel_read_to_end() * does not guarantee that the encoding can * be changed. * * * Channels which do not meet one of the above conditions cannot call * g_io_channel_seek_position() with an offset of %G_SEEK_CUR, and, if * they are "seekable", cannot call g_io_channel_write_chars() after * calling one of the API "read" functions. * * Return Value: %G_IO_STATUS_NORMAL if the encoding was successfully set. **/ GIOStatus g_io_channel_set_encoding (GIOChannel *channel, const gchar *encoding, GError **error) { GIConv read_cd, write_cd; gboolean did_encode; g_return_val_if_fail (channel != NULL, G_IO_STATUS_ERROR); g_return_val_if_fail ((error == NULL) || (*error == NULL), G_IO_STATUS_ERROR); /* Make sure the encoded buffers are empty */ g_return_val_if_fail (!channel->do_encode || !channel->encoded_read_buf || channel->encoded_read_buf->len == 0, G_IO_STATUS_ERROR); if (!channel->use_buffer) { g_warning ("Need to set the channel buffered before setting the encoding.\n"); g_warning ("Assuming this is what you meant and acting accordingly.\n"); channel->use_buffer = TRUE; } if (channel->partial_write_buf[0] != '\0') { g_warning ("Partial character at end of write buffer not flushed.\n"); channel->partial_write_buf[0] = '\0'; } did_encode = channel->do_encode; if (!encoding || strcmp (encoding, "UTF8") == 0 || strcmp (encoding, "UTF-8") == 0) { channel->do_encode = FALSE; read_cd = write_cd = (GIConv) -1; } else { gint err = 0; const gchar *from_enc = NULL, *to_enc = NULL; if (channel->is_readable) { read_cd = g_iconv_open ("UTF-8", encoding); if (read_cd == (GIConv) -1) { err = errno; from_enc = encoding; to_enc = "UTF-8"; } } else read_cd = (GIConv) -1; if (channel->is_writeable && err == 0) { write_cd = g_iconv_open (encoding, "UTF-8"); if (write_cd == (GIConv) -1) { err = errno; from_enc = "UTF-8"; to_enc = encoding; } } else write_cd = (GIConv) -1; if (err != 0) { g_assert (from_enc); g_assert (to_enc); if (err == EINVAL) g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_NO_CONVERSION, _("Conversion from character set '%s' to '%s' is not supported"), from_enc, to_enc); else g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_FAILED, _("Could not open converter from '%s' to '%s': %s"), from_enc, to_enc, g_strerror (err)); if (read_cd != (GIConv) -1) g_iconv_close (read_cd); if (write_cd != (GIConv) -1) g_iconv_close (write_cd); return G_IO_STATUS_ERROR; } channel->do_encode = TRUE; } /* The encoding is ok, so set the fields in channel */ if (channel->read_cd != (GIConv) -1) g_iconv_close (channel->read_cd); if (channel->write_cd != (GIConv) -1) g_iconv_close (channel->write_cd); if (channel->encoded_read_buf && channel->encoded_read_buf->len > 0) { g_assert (!did_encode); /* Encoding UTF-8, NULL doesn't use encoded_read_buf */ /* This is just validated UTF-8, so we can copy it back into read_buf * so it can be encoded in whatever the new encoding is. */ g_string_prepend_len (channel->read_buf, channel->encoded_read_buf->str, channel->encoded_read_buf->len); g_string_truncate (channel->encoded_read_buf, 0); } channel->read_cd = read_cd; channel->write_cd = write_cd; g_free (channel->encoding); channel->encoding = g_strdup (encoding); return G_IO_STATUS_NORMAL; } /** * g_io_channel_get_encoding: * @channel: a #GIOChannel * * Gets the encoding for the input/output of the channel. * The internal encoding is always UTF-8. The encoding %NULL * makes the channel safe for binary data. * * Return value: A string containing the encoding, this string is * owned by GLib and must not be freed. **/ const gchar * g_io_channel_get_encoding (GIOChannel *channel) { g_return_val_if_fail (channel != NULL, NULL); return channel->encoding; } static GIOStatus g_io_channel_fill_buffer (GIOChannel *channel, GError **err) { gsize read_size, cur_len, oldlen; GIOStatus status; if (channel->is_seekable && channel->write_buf && channel->write_buf->len > 0) { status = g_io_channel_flush (channel, err); if (status != G_IO_STATUS_NORMAL) return status; } if (channel->is_seekable && channel->partial_write_buf[0] != '\0') { g_warning ("Partial character at end of write buffer not flushed.\n"); channel->partial_write_buf[0] = '\0'; } if (!channel->read_buf) channel->read_buf = g_string_sized_new (channel->buf_size); cur_len = channel->read_buf->len; g_string_set_size (channel->read_buf, channel->read_buf->len + channel->buf_size); status = channel->funcs->io_read (channel, channel->read_buf->str + cur_len, channel->buf_size, &read_size, err); g_assert ((status == G_IO_STATUS_NORMAL) || (read_size == 0)); g_string_truncate (channel->read_buf, read_size + cur_len); if ((status != G_IO_STATUS_NORMAL) && ((status != G_IO_STATUS_EOF) || (channel->read_buf->len == 0))) return status; g_assert (channel->read_buf->len > 0); if (channel->encoded_read_buf) oldlen = channel->encoded_read_buf->len; else { oldlen = 0; if (channel->encoding) channel->encoded_read_buf = g_string_sized_new (channel->buf_size); } if (channel->do_encode) { gsize errnum, inbytes_left, outbytes_left; gchar *inbuf, *outbuf; int errval; g_assert (channel->encoded_read_buf); reencode: inbytes_left = channel->read_buf->len; outbytes_left = MAX (channel->read_buf->len, channel->encoded_read_buf->allocated_len - channel->encoded_read_buf->len - 1); /* 1 for NULL */ outbytes_left = MAX (outbytes_left, 6); inbuf = channel->read_buf->str; g_string_set_size (channel->encoded_read_buf, channel->encoded_read_buf->len + outbytes_left); outbuf = channel->encoded_read_buf->str + channel->encoded_read_buf->len - outbytes_left; errnum = g_iconv (channel->read_cd, &inbuf, &inbytes_left, &outbuf, &outbytes_left); errval = errno; g_assert (inbuf + inbytes_left == channel->read_buf->str + channel->read_buf->len); g_assert (outbuf + outbytes_left == channel->encoded_read_buf->str + channel->encoded_read_buf->len); g_string_erase (channel->read_buf, 0, channel->read_buf->len - inbytes_left); g_string_truncate (channel->encoded_read_buf, channel->encoded_read_buf->len - outbytes_left); if (errnum == (gsize) -1) { switch (errval) { case EINVAL: if ((oldlen == channel->encoded_read_buf->len) && (status == G_IO_STATUS_EOF)) status = G_IO_STATUS_EOF; else status = G_IO_STATUS_NORMAL; break; case E2BIG: /* Buffer size at least 6, wrote at least on character */ g_assert (inbuf != channel->read_buf->str); goto reencode; case EILSEQ: if (oldlen < channel->encoded_read_buf->len) status = G_IO_STATUS_NORMAL; else { g_set_error_literal (err, G_CONVERT_ERROR, G_CONVERT_ERROR_ILLEGAL_SEQUENCE, _("Invalid byte sequence in conversion input")); return G_IO_STATUS_ERROR; } break; default: g_assert (errval != EBADF); /* The converter should be open */ g_set_error (err, G_CONVERT_ERROR, G_CONVERT_ERROR_FAILED, _("Error during conversion: %s"), g_strerror (errval)); return G_IO_STATUS_ERROR; } } g_assert ((status != G_IO_STATUS_NORMAL) || (channel->encoded_read_buf->len > 0)); } else if (channel->encoding) /* UTF-8 */ { gchar *nextchar, *lastchar; g_assert (channel->encoded_read_buf); nextchar = channel->read_buf->str; lastchar = channel->read_buf->str + channel->read_buf->len; while (nextchar < lastchar) { gunichar val_char; val_char = g_utf8_get_char_validated (nextchar, lastchar - nextchar); switch (val_char) { case -2: /* stop, leave partial character in buffer */ lastchar = nextchar; break; case -1: if (oldlen < channel->encoded_read_buf->len) status = G_IO_STATUS_NORMAL; else { g_set_error_literal (err, G_CONVERT_ERROR, G_CONVERT_ERROR_ILLEGAL_SEQUENCE, _("Invalid byte sequence in conversion input")); status = G_IO_STATUS_ERROR; } lastchar = nextchar; break; default: nextchar = g_utf8_next_char (nextchar); break; } } if (lastchar > channel->read_buf->str) { gint copy_len = lastchar - channel->read_buf->str; g_string_append_len (channel->encoded_read_buf, channel->read_buf->str, copy_len); g_string_erase (channel->read_buf, 0, copy_len); } } return status; } /** * g_io_channel_read_line: * @channel: a #GIOChannel * @str_return: (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) (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 * * Reads a line, including the terminating character(s), * from a #GIOChannel into a newly-allocated string. * @str_return will contain allocated memory if the return * is %G_IO_STATUS_NORMAL. * * Return value: the status of the operation. **/ GIOStatus g_io_channel_read_line (GIOChannel *channel, gchar **str_return, gsize *length, gsize *terminator_pos, GError **error) { GIOStatus status; gsize got_length; g_return_val_if_fail (channel != NULL, G_IO_STATUS_ERROR); g_return_val_if_fail (str_return != NULL, G_IO_STATUS_ERROR); g_return_val_if_fail ((error == NULL) || (*error == NULL), G_IO_STATUS_ERROR); g_return_val_if_fail (channel->is_readable, G_IO_STATUS_ERROR); status = g_io_channel_read_line_backend (channel, &got_length, terminator_pos, error); if (length) *length = got_length; if (status == G_IO_STATUS_NORMAL) { g_assert (USE_BUF (channel)); *str_return = g_strndup (USE_BUF (channel)->str, got_length); g_string_erase (USE_BUF (channel), 0, got_length); } else *str_return = NULL; return status; } /** * g_io_channel_read_line_string: * @channel: a #GIOChannel * @buffer: a #GString into which the line will be written. * If @buffer already contains data, the old data will * be overwritten. * @terminator_pos: (allow-none): location to store position of line terminator, or %NULL * @error: a location to store an error of type #GConvertError * or #GIOChannelError * * Reads a line from a #GIOChannel, using a #GString as a buffer. * * Return value: the status of the operation. **/ GIOStatus g_io_channel_read_line_string (GIOChannel *channel, GString *buffer, gsize *terminator_pos, GError **error) { gsize length; GIOStatus status; g_return_val_if_fail (channel != NULL, G_IO_STATUS_ERROR); g_return_val_if_fail (buffer != NULL, G_IO_STATUS_ERROR); g_return_val_if_fail ((error == NULL) || (*error == NULL), G_IO_STATUS_ERROR); g_return_val_if_fail (channel->is_readable, G_IO_STATUS_ERROR); if (buffer->len > 0) g_string_truncate (buffer, 0); /* clear out the buffer */ status = g_io_channel_read_line_backend (channel, &length, terminator_pos, error); if (status == G_IO_STATUS_NORMAL) { g_assert (USE_BUF (channel)); g_string_append_len (buffer, USE_BUF (channel)->str, length); g_string_erase (USE_BUF (channel), 0, length); } return status; } static GIOStatus g_io_channel_read_line_backend (GIOChannel *channel, gsize *length, gsize *terminator_pos, GError **error) { GIOStatus status; gsize checked_to, line_term_len, line_length, got_term_len; gboolean first_time = TRUE; if (!channel->use_buffer) { /* Can't do a raw read in read_line */ g_set_error_literal (error, G_CONVERT_ERROR, G_CONVERT_ERROR_FAILED, _("Can't do a raw read in g_io_channel_read_line_string")); return G_IO_STATUS_ERROR; } status = G_IO_STATUS_NORMAL; if (channel->line_term) line_term_len = channel->line_term_len; else line_term_len = 3; /* This value used for setting checked_to, it's the longest of the four * we autodetect for. */ checked_to = 0; while (TRUE) { gchar *nextchar, *lastchar; GString *use_buf; if (!first_time || (BUF_LEN (USE_BUF (channel)) == 0)) { read_again: status = g_io_channel_fill_buffer (channel, error); switch (status) { case G_IO_STATUS_NORMAL: if (BUF_LEN (USE_BUF (channel)) == 0) /* Can happen when using conversion and only read * part of a character */ { first_time = FALSE; continue; } break; case G_IO_STATUS_EOF: if (BUF_LEN (USE_BUF (channel)) == 0) { if (length) *length = 0; if (channel->encoding && channel->read_buf->len != 0) { g_set_error_literal (error, G_CONVERT_ERROR, G_CONVERT_ERROR_PARTIAL_INPUT, _("Leftover unconverted data in " "read buffer")); return G_IO_STATUS_ERROR; } else return G_IO_STATUS_EOF; } break; default: if (length) *length = 0; return status; } } g_assert (BUF_LEN (USE_BUF (channel)) != 0); use_buf = USE_BUF (channel); /* The buffer has been created by this point */ first_time = FALSE; lastchar = use_buf->str + use_buf->len; for (nextchar = use_buf->str + checked_to; nextchar < lastchar; channel->encoding ? nextchar = g_utf8_next_char (nextchar) : nextchar++) { if (channel->line_term) { if (memcmp (channel->line_term, nextchar, line_term_len) == 0) { line_length = nextchar - use_buf->str; got_term_len = line_term_len; goto done; } } else /* auto detect */ { switch (*nextchar) { case '\n': /* unix */ line_length = nextchar - use_buf->str; got_term_len = 1; goto done; case '\r': /* Warning: do not use with sockets */ line_length = nextchar - use_buf->str; if ((nextchar == lastchar - 1) && (status != G_IO_STATUS_EOF) && (lastchar == use_buf->str + use_buf->len)) goto read_again; /* Try to read more data */ if ((nextchar < lastchar - 1) && (*(nextchar + 1) == '\n')) /* dos */ got_term_len = 2; else /* mac */ got_term_len = 1; goto done; case '\xe2': /* Unicode paragraph separator */ if (strncmp ("\xe2\x80\xa9", nextchar, 3) == 0) { line_length = nextchar - use_buf->str; got_term_len = 3; goto done; } break; case '\0': /* Embeded null in input */ line_length = nextchar - use_buf->str; got_term_len = 1; goto done; default: /* no match */ break; } } } /* If encoding != NULL, valid UTF-8, didn't overshoot */ g_assert (nextchar == lastchar); /* Check for EOF */ if (status == G_IO_STATUS_EOF) { if (channel->encoding && channel->read_buf->len > 0) { g_set_error_literal (error, G_CONVERT_ERROR, G_CONVERT_ERROR_PARTIAL_INPUT, _("Channel terminates in a partial character")); return G_IO_STATUS_ERROR; } line_length = use_buf->len; got_term_len = 0; break; } if (use_buf->len > line_term_len - 1) checked_to = use_buf->len - (line_term_len - 1); else checked_to = 0; } done: if (terminator_pos) *terminator_pos = line_length; if (length) *length = line_length + got_term_len; return G_IO_STATUS_NORMAL; } /** * g_io_channel_read_to_end: * @channel: a #GIOChannel * @str_return: (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 * * Reads all the remaining data from the file. * * Return value: %G_IO_STATUS_NORMAL on success. * This function never returns %G_IO_STATUS_EOF. **/ GIOStatus g_io_channel_read_to_end (GIOChannel *channel, gchar **str_return, gsize *length, GError **error) { GIOStatus status; g_return_val_if_fail (channel != NULL, G_IO_STATUS_ERROR); g_return_val_if_fail ((error == NULL) || (*error == NULL), G_IO_STATUS_ERROR); g_return_val_if_fail (channel->is_readable, G_IO_STATUS_ERROR); if (str_return) *str_return = NULL; if (length) *length = 0; if (!channel->use_buffer) { g_set_error_literal (error, G_CONVERT_ERROR, G_CONVERT_ERROR_FAILED, _("Can't do a raw read in g_io_channel_read_to_end")); return G_IO_STATUS_ERROR; } do status = g_io_channel_fill_buffer (channel, error); while (status == G_IO_STATUS_NORMAL); if (status != G_IO_STATUS_EOF) return status; if (channel->encoding && channel->read_buf->len > 0) { g_set_error_literal (error, G_CONVERT_ERROR, G_CONVERT_ERROR_PARTIAL_INPUT, _("Channel terminates in a partial character")); return G_IO_STATUS_ERROR; } if (USE_BUF (channel) == NULL) { /* length is already set to zero */ if (str_return) *str_return = g_strdup (""); } else { if (length) *length = USE_BUF (channel)->len; if (str_return) *str_return = g_string_free (USE_BUF (channel), FALSE); else g_string_free (USE_BUF (channel), TRUE); if (channel->encoding) channel->encoded_read_buf = NULL; else channel->read_buf = NULL; } return G_IO_STATUS_NORMAL; } /** * g_io_channel_read_chars: * @channel: a #GIOChannel * @buf: (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) (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. * @error: a location to return an error of type #GConvertError * or #GIOChannelError. * * Replacement for g_io_channel_read() with the new API. * * Return value: the status of the operation. */ GIOStatus g_io_channel_read_chars (GIOChannel *channel, gchar *buf, gsize count, gsize *bytes_read, GError **error) { GIOStatus status; gsize got_bytes; g_return_val_if_fail (channel != NULL, G_IO_STATUS_ERROR); g_return_val_if_fail ((error == NULL) || (*error == NULL), G_IO_STATUS_ERROR); g_return_val_if_fail (channel->is_readable, G_IO_STATUS_ERROR); if (count == 0) { if (bytes_read) *bytes_read = 0; return G_IO_STATUS_NORMAL; } g_return_val_if_fail (buf != NULL, G_IO_STATUS_ERROR); if (!channel->use_buffer) { gsize tmp_bytes; g_assert (!channel->read_buf || channel->read_buf->len == 0); status = channel->funcs->io_read (channel, buf, count, &tmp_bytes, error); if (bytes_read) *bytes_read = tmp_bytes; return status; } status = G_IO_STATUS_NORMAL; while (BUF_LEN (USE_BUF (channel)) < count && status == G_IO_STATUS_NORMAL) status = g_io_channel_fill_buffer (channel, error); /* Only return an error if we have no data */ if (BUF_LEN (USE_BUF (channel)) == 0) { g_assert (status != G_IO_STATUS_NORMAL); if (status == G_IO_STATUS_EOF && channel->encoding && BUF_LEN (channel->read_buf) > 0) { g_set_error_literal (error, G_CONVERT_ERROR, G_CONVERT_ERROR_PARTIAL_INPUT, _("Leftover unconverted data in read buffer")); status = G_IO_STATUS_ERROR; } if (bytes_read) *bytes_read = 0; return status; } if (status == G_IO_STATUS_ERROR) g_clear_error (error); got_bytes = MIN (count, BUF_LEN (USE_BUF (channel))); g_assert (got_bytes > 0); if (channel->encoding) /* Don't validate for NULL encoding, binary safe */ { gchar *nextchar, *prevchar; g_assert (USE_BUF (channel) == channel->encoded_read_buf); nextchar = channel->encoded_read_buf->str; do { prevchar = nextchar; nextchar = g_utf8_next_char (nextchar); g_assert (nextchar != prevchar); /* Possible for *prevchar of -1 or -2 */ } while (nextchar < channel->encoded_read_buf->str + got_bytes); if (nextchar > channel->encoded_read_buf->str + got_bytes) got_bytes = prevchar - channel->encoded_read_buf->str; g_assert (got_bytes > 0 || count < 6); } memcpy (buf, USE_BUF (channel)->str, got_bytes); g_string_erase (USE_BUF (channel), 0, got_bytes); if (bytes_read) *bytes_read = got_bytes; return G_IO_STATUS_NORMAL; } /** * g_io_channel_read_unichar: * @channel: a #GIOChannel * @thechar: (out): a location to return a character * @error: a location to return an error of type #GConvertError * or #GIOChannelError * * Reads a Unicode character from @channel. * This function cannot be called on a channel with %NULL encoding. * * Return value: a #GIOStatus **/ GIOStatus g_io_channel_read_unichar (GIOChannel *channel, gunichar *thechar, GError **error) { GIOStatus status = G_IO_STATUS_NORMAL; g_return_val_if_fail (channel != NULL, G_IO_STATUS_ERROR); g_return_val_if_fail (channel->encoding != NULL, G_IO_STATUS_ERROR); g_return_val_if_fail ((error == NULL) || (*error == NULL), G_IO_STATUS_ERROR); g_return_val_if_fail (channel->is_readable, G_IO_STATUS_ERROR); while (BUF_LEN (channel->encoded_read_buf) == 0 && status == G_IO_STATUS_NORMAL) status = g_io_channel_fill_buffer (channel, error); /* Only return an error if we have no data */ if (BUF_LEN (USE_BUF (channel)) == 0) { g_assert (status != G_IO_STATUS_NORMAL); if (status == G_IO_STATUS_EOF && BUF_LEN (channel->read_buf) > 0) { g_set_error_literal (error, G_CONVERT_ERROR, G_CONVERT_ERROR_PARTIAL_INPUT, _("Leftover unconverted data in read buffer")); status = G_IO_STATUS_ERROR; } if (thechar) *thechar = (gunichar) -1; return status; } if (status == G_IO_STATUS_ERROR) g_clear_error (error); if (thechar) *thechar = g_utf8_get_char (channel->encoded_read_buf->str); g_string_erase (channel->encoded_read_buf, 0, g_utf8_next_char (channel->encoded_read_buf->str) - channel->encoded_read_buf->str); return G_IO_STATUS_NORMAL; } /** * g_io_channel_write_chars: * @channel: a #GIOChannel * @buf: (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: (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 * to @count if @count >= 0. * @error: a location to return an error of type #GConvertError * or #GIOChannelError * * Replacement for g_io_channel_write() with the new API. * * On seekable channels with encodings other than %NULL or UTF-8, generic * mixing of reading and writing is not allowed. A call to g_io_channel_write_chars () * may only be made on a channel from which data has been read in the * cases described in the documentation for g_io_channel_set_encoding (). * * Return value: the status of the operation. **/ GIOStatus g_io_channel_write_chars (GIOChannel *channel, const gchar *buf, gssize count, gsize *bytes_written, GError **error) { GIOStatus status; gssize wrote_bytes = 0; g_return_val_if_fail (channel != NULL, G_IO_STATUS_ERROR); g_return_val_if_fail ((error == NULL) || (*error == NULL), G_IO_STATUS_ERROR); g_return_val_if_fail (channel->is_writeable, G_IO_STATUS_ERROR); if ((count < 0) && buf) count = strlen (buf); if (count == 0) { if (bytes_written) *bytes_written = 0; return G_IO_STATUS_NORMAL; } g_return_val_if_fail (buf != NULL, G_IO_STATUS_ERROR); g_return_val_if_fail (count > 0, G_IO_STATUS_ERROR); /* Raw write case */ if (!channel->use_buffer) { gsize tmp_bytes; g_assert (!channel->write_buf || channel->write_buf->len == 0); g_assert (channel->partial_write_buf[0] == '\0'); status = channel->funcs->io_write (channel, buf, count, &tmp_bytes, error); if (bytes_written) *bytes_written = tmp_bytes; return status; } /* General case */ if (channel->is_seekable && (( BUF_LEN (channel->read_buf) > 0) || (BUF_LEN (channel->encoded_read_buf) > 0))) { if (channel->do_encode && BUF_LEN (channel->encoded_read_buf) > 0) { g_warning("Mixed reading and writing not allowed on encoded files"); return G_IO_STATUS_ERROR; } status = g_io_channel_seek_position (channel, 0, G_SEEK_CUR, error); if (status != G_IO_STATUS_NORMAL) { if (bytes_written) *bytes_written = 0; return status; } } if (!channel->write_buf) channel->write_buf = g_string_sized_new (channel->buf_size); while (wrote_bytes < count) { gsize space_in_buf; /* If the buffer is full, try a write immediately. In * the nonblocking case, this prevents the user from * writing just a little bit to the buffer every time * and never receiving an EAGAIN. */ if (channel->write_buf->len >= channel->buf_size - MAX_CHAR_SIZE) { gsize did_write = 0, this_time; do { status = channel->funcs->io_write (channel, channel->write_buf->str + did_write, channel->write_buf->len - did_write, &this_time, error); did_write += this_time; } while (status == G_IO_STATUS_NORMAL && did_write < MIN (channel->write_buf->len, MAX_CHAR_SIZE)); g_string_erase (channel->write_buf, 0, did_write); if (status != G_IO_STATUS_NORMAL) { if (status == G_IO_STATUS_AGAIN && wrote_bytes > 0) status = G_IO_STATUS_NORMAL; if (bytes_written) *bytes_written = wrote_bytes; return status; } } space_in_buf = MAX (channel->buf_size, channel->write_buf->allocated_len - 1) - channel->write_buf->len; /* 1 for NULL */ /* This is only true because g_io_channel_set_buffer_size () * ensures that channel->buf_size >= MAX_CHAR_SIZE. */ g_assert (space_in_buf >= MAX_CHAR_SIZE); if (!channel->encoding) { gssize write_this = MIN (space_in_buf, count - wrote_bytes); g_string_append_len (channel->write_buf, buf, write_this); buf += write_this; wrote_bytes += write_this; } else { const gchar *from_buf; gsize from_buf_len, from_buf_old_len, left_len; gsize err; gint errnum; if (channel->partial_write_buf[0] != '\0') { g_assert (wrote_bytes == 0); from_buf = channel->partial_write_buf; from_buf_old_len = strlen (channel->partial_write_buf); g_assert (from_buf_old_len > 0); from_buf_len = MIN (6, from_buf_old_len + count); memcpy (channel->partial_write_buf + from_buf_old_len, buf, from_buf_len - from_buf_old_len); } else { from_buf = buf; from_buf_len = count - wrote_bytes; from_buf_old_len = 0; } reconvert: if (!channel->do_encode) /* UTF-8 encoding */ { const gchar *badchar; gsize try_len = MIN (from_buf_len, space_in_buf); /* UTF-8, just validate, emulate g_iconv */ if (!g_utf8_validate (from_buf, try_len, &badchar)) { gunichar try_char; gsize incomplete_len = from_buf + try_len - badchar; left_len = from_buf + from_buf_len - badchar; try_char = g_utf8_get_char_validated (badchar, incomplete_len); switch (try_char) { case -2: g_assert (incomplete_len < 6); if (try_len == from_buf_len) { errnum = EINVAL; err = (gsize) -1; } else { errnum = 0; err = (gsize) 0; } break; case -1: g_warning ("Invalid UTF-8 passed to g_io_channel_write_chars()."); /* FIXME bail here? */ errnum = EILSEQ; err = (gsize) -1; break; default: g_assert_not_reached (); err = (gsize) -1; errnum = 0; /* Don't confunse the compiler */ } } else { err = (gsize) 0; errnum = 0; left_len = from_buf_len - try_len; } g_string_append_len (channel->write_buf, from_buf, from_buf_len - left_len); from_buf += from_buf_len - left_len; } else { gchar *outbuf; left_len = from_buf_len; g_string_set_size (channel->write_buf, channel->write_buf->len + space_in_buf); outbuf = channel->write_buf->str + channel->write_buf->len - space_in_buf; err = g_iconv (channel->write_cd, (gchar **) &from_buf, &left_len, &outbuf, &space_in_buf); errnum = errno; g_string_truncate (channel->write_buf, channel->write_buf->len - space_in_buf); } if (err == (gsize) -1) { switch (errnum) { case EINVAL: g_assert (left_len < 6); if (from_buf_old_len == 0) { /* Not from partial_write_buf */ memcpy (channel->partial_write_buf, from_buf, left_len); channel->partial_write_buf[left_len] = '\0'; if (bytes_written) *bytes_written = count; return G_IO_STATUS_NORMAL; } /* Working in partial_write_buf */ if (left_len == from_buf_len) { /* Didn't convert anything, must still have * less than a full character */ g_assert (count == from_buf_len - from_buf_old_len); channel->partial_write_buf[from_buf_len] = '\0'; if (bytes_written) *bytes_written = count; return G_IO_STATUS_NORMAL; } g_assert (from_buf_len - left_len >= from_buf_old_len); /* We converted all the old data. This is fine */ break; case E2BIG: if (from_buf_len == left_len) { /* Nothing was written, add enough space for * at least one character. */ space_in_buf += MAX_CHAR_SIZE; goto reconvert; } break; case EILSEQ: g_set_error_literal (error, G_CONVERT_ERROR, G_CONVERT_ERROR_ILLEGAL_SEQUENCE, _("Invalid byte sequence in conversion input")); if (from_buf_old_len > 0 && from_buf_len == left_len) g_warning ("Illegal sequence due to partial character " "at the end of a previous write.\n"); else wrote_bytes += from_buf_len - left_len - from_buf_old_len; if (bytes_written) *bytes_written = wrote_bytes; channel->partial_write_buf[0] = '\0'; return G_IO_STATUS_ERROR; default: g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_FAILED, _("Error during conversion: %s"), g_strerror (errnum)); if (from_buf_len >= left_len + from_buf_old_len) wrote_bytes += from_buf_len - left_len - from_buf_old_len; if (bytes_written) *bytes_written = wrote_bytes; channel->partial_write_buf[0] = '\0'; return G_IO_STATUS_ERROR; } } g_assert (from_buf_len - left_len >= from_buf_old_len); wrote_bytes += from_buf_len - left_len - from_buf_old_len; if (from_buf_old_len > 0) { /* We were working in partial_write_buf */ buf += from_buf_len - left_len - from_buf_old_len; channel->partial_write_buf[0] = '\0'; } else buf = from_buf; } } if (bytes_written) *bytes_written = count; return G_IO_STATUS_NORMAL; } /** * g_io_channel_write_unichar: * @channel: a #GIOChannel * @thechar: a character * @error: location to return an error of type #GConvertError * or #GIOChannelError * * Writes a Unicode character to @channel. * This function cannot be called on a channel with %NULL encoding. * * Return value: a #GIOStatus **/ GIOStatus g_io_channel_write_unichar (GIOChannel *channel, gunichar thechar, GError **error) { GIOStatus status; gchar static_buf[6]; gsize char_len, wrote_len; g_return_val_if_fail (channel != NULL, G_IO_STATUS_ERROR); g_return_val_if_fail (channel->encoding != NULL, G_IO_STATUS_ERROR); g_return_val_if_fail ((error == NULL) || (*error == NULL), G_IO_STATUS_ERROR); g_return_val_if_fail (channel->is_writeable, G_IO_STATUS_ERROR); char_len = g_unichar_to_utf8 (thechar, static_buf); if (channel->partial_write_buf[0] != '\0') { g_warning ("Partial charater written before writing unichar.\n"); channel->partial_write_buf[0] = '\0'; } status = g_io_channel_write_chars (channel, static_buf, char_len, &wrote_len, error); /* We validate UTF-8, so we can't get a partial write */ g_assert (wrote_len == char_len || status != G_IO_STATUS_NORMAL); return status; } /** * g_io_channel_error_quark: * * Return value: the quark used as %G_IO_CHANNEL_ERROR **/ /** * G_IO_CHANNEL_ERROR: * * Error domain for #GIOChannel operations. Errors in this domain will * be from the #GIOChannelError enumeration. See #GError for * information on error domains. **/ /** * GIOChannelError: * @G_IO_CHANNEL_ERROR_FBIG: File too large. * @G_IO_CHANNEL_ERROR_INVAL: Invalid argument. * @G_IO_CHANNEL_ERROR_IO: IO error. * @G_IO_CHANNEL_ERROR_ISDIR: File is a directory. * @G_IO_CHANNEL_ERROR_NOSPC: No space left on device. * @G_IO_CHANNEL_ERROR_NXIO: No such device or address. * @G_IO_CHANNEL_ERROR_OVERFLOW: Value too large for defined datatype. * @G_IO_CHANNEL_ERROR_PIPE: Broken pipe. * @G_IO_CHANNEL_ERROR_FAILED: Some other error. * * Error codes returned by #GIOChannel operations. **/ G_DEFINE_QUARK (g-io-channel-error-quark, g_io_channel_error) pkg-config-0.29.1/glib/glib/gfileutils.c0000664000175000017500000021031512651243552014726 00000000000000/* gfileutils.c - File utility functions * * Copyright 2000 Red Hat, Inc. * * GLib is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * GLib is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with GLib; see the file COPYING.LIB. If not, * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "config.h" #include "glibconfig.h" #include #ifdef HAVE_UNISTD_H #include #endif #include #include #include #include #include #include #include #include #include #ifdef G_OS_WIN32 #include #include #endif /* G_OS_WIN32 */ #ifndef S_ISLNK #define S_ISLNK(x) 0 #endif #ifndef O_BINARY #define O_BINARY 0 #endif #include "gfileutils.h" #include "gstdio.h" #include "glibintl.h" #ifdef HAVE_LINUX_MAGIC_H /* for btrfs check */ #include #include #endif /** * SECTION:fileutils * @title: File Utilities * @short_description: various file-related functions * * There is a group of functions which wrap the common POSIX functions * dealing with filenames (g_open(), g_rename(), g_mkdir(), g_stat(), * g_unlink(), g_remove(), g_fopen(), g_freopen()). The point of these * wrappers is to make it possible to handle file names with any Unicode * characters in them on Windows without having to use ifdefs and the * wide character API in the application code. * * The pathname argument should be in the GLib file name encoding. * On POSIX this is the actual on-disk encoding which might correspond * to the locale settings of the process (or the * G_FILENAME_ENCODING environment variable), or not. * * On Windows the GLib file name encoding is UTF-8. Note that the * Microsoft C library does not use UTF-8, but has separate APIs for * current system code page and wide characters (UTF-16). The GLib * wrappers call the wide character API if present (on modern Windows * systems), otherwise convert to/from the system code page. * * Another group of functions allows to open and read directories * in the GLib file name encoding. These are g_dir_open(), * g_dir_read_name(), g_dir_rewind(), g_dir_close(). */ /** * GFileError: * @G_FILE_ERROR_EXIST: Operation not permitted; only the owner of * the file (or other resource) or processes with special privileges * can perform the operation. * @G_FILE_ERROR_ISDIR: File is a directory; you cannot open a directory * for writing, or create or remove hard links to it. * @G_FILE_ERROR_ACCES: Permission denied; the file permissions do not * allow the attempted operation. * @G_FILE_ERROR_NAMETOOLONG: Filename too long. * @G_FILE_ERROR_NOENT: No such file or directory. This is a "file * doesn't exist" error for ordinary files that are referenced in * contexts where they are expected to already exist. * @G_FILE_ERROR_NOTDIR: A file that isn't a directory was specified when * a directory is required. * @G_FILE_ERROR_NXIO: No such device or address. The system tried to * use the device represented by a file you specified, and it * couldn't find the device. This can mean that the device file was * installed incorrectly, or that the physical device is missing or * not correctly attached to the computer. * @G_FILE_ERROR_NODEV: The underlying file system of the specified file * does not support memory mapping. * @G_FILE_ERROR_ROFS: The directory containing the new link can't be * modified because it's on a read-only file system. * @G_FILE_ERROR_TXTBSY: Text file busy. * @G_FILE_ERROR_FAULT: You passed in a pointer to bad memory. * (GLib won't reliably return this, don't pass in pointers to bad * memory.) * @G_FILE_ERROR_LOOP: Too many levels of symbolic links were encountered * in looking up a file name. This often indicates a cycle of symbolic * links. * @G_FILE_ERROR_NOSPC: No space left on device; write operation on a * file failed because the disk is full. * @G_FILE_ERROR_NOMEM: No memory available. The system cannot allocate * more virtual memory because its capacity is full. * @G_FILE_ERROR_MFILE: The current process has too many files open and * can't open any more. Duplicate descriptors do count toward this * limit. * @G_FILE_ERROR_NFILE: There are too many distinct file openings in the * entire system. * @G_FILE_ERROR_BADF: Bad file descriptor; for example, I/O on a * descriptor that has been closed or reading from a descriptor open * only for writing (or vice versa). * @G_FILE_ERROR_INVAL: Invalid argument. This is used to indicate * various kinds of problems with passing the wrong argument to a * library function. * @G_FILE_ERROR_PIPE: Broken pipe; there is no process reading from the * other end of a pipe. Every library function that returns this * error code also generates a 'SIGPIPE' signal; this signal * terminates the program if not handled or blocked. Thus, your * program will never actually see this code unless it has handled * or blocked 'SIGPIPE'. * @G_FILE_ERROR_AGAIN: Resource temporarily unavailable; the call might * work if you try again later. * @G_FILE_ERROR_INTR: Interrupted function call; an asynchronous signal * occurred and prevented completion of the call. When this * happens, you should try the call again. * @G_FILE_ERROR_IO: Input/output error; usually used for physical read * or write errors. i.e. the disk or other physical device hardware * is returning errors. * @G_FILE_ERROR_PERM: Operation not permitted; only the owner of the * file (or other resource) or processes with special privileges can * perform the operation. * @G_FILE_ERROR_NOSYS: Function not implemented; this indicates that * the system is missing some functionality. * @G_FILE_ERROR_FAILED: Does not correspond to a UNIX error code; this * is the standard "failed for unspecified reason" error code present * in all #GError error code enumerations. Returned if no specific * code applies. * * Values corresponding to @errno codes returned from file operations * on UNIX. Unlike @errno codes, GFileError values are available on * all systems, even Windows. The exact meaning of each code depends * on what sort of file operation you were performing; the UNIX * documentation gives more details. The following error code descriptions * come from the GNU C Library manual, and are under the copyright * of that manual. * * It's not very portable to make detailed assumptions about exactly * which errors will be returned from a given operation. Some errors * don't occur on some systems, etc., sometimes there are subtle * differences in when a system will report a given error, etc. */ /** * G_FILE_ERROR: * * Error domain for file operations. Errors in this domain will * be from the #GFileError enumeration. See #GError for information * on error domains. */ /** * GFileTest: * @G_FILE_TEST_IS_REGULAR: %TRUE if the file is a regular file * (not a directory). Note that this test will also return %TRUE * if the tested file is a symlink to a regular file. * @G_FILE_TEST_IS_SYMLINK: %TRUE if the file is a symlink. * @G_FILE_TEST_IS_DIR: %TRUE if the file is a directory. * @G_FILE_TEST_IS_EXECUTABLE: %TRUE if the file is executable. * @G_FILE_TEST_EXISTS: %TRUE if the file exists. It may or may not * be a regular file. * * A test to perform on a file using g_file_test(). */ /** * g_mkdir_with_parents: * @pathname: a pathname in the GLib file name encoding * @mode: permissions to use for newly created directories * * Create a directory if it doesn't already exist. Create intermediate * parent directories as needed, too. * * Returns: 0 if the directory already exists, or was successfully * created. Returns -1 if an error occurred, with errno set. * * Since: 2.8 */ int g_mkdir_with_parents (const gchar *pathname, int mode) { gchar *fn, *p; if (pathname == NULL || *pathname == '\0') { errno = EINVAL; return -1; } fn = g_strdup (pathname); if (g_path_is_absolute (fn)) p = (gchar *) g_path_skip_root (fn); else p = fn; do { while (*p && !G_IS_DIR_SEPARATOR (*p)) p++; if (!*p) p = NULL; else *p = '\0'; if (!g_file_test (fn, G_FILE_TEST_EXISTS)) { if (g_mkdir (fn, mode) == -1 && errno != EEXIST) { int errno_save = errno; g_free (fn); errno = errno_save; return -1; } } else if (!g_file_test (fn, G_FILE_TEST_IS_DIR)) { g_free (fn); errno = ENOTDIR; return -1; } if (p) { *p++ = G_DIR_SEPARATOR; while (*p && G_IS_DIR_SEPARATOR (*p)) p++; } } while (p); g_free (fn); return 0; } /** * g_file_test: * @filename: a filename to test in the GLib file name encoding * @test: bitfield of #GFileTest flags * * Returns %TRUE if any of the tests in the bitfield @test are * %TRUE. For example, (G_FILE_TEST_EXISTS | * G_FILE_TEST_IS_DIR) will return %TRUE if the file exists; * the check whether it's a directory doesn't matter since the existence * test is %TRUE. With the current set of available tests, there's no point * passing in more than one test at a time. * * Apart from %G_FILE_TEST_IS_SYMLINK all tests follow symbolic links, * so for a symbolic link to a regular file g_file_test() will return * %TRUE for both %G_FILE_TEST_IS_SYMLINK and %G_FILE_TEST_IS_REGULAR. * * Note, that for a dangling symbolic link g_file_test() will return * %TRUE for %G_FILE_TEST_IS_SYMLINK and %FALSE for all other flags. * * You should never use g_file_test() to test whether it is safe * to perform an operation, because there is always the possibility * of the condition changing before you actually perform the operation. * For example, you might think you could use %G_FILE_TEST_IS_SYMLINK * to know whether it is safe to write to a file without being * tricked into writing into a different location. It doesn't work! * |[ * /* DON'T DO THIS */ * if (!g_file_test (filename, G_FILE_TEST_IS_SYMLINK)) * { * fd = g_open (filename, O_WRONLY); * /* write to fd */ * } * ]| * * Another thing to note is that %G_FILE_TEST_EXISTS and * %G_FILE_TEST_IS_EXECUTABLE are implemented using the access() * system call. This usually doesn't matter, but if your program * is setuid or setgid it means that these tests will give you * the answer for the real user ID and group ID, rather than the * effective user ID and group ID. * * On Windows, there are no symlinks, so testing for * %G_FILE_TEST_IS_SYMLINK will always return %FALSE. Testing for * %G_FILE_TEST_IS_EXECUTABLE will just check that the file exists and * its name indicates that it is executable, checking for well-known * extensions and those listed in the PATHEXT environment variable. * * Return value: whether a test was %TRUE **/ gboolean g_file_test (const gchar *filename, GFileTest test) { #ifdef G_OS_WIN32 /* stuff missing in std vc6 api */ # ifndef INVALID_FILE_ATTRIBUTES # define INVALID_FILE_ATTRIBUTES -1 # endif # ifndef FILE_ATTRIBUTE_DEVICE # define FILE_ATTRIBUTE_DEVICE 64 # endif int attributes; wchar_t *wfilename = g_utf8_to_utf16 (filename, -1, NULL, NULL, NULL); if (wfilename == NULL) return FALSE; attributes = GetFileAttributesW (wfilename); g_free (wfilename); if (attributes == INVALID_FILE_ATTRIBUTES) return FALSE; if (test & G_FILE_TEST_EXISTS) return TRUE; if (test & G_FILE_TEST_IS_REGULAR) { if ((attributes & (FILE_ATTRIBUTE_DIRECTORY | FILE_ATTRIBUTE_DEVICE)) == 0) return TRUE; } if (test & G_FILE_TEST_IS_DIR) { if ((attributes & FILE_ATTRIBUTE_DIRECTORY) != 0) return TRUE; } /* "while" so that we can exit this "loop" with a simple "break" */ while (test & G_FILE_TEST_IS_EXECUTABLE) { const gchar *lastdot = strrchr (filename, '.'); const gchar *pathext = NULL, *p; int extlen; if (lastdot == NULL) break; if (_stricmp (lastdot, ".exe") == 0 || _stricmp (lastdot, ".cmd") == 0 || _stricmp (lastdot, ".bat") == 0 || _stricmp (lastdot, ".com") == 0) return TRUE; /* Check if it is one of the types listed in %PATHEXT% */ pathext = g_getenv ("PATHEXT"); if (pathext == NULL) break; pathext = g_utf8_casefold (pathext, -1); lastdot = g_utf8_casefold (lastdot, -1); extlen = strlen (lastdot); p = pathext; while (TRUE) { const gchar *q = strchr (p, ';'); if (q == NULL) q = p + strlen (p); if (extlen == q - p && memcmp (lastdot, p, extlen) == 0) { g_free ((gchar *) pathext); g_free ((gchar *) lastdot); return TRUE; } if (*q) p = q + 1; else break; } g_free ((gchar *) pathext); g_free ((gchar *) lastdot); break; } return FALSE; #else if ((test & G_FILE_TEST_EXISTS) && (access (filename, F_OK) == 0)) return TRUE; if ((test & G_FILE_TEST_IS_EXECUTABLE) && (access (filename, X_OK) == 0)) { if (getuid () != 0) return TRUE; /* For root, on some POSIX systems, access (filename, X_OK) * will succeed even if no executable bits are set on the * file. We fall through to a stat test to avoid that. */ } else test &= ~G_FILE_TEST_IS_EXECUTABLE; if (test & G_FILE_TEST_IS_SYMLINK) { struct stat s; if ((lstat (filename, &s) == 0) && S_ISLNK (s.st_mode)) return TRUE; } if (test & (G_FILE_TEST_IS_REGULAR | G_FILE_TEST_IS_DIR | G_FILE_TEST_IS_EXECUTABLE)) { struct stat s; if (stat (filename, &s) == 0) { if ((test & G_FILE_TEST_IS_REGULAR) && S_ISREG (s.st_mode)) return TRUE; if ((test & G_FILE_TEST_IS_DIR) && S_ISDIR (s.st_mode)) return TRUE; /* The extra test for root when access (file, X_OK) succeeds. */ if ((test & G_FILE_TEST_IS_EXECUTABLE) && ((s.st_mode & S_IXOTH) || (s.st_mode & S_IXUSR) || (s.st_mode & S_IXGRP))) return TRUE; } } return FALSE; #endif } G_DEFINE_QUARK (g-file-error-quark, g_file_error) /** * g_file_error_from_errno: * @err_no: an "errno" value * * Gets a #GFileError constant based on the passed-in @err_no. * For example, if you pass in EEXIST this function returns * #G_FILE_ERROR_EXIST. Unlike errno values, you can portably * assume that all #GFileError values will exist. * * Normally a #GFileError value goes into a #GError returned * from a function that manipulates files. So you would use * g_file_error_from_errno() when constructing a #GError. * * Return value: #GFileError corresponding to the given @errno **/ GFileError g_file_error_from_errno (gint err_no) { switch (err_no) { #ifdef EEXIST case EEXIST: return G_FILE_ERROR_EXIST; break; #endif #ifdef EISDIR case EISDIR: return G_FILE_ERROR_ISDIR; break; #endif #ifdef EACCES case EACCES: return G_FILE_ERROR_ACCES; break; #endif #ifdef ENAMETOOLONG case ENAMETOOLONG: return G_FILE_ERROR_NAMETOOLONG; break; #endif #ifdef ENOENT case ENOENT: return G_FILE_ERROR_NOENT; break; #endif #ifdef ENOTDIR case ENOTDIR: return G_FILE_ERROR_NOTDIR; break; #endif #ifdef ENXIO case ENXIO: return G_FILE_ERROR_NXIO; break; #endif #ifdef ENODEV case ENODEV: return G_FILE_ERROR_NODEV; break; #endif #ifdef EROFS case EROFS: return G_FILE_ERROR_ROFS; break; #endif #ifdef ETXTBSY case ETXTBSY: return G_FILE_ERROR_TXTBSY; break; #endif #ifdef EFAULT case EFAULT: return G_FILE_ERROR_FAULT; break; #endif #ifdef ELOOP case ELOOP: return G_FILE_ERROR_LOOP; break; #endif #ifdef ENOSPC case ENOSPC: return G_FILE_ERROR_NOSPC; break; #endif #ifdef ENOMEM case ENOMEM: return G_FILE_ERROR_NOMEM; break; #endif #ifdef EMFILE case EMFILE: return G_FILE_ERROR_MFILE; break; #endif #ifdef ENFILE case ENFILE: return G_FILE_ERROR_NFILE; break; #endif #ifdef EBADF case EBADF: return G_FILE_ERROR_BADF; break; #endif #ifdef EINVAL case EINVAL: return G_FILE_ERROR_INVAL; break; #endif #ifdef EPIPE case EPIPE: return G_FILE_ERROR_PIPE; break; #endif #ifdef EAGAIN case EAGAIN: return G_FILE_ERROR_AGAIN; break; #endif #ifdef EINTR case EINTR: return G_FILE_ERROR_INTR; break; #endif #ifdef EIO case EIO: return G_FILE_ERROR_IO; break; #endif #ifdef EPERM case EPERM: return G_FILE_ERROR_PERM; break; #endif #ifdef ENOSYS case ENOSYS: return G_FILE_ERROR_NOSYS; break; #endif default: return G_FILE_ERROR_FAILED; break; } } static gboolean get_contents_stdio (const gchar *display_filename, FILE *f, gchar **contents, gsize *length, GError **error) { gchar buf[4096]; gsize bytes; gchar *str = NULL; gsize total_bytes = 0; gsize total_allocated = 0; gchar *tmp; g_assert (f != NULL); while (!feof (f)) { gint save_errno; bytes = fread (buf, 1, sizeof (buf), f); save_errno = errno; while ((total_bytes + bytes + 1) > total_allocated) { if (str) total_allocated *= 2; else total_allocated = MIN (bytes + 1, sizeof (buf)); tmp = g_try_realloc (str, total_allocated); if (tmp == NULL) { g_set_error (error, G_FILE_ERROR, G_FILE_ERROR_NOMEM, 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); goto error; } str = tmp; } if (ferror (f)) { g_set_error (error, G_FILE_ERROR, g_file_error_from_errno (save_errno), _("Error reading file '%s': %s"), display_filename, g_strerror (save_errno)); goto error; } memcpy (str + total_bytes, buf, bytes); if (total_bytes + bytes < total_bytes) { g_set_error (error, G_FILE_ERROR, G_FILE_ERROR_FAILED, _("File \"%s\" is too large"), display_filename); goto error; } total_bytes += bytes; } fclose (f); if (total_allocated == 0) { str = g_new (gchar, 1); total_bytes = 0; } str[total_bytes] = '\0'; if (length) *length = total_bytes; *contents = str; return TRUE; error: g_free (str); fclose (f); return FALSE; } #ifndef G_OS_WIN32 static gboolean get_contents_regfile (const gchar *display_filename, struct stat *stat_buf, gint fd, gchar **contents, gsize *length, GError **error) { gchar *buf; gsize bytes_read; gsize size; gsize alloc_size; size = stat_buf->st_size; alloc_size = size + 1; buf = g_try_malloc (alloc_size); if (buf == NULL) { g_set_error (error, G_FILE_ERROR, G_FILE_ERROR_NOMEM, 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); goto error; } bytes_read = 0; while (bytes_read < size) { gssize rc; rc = read (fd, buf + bytes_read, size - bytes_read); if (rc < 0) { if (errno != EINTR) { int save_errno = errno; g_free (buf); g_set_error (error, G_FILE_ERROR, g_file_error_from_errno (save_errno), _("Failed to read from file '%s': %s"), display_filename, g_strerror (save_errno)); goto error; } } else if (rc == 0) break; else bytes_read += rc; } buf[bytes_read] = '\0'; if (length) *length = bytes_read; *contents = buf; close (fd); return TRUE; error: close (fd); return FALSE; } static gboolean get_contents_posix (const gchar *filename, gchar **contents, gsize *length, GError **error) { struct stat stat_buf; gint fd; gchar *display_filename = g_filename_display_name (filename); /* O_BINARY useful on Cygwin */ fd = open (filename, O_RDONLY|O_BINARY); if (fd < 0) { int save_errno = errno; g_set_error (error, G_FILE_ERROR, g_file_error_from_errno (save_errno), _("Failed to open file '%s': %s"), display_filename, g_strerror (save_errno)); g_free (display_filename); return FALSE; } /* I don't think this will ever fail, aside from ENOMEM, but. */ if (fstat (fd, &stat_buf) < 0) { int save_errno = errno; close (fd); g_set_error (error, G_FILE_ERROR, g_file_error_from_errno (save_errno), _("Failed to get attributes of file '%s': fstat() failed: %s"), display_filename, g_strerror (save_errno)); g_free (display_filename); return FALSE; } if (stat_buf.st_size > 0 && S_ISREG (stat_buf.st_mode)) { gboolean retval = get_contents_regfile (display_filename, &stat_buf, fd, contents, length, error); g_free (display_filename); return retval; } else { FILE *f; gboolean retval; f = fdopen (fd, "r"); if (f == NULL) { int save_errno = errno; g_set_error (error, G_FILE_ERROR, g_file_error_from_errno (save_errno), _("Failed to open file '%s': fdopen() failed: %s"), display_filename, g_strerror (save_errno)); g_free (display_filename); return FALSE; } retval = get_contents_stdio (display_filename, f, contents, length, error); g_free (display_filename); return retval; } } #else /* G_OS_WIN32 */ static gboolean get_contents_win32 (const gchar *filename, gchar **contents, gsize *length, GError **error) { FILE *f; gboolean retval; gchar *display_filename = g_filename_display_name (filename); int save_errno; f = g_fopen (filename, "rb"); save_errno = errno; if (f == NULL) { g_set_error (error, G_FILE_ERROR, g_file_error_from_errno (save_errno), _("Failed to open file '%s': %s"), display_filename, g_strerror (save_errno)); g_free (display_filename); return FALSE; } retval = get_contents_stdio (display_filename, f, contents, length, error); g_free (display_filename); return retval; } #endif /** * g_file_get_contents: * @filename: (type filename): name of a file to read contents from, in the GLib file name encoding * @contents: (out) (array length=length) (element-type guint8): location to store an allocated string, use g_free() to free * the returned string * @length: (allow-none): location to store length in bytes of the contents, or %NULL * @error: return location for a #GError, or %NULL * * Reads an entire file into allocated memory, with good error * checking. * * If the call was successful, it returns %TRUE and sets @contents to the file * contents and @length to the length of the file contents in bytes. The string * stored in @contents will be nul-terminated, so for text files you can pass * %NULL for the @length argument. If the call was not successful, it returns * %FALSE and sets @error. The error domain is #G_FILE_ERROR. Possible error * codes are those in the #GFileError enumeration. In the error case, * @contents is set to %NULL and @length is set to zero. * * Return value: %TRUE on success, %FALSE if an error occurred **/ gboolean g_file_get_contents (const gchar *filename, gchar **contents, gsize *length, GError **error) { g_return_val_if_fail (filename != NULL, FALSE); g_return_val_if_fail (contents != NULL, FALSE); *contents = NULL; if (length) *length = 0; #ifdef G_OS_WIN32 return get_contents_win32 (filename, contents, length, error); #else return get_contents_posix (filename, contents, length, error); #endif } static gboolean rename_file (const char *old_name, const char *new_name, GError **err) { errno = 0; if (g_rename (old_name, new_name) == -1) { int save_errno = errno; gchar *display_old_name = g_filename_display_name (old_name); gchar *display_new_name = g_filename_display_name (new_name); g_set_error (err, G_FILE_ERROR, g_file_error_from_errno (save_errno), _("Failed to rename file '%s' to '%s': g_rename() failed: %s"), display_old_name, display_new_name, g_strerror (save_errno)); g_free (display_old_name); g_free (display_new_name); return FALSE; } return TRUE; } static 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, const gchar *dest_file, GError **err) { gchar *tmp_name; gchar *retval; gint fd; retval = NULL; tmp_name = g_strdup_printf ("%s.XXXXXX", dest_file); errno = 0; fd = g_mkstemp_full (tmp_name, O_RDWR | O_BINARY, 0666); if (fd == -1) { set_file_error (err, tmp_name, _("Failed to create file '%s': %s")); goto out; } #ifdef HAVE_FALLOCATE if (length > 0) { /* We do this on a 'best effort' basis... It may not be supported * on the underlying filesystem. */ (void) fallocate (fd, 0, 0, length); } #endif while (length > 0) { gssize s; s = write (fd, contents, length); if (s < 0) { if (errno == EINTR) continue; set_file_error (err, tmp_name, _("Failed to write file '%s': write() failed: %s")); close (fd); g_unlink (tmp_name); goto out; } g_assert (s <= length); contents += s; length -= s; } #ifdef BTRFS_SUPER_MAGIC { struct statfs buf; /* On Linux, on btrfs, skip the fsync since rename-over-existing is * guaranteed to be atomic and this is the only case in which we * would fsync() anyway. */ if (fstatfs (fd, &buf) == 0 && buf.f_type == BTRFS_SUPER_MAGIC) goto no_fsync; } #endif #ifdef HAVE_FSYNC { struct stat statbuf; errno = 0; /* If the final destination exists and is > 0 bytes, we want to sync the * newly written file to ensure the data is on disk when we rename over * the destination. Otherwise if we get a system crash we can lose both * 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 (fd) != 0) { set_file_error (err, tmp_name, _("Failed to write file '%s': fsync() failed: %s")); close (fd); g_unlink (tmp_name); goto out; } } #endif #ifdef BTRFS_SUPER_MAGIC no_fsync: #endif errno = 0; if (!g_close (fd, err)) { g_unlink (tmp_name); goto out; } retval = g_strdup (tmp_name); out: g_free (tmp_name); return retval; } /** * g_file_set_contents: * @filename: (type filename): name of a file to write @contents to, in the GLib file name * encoding * @contents: (array length=length) (element-type guint8): string to write to the file * @length: length of @contents, or -1 if @contents is a nul-terminated string * @error: return location for a #GError, or %NULL * * Writes all of @contents to a file named @filename, with good error checking. * If a file called @filename already exists it will be overwritten. * * This write is atomic in the sense that it is first written to a temporary * file which is then renamed to the final name. Notes: * * * On Unix, if @filename already exists hard links to @filename will break. * Also since the file is recreated, existing permissions, access control * lists, metadata etc. may be lost. If @filename is a symbolic link, * the link itself will be replaced, not the linked file. * * * On Windows renaming a file will not remove an existing file with the * new name, so on Windows there is a race condition between the existing * file being removed and the temporary file being renamed. * * * On Windows there is no way to remove a file that is open to some * process, or mapped into memory. Thus, this function will fail if * @filename already exists and is open. * * * * If the call was successful, it returns %TRUE. If the call was not successful, * it returns %FALSE and sets @error. The error domain is #G_FILE_ERROR. * Possible error codes are those in the #GFileError enumeration. * * Note that the name for the temporary file is constructed by appending up * to 7 characters to @filename. * * Return value: %TRUE on success, %FALSE if an error occurred * * Since: 2.8 **/ gboolean g_file_set_contents (const gchar *filename, const gchar *contents, gssize length, GError **error) { gchar *tmp_filename; gboolean retval; GError *rename_error = NULL; g_return_val_if_fail (filename != NULL, FALSE); g_return_val_if_fail (error == NULL || *error == NULL, FALSE); g_return_val_if_fail (contents != NULL || length == 0, FALSE); g_return_val_if_fail (length >= -1, FALSE); if (length == -1) length = strlen (contents); tmp_filename = write_to_temp_file (contents, length, filename, error); if (!tmp_filename) { retval = FALSE; goto out; } if (!rename_file (tmp_filename, filename, &rename_error)) { #ifndef G_OS_WIN32 g_unlink (tmp_filename); g_propagate_error (error, rename_error); retval = FALSE; goto out; #else /* G_OS_WIN32 */ /* Renaming failed, but on Windows this may just mean * the file already exists. So if the target file * exists, try deleting it and do the rename again. */ if (!g_file_test (filename, G_FILE_TEST_EXISTS)) { g_unlink (tmp_filename); g_propagate_error (error, rename_error); retval = FALSE; goto out; } g_error_free (rename_error); if (g_unlink (filename) == -1) { gchar *display_filename = g_filename_display_name (filename); int save_errno = errno; g_set_error (error, G_FILE_ERROR, g_file_error_from_errno (save_errno), _("Existing file '%s' could not be removed: g_unlink() failed: %s"), display_filename, g_strerror (save_errno)); g_free (display_filename); g_unlink (tmp_filename); retval = FALSE; goto out; } if (!rename_file (tmp_filename, filename, error)) { g_unlink (tmp_filename); retval = FALSE; goto out; } #endif } retval = TRUE; out: g_free (tmp_filename); return retval; } /* * 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) (const gchar *, gint, gint); static gint get_tmp_file (gchar *tmpl, GTmpFileCallback f, int flags, int mode) { char *XXXXXX; int count, fd; static const char letters[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; static const int NLETTERS = sizeof (letters) - 1; glong value; GTimeVal tv; static int counter = 0; g_return_val_if_fail (tmpl != NULL, -1); /* find the last occurrence of "XXXXXX" */ XXXXXX = g_strrstr (tmpl, "XXXXXX"); if (!XXXXXX || strncmp (XXXXXX, "XXXXXX", 6)) { errno = EINVAL; return -1; } /* Get some more or less random data. */ g_get_current_time (&tv); value = (tv.tv_usec ^ tv.tv_sec) + counter++; for (count = 0; count < 100; value += 7777, ++count) { glong v = value; /* Fill in the random bits. */ XXXXXX[0] = letters[v % NLETTERS]; v /= NLETTERS; XXXXXX[1] = letters[v % NLETTERS]; v /= NLETTERS; XXXXXX[2] = letters[v % NLETTERS]; v /= NLETTERS; XXXXXX[3] = letters[v % NLETTERS]; v /= NLETTERS; XXXXXX[4] = letters[v % NLETTERS]; v /= NLETTERS; XXXXXX[5] = letters[v % NLETTERS]; fd = f (tmpl, flags, mode); if (fd >= 0) return fd; else if (errno != EEXIST) /* Any other error will apply also to other names we might * try, and there are 2^32 or so of them, so give up now. */ return -1; } /* We got out of the loop because we ran out of combinations to try. */ errno = EEXIST; return -1; } /* 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_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 (filename, mode); } static gint wrap_g_open (const gchar *filename, int flags, int mode) { return g_open (filename, flags, mode); } /** * g_mkdtemp_full: * @tmpl: (type filename): template directory name * @mode: permissions to create the temporary directory with * * Creates a temporary directory. See the mkdtemp() documentation * on most UNIX-like systems. * * The parameter is a string that should follow the rules for * mkdtemp() templates, i.e. contain the string "XXXXXX". * g_mkdtemp() is slightly more flexible than mkdtemp() in that the * sequence does not have to occur at the very end of the template * and you can pass a @mode. The X string will be modified to form * the name of a directory that didn't exist. The string should be * in the GLib file name encoding. Most importantly, on Windows it * should be in UTF-8. * * Return value: A pointer to @tmpl, which has been modified * to hold the directory name. In case of errors, %NULL is * returned, and %errno will be set. * * Since: 2.30 */ gchar * g_mkdtemp_full (gchar *tmpl, gint mode) { if (get_tmp_file (tmpl, wrap_g_mkdir, 0, mode) == -1) return NULL; else return tmpl; } /** * g_mkdtemp: * @tmpl: (type filename): template directory name * * Creates a temporary directory. See the mkdtemp() documentation * on most UNIX-like systems. * * The parameter is a string that should follow the rules for * mkdtemp() templates, i.e. contain the string "XXXXXX". * g_mkdtemp() is slightly more flexible than mkdtemp() in that the * sequence does not have to occur at the very end of the template * and you can pass a @mode and additional @flags. The X string will * be modified to form the name of a directory that didn't exist. * The string should be in the GLib file name encoding. Most importantly, * on Windows it should be in UTF-8. * * Return value: A pointer to @tmpl, which has been modified * to hold the directory name. In case of errors, %NULL is * returned and %errno will be set. * * Since: 2.30 */ gchar * g_mkdtemp (gchar *tmpl) { return g_mkdtemp_full (tmpl, 0700); } /** * g_mkstemp_full: * @tmpl: (type filename): template filename * @flags: flags to pass to an open() call in addition to O_EXCL * and O_CREAT, which are passed automatically * @mode: permissions to create the temporary file with * * Opens a temporary file. See the mkstemp() documentation * on most UNIX-like systems. * * The parameter is a string that should follow the rules for * mkstemp() templates, i.e. contain the string "XXXXXX". * g_mkstemp_full() is slightly more flexible than mkstemp() * in that the sequence does not have to occur at the very end of the * template and you can pass a @mode and additional @flags. The X * string will be modified to form the name of a file that didn't exist. * The string should be in the GLib file name encoding. Most importantly, * on Windows it should be in UTF-8. * * Return value: A file handle (as from open()) to the file * opened for reading and writing. The file handle should be * closed with close(). In case of errors, -1 is returned * and %errno will be set. * * Since: 2.22 */ gint g_mkstemp_full (gchar *tmpl, gint flags, gint mode) { /* tmpl is in UTF-8 on Windows, thus use g_open() */ return get_tmp_file (tmpl, wrap_g_open, flags | O_CREAT | O_EXCL, mode); } /** * g_mkstemp: * @tmpl: (type filename): template filename * * Opens a temporary file. See the mkstemp() documentation * on most UNIX-like systems. * * The parameter is a string that should follow the rules for * mkstemp() templates, i.e. contain the string "XXXXXX". * g_mkstemp() is slightly more flexible than mkstemp() in that the * sequence does not have to occur at the very end of the template. * The X string will be modified to form the name of a file that * didn't exist. The string should be in the GLib file name encoding. * Most importantly, on Windows it should be in UTF-8. * * Return value: A file handle (as from open()) to the file * opened for reading and writing. The file is opened in binary * mode on platforms where there is a difference. The file handle * should be closed with close(). In case of errors, -1 is * returned and %errno will be set. */ gint g_mkstemp (gchar *tmpl) { return g_mkstemp_full (tmpl, O_RDWR | O_BINARY, 0600); } static gint g_get_tmp_name (const gchar *tmpl, gchar **name_used, GTmpFileCallback f, gint flags, gint mode, GError **error) { int retval; const char *tmpdir; const char *sep; char *fulltemplate; const char *slash; if (tmpl == NULL) tmpl = ".XXXXXX"; if ((slash = strchr (tmpl, G_DIR_SEPARATOR)) != NULL #ifdef G_OS_WIN32 || (strchr (tmpl, '/') != NULL && (slash = "/")) #endif ) { gchar *display_tmpl = g_filename_display_name (tmpl); char c[2]; c[0] = *slash; c[1] = '\0'; g_set_error (error, G_FILE_ERROR, G_FILE_ERROR_FAILED, _("Template '%s' invalid, should not contain a '%s'"), display_tmpl, c); g_free (display_tmpl); return -1; } if (strstr (tmpl, "XXXXXX") == NULL) { gchar *display_tmpl = g_filename_display_name (tmpl); g_set_error (error, G_FILE_ERROR, G_FILE_ERROR_FAILED, _("Template '%s' doesn't contain XXXXXX"), display_tmpl); g_free (display_tmpl); return -1; } tmpdir = g_get_tmp_dir (); if (G_IS_DIR_SEPARATOR (tmpdir [strlen (tmpdir) - 1])) sep = ""; else sep = G_DIR_SEPARATOR_S; fulltemplate = g_strconcat (tmpdir, sep, tmpl, NULL); retval = get_tmp_file (fulltemplate, f, flags, mode); if (retval == -1) { int save_errno = errno; gchar *display_fulltemplate = g_filename_display_name (fulltemplate); g_set_error (error, G_FILE_ERROR, g_file_error_from_errno (save_errno), _("Failed to create file '%s': %s"), display_fulltemplate, g_strerror (save_errno)); g_free (display_fulltemplate); g_free (fulltemplate); return -1; } *name_used = fulltemplate; return retval; } /** * g_file_open_tmp: * @tmpl: (type filename) (allow-none): Template for file name, as in * g_mkstemp(), basename only, or %NULL for a default template * @name_used: (out) (type filename): location to store actual name used, * or %NULL * @error: return location for a #GError * * Opens a file for writing in the preferred directory for temporary * files (as returned by g_get_tmp_dir()). * * @tmpl should be a string in the GLib file name encoding containing * a sequence of six 'X' characters, as the parameter to g_mkstemp(). * However, unlike these functions, the template should only be a * basename, no directory components are allowed. If template is * %NULL, a default template is used. * * Note that in contrast to g_mkstemp() (and mkstemp()) @tmpl is not * modified, and might thus be a read-only literal string. * * Upon success, and if @name_used is non-%NULL, the actual name used * is returned in @name_used. This string should be freed with g_free() * when not needed any longer. The returned name is in the GLib file * name encoding. * * Return value: A file handle (as from open()) to the file opened for * reading and writing. The file is opened in binary mode on platforms * where there is a difference. The file handle should be closed with * close(). In case of errors, -1 is returned and @error will be set. */ gint g_file_open_tmp (const gchar *tmpl, gchar **name_used, GError **error) { gchar *fulltemplate; gint result; result = g_get_tmp_name (tmpl, &fulltemplate, wrap_g_open, O_CREAT | O_EXCL | O_RDWR | O_BINARY, 0600, error); if (result != -1) { if (name_used) *name_used = fulltemplate; else g_free (fulltemplate); } return result; } /** * g_dir_make_tmp: * @tmpl: (type filename) (allow-none): Template for directory name, * as in g_mkdtemp(), basename only, or %NULL for a default template * @error: return location for a #GError * * Creates a subdirectory in the preferred directory for temporary * files (as returned by g_get_tmp_dir()). * * @tmpl should be a string in the GLib file name encoding containing * a sequence of six 'X' characters, as the parameter to g_mkstemp(). * However, unlike these functions, the template should only be a * basename, no directory components are allowed. If template is * %NULL, a default template is used. * * Note that in contrast to g_mkdtemp() (and mkdtemp()) @tmpl is not * modified, and might thus be a read-only literal string. * * Return value: (type filename): The actual name used. This string * should be freed with g_free() when not needed any longer and is * is in the GLib file name encoding. In case of errors, %NULL is * returned and @error will be set. * * Since: 2.30 */ gchar * g_dir_make_tmp (const gchar *tmpl, GError **error) { gchar *fulltemplate; if (g_get_tmp_name (tmpl, &fulltemplate, wrap_g_mkdir, 0, 0700, error) == -1) return NULL; else return fulltemplate; } static gchar * g_build_path_va (const gchar *separator, const gchar *first_element, va_list *args, gchar **str_array) { GString *result; gint separator_len = strlen (separator); gboolean is_first = TRUE; gboolean have_leading = FALSE; const gchar *single_element = NULL; const gchar *next_element; const gchar *last_trailing = NULL; gint i = 0; result = g_string_new (NULL); if (str_array) next_element = str_array[i++]; else next_element = first_element; while (TRUE) { const gchar *element; const gchar *start; const gchar *end; if (next_element) { element = next_element; if (str_array) next_element = str_array[i++]; else next_element = va_arg (*args, gchar *); } else break; /* Ignore empty elements */ if (!*element) continue; start = element; if (separator_len) { while (strncmp (start, separator, separator_len) == 0) start += separator_len; } end = start + strlen (start); if (separator_len) { while (end >= start + separator_len && strncmp (end - separator_len, separator, separator_len) == 0) end -= separator_len; last_trailing = end; while (last_trailing >= element + separator_len && strncmp (last_trailing - separator_len, separator, separator_len) == 0) last_trailing -= separator_len; if (!have_leading) { /* If the leading and trailing separator strings are in the * same element and overlap, the result is exactly that element */ if (last_trailing <= start) single_element = element; g_string_append_len (result, element, start - element); have_leading = TRUE; } else single_element = NULL; } if (end == start) continue; if (!is_first) g_string_append (result, separator); g_string_append_len (result, start, end - start); is_first = FALSE; } if (single_element) { g_string_free (result, TRUE); return g_strdup (single_element); } else { if (last_trailing) g_string_append (result, last_trailing); return g_string_free (result, FALSE); } } /** * g_build_pathv: * @separator: a string used to separator the elements of the path. * @args: (array zero-terminated=1): %NULL-terminated array of strings containing the path elements. * * Behaves exactly like g_build_path(), but takes the path elements * as a string array, instead of varargs. This function is mainly * meant for language bindings. * * Return value: a newly-allocated string that must be freed with g_free(). * * Since: 2.8 */ gchar * g_build_pathv (const gchar *separator, gchar **args) { if (!args) return NULL; return g_build_path_va (separator, NULL, NULL, args); } /** * g_build_path: * @separator: a string used to separator the elements of the path. * @first_element: the first element in the path * @...: remaining elements in path, terminated by %NULL * * Creates a path from a series of elements using @separator as the * separator between elements. At the boundary between two elements, * any trailing occurrences of separator in the first element, or * leading occurrences of separator in the second element are removed * and exactly one copy of the separator is inserted. * * Empty elements are ignored. * * The number of leading copies of the separator on the result is * the same as the number of leading copies of the separator on * the first non-empty element. * * The number of trailing copies of the separator on the result is * the same as the number of trailing copies of the separator on * the last non-empty element. (Determination of the number of * trailing copies is done without stripping leading copies, so * if the separator is ABA, ABABA * has 1 trailing copy.) * * However, if there is only a single non-empty element, and there * are no characters in that element not part of the leading or * trailing separators, then the result is exactly the original value * of that element. * * Other than for determination of the number of leading and trailing * copies of the separator, elements consisting only of copies * of the separator are ignored. * * Return value: a newly-allocated string that must be freed with g_free(). **/ gchar * g_build_path (const gchar *separator, const gchar *first_element, ...) { gchar *str; va_list args; g_return_val_if_fail (separator != NULL, NULL); va_start (args, first_element); str = g_build_path_va (separator, first_element, &args, NULL); va_end (args); return str; } #ifdef G_OS_WIN32 static gchar * g_build_pathname_va (const gchar *first_element, va_list *args, gchar **str_array) { /* Code copied from g_build_pathv(), and modified to use two * alternative single-character separators. */ GString *result; gboolean is_first = TRUE; gboolean have_leading = FALSE; const gchar *single_element = NULL; const gchar *next_element; const gchar *last_trailing = NULL; gchar current_separator = '\\'; gint i = 0; result = g_string_new (NULL); if (str_array) next_element = str_array[i++]; else next_element = first_element; while (TRUE) { const gchar *element; const gchar *start; const gchar *end; if (next_element) { element = next_element; if (str_array) next_element = str_array[i++]; else next_element = va_arg (*args, gchar *); } else break; /* Ignore empty elements */ if (!*element) continue; start = element; if (TRUE) { while (start && (*start == '\\' || *start == '/')) { current_separator = *start; start++; } } end = start + strlen (start); if (TRUE) { while (end >= start + 1 && (end[-1] == '\\' || end[-1] == '/')) { current_separator = end[-1]; end--; } last_trailing = end; while (last_trailing >= element + 1 && (last_trailing[-1] == '\\' || last_trailing[-1] == '/')) last_trailing--; if (!have_leading) { /* If the leading and trailing separator strings are in the * same element and overlap, the result is exactly that element */ if (last_trailing <= start) single_element = element; g_string_append_len (result, element, start - element); have_leading = TRUE; } else single_element = NULL; } if (end == start) continue; if (!is_first) g_string_append_len (result, ¤t_separator, 1); g_string_append_len (result, start, end - start); is_first = FALSE; } if (single_element) { g_string_free (result, TRUE); return g_strdup (single_element); } else { if (last_trailing) g_string_append (result, last_trailing); return g_string_free (result, FALSE); } } #endif /** * g_build_filenamev: * @args: (array zero-terminated=1): %NULL-terminated array of strings containing the path elements. * * Behaves exactly like g_build_filename(), but takes the path elements * as a string array, instead of varargs. This function is mainly * meant for language bindings. * * Return value: a newly-allocated string that must be freed with g_free(). * * Since: 2.8 */ gchar * g_build_filenamev (gchar **args) { gchar *str; #ifndef G_OS_WIN32 str = g_build_path_va (G_DIR_SEPARATOR_S, NULL, NULL, args); #else str = g_build_pathname_va (NULL, NULL, args); #endif return str; } /** * g_build_filename: * @first_element: the first element in the path * @...: remaining elements in path, terminated by %NULL * * Creates a filename from a series of elements using the correct * separator for filenames. * * On Unix, this function behaves identically to g_build_path * (G_DIR_SEPARATOR_S, first_element, ....). * * On Windows, it takes into account that either the backslash * (\ or slash (/) can be used * as separator in filenames, but otherwise behaves as on Unix. When * file pathname separators need to be inserted, the one that last * previously occurred in the parameters (reading from left to right) * is used. * * No attempt is made to force the resulting filename to be an absolute * path. If the first element is a relative path, the result will * be a relative path. * * Return value: a newly-allocated string that must be freed with g_free(). **/ gchar * g_build_filename (const gchar *first_element, ...) { gchar *str; va_list args; va_start (args, first_element); #ifndef G_OS_WIN32 str = g_build_path_va (G_DIR_SEPARATOR_S, first_element, &args, NULL); #else str = g_build_pathname_va (first_element, &args, NULL); #endif va_end (args); return str; } /** * g_file_read_link: * @filename: the symbolic link * @error: return location for a #GError * * Reads the contents of the symbolic link @filename like the POSIX * readlink() function. The returned string is in the encoding used * for filenames. Use g_filename_to_utf8() to convert it to UTF-8. * * Returns: A newly-allocated string with the contents of the symbolic link, * or %NULL if an error occurred. * * Since: 2.4 */ gchar * g_file_read_link (const gchar *filename, GError **error) { #ifdef HAVE_READLINK gchar *buffer; guint size; gint read_size; size = 256; buffer = g_malloc (size); while (TRUE) { read_size = readlink (filename, buffer, size); if (read_size < 0) { int save_errno = errno; gchar *display_filename = g_filename_display_name (filename); g_free (buffer); g_set_error (error, G_FILE_ERROR, g_file_error_from_errno (save_errno), _("Failed to read the symbolic link '%s': %s"), display_filename, g_strerror (save_errno)); g_free (display_filename); return NULL; } if (read_size < size) { buffer[read_size] = 0; return buffer; } size *= 2; buffer = g_realloc (buffer, size); } #else g_set_error_literal (error, G_FILE_ERROR, G_FILE_ERROR_INVAL, _("Symbolic links not supported")); return NULL; #endif } /** * g_path_is_absolute: * @file_name: a file name * * Returns %TRUE if the given @file_name is an absolute file name. * Note that this is a somewhat vague concept on Windows. * * On POSIX systems, an absolute file name is well-defined. It always * starts from the single root directory. For example "/usr/local". * * On Windows, the concepts of current drive and drive-specific * current directory introduce vagueness. This function interprets as * an absolute file name one that either begins with a directory * separator such as "\Users\tml" or begins with the root on a drive, * for example "C:\Windows". The first case also includes UNC paths * such as "\\myserver\docs\foo". In all cases, either slashes or * backslashes are accepted. * * Note that a file name relative to the current drive root does not * truly specify a file uniquely over time and across processes, as * the current drive is a per-process value and can be changed. * * File names relative the current directory on some specific drive, * such as "D:foo/bar", are not interpreted as absolute by this * function, but they obviously are not relative to the normal current * directory as returned by getcwd() or g_get_current_dir() * either. Such paths should be avoided, or need to be handled using * Windows-specific code. * * Returns: %TRUE if @file_name is absolute */ gboolean g_path_is_absolute (const gchar *file_name) { g_return_val_if_fail (file_name != NULL, FALSE); if (G_IS_DIR_SEPARATOR (file_name[0])) return TRUE; #ifdef G_OS_WIN32 /* Recognize drive letter on native Windows */ if (g_ascii_isalpha (file_name[0]) && file_name[1] == ':' && G_IS_DIR_SEPARATOR (file_name[2])) return TRUE; #endif return FALSE; } /** * g_path_skip_root: * @file_name: a file name * * Returns a pointer into @file_name after the root component, * i.e. after the "/" in UNIX or "C:\" under Windows. If @file_name * is not an absolute path it returns %NULL. * * Returns: a pointer into @file_name after the root component */ const gchar * g_path_skip_root (const gchar *file_name) { g_return_val_if_fail (file_name != NULL, NULL); #ifdef G_PLATFORM_WIN32 /* Skip \\server\share or //server/share */ if (G_IS_DIR_SEPARATOR (file_name[0]) && G_IS_DIR_SEPARATOR (file_name[1]) && file_name[2] && !G_IS_DIR_SEPARATOR (file_name[2])) { gchar *p; p = strchr (file_name + 2, G_DIR_SEPARATOR); #ifdef G_OS_WIN32 { gchar *q; q = strchr (file_name + 2, '/'); if (p == NULL || (q != NULL && q < p)) p = q; } #endif if (p && p > file_name + 2 && p[1]) { file_name = p + 1; while (file_name[0] && !G_IS_DIR_SEPARATOR (file_name[0])) file_name++; /* Possibly skip a backslash after the share name */ if (G_IS_DIR_SEPARATOR (file_name[0])) file_name++; return (gchar *)file_name; } } #endif /* Skip initial slashes */ if (G_IS_DIR_SEPARATOR (file_name[0])) { while (G_IS_DIR_SEPARATOR (file_name[0])) file_name++; return (gchar *)file_name; } #ifdef G_OS_WIN32 /* Skip X:\ */ if (g_ascii_isalpha (file_name[0]) && file_name[1] == ':' && G_IS_DIR_SEPARATOR (file_name[2])) return (gchar *)file_name + 3; #endif return NULL; } /** * g_basename: * @file_name: the name of the file * * Gets the name of the file without any leading directory * components. It returns a pointer into the given file name * string. * * Return value: the name of the file without any leading * directory components * * Deprecated:2.2: Use g_path_get_basename() instead, but notice * that g_path_get_basename() allocates new memory for the * returned string, unlike this function which returns a pointer * into the argument. */ const gchar * g_basename (const gchar *file_name) { gchar *base; g_return_val_if_fail (file_name != NULL, NULL); base = strrchr (file_name, G_DIR_SEPARATOR); #ifdef G_OS_WIN32 { gchar *q; q = strrchr (file_name, '/'); if (base == NULL || (q != NULL && q > base)) base = q; } #endif if (base) return base + 1; #ifdef G_OS_WIN32 if (g_ascii_isalpha (file_name[0]) && file_name[1] == ':') return (gchar*) file_name + 2; #endif return (gchar*) file_name; } /** * g_path_get_basename: * @file_name: the name of the file * * Gets the last component of the filename. * * If @file_name ends with a directory separator it gets the component * before the last slash. If @file_name consists only of directory * separators (and on Windows, possibly a drive letter), a single * separator is returned. If @file_name is empty, it gets ".". * * Return value: a newly allocated string containing the last * component of the filename */ gchar * g_path_get_basename (const gchar *file_name) { gssize base; gssize last_nonslash; gsize len; gchar *retval; g_return_val_if_fail (file_name != NULL, NULL); if (file_name[0] == '\0') return g_strdup ("."); last_nonslash = strlen (file_name) - 1; while (last_nonslash >= 0 && G_IS_DIR_SEPARATOR (file_name [last_nonslash])) last_nonslash--; if (last_nonslash == -1) /* string only containing slashes */ return g_strdup (G_DIR_SEPARATOR_S); #ifdef G_OS_WIN32 if (last_nonslash == 1 && g_ascii_isalpha (file_name[0]) && file_name[1] == ':') /* string only containing slashes and a drive */ return g_strdup (G_DIR_SEPARATOR_S); #endif base = last_nonslash; while (base >=0 && !G_IS_DIR_SEPARATOR (file_name [base])) base--; #ifdef G_OS_WIN32 if (base == -1 && g_ascii_isalpha (file_name[0]) && file_name[1] == ':') base = 1; #endif /* G_OS_WIN32 */ len = last_nonslash - base; retval = g_malloc (len + 1); memcpy (retval, file_name + base + 1, len); retval [len] = '\0'; return retval; } /** * g_dirname: * @file_name: the name of the file * * Gets the directory components of a file name. * * If the file name has no directory components "." is returned. * The returned string should be freed when no longer needed. * * Returns: the directory components of the file * * Deprecated: use g_path_get_dirname() instead */ /** * g_path_get_dirname: * @file_name: the name of the file * * Gets the directory components of a file name. * * If the file name has no directory components "." is returned. * The returned string should be freed when no longer needed. * * Returns: the directory components of the file */ gchar * g_path_get_dirname (const gchar *file_name) { gchar *base; gsize len; g_return_val_if_fail (file_name != NULL, NULL); base = strrchr (file_name, G_DIR_SEPARATOR); #ifdef G_OS_WIN32 { gchar *q; q = strrchr (file_name, '/'); if (base == NULL || (q != NULL && q > base)) base = q; } #endif if (!base) { #ifdef G_OS_WIN32 if (g_ascii_isalpha (file_name[0]) && file_name[1] == ':') { gchar drive_colon_dot[4]; drive_colon_dot[0] = file_name[0]; drive_colon_dot[1] = ':'; drive_colon_dot[2] = '.'; drive_colon_dot[3] = '\0'; return g_strdup (drive_colon_dot); } #endif return g_strdup ("."); } while (base > file_name && G_IS_DIR_SEPARATOR (*base)) base--; #ifdef G_OS_WIN32 /* base points to the char before the last slash. * * In case file_name is the root of a drive (X:\) or a child of the * root of a drive (X:\foo), include the slash. * * In case file_name is the root share of an UNC path * (\\server\share), add a slash, returning \\server\share\ . * * In case file_name is a direct child of a share in an UNC path * (\\server\share\foo), include the slash after the share name, * returning \\server\share\ . */ if (base == file_name + 1 && g_ascii_isalpha (file_name[0]) && file_name[1] == ':') base++; else if (G_IS_DIR_SEPARATOR (file_name[0]) && G_IS_DIR_SEPARATOR (file_name[1]) && file_name[2] && !G_IS_DIR_SEPARATOR (file_name[2]) && base >= file_name + 2) { const gchar *p = file_name + 2; while (*p && !G_IS_DIR_SEPARATOR (*p)) p++; if (p == base + 1) { len = (guint) strlen (file_name) + 1; base = g_new (gchar, len + 1); strcpy (base, file_name); base[len-1] = G_DIR_SEPARATOR; base[len] = 0; return base; } if (G_IS_DIR_SEPARATOR (*p)) { p++; while (*p && !G_IS_DIR_SEPARATOR (*p)) p++; if (p == base + 1) base++; } } #endif len = (guint) 1 + base - file_name; base = g_new (gchar, len + 1); g_memmove (base, file_name, len); base[len] = 0; return base; } #if defined(MAXPATHLEN) #define G_PATH_LENGTH MAXPATHLEN #elif defined(PATH_MAX) #define G_PATH_LENGTH PATH_MAX #elif defined(_PC_PATH_MAX) #define G_PATH_LENGTH sysconf(_PC_PATH_MAX) #else #define G_PATH_LENGTH 2048 #endif /** * g_get_current_dir: * * Gets the current directory. * * The returned string should be freed when no longer needed. * The encoding of the returned string is system defined. * On Windows, it is always UTF-8. * * Returns: the current directory */ gchar * g_get_current_dir (void) { #ifdef G_OS_WIN32 gchar *dir = NULL; wchar_t dummy[2], *wdir; int len; len = GetCurrentDirectoryW (2, dummy); wdir = g_new (wchar_t, len); if (GetCurrentDirectoryW (len, wdir) == len - 1) dir = g_utf16_to_utf8 (wdir, -1, NULL, NULL, NULL); g_free (wdir); if (dir == NULL) dir = g_strdup ("\\"); return dir; #else gchar *buffer = NULL; gchar *dir = NULL; static gulong max_len = 0; if (max_len == 0) max_len = (G_PATH_LENGTH == -1) ? 2048 : G_PATH_LENGTH; /* We don't use getcwd(3) on SUNOS, because, it does a popen("pwd") * and, if that wasn't bad enough, hangs in doing so. */ #if (defined (sun) && !defined (__SVR4)) || !defined(HAVE_GETCWD) buffer = g_new (gchar, max_len + 1); *buffer = 0; dir = getwd (buffer); #else while (max_len < G_MAXULONG / 2) { g_free (buffer); buffer = g_new (gchar, max_len + 1); *buffer = 0; dir = getcwd (buffer, max_len); if (dir || errno != ERANGE) break; max_len *= 2; } #endif /* !sun || !HAVE_GETCWD */ if (!dir || !*buffer) { /* hm, should we g_error() out here? * this can happen if e.g. "./" has mode \0000 */ buffer[0] = G_DIR_SEPARATOR; buffer[1] = 0; } dir = g_strdup (buffer); g_free (buffer); return dir; #endif /* !G_OS_WIN32 */ } /* NOTE : Keep this part last to ensure nothing in this file uses thn * below binary compatibility versions. */ #if defined (G_OS_WIN32) && !defined (_WIN64) /* Binary compatibility versions. Will be called by code compiled * against quite old (pre-2.8, I think) headers only, not from more * recently compiled code. */ #undef g_file_test gboolean g_file_test (const gchar *filename, GFileTest test) { gchar *utf8_filename = g_locale_to_utf8 (filename, -1, NULL, NULL, NULL); gboolean retval; if (utf8_filename == NULL) return FALSE; retval = g_file_test_utf8 (utf8_filename, test); g_free (utf8_filename); return retval; } #undef g_file_get_contents gboolean g_file_get_contents (const gchar *filename, gchar **contents, gsize *length, GError **error) { gchar *utf8_filename = g_locale_to_utf8 (filename, -1, NULL, NULL, error); gboolean retval; if (utf8_filename == NULL) return FALSE; retval = g_file_get_contents_utf8 (utf8_filename, contents, length, error); g_free (utf8_filename); return retval; } #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, wrap_libc_open, O_RDWR | O_CREAT | O_EXCL, 0600); } #undef g_file_open_tmp gint g_file_open_tmp (const gchar *tmpl, gchar **name_used, GError **error) { gchar *utf8_tmpl = g_locale_to_utf8 (tmpl, -1, NULL, NULL, error); gchar *utf8_name_used; gint retval; if (utf8_tmpl == NULL) return -1; retval = g_file_open_tmp_utf8 (utf8_tmpl, &utf8_name_used, error); if (retval == -1) return -1; if (name_used) *name_used = g_locale_from_utf8 (utf8_name_used, -1, NULL, NULL, NULL); g_free (utf8_name_used); return retval; } #undef g_get_current_dir gchar * g_get_current_dir (void) { gchar *utf8_dir = g_get_current_dir_utf8 (); gchar *dir = g_locale_from_utf8 (utf8_dir, -1, NULL, NULL, NULL); g_free (utf8_dir); return dir; } #endif pkg-config-0.29.1/glib/glib/gtestutils.h0000664000175000017500000005165212651243552015002 00000000000000/* GLib testing utilities * Copyright (C) 2007 Imendio AB * Authors: Tim Janik * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __G_TEST_UTILS_H__ #define __G_TEST_UTILS_H__ #if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) #error "Only can be included directly." #endif #include #include #include #include G_BEGIN_DECLS typedef struct GTestCase GTestCase; typedef struct GTestSuite GTestSuite; typedef void (*GTestFunc) (void); typedef void (*GTestDataFunc) (gconstpointer user_data); typedef void (*GTestFixtureFunc) (gpointer fixture, gconstpointer user_data); /* assertion API */ #define g_assert_cmpstr(s1, cmp, s2) do { const char *__s1 = (s1), *__s2 = (s2); \ if (g_strcmp0 (__s1, __s2) cmp 0) ; else \ g_assertion_message_cmpstr (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, \ #s1 " " #cmp " " #s2, __s1, #cmp, __s2); } while (0) #define g_assert_cmpint(n1, cmp, n2) do { gint64 __n1 = (n1), __n2 = (n2); \ if (__n1 cmp __n2) ; else \ g_assertion_message_cmpnum (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, \ #n1 " " #cmp " " #n2, __n1, #cmp, __n2, 'i'); } while (0) #define g_assert_cmpuint(n1, cmp, n2) do { guint64 __n1 = (n1), __n2 = (n2); \ if (__n1 cmp __n2) ; else \ g_assertion_message_cmpnum (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, \ #n1 " " #cmp " " #n2, __n1, #cmp, __n2, 'i'); } while (0) #define g_assert_cmphex(n1, cmp, n2) do { guint64 __n1 = (n1), __n2 = (n2); \ if (__n1 cmp __n2) ; else \ g_assertion_message_cmpnum (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, \ #n1 " " #cmp " " #n2, __n1, #cmp, __n2, 'x'); } while (0) #define g_assert_cmpfloat(n1,cmp,n2) do { long double __n1 = (n1), __n2 = (n2); \ if (__n1 cmp __n2) ; else \ g_assertion_message_cmpnum (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, \ #n1 " " #cmp " " #n2, __n1, #cmp, __n2, 'f'); } while (0) #define g_assert_no_error(err) do { if (err) \ g_assertion_message_error (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, \ #err, err, 0, 0); } while (0) #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_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) #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) #define g_test_perf() (g_test_config_vars->test_perf) #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) \ G_STMT_START { \ void (*add_vtable) (const char*, \ gsize, \ gconstpointer, \ void (*) (Fixture*, gconstpointer), \ void (*) (Fixture*, gconstpointer), \ void (*) (Fixture*, gconstpointer)) = (void (*) (const gchar *, gsize, gconstpointer, void (*) (Fixture*, gconstpointer), void (*) (Fixture*, gconstpointer), void (*) (Fixture*, gconstpointer))) g_test_add_vtable; \ add_vtable \ (testpath, sizeof (Fixture), tdata, fsetup, ftest, fteardown); \ } 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) 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) #define g_test_trap_assert_stdout(soutpattern) g_test_trap_assertions (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, 2, soutpattern) #define g_test_trap_assert_stdout_unmatched(soutpattern) g_test_trap_assertions (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, 3, soutpattern) #define g_test_trap_assert_stderr(serrpattern) g_test_trap_assertions (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, 4, serrpattern) #define g_test_trap_assert_stderr_unmatched(serrpattern) g_test_trap_assertions (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, 5, serrpattern) /* 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); 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, const char *func, const char *expr, const char *arg1, const char *cmp, const char *arg2); GLIB_AVAILABLE_IN_ALL void g_assertion_message_cmpnum (const char *domain, const char *file, int line, const char *func, const char *expr, long double arg1, const char *cmp, long double arg2, char numtype); GLIB_AVAILABLE_IN_ALL void g_assertion_message_error (const char *domain, const char *file, int line, const char *func, const char *expr, const GError *error, GQuark error_domain, int error_code); GLIB_AVAILABLE_IN_ALL void g_test_add_vtable (const char *testpath, gsize data_size, gconstpointer test_data, GTestFixtureFunc data_setup, GTestFixtureFunc data_test, GTestFixtureFunc data_teardown); typedef struct { gboolean test_initialized; gboolean test_quick; /* disable thorough tests */ gboolean test_perf; /* run performance tests */ gboolean test_verbose; /* extra info */ gboolean test_quiet; /* reduce output */ gboolean test_undefined; /* run tests that are meant to assert */ } GTestConfig; GLIB_VAR const GTestConfig * const g_test_config_vars; /* internal logging API */ typedef enum { G_TEST_LOG_NONE, G_TEST_LOG_ERROR, /* s:msg */ G_TEST_LOG_START_BINARY, /* s:binaryname s:seed */ G_TEST_LOG_LIST_CASE, /* s:testpath */ G_TEST_LOG_SKIP_CASE, /* s:testpath */ G_TEST_LOG_START_CASE, /* s:testpath */ 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_START_SUITE, G_TEST_LOG_STOP_SUITE } GTestLogType; typedef struct { GTestLogType log_type; guint n_strings; gchar **strings; /* NULL terminated */ guint n_nums; long double *nums; } GTestLogMsg; typedef struct { /*< private >*/ GString *data; 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); /** * GTestLogFatalFunc: * @log_domain: the log domain of the message * @log_level: the log level of the message (including the fatal and recursion flags) * @message: the message to process * @user_data: user data, set in g_test_log_set_fatal_handler() * * Specifies the prototype of fatal log handler functions. * * Return value: %TRUE if the program should abort, %FALSE otherwise * * Since: 2.22 */ 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__ */ pkg-config-0.29.1/glib/glib/gmem.h0000664000175000017500000002700512651243552013513 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the GLib Team and others 1997-2000. See the AUTHORS * file for a list of people on the GLib Team. See the ChangeLog * files for a list of changes. These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/. */ #ifndef __G_MEM_H__ #define __G_MEM_H__ #if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) #error "Only can be included directly." #endif #include G_BEGIN_DECLS /** * GMemVTable: * @malloc: function to use for allocating memory. * @realloc: function to use for reallocating memory. * @free: function to use to free memory. * @calloc: function to use for allocating zero-filled memory. * @try_malloc: function to use for allocating memory without a default error handler. * @try_realloc: function to use for reallocating memory without a default error handler. * * A set of functions used to perform memory allocation. The same #GMemVTable must * be used for all allocations in the same program; a call to g_mem_set_vtable(), * if it exists, should be prior to any use of GLib. */ typedef struct _GMemVTable GMemVTable; #if GLIB_SIZEOF_VOID_P > GLIB_SIZEOF_LONG /** * G_MEM_ALIGN: * * Indicates the number of bytes to which memory will be aligned on the * current platform. */ # define G_MEM_ALIGN GLIB_SIZEOF_VOID_P #else /* GLIB_SIZEOF_VOID_P <= GLIB_SIZEOF_LONG */ # define G_MEM_ALIGN GLIB_SIZEOF_LONG #endif /* GLIB_SIZEOF_VOID_P <= GLIB_SIZEOF_LONG */ /* Memory allocation functions */ 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. */ #if defined (__GNUC__) && (__GNUC__ >= 2) && defined (__OPTIMIZE__) # define _G_NEW(struct_type, n_structs, func) \ (struct_type *) (G_GNUC_EXTENSION ({ \ gsize __n = (gsize) (n_structs); \ gsize __s = sizeof (struct_type); \ gpointer __p; \ if (__s == 1) \ __p = g_##func (__n); \ else if (__builtin_constant_p (__n) && \ (__s == 0 || __n <= G_MAXSIZE / __s)) \ __p = g_##func (__n * __s); \ else \ __p = g_##func##_n (__n, __s); \ __p; \ })) # define _G_RENEW(struct_type, mem, n_structs, func) \ (struct_type *) (G_GNUC_EXTENSION ({ \ gsize __n = (gsize) (n_structs); \ gsize __s = sizeof (struct_type); \ gpointer __p = (gpointer) (mem); \ if (__s == 1) \ __p = g_##func (__p, __n); \ else if (__builtin_constant_p (__n) && \ (__s == 0 || __n <= G_MAXSIZE / __s)) \ __p = g_##func (__p, __n * __s); \ else \ __p = g_##func##_n (__p, __n, __s); \ __p; \ })) #else /* Unoptimised version: always call the _n() function. */ #define _G_NEW(struct_type, n_structs, func) \ ((struct_type *) g_##func##_n ((n_structs), sizeof (struct_type))) #define _G_RENEW(struct_type, mem, n_structs, func) \ ((struct_type *) g_##func##_n (mem, (n_structs), sizeof (struct_type))) #endif /** * g_new: * @struct_type: the type of the elements to allocate * @n_structs: the number of elements to allocate * * Allocates @n_structs elements of type @struct_type. * The returned pointer is cast to a pointer to the given type. * If @n_structs is 0 it returns %NULL. * Care is taken to avoid overflow when calculating the size of the allocated block. * * Since the returned pointer is already casted to the right type, * it is normally unnecessary to cast it explicitly, and doing * so might hide memory allocation errors. * * Returns: a pointer to the allocated memory, cast to a pointer to @struct_type */ #define g_new(struct_type, n_structs) _G_NEW (struct_type, n_structs, malloc) /** * g_new0: * @struct_type: the type of the elements to allocate. * @n_structs: the number of elements to allocate. * * Allocates @n_structs elements of type @struct_type, initialized to 0's. * The returned pointer is cast to a pointer to the given type. * If @n_structs is 0 it returns %NULL. * Care is taken to avoid overflow when calculating the size of the allocated block. * * Since the returned pointer is already casted to the right type, * it is normally unnecessary to cast it explicitly, and doing * so might hide memory allocation errors. * * Returns: a pointer to the allocated memory, cast to a pointer to @struct_type. */ #define g_new0(struct_type, n_structs) _G_NEW (struct_type, n_structs, malloc0) /** * g_renew: * @struct_type: the type of the elements to allocate * @mem: the currently allocated memory * @n_structs: the number of elements to allocate * * Reallocates the memory pointed to by @mem, so that it now has space for * @n_structs elements of type @struct_type. It returns the new address of * the memory, which may have been moved. * Care is taken to avoid overflow when calculating the size of the allocated block. * * Returns: a pointer to the new allocated memory, cast to a pointer to @struct_type */ #define g_renew(struct_type, mem, n_structs) _G_RENEW (struct_type, mem, n_structs, realloc) /** * g_try_new: * @struct_type: the type of the elements to allocate * @n_structs: the number of elements to allocate * * Attempts to allocate @n_structs elements of type @struct_type, and returns * %NULL on failure. Contrast with g_new(), which aborts the program on failure. * The returned pointer is cast to a pointer to the given type. * The function returns %NULL when @n_structs is 0 of if an overflow occurs. * * Since: 2.8 * Returns: a pointer to the allocated memory, cast to a pointer to @struct_type */ #define g_try_new(struct_type, n_structs) _G_NEW (struct_type, n_structs, try_malloc) /** * g_try_new0: * @struct_type: the type of the elements to allocate * @n_structs: the number of elements to allocate * * Attempts to allocate @n_structs elements of type @struct_type, initialized * to 0's, and returns %NULL on failure. Contrast with g_new0(), which aborts * the program on failure. * The returned pointer is cast to a pointer to the given type. * The function returns %NULL when @n_structs is 0 of if an overflow occurs. * * Since: 2.8 * Returns: a pointer to the allocated memory, cast to a pointer to @struct_type */ #define g_try_new0(struct_type, n_structs) _G_NEW (struct_type, n_structs, try_malloc0) /** * g_try_renew: * @struct_type: the type of the elements to allocate * @mem: the currently allocated memory * @n_structs: the number of elements to allocate * * Attempts to reallocate the memory pointed to by @mem, so that it now has * space for @n_structs elements of type @struct_type, and returns %NULL on * failure. Contrast with g_renew(), which aborts the program on failure. * It returns the new address of the memory, which may have been moved. * The function returns %NULL if an overflow occurs. * * Since: 2.8 * Returns: a pointer to the new allocated memory, cast to a pointer to @struct_type */ #define g_try_renew(struct_type, mem, n_structs) _G_RENEW (struct_type, mem, n_structs, try_realloc) /* Memory allocation virtualization for debugging purposes * g_mem_set_vtable() has to be the very first GLib function called * if being used */ struct _GMemVTable { gpointer (*malloc) (gsize n_bytes); gpointer (*realloc) (gpointer mem, gsize n_bytes); void (*free) (gpointer mem); /* optional; set to NULL if not used ! */ gpointer (*calloc) (gsize n_blocks, gsize n_block_bytes); gpointer (*try_malloc) (gsize n_bytes); gpointer (*try_realloc) (gpointer mem, gsize n_bytes); }; 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; /* 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 #endif /* __G_MEM_H__ */ pkg-config-0.29.1/glib/glib/gasyncqueue.h0000664000175000017500000001166712651243552015126 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the GLib Team and others 1997-2000. See the AUTHORS * file for a list of people on the GLib Team. See the ChangeLog * files for a list of changes. These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/. */ #ifndef __G_ASYNCQUEUE_H__ #define __G_ASYNCQUEUE_H__ #if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) #error "Only can be included directly." #endif #include 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) 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); GLIB_DEPRECATED_FOR(g_async_queue_timeout_pop) gpointer g_async_queue_timed_pop (GAsyncQueue *queue, GTimeVal *end_time); GLIB_DEPRECATED_FOR(g_async_queue_timeout_pop_unlocked) gpointer g_async_queue_timed_pop_unlocked (GAsyncQueue *queue, GTimeVal *end_time); G_END_DECLS #endif /* __G_ASYNCQUEUE_H__ */ pkg-config-0.29.1/glib/glib/gdataset.h0000664000175000017500000001425312651243552014363 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the GLib Team and others 1997-2000. See the AUTHORS * file for a list of people on the GLib Team. See the ChangeLog * files for a list of changes. These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/. */ #ifndef __G_DATASET_H__ #define __G_DATASET_H__ #if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) #error "Only can be included directly." #endif #include G_BEGIN_DECLS typedef struct _GData GData; typedef void (*GDataForeachFunc) (GQuark key_id, gpointer data, gpointer user_data); /* 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); /** * G_DATALIST_FLAGS_MASK: * * A bitmask that restricts the possible flags passed to * g_datalist_set_flags(). Passing a flags value where * flags & ~G_DATALIST_FLAGS_MASK != 0 is an error. */ #define G_DATALIST_FLAGS_MASK 0x3 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) \ g_datalist_id_set_data_full ((dl), (q), (d), NULL) #define g_datalist_id_remove_data(dl, q) \ g_datalist_id_set_data ((dl), (q), NULL) #define g_datalist_set_data_full(dl, k, d, f) \ g_datalist_id_set_data_full ((dl), g_quark_from_string (k), (d), (f)) #define g_datalist_remove_no_notify(dl, k) \ g_datalist_id_remove_no_notify ((dl), g_quark_try_string (k)) #define g_datalist_set_data(dl, k, d) \ g_datalist_set_data_full ((dl), (k), (d), NULL) #define g_datalist_remove_data(dl, k) \ g_datalist_id_set_data ((dl), g_quark_try_string (k), NULL) /* Location Associated Keyed Data */ 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); #define g_dataset_id_set_data(l, k, d) \ g_dataset_id_set_data_full ((l), (k), (d), NULL) #define g_dataset_id_remove_data(l, k) \ g_dataset_id_set_data ((l), (k), NULL) #define g_dataset_get_data(l, k) \ (g_dataset_id_get_data ((l), g_quark_try_string (k))) #define g_dataset_set_data_full(l, k, d, f) \ g_dataset_id_set_data_full ((l), g_quark_from_string (k), (d), (f)) #define g_dataset_remove_no_notify(l, k) \ g_dataset_id_remove_no_notify ((l), g_quark_try_string (k)) #define g_dataset_set_data(l, k, d) \ g_dataset_set_data_full ((l), (k), (d), NULL) #define g_dataset_remove_data(l, k) \ g_dataset_id_set_data ((l), g_quark_try_string (k), NULL) G_END_DECLS #endif /* __G_DATASET_H__ */ pkg-config-0.29.1/glib/glib/gmessages-private.h0000664000175000017500000000211212651243552016204 00000000000000/* 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 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__ */ pkg-config-0.29.1/glib/glib/gdatasetprivate.h0000664000175000017500000000302512275467762015766 00000000000000/* GLIB - Library of useful routines for C programming * gdataset-private.h: Internal macros for accessing dataset values * Copyright (C) 2005 Red Hat * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the GLib Team and others 1997-2000. See the AUTHORS * file for a list of people on the GLib Team. See the ChangeLog * files for a list of changes. These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/. */ #ifndef __G_DATASETPRIVATE_H__ #define __G_DATASETPRIVATE_H__ #include G_BEGIN_DECLS /* GET_FLAGS is implemented via atomic pointer access, to allow memory * barriers to take effect without acquiring the global dataset mutex. */ #define G_DATALIST_GET_FLAGS(datalist) \ ((gsize) g_atomic_pointer_get (datalist) & G_DATALIST_FLAGS_MASK) G_END_DECLS #endif /* __G_DATASETPRIVATE_H__ */ pkg-config-0.29.1/glib/glib/glib_trace.h0000664000175000017500000000243612275467762014677 00000000000000/* GLIB - Library of useful routines for C programming * * Copyright (C) 2009,2010 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. * * Author: Alexander Larsson */ #ifndef __GLIBTRACE_H__ #define __GLIBTRACE_H__ #ifndef SIZEOF_CHAR #error "config.h must be included prior to glib_trace.h" #endif #ifdef HAVE_DTRACE /* include the generated probes header and put markers in code */ #include "glib_probes.h" #define TRACE(probe) probe #else /* Wrap the probe to allow it to be removed when no systemtap available */ #define TRACE(probe) #endif #endif /* __GLIBTRACE_H__ */ pkg-config-0.29.1/glib/glib/gstring.c0000664000175000017500000007176012651243552014245 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the GLib Team and others 1997-2000. See the AUTHORS * file for a list of people on the GLib Team. See the ChangeLog * files for a list of changes. These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/. */ /* * MT safe */ #include "config.h" #ifdef HAVE_UNISTD_H #include #endif #include #include #include #include #include #include "gstring.h" #include "gprintf.h" /** * SECTION:strings * @title: Strings * @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. 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. */ /** * GString: * @str: points to the character data. It may move as text is added. * The @str field is null-terminated and so * can be used as an ordinary C string. * @len: contains the length of the string, not including the * terminating nul byte. * @allocated_len: the number of bytes that can be stored in the * string before it needs to be reallocated. May be larger than @len. * * The GString struct contains the public fields of a GString. */ #define MY_MAXSIZE ((gsize)-1) static inline gsize nearest_power (gsize base, gsize num) { if (num > MY_MAXSIZE / 2) { return MY_MAXSIZE; } else { gsize n = base; while (n < num) n <<= 1; return n; } } static void g_string_maybe_expand (GString *string, gsize len) { if (string->len + len >= string->allocated_len) { string->allocated_len = nearest_power (1, string->len + len + 1); string->str = g_realloc (string->str, string->allocated_len); } } /** * g_string_sized_new: * @dfl_size: the default size of the space allocated to * hold the string * * Creates a new #GString, with enough space for @dfl_size * bytes. This is useful if you are going to add a lot of * text to the string and don't want it to be reallocated * too often. * * Returns: the new #GString */ GString * g_string_sized_new (gsize dfl_size) { GString *string = g_slice_new (GString); string->allocated_len = 0; string->len = 0; string->str = NULL; g_string_maybe_expand (string, MAX (dfl_size, 2)); string->str[0] = 0; return string; } /** * g_string_new: * @init: the initial text to copy into the string * * Creates a new #GString, initialized with the given string. * * Returns: the new #GString */ GString * g_string_new (const gchar *init) { GString *string; if (init == NULL || *init == '\0') string = g_string_sized_new (2); else { gint len; len = strlen (init); string = g_string_sized_new (len + 2); g_string_append_len (string, init, len); } return string; } /** * g_string_new_len: * @init: initial contents of the string * @len: length of @init to use * * Creates a new #GString with @len bytes of the @init buffer. * Because a length is provided, @init need not be nul-terminated, * and can contain embedded nul bytes. * * Since this function does not stop at nul bytes, it is the caller's * responsibility to ensure that @init has at least @len addressable * bytes. * * Returns: a new #GString */ GString * g_string_new_len (const gchar *init, gssize len) { GString *string; if (len < 0) return g_string_new (init); else { string = g_string_sized_new (len); if (init) g_string_append_len (string, init, len); return string; } } /** * g_string_free: * @string: a #GString * @free_segment: if %TRUE, the actual character data is freed as well * * Frees the memory allocated for the #GString. * If @free_segment is %TRUE it also frees the character data. If * it's %FALSE, the caller gains ownership of the buffer and must * free it after use with g_free(). * * Returns: the character data of @string * (i.e. %NULL if @free_segment is %TRUE) */ gchar * g_string_free (GString *string, gboolean free_segment) { gchar *segment; g_return_val_if_fail (string != NULL, NULL); if (free_segment) { g_free (string->str); segment = NULL; } else segment = string->str; g_slice_free (GString, string); return segment; } /** * g_string_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 * * Compares two strings for equality, returning %TRUE if they are equal. * For use with #GHashTable. * * Returns: %TRUE if the strings are the same length and contain the * same bytes */ gboolean g_string_equal (const GString *v, const GString *v2) { gchar *p, *q; GString *string1 = (GString *) v; GString *string2 = (GString *) v2; gsize i = string1->len; if (i != string2->len) return FALSE; p = string1->str; q = string2->str; while (i) { if (*p != *q) return FALSE; p++; q++; i--; } return TRUE; } /** * g_string_hash: * @str: a string to hash * * Creates a hash code for @str; for use with #GHashTable. * * Returns: hash code for @str */ guint g_string_hash (const GString *str) { const gchar *p = str->str; gsize n = str->len; guint h = 0; /* 31 bit hash function */ while (n--) { h = (h << 5) - h + *p; p++; } return h; } /** * g_string_assign: * @string: the destination #GString. Its current contents * are destroyed. * @rval: the string to copy into @string * * Copies the bytes from a string into a #GString, * destroying any previous contents. It is rather like * the standard strcpy() function, except that you do not * have to worry about having enough space to copy the string. * * Returns: @string */ GString * g_string_assign (GString *string, const gchar *rval) { g_return_val_if_fail (string != NULL, NULL); g_return_val_if_fail (rval != NULL, string); /* Make sure assigning to itself doesn't corrupt the string. */ if (string->str != rval) { /* Assigning from substring should be ok, since * g_string_truncate() does not reallocate. */ g_string_truncate (string, 0); g_string_append (string, rval); } return string; } /** * g_string_truncate: * @string: a #GString * @len: the new size of @string * * Cuts off the end of the GString, leaving the first @len bytes. * * Returns: @string */ GString * g_string_truncate (GString *string, gsize len) { g_return_val_if_fail (string != NULL, NULL); string->len = MIN (len, string->len); string->str[string->len] = 0; return string; } /** * g_string_set_size: * @string: a #GString * @len: the new length * * Sets the length of a #GString. If the length is less than * the current length, the string will be truncated. If the * length is greater than the current length, the contents * of the newly added area are undefined. (However, as * always, string->str[string->len] will be a nul byte.) * * Return value: @string */ GString * g_string_set_size (GString *string, gsize len) { g_return_val_if_fail (string != NULL, NULL); if (len >= string->allocated_len) g_string_maybe_expand (string, len - string->len); string->len = len; string->str[len] = 0; return string; } /** * g_string_insert_len: * @string: a #GString * @pos: position in @string where insertion should * happen, or -1 for at the end * @val: bytes to insert * @len: number of bytes of @val to insert * * Inserts @len bytes of @val into @string at @pos. * Because @len is provided, @val may contain embedded * nuls and need not be nul-terminated. If @pos is -1, * bytes are inserted at the end of the string. * * Since this function does not stop at nul bytes, it is * the caller's responsibility to ensure that @val has at * least @len addressable bytes. * * Returns: @string */ GString * g_string_insert_len (GString *string, gssize pos, const gchar *val, gssize len) { g_return_val_if_fail (string != NULL, NULL); g_return_val_if_fail (len == 0 || val != NULL, string); if (len == 0) return string; if (len < 0) len = strlen (val); if (pos < 0) pos = string->len; else g_return_val_if_fail (pos <= string->len, string); /* Check whether val represents a substring of string. * This test probably violates chapter and verse of the C standards, * since ">=" and "<=" are only valid when val really is a substring. * In practice, it will work on modern archs. */ if (val >= string->str && val <= string->str + string->len) { gsize offset = val - string->str; gsize precount = 0; g_string_maybe_expand (string, len); val = string->str + offset; /* At this point, val is valid again. */ /* Open up space where we are going to insert. */ if (pos < string->len) g_memmove (string->str + pos + len, string->str + pos, string->len - pos); /* Move the source part before the gap, if any. */ if (offset < pos) { precount = MIN (len, pos - offset); memcpy (string->str + pos, val, precount); } /* Move the source part after the gap, if any. */ if (len > precount) memcpy (string->str + pos + precount, val + /* Already moved: */ precount + /* Space opened up: */ len, len - precount); } else { g_string_maybe_expand (string, len); /* If we aren't appending at the end, move a hunk * of the old string to the end, opening up space */ if (pos < string->len) g_memmove (string->str + pos + len, string->str + pos, string->len - pos); /* insert the new string */ if (len == 1) string->str[pos] = *val; else memcpy (string->str + pos, val, len); } string->len += len; string->str[string->len] = 0; return string; } #define SUB_DELIM_CHARS "!$&'()*+,;=" static gboolean is_valid (char c, const char *reserved_chars_allowed) { if (g_ascii_isalnum (c) || c == '-' || c == '.' || c == '_' || c == '~') return TRUE; if (reserved_chars_allowed && strchr (reserved_chars_allowed, c) != NULL) return TRUE; return FALSE; } static gboolean gunichar_ok (gunichar c) { return (c != (gunichar) -2) && (c != (gunichar) -1); } /** * g_string_append_uri_escaped: * @string: a #GString * @unescaped: a string * @reserved_chars_allowed: a string of reserved characters allowed * to be used, or %NULL * @allow_utf8: set %TRUE if the escaped string may include UTF8 characters * * Appends @unescaped to @string, escaped any characters that * are reserved in URIs using URI-style escape sequences. * * Returns: @string * * Since: 2.16 */ GString * g_string_append_uri_escaped (GString *string, const gchar *unescaped, const gchar *reserved_chars_allowed, gboolean allow_utf8) { unsigned char c; const gchar *end; static const gchar hex[16] = "0123456789ABCDEF"; g_return_val_if_fail (string != NULL, NULL); g_return_val_if_fail (unescaped != NULL, NULL); end = unescaped + strlen (unescaped); while ((c = *unescaped) != 0) { if (c >= 0x80 && allow_utf8 && gunichar_ok (g_utf8_get_char_validated (unescaped, end - unescaped))) { int len = g_utf8_skip [c]; g_string_append_len (string, unescaped, len); unescaped += len; } else if (is_valid (c, reserved_chars_allowed)) { g_string_append_c (string, c); unescaped++; } else { g_string_append_c (string, '%'); g_string_append_c (string, hex[((guchar)c) >> 4]); g_string_append_c (string, hex[((guchar)c) & 0xf]); unescaped++; } } return string; } /** * g_string_append: * @string: a #GString * @val: the string to append onto the end of @string * * Adds a string onto the end of a #GString, expanding * it if necessary. * * Returns: @string */ GString * g_string_append (GString *string, const gchar *val) { g_return_val_if_fail (string != NULL, NULL); g_return_val_if_fail (val != NULL, string); return g_string_insert_len (string, -1, val, -1); } /** * g_string_append_len: * @string: a #GString * @val: bytes to append * @len: number of bytes of @val to use * * Appends @len bytes of @val to @string. Because @len is * provided, @val may contain embedded nuls and need not * be nul-terminated. * * Since this function does not stop at nul bytes, it is * the caller's responsibility to ensure that @val has at * least @len addressable bytes. * * Returns: @string */ GString * g_string_append_len (GString *string, const gchar *val, gssize len) { g_return_val_if_fail (string != NULL, NULL); g_return_val_if_fail (len == 0 || val != NULL, string); return g_string_insert_len (string, -1, val, len); } /** * g_string_append_c: * @string: a #GString * @c: the byte to append onto the end of @string * * Adds a byte onto the end of a #GString, expanding * it if necessary. * * Returns: @string */ #undef g_string_append_c GString * g_string_append_c (GString *string, gchar c) { g_return_val_if_fail (string != NULL, NULL); return g_string_insert_c (string, -1, c); } /** * g_string_append_unichar: * @string: a #GString * @wc: a Unicode character * * Converts a Unicode character into UTF-8, and appends it * to the string. * * Return value: @string */ GString * g_string_append_unichar (GString *string, gunichar wc) { g_return_val_if_fail (string != NULL, NULL); return g_string_insert_unichar (string, -1, wc); } /** * g_string_prepend: * @string: a #GString * @val: the string to prepend on the start of @string * * Adds a string on to the start of a #GString, * expanding it if necessary. * * Returns: @string */ GString * g_string_prepend (GString *string, const gchar *val) { g_return_val_if_fail (string != NULL, NULL); g_return_val_if_fail (val != NULL, string); return g_string_insert_len (string, 0, val, -1); } /** * g_string_prepend_len: * @string: a #GString * @val: bytes to prepend * @len: number of bytes in @val to prepend * * Prepends @len bytes of @val to @string. * Because @len is provided, @val may contain * embedded nuls and need not be nul-terminated. * * Since this function does not stop at nul bytes, * it is the caller's responsibility to ensure that * @val has at least @len addressable bytes. * * Returns: @string */ GString * g_string_prepend_len (GString *string, const gchar *val, gssize len) { g_return_val_if_fail (string != NULL, NULL); g_return_val_if_fail (val != NULL, string); return g_string_insert_len (string, 0, val, len); } /** * g_string_prepend_c: * @string: a #GString * @c: the byte to prepend on the start of the #GString * * Adds a byte onto the start of a #GString, * expanding it if necessary. * * Returns: @string */ GString * g_string_prepend_c (GString *string, gchar c) { g_return_val_if_fail (string != NULL, NULL); return g_string_insert_c (string, 0, c); } /** * g_string_prepend_unichar: * @string: a #GString * @wc: a Unicode character * * Converts a Unicode character into UTF-8, and prepends it * to the string. * * Return value: @string */ GString * g_string_prepend_unichar (GString *string, gunichar wc) { g_return_val_if_fail (string != NULL, NULL); return g_string_insert_unichar (string, 0, wc); } /** * g_string_insert: * @string: a #GString * @pos: the position to insert the copy of the string * @val: the string to insert * * Inserts a copy of a string into a #GString, * expanding it if necessary. * * Returns: @string */ GString * g_string_insert (GString *string, gssize pos, const gchar *val) { g_return_val_if_fail (string != NULL, NULL); g_return_val_if_fail (val != NULL, string); if (pos >= 0) g_return_val_if_fail (pos <= string->len, string); return g_string_insert_len (string, pos, val, -1); } /** * g_string_insert_c: * @string: a #GString * @pos: the position to insert the byte * @c: the byte to insert * * Inserts a byte into a #GString, expanding it if necessary. * * Returns: @string */ GString * g_string_insert_c (GString *string, gssize pos, gchar c) { g_return_val_if_fail (string != NULL, NULL); g_string_maybe_expand (string, 1); if (pos < 0) pos = string->len; else g_return_val_if_fail (pos <= string->len, string); /* If not just an append, move the old stuff */ if (pos < string->len) g_memmove (string->str + pos + 1, string->str + pos, string->len - pos); string->str[pos] = c; string->len += 1; string->str[string->len] = 0; return string; } /** * g_string_insert_unichar: * @string: a #GString * @pos: the position at which to insert character, or -1 * to append at the end of the string * @wc: a Unicode character * * Converts a Unicode character into UTF-8, and insert it * into the string at the given position. * * Return value: @string */ GString * g_string_insert_unichar (GString *string, gssize pos, gunichar wc) { gint charlen, first, i; gchar *dest; g_return_val_if_fail (string != NULL, NULL); /* Code copied from g_unichar_to_utf() */ if (wc < 0x80) { first = 0; charlen = 1; } else if (wc < 0x800) { first = 0xc0; charlen = 2; } else if (wc < 0x10000) { first = 0xe0; charlen = 3; } else if (wc < 0x200000) { first = 0xf0; charlen = 4; } else if (wc < 0x4000000) { first = 0xf8; charlen = 5; } else { first = 0xfc; charlen = 6; } /* End of copied code */ g_string_maybe_expand (string, charlen); if (pos < 0) pos = string->len; else g_return_val_if_fail (pos <= string->len, string); /* If not just an append, move the old stuff */ if (pos < string->len) g_memmove (string->str + pos + charlen, string->str + pos, string->len - pos); dest = string->str + pos; /* Code copied from g_unichar_to_utf() */ for (i = charlen - 1; i > 0; --i) { dest[i] = (wc & 0x3f) | 0x80; wc >>= 6; } dest[0] = wc | first; /* End of copied code */ string->len += charlen; string->str[string->len] = 0; return string; } /** * g_string_overwrite: * @string: a #GString * @pos: the position at which to start overwriting * @val: the string that will overwrite the @string starting at @pos * * Overwrites part of a string, lengthening it if necessary. * * Return value: @string * * Since: 2.14 */ GString * g_string_overwrite (GString *string, gsize pos, const gchar *val) { g_return_val_if_fail (val != NULL, string); return g_string_overwrite_len (string, pos, val, strlen (val)); } /** * g_string_overwrite_len: * @string: a #GString * @pos: the position at which to start overwriting * @val: the string that will overwrite the @string starting at @pos * @len: the number of bytes to write from @val * * Overwrites part of a string, lengthening it if necessary. * This function will work with embedded nuls. * * Return value: @string * * Since: 2.14 */ GString * g_string_overwrite_len (GString *string, gsize pos, const gchar *val, gssize len) { gsize end; g_return_val_if_fail (string != NULL, NULL); if (!len) return string; g_return_val_if_fail (val != NULL, string); g_return_val_if_fail (pos <= string->len, string); if (len < 0) len = strlen (val); end = pos + len; if (end > string->len) g_string_maybe_expand (string, end - string->len); memcpy (string->str + pos, val, len); if (end > string->len) { string->str[end] = '\0'; string->len = end; } return string; } /** * g_string_erase: * @string: a #GString * @pos: the position of the content to remove * @len: the number of bytes to remove, or -1 to remove all * following bytes * * Removes @len bytes from a #GString, starting at position @pos. * The rest of the #GString is shifted down to fill the gap. * * Returns: @string */ GString * g_string_erase (GString *string, gssize pos, gssize len) { g_return_val_if_fail (string != NULL, NULL); g_return_val_if_fail (pos >= 0, string); g_return_val_if_fail (pos <= string->len, string); if (len < 0) len = string->len - pos; else { g_return_val_if_fail (pos + len <= string->len, string); if (pos + len < string->len) g_memmove (string->str + pos, string->str + pos + len, string->len - (pos + len)); } string->len -= len; string->str[string->len] = 0; return string; } /** * g_string_ascii_down: * @string: a GString * * Converts all uppercase ASCII letters to lowercase ASCII letters. * * Return value: passed-in @string pointer, with all the * uppercase characters converted to lowercase in place, * with semantics that exactly match g_ascii_tolower(). */ GString * g_string_ascii_down (GString *string) { gchar *s; gint n; g_return_val_if_fail (string != NULL, NULL); n = string->len; s = string->str; while (n) { *s = g_ascii_tolower (*s); s++; n--; } return string; } /** * g_string_ascii_up: * @string: a GString * * Converts all lowercase ASCII letters to uppercase ASCII letters. * * Return value: passed-in @string pointer, with all the * lowercase characters converted to uppercase in place, * with semantics that exactly match g_ascii_toupper(). */ GString * g_string_ascii_up (GString *string) { gchar *s; gint n; g_return_val_if_fail (string != NULL, NULL); n = string->len; s = string->str; while (n) { *s = g_ascii_toupper (*s); s++; n--; } return string; } /** * g_string_down: * @string: a #GString * * Converts a #GString to lowercase. * * Returns: the #GString * * Deprecated:2.2: This function uses the locale-specific * tolower() function, which is almost never the right thing. * Use g_string_ascii_down() or g_utf8_strdown() instead. */ GString * g_string_down (GString *string) { guchar *s; glong n; g_return_val_if_fail (string != NULL, NULL); n = string->len; s = (guchar *) string->str; while (n) { if (isupper (*s)) *s = tolower (*s); s++; n--; } return string; } /** * g_string_up: * @string: a #GString * * Converts a #GString to uppercase. * * Return value: @string * * Deprecated:2.2: This function uses the locale-specific * toupper() function, which is almost never the right thing. * Use g_string_ascii_up() or g_utf8_strup() instead. */ GString * g_string_up (GString *string) { guchar *s; glong n; g_return_val_if_fail (string != NULL, NULL); n = string->len; s = (guchar *) string->str; while (n) { if (islower (*s)) *s = toupper (*s); s++; n--; } return string; } /** * g_string_append_vprintf: * @string: a #GString * @format: the string format. See the printf() documentation * @args: the list of arguments to insert in the output * * Appends a formatted string onto the end of a #GString. * This function is similar to g_string_append_printf() * except that the arguments to the format string are passed * as a va_list. * * Since: 2.14 */ void g_string_append_vprintf (GString *string, const gchar *format, va_list args) { gchar *buf; gint len; g_return_if_fail (string != NULL); g_return_if_fail (format != NULL); len = g_vasprintf (&buf, format, args); if (len >= 0) { g_string_maybe_expand (string, len); memcpy (string->str + string->len, buf, len + 1); string->len += len; g_free (buf); } } /** * g_string_vprintf: * @string: a #GString * @format: the string format. See the printf() documentation * @args: the parameters to insert into the format string * * Writes a formatted string into a #GString. * This function is similar to g_string_printf() except that * the arguments to the format string are passed as a va_list. * * Since: 2.14 */ void g_string_vprintf (GString *string, const gchar *format, va_list args) { g_string_truncate (string, 0); g_string_append_vprintf (string, format, args); } /** * g_string_sprintf: * @string: a #GString * @format: the string format. See the sprintf() documentation * @...: the parameters to insert into the format string * * Writes a formatted string into a #GString. * This is similar to the standard sprintf() function, * except that the #GString buffer automatically expands * to contain the results. The previous contents of the * #GString are destroyed. * * Deprecated: This function has been renamed to g_string_printf(). */ /** * g_string_printf: * @string: a #GString * @format: the string format. See the printf() documentation * @...: the parameters to insert into the format string * * Writes a formatted string into a #GString. * This is similar to the standard sprintf() function, * except that the #GString buffer automatically expands * to contain the results. The previous contents of the * #GString are destroyed. */ void g_string_printf (GString *string, const gchar *format, ...) { va_list args; g_string_truncate (string, 0); va_start (args, format); g_string_append_vprintf (string, format, args); va_end (args); } /** * g_string_sprintfa: * @string: a #GString * @format: the string format. See the sprintf() documentation * @...: the parameters to insert into the format string * * Appends a formatted string onto the end of a #GString. * This function is similar to g_string_sprintf() except that * the text is appended to the #GString. * * Deprecated: This function has been renamed to g_string_append_printf() */ /** * g_string_append_printf: * @string: a #GString * @format: the string format. See the printf() documentation * @...: the parameters to insert into the format string * * Appends a formatted string onto the end of a #GString. * This function is similar to g_string_printf() except * that the text is appended to the #GString. */ void g_string_append_printf (GString *string, const gchar *format, ...) { va_list args; va_start (args, format); g_string_append_vprintf (string, format, args); va_end (args); } pkg-config-0.29.1/glib/glib/gvariant-serialiser.c0000664000175000017500000014475012651243552016543 00000000000000/* * Copyright © 2007, 2008 Ryan Lortie * Copyright © 2010 Codethink Limited * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * * Author: Ryan Lortie */ /* Prologue {{{1 */ #include "config.h" #include "gvariant-serialiser.h" #include #include #include #include /* GVariantSerialiser * * After this prologue section, this file has roughly 2 parts. * * The first part is split up into sections according to various * container types. Maybe, Array, Tuple, Variant. The Maybe and Array * sections are subdivided for element types being fixed or * variable-sized types. * * Each section documents the format of that particular type of * container and implements 5 functions for dealing with it: * * n_children: * - determines (according to serialised data) how many child values * are inside a particular container value. * * get_child: * - gets the type of and the serialised data corresponding to a * given child value within the container value. * * needed_size: * - determines how much space would be required to serialise a * container of this type, containing the given children so that * buffers can be preallocated before serialising. * * serialise: * - write the serialised data for a container of this type, * containing the given children, to a buffer. * * is_normal: * - check the given data to ensure that it is in normal form. For a * given set of child values, there is exactly one normal form for * the serialised data of a container. Other forms are possible * while maintaining the same children (for example, by inserting * something other than zero bytes as padding) but only one form is * the normal form. * * The second part contains the main entry point for each of the above 5 * functions and logic to dispatch it to the handler for the appropriate * container type code. * * The second part also contains a routine to byteswap serialised * values. This code makes use of the n_children() and get_child() * functions above to do its work so no extra support is needed on a * per-container-type basis. * * There is also additional code for checking for normal form. All * numeric types are always in normal form since the full range of * values is permitted (eg: 0 to 255 is a valid byte). Special checks * need to be performed for booleans (only 0 or 1 allowed), strings * (properly nul-terminated) and object paths and signature strings * (meeting the D-Bus specification requirements). */ /* < private > * GVariantSerialised: * @type_info: the #GVariantTypeInfo of this value * @data: (allow-none): the serialised data of this value, or %NULL * @size: the size of this value * * A structure representing a GVariant in serialised form. This * structure is used with #GVariantSerialisedFiller functions and as the * primary interface to the serialiser. See #GVariantSerialisedFiller * for a description of its use there. * * When used with the serialiser API functions, the following invariants * apply to all #GVariantTypeSerialised structures passed to and * returned from the serialiser. * * @type_info must be non-%NULL. * * @data must be properly aligned for the type described by @type_info. * * If @type_info describes a fixed-sized type then @size must always be * equal to the fixed size of that type. * * For fixed-sized types (and only fixed-sized types), @data may be * %NULL even if @size is non-zero. This happens when a framing error * occurs while attempting to extract a fixed-sized value out of a * variable-sized container. There is no data to return for the * fixed-sized type, yet @size must be non-zero. The effect of this * combination should be as if @data were a pointer to an * appropriately-sized zero-filled region. */ /* < private > * g_variant_serialised_check: * @serialised: a #GVariantSerialised struct * * Checks @serialised for validity according to the invariants described * above. */ static void g_variant_serialised_check (GVariantSerialised serialised) { gsize fixed_size; guint alignment; g_assert (serialised.type_info != NULL); g_variant_type_info_query (serialised.type_info, &alignment, &fixed_size); if (fixed_size) g_assert_cmpint (serialised.size, ==, fixed_size); else g_assert (serialised.size == 0 || serialised.data != NULL); /* Depending on the native alignment requirements of the machine, the * compiler will insert either 3 or 7 padding bytes after the char. * This will result in the sizeof() the struct being 12 or 16. * Subtract 9 to get 3 or 7 which is a nice bitmask to apply to get * the alignment bits that we "care about" being zero: in the * 4-aligned case, we care about 2 bits, and in the 8-aligned case, we * care about 3 bits. */ alignment &= sizeof (struct { char a; union { guint64 x; void *y; gdouble z; } b; } ) - 9; /* Some OSes (FreeBSD is a known example) have a malloc() that returns * unaligned memory if you request small sizes. 'malloc (1);', for * example, has been seen to return pointers aligned to 6 mod 16. * * Check if this is a small allocation and return without enforcing * the alignment assertion if this is the case. */ if (serialised.size <= alignment) return; g_assert_cmpint (alignment & (gsize) serialised.data, ==, 0); } /* < private > * GVariantSerialisedFiller: * @serialised: a #GVariantSerialised instance to fill * @data: data from the children array * * This function is called back from g_variant_serialiser_needed_size() * and g_variant_serialiser_serialise(). It fills in missing details * from a partially-complete #GVariantSerialised. * * The @data parameter passed back to the function is one of the items * that was passed to the serialiser in the @children array. It * represents a single child item of the container that is being * serialised. The information filled in to @serialised is the * information for this child. * * If the @type_info field of @serialised is %NULL then the callback * function must set it to the type information corresponding to the * type of the child. No reference should be added. If it is non-%NULL * then the callback should assert that it is equal to the actual type * of the child. * * If the @size field is zero then the callback must fill it in with the * required amount of space to store the serialised form of the child. * If it is non-zero then the callback should assert that it is equal to * the needed size of the child. * * If @data is non-%NULL then it points to a space that is properly * aligned for and large enough to store the serialised data of the * child. The callback must store the serialised form of the child at * @data. * * If the child value is another container then the callback will likely * recurse back into the serialiser by calling * g_variant_serialiser_needed_size() to determine @size and * g_variant_serialiser_serialise() to write to @data. */ /* PART 1: Container types {{{1 * * This section contains the serialiser implementation functions for * each container type. */ /* Maybe {{{2 * * Maybe types are handled depending on if the element type of the maybe * type is a fixed-sized or variable-sized type. Although all maybe * types themselves are variable-sized types, herein, a maybe value with * a fixed-sized element type is called a "fixed-sized maybe" for * convenience and a maybe value with a variable-sized element type is * called a "variable-sized maybe". */ /* Fixed-sized Maybe {{{3 * * The size of a maybe value with a fixed-sized element type is either 0 * or equal to the fixed size of its element type. The case where the * size of the maybe value is zero corresponds to the "Nothing" case and * the case where the size of the maybe value is equal to the fixed size * of the element type corresponds to the "Just" case; in that case, the * serialised data of the child value forms the entire serialised data * of the maybe value. * * In the event that a fixed-sized maybe value is presented with a size * that is not equal to the fixed size of the element type then the * value must be taken to be "Nothing". */ static gsize gvs_fixed_sized_maybe_n_children (GVariantSerialised value) { gsize element_fixed_size; g_variant_type_info_query_element (value.type_info, NULL, &element_fixed_size); return (element_fixed_size == value.size) ? 1 : 0; } static GVariantSerialised gvs_fixed_sized_maybe_get_child (GVariantSerialised value, gsize index_) { /* the child has the same bounds as the * container, so just update the type. */ value.type_info = g_variant_type_info_element (value.type_info); g_variant_type_info_ref (value.type_info); return value; } static gsize gvs_fixed_sized_maybe_needed_size (GVariantTypeInfo *type_info, GVariantSerialisedFiller gvs_filler, const gpointer *children, gsize n_children) { if (n_children) { gsize element_fixed_size; g_variant_type_info_query_element (type_info, NULL, &element_fixed_size); return element_fixed_size; } else return 0; } static void gvs_fixed_sized_maybe_serialise (GVariantSerialised value, GVariantSerialisedFiller gvs_filler, const gpointer *children, gsize n_children) { if (n_children) { GVariantSerialised child = { NULL, value.data, value.size }; gvs_filler (&child, children[0]); } } static gboolean gvs_fixed_sized_maybe_is_normal (GVariantSerialised value) { if (value.size > 0) { gsize element_fixed_size; g_variant_type_info_query_element (value.type_info, NULL, &element_fixed_size); if (value.size != element_fixed_size) return FALSE; /* proper element size: "Just". recurse to the child. */ value.type_info = g_variant_type_info_element (value.type_info); return g_variant_serialised_is_normal (value); } /* size of 0: "Nothing" */ return TRUE; } /* Variable-sized Maybe * * The size of a maybe value with a variable-sized element type is * either 0 or strictly greater than 0. The case where the size of the * maybe value is zero corresponds to the "Nothing" case and the case * where the size of the maybe value is greater than zero corresponds to * the "Just" case; in that case, the serialised data of the child value * forms the first part of the serialised data of the maybe value and is * followed by a single zero byte. This zero byte is always appended, * regardless of any zero bytes that may already be at the end of the * serialised ata of the child value. */ static gsize gvs_variable_sized_maybe_n_children (GVariantSerialised value) { return (value.size > 0) ? 1 : 0; } static GVariantSerialised gvs_variable_sized_maybe_get_child (GVariantSerialised value, gsize index_) { /* remove the padding byte and update the type. */ value.type_info = g_variant_type_info_element (value.type_info); g_variant_type_info_ref (value.type_info); value.size--; /* if it's zero-sized then it may as well be NULL */ if (value.size == 0) value.data = NULL; return value; } static gsize gvs_variable_sized_maybe_needed_size (GVariantTypeInfo *type_info, GVariantSerialisedFiller gvs_filler, const gpointer *children, gsize n_children) { if (n_children) { GVariantSerialised child = { 0, }; gvs_filler (&child, children[0]); return child.size + 1; } else return 0; } static void gvs_variable_sized_maybe_serialise (GVariantSerialised value, GVariantSerialisedFiller gvs_filler, const gpointer *children, gsize n_children) { if (n_children) { GVariantSerialised child = { NULL, value.data, value.size - 1 }; /* write the data for the child. */ gvs_filler (&child, children[0]); value.data[child.size] = '\0'; } } static gboolean gvs_variable_sized_maybe_is_normal (GVariantSerialised value) { if (value.size == 0) return TRUE; if (value.data[value.size - 1] != '\0') return FALSE; value.type_info = g_variant_type_info_element (value.type_info); value.size--; return g_variant_serialised_is_normal (value); } /* Arrays {{{2 * * Just as with maybe types, array types are handled depending on if the * element type of the array type is a fixed-sized or variable-sized * type. Similar to maybe types, for convenience, an array value with a * fixed-sized element type is called a "fixed-sized array" and an array * value with a variable-sized element type is called a "variable sized * array". */ /* Fixed-sized Array {{{3 * * For fixed sized arrays, the serialised data is simply a concatenation * of the serialised data of each element, in order. Since fixed-sized * values always have a fixed size that is a multiple of their alignment * requirement no extra padding is required. * * In the event that a fixed-sized array is presented with a size that * is not an integer multiple of the element size then the value of the * array must be taken as being empty. */ static gsize gvs_fixed_sized_array_n_children (GVariantSerialised value) { gsize element_fixed_size; g_variant_type_info_query_element (value.type_info, NULL, &element_fixed_size); if (value.size % element_fixed_size == 0) return value.size / element_fixed_size; return 0; } static GVariantSerialised gvs_fixed_sized_array_get_child (GVariantSerialised value, gsize index_) { GVariantSerialised child = { 0, }; child.type_info = g_variant_type_info_element (value.type_info); g_variant_type_info_query (child.type_info, NULL, &child.size); child.data = value.data + (child.size * index_); g_variant_type_info_ref (child.type_info); return child; } static gsize gvs_fixed_sized_array_needed_size (GVariantTypeInfo *type_info, GVariantSerialisedFiller gvs_filler, const gpointer *children, gsize n_children) { gsize element_fixed_size; g_variant_type_info_query_element (type_info, NULL, &element_fixed_size); return element_fixed_size * n_children; } static void gvs_fixed_sized_array_serialise (GVariantSerialised value, GVariantSerialisedFiller gvs_filler, const gpointer *children, gsize n_children) { GVariantSerialised child = { 0, }; gsize i; child.type_info = g_variant_type_info_element (value.type_info); g_variant_type_info_query (child.type_info, NULL, &child.size); child.data = value.data; for (i = 0; i < n_children; i++) { gvs_filler (&child, children[i]); child.data += child.size; } } static gboolean gvs_fixed_sized_array_is_normal (GVariantSerialised value) { GVariantSerialised child = { 0, }; child.type_info = g_variant_type_info_element (value.type_info); g_variant_type_info_query (child.type_info, NULL, &child.size); if (value.size % child.size != 0) return FALSE; for (child.data = value.data; child.data < value.data + value.size; child.data += child.size) { if (!g_variant_serialised_is_normal (child)) return FALSE; } return TRUE; } /* Variable-sized Array {{{3 * * Variable sized arrays, containing variable-sized elements, must be * able to determine the boundaries between the elements. The items * cannot simply be concatenated. Additionally, we are faced with the * fact that non-fixed-sized values do not necessarily have a size that * is a multiple of their alignment requirement, so we may need to * insert zero-filled padding. * * While it is possible to find the start of an item by starting from * the end of the item before it and padding for alignment, it is not * generally possible to do the reverse operation. For this reason, we * record the end point of each element in the array. * * GVariant works in terms of "offsets". An offset is a pointer to a * boundary between two bytes. In 4 bytes of serialised data, there * would be 5 possible offsets: one at the start ('0'), one between each * pair of adjacent bytes ('1', '2', '3') and one at the end ('4'). * * The numeric value of an offset is an unsigned integer given relative * to the start of the serialised data of the array. Offsets are always * stored in little endian byte order and are always only as big as they * need to be. For example, in 255 bytes of serialised data, there are * 256 offsets. All possibilities can be stored in an 8 bit unsigned * integer. In 256 bytes of serialised data, however, there are 257 * possible offsets so 16 bit integers must be used. The size of an * offset is always a power of 2. * * The offsets are stored at the end of the serialised data of the * array. They are simply concatenated on without any particular * alignment. The size of the offsets is included in the size of the * serialised data for purposes of determining the size of the offsets. * This presents a possibly ambiguity; in certain cases, a particular * value of array could have two different serialised forms. * * Imagine an array containing a single string of 253 bytes in length * (so, 254 bytes including the nul terminator). Now the offset must be * written. If an 8 bit offset is written, it will bring the size of * the array's serialised data to 255 -- which means that the use of an * 8 bit offset was valid. If a 16 bit offset is used then the total * size of the array will be 256 -- which means that the use of a 16 bit * offset was valid. Although both of these will be accepted by the * deserialiser, only the smaller of the two is considered to be in * normal form and that is the one that the serialiser must produce. */ static inline gsize gvs_read_unaligned_le (guchar *bytes, guint size) { union { guchar bytes[GLIB_SIZEOF_SIZE_T]; gsize integer; } tmpvalue; tmpvalue.integer = 0; memcpy (&tmpvalue.bytes, bytes, size); return GSIZE_FROM_LE (tmpvalue.integer); } static inline void gvs_write_unaligned_le (guchar *bytes, gsize value, guint size) { union { guchar bytes[GLIB_SIZEOF_SIZE_T]; gsize integer; } tmpvalue; tmpvalue.integer = GSIZE_TO_LE (value); memcpy (bytes, &tmpvalue.bytes, size); } static guint gvs_get_offset_size (gsize size) { if (size > G_MAXUINT32) return 8; else if (size > G_MAXUINT16) return 4; else if (size > G_MAXUINT8) return 2; else if (size > 0) return 1; return 0; } static gsize gvs_calculate_total_size (gsize body_size, gsize offsets) { if (body_size + 1 * offsets <= G_MAXUINT8) return body_size + 1 * offsets; if (body_size + 2 * offsets <= G_MAXUINT16) return body_size + 2 * offsets; if (body_size + 4 * offsets <= G_MAXUINT32) return body_size + 4 * offsets; return body_size + 8 * offsets; } static gsize gvs_variable_sized_array_n_children (GVariantSerialised value) { gsize offsets_array_size; gsize offset_size; gsize last_end; if (value.size == 0) return 0; offset_size = gvs_get_offset_size (value.size); last_end = gvs_read_unaligned_le (value.data + value.size - offset_size, offset_size); if (last_end > value.size) return 0; offsets_array_size = value.size - last_end; if (offsets_array_size % offset_size) return 0; return offsets_array_size / offset_size; } static GVariantSerialised gvs_variable_sized_array_get_child (GVariantSerialised value, gsize index_) { GVariantSerialised child = { 0, }; gsize offset_size; gsize last_end; gsize start; gsize end; child.type_info = g_variant_type_info_element (value.type_info); g_variant_type_info_ref (child.type_info); offset_size = gvs_get_offset_size (value.size); last_end = gvs_read_unaligned_le (value.data + value.size - offset_size, offset_size); if (index_ > 0) { guint alignment; start = gvs_read_unaligned_le (value.data + last_end + (offset_size * (index_ - 1)), offset_size); g_variant_type_info_query (child.type_info, &alignment, NULL); start += (-start) & alignment; } else start = 0; end = gvs_read_unaligned_le (value.data + last_end + (offset_size * index_), offset_size); if (start < end && end <= value.size) { child.data = value.data + start; child.size = end - start; } return child; } static gsize gvs_variable_sized_array_needed_size (GVariantTypeInfo *type_info, GVariantSerialisedFiller gvs_filler, const gpointer *children, gsize n_children) { guint alignment; gsize offset; gsize i; g_variant_type_info_query (type_info, &alignment, NULL); offset = 0; for (i = 0; i < n_children; i++) { GVariantSerialised child = { 0, }; offset += (-offset) & alignment; gvs_filler (&child, children[i]); offset += child.size; } return gvs_calculate_total_size (offset, n_children); } static void gvs_variable_sized_array_serialise (GVariantSerialised value, GVariantSerialisedFiller gvs_filler, const gpointer *children, gsize n_children) { guchar *offset_ptr; gsize offset_size; guint alignment; gsize offset; gsize i; g_variant_type_info_query (value.type_info, &alignment, NULL); offset_size = gvs_get_offset_size (value.size); offset = 0; offset_ptr = value.data + value.size - offset_size * n_children; for (i = 0; i < n_children; i++) { GVariantSerialised child = { 0, }; while (offset & alignment) value.data[offset++] = '\0'; child.data = value.data + offset; gvs_filler (&child, children[i]); offset += child.size; gvs_write_unaligned_le (offset_ptr, offset, offset_size); offset_ptr += offset_size; } } static gboolean gvs_variable_sized_array_is_normal (GVariantSerialised value) { GVariantSerialised child = { 0, }; gsize offsets_array_size; guchar *offsets_array; guint offset_size; guint alignment; gsize last_end; gsize length; gsize offset; gsize i; if (value.size == 0) return TRUE; offset_size = gvs_get_offset_size (value.size); last_end = gvs_read_unaligned_le (value.data + value.size - offset_size, offset_size); if (last_end > value.size) return FALSE; offsets_array_size = value.size - last_end; if (offsets_array_size % offset_size) return FALSE; offsets_array = value.data + value.size - offsets_array_size; length = offsets_array_size / offset_size; if (length == 0) return FALSE; child.type_info = g_variant_type_info_element (value.type_info); g_variant_type_info_query (child.type_info, &alignment, NULL); offset = 0; for (i = 0; i < length; i++) { gsize this_end; this_end = gvs_read_unaligned_le (offsets_array + offset_size * i, offset_size); if (this_end < offset || this_end > last_end) return FALSE; while (offset & alignment) { if (!(offset < this_end && value.data[offset] == '\0')) return FALSE; offset++; } child.data = value.data + offset; child.size = this_end - offset; if (child.size == 0) child.data = NULL; if (!g_variant_serialised_is_normal (child)) return FALSE; offset = this_end; } g_assert (offset == last_end); return TRUE; } /* Tuples {{{2 * * Since tuples can contain a mix of variable- and fixed-sized items, * they are, in terms of serialisation, a hybrid of variable-sized and * fixed-sized arrays. * * Offsets are only stored for variable-sized items. Also, since the * number of items in a tuple is known from its type, we are able to * know exactly how many offsets to expect in the serialised data (and * therefore how much space is taken up by the offset array). This * means that we know where the end of the serialised data for the last * item is -- we can just subtract the size of the offset array from the * total size of the tuple. For this reason, the last item in the tuple * doesn't need an offset stored. * * Tuple offsets are stored in reverse. This design choice allows * iterator-based deserialisers to be more efficient. * * Most of the "heavy lifting" here is handled by the GVariantTypeInfo * for the tuple. See the notes in gvarianttypeinfo.h. */ static gsize gvs_tuple_n_children (GVariantSerialised value) { return g_variant_type_info_n_members (value.type_info); } static GVariantSerialised gvs_tuple_get_child (GVariantSerialised value, gsize index_) { const GVariantMemberInfo *member_info; GVariantSerialised child = { 0, }; gsize offset_size; gsize start, end; member_info = g_variant_type_info_member_info (value.type_info, index_); child.type_info = g_variant_type_info_ref (member_info->type_info); offset_size = gvs_get_offset_size (value.size); /* tuples are the only (potentially) fixed-sized containers, so the * only ones that have to deal with the possibility of having %NULL * data with a non-zero %size if errors occurred elsewhere. */ if G_UNLIKELY (value.data == NULL && value.size != 0) { g_variant_type_info_query (child.type_info, NULL, &child.size); /* this can only happen in fixed-sized tuples, * so the child must also be fixed sized. */ g_assert (child.size != 0); child.data = NULL; return child; } if (member_info->ending_type == G_VARIANT_MEMBER_ENDING_OFFSET) { if (offset_size * (member_info->i + 2) > value.size) return child; } else { if (offset_size * (member_info->i + 1) > value.size) { /* if the child is fixed size, return its size. * if child is not fixed-sized, return size = 0. */ g_variant_type_info_query (child.type_info, NULL, &child.size); return child; } } if (member_info->i + 1) start = gvs_read_unaligned_le (value.data + value.size - offset_size * (member_info->i + 1), offset_size); else start = 0; start += member_info->a; start &= member_info->b; start |= member_info->c; if (member_info->ending_type == G_VARIANT_MEMBER_ENDING_LAST) end = value.size - offset_size * (member_info->i + 1); else if (member_info->ending_type == G_VARIANT_MEMBER_ENDING_FIXED) { gsize fixed_size; g_variant_type_info_query (child.type_info, NULL, &fixed_size); end = start + fixed_size; child.size = fixed_size; } else /* G_VARIANT_MEMEBER_ENDING_OFFSET */ end = gvs_read_unaligned_le (value.data + value.size - offset_size * (member_info->i + 2), offset_size); if (start < end && end <= value.size) { child.data = value.data + start; child.size = end - start; } return child; } static gsize gvs_tuple_needed_size (GVariantTypeInfo *type_info, GVariantSerialisedFiller gvs_filler, const gpointer *children, gsize n_children) { const GVariantMemberInfo *member_info = NULL; gsize fixed_size; gsize offset; gsize i; g_variant_type_info_query (type_info, NULL, &fixed_size); if (fixed_size) return fixed_size; offset = 0; for (i = 0; i < n_children; i++) { guint alignment; member_info = g_variant_type_info_member_info (type_info, i); g_variant_type_info_query (member_info->type_info, &alignment, &fixed_size); offset += (-offset) & alignment; if (fixed_size) offset += fixed_size; else { GVariantSerialised child = { 0, }; gvs_filler (&child, children[i]); offset += child.size; } } return gvs_calculate_total_size (offset, member_info->i + 1); } static void gvs_tuple_serialise (GVariantSerialised value, GVariantSerialisedFiller gvs_filler, const gpointer *children, gsize n_children) { gsize offset_size; gsize offset; gsize i; offset_size = gvs_get_offset_size (value.size); offset = 0; for (i = 0; i < n_children; i++) { const GVariantMemberInfo *member_info; GVariantSerialised child = { 0, }; guint alignment; member_info = g_variant_type_info_member_info (value.type_info, i); g_variant_type_info_query (member_info->type_info, &alignment, NULL); while (offset & alignment) value.data[offset++] = '\0'; child.data = value.data + offset; gvs_filler (&child, children[i]); offset += child.size; if (member_info->ending_type == G_VARIANT_MEMBER_ENDING_OFFSET) { value.size -= offset_size; gvs_write_unaligned_le (value.data + value.size, offset, offset_size); } } while (offset < value.size) value.data[offset++] = '\0'; } static gboolean gvs_tuple_is_normal (GVariantSerialised value) { guint offset_size; gsize offset_ptr; gsize length; 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; offset = 0; for (i = 0; i < length; i++) { const GVariantMemberInfo *member_info; GVariantSerialised child; gsize fixed_size; guint alignment; gsize end; member_info = g_variant_type_info_member_info (value.type_info, i); child.type_info = member_info->type_info; g_variant_type_info_query (child.type_info, &alignment, &fixed_size); while (offset & alignment) { if (offset > value.size || value.data[offset] != '\0') return FALSE; offset++; } child.data = value.data + offset; switch (member_info->ending_type) { case G_VARIANT_MEMBER_ENDING_FIXED: end = offset + fixed_size; break; case G_VARIANT_MEMBER_ENDING_LAST: end = offset_ptr; break; case G_VARIANT_MEMBER_ENDING_OFFSET: offset_ptr -= offset_size; if (offset_ptr < offset) return FALSE; end = gvs_read_unaligned_le (value.data + offset_ptr, offset_size); break; default: g_assert_not_reached (); } if (end < offset || end > offset_ptr) return FALSE; child.size = end - offset; if (child.size == 0) child.data = NULL; if (!g_variant_serialised_is_normal (child)) return FALSE; offset = end; } { gsize fixed_size; guint alignment; g_variant_type_info_query (value.type_info, &alignment, &fixed_size); if (fixed_size) { g_assert (fixed_size == value.size); g_assert (offset_ptr == value.size); if (i == 0) { if (value.data[offset++] != '\0') return FALSE; } else { while (offset & alignment) if (value.data[offset++] != '\0') return FALSE; } g_assert (offset == value.size); } } return offset_ptr == offset; } /* Variants {{{2 * * Variants are stored by storing the serialised data of the child, * followed by a '\0' character, followed by the type string of the * child. * * In the case that a value is presented that contains no '\0' * character, or doesn't have a single well-formed definite type string * following that character, the variant must be taken as containing the * unit tuple: (). */ static inline gsize gvs_variant_n_children (GVariantSerialised value) { return 1; } static inline GVariantSerialised gvs_variant_get_child (GVariantSerialised value, gsize index_) { GVariantSerialised child = { 0, }; /* NOTE: not O(1) and impossible for it to be... */ if (value.size) { /* find '\0' character */ for (child.size = value.size - 1; child.size; child.size--) if (value.data[child.size] == '\0') break; /* ensure we didn't just hit the start of the string */ if (value.data[child.size] == '\0') { const gchar *type_string = (gchar *) &value.data[child.size + 1]; const gchar *limit = (gchar *) &value.data[value.size]; const gchar *end; if (g_variant_type_string_scan (type_string, limit, &end) && end == limit) { const GVariantType *type = (GVariantType *) type_string; if (g_variant_type_is_definite (type)) { gsize fixed_size; child.type_info = g_variant_type_info_get (type); if (child.size != 0) /* only set to non-%NULL if size > 0 */ child.data = value.data; g_variant_type_info_query (child.type_info, NULL, &fixed_size); if (!fixed_size || fixed_size == child.size) return child; g_variant_type_info_unref (child.type_info); } } } } child.type_info = g_variant_type_info_get (G_VARIANT_TYPE_UNIT); child.data = NULL; child.size = 1; return child; } static inline gsize gvs_variant_needed_size (GVariantTypeInfo *type_info, GVariantSerialisedFiller gvs_filler, const gpointer *children, gsize n_children) { GVariantSerialised child = { 0, }; const gchar *type_string; gvs_filler (&child, children[0]); type_string = g_variant_type_info_get_type_string (child.type_info); return child.size + 1 + strlen (type_string); } static inline void gvs_variant_serialise (GVariantSerialised value, GVariantSerialisedFiller gvs_filler, const gpointer *children, gsize n_children) { GVariantSerialised child = { 0, }; const gchar *type_string; child.data = value.data; gvs_filler (&child, children[0]); type_string = g_variant_type_info_get_type_string (child.type_info); value.data[child.size] = '\0'; memcpy (value.data + child.size + 1, type_string, strlen (type_string)); } static inline gboolean gvs_variant_is_normal (GVariantSerialised value) { GVariantSerialised child; gboolean normal; child = gvs_variant_get_child (value, 0); normal = (child.data != NULL || child.size == 0) && g_variant_serialised_is_normal (child); g_variant_type_info_unref (child.type_info); return normal; } /* PART 2: Serialiser API {{{1 * * This is the implementation of the API of the serialiser as advertised * in gvariant-serialiser.h. */ /* Dispatch Utilities {{{2 * * These macros allow a given function (for example, * g_variant_serialiser_serialise) to be dispatched to the appropriate * type-specific function above (fixed/variable-sized maybe, * fixed/variable-sized array, tuple or variant). */ #define DISPATCH_FIXED(type_info, before, after) \ { \ gsize fixed_size; \ \ g_variant_type_info_query_element (type_info, NULL, \ &fixed_size); \ \ if (fixed_size) \ { \ before ## fixed_sized ## after \ } \ else \ { \ before ## variable_sized ## after \ } \ } #define DISPATCH_CASES(type_info, before, after) \ switch (g_variant_type_info_get_type_char (type_info)) \ { \ case G_VARIANT_TYPE_INFO_CHAR_MAYBE: \ DISPATCH_FIXED (type_info, before, _maybe ## after) \ \ case G_VARIANT_TYPE_INFO_CHAR_ARRAY: \ DISPATCH_FIXED (type_info, before, _array ## after) \ \ case G_VARIANT_TYPE_INFO_CHAR_DICT_ENTRY: \ case G_VARIANT_TYPE_INFO_CHAR_TUPLE: \ { \ before ## tuple ## after \ } \ \ case G_VARIANT_TYPE_INFO_CHAR_VARIANT: \ { \ before ## variant ## after \ } \ } /* Serialiser entry points {{{2 * * These are the functions that are called in order for the serialiser * to do its thing. */ /* < private > * g_variant_serialised_n_children: * @serialised: a #GVariantSerialised * * For serialised data that represents a container value (maybes, * tuples, arrays, variants), determine how many child items are inside * that container. * * Returns: the number of children */ gsize g_variant_serialised_n_children (GVariantSerialised serialised) { g_variant_serialised_check (serialised); DISPATCH_CASES (serialised.type_info, return gvs_/**/,/**/_n_children (serialised); ) g_assert_not_reached (); } /* < private > * g_variant_serialised_get_child: * @serialised: a #GVariantSerialised * @index_: the index of the child to fetch * * Extracts a child from a serialised data representing a container * value. * * It is an error to call this function with an index out of bounds. * * If the result .data == %NULL and .size > 0 then there has been an * error extracting the requested fixed-sized value. This number of * zero bytes needs to be allocated instead. * * In the case that .data == %NULL and .size == 0 then a zero-sized * item of a variable-sized type is being returned. * * .data is never non-%NULL if size is 0. * * Returns: a #GVariantSerialised for the child */ GVariantSerialised g_variant_serialised_get_child (GVariantSerialised serialised, gsize index_) { GVariantSerialised child; g_variant_serialised_check (serialised); if G_LIKELY (index_ < g_variant_serialised_n_children (serialised)) { DISPATCH_CASES (serialised.type_info, child = gvs_/**/,/**/_get_child (serialised, index_); g_assert (child.size || child.data == NULL); g_variant_serialised_check (child); return child; ) g_assert_not_reached (); } g_error ("Attempt to access item %"G_GSIZE_FORMAT " in a container with only %"G_GSIZE_FORMAT" items", index_, g_variant_serialised_n_children (serialised)); } /* < private > * g_variant_serialiser_serialise: * @serialised: a #GVariantSerialised, properly set up * @gvs_filler: the filler function * @children: an array of child items * @n_children: the size of @children * * Writes data in serialised form. * * The type_info field of @serialised must be filled in to type info for * the type that we are serialising. * * The size field of @serialised must be filled in with the value * returned by a previous call to g_variant_serialiser_needed_size(). * * The data field of @serialised must be a pointer to a properly-aligned * memory region large enough to serialise into (ie: at least as big as * the size field). * * This function is only resonsible for serialising the top-level * container. @gvs_filler is called on each child of the container in * order for all of the data of that child to be filled in. */ void g_variant_serialiser_serialise (GVariantSerialised serialised, GVariantSerialisedFiller gvs_filler, const gpointer *children, gsize n_children) { g_variant_serialised_check (serialised); DISPATCH_CASES (serialised.type_info, gvs_/**/,/**/_serialise (serialised, gvs_filler, children, n_children); return; ) g_assert_not_reached (); } /* < private > * g_variant_serialiser_needed_size: * @type_info: the type to serialise for * @gvs_filler: the filler function * @children: an array of child items * @n_children: the size of @children * * Determines how much memory would be needed to serialise this value. * * This function is only resonsible for performing calculations for the * top-level container. @gvs_filler is called on each child of the * container in order to determine its size. */ gsize g_variant_serialiser_needed_size (GVariantTypeInfo *type_info, GVariantSerialisedFiller gvs_filler, const gpointer *children, gsize n_children) { DISPATCH_CASES (type_info, return gvs_/**/,/**/_needed_size (type_info, gvs_filler, children, n_children); ) g_assert_not_reached (); } /* Byteswapping {{{2 */ /* < private > * g_variant_serialised_byteswap: * @value: a #GVariantSerialised * * Byte-swap serialised data. The result of this function is only * well-defined if the data is in normal form. */ void g_variant_serialised_byteswap (GVariantSerialised serialised) { gsize fixed_size; guint alignment; g_variant_serialised_check (serialised); if (!serialised.data) return; /* the types we potentially need to byteswap are * exactly those with alignment requirements. */ g_variant_type_info_query (serialised.type_info, &alignment, &fixed_size); if (!alignment) return; /* if fixed size and alignment are equal then we are down * to the base integer type and we should swap it. the * only exception to this is if we have a tuple with a * single item, and then swapping it will be OK anyway. */ if (alignment + 1 == fixed_size) { switch (fixed_size) { case 2: { guint16 *ptr = (guint16 *) serialised.data; g_assert_cmpint (serialised.size, ==, 2); *ptr = GUINT16_SWAP_LE_BE (*ptr); } return; case 4: { guint32 *ptr = (guint32 *) serialised.data; g_assert_cmpint (serialised.size, ==, 4); *ptr = GUINT32_SWAP_LE_BE (*ptr); } return; case 8: { guint64 *ptr = (guint64 *) serialised.data; g_assert_cmpint (serialised.size, ==, 8); *ptr = GUINT64_SWAP_LE_BE (*ptr); } return; default: g_assert_not_reached (); } } /* else, we have a container that potentially contains * some children that need to be byteswapped. */ else { gsize children, i; children = g_variant_serialised_n_children (serialised); for (i = 0; i < children; i++) { GVariantSerialised child; child = g_variant_serialised_get_child (serialised, i); g_variant_serialised_byteswap (child); g_variant_type_info_unref (child.type_info); } } } /* Normal form checking {{{2 */ /* < private > * g_variant_serialised_is_normal: * @serialised: a #GVariantSerialised * * Determines, recursively if @serialised is in normal form. There is * precisely one normal form of serialised data for each possible value. * * It is possible that multiple byte sequences form the serialised data * for a given value if, for example, the padding bytes are filled in * with something other than zeros, but only one form is the normal * form. */ gboolean g_variant_serialised_is_normal (GVariantSerialised serialised) { DISPATCH_CASES (serialised.type_info, return gvs_/**/,/**/_is_normal (serialised); ) if (serialised.data == NULL) return FALSE; /* some hard-coded terminal cases */ switch (g_variant_type_info_get_type_char (serialised.type_info)) { case 'b': /* boolean */ return serialised.data[0] < 2; case 's': /* string */ return g_variant_serialiser_is_string (serialised.data, serialised.size); case 'o': return g_variant_serialiser_is_object_path (serialised.data, serialised.size); case 'g': return g_variant_serialiser_is_signature (serialised.data, serialised.size); default: /* all of the other types are fixed-sized numerical types for * which all possible values are valid (including various NaN * representations for floating point values). */ return TRUE; } } /* Validity-checking functions {{{2 * * Checks if strings, object paths and signature strings are valid. */ /* < private > * g_variant_serialiser_is_string: * @data: a possible string * @size: the size of @data * * Ensures that @data is a valid string with a nul terminator at the end * and no nul bytes embedded. */ gboolean g_variant_serialiser_is_string (gconstpointer data, gsize size) { const gchar *expected_end; const gchar *end; if (size == 0) return FALSE; expected_end = ((gchar *) data) + size - 1; if (*expected_end != '\0') return FALSE; g_utf8_validate (data, size, &end); return end == expected_end; } /* < private > * g_variant_serialiser_is_object_path: * @data: a possible D-Bus object path * @size: the size of @data * * Performs the checks for being a valid string. * * Also, ensures that @data is a valid DBus object path, as per the D-Bus * specification. */ gboolean g_variant_serialiser_is_object_path (gconstpointer data, gsize size) { const gchar *string = data; gsize i; if (!g_variant_serialiser_is_string (data, size)) return FALSE; /* The path must begin with an ASCII '/' (integer 47) character */ if (string[0] != '/') return FALSE; for (i = 1; string[i]; i++) /* Each element must only contain the ASCII characters * "[A-Z][a-z][0-9]_" */ if (g_ascii_isalnum (string[i]) || string[i] == '_') ; /* must consist of elements separated by slash characters. */ else if (string[i] == '/') { /* No element may be the empty string. */ /* Multiple '/' characters cannot occur in sequence. */ if (string[i - 1] == '/') return FALSE; } else return FALSE; /* A trailing '/' character is not allowed unless the path is the * root path (a single '/' character). */ if (i > 1 && string[i - 1] == '/') return FALSE; return TRUE; } /* < private > * g_variant_serialiser_is_signature: * @data: a possible D-Bus signature * @size: the size of @data * * Performs the checks for being a valid string. * * Also, ensures that @data is a valid D-Bus type signature, as per the * D-Bus specification. */ gboolean g_variant_serialiser_is_signature (gconstpointer data, gsize size) { const gchar *string = data; gsize first_invalid; if (!g_variant_serialiser_is_string (data, size)) return FALSE; /* make sure no non-definite characters appear */ first_invalid = strspn (string, "ybnqiuxthdvasog(){}"); if (string[first_invalid]) return FALSE; /* make sure each type string is well-formed */ while (*string) if (!g_variant_type_string_scan (string, NULL, &string)) return FALSE; return TRUE; } /* Epilogue {{{1 */ /* vim:set foldmethod=marker: */ pkg-config-0.29.1/glib/glib/gmain.h0000664000175000017500000005356312651243552013671 00000000000000/* gmain.h - the GLib Main loop * Copyright (C) 1998-2000 Red Hat, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __G_MAIN_H__ #define __G_MAIN_H__ #if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) #error "Only can be included directly." #endif #include #include #include 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: * * The GMainContext struct is an opaque data * type representing a set of sources to be handled in a main loop. */ typedef struct _GMainContext GMainContext; /** * GMainLoop: * * The GMainLoop struct is an opaque data type * representing the main event loop of a GLib or GTK+ application. */ typedef struct _GMainLoop GMainLoop; /** * GSource: * * The GSource struct is an opaque data type * representing an event source. */ typedef struct _GSource GSource; typedef struct _GSourcePrivate GSourcePrivate; /** * GSourceCallbackFuncs: * @ref: Called when a reference is added to the callback object * @unref: Called when a reference to the callback object is dropped * @get: Called to extract the callback function and data from the * callback object. * The GSourceCallbackFuncs struct contains * functions for managing callback objects. */ typedef struct _GSourceCallbackFuncs GSourceCallbackFuncs; /** * GSourceFuncs: * @prepare: Called before all the file descriptors are polled. If the * source can determine that it is ready here (without waiting for the * results of the 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. 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. 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 * function may be %NULL if the source was never connected to a callback * using g_source_set_callback(). The @dispatch function should call the * callback function with @user_data and whatever additional parameters * are needed for this type of event source. * @finalize: Called when the source is finalized. * * The GSourceFuncs struct contains a table of * functions used to handle event sources in a generic manner. * * For idle sources, the prepare and check functions always return %TRUE * to indicate that the source is always ready to be processed. The prepare * function also returns a timeout value of 0 to ensure that the poll() call * doesn't block (since that would be time wasted which could have been spent * running the idle function). * * For timeout sources, the prepare and check functions both return %TRUE * if the timeout interval has expired. The prepare function also returns * a timeout value to ensure that the poll() call doesn't block too long * and miss the next timeout. * * For file descriptor sources, the prepare function typically returns %FALSE, * since it must wait until poll() has been called before it knows whether * any events need to be processed. It sets the returned timeout to -1 to * indicate that it doesn't mind how long the poll() call blocks. In the * check function, it tests the results of the poll() call to see if the * required condition has been met, and returns %TRUE if so. */ typedef struct _GSourceFuncs GSourceFuncs; /** * GPid: * * A type which is used to hold a process identification. * * On UNIX, processes are identified by a process id (an integer), * while Windows uses process handles (which are pointers). * * GPid is used in GLib only for descendant processes spawned with * the g_spawn functions. */ /** * GSourceFunc: * @user_data: data passed to the function, set when the source was * created with one of the above functions * * 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. #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, encoded * in a platform-specific manner * @user_data: user data passed to g_child_watch_add() * * 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, gpointer user_data); struct _GSource { /*< private >*/ gpointer callback_data; GSourceCallbackFuncs *callback_funcs; const GSourceFuncs *source_funcs; guint ref_count; GMainContext *context; gint priority; guint flags; guint source_id; GSList *poll_fds; GSource *prev; GSource *next; char *name; GSourcePrivate *priv; }; struct _GSourceCallbackFuncs { void (*ref) (gpointer cb_data); void (*unref) (gpointer cb_data); void (*get) (gpointer cb_data, GSource *source, GSourceFunc *func, gpointer *data); }; /** * GSourceDummyMarshal: * * This is just a placeholder for #GClosureMarshal, * which cannot be used here for dependency reasons. */ typedef void (*GSourceDummyMarshal) (void); struct _GSourceFuncs { gboolean (*prepare) (GSource *source, gint *timeout_); gboolean (*check) (GSource *source); gboolean (*dispatch) (GSource *source, GSourceFunc callback, gpointer user_data); void (*finalize) (GSource *source); /* Can be NULL */ /*< private >*/ /* For use by g_source_set_closure */ GSourceFunc closure_callback; GSourceDummyMarshal closure_marshal; /* Really is of type GClosureMarshal */ }; /* Standard priorities */ /** * G_PRIORITY_HIGH: * * Use this for high priority event sources. * * It is not used within GLib or GTK+. */ #define G_PRIORITY_HIGH -100 /** * G_PRIORITY_DEFAULT: * * Use this for default priority event sources. * * In GLib this priority is used when adding timeout functions * with g_timeout_add(). In GDK this priority is used for events * from the X server. */ #define G_PRIORITY_DEFAULT 0 /** * G_PRIORITY_HIGH_IDLE: * * Use this for high priority idle functions. * * GTK+ uses #G_PRIORITY_HIGH_IDLE + 10 for resizing operations, * and #G_PRIORITY_HIGH_IDLE + 20 for redrawing operations. (This is * done to ensure that any pending resizes are processed before any * pending redraws, so that widgets are not redrawn twice unnecessarily.) */ #define G_PRIORITY_HIGH_IDLE 100 /** * G_PRIORITY_DEFAULT_IDLE: * * Use this for default priority idle functions. * * In GLib this priority is used when adding idle functions with * g_idle_add(). */ #define G_PRIORITY_DEFAULT_IDLE 200 /** * G_PRIORITY_LOW: * * Use this for very low priority background tasks. * * It is not used within GLib or GTK+. */ #define G_PRIORITY_LOW 300 /** * G_SOURCE_REMOVE: * * Use this macro as the return value of a #GSourceFunc to remove * the #GSource from the main loop. * * Since: 2.32 */ #define G_SOURCE_REMOVE FALSE /** * G_SOURCE_CONTINUE: * * Use this macro as the return value of a #GSourceFunc to leave * the #GSource in the main loop. * * Since: 2.32 */ #define G_SOURCE_CONTINUE TRUE /* 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); 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, GClosure *closure); */ /* 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); /* Hook for GClosure / GSource integration. Don't touch */ GLIB_VAR GSourceFuncs g_timeout_funcs; GLIB_VAR GSourceFuncs g_child_watch_funcs; GLIB_VAR GSourceFuncs g_idle_funcs; #ifdef G_OS_UNIX GLIB_VAR GSourceFuncs g_unix_signal_funcs; GLIB_VAR GSourceFuncs g_unix_fd_source_funcs; #endif G_END_DECLS #endif /* __G_MAIN_H__ */ pkg-config-0.29.1/glib/glib/gerror.h0000664000175000017500000000776012651243552014074 00000000000000/* gerror.h - Error reporting system * * Copyright 2000 Red Hat, Inc. * * The Gnome Library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * The Gnome Library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with the Gnome Library; see the file COPYING.LIB. If not, * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __G_ERROR_H__ #define __G_ERROR_H__ #if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) #error "Only can be included directly." #endif #include #include G_BEGIN_DECLS /** * GError: * @domain: error domain, e.g. #G_FILE_ERROR * @code: error code, e.g. %G_FILE_ERROR_NOENT * @message: human-readable informative error message * * The GError structure contains * information about an error that has occurred. */ typedef struct _GError GError; struct _GError { GQuark domain; gint code; 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) 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); /* 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, const gchar *message); /* 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, ...) G_GNUC_PRINTF (3, 4); G_END_DECLS #endif /* __G_ERROR_H__ */ pkg-config-0.29.1/glib/glib/gvarianttype.c0000664000175000017500000012005312651243552015273 00000000000000/* * Copyright © 2007, 2008 Ryan Lortie * Copyright © 2009, 2010 Codethink Limited * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the licence, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * * Author: Ryan Lortie */ #include "config.h" #include "gvarianttype.h" #include #include #include /** * SECTION:gvarianttype * @title: GVariantType * @short_description: introduction to the GVariant type system * @see_also: #GVariantType, #GVariant * * This section introduces the GVariant type system. It is based, in * large part, on the D-Bus type system, with two major changes and some minor * lifting of restrictions. The DBus * specification, therefore, provides a significant amount of * information that is useful when working with GVariant. * * The first major change with respect to the D-Bus type system is the * introduction of maybe (or "nullable") types. Any type in GVariant can be * converted to a maybe type, in which case, "nothing" (or "null") becomes a * valid value. Maybe types have been added by introducing the * character "m" to type strings. * * The second major change is that the GVariant type system supports the * concept of "indefinite types" -- types that are less specific than * the normal types found in D-Bus. For example, it is possible to speak * of "an array of any type" in GVariant, where the D-Bus type system * would require you to speak of "an array of integers" or "an array of * strings". Indefinite types have been added by introducing the * characters "*", "?" and * "r" to type strings. * * Finally, all arbitrary restrictions relating to the complexity of * types are lifted along with the restriction that dictionary entries * may only appear nested inside of arrays. * * Just as in D-Bus, GVariant types are described with strings ("type * strings"). Subject to the differences mentioned above, these strings * are of the same form as those found in DBus. Note, however: D-Bus * always works in terms of messages and therefore individual type * strings appear nowhere in its interface. Instead, "signatures" * are a concatenation of the strings of the type of each argument in a * message. GVariant deals with single values directly so GVariant type * strings always describe the type of exactly one value. This means * that a D-Bus signature string is generally not a valid GVariant type * string -- except in the case that it is the signature of a message * containing exactly one argument. * * An indefinite type is similar in spirit to what may be called an * abstract type in other type systems. No value can exist that has an * indefinite type as its type, but values can exist that have types * that are subtypes of indefinite types. That is to say, * g_variant_get_type() will never return an indefinite type, but * calling g_variant_is_of_type() with an indefinite type may return * %TRUE. For example, you cannot have a value that represents "an * array of no particular type", but you can have an "array of integers" * which certainly matches the type of "an array of no particular type", * since "array of integers" is a subtype of "array of no particular * type". * * This is similar to how instances of abstract classes may not * directly exist in other type systems, but instances of their * non-abstract subtypes may. For example, in GTK, no object that has * the type of #GtkBin can exist (since #GtkBin is an abstract class), * but a #GtkWindow can certainly be instantiated, and you would say * that the #GtkWindow is a #GtkBin (since #GtkWindow is a subclass of * #GtkBin). * * A detailed description of GVariant type strings is given here: * * * GVariant Type Strings * * A GVariant type string can be any of the following: * * * * * any basic type string (listed below) * * * * * "v", "r" or * "*" * * * * * one of the characters 'a' or * 'm', followed by another type string * * * * * the character '(', followed by a concatenation * of zero or more other type strings, followed by the character * ')' * * * * * the character '{', followed by a basic type * string (see below), followed by another type string, followed by * the character '}' * * * * * A basic type string describes a basic type (as per * g_variant_type_is_basic()) and is always a single * character in length. The valid basic type strings are * "b", "y", * "n", "q", * "i", "u", * "x", "t", * "h", "d", * "s", "o", * "g" and "?". * * * The above definition is recursive to arbitrary depth. * "aaaaai" and "(ui(nq((y)))s)" * are both valid type strings, as is * "a(aa(ui)(qna{ya(yd)}))". * * * The meaning of each of the characters is as follows: * * * * * * * * Character * * * * * Meaning * * * * * * * b * * * * * the type string of %G_VARIANT_TYPE_BOOLEAN; a boolean value. * * * * * * * y * * * * * the type string of %G_VARIANT_TYPE_BYTE; a byte. * * * * * * * n * * * * * the type string of %G_VARIANT_TYPE_INT16; a signed 16 bit * integer. * * * * * * * q * * * * * the type string of %G_VARIANT_TYPE_UINT16; an unsigned 16 bit * integer. * * * * * * * i * * * * * the type string of %G_VARIANT_TYPE_INT32; a signed 32 bit * integer. * * * * * * * u * * * * * the type string of %G_VARIANT_TYPE_UINT32; an unsigned 32 bit * integer. * * * * * * * x * * * * * the type string of %G_VARIANT_TYPE_INT64; a signed 64 bit * integer. * * * * * * * t * * * * * the type string of %G_VARIANT_TYPE_UINT64; an unsigned 64 bit * integer. * * * * * * * h * * * * * the type string of %G_VARIANT_TYPE_HANDLE; a signed 32 bit * value that, by convention, is used as an index into an array * of file descriptors that are sent alongside a D-Bus message. * * * * * * * d * * * * * the type string of %G_VARIANT_TYPE_DOUBLE; a double precision * floating point value. * * * * * * * s * * * * * the type string of %G_VARIANT_TYPE_STRING; a string. * * * * * * * o * * * * * the type string of %G_VARIANT_TYPE_OBJECT_PATH; a string in * the form of a D-Bus object path. * * * * * * * g * * * * * the type string of %G_VARIANT_TYPE_STRING; a string in the * form of a D-Bus type signature. * * * * * * * ? * * * * * the type string of %G_VARIANT_TYPE_BASIC; an indefinite type * that is a supertype of any of the basic types. * * * * * * * v * * * * * the type string of %G_VARIANT_TYPE_VARIANT; a container type * that contain any other type of value. * * * * * * * a * * * * * used as a prefix on another type string to mean an array of * that type; the type string "ai", for * example, is the type of an array of 32 bit signed integers. * * * * * * * m * * * * * used as a prefix on another type string to mean a "maybe", or * "nullable", version of that type; the type string * "ms", for example, is the type of a value * that maybe contains a string, or maybe contains nothing. * * * * * * * () * * * * * used to enclose zero or more other concatenated type strings * to create a tuple type; the type string * "(is)", for example, is the type of a pair * of an integer and a string. * * * * * * * r * * * * * the type string of %G_VARIANT_TYPE_TUPLE; an indefinite type * that is a supertype of any tuple type, regardless of the * number of items. * * * * * * * {} * * * * * used to enclose a basic type string concatenated with another * type string to create a dictionary entry type, which usually * appears inside of an array to form a dictionary; the type * string "a{sd}", for example, is the type of * a dictionary that maps strings to double precision floating * point values. * * * The first type (the basic type) is the key type and the second * type is the value type. The reason that the first type is * restricted to being a basic type is so that it can easily be * hashed. * * * * * * * * * * * * * the type string of %G_VARIANT_TYPE_ANY; the indefinite type * that is a supertype of all types. Note that, as with all type * strings, this character represents exactly one type. It * cannot be used inside of tuples to mean "any number of items". * * * * * * * * Any type string of a container that contains an indefinite type is, * itself, an indefinite type. For example, the type string * "a*" (corresponding to %G_VARIANT_TYPE_ARRAY) is * an indefinite type that is a supertype of every array type. * "(*s)" is a supertype of all tuples that * contain exactly two items where the second item is a string. * * * "a{?*}" is an indefinite type that is a * supertype of all arrays containing dictionary entries where the key * is any basic type and the value is any type at all. This is, by * definition, a dictionary, so this type string corresponds to * %G_VARIANT_TYPE_DICTIONARY. Note that, due to the restriction that * the key of a dictionary entry must be a basic type, * "{**}" is not a valid type string. * * */ static gboolean g_variant_type_check (const GVariantType *type) { if (type == NULL) return FALSE; #if 0 return g_variant_type_string_scan ((const gchar *) type, NULL, NULL); #else return TRUE; #endif } /** * g_variant_type_string_scan: * @string: a pointer to any string * @limit: (allow-none): the end of @string, or %NULL * @endptr: (out) (allow-none): location to store the end pointer, or %NULL * * Scan for a single complete and valid GVariant type string in @string. * The memory pointed to by @limit (or bytes beyond it) is never * accessed. * * If a valid type string is found, @endptr is updated to point to the * first character past the end of the string that was found and %TRUE * is returned. * * If there is no valid type string starting at @string, or if the type * string does not end before @limit then %FALSE is returned. * * For the simple case of checking if a string is a valid type string, * see g_variant_type_string_is_valid(). * * Returns: %TRUE if a valid type string was found * * Since: 2.24 **/ gboolean g_variant_type_string_scan (const gchar *string, const gchar *limit, const gchar **endptr) { g_return_val_if_fail (string != NULL, FALSE); if (string == limit || *string == '\0') return FALSE; switch (*string++) { case '(': while (string == limit || *string != ')') if (!g_variant_type_string_scan (string, limit, &string)) return FALSE; string++; break; case '{': if (string == limit || *string == '\0' || /* { */ !strchr ("bynqihuxtdsog?", *string++) || /* key */ !g_variant_type_string_scan (string, limit, &string) || /* value */ string == limit || *string++ != '}') /* } */ return FALSE; break; case 'm': case 'a': return g_variant_type_string_scan (string, limit, endptr); case 'b': case 'y': case 'n': case 'q': case 'i': case 'u': case 'x': case 't': case 'd': case 's': case 'o': case 'g': case 'v': case 'r': case '*': case '?': case 'h': break; default: return FALSE; } if (endptr != NULL) *endptr = string; return TRUE; } /** * g_variant_type_string_is_valid: * @type_string: a pointer to any string * * Checks if @type_string is a valid GVariant type string. This call is * equivalent to calling g_variant_type_string_scan() and confirming * that the following character is a nul terminator. * * Returns: %TRUE if @type_string is exactly one valid type string * * Since 2.24 **/ gboolean g_variant_type_string_is_valid (const gchar *type_string) { const gchar *endptr; g_return_val_if_fail (type_string != NULL, FALSE); if (!g_variant_type_string_scan (type_string, NULL, &endptr)) return FALSE; return *endptr == '\0'; } /** * g_variant_type_free: * @type: (allow-none): a #GVariantType, or %NULL * * Frees a #GVariantType that was allocated with * g_variant_type_copy(), g_variant_type_new() or one of the container * type constructor functions. * * In the case that @type is %NULL, this function does nothing. * * Since 2.24 **/ void g_variant_type_free (GVariantType *type) { g_return_if_fail (type == NULL || g_variant_type_check (type)); g_free (type); } /** * g_variant_type_copy: * @type: a #GVariantType * * Makes a copy of a #GVariantType. It is appropriate to call * g_variant_type_free() on the return value. @type may not be %NULL. * * Returns: (transfer full): a new #GVariantType * * Since 2.24 **/ GVariantType * g_variant_type_copy (const GVariantType *type) { gsize length; gchar *new; g_return_val_if_fail (g_variant_type_check (type), NULL); length = g_variant_type_get_string_length (type); new = g_malloc (length + 1); memcpy (new, type, length); new[length] = '\0'; return (GVariantType *) new; } /** * g_variant_type_new: * @type_string: a valid GVariant type string * * Creates a new #GVariantType corresponding to the type string given * by @type_string. It is appropriate to call g_variant_type_free() on * the return value. * * It is a programmer error to call this function with an invalid type * string. Use g_variant_type_string_is_valid() if you are unsure. * * Returns: (transfer full): a new #GVariantType * * Since: 2.24 */ GVariantType * g_variant_type_new (const gchar *type_string) { g_return_val_if_fail (type_string != NULL, NULL); return g_variant_type_copy (G_VARIANT_TYPE (type_string)); } /** * g_variant_type_get_string_length: * @type: a #GVariantType * * Returns the length of the type string corresponding to the given * @type. This function must be used to determine the valid extent of * the memory region returned by g_variant_type_peek_string(). * * Returns: the length of the corresponding type string * * Since 2.24 **/ gsize g_variant_type_get_string_length (const GVariantType *type) { const gchar *type_string = (const gchar *) type; gint brackets = 0; gsize index = 0; g_return_val_if_fail (g_variant_type_check (type), 0); do { while (type_string[index] == 'a' || type_string[index] == 'm') index++; if (type_string[index] == '(' || type_string[index] == '{') brackets++; else if (type_string[index] == ')' || type_string[index] == '}') brackets--; index++; } while (brackets); return index; } /* This function is not introspectable, it returns something that is not an array and neither a string */ /** * g_variant_type_peek_string: (skip) * @type: a #GVariantType * * Returns the type string corresponding to the given @type. The * result is not nul-terminated; in order to determine its length you * must call g_variant_type_get_string_length(). * * To get a nul-terminated string, see g_variant_type_dup_string(). * * Returns: the corresponding type string (not nul-terminated) * * Since 2.24 **/ const gchar * g_variant_type_peek_string (const GVariantType *type) { g_return_val_if_fail (g_variant_type_check (type), NULL); return (const gchar *) type; } /** * g_variant_type_dup_string: * @type: a #GVariantType * * Returns a newly-allocated copy of the type string corresponding to * @type. The returned string is nul-terminated. It is appropriate to * call g_free() on the return value. * * Returns: (transfer full): the corresponding type string * * Since 2.24 **/ gchar * g_variant_type_dup_string (const GVariantType *type) { g_return_val_if_fail (g_variant_type_check (type), NULL); return g_strndup (g_variant_type_peek_string (type), g_variant_type_get_string_length (type)); } /** * g_variant_type_is_definite: * @type: a #GVariantType * * Determines if the given @type is definite (ie: not indefinite). * * A type is definite if its type string does not contain any indefinite * type characters ('*', '?', or 'r'). * * A #GVariant instance may not have an indefinite type, so calling * this function on the result of g_variant_get_type() will always * result in %TRUE being returned. Calling this function on an * indefinite type like %G_VARIANT_TYPE_ARRAY, however, will result in * %FALSE being returned. * * Returns: %TRUE if @type is definite * * Since 2.24 **/ gboolean g_variant_type_is_definite (const GVariantType *type) { const gchar *type_string; gsize type_length; gsize i; g_return_val_if_fail (g_variant_type_check (type), FALSE); type_length = g_variant_type_get_string_length (type); type_string = g_variant_type_peek_string (type); for (i = 0; i < type_length; i++) if (type_string[i] == '*' || type_string[i] == '?' || type_string[i] == 'r') return FALSE; return TRUE; } /** * g_variant_type_is_container: * @type: a #GVariantType * * Determines if the given @type is a container type. * * Container types are any array, maybe, tuple, or dictionary * entry types plus the variant type. * * This function returns %TRUE for any indefinite type for which every * definite subtype is a container -- %G_VARIANT_TYPE_ARRAY, for * example. * * Returns: %TRUE if @type is a container type * * Since 2.24 **/ gboolean g_variant_type_is_container (const GVariantType *type) { gchar first_char; g_return_val_if_fail (g_variant_type_check (type), FALSE); first_char = g_variant_type_peek_string (type)[0]; switch (first_char) { case 'a': case 'm': case 'r': case '(': case '{': case 'v': return TRUE; default: return FALSE; } } /** * g_variant_type_is_basic: * @type: a #GVariantType * * Determines if the given @type is a basic type. * * Basic types are booleans, bytes, integers, doubles, strings, object * paths and signatures. * * Only a basic type may be used as the key of a dictionary entry. * * This function returns %FALSE for all indefinite types except * %G_VARIANT_TYPE_BASIC. * * Returns: %TRUE if @type is a basic type * * Since 2.24 **/ gboolean g_variant_type_is_basic (const GVariantType *type) { gchar first_char; g_return_val_if_fail (g_variant_type_check (type), FALSE); first_char = g_variant_type_peek_string (type)[0]; switch (first_char) { case 'b': case 'y': case 'n': case 'q': case 'i': case 'h': case 'u': case 't': case 'x': case 'd': case 's': case 'o': case 'g': case '?': return TRUE; default: return FALSE; } } /** * g_variant_type_is_maybe: * @type: a #GVariantType * * Determines if the given @type is a maybe type. This is true if the * type string for @type starts with an 'm'. * * This function returns %TRUE for any indefinite type for which every * definite subtype is a maybe type -- %G_VARIANT_TYPE_MAYBE, for * example. * * Returns: %TRUE if @type is a maybe type * * Since 2.24 **/ gboolean g_variant_type_is_maybe (const GVariantType *type) { g_return_val_if_fail (g_variant_type_check (type), FALSE); return g_variant_type_peek_string (type)[0] == 'm'; } /** * g_variant_type_is_array: * @type: a #GVariantType * * Determines if the given @type is an array type. This is true if the * type string for @type starts with an 'a'. * * This function returns %TRUE for any indefinite type for which every * definite subtype is an array type -- %G_VARIANT_TYPE_ARRAY, for * example. * * Returns: %TRUE if @type is an array type * * Since 2.24 **/ gboolean g_variant_type_is_array (const GVariantType *type) { g_return_val_if_fail (g_variant_type_check (type), FALSE); return g_variant_type_peek_string (type)[0] == 'a'; } /** * g_variant_type_is_tuple: * @type: a #GVariantType * * Determines if the given @type is a tuple type. This is true if the * type string for @type starts with a '(' or if @type is * %G_VARIANT_TYPE_TUPLE. * * This function returns %TRUE for any indefinite type for which every * definite subtype is a tuple type -- %G_VARIANT_TYPE_TUPLE, for * example. * * Returns: %TRUE if @type is a tuple type * * Since 2.24 **/ gboolean g_variant_type_is_tuple (const GVariantType *type) { gchar type_char; g_return_val_if_fail (g_variant_type_check (type), FALSE); type_char = g_variant_type_peek_string (type)[0]; return type_char == 'r' || type_char == '('; } /** * g_variant_type_is_dict_entry: * @type: a #GVariantType * * Determines if the given @type is a dictionary entry type. This is * true if the type string for @type starts with a '{'. * * This function returns %TRUE for any indefinite type for which every * definite subtype is a dictionary entry type -- * %G_VARIANT_TYPE_DICT_ENTRY, for example. * * Returns: %TRUE if @type is a dictionary entry type * * Since 2.24 **/ gboolean g_variant_type_is_dict_entry (const GVariantType *type) { g_return_val_if_fail (g_variant_type_check (type), FALSE); return g_variant_type_peek_string (type)[0] == '{'; } /** * g_variant_type_is_variant: * @type: a #GVariantType * * Determines if the given @type is the variant type. * * Returns: %TRUE if @type is the variant type * * Since 2.24 **/ gboolean g_variant_type_is_variant (const GVariantType *type) { g_return_val_if_fail (g_variant_type_check (type), FALSE); return g_variant_type_peek_string (type)[0] == 'v'; } /** * g_variant_type_hash: * @type: (type GVariantType): a #GVariantType * * Hashes @type. * * The argument type of @type is only #gconstpointer to allow use with * #GHashTable without function pointer casting. A valid * #GVariantType must be provided. * * Returns: the hash value * * Since 2.24 **/ guint g_variant_type_hash (gconstpointer type) { const gchar *type_string; guint value = 0; gsize length; gsize i; g_return_val_if_fail (g_variant_type_check (type), 0); type_string = g_variant_type_peek_string (type); length = g_variant_type_get_string_length (type); for (i = 0; i < length; i++) value = (value << 5) - value + type_string[i]; return value; } /** * g_variant_type_equal: * @type1: (type GVariantType): a #GVariantType * @type2: (type GVariantType): a #GVariantType * * Compares @type1 and @type2 for equality. * * Only returns %TRUE if the types are exactly equal. Even if one type * is an indefinite type and the other is a subtype of it, %FALSE will * be returned if they are not exactly equal. If you want to check for * subtypes, use g_variant_type_is_subtype_of(). * * The argument types of @type1 and @type2 are only #gconstpointer to * allow use with #GHashTable without function pointer casting. For * both arguments, a valid #GVariantType must be provided. * * Returns: %TRUE if @type1 and @type2 are exactly equal * * Since 2.24 **/ gboolean g_variant_type_equal (gconstpointer type1, gconstpointer type2) { const gchar *string1, *string2; gsize size1, size2; g_return_val_if_fail (g_variant_type_check (type1), FALSE); g_return_val_if_fail (g_variant_type_check (type2), FALSE); if (type1 == type2) return TRUE; size1 = g_variant_type_get_string_length (type1); size2 = g_variant_type_get_string_length (type2); if (size1 != size2) return FALSE; string1 = g_variant_type_peek_string (type1); string2 = g_variant_type_peek_string (type2); return memcmp (string1, string2, size1) == 0; } /** * g_variant_type_is_subtype_of: * @type: a #GVariantType * @supertype: a #GVariantType * * Checks if @type is a subtype of @supertype. * * This function returns %TRUE if @type is a subtype of @supertype. All * types are considered to be subtypes of themselves. Aside from that, * only indefinite types can have subtypes. * * Returns: %TRUE if @type is a subtype of @supertype * * Since 2.24 **/ gboolean g_variant_type_is_subtype_of (const GVariantType *type, const GVariantType *supertype) { const gchar *supertype_string; const gchar *supertype_end; const gchar *type_string; g_return_val_if_fail (g_variant_type_check (type), FALSE); g_return_val_if_fail (g_variant_type_check (supertype), FALSE); supertype_string = g_variant_type_peek_string (supertype); type_string = g_variant_type_peek_string (type); supertype_end = supertype_string + g_variant_type_get_string_length (supertype); /* we know that type and supertype are both well-formed, so it's * safe to treat this merely as a text processing problem. */ while (supertype_string < supertype_end) { char supertype_char = *supertype_string++; if (supertype_char == *type_string) type_string++; else if (*type_string == ')') return FALSE; else { const GVariantType *target_type = (GVariantType *) type_string; switch (supertype_char) { case 'r': if (!g_variant_type_is_tuple (target_type)) return FALSE; break; case '*': break; case '?': if (!g_variant_type_is_basic (target_type)) return FALSE; break; default: return FALSE; } type_string += g_variant_type_get_string_length (target_type); } } return TRUE; } /** * g_variant_type_element: * @type: an array or maybe #GVariantType * * Determines the element type of an array or maybe type. * * This function may only be used with array or maybe types. * * Returns: (transfer none): the element type of @type * * Since 2.24 **/ const GVariantType * g_variant_type_element (const GVariantType *type) { const gchar *type_string; g_return_val_if_fail (g_variant_type_check (type), NULL); type_string = g_variant_type_peek_string (type); g_assert (type_string[0] == 'a' || type_string[0] == 'm'); return (const GVariantType *) &type_string[1]; } /** * g_variant_type_first: * @type: a tuple or dictionary entry #GVariantType * * Determines the first item type of a tuple or dictionary entry * type. * * This function may only be used with tuple or dictionary entry types, * but must not be used with the generic tuple type * %G_VARIANT_TYPE_TUPLE. * * In the case of a dictionary entry type, this returns the type of * the key. * * %NULL is returned in case of @type being %G_VARIANT_TYPE_UNIT. * * This call, together with g_variant_type_next() provides an iterator * interface over tuple and dictionary entry types. * * Returns: (transfer none): the first item type of @type, or %NULL * * Since 2.24 **/ const GVariantType * g_variant_type_first (const GVariantType *type) { const gchar *type_string; g_return_val_if_fail (g_variant_type_check (type), NULL); type_string = g_variant_type_peek_string (type); g_assert (type_string[0] == '(' || type_string[0] == '{'); if (type_string[1] == ')') return NULL; return (const GVariantType *) &type_string[1]; } /** * g_variant_type_next: * @type: a #GVariantType from a previous call * * Determines the next item type of a tuple or dictionary entry * type. * * @type must be the result of a previous call to * g_variant_type_first() or g_variant_type_next(). * * If called on the key type of a dictionary entry then this call * returns the value type. If called on the value type of a dictionary * entry then this call returns %NULL. * * For tuples, %NULL is returned when @type is the last item in a tuple. * * Returns: (transfer none): the next #GVariantType after @type, or %NULL * * Since 2.24 **/ const GVariantType * g_variant_type_next (const GVariantType *type) { const gchar *type_string; g_return_val_if_fail (g_variant_type_check (type), NULL); type_string = g_variant_type_peek_string (type); type_string += g_variant_type_get_string_length (type); if (*type_string == ')' || *type_string == '}') return NULL; return (const GVariantType *) type_string; } /** * g_variant_type_n_items: * @type: a tuple or dictionary entry #GVariantType * * Determines the number of items contained in a tuple or * dictionary entry type. * * This function may only be used with tuple or dictionary entry types, * but must not be used with the generic tuple type * %G_VARIANT_TYPE_TUPLE. * * In the case of a dictionary entry type, this function will always * return 2. * * Returns: the number of items in @type * * Since 2.24 **/ gsize g_variant_type_n_items (const GVariantType *type) { gsize count = 0; g_return_val_if_fail (g_variant_type_check (type), 0); for (type = g_variant_type_first (type); type; type = g_variant_type_next (type)) count++; return count; } /** * g_variant_type_key: * @type: a dictionary entry #GVariantType * * Determines the key type of a dictionary entry type. * * This function may only be used with a dictionary entry type. Other * than the additional restriction, this call is equivalent to * g_variant_type_first(). * * Returns: (transfer none): the key type of the dictionary entry * * Since 2.24 **/ const GVariantType * g_variant_type_key (const GVariantType *type) { const gchar *type_string; g_return_val_if_fail (g_variant_type_check (type), NULL); type_string = g_variant_type_peek_string (type); g_assert (type_string[0] == '{'); return (const GVariantType *) &type_string[1]; } /** * g_variant_type_value: * @type: a dictionary entry #GVariantType * * Determines the value type of a dictionary entry type. * * This function may only be used with a dictionary entry type. * * Returns: (transfer none): the value type of the dictionary entry * * Since 2.24 **/ const GVariantType * g_variant_type_value (const GVariantType *type) { const gchar *type_string; g_return_val_if_fail (g_variant_type_check (type), NULL); type_string = g_variant_type_peek_string (type); g_assert (type_string[0] == '{'); return g_variant_type_next (g_variant_type_key (type)); } /** * g_variant_type_new_tuple: * @items: (array length=length): an array of #GVariantTypes, one for each item * @length: the length of @items, or -1 * * Constructs a new tuple type, from @items. * * @length is the number of items in @items, or -1 to indicate that * @items is %NULL-terminated. * * It is appropriate to call g_variant_type_free() on the return value. * * Returns: (transfer full): a new tuple #GVariantType * * Since 2.24 **/ static GVariantType * g_variant_type_new_tuple_slow (const GVariantType * const *items, gint length) { /* the "slow" version is needed in case the static buffer of 1024 * bytes is exceeded when running the normal version. this will * happen only in truly insane code, so it can be slow. */ GString *string; gsize i; string = g_string_new ("("); for (i = 0; i < length; i++) { const GVariantType *type; gsize size; g_return_val_if_fail (g_variant_type_check (items[i]), NULL); type = items[i]; size = g_variant_type_get_string_length (type); g_string_append_len (string, (const gchar *) type, size); } g_string_append_c (string, ')'); return (GVariantType *) g_string_free (string, FALSE); } GVariantType * g_variant_type_new_tuple (const GVariantType * const *items, gint length) { char buffer[1024]; gsize offset; gsize i; g_return_val_if_fail (length == 0 || items != NULL, NULL); if (length < 0) for (length = 0; items[length] != NULL; length++); offset = 0; buffer[offset++] = '('; for (i = 0; i < length; i++) { const GVariantType *type; gsize size; g_return_val_if_fail (g_variant_type_check (items[i]), NULL); type = items[i]; size = g_variant_type_get_string_length (type); if (offset + size >= sizeof buffer) /* leave room for ')' */ return g_variant_type_new_tuple_slow (items, length); memcpy (&buffer[offset], type, size); offset += size; } g_assert (offset < sizeof buffer); buffer[offset++] = ')'; return (GVariantType *) g_memdup (buffer, offset); } /** * g_variant_type_new_array: (constructor) * @element: a #GVariantType * * Constructs the type corresponding to an array of elements of the * type @type. * * It is appropriate to call g_variant_type_free() on the return value. * * Returns: (transfer full): a new array #GVariantType * * Since 2.24 **/ GVariantType * g_variant_type_new_array (const GVariantType *element) { gsize size; gchar *new; g_return_val_if_fail (g_variant_type_check (element), NULL); size = g_variant_type_get_string_length (element); new = g_malloc (size + 1); new[0] = 'a'; memcpy (new + 1, element, size); return (GVariantType *) new; } /** * g_variant_type_new_maybe: (constructor) * @element: a #GVariantType * * Constructs the type corresponding to a maybe instance containing * type @type or Nothing. * * It is appropriate to call g_variant_type_free() on the return value. * * Returns: (transfer full): a new maybe #GVariantType * * Since 2.24 **/ GVariantType * g_variant_type_new_maybe (const GVariantType *element) { gsize size; gchar *new; g_return_val_if_fail (g_variant_type_check (element), NULL); size = g_variant_type_get_string_length (element); new = g_malloc (size + 1); new[0] = 'm'; memcpy (new + 1, element, size); return (GVariantType *) new; } /** * g_variant_type_new_dict_entry: (constructor) * @key: a basic #GVariantType * @value: a #GVariantType * * Constructs the type corresponding to a dictionary entry with a key * of type @key and a value of type @value. * * It is appropriate to call g_variant_type_free() on the return value. * * Returns: (transfer full): a new dictionary entry #GVariantType * * Since 2.24 **/ GVariantType * g_variant_type_new_dict_entry (const GVariantType *key, const GVariantType *value) { gsize keysize, valsize; gchar *new; g_return_val_if_fail (g_variant_type_check (key), NULL); g_return_val_if_fail (g_variant_type_check (value), NULL); keysize = g_variant_type_get_string_length (key); valsize = g_variant_type_get_string_length (value); new = g_malloc (1 + keysize + valsize + 1); new[0] = '{'; memcpy (new + 1, key, keysize); memcpy (new + 1 + keysize, value, valsize); new[1 + keysize + valsize] = '}'; return (GVariantType *) new; } /* private */ const GVariantType * g_variant_type_checked_ (const gchar *type_string) { g_return_val_if_fail (g_variant_type_string_is_valid (type_string), NULL); return (const GVariantType *) type_string; } pkg-config-0.29.1/glib/glib/genviron.h0000664000175000017500000000552312651243552014416 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the GLib Team and others 1997-2000. See the AUTHORS * file for a list of people on the GLib Team. See the ChangeLog * files for a list of changes. These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/. */ #ifndef __G_ENVIRON_H__ #define __G_ENVIRON_H__ #if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) #error "Only can be included directly." #endif #include G_BEGIN_DECLS 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__ */ pkg-config-0.29.1/glib/glib/gbase64.c0000664000175000017500000003350112651243552014012 00000000000000/* gbase64.c - Base64 encoding/decoding * * Copyright (C) 2006 Alexander Larsson * Copyright (C) 2000-2003 Ximian Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * * This is based on code in camel, written by: * Michael Zucchi * Jeffrey Stedfast */ #include "config.h" #include #include "gbase64.h" #include "gtestutils.h" #include "glibintl.h" /** * SECTION:base64 * @title: Base64 Encoding * @short_description: encodes and decodes data in Base64 format * * Base64 is an encoding that allows a sequence of arbitrary bytes to be * encoded as a sequence of printable ASCII characters. For the definition * of Base64, see RFC * 1421 or RFC * 2045. Base64 is most commonly used as a MIME transfer encoding * for email. * * GLib supports incremental encoding using g_base64_encode_step() and * g_base64_encode_close(). Incremental decoding can be done with * g_base64_decode_step(). To encode or decode data in one go, use * g_base64_encode() or g_base64_decode(). To avoid memory allocation when * decoding, you can use g_base64_decode_inplace(). * * Support for Base64 encoding has been added in GLib 2.12. */ static const char base64_alphabet[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; /** * g_base64_encode_step: * @in: (array length=len) (element-type guint8): the binary data to encode * @len: the length of @in * @break_lines: whether to break long lines * @out: (out) (array) (element-type guint8): pointer to destination buffer * @state: (inout): Saved state between steps, initialize to 0 * @save: (inout): Saved state between steps, initialize to 0 * * Incrementally encode a sequence of binary data into its Base-64 stringified * representation. By calling this function multiple times you can convert * data in chunks to avoid having to have the full encoded data in memory. * * When all of the data has been converted you must call * g_base64_encode_close() to flush the saved state. * * The output buffer must be large enough to fit all the data that will * be written to it. Due to the way base64 encodes you will need * at least: (@len / 3 + 1) * 4 + 4 bytes (+ 4 may be needed in case of * non-zero state). If you enable line-breaking you will need at least: * ((@len / 3 + 1) * 4 + 4) / 72 + 1 bytes of extra space. * * @break_lines is typically used when putting base64-encoded data in emails. * It breaks the lines at 72 columns instead of putting all of the text on * the same line. This avoids problems with long lines in the email system. * Note however that it breaks the lines with LF * characters, not CR LF sequences, so the result cannot * be passed directly to SMTP or certain other protocols. * * Return value: The number of bytes of output that was written * * Since: 2.12 */ gsize g_base64_encode_step (const guchar *in, gsize len, gboolean break_lines, gchar *out, gint *state, gint *save) { char *outptr; const guchar *inptr; g_return_val_if_fail (in != NULL, 0); g_return_val_if_fail (out != NULL, 0); g_return_val_if_fail (state != NULL, 0); g_return_val_if_fail (save != NULL, 0); if (len <= 0) return 0; inptr = in; outptr = out; if (len + ((char *) save) [0] > 2) { const guchar *inend = in+len-2; int c1, c2, c3; int already; already = *state; switch (((char *) save) [0]) { case 1: c1 = ((unsigned char *) save) [1]; goto skip1; case 2: c1 = ((unsigned char *) save) [1]; c2 = ((unsigned char *) save) [2]; goto skip2; } /* * yes, we jump into the loop, no i'm not going to change it, * it's beautiful! */ while (inptr < inend) { c1 = *inptr++; skip1: c2 = *inptr++; skip2: c3 = *inptr++; *outptr++ = base64_alphabet [ c1 >> 2 ]; *outptr++ = base64_alphabet [ c2 >> 4 | ((c1&0x3) << 4) ]; *outptr++ = base64_alphabet [ ((c2 &0x0f) << 2) | (c3 >> 6) ]; *outptr++ = base64_alphabet [ c3 & 0x3f ]; /* this is a bit ugly ... */ if (break_lines && (++already) >= 19) { *outptr++ = '\n'; already = 0; } } ((char *)save)[0] = 0; len = 2 - (inptr - inend); *state = already; } if (len>0) { char *saveout; /* points to the slot for the next char to save */ saveout = & (((char *)save)[1]) + ((char *)save)[0]; /* len can only be 0 1 or 2 */ switch(len) { case 2: *saveout++ = *inptr++; case 1: *saveout++ = *inptr++; } ((char *)save)[0] += len; } return outptr - out; } /** * g_base64_encode_close: * @break_lines: whether to break long lines * @out: (out) (array) (element-type guint8): pointer to destination buffer * @state: (inout): Saved state from g_base64_encode_step() * @save: (inout): Saved state from g_base64_encode_step() * * Flush the status from a sequence of calls to g_base64_encode_step(). * * The output buffer must be large enough to fit all the data that will * be written to it. It will need up to 4 bytes, or up to 5 bytes if * line-breaking is enabled. * * Return value: The number of bytes of output that was written * * Since: 2.12 */ gsize g_base64_encode_close (gboolean break_lines, gchar *out, gint *state, gint *save) { int c1, c2; char *outptr = out; g_return_val_if_fail (out != NULL, 0); g_return_val_if_fail (state != NULL, 0); g_return_val_if_fail (save != NULL, 0); c1 = ((unsigned char *) save) [1]; c2 = ((unsigned char *) save) [2]; switch (((char *) save) [0]) { case 2: outptr [2] = base64_alphabet[ ( (c2 &0x0f) << 2 ) ]; g_assert (outptr [2] != 0); goto skip; case 1: outptr[2] = '='; skip: outptr [0] = base64_alphabet [ c1 >> 2 ]; outptr [1] = base64_alphabet [ c2 >> 4 | ( (c1&0x3) << 4 )]; outptr [3] = '='; outptr += 4; break; } if (break_lines) *outptr++ = '\n'; *save = 0; *state = 0; return outptr - out; } /** * g_base64_encode: * @data: (array length=len) (element-type guint8): the binary data to encode * @len: the length of @data * * Encode a sequence of binary data into its Base-64 stringified * representation. * * Return value: (transfer full): a newly allocated, zero-terminated Base-64 * encoded string representing @data. The returned string must * be freed with g_free(). * * Since: 2.12 */ gchar * g_base64_encode (const guchar *data, gsize len) { gchar *out; gint state = 0, outlen; gint save = 0; g_return_val_if_fail (data != NULL || len == 0, NULL); /* We can use a smaller limit here, since we know the saved state is 0, +1 is needed for trailing \0, also check for unlikely integer overflow */ if (len >= ((G_MAXSIZE - 1) / 4 - 1) * 3) g_error("%s: input too large for Base64 encoding (%"G_GSIZE_FORMAT" chars)", G_STRLOC, len); out = g_malloc ((len / 3 + 1) * 4 + 1); outlen = g_base64_encode_step (data, len, FALSE, out, &state, &save); outlen += g_base64_encode_close (FALSE, out + outlen, &state, &save); out[outlen] = '\0'; return (gchar *) out; } static const unsigned char mime_base64_rank[256] = { 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255, 62,255,255,255, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61,255,255,255, 0,255,255, 255, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,255,255,255,255,255, 255, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, }; /** * g_base64_decode_step: * @in: (array length=len) (element-type guint8): binary input data * @len: max length of @in data to decode * @out: (out) (array) (element-type guint8): output buffer * @state: (inout): Saved state between steps, initialize to 0 * @save: (inout): Saved state between steps, initialize to 0 * * Incrementally decode a sequence of binary data from its Base-64 stringified * representation. By calling this function multiple times you can convert * data in chunks to avoid having to have the full encoded data in memory. * * The output buffer must be large enough to fit all the data that will * be written to it. Since base64 encodes 3 bytes in 4 chars you need * at least: (@len / 4) * 3 + 3 bytes (+ 3 may be needed in case of non-zero * state). * * Return value: The number of bytes of output that was written * * Since: 2.12 **/ gsize g_base64_decode_step (const gchar *in, gsize len, guchar *out, gint *state, guint *save) { const guchar *inptr; guchar *outptr; const guchar *inend; guchar c, rank; guchar last[2]; unsigned int v; int i; g_return_val_if_fail (in != NULL, 0); g_return_val_if_fail (out != NULL, 0); g_return_val_if_fail (state != NULL, 0); g_return_val_if_fail (save != NULL, 0); if (len <= 0) return 0; inend = (const guchar *)in+len; outptr = out; /* convert 4 base64 bytes to 3 normal bytes */ v=*save; i=*state; 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++; rank = mime_base64_rank [c]; if (rank != 0xff) { last[1] = last[0]; last[0] = c; v = (v<<6) | rank; i++; if (i==4) { *outptr++ = v>>16; if (last[1] != '=') *outptr++ = v>>8; if (last[0] != '=') *outptr++ = v; i=0; } } } *save = v; *state = last[0] == '=' ? -i : i; return outptr - out; } /** * g_base64_decode: * @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. 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 * that @text represents. The returned buffer must * be freed with g_free(). * * Since: 2.12 */ guchar * g_base64_decode (const gchar *text, gsize *out_len) { guchar *ret; gsize input_length; gint state = 0; guint save = 0; g_return_val_if_fail (text != NULL, NULL); g_return_val_if_fail (out_len != NULL, NULL); input_length = strlen (text); /* We can use a smaller limit here, since we know the saved state is 0, +1 used to avoid calling g_malloc0(0), and hence returning NULL */ ret = g_malloc0 ((input_length / 4) * 3 + 1); *out_len = g_base64_decode_step (text, input_length, ret, &state, &save); return ret; } /** * g_base64_decode_inplace: * @text: (inout) (array length=out_len) (element-type guint8): zero-terminated * string with base64 text to decode * @out_len: (inout): The length of the decoded data is written here * * Decode a sequence of Base-64 encoded text into binary data * by overwriting the input data. * * Return value: (transfer none): The binary data that @text responds. This pointer * is the same as the input @text. * * Since: 2.20 */ guchar * g_base64_decode_inplace (gchar *text, gsize *out_len) { gint input_length, state = 0; guint save = 0; g_return_val_if_fail (text != NULL, NULL); g_return_val_if_fail (out_len != NULL, NULL); input_length = strlen (text); g_return_val_if_fail (input_length > 1, NULL); *out_len = g_base64_decode_step (text, input_length, (guchar *) text, &state, &save); return (guchar *) text; } pkg-config-0.29.1/glib/glib/gpattern.c0000664000175000017500000003027212651243552014405 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997, 1999 Peter Mattis, Red Hat, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "config.h" #include #include "gpattern.h" #include "gmacros.h" #include "gmessages.h" #include "gmem.h" #include "gunicode.h" #include "gutils.h" /** * SECTION:patterns * @title: Glob-style pattern matching * @short_description: matches strings against patterns containing '*' * (wildcard) and '?' (joker) * * The g_pattern_match* functions match a string * against a pattern containing '*' and '?' wildcards with similar * semantics as the standard glob() function: '*' matches an arbitrary, * possibly empty, string, '?' matches an arbitrary character. * * Note that in contrast to glob(), the '/' character * can be matched by the wildcards, there are no * '[...]' character ranges and '*' and '?' can * not be escaped to include them literally in a * pattern. * * When multiple strings must be matched against the same pattern, it * is better to compile the pattern to a #GPatternSpec using * g_pattern_spec_new() and use g_pattern_match_string() instead of * g_pattern_match_simple(). This avoids the overhead of repeated * pattern compilation. **/ /** * GPatternSpec: * * A GPatternSpec is the 'compiled' form of a * pattern. This structure is opaque and its fields cannot be accessed * directly. **/ /* keep enum and structure of gpattern.c and patterntest.c in sync */ typedef enum { G_MATCH_ALL, /* "*A?A*" */ G_MATCH_ALL_TAIL, /* "*A?AA" */ G_MATCH_HEAD, /* "AAAA*" */ G_MATCH_TAIL, /* "*AAAA" */ G_MATCH_EXACT, /* "AAAAA" */ G_MATCH_LAST } GMatchType; struct _GPatternSpec { GMatchType match_type; guint pattern_length; guint min_length; guint max_length; gchar *pattern; }; /* --- functions --- */ static inline gboolean g_pattern_ph_match (const gchar *match_pattern, const gchar *match_string, gboolean *wildcard_reached_p) { register const gchar *pattern, *string; register gchar ch; pattern = match_pattern; string = match_string; ch = *pattern; pattern++; while (ch) { switch (ch) { case '?': if (!*string) return FALSE; string = g_utf8_next_char (string); break; case '*': *wildcard_reached_p = TRUE; do { ch = *pattern; pattern++; if (ch == '?') { if (!*string) return FALSE; string = g_utf8_next_char (string); } } while (ch == '*' || ch == '?'); if (!ch) return TRUE; do { gboolean next_wildcard_reached = FALSE; while (ch != *string) { if (!*string) return FALSE; string = g_utf8_next_char (string); } string++; if (g_pattern_ph_match (pattern, string, &next_wildcard_reached)) return TRUE; if (next_wildcard_reached) /* the forthcoming pattern substring up to the next wildcard has * been matched, but a mismatch occoured for the rest of the * pattern, following the next wildcard. * there's no need to advance the current match position any * further if the rest pattern will not match. */ return FALSE; } while (*string); break; default: if (ch == *string) string++; else return FALSE; break; } ch = *pattern; pattern++; } return *string == 0; } /** * g_pattern_match: * @pspec: a #GPatternSpec * @string_length: the length of @string (in bytes, i.e. strlen(), * not g_utf8_strlen()) * @string: the UTF-8 encoded string to match * @string_reversed: (allow-none): the reverse of @string or %NULL * * Matches a string against a compiled pattern. Passing the correct * length of the string given is mandatory. The reversed string can be * omitted by passing %NULL, this is more efficient if the reversed * version of the string to be matched is not at hand, as * g_pattern_match() will only construct it if the compiled pattern * requires reverse matches. * * Note that, if the user code will (possibly) match a string against a * multitude of patterns containing wildcards, chances are high that * some patterns will require a reversed string. In this case, it's * more efficient to provide the reversed string to avoid multiple * constructions thereof in the various calls to g_pattern_match(). * * Note also that the reverse of a UTF-8 encoded string can in general * not be obtained by g_strreverse(). This works * only if the string doesn't contain any multibyte characters. GLib * offers the g_utf8_strreverse() function to reverse UTF-8 encoded * strings. * * Returns: %TRUE if @string matches @pspec **/ gboolean g_pattern_match (GPatternSpec *pspec, guint string_length, const gchar *string, const gchar *string_reversed) { g_return_val_if_fail (pspec != NULL, FALSE); g_return_val_if_fail (string != NULL, FALSE); if (string_length < pspec->min_length || string_length > pspec->max_length) return FALSE; switch (pspec->match_type) { gboolean dummy; case G_MATCH_ALL: return g_pattern_ph_match (pspec->pattern, string, &dummy); case G_MATCH_ALL_TAIL: if (string_reversed) return g_pattern_ph_match (pspec->pattern, string_reversed, &dummy); else { gboolean result; gchar *tmp; tmp = g_utf8_strreverse (string, string_length); result = g_pattern_ph_match (pspec->pattern, tmp, &dummy); g_free (tmp); return result; } case G_MATCH_HEAD: if (pspec->pattern_length == string_length) return strcmp (pspec->pattern, string) == 0; else if (pspec->pattern_length) return strncmp (pspec->pattern, string, pspec->pattern_length) == 0; else return TRUE; case G_MATCH_TAIL: if (pspec->pattern_length) return strcmp (pspec->pattern, string + (string_length - pspec->pattern_length)) == 0; else return TRUE; case G_MATCH_EXACT: if (pspec->pattern_length != string_length) return FALSE; else return strcmp (pspec->pattern, string) == 0; default: g_return_val_if_fail (pspec->match_type < G_MATCH_LAST, FALSE); return FALSE; } } /** * g_pattern_spec_new: * @pattern: a zero-terminated UTF-8 encoded string * * Compiles a pattern to a #GPatternSpec. * * Returns: a newly-allocated #GPatternSpec **/ GPatternSpec* g_pattern_spec_new (const gchar *pattern) { GPatternSpec *pspec; gboolean seen_joker = FALSE, seen_wildcard = FALSE, more_wildcards = FALSE; gint hw_pos = -1, tw_pos = -1, hj_pos = -1, tj_pos = -1; gboolean follows_wildcard = FALSE; guint pending_jokers = 0; const gchar *s; gchar *d; guint i; g_return_val_if_fail (pattern != NULL, NULL); /* canonicalize pattern and collect necessary stats */ pspec = g_new (GPatternSpec, 1); pspec->pattern_length = strlen (pattern); pspec->min_length = 0; pspec->max_length = 0; pspec->pattern = g_new (gchar, pspec->pattern_length + 1); d = pspec->pattern; for (i = 0, s = pattern; *s != 0; s++) { switch (*s) { case '*': if (follows_wildcard) /* compress multiple wildcards */ { pspec->pattern_length--; continue; } follows_wildcard = TRUE; if (hw_pos < 0) hw_pos = i; tw_pos = i; break; case '?': pending_jokers++; pspec->min_length++; pspec->max_length += 4; /* maximum UTF-8 character length */ continue; default: for (; pending_jokers; pending_jokers--, i++) { *d++ = '?'; if (hj_pos < 0) hj_pos = i; tj_pos = i; } follows_wildcard = FALSE; pspec->min_length++; pspec->max_length++; break; } *d++ = *s; i++; } for (; pending_jokers; pending_jokers--) { *d++ = '?'; if (hj_pos < 0) hj_pos = i; tj_pos = i; } *d++ = 0; seen_joker = hj_pos >= 0; seen_wildcard = hw_pos >= 0; more_wildcards = seen_wildcard && hw_pos != tw_pos; if (seen_wildcard) pspec->max_length = G_MAXUINT; /* special case sole head/tail wildcard or exact matches */ if (!seen_joker && !more_wildcards) { if (pspec->pattern[0] == '*') { pspec->match_type = G_MATCH_TAIL; memmove (pspec->pattern, pspec->pattern + 1, --pspec->pattern_length); pspec->pattern[pspec->pattern_length] = 0; return pspec; } if (pspec->pattern_length > 0 && pspec->pattern[pspec->pattern_length - 1] == '*') { pspec->match_type = G_MATCH_HEAD; pspec->pattern[--pspec->pattern_length] = 0; return pspec; } if (!seen_wildcard) { pspec->match_type = G_MATCH_EXACT; return pspec; } } /* now just need to distinguish between head or tail match start */ tw_pos = pspec->pattern_length - 1 - tw_pos; /* last pos to tail distance */ tj_pos = pspec->pattern_length - 1 - tj_pos; /* last pos to tail distance */ if (seen_wildcard) pspec->match_type = tw_pos > hw_pos ? G_MATCH_ALL_TAIL : G_MATCH_ALL; else /* seen_joker */ pspec->match_type = tj_pos > hj_pos ? G_MATCH_ALL_TAIL : G_MATCH_ALL; if (pspec->match_type == G_MATCH_ALL_TAIL) { gchar *tmp = pspec->pattern; pspec->pattern = g_utf8_strreverse (pspec->pattern, pspec->pattern_length); g_free (tmp); } return pspec; } /** * g_pattern_spec_free: * @pspec: a #GPatternSpec * * Frees the memory allocated for the #GPatternSpec. **/ void g_pattern_spec_free (GPatternSpec *pspec) { g_return_if_fail (pspec != NULL); g_free (pspec->pattern); g_free (pspec); } /** * g_pattern_spec_equal: * @pspec1: a #GPatternSpec * @pspec2: another #GPatternSpec * * 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, GPatternSpec *pspec2) { g_return_val_if_fail (pspec1 != NULL, FALSE); g_return_val_if_fail (pspec2 != NULL, FALSE); return (pspec1->pattern_length == pspec2->pattern_length && pspec1->match_type == pspec2->match_type && strcmp (pspec1->pattern, pspec2->pattern) == 0); } /** * g_pattern_match_string: * @pspec: a #GPatternSpec * @string: the UTF-8 encoded string to match * * 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, const gchar *string) { g_return_val_if_fail (pspec != NULL, FALSE); g_return_val_if_fail (string != NULL, FALSE); return g_pattern_match (pspec, strlen (string), string, NULL); } /** * g_pattern_match_simple: * @pattern: the UTF-8 encoded pattern * @string: the UTF-8 encoded string to match * * 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, const gchar *string) { GPatternSpec *pspec; gboolean ergo; g_return_val_if_fail (pattern != NULL, FALSE); g_return_val_if_fail (string != NULL, FALSE); pspec = g_pattern_spec_new (pattern); ergo = g_pattern_match (pspec, strlen (string), string, NULL); g_pattern_spec_free (pspec); return ergo; } pkg-config-0.29.1/glib/glib/giochannel.h0000664000175000017500000003375612651243552014707 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the GLib Team and others 1997-2000. See the AUTHORS * file for a list of people on the GLib Team. See the ChangeLog * files for a list of changes. These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/. */ #ifndef __G_IOCHANNEL_H__ #define __G_IOCHANNEL_H__ #if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) #error "Only can be included directly." #endif #include #include #include G_BEGIN_DECLS /* GIOChannel */ typedef struct _GIOChannel GIOChannel; typedef struct _GIOFuncs GIOFuncs; typedef enum { G_IO_ERROR_NONE, G_IO_ERROR_AGAIN, G_IO_ERROR_INVAL, G_IO_ERROR_UNKNOWN } GIOError; #define G_IO_CHANNEL_ERROR g_io_channel_error_quark() typedef enum { /* Derived from errno */ G_IO_CHANNEL_ERROR_FBIG, G_IO_CHANNEL_ERROR_INVAL, G_IO_CHANNEL_ERROR_IO, G_IO_CHANNEL_ERROR_ISDIR, G_IO_CHANNEL_ERROR_NOSPC, G_IO_CHANNEL_ERROR_NXIO, G_IO_CHANNEL_ERROR_OVERFLOW, G_IO_CHANNEL_ERROR_PIPE, /* Other */ G_IO_CHANNEL_ERROR_FAILED } GIOChannelError; typedef enum { G_IO_STATUS_ERROR, G_IO_STATUS_NORMAL, G_IO_STATUS_EOF, G_IO_STATUS_AGAIN } GIOStatus; typedef enum { G_SEEK_CUR, G_SEEK_SET, G_SEEK_END } GSeekType; typedef enum { G_IO_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; struct _GIOChannel { /*< private >*/ gint ref_count; GIOFuncs *funcs; gchar *encoding; GIConv read_cd; GIConv write_cd; gchar *line_term; /* String which indicates the end of a line of text */ guint line_term_len; /* So we can have null in the line term */ gsize buf_size; GString *read_buf; /* Raw data from the channel */ GString *encoded_read_buf; /* Channel data converted to UTF-8 */ GString *write_buf; /* Data ready to be written to the file */ gchar partial_write_buf[6]; /* UTF-8 partial characters, null terminated */ /* Group the flags together, immediately after partial_write_buf, to save memory */ guint use_buffer : 1; /* The encoding uses the buffers */ guint do_encode : 1; /* The encoding uses the GIConv coverters */ guint close_on_unref : 1; /* Close the channel on final unref */ guint is_readable : 1; /* Cached GIOFlag */ guint is_writeable : 1; /* ditto */ guint is_seekable : 1; /* ditto */ gpointer reserved1; gpointer reserved2; }; typedef gboolean (*GIOFunc) (GIOChannel *source, GIOCondition condition, gpointer data); struct _GIOFuncs { GIOStatus (*io_read) (GIOChannel *channel, gchar *buf, gsize count, gsize *bytes_read, GError **err); GIOStatus (*io_write) (GIOChannel *channel, const gchar *buf, gsize count, gsize *bytes_written, GError **err); GIOStatus (*io_seek) (GIOChannel *channel, gint64 offset, GSeekType type, GError **err); GIOStatus (*io_close) (GIOChannel *channel, GError **err); GSource* (*io_create_watch) (GIOChannel *channel, GIOCondition condition); void (*io_free) (GIOChannel *channel); GIOStatus (*io_set_flags) (GIOChannel *channel, GIOFlags flags, GError **err); GIOFlags (*io_get_flags) (GIOChannel *channel); }; 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_chars) GIOError g_io_channel_read (GIOChannel *channel, gchar *buf, gsize count, gsize *bytes_read); GLIB_DEPRECATED_FOR(g_io_channel_write_chars) GIOError g_io_channel_write (GIOChannel *channel, const gchar *buf, gsize count, gsize *bytes_written); GLIB_DEPRECATED_FOR(g_io_channel_seek_position) GIOError g_io_channel_seek (GIOChannel *channel, gint64 offset, GSeekType type); 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, gpointer user_data); /* 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); 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 * descriptor or socket. * * On Win32, this can be used either for files opened with the MSVCRT * (the Microsoft run-time C library) _open() or _pipe, including file * descriptors 0, 1 and 2 (corresponding to stdin, stdout and stderr), * or for Winsock SOCKETs. If the parameter is a legal file * descriptor, it is assumed to be such, otherwise it should be a * SOCKET. This relies on SOCKETs and file descriptors not * overlapping. If you want to be certain, call either * g_io_channel_win32_new_fd() or g_io_channel_win32_new_socket() * instead as appropriate. * * The term file descriptor as used in the context of Win32 refers to * the emulated Unix-like file descriptors MSVCRT provides. The native * corresponding concept is file HANDLE. There isn't as of yet a way to * get GIOChannels for Win32 file HANDLEs. */ 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); /* Hook for GClosure / GSource integration. Don't touch */ GLIB_VAR GSourceFuncs g_io_watch_funcs; #ifdef G_OS_WIN32 /* You can use this "pseudo file descriptor" in a GPollFD to add * polling for Windows messages. GTK applications should not do that. */ #define G_WIN32_MSG_HANDLE 19981206 /* Use this to get a GPollFD from a GIOChannel, so that you can call * g_io_channel_win32_poll(). After calling this you should only use * g_io_channel_read() to read from the GIOChannel, i.e. never read() * from the underlying file descriptor. For SOCKETs, it is possible to call * recv(). */ GLIB_AVAILABLE_IN_ALL void g_io_channel_win32_make_pollfd (GIOChannel *channel, GIOCondition condition, GPollFD *fd); /* This can be used to wait a until at least one of the channels is readable. * On Unix you would do a select() on the file descriptors of the channels. */ GLIB_AVAILABLE_IN_ALL gint g_io_channel_win32_poll (GPollFD *fds, gint n_fds, gint timeout_); /* Create an IO channel for Windows messages for window handle hwnd. */ #if GLIB_SIZEOF_VOID_P == 8 /* We use gsize here so that it is still an integer type and not a * 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 /* Create an IO channel for C runtime (emulated Unix-like) file * descriptors. After calling g_io_add_watch() on a IO channel * returned by this function, you shouldn't call read() on the file * descriptor. This is because adding polling for a file descriptor is * implemented on Win32 by starting a thread that sits blocked in a * read() from the file descriptor most of the time. All reads from * the file descriptor should be done by this internal GLib * thread. Your code should call only g_io_channel_read_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 * a SOCKET. Contrary to IO channels for file descriptors (on *Win32), * you can use normal recv() or recvfrom() on sockets even if GLib * is polling them. */ 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 #endif /* __G_IOCHANNEL_H__ */ pkg-config-0.29.1/glib/glib/gslist.c0000664000175000017500000006122412651243552014067 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the GLib Team and others 1997-2000. See the AUTHORS * file for a list of people on the GLib Team. See the ChangeLog * files for a list of changes. These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/. */ /* * MT safe */ #include "config.h" #include "gslist.h" #include "gtestutils.h" #include "gslice.h" /** * SECTION:linked_lists_single * @title: Singly-Linked Lists * @short_description: linked lists that can be iterated in one direction * * The #GSList structure and its associated functions provide a * standard singly-linked list data structure. * * Each element in the list contains a piece of data, together with a * pointer which links to the next element in the list. Using this * pointer it is possible to move through the list in one direction * only (unlike the Doubly-Linked Lists which * allow movement in both directions). * * The data contained in each element can be either integer values, by * using one of the Type * Conversion Macros, or simply pointers to any type of data. * * List elements are allocated from the slice allocator, which is more * efficient than allocating elements individually. * * Note that most of the #GSList functions expect to be passed a * pointer to the first element in the list. The functions which insert * elements return the new start of the list, which may have changed. * * There is no function to create a #GSList. %NULL is considered to be * the empty list so you simply set a #GSList* to %NULL. * * To add elements, use g_slist_append(), g_slist_prepend(), * g_slist_insert() and g_slist_insert_sorted(). * * To remove elements, use g_slist_remove(). * * To find elements in the list use g_slist_last(), g_slist_next(), * g_slist_nth(), g_slist_nth_data(), g_slist_find() and * g_slist_find_custom(). * * To find the index of an element use g_slist_position() and * g_slist_index(). * * To call a function for each element in the list use * g_slist_foreach(). * * To free the entire list, use g_slist_free(). **/ /** * GSList: * @data: holds the element's data, which can be a pointer to any kind * of data, or any integer value using the Type Conversion * Macros. * @next: contains the link to the next element in the list. * * The #GSList struct is used for each element in the singly-linked * list. **/ /** * g_slist_next: * @slist: an element in a #GSList. * * 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) #define _g_slist_alloc() g_slice_new (GSList) #define _g_slist_free1(slist) g_slice_free (GSList, slist) /** * g_slist_alloc: * * 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) { return _g_slist_alloc0 (); } /** * g_slist_free: * @list: a #GSList * * Frees all of the memory used by a #GSList. * The freed elements are returned to the slice allocator. * * * If list elements contain dynamically-allocated memory, * you should either use g_slist_free_full() or free them manually * first. * */ void g_slist_free (GSList *list) { g_slice_free_chain (GSList, list, next); } /** * g_slist_free_1: * @list: a #GSList element * * Frees one #GSList element. * It is usually used after g_slist_remove_link(). */ /** * g_slist_free1: * * A macro which does the same as g_slist_free_1(). * * Since: 2.10 **/ void g_slist_free_1 (GSList *list) { _g_slist_free1 (list); } /** * g_slist_free_full: * @list: a pointer to a #GSList * @free_func: the function to be called to free each element's data * * Convenience method, which frees all the memory used by a #GSList, and * calls the specified destroy function on every element's data. * * Since: 2.28 **/ void g_slist_free_full (GSList *list, GDestroyNotify free_func) { g_slist_foreach (list, (GFunc) free_func, NULL); g_slist_free (list); } /** * g_slist_append: * @list: a #GSList * @data: the data for the new element * * Adds a new element on to the end of the list. * * * The return value is the new start of the list, which may * have changed, so make sure you store the new value. * * * * Note that g_slist_append() has to traverse the entire list * to find the end, which is inefficient when adding multiple * elements. A common idiom to avoid the inefficiency is to prepend * the elements and reverse the list when all elements have been added. * * * |[ * /* Notice that these are initialized to the empty list. */ * GSList *list = NULL, *number_list = NULL; * * /* This is a list of strings. */ * list = g_slist_append (list, "first"); * list = g_slist_append (list, "second"); * * /* This is a list of integers. */ * number_list = g_slist_append (number_list, GINT_TO_POINTER (27)); * number_list = g_slist_append (number_list, GINT_TO_POINTER (14)); * ]| * * Returns: the new start of the #GSList */ GSList* g_slist_append (GSList *list, gpointer data) { GSList *new_list; GSList *last; new_list = _g_slist_alloc (); new_list->data = data; new_list->next = NULL; if (list) { last = g_slist_last (list); /* g_assert (last != NULL); */ last->next = new_list; return list; } else return new_list; } /** * g_slist_prepend: * @list: a #GSList * @data: the data for the new element * * Adds a new element on to the start of the list. * * * The return value is the new start of the list, which * may have changed, so make sure you store the new value. * * * |[ * /* Notice that it is initialized to the empty list. */ * GSList *list = NULL; * list = g_slist_prepend (list, "last"); * list = g_slist_prepend (list, "first"); * ]| * * Returns: the new start of the #GSList */ GSList* g_slist_prepend (GSList *list, gpointer data) { GSList *new_list; new_list = _g_slist_alloc (); new_list->data = data; new_list->next = list; return new_list; } /** * g_slist_insert: * @list: a #GSList * @data: the data for the new element * @position: the position to insert the element. * If this is negative, or is larger than the number * of elements in the list, the new element is added on * to the end of the list. * * Inserts a new element into the list at the given position. * * Returns: the new start of the #GSList */ GSList* g_slist_insert (GSList *list, gpointer data, gint position) { GSList *prev_list; GSList *tmp_list; GSList *new_list; if (position < 0) return g_slist_append (list, data); else if (position == 0) return g_slist_prepend (list, data); new_list = _g_slist_alloc (); new_list->data = data; if (!list) { new_list->next = NULL; return new_list; } prev_list = NULL; tmp_list = list; while ((position-- > 0) && tmp_list) { prev_list = tmp_list; tmp_list = tmp_list->next; } new_list->next = prev_list->next; prev_list->next = new_list; return list; } /** * g_slist_insert_before: * @slist: a #GSList * @sibling: node to insert @data before * @data: data to put in the newly-inserted node * * Inserts a node before @sibling containing @data. * * Returns: the new head of the list. */ GSList* g_slist_insert_before (GSList *slist, GSList *sibling, gpointer data) { if (!slist) { slist = _g_slist_alloc (); slist->data = data; slist->next = NULL; g_return_val_if_fail (sibling == NULL, slist); return slist; } else { GSList *node, *last = NULL; for (node = slist; node; last = node, node = last->next) if (node == sibling) break; if (!last) { node = _g_slist_alloc (); node->data = data; node->next = slist; return node; } else { node = _g_slist_alloc (); node->data = data; node->next = last->next; last->next = node; return slist; } } } /** * g_slist_concat: * @list1: a #GSList * @list2: the #GSList to add to the end of the first #GSList * * Adds the second #GSList onto the end of the first #GSList. * Note that the elements of the second #GSList are not copied. * They are used directly. * * Returns: the start of the new #GSList */ GSList * g_slist_concat (GSList *list1, GSList *list2) { if (list2) { if (list1) g_slist_last (list1)->next = list2; else list1 = list2; } return list1; } /** * g_slist_remove: * @list: a #GSList * @data: the data of the element to remove * * Removes an element from a #GSList. * If two elements contain the same data, only the first is removed. * If none of the elements contain the data, the #GSList is unchanged. * * Returns: the new start of the #GSList */ GSList* g_slist_remove (GSList *list, gconstpointer data) { GSList *tmp, *prev = NULL; tmp = list; while (tmp) { if (tmp->data == data) { if (prev) prev->next = tmp->next; else list = tmp->next; g_slist_free_1 (tmp); break; } prev = tmp; tmp = prev->next; } return list; } /** * g_slist_remove_all: * @list: a #GSList * @data: data to remove * * Removes all list nodes with data equal to @data. * Returns the new head of the list. Contrast with * g_slist_remove() which removes only the first node * matching the given data. * * Returns: new head of @list */ GSList* g_slist_remove_all (GSList *list, gconstpointer data) { GSList *tmp, *prev = NULL; tmp = list; while (tmp) { if (tmp->data == data) { GSList *next = tmp->next; if (prev) prev->next = next; else list = next; g_slist_free_1 (tmp); tmp = next; } else { prev = tmp; tmp = prev->next; } } return list; } static inline GSList* _g_slist_remove_link (GSList *list, GSList *link) { GSList *tmp; GSList *prev; prev = NULL; tmp = list; while (tmp) { if (tmp == link) { if (prev) prev->next = tmp->next; if (list == tmp) list = list->next; tmp->next = NULL; break; } prev = tmp; tmp = tmp->next; } return list; } /** * g_slist_remove_link: * @list: a #GSList * @link_: an element in the #GSList * * Removes an element from a #GSList, without * freeing the element. The removed element's next * link is set to %NULL, so that it becomes a * self-contained list with one element. * * 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. * * Returns: the new start of the #GSList, without the element */ GSList* g_slist_remove_link (GSList *list, GSList *link_) { return _g_slist_remove_link (list, link_); } /** * g_slist_delete_link: * @list: a #GSList * @link_: node to delete * * Removes the node link_ from the list and frees it. * Compare this to g_slist_remove_link() which removes the node * without freeing it. * * 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. * * Returns: the new head of @list */ GSList* g_slist_delete_link (GSList *list, GSList *link_) { list = _g_slist_remove_link (list, link_); _g_slist_free1 (link_); return list; } /** * g_slist_copy: * @list: a #GSList * * Copies a #GSList. * * * 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. See g_slist_copy_deep() if you need * to copy the data as well. * * * Returns: a copy of @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) { GSList *last; new_list = _g_slist_alloc (); 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; if (func) last->data = func (list->data, user_data); else last->data = list->data; list = list->next; } last->next = NULL; } return new_list; } /** * g_slist_reverse: * @list: a #GSList * * Reverses a #GSList. * * Returns: the start of the reversed #GSList */ GSList* g_slist_reverse (GSList *list) { GSList *prev = NULL; while (list) { GSList *next = list->next; list->next = prev; prev = list; list = next; } return prev; } /** * g_slist_nth: * @list: a #GSList * @n: the position of the element, counting from 0 * * Gets the element at the given position in a #GSList. * * Returns: the element, or %NULL if the position is off * the end of the #GSList */ GSList* g_slist_nth (GSList *list, guint n) { while (n-- > 0 && list) list = list->next; return list; } /** * g_slist_nth_data: * @list: a #GSList * @n: the position of the element * * Gets the data of the element at the given position. * * Returns: the element's data, or %NULL if the position * is off the end of the #GSList */ gpointer g_slist_nth_data (GSList *list, guint n) { while (n-- > 0 && list) list = list->next; return list ? list->data : NULL; } /** * g_slist_find: * @list: a #GSList * @data: the element data to find * * Finds the element in a #GSList which * contains the given data. * * Returns: the found #GSList element, * or %NULL if it is not found */ GSList* g_slist_find (GSList *list, gconstpointer data) { while (list) { if (list->data == data) break; list = list->next; } return list; } /** * g_slist_find_custom: * @list: a #GSList * @data: user data passed to the function * @func: the function to call for each element. * It should return 0 when the desired element is found * * Finds an element in a #GSList, using a supplied function to * find the desired element. It iterates over the list, calling * the given function which should return 0 when the desired * element is found. The function takes two #gconstpointer arguments, * the #GSList element's data as the first argument and the * given user data. * * Returns: the found #GSList element, or %NULL if it is not found */ GSList* g_slist_find_custom (GSList *list, gconstpointer data, GCompareFunc func) { g_return_val_if_fail (func != NULL, list); while (list) { if (! func (list->data, data)) return list; list = list->next; } return NULL; } /** * g_slist_position: * @list: a #GSList * @llink: an element in the #GSList * * Gets the position of the given element * in the #GSList (starting from 0). * * Returns: the position of the element in the #GSList, * or -1 if the element is not found */ gint g_slist_position (GSList *list, GSList *llink) { gint i; i = 0; while (list) { if (list == llink) return i; i++; list = list->next; } return -1; } /** * g_slist_index: * @list: a #GSList * @data: the data to find * * Gets the position of the element containing * the given data (starting from 0). * * Returns: the index of the element containing the data, * or -1 if the data is not found */ gint g_slist_index (GSList *list, gconstpointer data) { gint i; i = 0; while (list) { if (list->data == data) return i; i++; list = list->next; } return -1; } /** * g_slist_last: * @list: a #GSList * * Gets the last element in a #GSList. * * * This function iterates over the whole list. * * * Returns: the last element in the #GSList, * or %NULL if the #GSList has no elements */ GSList* g_slist_last (GSList *list) { if (list) { while (list->next) list = list->next; } return list; } /** * g_slist_length: * @list: a #GSList * * Gets the number of elements in a #GSList. * * * This function iterates over the whole list to * count its elements. * * * Returns: the number of elements in the #GSList */ guint g_slist_length (GSList *list) { guint length; length = 0; while (list) { length++; list = list->next; } return length; } /** * g_slist_foreach: * @list: a #GSList * @func: the function to call with each element's data * @user_data: user data to pass to the function * * Calls a function for each element of a #GSList. */ void g_slist_foreach (GSList *list, GFunc func, gpointer user_data) { while (list) { GSList *next = list->next; (*func) (list->data, user_data); list = next; } } static GSList* g_slist_insert_sorted_real (GSList *list, gpointer data, GFunc func, gpointer user_data) { GSList *tmp_list = list; GSList *prev_list = NULL; GSList *new_list; gint cmp; g_return_val_if_fail (func != NULL, list); if (!list) { new_list = _g_slist_alloc (); new_list->data = data; new_list->next = NULL; return new_list; } cmp = ((GCompareDataFunc) func) (data, tmp_list->data, user_data); while ((tmp_list->next) && (cmp > 0)) { prev_list = tmp_list; tmp_list = tmp_list->next; cmp = ((GCompareDataFunc) func) (data, tmp_list->data, user_data); } new_list = _g_slist_alloc (); new_list->data = data; if ((!tmp_list->next) && (cmp > 0)) { tmp_list->next = new_list; new_list->next = NULL; return list; } if (prev_list) { prev_list->next = new_list; new_list->next = tmp_list; return list; } else { new_list->next = list; return new_list; } } /** * g_slist_insert_sorted: * @list: a #GSList * @data: the data for the new element * @func: the function to compare elements in the list. * It should return a number > 0 if the first parameter * comes after the second parameter in the sort order. * * Inserts a new element into the list, using the given * comparison function to determine its position. * * Returns: the new start of the #GSList */ GSList* g_slist_insert_sorted (GSList *list, gpointer data, GCompareFunc func) { return g_slist_insert_sorted_real (list, data, (GFunc) func, NULL); } /** * g_slist_insert_sorted_with_data: * @list: a #GSList * @data: the data for the new element * @func: the function to compare elements in the list. * It should return a number > 0 if the first parameter * comes after the second parameter in the sort order. * @user_data: data to pass to comparison function * * Inserts a new element into the list, using the given * comparison function to determine its position. * * Returns: the new start of the #GSList * * Since: 2.10 */ GSList* g_slist_insert_sorted_with_data (GSList *list, gpointer data, GCompareDataFunc func, gpointer user_data) { return g_slist_insert_sorted_real (list, data, (GFunc) func, user_data); } static GSList * g_slist_sort_merge (GSList *l1, GSList *l2, GFunc compare_func, gpointer user_data) { GSList list, *l; gint cmp; l=&list; while (l1 && l2) { cmp = ((GCompareDataFunc) compare_func) (l1->data, l2->data, user_data); if (cmp <= 0) { l=l->next=l1; l1=l1->next; } else { l=l->next=l2; l2=l2->next; } } l->next= l1 ? l1 : l2; return list.next; } static GSList * g_slist_sort_real (GSList *list, GFunc compare_func, gpointer user_data) { GSList *l1, *l2; if (!list) return NULL; if (!list->next) return list; l1 = list; l2 = list->next; while ((l2 = l2->next) != NULL) { if ((l2 = l2->next) == NULL) break; l1=l1->next; } l2 = l1->next; l1->next = NULL; return g_slist_sort_merge (g_slist_sort_real (list, compare_func, user_data), g_slist_sort_real (l2, compare_func, user_data), compare_func, user_data); } /** * g_slist_sort: * @list: a #GSList * @compare_func: the comparison function used to sort the #GSList. * This function is passed the data from 2 elements of the #GSList * and should return 0 if they are equal, a negative value if the * first element comes before the second, or a positive value if * the first element comes after the second. * * Sorts a #GSList using the given comparison function. * * Returns: the start of the sorted #GSList */ GSList * g_slist_sort (GSList *list, GCompareFunc compare_func) { return g_slist_sort_real (list, (GFunc) compare_func, NULL); } /** * g_slist_sort_with_data: * @list: a #GSList * @compare_func: comparison function * @user_data: data to pass to comparison function * * Like g_slist_sort(), but the sort function accepts a user data argument. * * Returns: new head of the list */ GSList * g_slist_sort_with_data (GSList *list, GCompareDataFunc compare_func, gpointer user_data) { return g_slist_sort_real (list, (GFunc) compare_func, user_data); } pkg-config-0.29.1/glib/glib/ggettext.h0000664000175000017500000000467612651243552014432 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the GLib Team and others 1997-2000. See the AUTHORS * file for a list of people on the GLib Team. See the ChangeLog * files for a list of changes. These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/. */ #ifndef __G_GETTEXT_H__ #define __G_GETTEXT_H__ #if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) #error "Only can be included directly." #endif #include 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); G_END_DECLS #endif /* __G_GETTEXT_H__ */ pkg-config-0.29.1/glib/glib/glib.rc0000664000175000017500000000137012665370350013657 00000000000000#include VS_VERSION_INFO VERSIONINFO FILEVERSION 2,38,2,0 PRODUCTVERSION 2,38,2,0 FILEFLAGSMASK 0 FILEFLAGS 0 FILEOS VOS__WINDOWS32 FILETYPE VFT_DLL FILESUBTYPE VFT2_UNKNOWN BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "040904B0" BEGIN VALUE "CompanyName", "The GLib developer community" VALUE "FileDescription", "GLib" VALUE "FileVersion", "2.38.2.0" VALUE "InternalName", "libglib-2.0-0" VALUE "LegalCopyright", "Copyright © 1995-2011 Peter Mattis, Spencer Kimball, Josh MacDonald and others." VALUE "OriginalFilename", "libglib-2.0-0.dll" VALUE "ProductName", "GLib" VALUE "ProductVersion", "2.38.2" END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", 0x409, 1200 END END pkg-config-0.29.1/glib/glib/gmain-internal.h0000664000175000017500000000211412651243552015465 00000000000000/* gmain-internal.h - GLib-internal mainloop API * Copyright (C) 2011 Red Hat, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __G_MAIN_INTERNAL_H__ #define __G_MAIN_INTERNAL_H__ #if !defined (GLIB_COMPILATION) #error "This is a private header" #endif #include "gmain.h" G_BEGIN_DECLS GSource *_g_main_create_unix_signal_watch (int signum); G_END_DECLS #endif /* __G_MAIN_H__ */ pkg-config-0.29.1/glib/glib/glib-mirroring-tab/0000775000175000017500000000000012665370347016170 500000000000000pkg-config-0.29.1/glib/glib/glib-mirroring-tab/gen-mirroring-tab.c0000664000175000017500000001133112651243552021566 00000000000000/* gen-mirroring-tab.c - generate gmirroringtable.h for glib * copied from FriBidi. * * $Id$ * $Author$ * $Date$ * $Revision$ * $Source$ * * Author: * Behdad Esfahbod, 2001, 2002, 2004 * * Copyright (C) 2004 Sharif FarsiWeb, Inc * Copyright (C) 2001,2002,2004 Behdad Esfahbod * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library, in a file named COPYING; if not, write to the * Free Software Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA * * For licensing issues, contact . */ #include #include #include #include "packtab.h" #define appname "gen-mirroring-tab" #define outputname "gmirroringtable.h" static void die ( const char *msg ) { fprintf (stderr, appname ": %s\n", msg); exit (1); } static void die2 ( const char *fmt, const char *p ) { fprintf (stderr, appname ": "); fprintf (stderr, fmt, p); fprintf (stderr, "\n"); exit (1); } static void die4 ( const char *fmt, unsigned long l, unsigned long p, unsigned long q ) { fprintf (stderr, appname ": "); fprintf (stderr, fmt, l, p, q); fprintf (stderr, "\n"); exit (1); } #define table_name "Mir" #define macro_name "GLIB_GET_MIRRORING" #define UNICODE_CHARS 0x110000 static signed int table[UNICODE_CHARS]; static char buf[4000]; static signed long max_dist; static void init ( void ) { max_dist = 0; } static void clear_tab ( void ) { register gunichar c; for (c = 0; c < UNICODE_CHARS; c++) table[c] = 0; } static void init_tab_mirroring_txt ( void ) { clear_tab (); } static void read_bidi_mirroring_txt ( FILE *f ) { unsigned long l; init_tab_mirroring_txt (); l = 0; while (fgets (buf, sizeof buf, f)) { unsigned long i, j; signed long dist; int k; const char *s = buf; l++; while (*s == ' ') s++; if (s[0] == '#' || s[0] == '\0' || s[0] == '\n') continue; k = sscanf (s, "%lx; %lx", &i, &j); if (k != 2 || i >= UNICODE_CHARS || j >= UNICODE_CHARS) die4 ("invalid pair in input at line %ld: %04lX, %04lX", l, i, j); dist = ((signed long) j - (signed long) i); table[i] = dist; if (dist > max_dist) max_dist = dist; else if (-dist > max_dist) max_dist = -dist; } } static void read_data ( const char *data_file_type, const char *data_file_name ) { FILE *f; fprintf (stderr, "Reading '%s'\n", data_file_name); if (!(f = fopen (data_file_name, "rt"))) die2 ("error: cannot open '%s' for reading", data_file_name); if (!strcmp (data_file_type, "BidiMirroring.txt")) read_bidi_mirroring_txt (f); else die2 ("error: unknown data-file-type %s", data_file_type); fclose (f); } static void gen_mirroring_tab ( int max_depth, const char *data_file_type ) { int key_bytes; const char *key_type; fprintf (stderr, "Generating '" outputname "', it may take up to a few minutes\n"); printf ("/* " outputname "\n * generated by " appname " " "\n" " * from the file %s of */\n\n", data_file_type); printf ("#define PACKTAB_UINT8 guint8\n" "#define PACKTAB_UINT16 guint16\n" "#define PACKTAB_UINT32 guint32\n\n"); key_bytes = max_dist <= 0x7f ? 1 : max_dist < 0x7fff ? 2 : 4; key_type = key_bytes == 1 ? "gint8" : key_bytes == 2 ? "gint16" : "gint32"; if (!pack_table (table, UNICODE_CHARS, key_bytes, 0, max_depth, 1, NULL, key_type, table_name, macro_name "_DELTA", stdout)) die ("error: insufficient memory, decrease max_depth"); printf ("#undef PACKTAB_UINT8\n" "#undef PACKTAB_UINT16\n" "#undef PACKTAB_UINT32\n\n"); printf ("#define " macro_name "(x) ((x) + " macro_name "_DELTA(x))\n\n"); printf ("/* End of generated " outputname " */\n"); } int main ( int argc, const char **argv ) { const char *data_file_type = "BidiMirroring.txt"; if (argc < 3) die2 ("usage:\n " appname " max-lookups /path/to/%s [junk...]", data_file_type); { int max_depth = atoi (argv[1]); const char *data_file_name = argv[2]; if (max_depth < 2) die ("invalid depth"); init (); read_data (data_file_type, data_file_name); gen_mirroring_tab (max_depth, data_file_type); } return 0; } pkg-config-0.29.1/glib/glib/glib-mirroring-tab/packtab.c0000664000175000017500000002162412275467762017673 00000000000000/* PackTab - Pack a static table * Copyright (C) 2001 Behdad Esfahbod. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library, in a file named COPYING; if not, write to the * Free Software Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA * * For licensing issues, contact . */ /* 8 <= N <= 2^21 int key 1 <= max_depth <= 21 */ #include #include #include #include "packtab.h" typedef signed int uni_table[1024 * 1024 * 2]; static int n, a, max_depth, digits, tab_width, per_row; static long N; signed int def_key; static uni_table temp, x, perm, *tab; static long pow[22], cluster, cmpcluster; static const char *const *name, *key_type_name, *table_name, *macro_name; static FILE *f; static long most_binary ( long min, long max ) { /* min should be less than max */ register int i, ii; if (min == max) return max; for (i = 21; max < pow[i]; i--) ; ii = i; while (i && !((min ^ max) & pow[i])) i--; if (ii == i) { /* min is less than half of max */ for (i = 21 - 1; min < pow[i]; i--) ; i++; return pow[i]; } return max & (pow[i] - 1); } static void init ( const signed int *table ) { register int i; /* initialize powers of two */ pow[0] = 1; for (i = 1; i <= 21; i++) pow[i] = pow[i - 1] << 1; /* reduce number of elements to get a more binary number */ { long essen; /* find number of essential items */ essen = N - 1; while (essen && table[essen] == def_key) essen--; essen++; N = most_binary (essen, N); } for (n = 21; N % pow[n]; n--) ; digits = (n + 3) / 4; for (i = 6; i; i--) if (pow[i] * (tab_width + 1) < 80) break; per_row = pow[i]; } static int compare ( const void *r, const void *s ) { int i; for (i = 0; i < cmpcluster; i++) if (((int *) r)[i] != ((int *) s)[i]) return ((int *) r)[i] - ((int *) s)[i]; return 0; } static int lev, best_lev, p[22], best_p[22], nn; static long c[22], best_c[22], s, best_s; static long t[22], best_t[22], clusters[22], best_cluster[22]; static void found ( void ) { int i; if (s < best_s) { best_s = s; best_lev = lev; for (i = 0; i <= lev; i++) { best_p[i] = p[i]; best_c[i] = c[i]; best_t[i] = t[i]; best_cluster[i] = clusters[i]; } } } static void bt ( int node_size ) { long i, j, k, y, sbak; long key_bytes; if (t[lev] == 1) { found (); return; } if (lev == max_depth) return; for (i = 1 - t[lev] % 2; i <= nn + (t[lev] >> nn) % 2; i++) { nn -= (p[lev] = i); clusters[lev] = cluster = (i && nn >= 0) ? pow[i] : t[lev]; cmpcluster = cluster + 1; t[lev + 1] = (t[lev] - 1) / cluster + 1; for (j = 0; j < t[lev + 1]; j++) { memmove (temp + j * cmpcluster, tab[lev] + j * cluster, cluster * sizeof (tab[lev][0])); temp[j * cmpcluster + cluster] = j; } qsort (temp, t[lev + 1], cmpcluster * sizeof (temp[0]), compare); for (j = 0; j < t[lev + 1]; j++) { perm[j] = temp[j * cmpcluster + cluster]; temp[j * cmpcluster + cluster] = 0; } k = 1; y = 0; tab[lev + 1][perm[0]] = perm[0]; for (j = 1; j < t[lev + 1]; j++) { if (compare (temp + y, temp + y + cmpcluster)) { k++; tab[lev + 1][perm[j]] = perm[j]; } else tab[lev + 1][perm[j]] = tab[lev + 1][perm[j - 1]]; y += cmpcluster; } sbak = s; s += k * node_size * cluster; c[lev] = k; if (s >= best_s) { s = sbak; nn += i; return; } key_bytes = k * cluster; key_bytes = key_bytes < 0xff ? 1 : key_bytes < 0xffff ? 2 : 4; lev++; bt (key_bytes); lev--; s = sbak; nn += i; } } static void solve ( void ) { best_lev = max_depth + 2; best_s = N * a * 2; lev = 0; s = 0; nn = n; t[0] = N; bt (a); } static void write_array ( long max_key ) { int i, j, k, y, ii, ofs; const char *key_type; if (best_t[lev] == 1) return; nn -= (i = best_p[lev]); cluster = best_cluster[lev]; cmpcluster = cluster + 1; t[lev + 1] = best_t[lev + 1]; for (j = 0; j < t[lev + 1]; j++) { memmove (temp + j * cmpcluster, tab[lev] + j * cluster, cluster * sizeof (tab[lev][0])); temp[j * cmpcluster + cluster] = j; } qsort (temp, t[lev + 1], cmpcluster * sizeof (temp[0]), compare); for (j = 0; j < t[lev + 1]; j++) { perm[j] = temp[j * cmpcluster + cluster]; temp[j * cmpcluster + cluster] = 0; } k = 1; y = 0; tab[lev + 1][perm[0]] = x[0] = perm[0]; for (j = 1; j < t[lev + 1]; j++) { if (compare (temp + y, temp + y + cmpcluster)) { x[k] = perm[j]; tab[lev + 1][perm[j]] = x[k]; k++; } else tab[lev + 1][perm[j]] = tab[lev + 1][perm[j - 1]]; y += cmpcluster; } i = 0; for (ii = 1; ii < k; ii++) if (x[ii] < x[i]) i = ii; key_type = !lev ? key_type_name : max_key <= 0xff ? "PACKTAB_UINT8" : max_key <= 0xffff ? "PACKTAB_UINT16" : "PACKTAB_UINT32"; fprintf (f, "static const %s %sLev%d[%ld*%d] = {", key_type, table_name, best_lev - lev - 1, cluster, k); ofs = 0; for (ii = 0; ii < k; ii++) { int kk, jj; fprintf (f, "\n#define %sLev%d_%0*lX 0x%0X", table_name, best_lev - lev - 1, digits, x[i] * pow[n - nn], ofs); kk = x[i] * cluster; if (!lev) if (name) for (j = 0; j < cluster; j++) { if (!(j % per_row) && j != cluster - 1) fprintf (f, "\n "); fprintf (f, "%*s,", tab_width, name[tab[lev][kk++]]); } else for (j = 0; j < cluster; j++) { if (!(j % per_row) && j != cluster - 1) fprintf (f, "\n "); fprintf (f, "%*d,", tab_width, tab[lev][kk++]); } else for (j = 0; j < cluster; j++, kk++) fprintf (f, "\n %sLev%d_%0*lX, /* %0*lX..%0*lX */", table_name, best_lev - lev, digits, tab[lev][kk] * pow[n - nn - best_p[lev]], digits, x[i] * pow[n - nn] + j * pow[n - nn - best_p[lev]], digits, x[i] * pow[n - nn] + (j + 1) * pow[n - nn - best_p[lev]] - 1); ofs += cluster; jj = i; for (j = 0; j < k; j++) if (x[j] > x[i] && (x[j] < x[jj] || jj == i)) jj = j; i = jj; } fprintf (f, "\n};\n\n"); lev++; write_array (cluster * k); lev--; } static void write_source ( void ) { int i, j; lev = 0; s = 0; nn = n; t[0] = N; fprintf (f, "\n" "/* *IND" "ENT-OFF* */\n\n"); write_array (0); fprintf (f, "/* *IND" "ENT-ON* */\n\n"); fprintf (f, "#define %s(x) \\\n", macro_name); fprintf (f, "\t((x) >= 0x%lx ? ", N); if (name) fprintf (f, "%s", name[def_key]); else fprintf (f, "%d", def_key); fprintf (f, " : "); j = 0; for (i = best_lev - 1; i >= 0; i--) { fprintf (f, " \\\n\t%sLev%d[((x)", table_name, i); if (j != 0) fprintf (f, " >> %d", j); if (i) fprintf (f, " & 0x%02lx) +", pow[best_p[best_lev - 1 - i]] - 1); j += best_p[best_lev - 1 - i]; } fprintf (f, ")"); for (i = 0; i < best_lev; i++) fprintf (f, "]"); fprintf (f, ")\n\n"); } static void write_out ( void ) { int i; fprintf (f, "/*\n" " generated by packtab.c version %d\n\n" " use %s(key) to access your table\n\n" " assumed sizeof(%s): %d\n" " required memory: %ld\n" " lookups: %d\n" " partition shape: %s", packtab_version, macro_name, key_type_name, a, best_s, best_lev, table_name); for (i = best_lev - 1; i >= 0; i--) fprintf (f, "[%ld]", best_cluster[i]); fprintf (f, "\n" " different table entries:"); for (i = best_lev - 1; i >= 0; i--) fprintf (f, " %ld", best_c[i]); fprintf (f, "\n*/\n"); write_source (); } int pack_table ( const signed int *base, long key_num, int key_size, signed int default_key, int p_max_depth, int p_tab_width, const char *const *p_name, const char *p_key_type_name, const char *p_table_name, const char *p_macro_name, FILE *out ) { N = key_num; a = key_size; def_key = default_key; max_depth = p_max_depth; tab_width = p_tab_width; name = p_name; key_type_name = p_key_type_name; table_name = p_table_name; macro_name = p_macro_name; f = out; init (base); if (!(tab = malloc ((n + 1) * sizeof (tab[0])))) return 0; memmove (tab[0], base, N * sizeof (base[0])); solve (); write_out (); free (tab); return 1; } /* End of packtab.c */ pkg-config-0.29.1/glib/glib/glib-mirroring-tab/packtab.h0000664000175000017500000000247312275467762017701 00000000000000/* PackTab - Pack a static table * Copyright (C) 2001 Behdad Esfahbod. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library, in a file named COPYING; if not, write to the * Free Software Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA * * For licensing issues, contact . */ #ifndef PACKTAB_H #define PACKTAB_H #ifdef __cplusplus extern "C" { #endif #define packtab_version 3 int pack_table ( const signed int *base, long key_num, int key_size, signed int default_key, int max_depth, int tab_width, const char *const *name, const char *key_type_name, const char *table_name, const char *macro_name, FILE *out ); #ifdef __cplusplus } #endif #endif /* PACKTAB_H */ pkg-config-0.29.1/glib/glib/glib-mirroring-tab/Makefile0000664000175000017500000000027512275467762017561 00000000000000 CFLAGS = `pkg-config --cflags glib-2.0` LIBS = `pkg-config --libs glib-2.0` all: gen-mirroring-tab gen-mirroring-tab: gen-mirroring-tab.o packtab.o clean: $(RM) gen-mirroring-tab *.o pkg-config-0.29.1/glib/glib/gchecksum.h0000664000175000017500000000736712651243552014550 00000000000000/* gchecksum.h - data hashing functions * * Copyright (C) 2007 Emmanuele Bassi * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __G_CHECKSUM_H__ #define __G_CHECKSUM_H__ #if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) #error "Only can be included directly." #endif #include #include G_BEGIN_DECLS /** * GChecksumType: * @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. * * Note that the #GChecksumType enumeration may be extended at a later * date to include new hashing algorithm types. * * Since: 2.16 */ typedef enum { G_CHECKSUM_MD5, G_CHECKSUM_SHA1, G_CHECKSUM_SHA256, G_CHECKSUM_SHA512 } GChecksumType; /** * GChecksum: * * An opaque structure representing a checksumming operation. * To create a new GChecksum, use g_checksum_new(). To free * a GChecksum, use g_checksum_free(). * * Since: 2.16 */ 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__ */ pkg-config-0.29.1/glib/glib/glibintl.h0000664000175000017500000000257512651243552014377 00000000000000#ifndef __GLIBINTL_H__ #define __GLIBINTL_H__ #ifndef SIZEOF_CHAR #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); #ifdef ENABLE_NLS #include #define _(String) glib_gettext(String) /* Split out this in the code, but keep it in the same domain for now */ #define P_(String) glib_gettext(String) #define C_(Context,String) glib_pgettext (Context "\004" String, strlen (Context) + 1) #ifdef gettext_noop #define N_(String) gettext_noop(String) #else #define N_(String) (String) #endif #else /* NLS is disabled */ #define _(String) (String) #define N_(String) (String) #define P_(String) (String) #define C_(Context,String) (String) #define textdomain(String) ((String) ? (String) : "messages") #define gettext(String) (String) #define dgettext(Domain,String) (String) #define dcgettext(Domain,String,Type) (String) #define dngettext(Domain,String1,String2,N) ((N) == 1 ? (String1) : (String2)) #define bindtextdomain(Domain,Directory) (Domain) #define bind_textdomain_codeset(Domain,Codeset) #endif /* not really I18N-related, but also a string marker macro */ #define I_(string) g_intern_static_string (string) #endif /* __GLIBINTL_H__ */ pkg-config-0.29.1/glib/glib/gqueue.c0000664000175000017500000005354312275467762014077 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * GQueue: Double ended queue implementation, piggy backed on GList. * Copyright (C) 1998 Tim Janik * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * MT safe */ /** * SECTION:queue * @Title: Double-ended Queues * @Short_description: double-ended queue data structure * * The #GQueue structure and its associated functions provide a standard * queue data structure. Internally, GQueue uses the same data structure * as #GList to store elements. * * The data contained in each element can be either integer values, by * using one of the Type * Conversion Macros, or simply pointers to any type of data. * * To create a new GQueue, use g_queue_new(). * * To initialize a statically-allocated GQueue, use #G_QUEUE_INIT or * g_queue_init(). * * To add elements, use g_queue_push_head(), g_queue_push_head_link(), * g_queue_push_tail() and g_queue_push_tail_link(). * * To remove elements, use g_queue_pop_head() and g_queue_pop_tail(). * * To free the entire queue, use g_queue_free(). */ #include "config.h" #include "gqueue.h" #include "gtestutils.h" #include "gslice.h" /** * g_queue_new: * * Creates a new #GQueue. * * Returns: a new #GQueue. **/ GQueue* g_queue_new (void) { return g_slice_new0 (GQueue); } /** * g_queue_free: * @queue: a #GQueue. * * Frees the memory allocated for the #GQueue. Only call this function if * @queue was created with g_queue_new(). If queue elements contain * dynamically-allocated memory, they should be freed first. * * * If queue elements contain dynamically-allocated memory, * you should either use g_queue_free_full() or free them manually * first. * **/ void g_queue_free (GQueue *queue) { g_return_if_fail (queue != NULL); g_list_free (queue->head); g_slice_free (GQueue, queue); } /** * g_queue_free_full: * @queue: a pointer to a #GQueue * @free_func: the function to be called to free each element's data * * Convenience method, which frees all the memory used by a #GQueue, and * calls the specified destroy function on every element's data. * * Since: 2.32 */ void g_queue_free_full (GQueue *queue, GDestroyNotify free_func) { g_queue_foreach (queue, (GFunc) free_func, NULL); g_queue_free (queue); } /** * g_queue_init: * @queue: an uninitialized #GQueue * * A statically-allocated #GQueue must be initialized with this function * before it can be used. Alternatively you can initialize it with * #G_QUEUE_INIT. It is not necessary to initialize queues created with * g_queue_new(). * * Since: 2.14 **/ void g_queue_init (GQueue *queue) { g_return_if_fail (queue != NULL); queue->head = queue->tail = NULL; queue->length = 0; } /** * g_queue_clear: * @queue: a #GQueue * * Removes all the elements in @queue. If queue elements contain * dynamically-allocated memory, they should be freed first. * * Since: 2.14 */ void g_queue_clear (GQueue *queue) { g_return_if_fail (queue != NULL); g_list_free (queue->head); g_queue_init (queue); } /** * g_queue_is_empty: * @queue: a #GQueue. * * Returns %TRUE if the queue is empty. * * Returns: %TRUE if the queue is empty. **/ gboolean g_queue_is_empty (GQueue *queue) { g_return_val_if_fail (queue != NULL, TRUE); return queue->head == NULL; } /** * g_queue_get_length: * @queue: a #GQueue * * Returns the number of items in @queue. * * Return value: The number of items in @queue. * * Since: 2.4 **/ guint g_queue_get_length (GQueue *queue) { g_return_val_if_fail (queue != NULL, 0); return queue->length; } /** * g_queue_reverse: * @queue: a #GQueue * * Reverses the order of the items in @queue. * * Since: 2.4 **/ void g_queue_reverse (GQueue *queue) { g_return_if_fail (queue != NULL); queue->tail = queue->head; queue->head = g_list_reverse (queue->head); } /** * g_queue_copy: * @queue: a #GQueue * * Copies a @queue. Note that is a shallow copy. If the elements in the * queue consist of pointers to data, the pointers are copied, but the * actual data is not. * * Return value: A copy of @queue * * Since: 2.4 **/ GQueue * g_queue_copy (GQueue *queue) { GQueue *result; GList *list; g_return_val_if_fail (queue != NULL, NULL); result = g_queue_new (); for (list = queue->head; list != NULL; list = list->next) g_queue_push_tail (result, list->data); return result; } /** * g_queue_foreach: * @queue: a #GQueue * @func: the function to call for each element's data * @user_data: user data to pass to @func * * Calls @func for each element in the queue passing @user_data to the * function. * * Since: 2.4 **/ void g_queue_foreach (GQueue *queue, GFunc func, gpointer user_data) { GList *list; g_return_if_fail (queue != NULL); g_return_if_fail (func != NULL); list = queue->head; while (list) { GList *next = list->next; func (list->data, user_data); list = next; } } /** * g_queue_find: * @queue: a #GQueue * @data: data to find * * Finds the first link in @queue which contains @data. * * Return value: The first link in @queue which contains @data. * * Since: 2.4 **/ GList * g_queue_find (GQueue *queue, gconstpointer data) { g_return_val_if_fail (queue != NULL, NULL); return g_list_find (queue->head, data); } /** * g_queue_find_custom: * @queue: a #GQueue * @data: user data passed to @func * @func: a #GCompareFunc to call for each element. It should return 0 * when the desired element is found * * Finds an element in a #GQueue, using a supplied function to find the * desired element. It iterates over the queue, calling the given function * which should return 0 when the desired element is found. The function * takes two gconstpointer arguments, the #GQueue element's data as the * first argument and the given user data as the second argument. * * Return value: The found link, or %NULL if it wasn't found * * Since: 2.4 **/ GList * g_queue_find_custom (GQueue *queue, gconstpointer data, GCompareFunc func) { g_return_val_if_fail (queue != NULL, NULL); g_return_val_if_fail (func != NULL, NULL); return g_list_find_custom (queue->head, data, func); } /** * g_queue_sort: * @queue: a #GQueue * @compare_func: the #GCompareDataFunc used to sort @queue. This function * is passed two elements of the queue and should return 0 if they are * equal, a negative value if the first comes before the second, and * a positive value if the second comes before the first. * @user_data: user data passed to @compare_func * * Sorts @queue using @compare_func. * * Since: 2.4 **/ void g_queue_sort (GQueue *queue, GCompareDataFunc compare_func, gpointer user_data) { g_return_if_fail (queue != NULL); g_return_if_fail (compare_func != NULL); queue->head = g_list_sort_with_data (queue->head, compare_func, user_data); queue->tail = g_list_last (queue->head); } /** * g_queue_push_head: * @queue: a #GQueue. * @data: the data for the new element. * * Adds a new element at the head of the queue. **/ void g_queue_push_head (GQueue *queue, gpointer data) { g_return_if_fail (queue != NULL); queue->head = g_list_prepend (queue->head, data); if (!queue->tail) queue->tail = queue->head; queue->length++; } /** * g_queue_push_nth: * @queue: a #GQueue * @data: the data for the new element * @n: the position to insert the new element. If @n is negative or * larger than the number of elements in the @queue, the element is * added to the end of the queue. * * Inserts a new element into @queue at the given position * * Since: 2.4 **/ void g_queue_push_nth (GQueue *queue, gpointer data, gint n) { g_return_if_fail (queue != NULL); if (n < 0 || n >= queue->length) { g_queue_push_tail (queue, data); return; } g_queue_insert_before (queue, g_queue_peek_nth_link (queue, n), data); } /** * g_queue_push_head_link: * @queue: a #GQueue. * @link_: a single #GList element, not a list with * more than one element. * * Adds a new element at the head of the queue. **/ void g_queue_push_head_link (GQueue *queue, GList *link) { g_return_if_fail (queue != NULL); g_return_if_fail (link != NULL); g_return_if_fail (link->prev == NULL); g_return_if_fail (link->next == NULL); link->next = queue->head; if (queue->head) queue->head->prev = link; else queue->tail = link; queue->head = link; queue->length++; } /** * g_queue_push_tail: * @queue: a #GQueue. * @data: the data for the new element. * * Adds a new element at the tail of the queue. **/ void g_queue_push_tail (GQueue *queue, gpointer data) { g_return_if_fail (queue != NULL); queue->tail = g_list_append (queue->tail, data); if (queue->tail->next) queue->tail = queue->tail->next; else queue->head = queue->tail; queue->length++; } /** * g_queue_push_tail_link: * @queue: a #GQueue. * @link_: a single #GList element, not a list with * more than one element. * * Adds a new element at the tail of the queue. **/ void g_queue_push_tail_link (GQueue *queue, GList *link) { g_return_if_fail (queue != NULL); g_return_if_fail (link != NULL); g_return_if_fail (link->prev == NULL); g_return_if_fail (link->next == NULL); link->prev = queue->tail; if (queue->tail) queue->tail->next = link; else queue->head = link; queue->tail = link; queue->length++; } /** * g_queue_push_nth_link: * @queue: a #GQueue * @n: the position to insert the link. If this is negative or larger than * the number of elements in @queue, the link is added to the end of * @queue. * @link_: the link to add to @queue * * Inserts @link into @queue at the given position. * * Since: 2.4 **/ void g_queue_push_nth_link (GQueue *queue, gint n, GList *link_) { GList *next; GList *prev; g_return_if_fail (queue != NULL); g_return_if_fail (link_ != NULL); if (n < 0 || n >= queue->length) { g_queue_push_tail_link (queue, link_); return; } g_assert (queue->head); g_assert (queue->tail); next = g_queue_peek_nth_link (queue, n); prev = next->prev; if (prev) prev->next = link_; next->prev = link_; link_->next = next; link_->prev = prev; if (queue->head->prev) queue->head = queue->head->prev; if (queue->tail->next) queue->tail = queue->tail->next; queue->length++; } /** * g_queue_pop_head: * @queue: a #GQueue. * * Removes the first element of the queue. * * Returns: the data of the first element in the queue, or %NULL if the queue * is empty. **/ gpointer g_queue_pop_head (GQueue *queue) { g_return_val_if_fail (queue != NULL, NULL); if (queue->head) { GList *node = queue->head; gpointer data = node->data; queue->head = node->next; if (queue->head) queue->head->prev = NULL; else queue->tail = NULL; g_list_free_1 (node); queue->length--; return data; } return NULL; } /** * g_queue_pop_head_link: * @queue: a #GQueue. * * Removes the first element of the queue. * * Returns: the #GList element at the head of the queue, or %NULL if the queue * is empty. **/ GList* g_queue_pop_head_link (GQueue *queue) { g_return_val_if_fail (queue != NULL, NULL); if (queue->head) { GList *node = queue->head; queue->head = node->next; if (queue->head) { queue->head->prev = NULL; node->next = NULL; } else queue->tail = NULL; queue->length--; return node; } return NULL; } /** * g_queue_peek_head_link: * @queue: a #GQueue * * Returns the first link in @queue * * Return value: the first link in @queue, or %NULL if @queue is empty * * Since: 2.4 **/ GList* g_queue_peek_head_link (GQueue *queue) { g_return_val_if_fail (queue != NULL, NULL); return queue->head; } /** * g_queue_peek_tail_link: * @queue: a #GQueue * * Returns the last link @queue. * * Return value: the last link in @queue, or %NULL if @queue is empty * * Since: 2.4 **/ GList* g_queue_peek_tail_link (GQueue *queue) { g_return_val_if_fail (queue != NULL, NULL); return queue->tail; } /** * g_queue_pop_tail: * @queue: a #GQueue. * * Removes the last element of the queue. * * Returns: the data of the last element in the queue, or %NULL if the queue * is empty. **/ gpointer g_queue_pop_tail (GQueue *queue) { g_return_val_if_fail (queue != NULL, NULL); if (queue->tail) { GList *node = queue->tail; gpointer data = node->data; queue->tail = node->prev; if (queue->tail) queue->tail->next = NULL; else queue->head = NULL; queue->length--; g_list_free_1 (node); return data; } return NULL; } /** * g_queue_pop_nth: * @queue: a #GQueue * @n: the position of the element. * * Removes the @n'th element of @queue. * * Return value: the element's data, or %NULL if @n is off the end of @queue. * * Since: 2.4 **/ gpointer g_queue_pop_nth (GQueue *queue, guint n) { GList *nth_link; gpointer result; g_return_val_if_fail (queue != NULL, NULL); if (n >= queue->length) return NULL; nth_link = g_queue_peek_nth_link (queue, n); result = nth_link->data; g_queue_delete_link (queue, nth_link); return result; } /** * g_queue_pop_tail_link: * @queue: a #GQueue. * * Removes the last element of the queue. * * Returns: the #GList element at the tail of the queue, or %NULL if the queue * is empty. **/ GList* g_queue_pop_tail_link (GQueue *queue) { g_return_val_if_fail (queue != NULL, NULL); if (queue->tail) { GList *node = queue->tail; queue->tail = node->prev; if (queue->tail) { queue->tail->next = NULL; node->prev = NULL; } else queue->head = NULL; queue->length--; return node; } return NULL; } /** * g_queue_pop_nth_link: * @queue: a #GQueue * @n: the link's position * * Removes and returns the link at the given position. * * Return value: The @n'th link, or %NULL if @n is off the end of @queue. * * Since: 2.4 **/ GList* g_queue_pop_nth_link (GQueue *queue, guint n) { GList *link; g_return_val_if_fail (queue != NULL, NULL); if (n >= queue->length) return NULL; link = g_queue_peek_nth_link (queue, n); g_queue_unlink (queue, link); return link; } /** * g_queue_peek_nth_link: * @queue: a #GQueue * @n: the position of the link * * Returns the link at the given position * * Return value: The link at the @n'th position, or %NULL if @n is off the * end of the list * * Since: 2.4 **/ GList * g_queue_peek_nth_link (GQueue *queue, guint n) { GList *link; gint i; g_return_val_if_fail (queue != NULL, NULL); if (n >= queue->length) return NULL; if (n > queue->length / 2) { n = queue->length - n - 1; link = queue->tail; for (i = 0; i < n; ++i) link = link->prev; } else { link = queue->head; for (i = 0; i < n; ++i) link = link->next; } return link; } /** * g_queue_link_index: * @queue: a #GQueue * @link_: A #GList link * * Returns the position of @link_ in @queue. * * Return value: The position of @link_, or -1 if the link is * not part of @queue * * Since: 2.4 **/ gint g_queue_link_index (GQueue *queue, GList *link_) { g_return_val_if_fail (queue != NULL, -1); return g_list_position (queue->head, link_); } /** * g_queue_unlink: * @queue: a #GQueue * @link_: a #GList link that must be part of @queue * * Unlinks @link_ so that it will no longer be part of @queue. The link is * not freed. * * @link_ must be part of @queue, * * Since: 2.4 **/ void g_queue_unlink (GQueue *queue, GList *link_) { g_return_if_fail (queue != NULL); g_return_if_fail (link_ != NULL); if (link_ == queue->tail) queue->tail = queue->tail->prev; queue->head = g_list_remove_link (queue->head, link_); queue->length--; } /** * g_queue_delete_link: * @queue: a #GQueue * @link_: a #GList link that must be part of @queue * * Removes @link_ from @queue and frees it. * * @link_ must be part of @queue. * * Since: 2.4 **/ void g_queue_delete_link (GQueue *queue, GList *link_) { g_return_if_fail (queue != NULL); g_return_if_fail (link_ != NULL); g_queue_unlink (queue, link_); g_list_free (link_); } /** * g_queue_peek_head: * @queue: a #GQueue. * * Returns the first element of the queue. * * Returns: the data of the first element in the queue, or %NULL if the queue * is empty. **/ gpointer g_queue_peek_head (GQueue *queue) { g_return_val_if_fail (queue != NULL, NULL); return queue->head ? queue->head->data : NULL; } /** * g_queue_peek_tail: * @queue: a #GQueue. * * Returns the last element of the queue. * * Returns: the data of the last element in the queue, or %NULL if the queue * is empty. **/ gpointer g_queue_peek_tail (GQueue *queue) { g_return_val_if_fail (queue != NULL, NULL); return queue->tail ? queue->tail->data : NULL; } /** * g_queue_peek_nth: * @queue: a #GQueue * @n: the position of the element. * * Returns the @n'th element of @queue. * * Return value: The data for the @n'th element of @queue, or %NULL if @n is * off the end of @queue. * * Since: 2.4 **/ gpointer g_queue_peek_nth (GQueue *queue, guint n) { GList *link; g_return_val_if_fail (queue != NULL, NULL); link = g_queue_peek_nth_link (queue, n); if (link) return link->data; return NULL; } /** * g_queue_index: * @queue: a #GQueue * @data: the data to find. * * Returns the position of the first element in @queue which contains @data. * * Return value: The position of the first element in @queue which contains @data, or -1 if no element in @queue contains @data. * * Since: 2.4 **/ gint g_queue_index (GQueue *queue, gconstpointer data) { g_return_val_if_fail (queue != NULL, -1); return g_list_index (queue->head, data); } /** * g_queue_remove: * @queue: a #GQueue * @data: data to remove. * * Removes the first element in @queue that contains @data. * * Return value: %TRUE if @data was found and removed from @queue * * Since: 2.4 **/ gboolean g_queue_remove (GQueue *queue, gconstpointer data) { GList *link; g_return_val_if_fail (queue != NULL, FALSE); link = g_list_find (queue->head, data); if (link) g_queue_delete_link (queue, link); return (link != NULL); } /** * g_queue_remove_all: * @queue: a #GQueue * @data: data to remove * * Remove all elements whose data equals @data from @queue. * * Return value: the number of elements removed from @queue * * Since: 2.4 **/ guint g_queue_remove_all (GQueue *queue, gconstpointer data) { GList *list; guint old_length; g_return_val_if_fail (queue != NULL, 0); old_length = queue->length; list = queue->head; while (list) { GList *next = list->next; if (list->data == data) g_queue_delete_link (queue, list); list = next; } return (old_length - queue->length); } /** * g_queue_insert_before: * @queue: a #GQueue * @sibling: a #GList link that must be part of @queue * @data: the data to insert * * Inserts @data into @queue before @sibling. * * @sibling must be part of @queue. * * Since: 2.4 **/ void g_queue_insert_before (GQueue *queue, GList *sibling, gpointer data) { g_return_if_fail (queue != NULL); g_return_if_fail (sibling != NULL); queue->head = g_list_insert_before (queue->head, sibling, data); queue->length++; } /** * g_queue_insert_after: * @queue: a #GQueue * @sibling: a #GList link that must be part of @queue * @data: the data to insert * * Inserts @data into @queue after @sibling * * @sibling must be part of @queue * * Since: 2.4 **/ void g_queue_insert_after (GQueue *queue, GList *sibling, gpointer data) { g_return_if_fail (queue != NULL); g_return_if_fail (sibling != NULL); if (sibling == queue->tail) g_queue_push_tail (queue, data); else g_queue_insert_before (queue, sibling->next, data); } /** * g_queue_insert_sorted: * @queue: a #GQueue * @data: the data to insert * @func: the #GCompareDataFunc used to compare elements in the queue. It is * called with two elements of the @queue and @user_data. It should * return 0 if the elements are equal, a negative value if the first * element comes before the second, and a positive value if the second * element comes before the first. * @user_data: user data passed to @func. * * Inserts @data into @queue using @func to determine the new position. * * Since: 2.4 **/ void g_queue_insert_sorted (GQueue *queue, gpointer data, GCompareDataFunc func, gpointer user_data) { GList *list; g_return_if_fail (queue != NULL); list = queue->head; while (list && func (list->data, data, user_data) < 0) list = list->next; if (list) g_queue_insert_before (queue, list, data); else g_queue_push_tail (queue, data); } pkg-config-0.29.1/glib/glib/gvariant-internal.h0000664000175000017500000000363212651243552016213 00000000000000/* * Copyright © 2007, 2008 Ryan Lortie * Copyright © 2009, 2010 Codethink Limited * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the licence, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * * Author: Ryan Lortie */ /* The purpose of this header is to allow certain internal symbols of * GVariant to be put under test cases. */ #ifndef __G_VARIANT_INTERNAL_H__ #define __G_VARIANT_INTERNAL_H__ /* Hack */ #define __GLIB_H_INSIDE__ #include #include #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); #endif /* __G_VARIANT_INTERNAL_H__ */ pkg-config-0.29.1/glib/glib/ghash.h0000664000175000017500000001643612651243552013666 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the GLib Team and others 1997-2000. See the AUTHORS * file for a list of people on the GLib Team. See the ChangeLog * files for a list of changes. These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/. */ #ifndef __G_HASH_H__ #define __G_HASH_H__ #if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) #error "Only can be included directly." #endif #include #include G_BEGIN_DECLS typedef struct _GHashTable GHashTable; typedef gboolean (*GHRFunc) (gpointer key, gpointer value, gpointer user_data); typedef struct _GHashTableIter GHashTableIter; struct _GHashTableIter { /*< private >*/ gpointer dummy1; gpointer dummy2; gpointer dummy3; int dummy4; gboolean dummy5; 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 #define g_hash_table_freeze(hash_table) ((void)0) #define g_hash_table_thaw(hash_table) ((void)0) #endif /* 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; G_END_DECLS #endif /* __G_HASH_H__ */ pkg-config-0.29.1/glib/glib/gthreadpool.c0000664000175000017500000007471412651243552015102 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * GThreadPool: thread pool implementation. * Copyright (C) 2000 Sebastian Wilhelmi; University of Karlsruhe * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * MT safe */ #include "config.h" #include "gthreadpool.h" #include "gasyncqueue.h" #include "gasyncqueueprivate.h" #include "gmain.h" #include "gtestutils.h" #include "gtimer.h" /** * SECTION:thread_pools * @title: Thread Pools * @short_description: pools of threads to execute work concurrently * @see_also: #GThread * * Sometimes you wish to asynchronously fork out the execution of work * and continue working in your own thread. If that will happen often, * the overhead of starting and destroying a thread each time might be * too high. In such cases reusing already started threads seems like a * good idea. And it indeed is, but implementing this can be tedious * and error-prone. * * Therefore GLib provides thread pools for your convenience. An added * advantage is, that the threads can be shared between the different * subsystems of your program, when they are using GLib. * * To create a new thread pool, you use g_thread_pool_new(). * It is destroyed by g_thread_pool_free(). * * If you want to execute a certain task within a thread pool, * you call g_thread_pool_push(). * * To get the current number of running threads you call * g_thread_pool_get_num_threads(). To get the number of still * unprocessed tasks you call g_thread_pool_unprocessed(). To control * the maximal number of threads for a thread pool, you use * g_thread_pool_get_max_threads() and g_thread_pool_set_max_threads(). * * Finally you can control the number of unused threads, that are kept * alive by GLib for future use. The current number can be fetched with * g_thread_pool_get_num_unused_threads(). The maximal number can be * controlled by g_thread_pool_get_max_unused_threads() and * g_thread_pool_set_max_unused_threads(). All currently unused threads * can be stopped by calling g_thread_pool_stop_unused_threads(). */ #define DEBUG_MSG(x) /* #define DEBUG_MSG(args) g_printerr args ; g_printerr ("\n"); */ typedef struct _GRealThreadPool GRealThreadPool; /** * GThreadPool: * @func: the function to execute in the threads of this pool * @user_data: the user data for the threads of this pool * @exclusive: are all threads exclusive to this pool * * The #GThreadPool struct represents a thread pool. It has three * public read-only members, but the underlying struct is bigger, * so you must not copy this struct. */ struct _GRealThreadPool { GThreadPool pool; GAsyncQueue *queue; GCond cond; gint max_threads; gint num_threads; gboolean running; gboolean immediate; gboolean waiting; GCompareDataFunc sort_func; gpointer sort_user_data; }; /* The following is just an address to mark the wakeup order for a * thread, it could be any address (as long, as it isn't a valid * GThreadPool address) */ static const gpointer wakeup_thread_marker = (gpointer) &g_thread_pool_new; static gint wakeup_thread_serial = 0; /* Here all unused threads are waiting */ static GAsyncQueue *unused_thread_queue = NULL; static gint unused_threads = 0; static gint max_unused_threads = 2; static gint kill_unused_threads = 0; static guint max_idle_time = 15 * 1000; static void g_thread_pool_queue_push_unlocked (GRealThreadPool *pool, gpointer data); static void g_thread_pool_free_internal (GRealThreadPool *pool); static gpointer g_thread_pool_thread_proxy (gpointer data); static gboolean g_thread_pool_start_thread (GRealThreadPool *pool, GError **error); static void g_thread_pool_wakeup_and_stop_all (GRealThreadPool *pool); static GRealThreadPool* g_thread_pool_wait_for_new_pool (void); static gpointer g_thread_pool_wait_for_new_task (GRealThreadPool *pool); static void g_thread_pool_queue_push_unlocked (GRealThreadPool *pool, gpointer data) { if (pool->sort_func) g_async_queue_push_sorted_unlocked (pool->queue, data, pool->sort_func, pool->sort_user_data); else g_async_queue_push_unlocked (pool->queue, data); } static GRealThreadPool* g_thread_pool_wait_for_new_pool (void) { GRealThreadPool *pool; gint local_wakeup_thread_serial; guint local_max_unused_threads; gint local_max_idle_time; gint last_wakeup_thread_serial; gboolean have_relayed_thread_marker = FALSE; local_max_unused_threads = g_atomic_int_get (&max_unused_threads); local_max_idle_time = g_atomic_int_get (&max_idle_time); last_wakeup_thread_serial = g_atomic_int_get (&wakeup_thread_serial); g_atomic_int_inc (&unused_threads); do { if (g_atomic_int_get (&unused_threads) >= local_max_unused_threads) { /* If this is a superfluous thread, stop it. */ pool = NULL; } else if (local_max_idle_time > 0) { /* If a maximal idle time is given, wait for the given time. */ DEBUG_MSG (("thread %p waiting in global pool for %f seconds.", g_thread_self (), local_max_idle_time / 1000.0)); pool = g_async_queue_timeout_pop (unused_thread_queue, local_max_idle_time * 1000); } else { /* If no maximal idle time is given, wait indefinitely. */ DEBUG_MSG (("thread %p waiting in global pool.", g_thread_self ())); pool = g_async_queue_pop (unused_thread_queue); } if (pool == wakeup_thread_marker) { local_wakeup_thread_serial = g_atomic_int_get (&wakeup_thread_serial); if (last_wakeup_thread_serial == local_wakeup_thread_serial) { if (!have_relayed_thread_marker) { /* If this wakeup marker has been received for * the second time, relay it. */ DEBUG_MSG (("thread %p relaying wakeup message to " "waiting thread with lower serial.", g_thread_self ())); g_async_queue_push (unused_thread_queue, wakeup_thread_marker); have_relayed_thread_marker = TRUE; /* If a wakeup marker has been relayed, this thread * will get out of the way for 100 microseconds to * avoid receiving this marker again. */ g_usleep (100); } } else { if (g_atomic_int_add (&kill_unused_threads, -1) > 0) { pool = NULL; break; } DEBUG_MSG (("thread %p updating to new limits.", g_thread_self ())); local_max_unused_threads = g_atomic_int_get (&max_unused_threads); local_max_idle_time = g_atomic_int_get (&max_idle_time); last_wakeup_thread_serial = local_wakeup_thread_serial; have_relayed_thread_marker = FALSE; } } } while (pool == wakeup_thread_marker); g_atomic_int_add (&unused_threads, -1); return pool; } static gpointer g_thread_pool_wait_for_new_task (GRealThreadPool *pool) { gpointer task = NULL; if (pool->running || (!pool->immediate && g_async_queue_length_unlocked (pool->queue) > 0)) { /* This thread pool is still active. */ if (pool->num_threads > pool->max_threads && pool->max_threads != -1) { /* This is a superfluous thread, so it goes to the global pool. */ DEBUG_MSG (("superfluous thread %p in pool %p.", g_thread_self (), pool)); } else if (pool->pool.exclusive) { /* Exclusive threads stay attached to the pool. */ task = g_async_queue_pop_unlocked (pool->queue); DEBUG_MSG (("thread %p in exclusive pool %p waits for task " "(%d running, %d unprocessed).", g_thread_self (), pool, pool->num_threads, g_async_queue_length_unlocked (pool->queue))); } else { /* A thread will wait for new tasks for at most 1/2 * second before going to the global pool. */ DEBUG_MSG (("thread %p in pool %p waits for up to a 1/2 second for task " "(%d running, %d unprocessed).", g_thread_self (), pool, pool->num_threads, g_async_queue_length_unlocked (pool->queue))); task = g_async_queue_timeout_pop_unlocked (pool->queue, G_USEC_PER_SEC / 2); } } else { /* This thread pool is inactive, it will no longer process tasks. */ DEBUG_MSG (("pool %p not active, thread %p will go to global pool " "(running: %s, immediate: %s, len: %d).", pool, g_thread_self (), pool->running ? "true" : "false", pool->immediate ? "true" : "false", g_async_queue_length_unlocked (pool->queue))); } return task; } static gpointer g_thread_pool_thread_proxy (gpointer data) { GRealThreadPool *pool; pool = data; DEBUG_MSG (("thread %p started for pool %p.", g_thread_self (), pool)); g_async_queue_lock (pool->queue); while (TRUE) { gpointer task; task = g_thread_pool_wait_for_new_task (pool); if (task) { if (pool->running || !pool->immediate) { /* A task was received and the thread pool is active, * so execute the function. */ g_async_queue_unlock (pool->queue); DEBUG_MSG (("thread %p in pool %p calling func.", g_thread_self (), pool)); pool->pool.func (task, pool->pool.user_data); g_async_queue_lock (pool->queue); } } else { /* No task was received, so this thread goes to the global pool. */ gboolean free_pool = FALSE; DEBUG_MSG (("thread %p leaving pool %p for global pool.", g_thread_self (), pool)); pool->num_threads--; if (!pool->running) { if (!pool->waiting) { if (pool->num_threads == 0) { /* If the pool is not running and no other * thread is waiting for this thread pool to * finish and this is the last thread of this * pool, free the pool. */ free_pool = TRUE; } else { /* If the pool is not running and no other * thread is waiting for this thread pool to * finish and this is not the last thread of * this pool and there are no tasks left in the * queue, wakeup the remaining threads. */ if (g_async_queue_length_unlocked (pool->queue) == - pool->num_threads) g_thread_pool_wakeup_and_stop_all (pool); } } else if (pool->immediate || g_async_queue_length_unlocked (pool->queue) <= 0) { /* If the pool is not running and another thread is * waiting for this thread pool to finish and there * are either no tasks left or the pool shall stop * immediately, inform the waiting thread of a change * of the thread pool state. */ g_cond_broadcast (&pool->cond); } } g_async_queue_unlock (pool->queue); if (free_pool) g_thread_pool_free_internal (pool); if ((pool = g_thread_pool_wait_for_new_pool ()) == NULL) break; g_async_queue_lock (pool->queue); DEBUG_MSG (("thread %p entering pool %p from global pool.", g_thread_self (), pool)); /* pool->num_threads++ is not done here, but in * g_thread_pool_start_thread to make the new started * thread known to the pool before itself can do it. */ } } return NULL; } static gboolean g_thread_pool_start_thread (GRealThreadPool *pool, GError **error) { gboolean success = FALSE; if (pool->num_threads >= pool->max_threads && pool->max_threads != -1) /* Enough threads are already running */ return TRUE; g_async_queue_lock (unused_thread_queue); if (g_async_queue_length_unlocked (unused_thread_queue) < 0) { g_async_queue_push_unlocked (unused_thread_queue, pool); success = TRUE; } g_async_queue_unlock (unused_thread_queue); if (!success) { GThread *thread; /* No thread was found, we have to start a new one */ thread = g_thread_try_new ("pool", g_thread_pool_thread_proxy, pool, error); if (thread == NULL) return FALSE; g_thread_unref (thread); } /* See comment in g_thread_pool_thread_proxy as to why this is done * here and not there */ pool->num_threads++; return TRUE; } /** * g_thread_pool_new: * @func: a function to execute in the threads of the new thread pool * @user_data: user data that is handed over to @func every time it * is called * @max_threads: the maximal number of threads to execute concurrently * in the new thread pool, -1 means no limit * @exclusive: should this thread pool be exclusive? * @error: return location for error, or %NULL * * This function creates a new thread pool. * * Whenever you call g_thread_pool_push(), either a new thread is * created or an unused one is reused. At most @max_threads threads * are running concurrently for this thread pool. @max_threads = -1 * allows unlimited threads to be created for this thread pool. The * newly created or reused thread now executes the function @func * with the two arguments. The first one is the parameter to * g_thread_pool_push() and the second one is @user_data. * * The parameter @exclusive determines whether the thread pool owns * all threads exclusive or shares them with other thread pools. * If @exclusive is %TRUE, @max_threads threads are started * immediately and they will run exclusively for this thread pool * until it is destroyed by g_thread_pool_free(). If @exclusive is * %FALSE, threads are created when needed and shared between all * non-exclusive thread pools. This implies that @max_threads may * not be -1 for exclusive thread pools. * * @error can be %NULL to ignore errors, or non-%NULL to report * errors. An error can only occur when @exclusive is set to %TRUE * and not all @max_threads threads could be created. * * Return value: the new #GThreadPool */ GThreadPool * g_thread_pool_new (GFunc func, gpointer user_data, gint max_threads, gboolean exclusive, GError **error) { GRealThreadPool *retval; G_LOCK_DEFINE_STATIC (init); g_return_val_if_fail (func, NULL); g_return_val_if_fail (!exclusive || max_threads != -1, NULL); g_return_val_if_fail (max_threads >= -1, NULL); retval = g_new (GRealThreadPool, 1); retval->pool.func = func; retval->pool.user_data = user_data; retval->pool.exclusive = exclusive; retval->queue = g_async_queue_new (); g_cond_init (&retval->cond); retval->max_threads = max_threads; retval->num_threads = 0; retval->running = TRUE; retval->immediate = FALSE; retval->waiting = FALSE; retval->sort_func = NULL; retval->sort_user_data = NULL; G_LOCK (init); if (!unused_thread_queue) unused_thread_queue = g_async_queue_new (); G_UNLOCK (init); if (retval->pool.exclusive) { g_async_queue_lock (retval->queue); while (retval->num_threads < retval->max_threads) { GError *local_error = NULL; if (!g_thread_pool_start_thread (retval, &local_error)) { g_propagate_error (error, local_error); break; } } g_async_queue_unlock (retval->queue); } return (GThreadPool*) retval; } /** * g_thread_pool_push: * @pool: a #GThreadPool * @data: a new task for @pool * @error: return location for error, or %NULL * * Inserts @data into the list of tasks to be executed by @pool. * * When the number of currently running threads is lower than the * maximal allowed number of threads, a new thread is started (or * reused) with the properties given to g_thread_pool_new(). * Otherwise, @data stays in the queue until a thread in this pool * finishes its previous task and processes @data. * * @error can be %NULL to ignore errors, or non-%NULL to report * errors. An error can only occur when a new thread couldn't be * created. In that case @data is simply appended to the queue of * work to do. * * Before version 2.32, this function did not return a success status. * * Return value: %TRUE on success, %FALSE if an error occurred */ gboolean g_thread_pool_push (GThreadPool *pool, gpointer data, GError **error) { GRealThreadPool *real; gboolean result; real = (GRealThreadPool*) pool; g_return_val_if_fail (real, FALSE); g_return_val_if_fail (real->running, FALSE); result = TRUE; g_async_queue_lock (real->queue); if (g_async_queue_length_unlocked (real->queue) >= 0) { /* No thread is waiting in the queue */ GError *local_error = NULL; if (!g_thread_pool_start_thread (real, &local_error)) { g_propagate_error (error, local_error); result = FALSE; } } g_thread_pool_queue_push_unlocked (real, data); g_async_queue_unlock (real->queue); return result; } /** * g_thread_pool_set_max_threads: * @pool: a #GThreadPool * @max_threads: a new maximal number of threads for @pool, * or -1 for unlimited * @error: return location for error, or %NULL * * Sets the maximal allowed number of threads for @pool. * A value of -1 means that the maximal number of threads * is unlimited. If @pool is an exclusive thread pool, setting * the maximal number of threads to -1 is not allowed. * * Setting @max_threads to 0 means stopping all work for @pool. * It is effectively frozen until @max_threads is set to a non-zero * value again. * * A thread is never terminated while calling @func, as supplied by * g_thread_pool_new(). Instead the maximal number of threads only * has effect for the allocation of new threads in g_thread_pool_push(). * A new thread is allocated, whenever the number of currently * running threads in @pool is smaller than the maximal number. * * @error can be %NULL to ignore errors, or non-%NULL to report * errors. An error can only occur when a new thread couldn't be * created. * * Before version 2.32, this function did not return a success status. * * Return value: %TRUE on success, %FALSE if an error occurred */ gboolean g_thread_pool_set_max_threads (GThreadPool *pool, gint max_threads, GError **error) { GRealThreadPool *real; gint to_start; gboolean result; real = (GRealThreadPool*) pool; g_return_val_if_fail (real, FALSE); g_return_val_if_fail (real->running, FALSE); g_return_val_if_fail (!real->pool.exclusive || max_threads != -1, FALSE); g_return_val_if_fail (max_threads >= -1, FALSE); result = TRUE; g_async_queue_lock (real->queue); real->max_threads = max_threads; if (pool->exclusive) to_start = real->max_threads - real->num_threads; else to_start = g_async_queue_length_unlocked (real->queue); for ( ; to_start > 0; to_start--) { GError *local_error = NULL; if (!g_thread_pool_start_thread (real, &local_error)) { g_propagate_error (error, local_error); result = FALSE; break; } } g_async_queue_unlock (real->queue); return result; } /** * g_thread_pool_get_max_threads: * @pool: a #GThreadPool * * Returns the maximal number of threads for @pool. * * Return value: the maximal number of threads */ gint g_thread_pool_get_max_threads (GThreadPool *pool) { GRealThreadPool *real; gint retval; real = (GRealThreadPool*) pool; g_return_val_if_fail (real, 0); g_return_val_if_fail (real->running, 0); g_async_queue_lock (real->queue); retval = real->max_threads; g_async_queue_unlock (real->queue); return retval; } /** * g_thread_pool_get_num_threads: * @pool: a #GThreadPool * * Returns the number of threads currently running in @pool. * * Return value: the number of threads currently running */ guint g_thread_pool_get_num_threads (GThreadPool *pool) { GRealThreadPool *real; guint retval; real = (GRealThreadPool*) pool; g_return_val_if_fail (real, 0); g_return_val_if_fail (real->running, 0); g_async_queue_lock (real->queue); retval = real->num_threads; g_async_queue_unlock (real->queue); return retval; } /** * g_thread_pool_unprocessed: * @pool: a #GThreadPool * * Returns the number of tasks still unprocessed in @pool. * * Return value: the number of unprocessed tasks */ guint g_thread_pool_unprocessed (GThreadPool *pool) { GRealThreadPool *real; gint unprocessed; real = (GRealThreadPool*) pool; g_return_val_if_fail (real, 0); g_return_val_if_fail (real->running, 0); unprocessed = g_async_queue_length (real->queue); return MAX (unprocessed, 0); } /** * g_thread_pool_free: * @pool: a #GThreadPool * @immediate: should @pool shut down immediately? * @wait_: should the function wait for all tasks to be finished? * * Frees all resources allocated for @pool. * * If @immediate is %TRUE, no new task is processed for @pool. * Otherwise @pool is not freed before the last task is processed. * Note however, that no thread of this pool is interrupted while * processing a task. Instead at least all still running threads * can finish their tasks before the @pool is freed. * * If @wait_ is %TRUE, the functions does not return before all * tasks to be processed (dependent on @immediate, whether all * or only the currently running) are ready. * Otherwise the function returns immediately. * * After calling this function @pool must not be used anymore. */ void g_thread_pool_free (GThreadPool *pool, gboolean immediate, gboolean wait_) { GRealThreadPool *real; real = (GRealThreadPool*) pool; g_return_if_fail (real); g_return_if_fail (real->running); /* If there's no thread allowed here, there is not much sense in * not stopping this pool immediately, when it's not empty */ g_return_if_fail (immediate || real->max_threads != 0 || g_async_queue_length (real->queue) == 0); g_async_queue_lock (real->queue); real->running = FALSE; real->immediate = immediate; real->waiting = wait_; if (wait_) { while (g_async_queue_length_unlocked (real->queue) != -real->num_threads && !(immediate && real->num_threads == 0)) g_cond_wait (&real->cond, _g_async_queue_get_mutex (real->queue)); } if (immediate || g_async_queue_length_unlocked (real->queue) == -real->num_threads) { /* No thread is currently doing something (and nothing is left * to process in the queue) */ if (real->num_threads == 0) { /* No threads left, we clean up */ g_async_queue_unlock (real->queue); g_thread_pool_free_internal (real); return; } g_thread_pool_wakeup_and_stop_all (real); } /* The last thread should cleanup the pool */ real->waiting = FALSE; g_async_queue_unlock (real->queue); } static void g_thread_pool_free_internal (GRealThreadPool* pool) { g_return_if_fail (pool); g_return_if_fail (pool->running == FALSE); g_return_if_fail (pool->num_threads == 0); g_async_queue_unref (pool->queue); g_cond_clear (&pool->cond); g_free (pool); } static void g_thread_pool_wakeup_and_stop_all (GRealThreadPool *pool) { guint i; g_return_if_fail (pool); g_return_if_fail (pool->running == FALSE); g_return_if_fail (pool->num_threads != 0); pool->immediate = TRUE; for (i = 0; i < pool->num_threads; i++) g_thread_pool_queue_push_unlocked (pool, GUINT_TO_POINTER (1)); } /** * g_thread_pool_set_max_unused_threads: * @max_threads: maximal number of unused threads * * Sets the maximal number of unused threads to @max_threads. * If @max_threads is -1, no limit is imposed on the number * of unused threads. * * The default value is 2. */ void g_thread_pool_set_max_unused_threads (gint max_threads) { g_return_if_fail (max_threads >= -1); g_atomic_int_set (&max_unused_threads, max_threads); if (max_threads != -1) { max_threads -= g_atomic_int_get (&unused_threads); if (max_threads < 0) { g_atomic_int_set (&kill_unused_threads, -max_threads); g_atomic_int_inc (&wakeup_thread_serial); g_async_queue_lock (unused_thread_queue); do { g_async_queue_push_unlocked (unused_thread_queue, wakeup_thread_marker); } while (++max_threads); g_async_queue_unlock (unused_thread_queue); } } } /** * g_thread_pool_get_max_unused_threads: * * Returns the maximal allowed number of unused threads. * * Return value: the maximal number of unused threads */ gint g_thread_pool_get_max_unused_threads (void) { return g_atomic_int_get (&max_unused_threads); } /** * g_thread_pool_get_num_unused_threads: * * Returns the number of currently unused threads. * * Return value: the number of currently unused threads */ guint g_thread_pool_get_num_unused_threads (void) { return g_atomic_int_get (&unused_threads); } /** * g_thread_pool_stop_unused_threads: * * Stops all currently unused threads. This does not change the * maximal number of unused threads. This function can be used to * regularly stop all unused threads e.g. from g_timeout_add(). */ void g_thread_pool_stop_unused_threads (void) { guint oldval; oldval = g_thread_pool_get_max_unused_threads (); g_thread_pool_set_max_unused_threads (0); g_thread_pool_set_max_unused_threads (oldval); } /** * g_thread_pool_set_sort_function: * @pool: a #GThreadPool * @func: the #GCompareDataFunc used to sort the list of tasks. * This function is passed two tasks. It should return * 0 if the order in which they are handled does not matter, * a negative value if the first task should be processed before * the second or a positive value if the second task should be * processed first. * @user_data: user data passed to @func * * Sets the function used to sort the list of tasks. This allows the * tasks to be processed by a priority determined by @func, and not * just in the order in which they were added to the pool. * * Note, if the maximum number of threads is more than 1, the order * that threads are executed cannot be guaranteed 100%. Threads are * scheduled by the operating system and are executed at random. It * cannot be assumed that threads are executed in the order they are * created. * * Since: 2.10 */ void g_thread_pool_set_sort_function (GThreadPool *pool, GCompareDataFunc func, gpointer user_data) { GRealThreadPool *real; real = (GRealThreadPool*) pool; g_return_if_fail (real); g_return_if_fail (real->running); g_async_queue_lock (real->queue); real->sort_func = func; real->sort_user_data = user_data; if (func) g_async_queue_sort_unlocked (real->queue, real->sort_func, real->sort_user_data); g_async_queue_unlock (real->queue); } /** * g_thread_pool_set_max_idle_time: * @interval: the maximum @interval (in milliseconds) * a thread can be idle * * This function will set the maximum @interval that a thread * waiting in the pool for new tasks can be idle for before * being stopped. This function is similar to calling * g_thread_pool_stop_unused_threads() on a regular timeout, * except this is done on a per thread basis. * * By setting @interval to 0, idle threads will not be stopped. * * The default value is 15000 (15 seconds). * * Since: 2.10 */ void g_thread_pool_set_max_idle_time (guint interval) { guint i; g_atomic_int_set (&max_idle_time, interval); i = g_atomic_int_get (&unused_threads); if (i > 0) { g_atomic_int_inc (&wakeup_thread_serial); g_async_queue_lock (unused_thread_queue); do { g_async_queue_push_unlocked (unused_thread_queue, wakeup_thread_marker); } while (--i); g_async_queue_unlock (unused_thread_queue); } } /** * g_thread_pool_get_max_idle_time: * * This function will return the maximum @interval that a * thread will wait in the thread pool for new tasks before * being stopped. * * If this function returns 0, threads waiting in the thread * pool for new work are not stopped. * * Return value: the maximum @interval (milliseconds) to wait * for new tasks in the thread pool before stopping the * thread * * Since: 2.10 */ guint g_thread_pool_get_max_idle_time (void) { return g_atomic_int_get (&max_idle_time); } pkg-config-0.29.1/glib/glib/gvarianttypeinfo.c0000664000175000017500000006654212275467762016200 00000000000000/* * Copyright © 2008 Ryan Lortie * Copyright © 2010 Codethink Limited * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * * Author: Ryan Lortie */ #include "config.h" #include "gvarianttypeinfo.h" #include #include #include #include /* < private > * GVariantTypeInfo: * * This structure contains the necessary information to facilitate the * serialisation and fast deserialisation of a given type of GVariant * value. A GVariant instance holds a pointer to one of these * structures to provide for efficient operation. * * The GVariantTypeInfo structures for all of the base types, plus the * "variant" type are stored in a read-only static array. * * For container types, a hash table and reference counting is used to * ensure that only one of these structures exists for any given type. * In general, a container GVariantTypeInfo will exist for a given type * only if one or more GVariant instances of that type exist or if * another GVariantTypeInfo has that type as a subtype. For example, if * a process contains a single GVariant instance with type "(asv)", then * container GVariantTypeInfo structures will exist for "(asv)" and * for "as" (note that "s" and "v" always exist in the static array). * * The trickiest part of GVariantTypeInfo (and in fact, the major reason * for its existence) is the storage of somewhat magical constants that * allow for O(1) lookups of items in tuples. This is described below. * * 'container_class' is set to 'a' or 'r' if the GVariantTypeInfo is * contained inside of an ArrayInfo or TupleInfo, respectively. This * allows the storage of the necessary additional information. * * 'fixed_size' is set to the fixed size of the type, if applicable, or * 0 otherwise (since no type has a fixed size of 0). * * 'alignment' is set to one less than the alignment requirement for * this type. This makes many operations much more convenient. */ struct _GVariantTypeInfo { gsize fixed_size; guchar alignment; guchar container_class; }; /* Container types are reference counted. They also need to have their * type string stored explicitly since it is not merely a single letter. */ typedef struct { GVariantTypeInfo info; gchar *type_string; gint ref_count; } ContainerInfo; /* For 'array' and 'maybe' types, we store some extra information on the * end of the GVariantTypeInfo struct -- the element type (ie: "s" for * "as"). The container GVariantTypeInfo structure holds a reference to * the element typeinfo. */ typedef struct { ContainerInfo container; GVariantTypeInfo *element; } ArrayInfo; /* For 'tuple' and 'dict entry' types, we store extra information for * each member -- its type and how to find it inside the serialised data * in O(1) time using 4 variables -- 'i', 'a', 'b', and 'c'. See the * comment on GVariantMemberInfo in gvarianttypeinfo.h. */ typedef struct { ContainerInfo container; GVariantMemberInfo *members; gsize n_members; } TupleInfo; /* Hard-code the base types in a constant array */ static const GVariantTypeInfo g_variant_type_info_basic_table[24] = { #define fixed_aligned(x) x, x - 1 #define not_a_type 0, #define unaligned 0, 0 #define aligned(x) 0, x - 1 /* 'b' */ { fixed_aligned(1) }, /* boolean */ /* 'c' */ { not_a_type }, /* 'd' */ { fixed_aligned(8) }, /* double */ /* 'e' */ { not_a_type }, /* 'f' */ { not_a_type }, /* 'g' */ { unaligned }, /* signature string */ /* 'h' */ { fixed_aligned(4) }, /* file handle (int32) */ /* 'i' */ { fixed_aligned(4) }, /* int32 */ /* 'j' */ { not_a_type }, /* 'k' */ { not_a_type }, /* 'l' */ { not_a_type }, /* 'm' */ { not_a_type }, /* 'n' */ { fixed_aligned(2) }, /* int16 */ /* 'o' */ { unaligned }, /* object path string */ /* 'p' */ { not_a_type }, /* 'q' */ { fixed_aligned(2) }, /* uint16 */ /* 'r' */ { not_a_type }, /* 's' */ { unaligned }, /* string */ /* 't' */ { fixed_aligned(8) }, /* uint64 */ /* 'u' */ { fixed_aligned(4) }, /* uint32 */ /* 'v' */ { aligned(8) }, /* variant */ /* 'w' */ { not_a_type }, /* 'x' */ { fixed_aligned(8) }, /* int64 */ /* 'y' */ { fixed_aligned(1) }, /* byte */ #undef fixed_aligned #undef not_a_type #undef unaligned #undef aligned }; /* We need to have type strings to return for the base types. We store * those in another array. Since all base type strings are single * characters this is easy. By not storing pointers to strings into the * GVariantTypeInfo itself, we save a bunch of relocations. */ static const char g_variant_type_info_basic_chars[24][2] = { "b", " ", "d", " ", " ", "g", "h", "i", " ", " ", " ", " ", "n", "o", " ", "q", " ", "s", "t", "u", "v", " ", "x", "y" }; /* sanity checks to make debugging easier */ static void g_variant_type_info_check (const GVariantTypeInfo *info, char container_class) { g_assert (!container_class || info->container_class == container_class); /* alignment can only be one of these */ g_assert (info->alignment == 0 || info->alignment == 1 || info->alignment == 3 || info->alignment == 7); if (info->container_class) { ContainerInfo *container = (ContainerInfo *) info; /* extra checks for containers */ g_assert_cmpint (container->ref_count, >, 0); g_assert (container->type_string != NULL); } else { gint index; /* if not a container, then ensure that it is a valid member of * the basic types table */ index = info - g_variant_type_info_basic_table; g_assert (G_N_ELEMENTS (g_variant_type_info_basic_table) == 24); g_assert (G_N_ELEMENTS (g_variant_type_info_basic_chars) == 24); g_assert (0 <= index && index < 24); g_assert (g_variant_type_info_basic_chars[index][0] != ' '); } } /* < private > * g_variant_type_info_get_type_string: * @info: a #GVariantTypeInfo * * Gets the type string for @info. The string is nul-terminated. */ const gchar * g_variant_type_info_get_type_string (GVariantTypeInfo *info) { g_variant_type_info_check (info, 0); if (info->container_class) { ContainerInfo *container = (ContainerInfo *) info; /* containers have their type string stored inside them */ return container->type_string; } else { gint index; /* look up the type string in the base type array. the call to * g_variant_type_info_check() above already ensured validity. */ index = info - g_variant_type_info_basic_table; return g_variant_type_info_basic_chars[index]; } } /* < private > * g_variant_type_info_query: * @info: a #GVariantTypeInfo * @alignment: (allow-none): the location to store the alignment, or %NULL * @fixed_size: (allow-none): the location to store the fixed size, or %NULL * * Queries @info to determine the alignment requirements and fixed size * (if any) of the type. * * @fixed_size, if non-%NULL is set to the fixed size of the type, or 0 * to indicate that the type is a variable-sized type. No type has a * fixed size of 0. * * @alignment, if non-%NULL, is set to one less than the required * alignment of the type. For example, for a 32bit integer, @alignment * would be set to 3. This allows you to round an integer up to the * proper alignment by performing the following efficient calculation: * * offset += ((-offset) & alignment); */ void g_variant_type_info_query (GVariantTypeInfo *info, guint *alignment, gsize *fixed_size) { g_variant_type_info_check (info, 0); if (alignment) *alignment = info->alignment; if (fixed_size) *fixed_size = info->fixed_size; } /* == array == */ #define GV_ARRAY_INFO_CLASS 'a' static ArrayInfo * GV_ARRAY_INFO (GVariantTypeInfo *info) { g_variant_type_info_check (info, GV_ARRAY_INFO_CLASS); return (ArrayInfo *) info; } static void array_info_free (GVariantTypeInfo *info) { ArrayInfo *array_info; g_assert (info->container_class == GV_ARRAY_INFO_CLASS); array_info = (ArrayInfo *) info; g_variant_type_info_unref (array_info->element); g_slice_free (ArrayInfo, array_info); } static ContainerInfo * array_info_new (const GVariantType *type) { ArrayInfo *info; info = g_slice_new (ArrayInfo); info->container.info.container_class = GV_ARRAY_INFO_CLASS; info->element = g_variant_type_info_get (g_variant_type_element (type)); info->container.info.alignment = info->element->alignment; info->container.info.fixed_size = 0; return (ContainerInfo *) info; } /* < private > * g_variant_type_info_element: * @info: a #GVariantTypeInfo for an array or maybe type * * Returns the element type for the array or maybe type. A reference is * not added, so the caller must add their own. */ GVariantTypeInfo * g_variant_type_info_element (GVariantTypeInfo *info) { return GV_ARRAY_INFO (info)->element; } /* < private > * g_variant_type_query_element: * @info: a #GVariantTypeInfo for an array or maybe type * @alignment: (allow-none): the location to store the alignment, or %NULL * @fixed_size: (allow-none): the location to store the fixed size, or %NULL * * Returns the alignment requires and fixed size (if any) for the * element type of the array. This call is a convenience wrapper around * g_variant_type_info_element() and g_variant_type_info_query(). */ void g_variant_type_info_query_element (GVariantTypeInfo *info, guint *alignment, gsize *fixed_size) { g_variant_type_info_query (GV_ARRAY_INFO (info)->element, alignment, fixed_size); } /* == tuple == */ #define GV_TUPLE_INFO_CLASS 'r' static TupleInfo * GV_TUPLE_INFO (GVariantTypeInfo *info) { g_variant_type_info_check (info, GV_TUPLE_INFO_CLASS); return (TupleInfo *) info; } static void tuple_info_free (GVariantTypeInfo *info) { TupleInfo *tuple_info; gint i; g_assert (info->container_class == GV_TUPLE_INFO_CLASS); tuple_info = (TupleInfo *) info; for (i = 0; i < tuple_info->n_members; i++) g_variant_type_info_unref (tuple_info->members[i].type_info); g_slice_free1 (sizeof (GVariantMemberInfo) * tuple_info->n_members, tuple_info->members); g_slice_free (TupleInfo, tuple_info); } static void tuple_allocate_members (const GVariantType *type, GVariantMemberInfo **members, gsize *n_members) { const GVariantType *item_type; gsize i = 0; *n_members = g_variant_type_n_items (type); *members = g_slice_alloc (sizeof (GVariantMemberInfo) * *n_members); item_type = g_variant_type_first (type); while (item_type) { GVariantMemberInfo *member = &(*members)[i++]; member->type_info = g_variant_type_info_get (item_type); item_type = g_variant_type_next (item_type); if (member->type_info->fixed_size) member->ending_type = G_VARIANT_MEMBER_ENDING_FIXED; else if (item_type == NULL) member->ending_type = G_VARIANT_MEMBER_ENDING_LAST; else member->ending_type = G_VARIANT_MEMBER_ENDING_OFFSET; } g_assert (i == *n_members); } /* this is g_variant_type_info_query for a given member of the tuple. * before the access is done, it is ensured that the item is within * range and %FALSE is returned if not. */ static gboolean tuple_get_item (TupleInfo *info, GVariantMemberInfo *item, gsize *d, gsize *e) { if (&info->members[info->n_members] == item) return FALSE; *d = item->type_info->alignment; *e = item->type_info->fixed_size; return TRUE; } /* Read the documentation for #GVariantMemberInfo in gvarianttype.h * before attempting to understand this. * * This function adds one set of "magic constant" values (for one item * in the tuple) to the table. * * The algorithm in tuple_generate_table() calculates values of 'a', 'b' * and 'c' for each item, such that the procedure for finding the item * is to start at the end of the previous variable-sized item, add 'a', * then round up to the nearest multiple of 'b', then then add 'c'. * Note that 'b' is stored in the usual "one less than" form. ie: * * start = ROUND_UP(prev_end + a, (b + 1)) + c; * * We tweak these values a little to allow for a slightly easier * computation and more compact storage. */ static void tuple_table_append (GVariantMemberInfo **items, gsize i, gsize a, gsize b, gsize c) { GVariantMemberInfo *item = (*items)++; /* We can shift multiples of the alignment size from 'c' into 'a'. * As long as we're shifting whole multiples, it won't affect the * result. This means that we can take the "aligned" portion off of * 'c' and add it into 'a'. * * Imagine (for sake of clarity) that ROUND_10 rounds up to the * nearest 10. It is clear that: * * ROUND_10(a) + c == ROUND_10(a + 10*(c / 10)) + (c % 10) * * ie: remove the 10s portion of 'c' and add it onto 'a'. * * To put some numbers on it, imagine we start with a = 34 and c = 27: * * ROUND_10(34) + 27 = 40 + 27 = 67 * * but also, we can split 27 up into 20 and 7 and do this: * * ROUND_10(34 + 20) + 7 = ROUND_10(54) + 7 = 60 + 7 = 67 * ^^ ^ * without affecting the result. We do that here. * * This reduction in the size of 'c' means that we can store it in a * gchar instead of a gsize. Due to how the structure is packed, this * ends up saving us 'two pointer sizes' per item in each tuple when * allocating using GSlice. */ a += ~b & c; /* take the "aligned" part of 'c' and add to 'a' */ c &= b; /* chop 'c' to contain only the unaligned part */ /* Finally, we made one last adjustment. Recall: * * start = ROUND_UP(prev_end + a, (b + 1)) + c; * * Forgetting the '+ c' for the moment: * * ROUND_UP(prev_end + a, (b + 1)); * * we can do a "round up" operation by adding 1 less than the amount * to round up to, then rounding down. ie: * * #define ROUND_UP(x, y) ROUND_DOWN(x + (y-1), y) * * Of course, for rounding down to a power of two, we can just mask * out the appropriate number of low order bits: * * #define ROUND_DOWN(x, y) (x & ~(y - 1)) * * Which gives us * * #define ROUND_UP(x, y) (x + (y - 1) & ~(y - 1)) * * but recall that our alignment value 'b' is already "one less". * This means that to round 'prev_end + a' up to 'b' we can just do: * * ((prev_end + a) + b) & ~b * * Associativity, and putting the 'c' back on: * * (prev_end + (a + b)) & ~b + c * * Now, since (a + b) is constant, we can just add 'b' to 'a' now and * store that as the number to add to prev_end. Then we use ~b as the * number to take a bitwise 'and' with. Finally, 'c' is added on. * * Note, however, that all the low order bits of the 'aligned' value * are masked out and that all of the high order bits of 'c' have been * "moved" to 'a' (in the previous step). This means that there are * no overlapping bits in the addition -- so we can do a bitwise 'or' * equivalently. * * This means that we can now compute the start address of a given * item in the tuple using the algorithm given in the documentation * for #GVariantMemberInfo: * * item_start = ((prev_end + a) & b) | c; */ item->i = i; item->a = a + b; item->b = ~b; item->c = c; } static gsize tuple_align (gsize offset, guint alignment) { return offset + ((-offset) & alignment); } /* This function is the heart of the algorithm for calculating 'i', 'a', * 'b' and 'c' for each item in the tuple. * * Imagine we want to find the start of the "i" in the type "(su(qx)ni)". * That's a string followed by a uint32, then a tuple containing a * uint16 and a int64, then an int16, then our "i". In order to get to * our "i" we: * * Start at the end of the string, align to 4 (for the uint32), add 4. * Align to 8, add 16 (for the tuple). Align to 2, add 2 (for the * int16). Then we're there. It turns out that, given 3 simple rules, * we can flatten this iteration into one addition, one alignment, then * one more addition. * * The loop below plays through each item in the tuple, querying its * alignment and fixed_size into 'd' and 'e', respectively. At all * times the variables 'a', 'b', and 'c' are maintained such that in * order to get to the current point, you add 'a', align to 'b' then add * 'c'. 'b' is kept in "one less than" form. For each item, the proper * alignment is applied to find the values of 'a', 'b' and 'c' to get to * the start of that item. Those values are recorded into the table. * The fixed size of the item (if applicable) is then added on. * * These 3 rules are how 'a', 'b' and 'c' are modified for alignment and * addition of fixed size. They have been proven correct but are * presented here, without proof: * * 1) in order to "align to 'd'" where 'd' is less than or equal to the * largest level of alignment seen so far ('b'), you align 'c' to * 'd'. * 2) in order to "align to 'd'" where 'd' is greater than the largest * level of alignment seen so far, you add 'c' aligned to 'b' to the * value of 'a', set 'b' to 'd' (ie: increase the 'largest alignment * seen') and reset 'c' to 0. * 3) in order to "add 'e'", just add 'e' to 'c'. */ static void tuple_generate_table (TupleInfo *info) { GVariantMemberInfo *items = info->members; gsize i = -1, a = 0, b = 0, c = 0, d, e; /* iterate over each item in the tuple. * 'd' will be the alignment of the item (in one-less form) * 'e' will be the fixed size (or 0 for variable-size items) */ while (tuple_get_item (info, items, &d, &e)) { /* align to 'd' */ if (d <= b) c = tuple_align (c, d); /* rule 1 */ else a += tuple_align (c, b), b = d, c = 0; /* rule 2 */ /* the start of the item is at this point (ie: right after we * have aligned for it). store this information in the table. */ tuple_table_append (&items, i, a, b, c); /* "move past" the item by adding in its size. */ if (e == 0) /* variable size: * * we'll have an offset stored to mark the end of this item, so * just bump the offset index to give us a new starting point * and reset all the counters. */ i++, a = b = c = 0; else /* fixed size */ c += e; /* rule 3 */ } } static void tuple_set_base_info (TupleInfo *info) { GVariantTypeInfo *base = &info->container.info; if (info->n_members > 0) { GVariantMemberInfo *m; /* the alignment requirement of the tuple is the alignment * requirement of its largest item. */ base->alignment = 0; for (m = info->members; m < &info->members[info->n_members]; m++) /* can find the max of a list of "one less than" powers of two * by 'or'ing them */ base->alignment |= m->type_info->alignment; m--; /* take 'm' back to the last item */ /* the structure only has a fixed size if no variable-size * offsets are stored and the last item is fixed-sized too (since * an offset is never stored for the last item). */ if (m->i == -1 && m->type_info->fixed_size) /* in that case, the fixed size can be found by finding the * start of the last item (in the usual way) and adding its * fixed size. * * if a tuple has a fixed size then it is always a multiple of * the alignment requirement (to make packing into arrays * easier) so we round up to that here. */ base->fixed_size = tuple_align (((m->a & m->b) | m->c) + m->type_info->fixed_size, base->alignment); else /* else, the tuple is not fixed size */ base->fixed_size = 0; } else { /* the empty tuple: '()'. * * has a size of 1 and an no alignment requirement. * * It has a size of 1 (not 0) for two practical reasons: * * 1) So we can determine how many of them are in an array * without dividing by zero or without other tricks. * * 2) Even if we had some trick to know the number of items in * the array (as GVariant did at one time) this would open a * potential denial of service attack: an attacker could send * you an extremely small array (in terms of number of bytes) * containing trillions of zero-sized items. If you iterated * over this array you would effectively infinite-loop your * program. By forcing a size of at least one, we bound the * amount of computation done in response to a message to a * reasonable function of the size of that message. */ base->alignment = 0; base->fixed_size = 1; } } static ContainerInfo * tuple_info_new (const GVariantType *type) { TupleInfo *info; info = g_slice_new (TupleInfo); info->container.info.container_class = GV_TUPLE_INFO_CLASS; tuple_allocate_members (type, &info->members, &info->n_members); tuple_generate_table (info); tuple_set_base_info (info); return (ContainerInfo *) info; } /* < private > * g_variant_type_info_n_members: * @info: a #GVariantTypeInfo for a tuple or dictionary entry type * * Returns the number of members in a tuple or dictionary entry type. * For a dictionary entry this will always be 2. */ gsize g_variant_type_info_n_members (GVariantTypeInfo *info) { return GV_TUPLE_INFO (info)->n_members; } /* < private > * g_variant_type_info_member_info: * @info: a #GVariantTypeInfo for a tuple or dictionary entry type * @index: the member to fetch information for * * Returns the #GVariantMemberInfo for a given member. See * documentation for that structure for why you would want this * information. * * @index must refer to a valid child (ie: strictly less than * g_variant_type_info_n_members() returns). */ const GVariantMemberInfo * g_variant_type_info_member_info (GVariantTypeInfo *info, gsize index) { TupleInfo *tuple_info = GV_TUPLE_INFO (info); if (index < tuple_info->n_members) return &tuple_info->members[index]; return NULL; } /* == new/ref/unref == */ static GRecMutex g_variant_type_info_lock; static GHashTable *g_variant_type_info_table; /* < private > * g_variant_type_info_get: * @type: a #GVariantType * * Returns a reference to a #GVariantTypeInfo for @type. * * If an info structure already exists for this type, a new reference is * returned. If not, the required calculations are performed and a new * info structure is returned. * * It is appropriate to call g_variant_type_info_unref() on the return * value. */ GVariantTypeInfo * g_variant_type_info_get (const GVariantType *type) { char type_char; type_char = g_variant_type_peek_string (type)[0]; if (type_char == G_VARIANT_TYPE_INFO_CHAR_MAYBE || type_char == G_VARIANT_TYPE_INFO_CHAR_ARRAY || type_char == G_VARIANT_TYPE_INFO_CHAR_TUPLE || type_char == G_VARIANT_TYPE_INFO_CHAR_DICT_ENTRY) { GVariantTypeInfo *info; gchar *type_string; type_string = g_variant_type_dup_string (type); g_rec_mutex_lock (&g_variant_type_info_lock); if (g_variant_type_info_table == NULL) g_variant_type_info_table = g_hash_table_new (g_str_hash, g_str_equal); info = g_hash_table_lookup (g_variant_type_info_table, type_string); if (info == NULL) { ContainerInfo *container; if (type_char == G_VARIANT_TYPE_INFO_CHAR_MAYBE || type_char == G_VARIANT_TYPE_INFO_CHAR_ARRAY) { container = array_info_new (type); } else /* tuple or dict entry */ { container = tuple_info_new (type); } info = (GVariantTypeInfo *) container; container->type_string = type_string; container->ref_count = 1; g_hash_table_insert (g_variant_type_info_table, type_string, info); type_string = NULL; } else g_variant_type_info_ref (info); g_rec_mutex_unlock (&g_variant_type_info_lock); g_variant_type_info_check (info, 0); g_free (type_string); return info; } else { const GVariantTypeInfo *info; int index; index = type_char - 'b'; g_assert (G_N_ELEMENTS (g_variant_type_info_basic_table) == 24); g_assert_cmpint (0, <=, index); g_assert_cmpint (index, <, 24); info = g_variant_type_info_basic_table + index; g_variant_type_info_check (info, 0); return (GVariantTypeInfo *) info; } } /* < private > * g_variant_type_info_ref: * @info: a #GVariantTypeInfo * * Adds a reference to @info. */ GVariantTypeInfo * g_variant_type_info_ref (GVariantTypeInfo *info) { g_variant_type_info_check (info, 0); if (info->container_class) { ContainerInfo *container = (ContainerInfo *) info; g_assert_cmpint (container->ref_count, >, 0); g_atomic_int_inc (&container->ref_count); } return info; } /* < private > * g_variant_type_info_unref: * @info: a #GVariantTypeInfo * * Releases a reference held on @info. This may result in @info being * freed. */ void g_variant_type_info_unref (GVariantTypeInfo *info) { g_variant_type_info_check (info, 0); if (info->container_class) { ContainerInfo *container = (ContainerInfo *) info; g_rec_mutex_lock (&g_variant_type_info_lock); if (g_atomic_int_dec_and_test (&container->ref_count)) { g_hash_table_remove (g_variant_type_info_table, container->type_string); if (g_hash_table_size (g_variant_type_info_table) == 0) { g_hash_table_unref (g_variant_type_info_table); g_variant_type_info_table = NULL; } g_rec_mutex_unlock (&g_variant_type_info_lock); g_free (container->type_string); if (info->container_class == GV_ARRAY_INFO_CLASS) array_info_free (info); else if (info->container_class == GV_TUPLE_INFO_CLASS) tuple_info_free (info); else g_assert_not_reached (); } else g_rec_mutex_unlock (&g_variant_type_info_lock); } } void g_variant_type_info_assert_no_infos (void) { g_assert (g_variant_type_info_table == NULL); } pkg-config-0.29.1/glib/glib/gwin32.h0000664000175000017500000001067512651243552013704 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the GLib Team and others 1997-2000. See the AUTHORS * file for a list of people on the GLib Team. See the ChangeLog * files for a list of changes. These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/. */ #ifndef __G_WIN32_H__ #define __G_WIN32_H__ #if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) #error "Only can be included directly." #endif #include #ifdef G_PLATFORM_WIN32 G_BEGIN_DECLS #ifndef MAXPATHLEN #define MAXPATHLEN 1024 #endif #ifdef G_OS_WIN32 /* * To get prototypes for the following POSIXish functions, you have to * include the indicated non-POSIX headers. The functions are defined * in OLDNAMES.LIB (MSVC) or -lmoldname-msvc (mingw32). But note that * for POSIX functions that take or return file names in the system * codepage, in many cases you would want to use the GLib wrappers in * gstdio.h and UTF-8 instead. * * getcwd: (MSVC), (mingw32) * getpid: * access: * unlink: or * open, read, write, lseek, close: * rmdir: * pipe: (actually, _pipe()) */ /* For some POSIX functions that are not provided by the MS runtime, * we provide emulation functions in glib, which are prefixed with * g_win32_. Or that was the idea at some time, but there is just one * of those: */ GLIB_AVAILABLE_IN_ALL gint g_win32_ftruncate (gint f, guint size); #endif /* G_OS_WIN32 */ /* The MS setlocale uses locale names of the form "English_United * States.1252" etc. We want the Unixish standard form "en", "zh_TW" * etc. This function gets the current thread locale from Windows and * returns it as a string of the above form for use in forming file * names etc. The returned string should be deallocated with g_free(). */ 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 _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 */ #define G_WIN32_IS_NT_BASED() TRUE #define G_WIN32_HAVE_WIDECHAR_API() TRUE 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__ */ pkg-config-0.29.1/glib/glib/glib.h0000664000175000017500000000642112651243552013502 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the GLib Team and others 1997-2000. See the AUTHORS * file for a list of people on the GLib Team. See the ChangeLog * files for a list of changes. These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/. */ #ifndef __G_LIB_H__ #define __G_LIB_H__ #define __GLIB_H_INSIDE__ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef G_PLATFORM_WIN32 #include #endif #ifndef G_DISABLE_DEPRECATED #include #include #include #include #include #include #endif /* G_DISABLE_DEPRECATED */ #undef __GLIB_H_INSIDE__ #endif /* __G_LIB_H__ */ pkg-config-0.29.1/glib/glib/gen-unicode-tables.pl0000775000175000017500000010353212651243552016422 00000000000000#! /usr/bin/perl -w # Copyright (C) 1998, 1999 Tom Tromey # Copyright (C) 2001 Red Hat Software # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # Contributer(s): # Andrew Taylor # gen-unicode-tables.pl - Generate tables for libunicode from Unicode data. # See http://www.unicode.org/Public/UNIDATA/UnicodeCharacterDatabase.html # I consider the output of this program to be unrestricted. Use it as # you will. # FIXME: # * For decomp table it might make sense to use a shift count other # than 8. We could easily compute the perfect shift count. # we use some perl unicode features require 5.006; use bytes; use vars qw($CODE $NAME $CATEGORY $COMBINING_CLASSES $BIDI_CATEGORY $DECOMPOSITION $DECIMAL_VALUE $DIGIT_VALUE $NUMERIC_VALUE $MIRRORED $OLD_NAME $COMMENT $UPPER $LOWER $TITLE $BREAK_CODE $BREAK_CATEGORY $BREAK_NAME $CASE_CODE $CASE_LOWER $CASE_TITLE $CASE_UPPER $CASE_CONDITION); # Names of fields in Unicode data table. $CODE = 0; $NAME = 1; $CATEGORY = 2; $COMBINING_CLASSES = 3; $BIDI_CATEGORY = 4; $DECOMPOSITION = 5; $DECIMAL_VALUE = 6; $DIGIT_VALUE = 7; $NUMERIC_VALUE = 8; $MIRRORED = 9; $OLD_NAME = 10; $COMMENT = 11; $UPPER = 12; $LOWER = 13; $TITLE = 14; # Names of fields in the line break table $BREAK_CODE = 0; $BREAK_PROPERTY = 1; # Names of fields in the SpecialCasing table $CASE_CODE = 0; $CASE_LOWER = 1; $CASE_TITLE = 2; $CASE_UPPER = 3; $CASE_CONDITION = 4; # Names of fields in the CaseFolding table $FOLDING_CODE = 0; $FOLDING_STATUS = 1; $FOLDING_MAPPING = 2; # Map general category code onto symbolic name. %mappings = ( # Normative. 'Lu' => "G_UNICODE_UPPERCASE_LETTER", 'Ll' => "G_UNICODE_LOWERCASE_LETTER", 'Lt' => "G_UNICODE_TITLECASE_LETTER", 'Mn' => "G_UNICODE_NON_SPACING_MARK", 'Mc' => "G_UNICODE_SPACING_MARK", 'Me' => "G_UNICODE_ENCLOSING_MARK", 'Nd' => "G_UNICODE_DECIMAL_NUMBER", 'Nl' => "G_UNICODE_LETTER_NUMBER", 'No' => "G_UNICODE_OTHER_NUMBER", 'Zs' => "G_UNICODE_SPACE_SEPARATOR", 'Zl' => "G_UNICODE_LINE_SEPARATOR", 'Zp' => "G_UNICODE_PARAGRAPH_SEPARATOR", 'Cc' => "G_UNICODE_CONTROL", 'Cf' => "G_UNICODE_FORMAT", 'Cs' => "G_UNICODE_SURROGATE", 'Co' => "G_UNICODE_PRIVATE_USE", 'Cn' => "G_UNICODE_UNASSIGNED", # Informative. 'Lm' => "G_UNICODE_MODIFIER_LETTER", 'Lo' => "G_UNICODE_OTHER_LETTER", 'Pc' => "G_UNICODE_CONNECT_PUNCTUATION", 'Pd' => "G_UNICODE_DASH_PUNCTUATION", 'Ps' => "G_UNICODE_OPEN_PUNCTUATION", 'Pe' => "G_UNICODE_CLOSE_PUNCTUATION", 'Pi' => "G_UNICODE_INITIAL_PUNCTUATION", 'Pf' => "G_UNICODE_FINAL_PUNCTUATION", 'Po' => "G_UNICODE_OTHER_PUNCTUATION", 'Sm' => "G_UNICODE_MATH_SYMBOL", 'Sc' => "G_UNICODE_CURRENCY_SYMBOL", 'Sk' => "G_UNICODE_MODIFIER_SYMBOL", 'So' => "G_UNICODE_OTHER_SYMBOL" ); %break_mappings = ( 'AI' => "G_UNICODE_BREAK_AMBIGUOUS", 'AL' => "G_UNICODE_BREAK_ALPHABETIC", 'B2' => "G_UNICODE_BREAK_BEFORE_AND_AFTER", 'BA' => "G_UNICODE_BREAK_AFTER", 'BB' => "G_UNICODE_BREAK_BEFORE", 'BK' => "G_UNICODE_BREAK_MANDATORY", 'CB' => "G_UNICODE_BREAK_CONTINGENT", 'CJ' => "G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER", 'CL' => "G_UNICODE_BREAK_CLOSE_PUNCTUATION", 'CM' => "G_UNICODE_BREAK_COMBINING_MARK", 'CP' => "G_UNICODE_BREAK_CLOSE_PARANTHESIS", 'CR' => "G_UNICODE_BREAK_CARRIAGE_RETURN", 'EX' => "G_UNICODE_BREAK_EXCLAMATION", 'GL' => "G_UNICODE_BREAK_NON_BREAKING_GLUE", 'H2' => "G_UNICODE_BREAK_HANGUL_LV_SYLLABLE", 'H3' => "G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE", 'HL' => "G_UNICODE_BREAK_HEBREW_LETTER", 'HY' => "G_UNICODE_BREAK_HYPHEN", 'ID' => "G_UNICODE_BREAK_IDEOGRAPHIC", 'IN' => "G_UNICODE_BREAK_INSEPARABLE", 'IS' => "G_UNICODE_BREAK_INFIX_SEPARATOR", 'JL' => "G_UNICODE_BREAK_HANGUL_L_JAMO", 'JT' => "G_UNICODE_BREAK_HANGUL_T_JAMO", 'JV' => "G_UNICODE_BREAK_HANGUL_V_JAMO", 'LF' => "G_UNICODE_BREAK_LINE_FEED", 'NL' => "G_UNICODE_BREAK_NEXT_LINE", 'NS' => "G_UNICODE_BREAK_NON_STARTER", 'NU' => "G_UNICODE_BREAK_NUMERIC", 'OP' => "G_UNICODE_BREAK_OPEN_PUNCTUATION", '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", 'SY' => "G_UNICODE_BREAK_SYMBOL", 'WJ' => "G_UNICODE_BREAK_WORD_JOINER", 'XX' => "G_UNICODE_BREAK_UNKNOWN", 'ZW' => "G_UNICODE_BREAK_ZERO_WIDTH_SPACE" ); # Title case mappings. %title_to_lower = (); %title_to_upper = (); # Maximum length of special-case strings my @special_cases; my @special_case_offsets; my $special_case_offset = 0; $do_decomp = 0; $do_props = 1; if (@ARGV && $ARGV[0] eq '-decomp') { $do_decomp = 1; $do_props = 0; shift @ARGV; } elsif (@ARGV && $ARGV[0] eq '-both') { $do_decomp = 1; shift @ARGV; } if (@ARGV != 2) { $0 =~ s@.*/@@; die "\nUsage: $0 [-decomp | -both] UNICODE-VERSION DIRECTORY\n\n DIRECTORY should contain the following Unicode data files:\n UnicodeData.txt, LineBreak.txt, SpecialCasing.txt, CaseFolding.txt,\n CompositionExclusions.txt\n\n"; } my ($unicodedatatxt, $linebreaktxt, $specialcasingtxt, $casefoldingtxt, $compositionexclusionstxt); my $d = $ARGV[1]; opendir (my $dir, $d) or die "Cannot open Unicode data dir $d: $!\n"; for my $f (readdir ($dir)) { $unicodedatatxt = "$d/$f" if ($f =~ /^UnicodeData.*\.txt/); $linebreaktxt = "$d/$f" if ($f =~ /^LineBreak.*\.txt/); $specialcasingtxt = "$d/$f" if ($f =~ /^SpecialCasing.*\.txt/); $casefoldingtxt = "$d/$f" if ($f =~ /^CaseFolding.*\.txt/); $compositionexclusionstxt = "$d/$f" if ($f =~ /^CompositionExclusions.*\.txt/); } defined $unicodedatatxt or die "Did not find UnicodeData file"; defined $linebreaktxt or die "Did not find LineBreak file"; defined $specialcasingtxt or die "Did not find SpecialCasing file"; defined $casefoldingtxt or die "Did not find CaseFolding file"; defined $compositionexclusionstxt or die "Did not find CompositionExclusions file"; print "Creating decomp table\n" if ($do_decomp); print "Creating property table\n" if ($do_props); print "Composition exlusions from $compositionexclusionstxt\n"; open (INPUT, "< $compositionexclusionstxt") || exit 1; while () { chop; next if /^#/; next if /^\s*$/; s/\s*#.*//; s/^\s*//; s/\s*$//; $composition_exclusions{hex($_)} = 1; } close INPUT; print "Unicode data from $unicodedatatxt\n"; open (INPUT, "< $unicodedatatxt") || exit 1; # we save memory by skipping the huge empty area before U+E0000 my $pages_before_e0000; $last_code = -1; while () { chop; @fields = split (';', $_, 30); if ($#fields != 14) { printf STDERR ("Entry for $fields[$CODE] has wrong number of fields (%d)\n", $#fields); } $code = hex ($fields[$CODE]); if ($code >= 0xE0000 and $last_code < 0xE0000) { $pages_before_e0000 = ($last_code >> 8) + 1; } if ($code > $last_code + 1) { # Found a gap. if ($fields[$NAME] =~ /Last>/) { # Fill the gap with the last character read, # since this was a range specified in the char database @gfields = @fields; } else { # The gap represents undefined characters. Only the type # matters. @gfields = ('', '', 'Cn', '0', '', '', '', '', '', '', '', '', '', '', ''); } for (++$last_code; $last_code < $code; ++$last_code) { $gfields{$CODE} = sprintf ("%04x", $last_code); &process_one ($last_code, @gfields); } } &process_one ($code, @fields); $last_code = $code; } close INPUT; @gfields = ('', '', 'Cn', '0', '', '', '', '', '', '', '', '', '', '', ''); for (++$last_code; $last_code <= 0x10FFFF; ++$last_code) { $gfields{$CODE} = sprintf ("%04x", $last_code); &process_one ($last_code, @gfields); } --$last_code; # Want last to be 0x10FFFF. print "Creating line break table\n"; print "Line break data from $linebreaktxt\n"; open (INPUT, "< $linebreaktxt") || exit 1; $last_code = -1; while () { my ($start_code, $end_code); chop; next if /^#/; next if /^$/; s/\s*#.*//; @fields = split (';', $_, 30); if ($#fields != 1) { printf STDERR ("Entry for $fields[$CODE] has wrong number of fields (%d)\n", $#fields); next; } if ($fields[$CODE] =~ /([A-F0-9]{4,6})\.\.([A-F0-9]{4,6})/) { $start_code = hex ($1); $end_code = hex ($2); } else { $start_code = $end_code = hex ($fields[$CODE]); } if ($start_code > $last_code + 1) { # The gap represents undefined characters. If assigned, # they are AL, if not assigned, XX for (++$last_code; $last_code < $start_code; ++$last_code) { if ($type[$last_code] eq 'Cn') { $break_props[$last_code] = 'XX'; } else { $break_props[$last_code] = 'AL'; } } } for ($last_code = $start_code; $last_code <= $end_code; $last_code++) { $break_props[$last_code] = $fields[$BREAK_PROPERTY]; } $last_code = $end_code; } close INPUT; for (++$last_code; $last_code <= 0x10FFFF; ++$last_code) { if ($type[$last_code] eq 'Cn') { $break_props[$last_code] = 'XX'; } else { $break_props[$last_code] = 'AL'; } } --$last_code; # Want last to be 0x10FFFF. print STDERR "Last code is not 0x10FFFF" if ($last_code != 0x10FFFF); print "Reading special-casing table for case conversion\n"; open (INPUT, "< $specialcasingtxt") || exit 1; while () { my $code; chop; next if /^#/; next if /^\s*$/; s/\s*#.*//; @fields = split ('\s*;\s*', $_, 30); $raw_code = $fields[$CASE_CODE]; $code = hex ($raw_code); if ($#fields != 4 && $#fields != 5) { printf STDERR ("Entry for $raw_code has wrong number of fields (%d)\n", $#fields); next; } if (!defined $type[$code]) { printf STDERR "Special case for code point: $code, which has no defined type\n"; next; } if (defined $fields[5]) { # Ignore conditional special cases - we'll handle them in code next; } if ($type[$code] eq 'Lu') { (hex $fields[$CASE_UPPER] == $code) || die "$raw_code is Lu and UCD_Upper($raw_code) != $raw_code"; &add_special_case ($code, $value[$code], $fields[$CASE_LOWER], $fields[$CASE_TITLE]); } elsif ($type[$code] eq 'Lt') { (hex $fields[$CASE_TITLE] == $code) || die "$raw_code is Lt and UCD_Title($raw_code) != $raw_code"; &add_special_case ($code, undef, $fields[$CASE_LOWER], $fields[$CASE_UPPER]); } elsif ($type[$code] eq 'Ll') { (hex $fields[$CASE_LOWER] == $code) || die "$raw_code is Ll and UCD_Lower($raw_code) != $raw_code"; &add_special_case ($code, $value[$code], $fields[$CASE_UPPER], $fields[$CASE_TITLE]); } else { printf STDERR "Special case for non-alphabetic code point: $raw_code\n"; next; } } close INPUT; open (INPUT, "< $casefoldingtxt") || exit 1; my $casefoldlen = 0; my @casefold; while () { my $code; chop; next if /^#/; next if /^\s*$/; s/\s*#.*//; @fields = split ('\s*;\s*', $_, 30); $raw_code = $fields[$FOLDING_CODE]; $code = hex ($raw_code); if ($#fields != 3) { printf STDERR ("Entry for $raw_code has wrong number of fields (%d)\n", $#fields); next; } # we don't use Simple or Turkic rules here next if ($fields[$FOLDING_STATUS] =~ /^[ST]$/); @values = map { hex ($_) } split /\s+/, $fields[$FOLDING_MAPPING]; # Check simple case if (@values == 1 && !(defined $value[$code] && $value[$code] >= 0x1000000) && defined $type[$code]) { my $lower; if ($type[$code] eq 'Ll') { $lower = $code; } elsif ($type[$code] eq 'Lt') { $lower = $title_to_lower{$code}; } elsif ($type[$code] eq 'Lu') { $lower = $value[$code]; } else { $lower = $code; } if ($lower == $values[0]) { next; } } my $string = pack ("U*", @values); if (1 + &length_in_bytes ($string) > $casefoldlen) { $casefoldlen = 1 + &length_in_bytes ($string); } push @casefold, [ $code, &escape ($string) ]; } close INPUT; if ($do_props) { &print_tables ($last_code) } if ($do_decomp) { &print_decomp ($last_code); &output_composition_table; } &print_line_break ($last_code); exit 0; # perl "length" returns the length in characters sub length_in_bytes { my ($string) = @_; return length $string; } # Process a single character. sub process_one { my ($code, @fields) = @_; $type[$code] = $fields[$CATEGORY]; if ($type[$code] eq 'Nd') { $value[$code] = int ($fields[$DECIMAL_VALUE]); } elsif ($type[$code] eq 'Ll') { $value[$code] = hex ($fields[$UPPER]); } elsif ($type[$code] eq 'Lu') { $value[$code] = hex ($fields[$LOWER]); } if ($type[$code] eq 'Lt') { $title_to_lower{$code} = hex ($fields[$LOWER]); $title_to_upper{$code} = hex ($fields[$UPPER]); } $cclass[$code] = $fields[$COMBINING_CLASSES]; # Handle decompositions. if ($fields[$DECOMPOSITION] ne '') { if ($fields[$DECOMPOSITION] =~ s/\<.*\>\s*//) { $decompose_compat[$code] = 1; } else { $decompose_compat[$code] = 0; if (!exists $composition_exclusions{$code}) { $compositions{$code} = $fields[$DECOMPOSITION]; } } $decompositions[$code] = $fields[$DECOMPOSITION]; } } sub print_tables { my ($last) = @_; my ($outfile) = "gunichartables.h"; local ($bytes_out) = 0; print "Writing $outfile...\n"; open (OUT, "> $outfile"); print OUT "/* This file is automatically generated. DO NOT EDIT!\n"; print OUT " Instead, edit gen-unicode-tables.pl and re-run. */\n\n"; print OUT "#ifndef CHARTABLES_H\n"; print OUT "#define CHARTABLES_H\n\n"; print OUT "#define G_UNICODE_DATA_VERSION \"$ARGV[0]\"\n\n"; printf OUT "#define G_UNICODE_LAST_CHAR 0x%04x\n\n", $last; printf OUT "#define G_UNICODE_MAX_TABLE_INDEX 10000\n\n"; my $last_part1 = ($pages_before_e0000 * 256) - 1; printf OUT "#define G_UNICODE_LAST_CHAR_PART1 0x%04X\n\n", $last_part1; printf OUT "#define G_UNICODE_LAST_PAGE_PART1 %d\n\n", $pages_before_e0000 - 1; $table_index = 0; printf OUT "static const char type_data[][256] = {\n"; for ($count = 0; $count <= $last; $count += 256) { $row[$count / 256] = &print_row ($count, 1, \&fetch_type); } printf OUT "\n};\n\n"; printf OUT "/* U+0000 through U+%04X */\n", $last_part1; print OUT "static const gint16 type_table_part1[$pages_before_e0000] = {\n"; for ($count = 0; $count <= $last_part1; $count += 256) { print OUT ",\n" if $count > 0; print OUT " ", $row[$count / 256]; $bytes_out += 2; } print OUT "\n};\n\n"; printf OUT "/* U+E0000 through U+%04X */\n", $last; print OUT "static const gint16 type_table_part2[768] = {\n"; for ($count = 0xE0000; $count <= $last; $count += 256) { print OUT ",\n" if $count > 0xE0000; print OUT " ", $row[$count / 256]; $bytes_out += 2; } print OUT "\n};\n\n"; # # Now print attribute table. # $table_index = 0; printf OUT "static const gunichar attr_data[][256] = {\n"; for ($count = 0; $count <= $last; $count += 256) { $row[$count / 256] = &print_row ($count, 4, \&fetch_attr); } printf OUT "\n};\n\n"; printf OUT "/* U+0000 through U+%04X */\n", $last_part1; print OUT "static const gint16 attr_table_part1[$pages_before_e0000] = {\n"; for ($count = 0; $count <= $last_part1; $count += 256) { print OUT ",\n" if $count > 0; print OUT " ", $row[$count / 256]; $bytes_out += 2; } print OUT "\n};\n\n"; printf OUT "/* U+E0000 through U+%04X */\n", $last; print OUT "static const gint16 attr_table_part2[768] = {\n"; for ($count = 0xE0000; $count <= $last; $count += 256) { print OUT ",\n" if $count > 0xE0000; print OUT " ", $row[$count / 256]; $bytes_out += 2; } print OUT "\n};\n\n"; # # print title case table # print OUT "static const gunichar title_table[][3] = {\n"; my ($item); my ($first) = 1; foreach $item (sort keys %title_to_lower) { print OUT ",\n" unless $first; $first = 0; printf OUT " { 0x%04x, 0x%04x, 0x%04x }", $item, $title_to_upper{$item}, $title_to_lower{$item}; $bytes_out += 12; } print OUT "\n};\n\n"; # # And special case conversion table -- conversions that change length # &output_special_case_table (\*OUT); &output_casefold_table (\*OUT); print OUT "#endif /* CHARTABLES_H */\n"; close (OUT); printf STDERR "Generated %d bytes in tables\n", $bytes_out; } # A fetch function for the type table. sub fetch_type { my ($index) = @_; return $mappings{$type[$index]}; } # A fetch function for the attribute table. sub fetch_attr { my ($index) = @_; if (defined $value[$index]) { return sprintf ("0x%04x", $value[$index]); } else { return "0x0000"; } } sub print_row { my ($start, $typsize, $fetcher) = @_; my ($i); my (@values); my ($flag) = 1; my ($off); for ($off = 0; $off < 256; ++$off) { $values[$off] = $fetcher->($off + $start); if ($values[$off] ne $values[0]) { $flag = 0; } } if ($flag) { return $values[0] . " + G_UNICODE_MAX_TABLE_INDEX"; } printf OUT ",\n" if ($table_index != 0); printf OUT " { /* page %d, index %d */\n ", $start / 256, $table_index; my ($column) = 4; for ($i = $start; $i < $start + 256; ++$i) { print OUT ", " if $i > $start; my ($text) = $values[$i - $start]; if (length ($text) + $column + 2 > 78) { print OUT "\n "; $column = 4; } print OUT $text; $column += length ($text) + 2; } print OUT "\n }"; $bytes_out += 256 * $typsize; return sprintf "%d /* page %d */", $table_index++, $start / 256; } sub escape { my ($string) = @_; my $escaped = unpack("H*", $string); $escaped =~ s/(.{2})/\\x$1/g; return $escaped; } # Returns the offset of $decomp in the offset string. Updates the # referenced variables as appropriate. sub handle_decomp ($$$$) { my ($decomp, $decomp_offsets_ref, $decomp_string_ref, $decomp_string_offset_ref) = @_; my $offset = "G_UNICODE_NOT_PRESENT_OFFSET"; if (defined $decomp) { if (defined $decomp_offsets_ref->{$decomp}) { $offset = $decomp_offsets_ref->{$decomp}; } else { $offset = ${$decomp_string_offset_ref}; $decomp_offsets_ref->{$decomp} = $offset; ${$decomp_string_ref} .= "\n \"" . &escape ($decomp) . "\\0\" /* offset ${$decomp_string_offset_ref} */"; ${$decomp_string_offset_ref} += &length_in_bytes ($decomp) + 1; } } return $offset; } # Generate the character decomposition header. sub print_decomp { my ($last) = @_; my ($outfile) = "gunidecomp.h"; local ($bytes_out) = 0; print "Writing $outfile...\n"; open (OUT, "> $outfile") || exit 1; print OUT "/* This file is automatically generated. DO NOT EDIT! */\n\n"; print OUT "#ifndef DECOMP_H\n"; print OUT "#define DECOMP_H\n\n"; printf OUT "#define G_UNICODE_LAST_CHAR 0x%04x\n\n", $last; printf OUT "#define G_UNICODE_MAX_TABLE_INDEX (0x110000 / 256)\n\n"; my $last_part1 = ($pages_before_e0000 * 256) - 1; printf OUT "#define G_UNICODE_LAST_CHAR_PART1 0x%04X\n\n", $last_part1; printf OUT "#define G_UNICODE_LAST_PAGE_PART1 %d\n\n", $pages_before_e0000 - 1; $NOT_PRESENT_OFFSET = 65535; print OUT "#define G_UNICODE_NOT_PRESENT_OFFSET $NOT_PRESENT_OFFSET\n\n"; my ($count, @row); $table_index = 0; printf OUT "static const guchar cclass_data[][256] = {\n"; for ($count = 0; $count <= $last; $count += 256) { $row[$count / 256] = &print_row ($count, 1, \&fetch_cclass); } printf OUT "\n};\n\n"; print OUT "static const gint16 combining_class_table_part1[$pages_before_e0000] = {\n"; for ($count = 0; $count <= $last_part1; $count += 256) { print OUT ",\n" if $count > 0; print OUT " ", $row[$count / 256]; $bytes_out += 2; } print OUT "\n};\n\n"; print OUT "static const gint16 combining_class_table_part2[768] = {\n"; for ($count = 0xE0000; $count <= $last; $count += 256) { print OUT ",\n" if $count > 0xE0000; print OUT " ", $row[$count / 256]; $bytes_out += 2; } print OUT "\n};\n\n"; print OUT "typedef struct\n{\n"; print OUT " gunichar ch;\n"; print OUT " guint16 canon_offset;\n"; print OUT " guint16 compat_offset;\n"; print OUT "} decomposition;\n\n"; print OUT "static const decomposition decomp_table[] =\n{\n"; my ($iter); my ($first) = 1; my ($decomp_string) = ""; my ($decomp_string_offset) = 0; for ($count = 0; $count <= $last; ++$count) { if (defined $decompositions[$count]) { print OUT ",\n" if ! $first; $first = 0; my $canon_decomp; my $compat_decomp; if (!$decompose_compat[$count]) { $canon_decomp = make_decomp ($count, 0); } $compat_decomp = make_decomp ($count, 1); if (defined $canon_decomp && $compat_decomp eq $canon_decomp) { undef $compat_decomp; } my $canon_offset = handle_decomp ($canon_decomp, \%decomp_offsets, \$decomp_string, \$decomp_string_offset); my $compat_offset = handle_decomp ($compat_decomp, \%decomp_offsets, \$decomp_string, \$decomp_string_offset); die if $decomp_string_offset > $NOT_PRESENT_OFFSET; printf OUT qq( { 0x%04x, $canon_offset, $compat_offset }), $count; $bytes_out += 8; } } print OUT "\n};\n\n"; $bytes_out += $decomp_string_offset + 1; printf OUT "static const gchar decomp_expansion_string[] = %s;\n\n", $decomp_string; print OUT "typedef struct\n{\n"; print OUT " gunichar ch;\n"; print OUT " gunichar a;\n"; print OUT " gunichar b;\n"; print OUT "} decomposition_step;\n\n"; # There's lots of room to optimize the following table... print OUT "static const decomposition_step decomp_step_table[] =\n{\n"; $first = 1; my @steps = (); for ($count = 0; $count <= $last; ++$count) { if ((defined $decompositions[$count]) && (!$decompose_compat[$count])) { print OUT ",\n" if ! $first; $first = 0; my @list; @list = (split(' ', $decompositions[$count]), "0"); printf OUT qq( { 0x%05x, 0x%05x, 0x%05x }), $count, hex($list[0]), hex($list[1]); # don't include 1:1 in the compose table push @steps, [ ($count, hex($list[0]), hex($list[1])) ] if hex($list[1]) } } print OUT "\n};\n\n"; print OUT "#endif /* DECOMP_H */\n"; printf STDERR "Generated %d bytes in decomp tables\n", $bytes_out; } sub print_line_break { my ($last) = @_; my ($outfile) = "gunibreak.h"; local ($bytes_out) = 0; print "Writing $outfile...\n"; open (OUT, "> $outfile"); print OUT "/* This file is automatically generated. DO NOT EDIT!\n"; print OUT " Instead, edit gen-unicode-tables.pl and re-run. */\n\n"; print OUT "#ifndef BREAKTABLES_H\n"; print OUT "#define BREAKTABLES_H\n\n"; print OUT "#include \n"; print OUT "#include \n\n"; print OUT "#define G_UNICODE_DATA_VERSION \"$ARGV[0]\"\n\n"; printf OUT "#define G_UNICODE_LAST_CHAR 0x%04X\n\n", $last; printf OUT "#define G_UNICODE_MAX_TABLE_INDEX 10000\n\n"; my $last_part1 = ($pages_before_e0000 * 256) - 1; printf OUT "/* the last code point that should be looked up in break_property_table_part1 */\n"; printf OUT "#define G_UNICODE_LAST_CHAR_PART1 0x%04X\n\n", $last_part1; $table_index = 0; printf OUT "static const gint8 break_property_data[][256] = {\n"; for ($count = 0; $count <= $last; $count += 256) { $row[$count / 256] = &print_row ($count, 1, \&fetch_break_type); } printf OUT "\n};\n\n"; printf OUT "/* U+0000 through U+%04X */\n", $last_part1; print OUT "static const gint16 break_property_table_part1[$pages_before_e0000] = {\n"; for ($count = 0; $count <= $last_part1; $count += 256) { print OUT ",\n" if $count > 0; print OUT " ", $row[$count / 256]; $bytes_out += 2; } print OUT "\n};\n\n"; printf OUT "/* U+E0000 through U+%04X */\n", $last; print OUT "static const gint16 break_property_table_part2[768] = {\n"; for ($count = 0xE0000; $count <= $last; $count += 256) { print OUT ",\n" if $count > 0xE0000; print OUT " ", $row[$count / 256]; $bytes_out += 2; } print OUT "\n};\n\n"; print OUT "#endif /* BREAKTABLES_H */\n"; close (OUT); printf STDERR "Generated %d bytes in break tables\n", $bytes_out; } # A fetch function for the break properties table. sub fetch_break_type { my ($index) = @_; return $break_mappings{$break_props[$index]}; } # Fetcher for combining class. sub fetch_cclass { my ($i) = @_; return $cclass[$i]; } # Expand a character decomposition recursively. sub expand_decomp { my ($code, $compat) = @_; my ($iter, $val); my (@result) = (); foreach $iter (split (' ', $decompositions[$code])) { $val = hex ($iter); if (defined $decompositions[$val] && ($compat || !$decompose_compat[$val])) { push (@result, &expand_decomp ($val, $compat)); } else { push (@result, $val); } } return @result; } sub make_decomp { my ($code, $compat) = @_; my $result = ""; foreach $iter (&expand_decomp ($code, $compat)) { $result .= pack ("U", $iter); # to utf-8 } $result; } # Generate special case data string from two fields sub add_special_case { my ($code, $single, $field1, $field2) = @_; @values = (defined $single ? $single : (), (map { hex ($_) } split /\s+/, $field1), 0, (map { hex ($_) } split /\s+/, $field2)); $result = ""; for $value (@values) { $result .= pack ("U", $value); # to utf-8 } push @special_case_offsets, $special_case_offset; # We encode special cases up in the 0x1000000 space $value[$code] = 0x1000000 + $special_case_offset; $special_case_offset += 1 + &length_in_bytes ($result); push @special_cases, &escape ($result); } sub output_special_case_table { my $out = shift; print $out < $b } keys %$array) { if ($array->{$code} == 1) { delete $array->{$code}; next; } $array->{$code} = $n++; } return $n; } sub output_composition_table { print STDERR "Generating composition table\n"; local ($bytes_out) = 0; my %first; my %second; # First we need to go through and remove decompositions # starting with a non-starter, and single-character # decompositions. At the same time, record # the first and second character of each decomposition for $code (keys %compositions) { @values = map { hex ($_) } split /\s+/, $compositions{$code}; # non-starters if ($cclass[$code]) { delete $compositions{$code}; next; } if ($cclass[$values[0]]) { delete $compositions{$code}; next; } # single-character decompositions if (@values == 1) { delete $compositions{$code}; next; } if (@values != 2) { die "$code has more than two elements in its decomposition!\n"; } if (exists $first{$values[0]}) { $first{$values[0]}++; } else { $first{$values[0]} = 1; } } # Assign integer indices, removing singletons my $n_first = enumerate_ordered (\%first); # Now record the second character of each (non-singleton) decomposition for $code (keys %compositions) { @values = map { hex ($_) } split /\s+/, $compositions{$code}; if (exists $first{$values[0]}) { if (exists $second{$values[1]}) { $second{$values[1]}++; } else { $second{$values[1]} = 1; } } } # Assign integer indices, removing duplicate my $n_second = enumerate_ordered (\%second); # Build reverse table my @first_singletons; my @second_singletons; my %reverse; for $code (keys %compositions) { @values = map { hex ($_) } split /\s+/, $compositions{$code}; my $first = $first{$values[0]}; my $second = $second{$values[1]}; if (defined $first && defined $second) { $reverse{"$first|$second"} = $code; } elsif (!defined $first) { push @first_singletons, [ $values[0], $values[1], $code ]; } else { push @second_singletons, [ $values[1], $values[0], $code ]; } } @first_singletons = sort { $a->[0] <=> $b->[0] } @first_singletons; @second_singletons = sort { $a->[0] <=> $b->[0] } @second_singletons; my %vals; open OUT, ">gunicomp.h" or die "Cannot open gunicomp.h: $!\n"; # Assign values in lookup table for all code points involved my $total = 1; my $last = 0; printf OUT "#define COMPOSE_FIRST_START %d\n", $total; for $code (keys %first) { $vals{$code} = $first{$code} + $total; $last = $code if $code > $last; } $total += $n_first; $i = 0; printf OUT "#define COMPOSE_FIRST_SINGLE_START %d\n", $total; for $record (@first_singletons) { my $code = $record->[0]; $vals{$code} = $i++ + $total; $last = $code if $code > $last; } $total += @first_singletons; printf OUT "#define COMPOSE_SECOND_START %d\n", $total; for $code (keys %second) { $vals{$code} = $second{$code} + $total; $last = $code if $code > $last; } $total += $n_second; $i = 0; printf OUT "#define COMPOSE_SECOND_SINGLE_START %d\n\n", $total; for $record (@second_singletons) { my $code = $record->[0]; $vals{$code} = $i++ + $total; $last = $code if $code > $last; } printf OUT "#define COMPOSE_TABLE_LAST %d\n\n", $last / 256; # Output lookup table my @row; $table_index = 0; printf OUT "static const guint16 compose_data[][256] = {\n"; for (my $count = 0; $count <= $last; $count += 256) { $row[$count / 256] = &print_row ($count, 2, sub { exists $vals{$_[0]} ? $vals{$_[0]} : 0; }); } printf OUT "\n};\n\n"; print OUT "static const gint16 compose_table[COMPOSE_TABLE_LAST + 1] = {\n"; for (my $count = 0; $count <= $last; $count += 256) { print OUT ",\n" if $count > 0; print OUT " ", $row[$count / 256]; $bytes_out += 2; } print OUT "\n};\n\n"; # Output first singletons print OUT "static const gunichar compose_first_single[][2] = {\n"; $i = 0; for $record (@first_singletons) { print OUT ",\n" if $i++ > 0; printf OUT " { %#06x, %#06x }", $record->[1], $record->[2]; } print OUT "\n};\n"; $bytes_out += @first_singletons * 4; # Output second singletons print OUT "static const guint16 compose_second_single[][2] = {\n"; $i = 0; for $record (@second_singletons) { if ($record->[1] > 0xFFFF or $record->[2] > 0xFFFF) { die "time to switch compose_second_single to gunichar"; } print OUT ",\n" if $i++ > 0; printf OUT " { %#06x, %#06x }", $record->[1], $record->[2]; } print OUT "\n};\n"; $bytes_out += @second_singletons * 4; # Output array of composition pairs print OUT < 0xFFFF) { die "time to switch compose_array to gunichar" ; } printf OUT "0x%04x", $reverse{"$i|$j"}; } else { print OUT " 0"; } } print OUT " }"; } print OUT "\n"; print OUT <[0] <=> $b->[0] } @casefold; for $case (@casefold) { $code = $case->[0]; $string = $case->[1]; if ($code > 0xFFFF) { die "time to switch casefold_table to gunichar" ; } print $out sprintf(qq( { 0x%04x, "$string" },\n), $code); } print $out < can be included directly." #endif #include G_BEGIN_DECLS GLIB_VAR const guint glib_major_version; GLIB_VAR const guint glib_minor_version; GLIB_VAR const guint glib_micro_version; GLIB_VAR const guint glib_interface_age; GLIB_VAR const guint glib_binary_age; GLIB_AVAILABLE_IN_ALL const gchar * glib_check_version (guint required_major, guint required_minor, guint required_micro); #define GLIB_CHECK_VERSION(major,minor,micro) \ (GLIB_MAJOR_VERSION > (major) || \ (GLIB_MAJOR_VERSION == (major) && GLIB_MINOR_VERSION > (minor)) || \ (GLIB_MAJOR_VERSION == (major) && GLIB_MINOR_VERSION == (minor) && \ GLIB_MICRO_VERSION >= (micro))) G_END_DECLS #endif /* __G_VERSION_H__ */ pkg-config-0.29.1/glib/glib/gurifuncs.c0000664000175000017500000001546012651243552014570 00000000000000/* GIO - GLib Input, Output and Streaming Library * * Copyright (C) 2006-2007 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. * * Author: Alexander Larsson */ #include "config.h" #include "gurifuncs.h" #include #include #include #include #include #include "config.h" /** * SECTION:gurifuncs * @title: URI Functions * @short_description: manipulating URIs * * Functions for manipulating Universal Resource Identifiers (URIs) as * defined by * RFC 3986. It is highly recommended that you have read and * understand RFC 3986 for understanding this API. */ static int unescape_character (const char *scanner) { int first_digit; int second_digit; first_digit = g_ascii_xdigit_value (*scanner++); if (first_digit < 0) return -1; second_digit = g_ascii_xdigit_value (*scanner++); if (second_digit < 0) return -1; return (first_digit << 4) | second_digit; } /** * g_uri_unescape_segment: * @escaped_string: (allow-none): A string, may be %NULL * @escaped_string_end: (allow-none): Pointer to end of @escaped_string, may be %NULL * @illegal_characters: (allow-none): An optional string of illegal characters not to be allowed, may be %NULL * * Unescapes a segment of an escaped string. * * If any of the characters in @illegal_characters or the character zero appears * as an escaped character in @escaped_string then that is an error and %NULL * will be returned. This is useful it you want to avoid for instance having a * slash being expanded in an escaped path element, which might confuse pathname * handling. * * Returns: an unescaped version of @escaped_string or %NULL on error. * The returned string should be freed when no longer needed. As a * special case if %NULL is given for @escaped_string, this function * will return %NULL. * * Since: 2.16 **/ char * g_uri_unescape_segment (const char *escaped_string, const char *escaped_string_end, const char *illegal_characters) { const char *in; char *out, *result; gint character; if (escaped_string == NULL) return NULL; if (escaped_string_end == NULL) escaped_string_end = escaped_string + strlen (escaped_string); result = g_malloc (escaped_string_end - escaped_string + 1); out = result; for (in = escaped_string; in < escaped_string_end; in++) { character = *in; if (*in == '%') { in++; if (escaped_string_end - in < 2) { /* Invalid escaped char (to short) */ g_free (result); return NULL; } character = unescape_character (in); /* Check for an illegal character. We consider '\0' illegal here. */ if (character <= 0 || (illegal_characters != NULL && strchr (illegal_characters, (char)character) != NULL)) { g_free (result); return NULL; } in++; /* The other char will be eaten in the loop header */ } *out++ = (char)character; } *out = '\0'; return result; } /** * g_uri_unescape_string: * @escaped_string: an escaped string to be unescaped. * @illegal_characters: (allow-none): a string of illegal characters not to be * allowed, or %NULL. * * Unescapes a whole escaped string. * * If any of the characters in @illegal_characters or the character zero appears * as an escaped character in @escaped_string then that is an error and %NULL * will be returned. This is useful it you want to avoid for instance having a * slash being expanded in an escaped path element, which might confuse pathname * handling. * * Returns: an unescaped version of @escaped_string. The returned string * should be freed when no longer needed. * * Since: 2.16 **/ char * g_uri_unescape_string (const char *escaped_string, const char *illegal_characters) { return g_uri_unescape_segment (escaped_string, NULL, illegal_characters); } /** * g_uri_parse_scheme: * @uri: a valid URI. * * Gets the scheme portion of a URI string. RFC 3986 decodes the scheme as: * * URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ] * * Common schemes include "file", "http", "svn+ssh", etc. * * Returns: The "Scheme" component of the URI, or %NULL on error. * The returned string should be freed when no longer needed. * * Since: 2.16 **/ char * g_uri_parse_scheme (const char *uri) { const char *p; char c; g_return_val_if_fail (uri != NULL, NULL); /* From RFC 3986 Decodes: * URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ] */ p = uri; /* Decode scheme: scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." ) */ if (!g_ascii_isalpha (*p)) return NULL; while (1) { c = *p++; if (c == ':') break; if (!(g_ascii_isalnum(c) || c == '+' || c == '-' || c == '.')) return NULL; } return g_strndup (uri, p - uri - 1); } /** * g_uri_escape_string: * @unescaped: the unescaped input string. * @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. * * Normally all characters that are not "unreserved" (i.e. ASCII alphanumerical * characters plus dash, dot, underscore and tilde) are escaped. * But if you specify characters in @reserved_chars_allowed they are not * escaped. This is useful for the "reserved" characters in the URI * specification, since those are allowed unescaped in some portions of * a URI. * * Returns: an escaped version of @unescaped. The returned string should be * freed when no longer needed. * * Since: 2.16 **/ char * g_uri_escape_string (const char *unescaped, const char *reserved_chars_allowed, gboolean allow_utf8) { GString *s; g_return_val_if_fail (unescaped != NULL, NULL); s = g_string_sized_new (strlen (unescaped) + 10); g_string_append_uri_escaped (s, unescaped, reserved_chars_allowed, allow_utf8); return g_string_free (s, FALSE); } pkg-config-0.29.1/glib/glib/gscripttable.h0000664000175000017500000073040012651243552015251 00000000000000/* gscripttable.h: Generated by gen-script-table.pl * * Date: Fri Aug 31 18:19:29 2012 * Source: Scripts-6.2.0.txt * * Do not edit. */ #define G_EASY_SCRIPTS_RANGE 8192 static const guchar g_script_easy_table[8192] = { G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_BOPOMOFO, G_UNICODE_SCRIPT_BOPOMOFO, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_COPTIC, G_UNICODE_SCRIPT_COPTIC, G_UNICODE_SCRIPT_COPTIC, G_UNICODE_SCRIPT_COPTIC, G_UNICODE_SCRIPT_COPTIC, G_UNICODE_SCRIPT_COPTIC, G_UNICODE_SCRIPT_COPTIC, G_UNICODE_SCRIPT_COPTIC, G_UNICODE_SCRIPT_COPTIC, G_UNICODE_SCRIPT_COPTIC, G_UNICODE_SCRIPT_COPTIC, G_UNICODE_SCRIPT_COPTIC, G_UNICODE_SCRIPT_COPTIC, G_UNICODE_SCRIPT_COPTIC, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_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, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_MANDAIC, G_UNICODE_SCRIPT_MANDAIC, G_UNICODE_SCRIPT_MANDAIC, G_UNICODE_SCRIPT_MANDAIC, G_UNICODE_SCRIPT_MANDAIC, G_UNICODE_SCRIPT_MANDAIC, G_UNICODE_SCRIPT_MANDAIC, G_UNICODE_SCRIPT_MANDAIC, G_UNICODE_SCRIPT_MANDAIC, G_UNICODE_SCRIPT_MANDAIC, G_UNICODE_SCRIPT_MANDAIC, G_UNICODE_SCRIPT_MANDAIC, G_UNICODE_SCRIPT_MANDAIC, G_UNICODE_SCRIPT_MANDAIC, G_UNICODE_SCRIPT_MANDAIC, G_UNICODE_SCRIPT_MANDAIC, G_UNICODE_SCRIPT_MANDAIC, G_UNICODE_SCRIPT_MANDAIC, G_UNICODE_SCRIPT_MANDAIC, G_UNICODE_SCRIPT_MANDAIC, G_UNICODE_SCRIPT_MANDAIC, G_UNICODE_SCRIPT_MANDAIC, G_UNICODE_SCRIPT_MANDAIC, G_UNICODE_SCRIPT_MANDAIC, G_UNICODE_SCRIPT_MANDAIC, G_UNICODE_SCRIPT_MANDAIC, G_UNICODE_SCRIPT_MANDAIC, G_UNICODE_SCRIPT_MANDAIC, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_MANDAIC, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_OGHAM, G_UNICODE_SCRIPT_OGHAM, G_UNICODE_SCRIPT_OGHAM, G_UNICODE_SCRIPT_OGHAM, G_UNICODE_SCRIPT_OGHAM, G_UNICODE_SCRIPT_OGHAM, G_UNICODE_SCRIPT_OGHAM, G_UNICODE_SCRIPT_OGHAM, G_UNICODE_SCRIPT_OGHAM, G_UNICODE_SCRIPT_OGHAM, G_UNICODE_SCRIPT_OGHAM, G_UNICODE_SCRIPT_OGHAM, G_UNICODE_SCRIPT_OGHAM, G_UNICODE_SCRIPT_OGHAM, G_UNICODE_SCRIPT_OGHAM, G_UNICODE_SCRIPT_OGHAM, G_UNICODE_SCRIPT_OGHAM, G_UNICODE_SCRIPT_OGHAM, G_UNICODE_SCRIPT_OGHAM, G_UNICODE_SCRIPT_OGHAM, G_UNICODE_SCRIPT_OGHAM, G_UNICODE_SCRIPT_OGHAM, G_UNICODE_SCRIPT_OGHAM, G_UNICODE_SCRIPT_OGHAM, G_UNICODE_SCRIPT_OGHAM, G_UNICODE_SCRIPT_OGHAM, G_UNICODE_SCRIPT_OGHAM, G_UNICODE_SCRIPT_OGHAM, G_UNICODE_SCRIPT_OGHAM, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TAGALOG, G_UNICODE_SCRIPT_TAGALOG, G_UNICODE_SCRIPT_TAGALOG, G_UNICODE_SCRIPT_TAGALOG, G_UNICODE_SCRIPT_TAGALOG, G_UNICODE_SCRIPT_TAGALOG, G_UNICODE_SCRIPT_TAGALOG, G_UNICODE_SCRIPT_TAGALOG, G_UNICODE_SCRIPT_TAGALOG, G_UNICODE_SCRIPT_TAGALOG, G_UNICODE_SCRIPT_TAGALOG, G_UNICODE_SCRIPT_TAGALOG, G_UNICODE_SCRIPT_TAGALOG, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TAGALOG, G_UNICODE_SCRIPT_TAGALOG, G_UNICODE_SCRIPT_TAGALOG, G_UNICODE_SCRIPT_TAGALOG, G_UNICODE_SCRIPT_TAGALOG, G_UNICODE_SCRIPT_TAGALOG, G_UNICODE_SCRIPT_TAGALOG, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_HANUNOO, G_UNICODE_SCRIPT_HANUNOO, G_UNICODE_SCRIPT_HANUNOO, G_UNICODE_SCRIPT_HANUNOO, G_UNICODE_SCRIPT_HANUNOO, G_UNICODE_SCRIPT_HANUNOO, G_UNICODE_SCRIPT_HANUNOO, G_UNICODE_SCRIPT_HANUNOO, G_UNICODE_SCRIPT_HANUNOO, G_UNICODE_SCRIPT_HANUNOO, G_UNICODE_SCRIPT_HANUNOO, G_UNICODE_SCRIPT_HANUNOO, G_UNICODE_SCRIPT_HANUNOO, G_UNICODE_SCRIPT_HANUNOO, G_UNICODE_SCRIPT_HANUNOO, G_UNICODE_SCRIPT_HANUNOO, G_UNICODE_SCRIPT_HANUNOO, G_UNICODE_SCRIPT_HANUNOO, G_UNICODE_SCRIPT_HANUNOO, G_UNICODE_SCRIPT_HANUNOO, G_UNICODE_SCRIPT_HANUNOO, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_BUHID, G_UNICODE_SCRIPT_BUHID, G_UNICODE_SCRIPT_BUHID, G_UNICODE_SCRIPT_BUHID, G_UNICODE_SCRIPT_BUHID, G_UNICODE_SCRIPT_BUHID, G_UNICODE_SCRIPT_BUHID, G_UNICODE_SCRIPT_BUHID, G_UNICODE_SCRIPT_BUHID, G_UNICODE_SCRIPT_BUHID, G_UNICODE_SCRIPT_BUHID, G_UNICODE_SCRIPT_BUHID, G_UNICODE_SCRIPT_BUHID, G_UNICODE_SCRIPT_BUHID, G_UNICODE_SCRIPT_BUHID, G_UNICODE_SCRIPT_BUHID, G_UNICODE_SCRIPT_BUHID, G_UNICODE_SCRIPT_BUHID, G_UNICODE_SCRIPT_BUHID, G_UNICODE_SCRIPT_BUHID, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TAGBANWA, G_UNICODE_SCRIPT_TAGBANWA, G_UNICODE_SCRIPT_TAGBANWA, G_UNICODE_SCRIPT_TAGBANWA, G_UNICODE_SCRIPT_TAGBANWA, G_UNICODE_SCRIPT_TAGBANWA, G_UNICODE_SCRIPT_TAGBANWA, G_UNICODE_SCRIPT_TAGBANWA, G_UNICODE_SCRIPT_TAGBANWA, G_UNICODE_SCRIPT_TAGBANWA, G_UNICODE_SCRIPT_TAGBANWA, G_UNICODE_SCRIPT_TAGBANWA, G_UNICODE_SCRIPT_TAGBANWA, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TAGBANWA, G_UNICODE_SCRIPT_TAGBANWA, G_UNICODE_SCRIPT_TAGBANWA, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TAGBANWA, G_UNICODE_SCRIPT_TAGBANWA, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_TAI_LE, G_UNICODE_SCRIPT_TAI_LE, G_UNICODE_SCRIPT_TAI_LE, G_UNICODE_SCRIPT_TAI_LE, G_UNICODE_SCRIPT_TAI_LE, G_UNICODE_SCRIPT_TAI_LE, G_UNICODE_SCRIPT_TAI_LE, G_UNICODE_SCRIPT_TAI_LE, G_UNICODE_SCRIPT_TAI_LE, G_UNICODE_SCRIPT_TAI_LE, G_UNICODE_SCRIPT_TAI_LE, G_UNICODE_SCRIPT_TAI_LE, G_UNICODE_SCRIPT_TAI_LE, G_UNICODE_SCRIPT_TAI_LE, G_UNICODE_SCRIPT_TAI_LE, G_UNICODE_SCRIPT_TAI_LE, G_UNICODE_SCRIPT_TAI_LE, G_UNICODE_SCRIPT_TAI_LE, G_UNICODE_SCRIPT_TAI_LE, G_UNICODE_SCRIPT_TAI_LE, G_UNICODE_SCRIPT_TAI_LE, G_UNICODE_SCRIPT_TAI_LE, G_UNICODE_SCRIPT_TAI_LE, G_UNICODE_SCRIPT_TAI_LE, G_UNICODE_SCRIPT_TAI_LE, G_UNICODE_SCRIPT_TAI_LE, G_UNICODE_SCRIPT_TAI_LE, G_UNICODE_SCRIPT_TAI_LE, G_UNICODE_SCRIPT_TAI_LE, G_UNICODE_SCRIPT_TAI_LE, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TAI_LE, G_UNICODE_SCRIPT_TAI_LE, G_UNICODE_SCRIPT_TAI_LE, G_UNICODE_SCRIPT_TAI_LE, G_UNICODE_SCRIPT_TAI_LE, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_BUGINESE, G_UNICODE_SCRIPT_BUGINESE, G_UNICODE_SCRIPT_BUGINESE, G_UNICODE_SCRIPT_BUGINESE, G_UNICODE_SCRIPT_BUGINESE, G_UNICODE_SCRIPT_BUGINESE, G_UNICODE_SCRIPT_BUGINESE, G_UNICODE_SCRIPT_BUGINESE, G_UNICODE_SCRIPT_BUGINESE, G_UNICODE_SCRIPT_BUGINESE, G_UNICODE_SCRIPT_BUGINESE, G_UNICODE_SCRIPT_BUGINESE, G_UNICODE_SCRIPT_BUGINESE, G_UNICODE_SCRIPT_BUGINESE, G_UNICODE_SCRIPT_BUGINESE, G_UNICODE_SCRIPT_BUGINESE, G_UNICODE_SCRIPT_BUGINESE, G_UNICODE_SCRIPT_BUGINESE, G_UNICODE_SCRIPT_BUGINESE, G_UNICODE_SCRIPT_BUGINESE, G_UNICODE_SCRIPT_BUGINESE, G_UNICODE_SCRIPT_BUGINESE, G_UNICODE_SCRIPT_BUGINESE, G_UNICODE_SCRIPT_BUGINESE, G_UNICODE_SCRIPT_BUGINESE, G_UNICODE_SCRIPT_BUGINESE, G_UNICODE_SCRIPT_BUGINESE, G_UNICODE_SCRIPT_BUGINESE, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_BUGINESE, G_UNICODE_SCRIPT_BUGINESE, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_OL_CHIKI, G_UNICODE_SCRIPT_OL_CHIKI, G_UNICODE_SCRIPT_OL_CHIKI, G_UNICODE_SCRIPT_OL_CHIKI, G_UNICODE_SCRIPT_OL_CHIKI, G_UNICODE_SCRIPT_OL_CHIKI, G_UNICODE_SCRIPT_OL_CHIKI, G_UNICODE_SCRIPT_OL_CHIKI, G_UNICODE_SCRIPT_OL_CHIKI, G_UNICODE_SCRIPT_OL_CHIKI, G_UNICODE_SCRIPT_OL_CHIKI, G_UNICODE_SCRIPT_OL_CHIKI, G_UNICODE_SCRIPT_OL_CHIKI, G_UNICODE_SCRIPT_OL_CHIKI, G_UNICODE_SCRIPT_OL_CHIKI, G_UNICODE_SCRIPT_OL_CHIKI, G_UNICODE_SCRIPT_OL_CHIKI, G_UNICODE_SCRIPT_OL_CHIKI, G_UNICODE_SCRIPT_OL_CHIKI, G_UNICODE_SCRIPT_OL_CHIKI, G_UNICODE_SCRIPT_OL_CHIKI, G_UNICODE_SCRIPT_OL_CHIKI, G_UNICODE_SCRIPT_OL_CHIKI, G_UNICODE_SCRIPT_OL_CHIKI, G_UNICODE_SCRIPT_OL_CHIKI, G_UNICODE_SCRIPT_OL_CHIKI, G_UNICODE_SCRIPT_OL_CHIKI, G_UNICODE_SCRIPT_OL_CHIKI, G_UNICODE_SCRIPT_OL_CHIKI, G_UNICODE_SCRIPT_OL_CHIKI, G_UNICODE_SCRIPT_OL_CHIKI, G_UNICODE_SCRIPT_OL_CHIKI, G_UNICODE_SCRIPT_OL_CHIKI, G_UNICODE_SCRIPT_OL_CHIKI, G_UNICODE_SCRIPT_OL_CHIKI, G_UNICODE_SCRIPT_OL_CHIKI, G_UNICODE_SCRIPT_OL_CHIKI, G_UNICODE_SCRIPT_OL_CHIKI, G_UNICODE_SCRIPT_OL_CHIKI, G_UNICODE_SCRIPT_OL_CHIKI, G_UNICODE_SCRIPT_OL_CHIKI, G_UNICODE_SCRIPT_OL_CHIKI, G_UNICODE_SCRIPT_OL_CHIKI, G_UNICODE_SCRIPT_OL_CHIKI, G_UNICODE_SCRIPT_OL_CHIKI, G_UNICODE_SCRIPT_OL_CHIKI, G_UNICODE_SCRIPT_OL_CHIKI, G_UNICODE_SCRIPT_OL_CHIKI, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_UNKNOWN, }; static const struct { gunichar start; guint16 chars; guint16 script; } g_script_table[] = { { 0x2000, 12, G_UNICODE_SCRIPT_COMMON }, { 0x200c, 2, G_UNICODE_SCRIPT_INHERITED }, { 0x200e, 87, G_UNICODE_SCRIPT_COMMON }, { 0x206a, 7, G_UNICODE_SCRIPT_COMMON }, { 0x2071, 1, G_UNICODE_SCRIPT_LATIN }, { 0x2074, 11, G_UNICODE_SCRIPT_COMMON }, { 0x207f, 1, G_UNICODE_SCRIPT_LATIN }, { 0x2080, 15, G_UNICODE_SCRIPT_COMMON }, { 0x2090, 13, G_UNICODE_SCRIPT_LATIN }, { 0x20a0, 27, G_UNICODE_SCRIPT_COMMON }, { 0x20d0, 33, G_UNICODE_SCRIPT_INHERITED }, { 0x2100, 38, G_UNICODE_SCRIPT_COMMON }, { 0x2126, 1, G_UNICODE_SCRIPT_GREEK }, { 0x2127, 3, G_UNICODE_SCRIPT_COMMON }, { 0x212a, 2, G_UNICODE_SCRIPT_LATIN }, { 0x212c, 6, G_UNICODE_SCRIPT_COMMON }, { 0x2132, 1, G_UNICODE_SCRIPT_LATIN }, { 0x2133, 27, G_UNICODE_SCRIPT_COMMON }, { 0x214e, 1, G_UNICODE_SCRIPT_LATIN }, { 0x214f, 17, G_UNICODE_SCRIPT_COMMON }, { 0x2160, 41, G_UNICODE_SCRIPT_LATIN }, { 0x2189, 1, G_UNICODE_SCRIPT_COMMON }, { 0x2190, 612, G_UNICODE_SCRIPT_COMMON }, { 0x2400, 39, G_UNICODE_SCRIPT_COMMON }, { 0x2440, 11, G_UNICODE_SCRIPT_COMMON }, { 0x2460, 672, G_UNICODE_SCRIPT_COMMON }, { 0x2701, 255, G_UNICODE_SCRIPT_COMMON }, { 0x2800, 256, G_UNICODE_SCRIPT_BRAILLE }, { 0x2900, 589, G_UNICODE_SCRIPT_COMMON }, { 0x2b50, 10, G_UNICODE_SCRIPT_COMMON }, { 0x2c00, 47, G_UNICODE_SCRIPT_GLAGOLITIC }, { 0x2c30, 47, G_UNICODE_SCRIPT_GLAGOLITIC }, { 0x2c60, 32, G_UNICODE_SCRIPT_LATIN }, { 0x2c80, 116, G_UNICODE_SCRIPT_COPTIC }, { 0x2cf9, 7, G_UNICODE_SCRIPT_COPTIC }, { 0x2d00, 38, G_UNICODE_SCRIPT_GEORGIAN }, { 0x2d27, 1, G_UNICODE_SCRIPT_GEORGIAN }, { 0x2d2d, 1, G_UNICODE_SCRIPT_GEORGIAN }, { 0x2d30, 56, G_UNICODE_SCRIPT_TIFINAGH }, { 0x2d6f, 2, G_UNICODE_SCRIPT_TIFINAGH }, { 0x2d7f, 1, G_UNICODE_SCRIPT_TIFINAGH }, { 0x2d80, 23, G_UNICODE_SCRIPT_ETHIOPIC }, { 0x2da0, 7, G_UNICODE_SCRIPT_ETHIOPIC }, { 0x2da8, 7, G_UNICODE_SCRIPT_ETHIOPIC }, { 0x2db0, 7, G_UNICODE_SCRIPT_ETHIOPIC }, { 0x2db8, 7, G_UNICODE_SCRIPT_ETHIOPIC }, { 0x2dc0, 7, G_UNICODE_SCRIPT_ETHIOPIC }, { 0x2dc8, 7, G_UNICODE_SCRIPT_ETHIOPIC }, { 0x2dd0, 7, G_UNICODE_SCRIPT_ETHIOPIC }, { 0x2dd8, 7, G_UNICODE_SCRIPT_ETHIOPIC }, { 0x2de0, 32, G_UNICODE_SCRIPT_CYRILLIC }, { 0x2e00, 60, G_UNICODE_SCRIPT_COMMON }, { 0x2e80, 26, G_UNICODE_SCRIPT_HAN }, { 0x2e9b, 89, G_UNICODE_SCRIPT_HAN }, { 0x2f00, 214, G_UNICODE_SCRIPT_HAN }, { 0x2ff0, 12, G_UNICODE_SCRIPT_COMMON }, { 0x3000, 5, G_UNICODE_SCRIPT_COMMON }, { 0x3005, 1, G_UNICODE_SCRIPT_HAN }, { 0x3006, 1, G_UNICODE_SCRIPT_COMMON }, { 0x3007, 1, G_UNICODE_SCRIPT_HAN }, { 0x3008, 25, G_UNICODE_SCRIPT_COMMON }, { 0x3021, 9, G_UNICODE_SCRIPT_HAN }, { 0x302a, 4, G_UNICODE_SCRIPT_INHERITED }, { 0x302e, 2, G_UNICODE_SCRIPT_HANGUL }, { 0x3030, 8, G_UNICODE_SCRIPT_COMMON }, { 0x3038, 4, G_UNICODE_SCRIPT_HAN }, { 0x303c, 4, G_UNICODE_SCRIPT_COMMON }, { 0x3041, 86, G_UNICODE_SCRIPT_HIRAGANA }, { 0x3099, 2, G_UNICODE_SCRIPT_INHERITED }, { 0x309b, 2, G_UNICODE_SCRIPT_COMMON }, { 0x309d, 3, G_UNICODE_SCRIPT_HIRAGANA }, { 0x30a0, 1, G_UNICODE_SCRIPT_COMMON }, { 0x30a1, 90, G_UNICODE_SCRIPT_KATAKANA }, { 0x30fb, 2, G_UNICODE_SCRIPT_COMMON }, { 0x30fd, 3, G_UNICODE_SCRIPT_KATAKANA }, { 0x3105, 41, G_UNICODE_SCRIPT_BOPOMOFO }, { 0x3131, 94, G_UNICODE_SCRIPT_HANGUL }, { 0x3190, 16, G_UNICODE_SCRIPT_COMMON }, { 0x31a0, 27, G_UNICODE_SCRIPT_BOPOMOFO }, { 0x31c0, 36, G_UNICODE_SCRIPT_COMMON }, { 0x31f0, 16, G_UNICODE_SCRIPT_KATAKANA }, { 0x3200, 31, G_UNICODE_SCRIPT_HANGUL }, { 0x3220, 64, G_UNICODE_SCRIPT_COMMON }, { 0x3260, 31, G_UNICODE_SCRIPT_HANGUL }, { 0x327f, 81, G_UNICODE_SCRIPT_COMMON }, { 0x32d0, 47, G_UNICODE_SCRIPT_KATAKANA }, { 0x3300, 88, G_UNICODE_SCRIPT_KATAKANA }, { 0x3358, 168, G_UNICODE_SCRIPT_COMMON }, { 0x3400, 6582, G_UNICODE_SCRIPT_HAN }, { 0x4dc0, 64, G_UNICODE_SCRIPT_COMMON }, { 0x4e00, 20941, G_UNICODE_SCRIPT_HAN }, { 0xa000, 1165, G_UNICODE_SCRIPT_YI }, { 0xa490, 55, G_UNICODE_SCRIPT_YI }, { 0xa4d0, 48, G_UNICODE_SCRIPT_LISU }, { 0xa500, 300, G_UNICODE_SCRIPT_VAI }, { 0xa640, 88, G_UNICODE_SCRIPT_CYRILLIC }, { 0xa69f, 1, G_UNICODE_SCRIPT_CYRILLIC }, { 0xa6a0, 88, G_UNICODE_SCRIPT_BAMUM }, { 0xa700, 34, G_UNICODE_SCRIPT_COMMON }, { 0xa722, 102, G_UNICODE_SCRIPT_LATIN }, { 0xa788, 3, G_UNICODE_SCRIPT_COMMON }, { 0xa78b, 4, G_UNICODE_SCRIPT_LATIN }, { 0xa790, 4, G_UNICODE_SCRIPT_LATIN }, { 0xa7a0, 11, G_UNICODE_SCRIPT_LATIN }, { 0xa7f8, 8, G_UNICODE_SCRIPT_LATIN }, { 0xa800, 44, G_UNICODE_SCRIPT_SYLOTI_NAGRI }, { 0xa830, 10, G_UNICODE_SCRIPT_COMMON }, { 0xa840, 56, G_UNICODE_SCRIPT_PHAGS_PA }, { 0xa880, 69, G_UNICODE_SCRIPT_SAURASHTRA }, { 0xa8ce, 12, G_UNICODE_SCRIPT_SAURASHTRA }, { 0xa8e0, 28, G_UNICODE_SCRIPT_DEVANAGARI }, { 0xa900, 48, G_UNICODE_SCRIPT_KAYAH_LI }, { 0xa930, 36, G_UNICODE_SCRIPT_REJANG }, { 0xa95f, 1, G_UNICODE_SCRIPT_REJANG }, { 0xa960, 29, G_UNICODE_SCRIPT_HANGUL }, { 0xa980, 78, G_UNICODE_SCRIPT_JAVANESE }, { 0xa9cf, 11, G_UNICODE_SCRIPT_JAVANESE }, { 0xa9de, 2, G_UNICODE_SCRIPT_JAVANESE }, { 0xaa00, 55, G_UNICODE_SCRIPT_CHAM }, { 0xaa40, 14, G_UNICODE_SCRIPT_CHAM }, { 0xaa50, 10, G_UNICODE_SCRIPT_CHAM }, { 0xaa5c, 4, G_UNICODE_SCRIPT_CHAM }, { 0xaa60, 28, G_UNICODE_SCRIPT_MYANMAR }, { 0xaa80, 67, G_UNICODE_SCRIPT_TAI_VIET }, { 0xaadb, 5, G_UNICODE_SCRIPT_TAI_VIET }, { 0xaae0, 23, G_UNICODE_SCRIPT_MEETEI_MAYEK }, { 0xab01, 6, G_UNICODE_SCRIPT_ETHIOPIC }, { 0xab09, 6, G_UNICODE_SCRIPT_ETHIOPIC }, { 0xab11, 6, G_UNICODE_SCRIPT_ETHIOPIC }, { 0xab20, 7, G_UNICODE_SCRIPT_ETHIOPIC }, { 0xab28, 7, G_UNICODE_SCRIPT_ETHIOPIC }, { 0xabc0, 46, G_UNICODE_SCRIPT_MEETEI_MAYEK }, { 0xabf0, 10, G_UNICODE_SCRIPT_MEETEI_MAYEK }, { 0xac00, 11172, G_UNICODE_SCRIPT_HANGUL }, { 0xd7b0, 23, G_UNICODE_SCRIPT_HANGUL }, { 0xd7cb, 49, G_UNICODE_SCRIPT_HANGUL }, { 0xf900, 366, G_UNICODE_SCRIPT_HAN }, { 0xfa70, 106, G_UNICODE_SCRIPT_HAN }, { 0xfb00, 7, G_UNICODE_SCRIPT_LATIN }, { 0xfb13, 5, G_UNICODE_SCRIPT_ARMENIAN }, { 0xfb1d, 26, G_UNICODE_SCRIPT_HEBREW }, { 0xfb38, 5, G_UNICODE_SCRIPT_HEBREW }, { 0xfb3e, 1, G_UNICODE_SCRIPT_HEBREW }, { 0xfb40, 2, G_UNICODE_SCRIPT_HEBREW }, { 0xfb43, 2, G_UNICODE_SCRIPT_HEBREW }, { 0xfb46, 10, G_UNICODE_SCRIPT_HEBREW }, { 0xfb50, 114, G_UNICODE_SCRIPT_ARABIC }, { 0xfbd3, 363, G_UNICODE_SCRIPT_ARABIC }, { 0xfd3e, 2, G_UNICODE_SCRIPT_COMMON }, { 0xfd50, 64, G_UNICODE_SCRIPT_ARABIC }, { 0xfd92, 54, G_UNICODE_SCRIPT_ARABIC }, { 0xfdf0, 13, G_UNICODE_SCRIPT_ARABIC }, { 0xfdfd, 1, G_UNICODE_SCRIPT_COMMON }, { 0xfe00, 16, G_UNICODE_SCRIPT_INHERITED }, { 0xfe10, 10, G_UNICODE_SCRIPT_COMMON }, { 0xfe20, 7, G_UNICODE_SCRIPT_INHERITED }, { 0xfe30, 35, G_UNICODE_SCRIPT_COMMON }, { 0xfe54, 19, G_UNICODE_SCRIPT_COMMON }, { 0xfe68, 4, G_UNICODE_SCRIPT_COMMON }, { 0xfe70, 5, G_UNICODE_SCRIPT_ARABIC }, { 0xfe76, 135, G_UNICODE_SCRIPT_ARABIC }, { 0xfeff, 1, G_UNICODE_SCRIPT_COMMON }, { 0xff01, 32, G_UNICODE_SCRIPT_COMMON }, { 0xff21, 26, G_UNICODE_SCRIPT_LATIN }, { 0xff3b, 6, G_UNICODE_SCRIPT_COMMON }, { 0xff41, 26, G_UNICODE_SCRIPT_LATIN }, { 0xff5b, 11, G_UNICODE_SCRIPT_COMMON }, { 0xff66, 10, G_UNICODE_SCRIPT_KATAKANA }, { 0xff70, 1, G_UNICODE_SCRIPT_COMMON }, { 0xff71, 45, G_UNICODE_SCRIPT_KATAKANA }, { 0xff9e, 2, G_UNICODE_SCRIPT_COMMON }, { 0xffa0, 31, G_UNICODE_SCRIPT_HANGUL }, { 0xffc2, 6, G_UNICODE_SCRIPT_HANGUL }, { 0xffca, 6, G_UNICODE_SCRIPT_HANGUL }, { 0xffd2, 6, G_UNICODE_SCRIPT_HANGUL }, { 0xffda, 3, G_UNICODE_SCRIPT_HANGUL }, { 0xffe0, 7, G_UNICODE_SCRIPT_COMMON }, { 0xffe8, 7, G_UNICODE_SCRIPT_COMMON }, { 0xfff9, 5, G_UNICODE_SCRIPT_COMMON }, { 0x10000, 12, G_UNICODE_SCRIPT_LINEAR_B }, { 0x1000d, 26, G_UNICODE_SCRIPT_LINEAR_B }, { 0x10028, 19, G_UNICODE_SCRIPT_LINEAR_B }, { 0x1003c, 2, G_UNICODE_SCRIPT_LINEAR_B }, { 0x1003f, 15, G_UNICODE_SCRIPT_LINEAR_B }, { 0x10050, 14, G_UNICODE_SCRIPT_LINEAR_B }, { 0x10080, 123, G_UNICODE_SCRIPT_LINEAR_B }, { 0x10100, 3, G_UNICODE_SCRIPT_COMMON }, { 0x10107, 45, G_UNICODE_SCRIPT_COMMON }, { 0x10137, 9, G_UNICODE_SCRIPT_COMMON }, { 0x10140, 75, G_UNICODE_SCRIPT_GREEK }, { 0x10190, 12, G_UNICODE_SCRIPT_COMMON }, { 0x101d0, 45, G_UNICODE_SCRIPT_COMMON }, { 0x101fd, 1, G_UNICODE_SCRIPT_INHERITED }, { 0x10280, 29, G_UNICODE_SCRIPT_LYCIAN }, { 0x102a0, 49, G_UNICODE_SCRIPT_CARIAN }, { 0x10300, 31, G_UNICODE_SCRIPT_OLD_ITALIC }, { 0x10320, 4, G_UNICODE_SCRIPT_OLD_ITALIC }, { 0x10330, 27, G_UNICODE_SCRIPT_GOTHIC }, { 0x10380, 30, G_UNICODE_SCRIPT_UGARITIC }, { 0x1039f, 1, G_UNICODE_SCRIPT_UGARITIC }, { 0x103a0, 36, G_UNICODE_SCRIPT_OLD_PERSIAN }, { 0x103c8, 14, G_UNICODE_SCRIPT_OLD_PERSIAN }, { 0x10400, 80, G_UNICODE_SCRIPT_DESERET }, { 0x10450, 48, G_UNICODE_SCRIPT_SHAVIAN }, { 0x10480, 30, G_UNICODE_SCRIPT_OSMANYA }, { 0x104a0, 10, G_UNICODE_SCRIPT_OSMANYA }, { 0x10800, 6, G_UNICODE_SCRIPT_CYPRIOT }, { 0x10808, 1, G_UNICODE_SCRIPT_CYPRIOT }, { 0x1080a, 44, G_UNICODE_SCRIPT_CYPRIOT }, { 0x10837, 2, G_UNICODE_SCRIPT_CYPRIOT }, { 0x1083c, 1, G_UNICODE_SCRIPT_CYPRIOT }, { 0x1083f, 1, G_UNICODE_SCRIPT_CYPRIOT }, { 0x10840, 22, G_UNICODE_SCRIPT_IMPERIAL_ARAMAIC }, { 0x10857, 9, G_UNICODE_SCRIPT_IMPERIAL_ARAMAIC }, { 0x10900, 28, G_UNICODE_SCRIPT_PHOENICIAN }, { 0x1091f, 1, G_UNICODE_SCRIPT_PHOENICIAN }, { 0x10920, 26, G_UNICODE_SCRIPT_LYDIAN }, { 0x1093f, 1, G_UNICODE_SCRIPT_LYDIAN }, { 0x10980, 32, G_UNICODE_SCRIPT_MEROITIC_HIEROGLYPHS }, { 0x109a0, 24, G_UNICODE_SCRIPT_MEROITIC_CURSIVE }, { 0x109be, 2, G_UNICODE_SCRIPT_MEROITIC_CURSIVE }, { 0x10a00, 4, G_UNICODE_SCRIPT_KHAROSHTHI }, { 0x10a05, 2, G_UNICODE_SCRIPT_KHAROSHTHI }, { 0x10a0c, 8, G_UNICODE_SCRIPT_KHAROSHTHI }, { 0x10a15, 3, G_UNICODE_SCRIPT_KHAROSHTHI }, { 0x10a19, 27, G_UNICODE_SCRIPT_KHAROSHTHI }, { 0x10a38, 3, G_UNICODE_SCRIPT_KHAROSHTHI }, { 0x10a3f, 9, G_UNICODE_SCRIPT_KHAROSHTHI }, { 0x10a50, 9, G_UNICODE_SCRIPT_KHAROSHTHI }, { 0x10a60, 32, G_UNICODE_SCRIPT_OLD_SOUTH_ARABIAN }, { 0x10b00, 54, G_UNICODE_SCRIPT_AVESTAN }, { 0x10b39, 7, G_UNICODE_SCRIPT_AVESTAN }, { 0x10b40, 22, G_UNICODE_SCRIPT_INSCRIPTIONAL_PARTHIAN }, { 0x10b58, 8, G_UNICODE_SCRIPT_INSCRIPTIONAL_PARTHIAN }, { 0x10b60, 19, G_UNICODE_SCRIPT_INSCRIPTIONAL_PAHLAVI }, { 0x10b78, 8, G_UNICODE_SCRIPT_INSCRIPTIONAL_PAHLAVI }, { 0x10c00, 73, G_UNICODE_SCRIPT_OLD_TURKIC }, { 0x10e60, 31, G_UNICODE_SCRIPT_ARABIC }, { 0x11000, 78, G_UNICODE_SCRIPT_BRAHMI }, { 0x11052, 30, G_UNICODE_SCRIPT_BRAHMI }, { 0x11080, 66, G_UNICODE_SCRIPT_KAITHI }, { 0x110d0, 25, G_UNICODE_SCRIPT_SORA_SOMPENG }, { 0x110f0, 10, G_UNICODE_SCRIPT_SORA_SOMPENG }, { 0x11100, 53, G_UNICODE_SCRIPT_CHAKMA }, { 0x11136, 14, G_UNICODE_SCRIPT_CHAKMA }, { 0x11180, 73, G_UNICODE_SCRIPT_SHARADA }, { 0x111d0, 10, G_UNICODE_SCRIPT_SHARADA }, { 0x11680, 56, G_UNICODE_SCRIPT_TAKRI }, { 0x116c0, 10, G_UNICODE_SCRIPT_TAKRI }, { 0x12000, 879, G_UNICODE_SCRIPT_CUNEIFORM }, { 0x12400, 99, G_UNICODE_SCRIPT_CUNEIFORM }, { 0x12470, 4, G_UNICODE_SCRIPT_CUNEIFORM }, { 0x13000, 1071, G_UNICODE_SCRIPT_EGYPTIAN_HIEROGLYPHS }, { 0x16800, 569, G_UNICODE_SCRIPT_BAMUM }, { 0x16f00, 69, G_UNICODE_SCRIPT_MIAO }, { 0x16f50, 47, G_UNICODE_SCRIPT_MIAO }, { 0x16f8f, 17, G_UNICODE_SCRIPT_MIAO }, { 0x1b000, 1, G_UNICODE_SCRIPT_KATAKANA }, { 0x1b001, 1, G_UNICODE_SCRIPT_HIRAGANA }, { 0x1d000, 246, G_UNICODE_SCRIPT_COMMON }, { 0x1d100, 39, G_UNICODE_SCRIPT_COMMON }, { 0x1d129, 62, G_UNICODE_SCRIPT_COMMON }, { 0x1d167, 3, G_UNICODE_SCRIPT_INHERITED }, { 0x1d16a, 17, G_UNICODE_SCRIPT_COMMON }, { 0x1d17b, 8, G_UNICODE_SCRIPT_INHERITED }, { 0x1d183, 2, G_UNICODE_SCRIPT_COMMON }, { 0x1d185, 7, G_UNICODE_SCRIPT_INHERITED }, { 0x1d18c, 30, G_UNICODE_SCRIPT_COMMON }, { 0x1d1aa, 4, G_UNICODE_SCRIPT_INHERITED }, { 0x1d1ae, 48, G_UNICODE_SCRIPT_COMMON }, { 0x1d200, 70, G_UNICODE_SCRIPT_GREEK }, { 0x1d300, 87, G_UNICODE_SCRIPT_COMMON }, { 0x1d360, 18, G_UNICODE_SCRIPT_COMMON }, { 0x1d400, 85, G_UNICODE_SCRIPT_COMMON }, { 0x1d456, 71, G_UNICODE_SCRIPT_COMMON }, { 0x1d49e, 2, G_UNICODE_SCRIPT_COMMON }, { 0x1d4a2, 1, G_UNICODE_SCRIPT_COMMON }, { 0x1d4a5, 2, G_UNICODE_SCRIPT_COMMON }, { 0x1d4a9, 4, G_UNICODE_SCRIPT_COMMON }, { 0x1d4ae, 12, G_UNICODE_SCRIPT_COMMON }, { 0x1d4bb, 1, G_UNICODE_SCRIPT_COMMON }, { 0x1d4bd, 7, G_UNICODE_SCRIPT_COMMON }, { 0x1d4c5, 65, G_UNICODE_SCRIPT_COMMON }, { 0x1d507, 4, G_UNICODE_SCRIPT_COMMON }, { 0x1d50d, 8, G_UNICODE_SCRIPT_COMMON }, { 0x1d516, 7, G_UNICODE_SCRIPT_COMMON }, { 0x1d51e, 28, G_UNICODE_SCRIPT_COMMON }, { 0x1d53b, 4, G_UNICODE_SCRIPT_COMMON }, { 0x1d540, 5, G_UNICODE_SCRIPT_COMMON }, { 0x1d546, 1, G_UNICODE_SCRIPT_COMMON }, { 0x1d54a, 7, G_UNICODE_SCRIPT_COMMON }, { 0x1d552, 340, G_UNICODE_SCRIPT_COMMON }, { 0x1d6a8, 292, G_UNICODE_SCRIPT_COMMON }, { 0x1d7ce, 50, G_UNICODE_SCRIPT_COMMON }, { 0x1ee00, 4, G_UNICODE_SCRIPT_ARABIC }, { 0x1ee05, 27, G_UNICODE_SCRIPT_ARABIC }, { 0x1ee21, 2, G_UNICODE_SCRIPT_ARABIC }, { 0x1ee24, 1, G_UNICODE_SCRIPT_ARABIC }, { 0x1ee27, 1, G_UNICODE_SCRIPT_ARABIC }, { 0x1ee29, 10, G_UNICODE_SCRIPT_ARABIC }, { 0x1ee34, 4, G_UNICODE_SCRIPT_ARABIC }, { 0x1ee39, 1, G_UNICODE_SCRIPT_ARABIC }, { 0x1ee3b, 1, G_UNICODE_SCRIPT_ARABIC }, { 0x1ee42, 1, G_UNICODE_SCRIPT_ARABIC }, { 0x1ee47, 1, G_UNICODE_SCRIPT_ARABIC }, { 0x1ee49, 1, G_UNICODE_SCRIPT_ARABIC }, { 0x1ee4b, 1, G_UNICODE_SCRIPT_ARABIC }, { 0x1ee4d, 3, G_UNICODE_SCRIPT_ARABIC }, { 0x1ee51, 2, G_UNICODE_SCRIPT_ARABIC }, { 0x1ee54, 1, G_UNICODE_SCRIPT_ARABIC }, { 0x1ee57, 1, G_UNICODE_SCRIPT_ARABIC }, { 0x1ee59, 1, G_UNICODE_SCRIPT_ARABIC }, { 0x1ee5b, 1, G_UNICODE_SCRIPT_ARABIC }, { 0x1ee5d, 1, G_UNICODE_SCRIPT_ARABIC }, { 0x1ee5f, 1, G_UNICODE_SCRIPT_ARABIC }, { 0x1ee61, 2, G_UNICODE_SCRIPT_ARABIC }, { 0x1ee64, 1, G_UNICODE_SCRIPT_ARABIC }, { 0x1ee67, 4, G_UNICODE_SCRIPT_ARABIC }, { 0x1ee6c, 7, G_UNICODE_SCRIPT_ARABIC }, { 0x1ee74, 4, G_UNICODE_SCRIPT_ARABIC }, { 0x1ee79, 4, G_UNICODE_SCRIPT_ARABIC }, { 0x1ee7e, 1, G_UNICODE_SCRIPT_ARABIC }, { 0x1ee80, 10, G_UNICODE_SCRIPT_ARABIC }, { 0x1ee8b, 17, G_UNICODE_SCRIPT_ARABIC }, { 0x1eea1, 3, G_UNICODE_SCRIPT_ARABIC }, { 0x1eea5, 5, G_UNICODE_SCRIPT_ARABIC }, { 0x1eeab, 17, G_UNICODE_SCRIPT_ARABIC }, { 0x1eef0, 2, G_UNICODE_SCRIPT_ARABIC }, { 0x1f000, 44, G_UNICODE_SCRIPT_COMMON }, { 0x1f030, 100, G_UNICODE_SCRIPT_COMMON }, { 0x1f0a0, 15, G_UNICODE_SCRIPT_COMMON }, { 0x1f0b1, 14, G_UNICODE_SCRIPT_COMMON }, { 0x1f0c1, 15, G_UNICODE_SCRIPT_COMMON }, { 0x1f0d1, 15, G_UNICODE_SCRIPT_COMMON }, { 0x1f100, 11, G_UNICODE_SCRIPT_COMMON }, { 0x1f110, 31, G_UNICODE_SCRIPT_COMMON }, { 0x1f130, 60, G_UNICODE_SCRIPT_COMMON }, { 0x1f170, 43, G_UNICODE_SCRIPT_COMMON }, { 0x1f1e6, 26, G_UNICODE_SCRIPT_COMMON }, { 0x1f200, 1, G_UNICODE_SCRIPT_HIRAGANA }, { 0x1f201, 2, G_UNICODE_SCRIPT_COMMON }, { 0x1f210, 43, G_UNICODE_SCRIPT_COMMON }, { 0x1f240, 9, G_UNICODE_SCRIPT_COMMON }, { 0x1f250, 2, G_UNICODE_SCRIPT_COMMON }, { 0x1f300, 33, G_UNICODE_SCRIPT_COMMON }, { 0x1f330, 6, G_UNICODE_SCRIPT_COMMON }, { 0x1f337, 70, G_UNICODE_SCRIPT_COMMON }, { 0x1f380, 20, G_UNICODE_SCRIPT_COMMON }, { 0x1f3a0, 37, G_UNICODE_SCRIPT_COMMON }, { 0x1f3c6, 5, G_UNICODE_SCRIPT_COMMON }, { 0x1f3e0, 17, G_UNICODE_SCRIPT_COMMON }, { 0x1f400, 63, G_UNICODE_SCRIPT_COMMON }, { 0x1f440, 1, G_UNICODE_SCRIPT_COMMON }, { 0x1f442, 182, G_UNICODE_SCRIPT_COMMON }, { 0x1f4f9, 4, G_UNICODE_SCRIPT_COMMON }, { 0x1f500, 62, G_UNICODE_SCRIPT_COMMON }, { 0x1f540, 4, G_UNICODE_SCRIPT_COMMON }, { 0x1f550, 24, G_UNICODE_SCRIPT_COMMON }, { 0x1f5fb, 70, G_UNICODE_SCRIPT_COMMON }, { 0x1f645, 11, G_UNICODE_SCRIPT_COMMON }, { 0x1f680, 70, G_UNICODE_SCRIPT_COMMON }, { 0x1f700, 116, G_UNICODE_SCRIPT_COMMON }, { 0x20000, 42711, G_UNICODE_SCRIPT_HAN }, { 0x2a700, 4149, G_UNICODE_SCRIPT_HAN }, { 0x2b740, 222, G_UNICODE_SCRIPT_HAN }, { 0x2f800, 542, G_UNICODE_SCRIPT_HAN }, { 0xe0001, 1, G_UNICODE_SCRIPT_COMMON }, { 0xe0020, 96, G_UNICODE_SCRIPT_COMMON }, { 0xe0100, 240, G_UNICODE_SCRIPT_INHERITED }, }; pkg-config-0.29.1/glib/glib/gunidecomp.c0000664000175000017500000004624512275467762014737 00000000000000/* decomp.c - Character decomposition. * * Copyright (C) 1999, 2000 Tom Tromey * Copyright 2000 Red Hat, Inc. * * The Gnome Library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * The Gnome Library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with the Gnome Library; see the file COPYING.LIB. If not, * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:unicode * @Title: Unicode Manipulation * @Short_description: functions operating on Unicode characters and * UTF-8 strings * @See_also: g_locale_to_utf8(), g_locale_from_utf8() * * This section describes a number of functions for dealing with * Unicode characters and strings. There are analogues of the * traditional ctype.h character classification * and case conversion functions, UTF-8 analogues of some string utility * functions, functions to perform normalization, case conversion and * collation on UTF-8 strings and finally functions to convert between * the UTF-8, UTF-16 and UCS-4 encodings of Unicode. * * The implementations of the Unicode functions in GLib are based * on the Unicode Character Data tables, which are available from * www.unicode.org. * GLib 2.8 supports Unicode 4.0, GLib 2.10 supports Unicode 4.1, * GLib 2.12 supports Unicode 5.0, GLib 2.16.3 supports Unicode 5.1, * GLib 2.30 supports Unicode 6.0. */ #include "config.h" #include #include "gunicode.h" #include "gunidecomp.h" #include "gmem.h" #include "gunicomp.h" #include "gunicodeprivate.h" #define CC_PART1(Page, Char) \ ((combining_class_table_part1[Page] >= G_UNICODE_MAX_TABLE_INDEX) \ ? (combining_class_table_part1[Page] - G_UNICODE_MAX_TABLE_INDEX) \ : (cclass_data[combining_class_table_part1[Page]][Char])) #define CC_PART2(Page, Char) \ ((combining_class_table_part2[Page] >= G_UNICODE_MAX_TABLE_INDEX) \ ? (combining_class_table_part2[Page] - G_UNICODE_MAX_TABLE_INDEX) \ : (cclass_data[combining_class_table_part2[Page]][Char])) #define COMBINING_CLASS(Char) \ (((Char) <= G_UNICODE_LAST_CHAR_PART1) \ ? CC_PART1 ((Char) >> 8, (Char) & 0xff) \ : (((Char) >= 0xe0000 && (Char) <= G_UNICODE_LAST_CHAR) \ ? CC_PART2 (((Char) - 0xe0000) >> 8, (Char) & 0xff) \ : 0)) /** * g_unichar_combining_class: * @uc: a Unicode character * * Determines the canonical combining class of a Unicode character. * * Return value: the combining class of the character * * Since: 2.14 **/ gint g_unichar_combining_class (gunichar uc) { return COMBINING_CLASS (uc); } /* constants for hangul syllable [de]composition */ #define SBase 0xAC00 #define LBase 0x1100 #define VBase 0x1161 #define TBase 0x11A7 #define LCount 19 #define VCount 21 #define TCount 28 #define NCount (VCount * TCount) #define SCount (LCount * NCount) /** * g_unicode_canonical_ordering: * @string: a UCS-4 encoded string. * @len: the maximum length of @string to use. * * Computes the canonical ordering of a string in-place. * This rearranges decomposed characters in the string * according to their combining classes. See the Unicode * manual for more information. **/ void g_unicode_canonical_ordering (gunichar *string, gsize len) { gsize i; int swap = 1; while (swap) { int last; swap = 0; last = COMBINING_CLASS (string[0]); for (i = 0; i < len - 1; ++i) { int next = COMBINING_CLASS (string[i + 1]); if (next != 0 && last > next) { gsize j; /* Percolate item leftward through string. */ for (j = i + 1; j > 0; --j) { gunichar t; if (COMBINING_CLASS (string[j - 1]) <= next) break; t = string[j]; string[j] = string[j - 1]; string[j - 1] = t; swap = 1; } /* We're re-entering the loop looking at the old character again. */ next = last; } last = next; } } } /* http://www.unicode.org/unicode/reports/tr15/#Hangul * r should be null or have sufficient space. Calling with r == NULL will * only calculate the result_len; however, a buffer with space for three * characters will always be big enough. */ static void decompose_hangul (gunichar s, gunichar *r, gsize *result_len) { gint SIndex = s - SBase; gint TIndex = SIndex % TCount; if (r) { r[0] = LBase + SIndex / NCount; r[1] = VBase + (SIndex % NCount) / TCount; } if (TIndex) { if (r) r[2] = TBase + TIndex; *result_len = 3; } else *result_len = 2; } /* returns a pointer to a null-terminated UTF-8 string */ static const gchar * find_decomposition (gunichar ch, gboolean compat) { int start = 0; int end = G_N_ELEMENTS (decomp_table); if (ch >= decomp_table[start].ch && ch <= decomp_table[end - 1].ch) { while (TRUE) { int half = (start + end) / 2; if (ch == decomp_table[half].ch) { int offset; if (compat) { offset = decomp_table[half].compat_offset; if (offset == G_UNICODE_NOT_PRESENT_OFFSET) offset = decomp_table[half].canon_offset; } else { offset = decomp_table[half].canon_offset; if (offset == G_UNICODE_NOT_PRESENT_OFFSET) return NULL; } return &(decomp_expansion_string[offset]); } else if (half == start) break; else if (ch > decomp_table[half].ch) start = half; else end = half; } } return NULL; } /** * g_unicode_canonical_decomposition: * @ch: a Unicode character. * @result_len: location to store the length of the return value. * * Computes the canonical decomposition of a Unicode character. * * Return value: a newly allocated string of Unicode characters. * @result_len is set to the resulting length of the string. * * Deprecated: 2.30: Use the more flexible g_unichar_fully_decompose() * instead. **/ gunichar * g_unicode_canonical_decomposition (gunichar ch, gsize *result_len) { const gchar *decomp; const gchar *p; gunichar *r; /* Hangul syllable */ if (ch >= SBase && ch < SBase + SCount) { decompose_hangul (ch, NULL, result_len); r = g_malloc (*result_len * sizeof (gunichar)); decompose_hangul (ch, r, result_len); } else if ((decomp = find_decomposition (ch, FALSE)) != NULL) { /* Found it. */ int i; *result_len = g_utf8_strlen (decomp, -1); r = g_malloc (*result_len * sizeof (gunichar)); for (p = decomp, i = 0; *p != '\0'; p = g_utf8_next_char (p), i++) r[i] = g_utf8_get_char (p); } else { /* Not in our table. */ r = g_malloc (sizeof (gunichar)); *r = ch; *result_len = 1; } return r; } /* L,V => LV and LV,T => LVT */ static gboolean combine_hangul (gunichar a, gunichar b, gunichar *result) { gint LIndex = a - LBase; gint SIndex = a - SBase; gint VIndex = b - VBase; gint TIndex = b - TBase; if (0 <= LIndex && LIndex < LCount && 0 <= VIndex && VIndex < VCount) { *result = SBase + (LIndex * VCount + VIndex) * TCount; return TRUE; } else if (0 <= SIndex && SIndex < SCount && (SIndex % TCount) == 0 && 0 < TIndex && TIndex < TCount) { *result = a + TIndex; return TRUE; } return FALSE; } #define CI(Page, Char) \ ((compose_table[Page] >= G_UNICODE_MAX_TABLE_INDEX) \ ? (compose_table[Page] - G_UNICODE_MAX_TABLE_INDEX) \ : (compose_data[compose_table[Page]][Char])) #define COMPOSE_INDEX(Char) \ (((Char >> 8) > (COMPOSE_TABLE_LAST)) ? 0 : CI((Char) >> 8, (Char) & 0xff)) static gboolean combine (gunichar a, gunichar b, gunichar *result) { gushort index_a, index_b; if (combine_hangul (a, b, result)) return TRUE; index_a = COMPOSE_INDEX(a); if (index_a >= COMPOSE_FIRST_SINGLE_START && index_a < COMPOSE_SECOND_START) { if (b == compose_first_single[index_a - COMPOSE_FIRST_SINGLE_START][0]) { *result = compose_first_single[index_a - COMPOSE_FIRST_SINGLE_START][1]; return TRUE; } else return FALSE; } index_b = COMPOSE_INDEX(b); if (index_b >= COMPOSE_SECOND_SINGLE_START) { if (a == compose_second_single[index_b - COMPOSE_SECOND_SINGLE_START][0]) { *result = compose_second_single[index_b - COMPOSE_SECOND_SINGLE_START][1]; return TRUE; } else return FALSE; } if (index_a >= COMPOSE_FIRST_START && index_a < COMPOSE_FIRST_SINGLE_START && index_b >= COMPOSE_SECOND_START && index_b < COMPOSE_SECOND_SINGLE_START) { gunichar res = compose_array[index_a - COMPOSE_FIRST_START][index_b - COMPOSE_SECOND_START]; if (res) { *result = res; return TRUE; } } return FALSE; } gunichar * _g_utf8_normalize_wc (const gchar *str, gssize max_len, GNormalizeMode mode) { gsize n_wc; gunichar *wc_buffer; const char *p; gsize last_start; gboolean do_compat = (mode == G_NORMALIZE_NFKC || mode == G_NORMALIZE_NFKD); gboolean do_compose = (mode == G_NORMALIZE_NFC || mode == G_NORMALIZE_NFKC); n_wc = 0; p = str; while ((max_len < 0 || p < str + max_len) && *p) { const gchar *decomp; gunichar wc = g_utf8_get_char (p); if (wc >= SBase && wc < SBase + SCount) { gsize result_len; decompose_hangul (wc, NULL, &result_len); n_wc += result_len; } else { decomp = find_decomposition (wc, do_compat); if (decomp) n_wc += g_utf8_strlen (decomp, -1); else n_wc++; } p = g_utf8_next_char (p); } wc_buffer = g_new (gunichar, n_wc + 1); last_start = 0; n_wc = 0; p = str; while ((max_len < 0 || p < str + max_len) && *p) { gunichar wc = g_utf8_get_char (p); const gchar *decomp; int cc; gsize old_n_wc = n_wc; if (wc >= SBase && wc < SBase + SCount) { gsize result_len; decompose_hangul (wc, wc_buffer + n_wc, &result_len); n_wc += result_len; } else { decomp = find_decomposition (wc, do_compat); if (decomp) { const char *pd; for (pd = decomp; *pd != '\0'; pd = g_utf8_next_char (pd)) wc_buffer[n_wc++] = g_utf8_get_char (pd); } else wc_buffer[n_wc++] = wc; } if (n_wc > 0) { cc = COMBINING_CLASS (wc_buffer[old_n_wc]); if (cc == 0) { g_unicode_canonical_ordering (wc_buffer + last_start, n_wc - last_start); last_start = old_n_wc; } } p = g_utf8_next_char (p); } if (n_wc > 0) { g_unicode_canonical_ordering (wc_buffer + last_start, n_wc - last_start); last_start = n_wc; } wc_buffer[n_wc] = 0; /* All decomposed and reordered */ if (do_compose && n_wc > 0) { gsize i, j; int last_cc = 0; last_start = 0; for (i = 0; i < n_wc; i++) { int cc = COMBINING_CLASS (wc_buffer[i]); if (i > 0 && (last_cc == 0 || last_cc < cc) && combine (wc_buffer[last_start], wc_buffer[i], &wc_buffer[last_start])) { for (j = i + 1; j < n_wc; j++) wc_buffer[j-1] = wc_buffer[j]; n_wc--; i--; if (i == last_start) last_cc = 0; else last_cc = COMBINING_CLASS (wc_buffer[i-1]); continue; } if (cc == 0) last_start = i; last_cc = cc; } } wc_buffer[n_wc] = 0; return wc_buffer; } /** * g_utf8_normalize: * @str: a UTF-8 encoded string. * @len: length of @str, in bytes, or -1 if @str is nul-terminated. * @mode: the type of normalization to perform. * * Converts a string into canonical form, standardizing * such issues as whether a character with an accent * is represented as a base character and combining * accent or as a single precomposed character. The * string has to be valid UTF-8, otherwise %NULL is * returned. You should generally call g_utf8_normalize() * before comparing two Unicode strings. * * The normalization mode %G_NORMALIZE_DEFAULT only * standardizes differences that do not affect the * text content, such as the above-mentioned accent * representation. %G_NORMALIZE_ALL also standardizes * the "compatibility" characters in Unicode, such * as SUPERSCRIPT THREE to the standard forms * (in this case DIGIT THREE). Formatting information * may be lost but for most text operations such * characters should be considered the same. * * %G_NORMALIZE_DEFAULT_COMPOSE and %G_NORMALIZE_ALL_COMPOSE * are like %G_NORMALIZE_DEFAULT and %G_NORMALIZE_ALL, * but returned a result with composed forms rather * than a maximally decomposed form. This is often * useful if you intend to convert the string to * a legacy encoding or pass it to a system with * less capable Unicode handling. * * Return value: a newly allocated string, that is the * normalized form of @str, or %NULL if @str is not * valid UTF-8. **/ gchar * g_utf8_normalize (const gchar *str, gssize len, GNormalizeMode mode) { gunichar *result_wc = _g_utf8_normalize_wc (str, len, mode); gchar *result; result = g_ucs4_to_utf8 (result_wc, -1, NULL, NULL, NULL); g_free (result_wc); return result; } static gboolean decompose_hangul_step (gunichar ch, gunichar *a, gunichar *b) { gint SIndex, TIndex; if (ch < SBase || ch >= SBase + SCount) return FALSE; /* not a hangul syllable */ SIndex = ch - SBase; TIndex = SIndex % TCount; if (TIndex) { /* split LVT -> LV,T */ *a = ch - TIndex; *b = TBase + TIndex; } else { /* split LV -> L,V */ *a = LBase + SIndex / NCount; *b = VBase + (SIndex % NCount) / TCount; } return TRUE; } /** * g_unichar_decompose: * @ch: a Unicode character * @a: return location for the first component of @ch * @b: return location for the second component of @ch * * Performs a single decomposition step of the * Unicode canonical decomposition algorithm. * * This function does not include compatibility * decompositions. It does, however, include algorithmic * Hangul Jamo decomposition, as well as 'singleton' * decompositions which replace a character by a single * other character. In the case of singletons *@b will * be set to zero. * * If @ch is not decomposable, *@a is set to @ch and *@b * is set to zero. * * Note that the way Unicode decomposition pairs are * defined, it is guaranteed that @b would not decompose * further, but @a may itself decompose. To get the full * canonical decomposition for @ch, one would need to * recursively call this function on @a. Or use * g_unichar_fully_decompose(). * * See UAX#15 * for details. * * Returns: %TRUE if the character could be decomposed * * Since: 2.30 */ gboolean g_unichar_decompose (gunichar ch, gunichar *a, gunichar *b) { gint start = 0; gint end = G_N_ELEMENTS (decomp_step_table); if (decompose_hangul_step (ch, a, b)) return TRUE; /* TODO use bsearch() */ if (ch >= decomp_step_table[start].ch && ch <= decomp_step_table[end - 1].ch) { while (TRUE) { gint half = (start + end) / 2; const decomposition_step *p = &(decomp_step_table[half]); if (ch == p->ch) { *a = p->a; *b = p->b; return TRUE; } else if (half == start) break; else if (ch > p->ch) start = half; else end = half; } } *a = ch; *b = 0; return FALSE; } /** * g_unichar_compose: * @a: a Unicode character * @b: a Unicode character * @ch: return location for the composed character * * Performs a single composition step of the * Unicode canonical composition algorithm. * * This function includes algorithmic Hangul Jamo composition, * but it is not exactly the inverse of g_unichar_decompose(). * No composition can have either of @a or @b equal to zero. * To be precise, this function composes if and only if * there exists a Primary Composite P which is canonically * equivalent to the sequence <@a,@b>. See the Unicode * Standard for the definition of Primary Composite. * * If @a and @b do not compose a new character, @ch is set to zero. * * See UAX#15 * for details. * * Returns: %TRUE if the characters could be composed * * Since: 2.30 */ gboolean g_unichar_compose (gunichar a, gunichar b, gunichar *ch) { if (combine (a, b, ch)) return TRUE; *ch = 0; return FALSE; } /** * g_unichar_fully_decompose: * @ch: a Unicode character. * @compat: whether perform canonical or compatibility decomposition * @result: (allow-none): location to store decomposed result, or %NULL * @result_len: length of @result * * Computes the canonical or compatibility decomposition of a * Unicode character. For compatibility decomposition, * pass %TRUE for @compat; for canonical decomposition * pass %FALSE for @compat. * * The decomposed sequence is placed in @result. Only up to * @result_len characters are written into @result. The length * of the full decomposition (irrespective of @result_len) is * returned by the function. For canonical decomposition, * currently all decompositions are of length at most 4, but * this may change in the future (very unlikely though). * At any rate, Unicode does guarantee that a buffer of length * 18 is always enough for both compatibility and canonical * decompositions, so that is the size recommended. This is provided * as %G_UNICHAR_MAX_DECOMPOSITION_LENGTH. * * See UAX#15 * for details. * * Return value: the length of the full decomposition. * * Since: 2.30 **/ gsize g_unichar_fully_decompose (gunichar ch, gboolean compat, gunichar *result, gsize result_len) { const gchar *decomp; const gchar *p; /* Hangul syllable */ if (ch >= SBase && ch < SBase + SCount) { gsize len, i; gunichar buffer[3]; decompose_hangul (ch, result ? buffer : NULL, &len); if (result) for (i = 0; i < len && i < result_len; i++) result[i] = buffer[i]; return len; } else if ((decomp = find_decomposition (ch, compat)) != NULL) { /* Found it. */ gsize len, i; len = g_utf8_strlen (decomp, -1); for (p = decomp, i = 0; i < len && i < result_len; p = g_utf8_next_char (p), i++) result[i] = g_utf8_get_char (p); return len; } /* Does not decompose */ if (result && result_len >= 1) *result = ch; return 1; } pkg-config-0.29.1/glib/glib/glib-init.h0000664000175000017500000000232112651243552014436 00000000000000/* * Copyright © 2011 Canonical Limited * * This library is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2 of the * licence, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, * USA. * * Author: Ryan Lortie */ #ifndef __GLIB_INIT_H__ #define __GLIB_INIT_H__ #include "gmessages.h" extern GLogLevelFlags g_log_always_fatal; extern GLogLevelFlags g_log_msg_prefix; GLIB_VAR gboolean g_mem_gc_friendly; #ifdef G_OS_WIN32 #include 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__ */ pkg-config-0.29.1/glib/glib/gtimer.c0000664000175000017500000003271412651243552014053 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the GLib Team and others 1997-2000. See the AUTHORS * file for a list of people on the GLib Team. See the ChangeLog * files for a list of changes. These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/. */ /* * MT safe */ #include "config.h" #include "glibconfig.h" #include #ifdef HAVE_UNISTD_H #include #endif /* HAVE_UNISTD_H */ #ifdef HAVE_SYS_TIME_H #include #endif #include #ifndef G_OS_WIN32 #include #endif /* G_OS_WIN32 */ #ifdef G_OS_WIN32 #include #endif /* G_OS_WIN32 */ #include "gtimer.h" #include "gmem.h" #include "gstrfuncs.h" #include "gtestutils.h" #include "gmain.h" /** * SECTION:timers * @title: Timers * @short_description: keep track of elapsed time * * #GTimer records a start time, and counts microseconds elapsed since * that time. This is done somewhat differently on different platforms, * and can be tricky to get exactly right, so #GTimer provides a * portable/convenient interface. **/ /** * GTimer: * * Opaque datatype that records a start time. **/ struct _GTimer { guint64 start; guint64 end; guint active : 1; }; /** * g_timer_new: * * 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) { GTimer *timer; timer = g_new (GTimer, 1); timer->active = TRUE; timer->start = g_get_monotonic_time (); return timer; } /** * g_timer_destroy: * @timer: a #GTimer to destroy. * * Destroys a timer, freeing associated resources. **/ void g_timer_destroy (GTimer *timer) { g_return_if_fail (timer != NULL); g_free (timer); } /** * g_timer_start: * @timer: a #GTimer. * * Marks a start time, so that future calls to g_timer_elapsed() will * report the time since g_timer_start() was called. g_timer_new() * automatically marks the start time, so no need to call * g_timer_start() immediately after creating the timer. **/ void g_timer_start (GTimer *timer) { g_return_if_fail (timer != NULL); timer->active = TRUE; timer->start = g_get_monotonic_time (); } /** * g_timer_stop: * @timer: a #GTimer. * * Marks an end time, so calls to g_timer_elapsed() will return the * difference between this end time and the start time. **/ void g_timer_stop (GTimer *timer) { g_return_if_fail (timer != NULL); timer->active = FALSE; timer->end = g_get_monotonic_time (); } /** * g_timer_reset: * @timer: a #GTimer. * * This function is useless; it's fine to call g_timer_start() on an * already-started timer to reset the start time, so g_timer_reset() * serves no purpose. **/ void g_timer_reset (GTimer *timer) { g_return_if_fail (timer != NULL); timer->start = g_get_monotonic_time (); } /** * g_timer_continue: * @timer: a #GTimer. * * Resumes a timer that has previously been stopped with * g_timer_stop(). g_timer_stop() must be called before using this * function. * * Since: 2.4 **/ void g_timer_continue (GTimer *timer) { guint64 elapsed; g_return_if_fail (timer != NULL); g_return_if_fail (timer->active == FALSE); /* Get elapsed time and reset timer start time * to the current time minus the previously * elapsed interval. */ elapsed = timer->end - timer->start; timer->start = g_get_monotonic_time (); timer->start -= elapsed; timer->active = TRUE; } /** * g_timer_elapsed: * @timer: a #GTimer. * @microseconds: return location for the fractional part of seconds * elapsed, in microseconds (that is, the total number * of microseconds elapsed, modulo 1000000), or %NULL * * If @timer has been started but not stopped, obtains the time since * the timer was started. If @timer has been stopped, obtains the * elapsed time between the time it was started and the time it was * stopped. The return value is the number of seconds elapsed, * including any fractional part. The @microseconds out parameter is * essentially useless. * * Returns: seconds elapsed as a floating point value, including any * fractional part. **/ gdouble g_timer_elapsed (GTimer *timer, gulong *microseconds) { gdouble total; gint64 elapsed; g_return_val_if_fail (timer != NULL, 0); if (timer->active) timer->end = g_get_monotonic_time (); elapsed = timer->end - timer->start; total = elapsed / 1e6; if (microseconds) *microseconds = elapsed % 1000000; return total; } /** * g_usleep: * @microseconds: number of microseconds to pause * * Pauses the current thread for the given number of microseconds. * * There are 1 million microseconds per second (represented by the * #G_USEC_PER_SEC macro). g_usleep() may have limited precision, * depending on hardware and operating system; don't rely on the exact * length of the sleep. */ void g_usleep (gulong microseconds) { #ifdef G_OS_WIN32 Sleep (microseconds / 1000); #else struct timespec request, remaining; request.tv_sec = microseconds / G_USEC_PER_SEC; request.tv_nsec = 1000 * (microseconds % G_USEC_PER_SEC); while (nanosleep (&request, &remaining) == -1 && errno == EINTR) request = remaining; #endif } /** * g_time_val_add: * @time_: a #GTimeVal * @microseconds: number of microseconds to add to @time * * Adds the given number of microseconds to @time_. @microseconds can * also be negative to decrease the value of @time_. **/ void g_time_val_add (GTimeVal *time_, glong microseconds) { g_return_if_fail (time_->tv_usec >= 0 && time_->tv_usec < G_USEC_PER_SEC); if (microseconds >= 0) { time_->tv_usec += microseconds % G_USEC_PER_SEC; time_->tv_sec += microseconds / G_USEC_PER_SEC; if (time_->tv_usec >= G_USEC_PER_SEC) { time_->tv_usec -= G_USEC_PER_SEC; time_->tv_sec++; } } else { microseconds *= -1; time_->tv_usec -= microseconds % G_USEC_PER_SEC; time_->tv_sec -= microseconds / G_USEC_PER_SEC; if (time_->tv_usec < 0) { time_->tv_usec += G_USEC_PER_SEC; time_->tv_sec--; } } } /* converts a broken down date representation, relative to UTC, to * a timestamp; it uses timegm() if it's available. */ static time_t mktime_utc (struct tm *tm) { time_t retval; #ifndef HAVE_TIMEGM static const gint days_before[] = { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 }; #endif #ifndef HAVE_TIMEGM if (tm->tm_mon < 0 || tm->tm_mon > 11) return (time_t) -1; retval = (tm->tm_year - 70) * 365; retval += (tm->tm_year - 68) / 4; retval += days_before[tm->tm_mon] + tm->tm_mday - 1; if (tm->tm_year % 4 == 0 && tm->tm_mon < 2) retval -= 1; retval = ((((retval * 24) + tm->tm_hour) * 60) + tm->tm_min) * 60 + tm->tm_sec; #else retval = timegm (tm); #endif /* !HAVE_TIMEGM */ return retval; } /** * g_time_val_from_iso8601: * @iso_date: an ISO 8601 encoded date string * @time_: (out): a #GTimeVal * * Converts a string containing an ISO 8601 encoded date and time * to a #GTimeVal and puts it into @time_. * * @iso_date must include year, month, day, hours, minutes, and * seconds. It can optionally include fractions of a second and a time * zone indicator. (In the absence of any time zone indication, the * timestamp is assumed to be in local time.) * * Return value: %TRUE if the conversion was successful. * * Since: 2.12 */ gboolean g_time_val_from_iso8601 (const gchar *iso_date, GTimeVal *time_) { struct tm tm = {0}; long val; g_return_val_if_fail (iso_date != NULL, FALSE); g_return_val_if_fail (time_ != NULL, FALSE); /* Ensure that the first character is a digit, * the first digit of the date, otherwise we don't * have an ISO 8601 date */ while (g_ascii_isspace (*iso_date)) iso_date++; if (*iso_date == '\0') return FALSE; if (!g_ascii_isdigit (*iso_date) && *iso_date != '-' && *iso_date != '+') return FALSE; val = strtoul (iso_date, (char **)&iso_date, 10); if (*iso_date == '-') { /* YYYY-MM-DD */ tm.tm_year = val - 1900; iso_date++; tm.tm_mon = strtoul (iso_date, (char **)&iso_date, 10) - 1; if (*iso_date++ != '-') return FALSE; tm.tm_mday = strtoul (iso_date, (char **)&iso_date, 10); } else { /* YYYYMMDD */ tm.tm_mday = val % 100; tm.tm_mon = (val % 10000) / 100 - 1; tm.tm_year = val / 10000 - 1900; } if (*iso_date != 'T') { /* Date only */ if (*iso_date == '\0') return TRUE; return FALSE; } iso_date++; /* If there is a 'T' then there has to be a time */ if (!g_ascii_isdigit (*iso_date)) return FALSE; val = strtoul (iso_date, (char **)&iso_date, 10); if (*iso_date == ':') { /* hh:mm:ss */ tm.tm_hour = val; iso_date++; tm.tm_min = strtoul (iso_date, (char **)&iso_date, 10); if (*iso_date++ != ':') return FALSE; tm.tm_sec = strtoul (iso_date, (char **)&iso_date, 10); } else { /* hhmmss */ tm.tm_sec = val % 100; tm.tm_min = (val % 10000) / 100; tm.tm_hour = val / 10000; } time_->tv_usec = 0; if (*iso_date == ',' || *iso_date == '.') { glong mul = 100000; while (g_ascii_isdigit (*++iso_date)) { time_->tv_usec += (*iso_date - '0') * mul; mul /= 10; } } /* Now parse the offset and convert tm to a time_t */ if (*iso_date == 'Z') { iso_date++; time_->tv_sec = mktime_utc (&tm); } else if (*iso_date == '+' || *iso_date == '-') { gint sign = (*iso_date == '+') ? -1 : 1; val = strtoul (iso_date + 1, (char **)&iso_date, 10); if (*iso_date == ':') val = 60 * val + strtoul (iso_date + 1, (char **)&iso_date, 10); else val = 60 * (val / 100) + (val % 100); time_->tv_sec = mktime_utc (&tm) + (time_t) (60 * val * sign); } else { /* No "Z" or offset, so local time */ tm.tm_isdst = -1; /* locale selects DST */ time_->tv_sec = mktime (&tm); } while (g_ascii_isspace (*iso_date)) iso_date++; return *iso_date == '\0'; } /** * g_time_val_to_iso8601: * @time_: a #GTimeVal * * Converts @time_ into an RFC 3339 encoded string, relative to the * Coordinated Universal Time (UTC). This is one of the many formats * allowed by ISO 8601. * * ISO 8601 allows a large number of date/time formats, with or without * punctuation and optional elements. The format returned by this function * is a complete date and time, with optional punctuation included, the * UTC time zone represented as "Z", and the @tv_usec part included if * and only if it is nonzero, i.e. either * "YYYY-MM-DDTHH:MM:SSZ" or "YYYY-MM-DDTHH:MM:SS.fffffZ". * * This corresponds to the Internet date/time format defined by * RFC 3339, and * to either of the two most-precise formats defined by * the W3C Note * "Date and Time Formats". Both of these documents are profiles of * ISO 8601. * * Use g_date_time_format() or g_strdup_printf() if a different * variation of ISO 8601 format is required. * * Return value: a newly allocated string containing an ISO 8601 date * * Since: 2.12 */ gchar * g_time_val_to_iso8601 (GTimeVal *time_) { gchar *retval; struct tm *tm; #ifdef HAVE_GMTIME_R struct tm tm_; #endif time_t secs; g_return_val_if_fail (time_->tv_usec >= 0 && time_->tv_usec < G_USEC_PER_SEC, NULL); secs = time_->tv_sec; #ifdef _WIN32 tm = gmtime (&secs); #else #ifdef HAVE_GMTIME_R tm = gmtime_r (&secs, &tm_); #else tm = gmtime (&secs); #endif #endif if (time_->tv_usec != 0) { /* ISO 8601 date and time format, with fractionary seconds: * YYYY-MM-DDTHH:MM:SS.MMMMMMZ */ retval = g_strdup_printf ("%4d-%02d-%02dT%02d:%02d:%02d.%06ldZ", tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec, time_->tv_usec); } else { /* ISO 8601 date and time format: * YYYY-MM-DDTHH:MM:SSZ */ retval = g_strdup_printf ("%4d-%02d-%02dT%02d:%02d:%02dZ", tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec); } return retval; } pkg-config-0.29.1/glib/glib/gqsort.c0000664000175000017500000001613612275467762014120 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1991, 1992, 1996, 1997,1999,2004 Free Software Foundation, Inc. * Copyright (C) 2000 Eazel, Inc. * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "config.h" #include #include #include #include "galloca.h" #include "gmem.h" #include "gqsort.h" #include "gtestutils.h" /* This file was originally from stdlib/msort.c in gnu libc, just changed to build inside glib and to not fall back to an unstable quicksort for large arrays. */ /* An alternative to qsort, with an identical interface. This file is part of the GNU C Library. Copyright (C) 1992,95-97,99,2000,01,02,04,07 Free Software Foundation, Inc. Written by Mike Haertel, September 1988. The GNU C Library is free software; you can redistribute it 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. The GNU C Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the GNU C Library; if not, see . */ struct msort_param { size_t s; size_t var; GCompareDataFunc cmp; void *arg; char *t; }; static void msort_with_tmp (const struct msort_param *p, void *b, size_t n); static void msort_with_tmp (const struct msort_param *p, void *b, size_t n) { char *b1, *b2; size_t n1, n2; char *tmp = p->t; const size_t s = p->s; GCompareDataFunc cmp = p->cmp; void *arg = p->arg; if (n <= 1) return; n1 = n / 2; n2 = n - n1; b1 = b; b2 = (char *) b + (n1 * p->s); msort_with_tmp (p, b1, n1); msort_with_tmp (p, b2, n2); switch (p->var) { case 0: while (n1 > 0 && n2 > 0) { if ((*cmp) (b1, b2, arg) <= 0) { *(guint32 *) tmp = *(guint32 *) b1; b1 += sizeof (guint32); --n1; } else { *(guint32 *) tmp = *(guint32 *) b2; b2 += sizeof (guint32); --n2; } tmp += sizeof (guint32); } break; case 1: while (n1 > 0 && n2 > 0) { if ((*cmp) (b1, b2, arg) <= 0) { *(guint64 *) tmp = *(guint64 *) b1; b1 += sizeof (guint64); --n1; } else { *(guint64 *) tmp = *(guint64 *) b2; b2 += sizeof (guint64); --n2; } tmp += sizeof (guint64); } break; case 2: while (n1 > 0 && n2 > 0) { unsigned long *tmpl = (unsigned long *) tmp; unsigned long *bl; tmp += s; if ((*cmp) (b1, b2, arg) <= 0) { bl = (unsigned long *) b1; b1 += s; --n1; } else { bl = (unsigned long *) b2; b2 += s; --n2; } while (tmpl < (unsigned long *) tmp) *tmpl++ = *bl++; } break; case 3: while (n1 > 0 && n2 > 0) { if ((*cmp) (*(const void **) b1, *(const void **) b2, arg) <= 0) { *(void **) tmp = *(void **) b1; b1 += sizeof (void *); --n1; } else { *(void **) tmp = *(void **) b2; b2 += sizeof (void *); --n2; } tmp += sizeof (void *); } break; default: while (n1 > 0 && n2 > 0) { if ((*cmp) (b1, b2, arg) <= 0) { memcpy (tmp, b1, s); tmp += s; b1 += s; --n1; } else { memcpy (tmp, b2, s); tmp += s; b2 += s; --n2; } } break; } if (n1 > 0) memcpy (tmp, b1, n1 * s); memcpy (b, p->t, (n - n2) * s); } static void msort_r (void *b, size_t n, size_t s, GCompareDataFunc cmp, void *arg) { size_t size = n * s; char *tmp = NULL; struct msort_param p; /* For large object sizes use indirect sorting. */ if (s > 32) size = 2 * n * sizeof (void *) + s; if (size < 1024) /* The temporary array is small, so put it on the stack. */ p.t = g_alloca (size); else { /* It's large, so malloc it. */ tmp = g_malloc (size); p.t = tmp; } p.s = s; p.var = 4; p.cmp = cmp; p.arg = arg; if (s > 32) { /* Indirect sorting. */ char *ip = (char *) b; void **tp = (void **) (p.t + n * sizeof (void *)); void **t = tp; void *tmp_storage = (void *) (tp + n); char *kp; size_t i; while ((void *) t < tmp_storage) { *t++ = ip; ip += s; } p.s = sizeof (void *); p.var = 3; msort_with_tmp (&p, p.t + n * sizeof (void *), n); /* tp[0] .. tp[n - 1] is now sorted, copy around entries of the original array. Knuth vol. 3 (2nd ed.) exercise 5.2-10. */ for (i = 0, ip = (char *) b; i < n; i++, ip += s) if ((kp = tp[i]) != ip) { size_t j = i; char *jp = ip; memcpy (tmp_storage, ip, s); do { size_t k = (kp - (char *) b) / s; tp[j] = jp; memcpy (jp, kp, s); j = k; jp = kp; kp = tp[k]; } while (kp != ip); tp[j] = jp; memcpy (jp, tmp_storage, s); } } else { if ((s & (sizeof (guint32) - 1)) == 0 && ((char *) b - (char *) 0) % ALIGNOF_GUINT32 == 0) { if (s == sizeof (guint32)) p.var = 0; else if (s == sizeof (guint64) && ((char *) b - (char *) 0) % ALIGNOF_GUINT64 == 0) p.var = 1; else if ((s & (sizeof (unsigned long) - 1)) == 0 && ((char *) b - (char *) 0) % ALIGNOF_UNSIGNED_LONG == 0) p.var = 2; } msort_with_tmp (&p, b, n); } g_free (tmp); } /** * g_qsort_with_data: * @pbase: start of array to sort * @total_elems: elements in the array * @size: size of each element * @compare_func: function to compare elements * @user_data: data to pass to @compare_func * * This is just like the standard C qsort() function, but * the comparison routine accepts a user data argument. * * This is guaranteed to be a stable sort since version 2.32. */ void g_qsort_with_data (gconstpointer pbase, gint total_elems, gsize size, GCompareDataFunc compare_func, gpointer user_data) { msort_r ((gpointer)pbase, total_elems, size, compare_func, user_data); } pkg-config-0.29.1/glib/glib/gkeyfile.c0000664000175000017500000034346312651243552014371 00000000000000/* gkeyfile.c - key file parser * * Copyright 2004 Red Hat, Inc. * Copyright 2009-2010 Collabora Ltd. * Copyright 2009 Nokia Corporation * * Written by Ray Strode * Matthias Clasen * * GLib is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * GLib is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with GLib; see the file COPYING.LIB. If not, * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "config.h" #include "gkeyfile.h" #include "gutils.h" #include #include #include #include #include #include #include #include #ifdef HAVE_UNISTD_H #include #endif #ifdef G_OS_WIN32 #include #undef fstat #define fstat(a,b) _fstati64(a,b) #undef stat #define stat _stati64 #ifndef S_ISREG #define S_ISREG(mode) ((mode)&_S_IFREG) #endif #endif /* G_OS_WIN23 */ #include "gconvert.h" #include "gdataset.h" #include "gerror.h" #include "gfileutils.h" #include "ghash.h" #include "glibintl.h" #include "glist.h" #include "gslist.h" #include "gmem.h" #include "gmessages.h" #include "gstdio.h" #include "gstring.h" #include "gstrfuncs.h" #include "gutils.h" /** * SECTION:keyfile * @title: Key-value file parser * @short_description: parses .ini-like config files * * #GKeyFile lets you parse, edit or create files containing groups of * key-value pairs, which we call key files for * lack of a better name. Several freedesktop.org specifications use * key files now, e.g the * Desktop * Entry Specification and the * Icon * Theme Specification. * * The syntax of key files is described in detail in the * Desktop * Entry Specification, here is a quick summary: Key files * consists of groups of key-value pairs, interspersed with comments. * * |[ * # this is just an example * # there can be comments before the first group * * [First Group] * * Name=Key File Example\tthis value shows\nescaping * * # localized strings are stored in multiple key-value pairs * Welcome=Hello * Welcome[de]=Hallo * Welcome[fr_FR]=Bonjour * Welcome[it]=Ciao * Welcome[be@latin]=Hello * * [Another Group] * * Numbers=2;20;-200;0 * * Booleans=true;false;true;true * ]| * * Lines beginning with a '#' and blank lines are considered comments. * * Groups are started by a header line containing the group name enclosed * in '[' and ']', and ended implicitly by the start of the next group or * the end of the file. Each key-value pair must be contained in a group. * * Key-value pairs generally have the form key=value, * with the exception of localized strings, which have the form * key[locale]=value, with a locale identifier of the * form lang_COUNTRY@MODIFIER where * COUNTRY and MODIFIER are optional. * Space before and after the '=' character are ignored. Newline, tab, * carriage return and backslash characters in value are escaped as \n, * \t, \r, and \\, respectively. To preserve leading spaces in values, * these can also be escaped as \s. * * Key files can store strings (possibly with localized variants), integers, * booleans and lists of these. Lists are separated by a separator character, * typically ';' or ','. To use the list separator character in a value in * a list, it has to be escaped by prefixing it with a backslash. * * This syntax is obviously inspired by the .ini files commonly met * on Windows, but there are some important differences: * * .ini files use the ';' character to begin comments, * key files use the '#' character. * Key files do not allow for ungrouped keys meaning only * comments can precede the first group. * Key files are always encoded in UTF-8. * Key and Group names are case-sensitive. For example, a * group called [GROUP] is a different from * [group]. * .ini files don't have a strongly typed boolean entry type, * they only have GetProfileInt(). In key files, only * true and false (in lower case) * are allowed. * * * Note that in contrast to the * Desktop * Entry Specification, groups in key files may contain the same * key multiple times; the last entry wins. Key files may also contain * multiple groups with the same name; they are merged together. * Another difference is that keys and group names in key files are not * restricted to ASCII characters. */ /** * G_KEY_FILE_ERROR: * * Error domain for key file parsing. Errors in this domain will * be from the #GKeyFileError enumeration. * * See #GError for information on error domains. */ /** * GKeyFileError: * @G_KEY_FILE_ERROR_UNKNOWN_ENCODING: the text being parsed was in * an unknown encoding * @G_KEY_FILE_ERROR_PARSE: document was ill-formed * @G_KEY_FILE_ERROR_NOT_FOUND: the file was not found * @G_KEY_FILE_ERROR_KEY_NOT_FOUND: a requested key was not found * @G_KEY_FILE_ERROR_GROUP_NOT_FOUND: a requested group was not found * @G_KEY_FILE_ERROR_INVALID_VALUE: a value could not be parsed * * Error codes returned by key file parsing. */ /** * GKeyFileFlags: * @G_KEY_FILE_NONE: No flags, default behaviour * @G_KEY_FILE_KEEP_COMMENTS: Use this flag if you plan to write the * (possibly modified) contents of the key file back to a file; * otherwise all comments will be lost when the key file is * written back. * @G_KEY_FILE_KEEP_TRANSLATIONS: Use this flag if you plan to write the * (possibly modified) contents of the key file back to a file; * otherwise only the translations for the current language will be * written back. * * Flags which influence the parsing. */ /** * G_KEY_FILE_DESKTOP_GROUP: * * The name of the main group of a desktop entry file, as defined in the * Desktop * Entry Specification. Consult the specification for more * details about the meanings of the keys below. * * Since: 2.14 */ /** * G_KEY_FILE_DESKTOP_KEY_TYPE: * * A key under #G_KEY_FILE_DESKTOP_GROUP, whose value is a string * giving the type of the desktop entry. Usually * #G_KEY_FILE_DESKTOP_TYPE_APPLICATION, * #G_KEY_FILE_DESKTOP_TYPE_LINK, or * #G_KEY_FILE_DESKTOP_TYPE_DIRECTORY. * * Since: 2.14 */ /** * G_KEY_FILE_DESKTOP_KEY_VERSION: * * A key under #G_KEY_FILE_DESKTOP_GROUP, whose value is a string * giving the version of the Desktop Entry Specification used for * the desktop entry file. * * Since: 2.14 */ /** * G_KEY_FILE_DESKTOP_KEY_NAME: * * A key under #G_KEY_FILE_DESKTOP_GROUP, whose value is a localized * string giving the specific name of the desktop entry. * * Since: 2.14 */ /** * G_KEY_FILE_DESKTOP_KEY_GENERIC_NAME: * * A key under #G_KEY_FILE_DESKTOP_GROUP, whose value is a localized * string giving the generic name of the desktop entry. * * Since: 2.14 */ /** * G_KEY_FILE_DESKTOP_KEY_NO_DISPLAY: * * A key under #G_KEY_FILE_DESKTOP_GROUP, whose value is a boolean * stating whether the desktop entry should be shown in menus. * * Since: 2.14 */ /** * G_KEY_FILE_DESKTOP_KEY_COMMENT: * * A key under #G_KEY_FILE_DESKTOP_GROUP, whose value is a localized * string giving the tooltip for the desktop entry. * * Since: 2.14 */ /** * G_KEY_FILE_DESKTOP_KEY_ICON: * * A key under #G_KEY_FILE_DESKTOP_GROUP, whose value is a localized * string giving the name of the icon to be displayed for the desktop * entry. * * Since: 2.14 */ /** * G_KEY_FILE_DESKTOP_KEY_HIDDEN: * * A key under #G_KEY_FILE_DESKTOP_GROUP, whose value is a boolean * stating whether the desktop entry has been deleted by the user. * * Since: 2.14 */ /** * G_KEY_FILE_DESKTOP_KEY_ONLY_SHOW_IN: * * A key under #G_KEY_FILE_DESKTOP_GROUP, whose value is a list of * strings identifying the environments that should display the * desktop entry. * * Since: 2.14 */ /** * G_KEY_FILE_DESKTOP_KEY_NOT_SHOW_IN: * * A key under #G_KEY_FILE_DESKTOP_GROUP, whose value is a list of * strings identifying the environments that should not display the * desktop entry. * * Since: 2.14 */ /** * G_KEY_FILE_DESKTOP_KEY_TRY_EXEC: * * A key under #G_KEY_FILE_DESKTOP_GROUP, whose value is a string * giving the file name of a binary on disk used to determine if the * program is actually installed. It is only valid for desktop entries * with the Application type. * * Since: 2.14 */ /** * G_KEY_FILE_DESKTOP_KEY_EXEC: * * A key under #G_KEY_FILE_DESKTOP_GROUP, whose value is a string * giving the command line to execute. It is only valid for desktop * entries with the Application type. * * Since: 2.14 */ /** * G_KEY_FILE_DESKTOP_KEY_PATH: * * A key under #G_KEY_FILE_DESKTOP_GROUP, whose value is a string * containing the working directory to run the program in. It is only * valid for desktop entries with the Application type. * * Since: 2.14 */ /** * G_KEY_FILE_DESKTOP_KEY_TERMINAL: * * A key under #G_KEY_FILE_DESKTOP_GROUP, whose value is a boolean * stating whether the program should be run in a terminal window. * It is only valid for desktop entries with the * Application type. * * Since: 2.14 */ /** * G_KEY_FILE_DESKTOP_KEY_MIME_TYPE: * * A key under #G_KEY_FILE_DESKTOP_GROUP, whose value is a list * of strings giving the MIME types supported by this desktop entry. * * Since: 2.14 */ /** * G_KEY_FILE_DESKTOP_KEY_CATEGORIES: * * A key under #G_KEY_FILE_DESKTOP_GROUP, whose value is a list * of strings giving the categories in which the desktop entry * should be shown in a menu. * * Since: 2.14 */ /** * G_KEY_FILE_DESKTOP_KEY_STARTUP_NOTIFY: * * A key under #G_KEY_FILE_DESKTOP_GROUP, whose value is a boolean * stating whether the application supports the Startup * Notification Protocol Specification. * * Since: 2.14 */ /** * G_KEY_FILE_DESKTOP_KEY_STARTUP_WM_CLASS: * * A key under #G_KEY_FILE_DESKTOP_GROUP, whose value is string * identifying the WM class or name hint of a window that the application * will create, which can be used to emulate Startup Notification with * older applications. * * Since: 2.14 */ /** * G_KEY_FILE_DESKTOP_KEY_URL : * * A key under #G_KEY_FILE_DESKTOP_GROUP, whose value is a string * giving the URL to access. It is only valid for desktop entries * with the Link type. * * Since: 2.14 */ /** * G_KEY_FILE_DESKTOP_TYPE_APPLICATION: * * The value of the #G_KEY_FILE_DESKTOP_KEY_TYPE, key for desktop * entries representing applications. * * Since: 2.14 */ /** * G_KEY_FILE_DESKTOP_TYPE_LINK: * * The value of the #G_KEY_FILE_DESKTOP_KEY_TYPE, key for desktop * entries representing links to documents. * * Since: 2.14 */ /** * G_KEY_FILE_DESKTOP_TYPE_DIRECTORY: * * The value of the #G_KEY_FILE_DESKTOP_KEY_TYPE, key for desktop * entries representing directories. * * Since: 2.14 */ typedef struct _GKeyFileGroup GKeyFileGroup; /** * GKeyFile: * * The GKeyFile struct contains only private data * and should not be accessed directly. */ struct _GKeyFile { GList *groups; GHashTable *group_hash; GKeyFileGroup *start_group; GKeyFileGroup *current_group; GString *parse_buffer; /* Holds up to one line of not-yet-parsed data */ gchar list_separator; GKeyFileFlags flags; gchar **locales; volatile gint ref_count; }; typedef struct _GKeyFileKeyValuePair GKeyFileKeyValuePair; struct _GKeyFileGroup { const gchar *name; /* NULL for above first group (which will be comments) */ GKeyFileKeyValuePair *comment; /* Special comment that is stuck to the top of a group */ GList *key_value_pairs; /* Used in parallel with key_value_pairs for * increased lookup performance */ GHashTable *lookup_map; }; struct _GKeyFileKeyValuePair { gchar *key; /* NULL for comments */ gchar *value; }; static gint find_file_in_data_dirs (const gchar *file, const gchar **data_dirs, gchar **output_file, GError **error); static gboolean g_key_file_load_from_fd (GKeyFile *key_file, gint fd, GKeyFileFlags flags, GError **error); static GList *g_key_file_lookup_group_node (GKeyFile *key_file, const gchar *group_name); static GKeyFileGroup *g_key_file_lookup_group (GKeyFile *key_file, const gchar *group_name); static GList *g_key_file_lookup_key_value_pair_node (GKeyFile *key_file, GKeyFileGroup *group, const gchar *key); static GKeyFileKeyValuePair *g_key_file_lookup_key_value_pair (GKeyFile *key_file, GKeyFileGroup *group, const gchar *key); static void g_key_file_remove_group_node (GKeyFile *key_file, GList *group_node); static void g_key_file_remove_key_value_pair_node (GKeyFile *key_file, GKeyFileGroup *group, GList *pair_node); static void g_key_file_add_key_value_pair (GKeyFile *key_file, GKeyFileGroup *group, GKeyFileKeyValuePair *pair); static void g_key_file_add_key (GKeyFile *key_file, GKeyFileGroup *group, const gchar *key, const gchar *value); static void g_key_file_add_group (GKeyFile *key_file, const gchar *group_name); static gboolean g_key_file_is_group_name (const gchar *name); static gboolean g_key_file_is_key_name (const gchar *name); static void g_key_file_key_value_pair_free (GKeyFileKeyValuePair *pair); static gboolean g_key_file_line_is_comment (const gchar *line); static gboolean g_key_file_line_is_group (const gchar *line); static gboolean g_key_file_line_is_key_value_pair (const gchar *line); static gchar *g_key_file_parse_value_as_string (GKeyFile *key_file, const gchar *value, GSList **separators, GError **error); static gchar *g_key_file_parse_string_as_value (GKeyFile *key_file, const gchar *string, gboolean escape_separator); static gint g_key_file_parse_value_as_integer (GKeyFile *key_file, const gchar *value, GError **error); static gchar *g_key_file_parse_integer_as_value (GKeyFile *key_file, gint value); static gdouble g_key_file_parse_value_as_double (GKeyFile *key_file, const gchar *value, GError **error); static gboolean g_key_file_parse_value_as_boolean (GKeyFile *key_file, const gchar *value, GError **error); static gchar *g_key_file_parse_boolean_as_value (GKeyFile *key_file, gboolean value); static gchar *g_key_file_parse_value_as_comment (GKeyFile *key_file, const gchar *value); static gchar *g_key_file_parse_comment_as_value (GKeyFile *key_file, const gchar *comment); static void g_key_file_parse_key_value_pair (GKeyFile *key_file, const gchar *line, gsize length, GError **error); static void g_key_file_parse_comment (GKeyFile *key_file, const gchar *line, gsize length, GError **error); static void g_key_file_parse_group (GKeyFile *key_file, const gchar *line, gsize length, GError **error); static gchar *key_get_locale (const gchar *key); static void g_key_file_parse_data (GKeyFile *key_file, const gchar *data, gsize length, GError **error); static void g_key_file_flush_parse_buffer (GKeyFile *key_file, GError **error); G_DEFINE_QUARK (g-key-file-error-quark, g_key_file_error) static void g_key_file_init (GKeyFile *key_file) { key_file->current_group = g_slice_new0 (GKeyFileGroup); key_file->groups = g_list_prepend (NULL, key_file->current_group); key_file->group_hash = g_hash_table_new (g_str_hash, g_str_equal); key_file->start_group = NULL; key_file->parse_buffer = g_string_sized_new (128); key_file->list_separator = ';'; key_file->flags = 0; key_file->locales = g_strdupv ((gchar **)g_get_language_names ()); } static void g_key_file_clear (GKeyFile *key_file) { GList *tmp, *group_node; if (key_file->locales) { g_strfreev (key_file->locales); key_file->locales = NULL; } if (key_file->parse_buffer) { g_string_free (key_file->parse_buffer, TRUE); key_file->parse_buffer = NULL; } tmp = key_file->groups; while (tmp != NULL) { group_node = tmp; tmp = tmp->next; g_key_file_remove_group_node (key_file, group_node); } if (key_file->group_hash != NULL) { g_hash_table_destroy (key_file->group_hash); key_file->group_hash = NULL; } g_warn_if_fail (key_file->groups == NULL); } /** * g_key_file_new: * * Creates a new empty #GKeyFile object. Use * g_key_file_load_from_file(), g_key_file_load_from_data(), * g_key_file_load_from_dirs() or g_key_file_load_from_data_dirs() to * read an existing key file. * * Return value: (transfer full): an empty #GKeyFile. * * Since: 2.6 **/ GKeyFile * g_key_file_new (void) { GKeyFile *key_file; key_file = g_slice_new0 (GKeyFile); key_file->ref_count = 1; g_key_file_init (key_file); return key_file; } /** * g_key_file_set_list_separator: * @key_file: a #GKeyFile * @separator: the separator * * Sets the character which is used to separate * values in lists. Typically ';' or ',' are used * as separators. The default list separator is ';'. * * Since: 2.6 */ void g_key_file_set_list_separator (GKeyFile *key_file, gchar separator) { g_return_if_fail (key_file != NULL); key_file->list_separator = separator; } /* Iterates through all the directories in *dirs trying to * open file. When it successfully locates and opens a file it * returns the file descriptor to the open file. It also * outputs the absolute path of the file in output_file. */ static gint find_file_in_data_dirs (const gchar *file, const gchar **dirs, gchar **output_file, GError **error) { const gchar **data_dirs, *data_dir; gchar *path; gint fd; path = NULL; fd = -1; if (dirs == NULL) return fd; data_dirs = dirs; while (data_dirs && (data_dir = *data_dirs) && fd == -1) { gchar *candidate_file, *sub_dir; candidate_file = (gchar *) file; sub_dir = g_strdup (""); while (candidate_file != NULL && fd == -1) { gchar *p; path = g_build_filename (data_dir, sub_dir, candidate_file, NULL); fd = g_open (path, O_RDONLY, 0); if (fd == -1) { g_free (path); path = NULL; } candidate_file = strchr (candidate_file, '-'); if (candidate_file == NULL) break; candidate_file++; g_free (sub_dir); sub_dir = g_strndup (file, candidate_file - file - 1); for (p = sub_dir; *p != '\0'; p++) { if (*p == '-') *p = G_DIR_SEPARATOR; } } g_free (sub_dir); data_dirs++; } if (fd == -1) { g_set_error_literal (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_NOT_FOUND, _("Valid key file could not be " "found in search dirs")); } if (output_file != NULL && fd > 0) *output_file = g_strdup (path); g_free (path); return fd; } static gboolean g_key_file_load_from_fd (GKeyFile *key_file, gint fd, GKeyFileFlags flags, GError **error) { GError *key_file_error = NULL; gssize bytes_read; struct stat stat_buf; gchar read_buf[4096]; gchar list_separator; if (fstat (fd, &stat_buf) < 0) { g_set_error_literal (error, G_FILE_ERROR, g_file_error_from_errno (errno), g_strerror (errno)); return FALSE; } if (!S_ISREG (stat_buf.st_mode)) { g_set_error_literal (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_PARSE, _("Not a regular file")); return FALSE; } list_separator = key_file->list_separator; g_key_file_clear (key_file); g_key_file_init (key_file); key_file->list_separator = list_separator; key_file->flags = flags; do { bytes_read = read (fd, read_buf, 4096); if (bytes_read == 0) /* End of File */ break; if (bytes_read < 0) { if (errno == EINTR || errno == EAGAIN) continue; g_set_error_literal (error, G_FILE_ERROR, g_file_error_from_errno (errno), g_strerror (errno)); return FALSE; } g_key_file_parse_data (key_file, read_buf, bytes_read, &key_file_error); } while (!key_file_error); if (key_file_error) { g_propagate_error (error, key_file_error); return FALSE; } g_key_file_flush_parse_buffer (key_file, &key_file_error); if (key_file_error) { g_propagate_error (error, key_file_error); return FALSE; } return TRUE; } /** * g_key_file_load_from_file: * @key_file: an empty #GKeyFile struct * @file: (type filename): the path of a filename to load, in the GLib filename encoding * @flags: flags from #GKeyFileFlags * @error: return location for a #GError, or %NULL * * Loads a key file into an empty #GKeyFile structure. * If the file could not be loaded then @error is set to * either a #GFileError or #GKeyFileError. * * Return value: %TRUE if a key file could be loaded, %FALSE otherwise * * Since: 2.6 **/ gboolean g_key_file_load_from_file (GKeyFile *key_file, const gchar *file, GKeyFileFlags flags, GError **error) { GError *key_file_error = NULL; gint fd; g_return_val_if_fail (key_file != NULL, FALSE); g_return_val_if_fail (file != NULL, FALSE); fd = g_open (file, O_RDONLY, 0); if (fd == -1) { g_set_error_literal (error, G_FILE_ERROR, g_file_error_from_errno (errno), g_strerror (errno)); return FALSE; } g_key_file_load_from_fd (key_file, fd, flags, &key_file_error); close (fd); if (key_file_error) { g_propagate_error (error, key_file_error); return FALSE; } return TRUE; } /** * g_key_file_load_from_data: * @key_file: an empty #GKeyFile struct * @data: key file loaded in memory * @length: the length of @data in bytes (or -1 if data is nul-terminated) * @flags: flags from #GKeyFileFlags * @error: return location for a #GError, or %NULL * * Loads a key file from memory into an empty #GKeyFile structure. * If the object cannot be created then %error is set to a #GKeyFileError. * * Return value: %TRUE if a key file could be loaded, %FALSE otherwise * * Since: 2.6 **/ gboolean g_key_file_load_from_data (GKeyFile *key_file, const gchar *data, gsize length, GKeyFileFlags flags, GError **error) { GError *key_file_error = NULL; gchar list_separator; g_return_val_if_fail (key_file != NULL, FALSE); g_return_val_if_fail (data != NULL || length == 0, FALSE); if (length == (gsize)-1) length = strlen (data); list_separator = key_file->list_separator; g_key_file_clear (key_file); g_key_file_init (key_file); key_file->list_separator = list_separator; key_file->flags = flags; g_key_file_parse_data (key_file, data, length, &key_file_error); if (key_file_error) { g_propagate_error (error, key_file_error); return FALSE; } g_key_file_flush_parse_buffer (key_file, &key_file_error); if (key_file_error) { g_propagate_error (error, key_file_error); return FALSE; } return TRUE; } /** * g_key_file_load_from_dirs: * @key_file: an empty #GKeyFile struct * @file: (type filename): a relative path to a filename to open and parse * @search_dirs: (array zero-terminated=1) (element-type filename): %NULL-terminated array of directories to search * @full_path: (out) (type filename) (allow-none): return location for a string containing the full path * of the file, or %NULL * @flags: flags from #GKeyFileFlags * @error: return location for a #GError, or %NULL * * This function looks for a key file named @file in the paths * specified in @search_dirs, loads the file into @key_file and * returns the file's full path in @full_path. If the file could not * be loaded then an %error is set to either a #GFileError or * #GKeyFileError. * * Return value: %TRUE if a key file could be loaded, %FALSE otherwise * * Since: 2.14 **/ gboolean g_key_file_load_from_dirs (GKeyFile *key_file, const gchar *file, const gchar **search_dirs, gchar **full_path, GKeyFileFlags flags, GError **error) { GError *key_file_error = NULL; const gchar **data_dirs; gchar *output_path; gint fd; gboolean found_file; g_return_val_if_fail (key_file != NULL, FALSE); g_return_val_if_fail (!g_path_is_absolute (file), FALSE); g_return_val_if_fail (search_dirs != NULL, FALSE); found_file = FALSE; data_dirs = search_dirs; output_path = NULL; while (*data_dirs != NULL && !found_file) { g_free (output_path); fd = find_file_in_data_dirs (file, data_dirs, &output_path, &key_file_error); if (fd == -1) { if (key_file_error) g_propagate_error (error, key_file_error); break; } found_file = g_key_file_load_from_fd (key_file, fd, flags, &key_file_error); close (fd); if (key_file_error) { g_propagate_error (error, key_file_error); break; } } if (found_file && full_path) *full_path = output_path; else g_free (output_path); return found_file; } /** * g_key_file_load_from_data_dirs: * @key_file: an empty #GKeyFile struct * @file: (type filename): a relative path to a filename to open and parse * @full_path: (out) (type filename) (allow-none): return location for a string containing the full path * of the file, or %NULL * @flags: flags from #GKeyFileFlags * @error: return location for a #GError, or %NULL * * This function looks for a key file named @file in the paths * returned from g_get_user_data_dir() and g_get_system_data_dirs(), * loads the file into @key_file and returns the file's full path in * @full_path. If the file could not be loaded then an %error is * set to either a #GFileError or #GKeyFileError. * * Return value: %TRUE if a key file could be loaded, %FALSE othewise * Since: 2.6 **/ gboolean g_key_file_load_from_data_dirs (GKeyFile *key_file, const gchar *file, gchar **full_path, GKeyFileFlags flags, GError **error) { gchar **all_data_dirs; const gchar * user_data_dir; const gchar * const * system_data_dirs; gsize i, j; gboolean found_file; g_return_val_if_fail (key_file != NULL, FALSE); g_return_val_if_fail (!g_path_is_absolute (file), FALSE); user_data_dir = g_get_user_data_dir (); system_data_dirs = g_get_system_data_dirs (); all_data_dirs = g_new (gchar *, g_strv_length ((gchar **)system_data_dirs) + 2); i = 0; all_data_dirs[i++] = g_strdup (user_data_dir); j = 0; while (system_data_dirs[j] != NULL) all_data_dirs[i++] = g_strdup (system_data_dirs[j++]); all_data_dirs[i] = NULL; found_file = g_key_file_load_from_dirs (key_file, file, (const gchar **)all_data_dirs, full_path, flags, error); g_strfreev (all_data_dirs); return found_file; } /** * g_key_file_ref: (skip) * @key_file: a #GKeyFile * * Increases the reference count of @key_file. * * Returns: the same @key_file. * * Since: 2.32 **/ GKeyFile * g_key_file_ref (GKeyFile *key_file) { g_return_val_if_fail (key_file != NULL, NULL); g_atomic_int_inc (&key_file->ref_count); return key_file; } /** * g_key_file_free: (skip) * @key_file: a #GKeyFile * * Clears all keys and groups from @key_file, and decreases the * reference count by 1. If the reference count reaches zero, * frees the key file and all its allocated memory. * * Since: 2.6 **/ void g_key_file_free (GKeyFile *key_file) { g_return_if_fail (key_file != NULL); g_key_file_clear (key_file); g_key_file_unref (key_file); } /** * g_key_file_unref: * @key_file: a #GKeyFile * * Decreases the reference count of @key_file by 1. If the reference count * reaches zero, frees the key file and all its allocated memory. * * Since: 2.32 **/ void g_key_file_unref (GKeyFile *key_file) { g_return_if_fail (key_file != NULL); if (g_atomic_int_dec_and_test (&key_file->ref_count)) { g_key_file_clear (key_file); g_slice_free (GKeyFile, key_file); } } /* If G_KEY_FILE_KEEP_TRANSLATIONS is not set, only returns * true for locales that match those in g_get_language_names(). */ static gboolean g_key_file_locale_is_interesting (GKeyFile *key_file, const gchar *locale) { gsize i; if (key_file->flags & G_KEY_FILE_KEEP_TRANSLATIONS) return TRUE; for (i = 0; key_file->locales[i] != NULL; i++) { if (g_ascii_strcasecmp (key_file->locales[i], locale) == 0) return TRUE; } return FALSE; } static void g_key_file_parse_line (GKeyFile *key_file, const gchar *line, gsize length, GError **error) { GError *parse_error = NULL; gchar *line_start; g_return_if_fail (key_file != NULL); g_return_if_fail (line != NULL); line_start = (gchar *) line; while (g_ascii_isspace (*line_start)) line_start++; if (g_key_file_line_is_comment (line_start)) g_key_file_parse_comment (key_file, line, length, &parse_error); else if (g_key_file_line_is_group (line_start)) g_key_file_parse_group (key_file, line_start, length - (line_start - line), &parse_error); else if (g_key_file_line_is_key_value_pair (line_start)) g_key_file_parse_key_value_pair (key_file, line_start, length - (line_start - line), &parse_error); else { gchar *line_utf8 = _g_utf8_make_valid (line); g_set_error (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_PARSE, _("Key file contains line '%s' which is not " "a key-value pair, group, or comment"), line_utf8); g_free (line_utf8); return; } if (parse_error) g_propagate_error (error, parse_error); } static void g_key_file_parse_comment (GKeyFile *key_file, const gchar *line, gsize length, GError **error) { GKeyFileKeyValuePair *pair; if (!(key_file->flags & G_KEY_FILE_KEEP_COMMENTS)) return; g_warn_if_fail (key_file->current_group != NULL); pair = g_slice_new (GKeyFileKeyValuePair); pair->key = NULL; pair->value = g_strndup (line, length); key_file->current_group->key_value_pairs = g_list_prepend (key_file->current_group->key_value_pairs, pair); } static void g_key_file_parse_group (GKeyFile *key_file, const gchar *line, gsize length, GError **error) { gchar *group_name; const gchar *group_name_start, *group_name_end; /* advance past opening '[' */ group_name_start = line + 1; group_name_end = line + length - 1; while (*group_name_end != ']') group_name_end--; group_name = g_strndup (group_name_start, group_name_end - group_name_start); if (!g_key_file_is_group_name (group_name)) { g_set_error (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_PARSE, _("Invalid group name: %s"), group_name); g_free (group_name); return; } g_key_file_add_group (key_file, group_name); g_free (group_name); } static void g_key_file_parse_key_value_pair (GKeyFile *key_file, const gchar *line, gsize length, GError **error) { gchar *key, *value, *key_end, *value_start, *locale; gsize key_len, value_len; if (key_file->current_group == NULL || key_file->current_group->name == NULL) { g_set_error_literal (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_GROUP_NOT_FOUND, _("Key file does not start with a group")); return; } key_end = value_start = strchr (line, '='); g_warn_if_fail (key_end != NULL); key_end--; value_start++; /* Pull the key name from the line (chomping trailing whitespace) */ while (g_ascii_isspace (*key_end)) key_end--; key_len = key_end - line + 2; g_warn_if_fail (key_len <= length); key = g_strndup (line, key_len - 1); if (!g_key_file_is_key_name (key)) { g_set_error (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_PARSE, _("Invalid key name: %s"), key); g_free (key); return; } /* Pull the value from the line (chugging leading whitespace) */ while (g_ascii_isspace (*value_start)) value_start++; value_len = line + length - value_start + 1; value = g_strndup (value_start, value_len); g_warn_if_fail (key_file->start_group != NULL); if (key_file->current_group && key_file->current_group->name && strcmp (key_file->start_group->name, key_file->current_group->name) == 0 && strcmp (key, "Encoding") == 0) { if (g_ascii_strcasecmp (value, "UTF-8") != 0) { gchar *value_utf8 = _g_utf8_make_valid (value); g_set_error (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_UNKNOWN_ENCODING, _("Key file contains unsupported " "encoding '%s'"), value_utf8); g_free (value_utf8); g_free (key); g_free (value); return; } } /* Is this key a translation? If so, is it one that we care about? */ locale = key_get_locale (key); if (locale == NULL || g_key_file_locale_is_interesting (key_file, locale)) { GKeyFileKeyValuePair *pair; pair = g_slice_new (GKeyFileKeyValuePair); pair->key = key; pair->value = value; g_key_file_add_key_value_pair (key_file, key_file->current_group, pair); } else { g_free (key); g_free (value); } g_free (locale); } static gchar * key_get_locale (const gchar *key) { gchar *locale; locale = g_strrstr (key, "["); if (locale && strlen (locale) <= 2) locale = NULL; if (locale) locale = g_strndup (locale + 1, strlen (locale) - 2); return locale; } static void g_key_file_parse_data (GKeyFile *key_file, const gchar *data, gsize length, GError **error) { GError *parse_error; gsize i; g_return_if_fail (key_file != NULL); g_return_if_fail (data != NULL || length == 0); parse_error = NULL; i = 0; while (i < length) { if (data[i] == '\n') { if (key_file->parse_buffer->len > 0 && (key_file->parse_buffer->str[key_file->parse_buffer->len - 1] == '\r')) g_string_erase (key_file->parse_buffer, key_file->parse_buffer->len - 1, 1); /* When a newline is encountered flush the parse buffer so that the * line can be parsed. Note that completely blank lines won't show * up in the parse buffer, so they get parsed directly. */ if (key_file->parse_buffer->len > 0) g_key_file_flush_parse_buffer (key_file, &parse_error); else g_key_file_parse_comment (key_file, "", 1, &parse_error); if (parse_error) { g_propagate_error (error, parse_error); return; } i++; } else { const gchar *start_of_line; const gchar *end_of_line; gsize line_length; start_of_line = data + i; end_of_line = memchr (start_of_line, '\n', length - i); if (end_of_line == NULL) end_of_line = data + length; line_length = end_of_line - start_of_line; g_string_append_len (key_file->parse_buffer, start_of_line, line_length); i += line_length; } } } static void g_key_file_flush_parse_buffer (GKeyFile *key_file, GError **error) { GError *file_error = NULL; g_return_if_fail (key_file != NULL); file_error = NULL; if (key_file->parse_buffer->len > 0) { g_key_file_parse_line (key_file, key_file->parse_buffer->str, key_file->parse_buffer->len, &file_error); g_string_erase (key_file->parse_buffer, 0, -1); if (file_error) { g_propagate_error (error, file_error); return; } } } /** * g_key_file_to_data: * @key_file: a #GKeyFile * @length: (out) (allow-none): return location for the length of the * returned string, or %NULL * @error: return location for a #GError, or %NULL * * This function outputs @key_file as a string. * * Note that this function never reports an error, * so it is safe to pass %NULL as @error. * * Return value: a newly allocated string holding * the contents of the #GKeyFile * * Since: 2.6 **/ gchar * g_key_file_to_data (GKeyFile *key_file, gsize *length, GError **error) { GString *data_string; GList *group_node, *key_file_node; g_return_val_if_fail (key_file != NULL, NULL); data_string = g_string_new (NULL); for (group_node = g_list_last (key_file->groups); group_node != NULL; group_node = group_node->prev) { GKeyFileGroup *group; group = (GKeyFileGroup *) group_node->data; /* separate groups by at least an empty line */ if (data_string->len >= 2 && data_string->str[data_string->len - 2] != '\n') g_string_append_c (data_string, '\n'); if (group->comment != NULL) g_string_append_printf (data_string, "%s\n", group->comment->value); if (group->name != NULL) g_string_append_printf (data_string, "[%s]\n", group->name); for (key_file_node = g_list_last (group->key_value_pairs); key_file_node != NULL; key_file_node = key_file_node->prev) { GKeyFileKeyValuePair *pair; pair = (GKeyFileKeyValuePair *) key_file_node->data; if (pair->key != NULL) g_string_append_printf (data_string, "%s=%s\n", pair->key, pair->value); else g_string_append_printf (data_string, "%s\n", pair->value); } } if (length) *length = data_string->len; return g_string_free (data_string, FALSE); } /** * g_key_file_get_keys: * @key_file: a #GKeyFile * @group_name: a group name * @length: (out) (allow-none): return location for the number of keys returned, or %NULL * @error: return location for a #GError, or %NULL * * Returns all keys for the group name @group_name. The array of * returned keys will be %NULL-terminated, so @length may * optionally be %NULL. In the event that the @group_name cannot * be found, %NULL is returned and @error is set to * #G_KEY_FILE_ERROR_GROUP_NOT_FOUND. * * Return value: (array zero-terminated=1) (transfer full): a newly-allocated %NULL-terminated array of strings. * Use g_strfreev() to free it. * * Since: 2.6 **/ gchar ** g_key_file_get_keys (GKeyFile *key_file, const gchar *group_name, gsize *length, GError **error) { GKeyFileGroup *group; GList *tmp; gchar **keys; gsize i, num_keys; g_return_val_if_fail (key_file != NULL, NULL); g_return_val_if_fail (group_name != NULL, NULL); group = g_key_file_lookup_group (key_file, group_name); if (!group) { g_set_error (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_GROUP_NOT_FOUND, _("Key file does not have group '%s'"), group_name ? group_name : "(null)"); return NULL; } num_keys = 0; for (tmp = group->key_value_pairs; tmp; tmp = tmp->next) { GKeyFileKeyValuePair *pair; pair = (GKeyFileKeyValuePair *) tmp->data; if (pair->key) num_keys++; } keys = g_new (gchar *, num_keys + 1); i = num_keys - 1; for (tmp = group->key_value_pairs; tmp; tmp = tmp->next) { GKeyFileKeyValuePair *pair; pair = (GKeyFileKeyValuePair *) tmp->data; if (pair->key) { keys[i] = g_strdup (pair->key); i--; } } keys[num_keys] = NULL; if (length) *length = num_keys; return keys; } /** * g_key_file_get_start_group: * @key_file: a #GKeyFile * * Returns the name of the start group of the file. * * Return value: The start group of the key file. * * Since: 2.6 **/ gchar * g_key_file_get_start_group (GKeyFile *key_file) { g_return_val_if_fail (key_file != NULL, NULL); if (key_file->start_group) return g_strdup (key_file->start_group->name); return NULL; } /** * g_key_file_get_groups: * @key_file: a #GKeyFile * @length: (out) (allow-none): return location for the number of returned groups, or %NULL * * Returns all groups in the key file loaded with @key_file. * The array of returned groups will be %NULL-terminated, so * @length may optionally be %NULL. * * Return value: (array zero-terminated=1) (transfer full): a newly-allocated %NULL-terminated array of strings. * Use g_strfreev() to free it. * Since: 2.6 **/ gchar ** g_key_file_get_groups (GKeyFile *key_file, gsize *length) { GList *group_node; gchar **groups; gsize i, num_groups; g_return_val_if_fail (key_file != NULL, NULL); num_groups = g_list_length (key_file->groups); g_return_val_if_fail (num_groups > 0, NULL); group_node = g_list_last (key_file->groups); g_return_val_if_fail (((GKeyFileGroup *) group_node->data)->name == NULL, NULL); /* Only need num_groups instead of num_groups + 1 * because the first group of the file (last in the * list) is always the comment group at the top, * which we skip */ groups = g_new (gchar *, num_groups); i = 0; for (group_node = group_node->prev; group_node != NULL; group_node = group_node->prev) { GKeyFileGroup *group; group = (GKeyFileGroup *) group_node->data; g_warn_if_fail (group->name != NULL); groups[i++] = g_strdup (group->name); } groups[i] = NULL; if (length) *length = i; return groups; } /** * g_key_file_get_value: * @key_file: a #GKeyFile * @group_name: a group name * @key: a key * @error: return location for a #GError, or %NULL * * Returns the raw value associated with @key under @group_name. * Use g_key_file_get_string() to retrieve an unescaped UTF-8 string. * * In the event the key cannot be found, %NULL is returned and * @error is set to #G_KEY_FILE_ERROR_KEY_NOT_FOUND. In the * event that the @group_name cannot be found, %NULL is returned * and @error is set to #G_KEY_FILE_ERROR_GROUP_NOT_FOUND. * * * Return value: a newly allocated string or %NULL if the specified * key cannot be found. * * Since: 2.6 **/ gchar * g_key_file_get_value (GKeyFile *key_file, const gchar *group_name, const gchar *key, GError **error) { GKeyFileGroup *group; GKeyFileKeyValuePair *pair; gchar *value = NULL; g_return_val_if_fail (key_file != NULL, NULL); g_return_val_if_fail (group_name != NULL, NULL); g_return_val_if_fail (key != NULL, NULL); group = g_key_file_lookup_group (key_file, group_name); if (!group) { g_set_error (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_GROUP_NOT_FOUND, _("Key file does not have group '%s'"), group_name ? group_name : "(null)"); return NULL; } pair = g_key_file_lookup_key_value_pair (key_file, group, key); if (pair) value = g_strdup (pair->value); else g_set_error (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_KEY_NOT_FOUND, _("Key file does not have key '%s'"), key); return value; } /** * g_key_file_set_value: * @key_file: a #GKeyFile * @group_name: a group name * @key: a key * @value: a string * * Associates a new value with @key under @group_name. * * If @key cannot be found then it is created. If @group_name cannot * be found then it is created. To set an UTF-8 string which may contain * characters that need escaping (such as newlines or spaces), use * g_key_file_set_string(). * * Since: 2.6 **/ void g_key_file_set_value (GKeyFile *key_file, const gchar *group_name, const gchar *key, const gchar *value) { GKeyFileGroup *group; GKeyFileKeyValuePair *pair; g_return_if_fail (key_file != NULL); g_return_if_fail (g_key_file_is_group_name (group_name)); g_return_if_fail (g_key_file_is_key_name (key)); g_return_if_fail (value != NULL); group = g_key_file_lookup_group (key_file, group_name); if (!group) { g_key_file_add_group (key_file, group_name); group = (GKeyFileGroup *) key_file->groups->data; g_key_file_add_key (key_file, group, key, value); } else { pair = g_key_file_lookup_key_value_pair (key_file, group, key); if (!pair) g_key_file_add_key (key_file, group, key, value); else { g_free (pair->value); pair->value = g_strdup (value); } } } /** * g_key_file_get_string: * @key_file: a #GKeyFile * @group_name: a group name * @key: a key * @error: return location for a #GError, or %NULL * * Returns the string value associated with @key under @group_name. * Unlike g_key_file_get_value(), this function handles escape sequences * like \s. * * In the event the key cannot be found, %NULL is returned and * @error is set to #G_KEY_FILE_ERROR_KEY_NOT_FOUND. In the * event that the @group_name cannot be found, %NULL is returned * and @error is set to #G_KEY_FILE_ERROR_GROUP_NOT_FOUND. * * Return value: a newly allocated string or %NULL if the specified * key cannot be found. * * Since: 2.6 **/ gchar * g_key_file_get_string (GKeyFile *key_file, const gchar *group_name, const gchar *key, GError **error) { gchar *value, *string_value; GError *key_file_error; g_return_val_if_fail (key_file != NULL, NULL); g_return_val_if_fail (group_name != NULL, NULL); g_return_val_if_fail (key != NULL, NULL); key_file_error = NULL; value = g_key_file_get_value (key_file, group_name, key, &key_file_error); if (key_file_error) { g_propagate_error (error, key_file_error); return NULL; } if (!g_utf8_validate (value, -1, NULL)) { gchar *value_utf8 = _g_utf8_make_valid (value); g_set_error (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_UNKNOWN_ENCODING, _("Key file contains key '%s' with value '%s' " "which is not UTF-8"), key, value_utf8); g_free (value_utf8); g_free (value); return NULL; } string_value = g_key_file_parse_value_as_string (key_file, value, NULL, &key_file_error); g_free (value); if (key_file_error) { if (g_error_matches (key_file_error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_INVALID_VALUE)) { g_set_error (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_INVALID_VALUE, _("Key file contains key '%s' " "which has a value that cannot be interpreted."), key); g_error_free (key_file_error); } else g_propagate_error (error, key_file_error); } return string_value; } /** * g_key_file_set_string: * @key_file: a #GKeyFile * @group_name: a group name * @key: a key * @string: a string * * Associates a new string value with @key under @group_name. * If @key cannot be found then it is created. * If @group_name cannot be found then it is created. * Unlike g_key_file_set_value(), this function handles characters * that need escaping, such as newlines. * * Since: 2.6 **/ void g_key_file_set_string (GKeyFile *key_file, const gchar *group_name, const gchar *key, const gchar *string) { gchar *value; g_return_if_fail (key_file != NULL); g_return_if_fail (string != NULL); value = g_key_file_parse_string_as_value (key_file, string, FALSE); g_key_file_set_value (key_file, group_name, key, value); g_free (value); } /** * g_key_file_get_string_list: * @key_file: a #GKeyFile * @group_name: a group name * @key: a key * @length: (out) (allow-none): return location for the number of returned strings, or %NULL * @error: return location for a #GError, or %NULL * * Returns the values associated with @key under @group_name. * * In the event the key cannot be found, %NULL is returned and * @error is set to #G_KEY_FILE_ERROR_KEY_NOT_FOUND. In the * event that the @group_name cannot be found, %NULL is returned * and @error is set to #G_KEY_FILE_ERROR_GROUP_NOT_FOUND. * * Return value: (array zero-terminated=1 length=length) (element-type utf8) (transfer full): * a %NULL-terminated string array or %NULL if the specified * key cannot be found. The array should be freed with g_strfreev(). * * Since: 2.6 **/ gchar ** g_key_file_get_string_list (GKeyFile *key_file, const gchar *group_name, const gchar *key, gsize *length, GError **error) { GError *key_file_error = NULL; gchar *value, *string_value, **values; gint i, len; GSList *p, *pieces = NULL; g_return_val_if_fail (key_file != NULL, NULL); g_return_val_if_fail (group_name != NULL, NULL); g_return_val_if_fail (key != NULL, NULL); if (length) *length = 0; value = g_key_file_get_value (key_file, group_name, key, &key_file_error); if (key_file_error) { g_propagate_error (error, key_file_error); return NULL; } if (!g_utf8_validate (value, -1, NULL)) { gchar *value_utf8 = _g_utf8_make_valid (value); g_set_error (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_UNKNOWN_ENCODING, _("Key file contains key '%s' with value '%s' " "which is not UTF-8"), key, value_utf8); g_free (value_utf8); g_free (value); return NULL; } string_value = g_key_file_parse_value_as_string (key_file, value, &pieces, &key_file_error); g_free (value); g_free (string_value); if (key_file_error) { if (g_error_matches (key_file_error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_INVALID_VALUE)) { g_set_error (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_INVALID_VALUE, _("Key file contains key '%s' " "which has a value that cannot be interpreted."), key); g_error_free (key_file_error); } else g_propagate_error (error, key_file_error); g_slist_free_full (pieces, g_free); return NULL; } len = g_slist_length (pieces); values = g_new (gchar *, len + 1); for (p = pieces, i = 0; p; p = p->next) values[i++] = p->data; values[len] = NULL; g_slist_free (pieces); if (length) *length = len; return values; } /** * g_key_file_set_string_list: * @key_file: a #GKeyFile * @group_name: a group name * @key: a key * @list: (array zero-terminated=1 length=length) (element-type utf8): an array of string values * @length: number of string values in @list * * Associates a list of string values for @key under @group_name. * If @key cannot be found then it is created. * If @group_name cannot be found then it is created. * * Since: 2.6 **/ void g_key_file_set_string_list (GKeyFile *key_file, const gchar *group_name, const gchar *key, const gchar * const list[], gsize length) { GString *value_list; gsize i; g_return_if_fail (key_file != NULL); g_return_if_fail (list != NULL || length == 0); value_list = g_string_sized_new (length * 128); for (i = 0; i < length && list[i] != NULL; i++) { gchar *value; value = g_key_file_parse_string_as_value (key_file, list[i], TRUE); g_string_append (value_list, value); g_string_append_c (value_list, key_file->list_separator); g_free (value); } g_key_file_set_value (key_file, group_name, key, value_list->str); g_string_free (value_list, TRUE); } /** * g_key_file_set_locale_string: * @key_file: a #GKeyFile * @group_name: a group name * @key: a key * @locale: a locale identifier * @string: a string * * Associates a string value for @key and @locale under @group_name. * If the translation for @key cannot be found then it is created. * * Since: 2.6 **/ void g_key_file_set_locale_string (GKeyFile *key_file, const gchar *group_name, const gchar *key, const gchar *locale, const gchar *string) { gchar *full_key, *value; g_return_if_fail (key_file != NULL); g_return_if_fail (key != NULL); g_return_if_fail (locale != NULL); g_return_if_fail (string != NULL); value = g_key_file_parse_string_as_value (key_file, string, FALSE); full_key = g_strdup_printf ("%s[%s]", key, locale); g_key_file_set_value (key_file, group_name, full_key, value); g_free (full_key); g_free (value); } /** * g_key_file_get_locale_string: * @key_file: a #GKeyFile * @group_name: a group name * @key: a key * @locale: (allow-none): a locale identifier or %NULL * @error: return location for a #GError, or %NULL * * Returns the value associated with @key under @group_name * translated in the given @locale if available. If @locale is * %NULL then the current locale is assumed. * * If @key cannot be found then %NULL is returned and @error is set * to #G_KEY_FILE_ERROR_KEY_NOT_FOUND. If the value associated * with @key cannot be interpreted or no suitable translation can * be found then the untranslated value is returned. * * Return value: a newly allocated string or %NULL if the specified * key cannot be found. * * Since: 2.6 **/ gchar * g_key_file_get_locale_string (GKeyFile *key_file, const gchar *group_name, const gchar *key, const gchar *locale, GError **error) { gchar *candidate_key, *translated_value; GError *key_file_error; gchar **languages; gboolean free_languages = FALSE; gint i; g_return_val_if_fail (key_file != NULL, NULL); g_return_val_if_fail (group_name != NULL, NULL); g_return_val_if_fail (key != NULL, NULL); candidate_key = NULL; translated_value = NULL; key_file_error = NULL; if (locale) { languages = g_get_locale_variants (locale); free_languages = TRUE; } else { languages = (gchar **) g_get_language_names (); free_languages = FALSE; } for (i = 0; languages[i]; i++) { candidate_key = g_strdup_printf ("%s[%s]", key, languages[i]); translated_value = g_key_file_get_string (key_file, group_name, candidate_key, NULL); g_free (candidate_key); if (translated_value) break; g_free (translated_value); translated_value = NULL; } /* Fallback to untranslated key */ if (!translated_value) { translated_value = g_key_file_get_string (key_file, group_name, key, &key_file_error); if (!translated_value) g_propagate_error (error, key_file_error); } if (free_languages) g_strfreev (languages); return translated_value; } /** * g_key_file_get_locale_string_list: * @key_file: a #GKeyFile * @group_name: a group name * @key: a key * @locale: (allow-none): a locale identifier or %NULL * @length: (out) (allow-none): return location for the number of returned strings or %NULL * @error: return location for a #GError or %NULL * * Returns the values associated with @key under @group_name * translated in the given @locale if available. If @locale is * %NULL then the current locale is assumed. * If @key cannot be found then %NULL is returned and @error is set * to #G_KEY_FILE_ERROR_KEY_NOT_FOUND. If the values associated * with @key cannot be interpreted or no suitable translations * can be found then the untranslated values are returned. The * returned array is %NULL-terminated, so @length may optionally * be %NULL. * * Return value: (array zero-terminated=1 length=length) (element-type utf8) (transfer full): a newly allocated %NULL-terminated string array * or %NULL if the key isn't found. The string array should be freed * with g_strfreev(). * * Since: 2.6 **/ gchar ** g_key_file_get_locale_string_list (GKeyFile *key_file, const gchar *group_name, const gchar *key, const gchar *locale, gsize *length, GError **error) { GError *key_file_error; gchar **values, *value; char list_separator[2]; gsize len; g_return_val_if_fail (key_file != NULL, NULL); g_return_val_if_fail (group_name != NULL, NULL); g_return_val_if_fail (key != NULL, NULL); key_file_error = NULL; value = g_key_file_get_locale_string (key_file, group_name, key, locale, &key_file_error); if (key_file_error) g_propagate_error (error, key_file_error); if (!value) { if (length) *length = 0; return NULL; } len = strlen (value); if (value[len - 1] == key_file->list_separator) value[len - 1] = '\0'; list_separator[0] = key_file->list_separator; list_separator[1] = '\0'; values = g_strsplit (value, list_separator, 0); g_free (value); if (length) *length = g_strv_length (values); return values; } /** * g_key_file_set_locale_string_list: * @key_file: a #GKeyFile * @group_name: a group name * @key: a key * @locale: a locale identifier * @list: (array zero-terminated=1 length=length): a %NULL-terminated array of locale string values * @length: the length of @list * * Associates a list of string values for @key and @locale under * @group_name. If the translation for @key cannot be found then * it is created. * * Since: 2.6 **/ void g_key_file_set_locale_string_list (GKeyFile *key_file, const gchar *group_name, const gchar *key, const gchar *locale, const gchar * const list[], gsize length) { GString *value_list; gchar *full_key; gsize i; g_return_if_fail (key_file != NULL); g_return_if_fail (key != NULL); g_return_if_fail (locale != NULL); g_return_if_fail (length != 0); value_list = g_string_sized_new (length * 128); for (i = 0; i < length && list[i] != NULL; i++) { gchar *value; value = g_key_file_parse_string_as_value (key_file, list[i], TRUE); g_string_append (value_list, value); g_string_append_c (value_list, key_file->list_separator); g_free (value); } full_key = g_strdup_printf ("%s[%s]", key, locale); g_key_file_set_value (key_file, group_name, full_key, value_list->str); g_free (full_key); g_string_free (value_list, TRUE); } /** * g_key_file_get_boolean: * @key_file: a #GKeyFile * @group_name: a group name * @key: a key * @error: return location for a #GError * * Returns the value associated with @key under @group_name as a * boolean. * * If @key cannot be found then %FALSE is returned and @error is set * to #G_KEY_FILE_ERROR_KEY_NOT_FOUND. Likewise, if the value * associated with @key cannot be interpreted as a boolean then %FALSE * is returned and @error is set to #G_KEY_FILE_ERROR_INVALID_VALUE. * * Return value: the value associated with the key as a boolean, * or %FALSE if the key was not found or could not be parsed. * * Since: 2.6 **/ gboolean g_key_file_get_boolean (GKeyFile *key_file, const gchar *group_name, const gchar *key, GError **error) { GError *key_file_error = NULL; gchar *value; gboolean bool_value; g_return_val_if_fail (key_file != NULL, FALSE); g_return_val_if_fail (group_name != NULL, FALSE); g_return_val_if_fail (key != NULL, FALSE); value = g_key_file_get_value (key_file, group_name, key, &key_file_error); if (!value) { g_propagate_error (error, key_file_error); return FALSE; } bool_value = g_key_file_parse_value_as_boolean (key_file, value, &key_file_error); g_free (value); if (key_file_error) { if (g_error_matches (key_file_error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_INVALID_VALUE)) { g_set_error (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_INVALID_VALUE, _("Key file contains key '%s' " "which has a value that cannot be interpreted."), key); g_error_free (key_file_error); } else g_propagate_error (error, key_file_error); } return bool_value; } /** * g_key_file_set_boolean: * @key_file: a #GKeyFile * @group_name: a group name * @key: a key * @value: %TRUE or %FALSE * * Associates a new boolean value with @key under @group_name. * If @key cannot be found then it is created. * * Since: 2.6 **/ void g_key_file_set_boolean (GKeyFile *key_file, const gchar *group_name, const gchar *key, gboolean value) { gchar *result; g_return_if_fail (key_file != NULL); result = g_key_file_parse_boolean_as_value (key_file, value); g_key_file_set_value (key_file, group_name, key, result); g_free (result); } /** * g_key_file_get_boolean_list: * @key_file: a #GKeyFile * @group_name: a group name * @key: a key * @length: (out): the number of booleans returned * @error: return location for a #GError * * Returns the values associated with @key under @group_name as * booleans. * * If @key cannot be found then %NULL is returned and @error is set to * #G_KEY_FILE_ERROR_KEY_NOT_FOUND. Likewise, if the values associated * with @key cannot be interpreted as booleans then %NULL is returned * and @error is set to #G_KEY_FILE_ERROR_INVALID_VALUE. * * Return value: (array length=length) (element-type gboolean) (transfer container): * the values associated with the key as a list of booleans, or %NULL if the * key was not found or could not be parsed. The returned list of booleans * should be freed with g_free() when no longer needed. * * Since: 2.6 **/ gboolean * g_key_file_get_boolean_list (GKeyFile *key_file, const gchar *group_name, const gchar *key, gsize *length, GError **error) { GError *key_file_error; gchar **values; gboolean *bool_values; gsize i, num_bools; g_return_val_if_fail (key_file != NULL, NULL); g_return_val_if_fail (group_name != NULL, NULL); g_return_val_if_fail (key != NULL, NULL); if (length) *length = 0; key_file_error = NULL; values = g_key_file_get_string_list (key_file, group_name, key, &num_bools, &key_file_error); if (key_file_error) g_propagate_error (error, key_file_error); if (!values) return NULL; bool_values = g_new (gboolean, num_bools); for (i = 0; i < num_bools; i++) { bool_values[i] = g_key_file_parse_value_as_boolean (key_file, values[i], &key_file_error); if (key_file_error) { g_propagate_error (error, key_file_error); g_strfreev (values); g_free (bool_values); return NULL; } } g_strfreev (values); if (length) *length = num_bools; return bool_values; } /** * g_key_file_set_boolean_list: * @key_file: a #GKeyFile * @group_name: a group name * @key: a key * @list: (array length=length): an array of boolean values * @length: length of @list * * Associates a list of boolean values with @key under @group_name. * If @key cannot be found then it is created. * If @group_name is %NULL, the start_group is used. * * Since: 2.6 **/ void g_key_file_set_boolean_list (GKeyFile *key_file, const gchar *group_name, const gchar *key, gboolean list[], gsize length) { GString *value_list; gsize i; g_return_if_fail (key_file != NULL); g_return_if_fail (list != NULL); value_list = g_string_sized_new (length * 8); for (i = 0; i < length; i++) { gchar *value; value = g_key_file_parse_boolean_as_value (key_file, list[i]); g_string_append (value_list, value); g_string_append_c (value_list, key_file->list_separator); g_free (value); } g_key_file_set_value (key_file, group_name, key, value_list->str); g_string_free (value_list, TRUE); } /** * g_key_file_get_integer: * @key_file: a #GKeyFile * @group_name: a group name * @key: a key * @error: return location for a #GError * * Returns the value associated with @key under @group_name as an * integer. * * If @key cannot be found then 0 is returned and @error is set to * #G_KEY_FILE_ERROR_KEY_NOT_FOUND. Likewise, if the value associated * with @key cannot be interpreted as an integer then 0 is returned * and @error is set to #G_KEY_FILE_ERROR_INVALID_VALUE. * * Return value: the value associated with the key as an integer, or * 0 if the key was not found or could not be parsed. * * Since: 2.6 **/ gint g_key_file_get_integer (GKeyFile *key_file, const gchar *group_name, const gchar *key, GError **error) { GError *key_file_error; gchar *value; gint int_value; g_return_val_if_fail (key_file != NULL, -1); g_return_val_if_fail (group_name != NULL, -1); g_return_val_if_fail (key != NULL, -1); key_file_error = NULL; value = g_key_file_get_value (key_file, group_name, key, &key_file_error); if (key_file_error) { g_propagate_error (error, key_file_error); return 0; } int_value = g_key_file_parse_value_as_integer (key_file, value, &key_file_error); g_free (value); if (key_file_error) { if (g_error_matches (key_file_error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_INVALID_VALUE)) { g_set_error (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_INVALID_VALUE, _("Key file contains key '%s' in group '%s' " "which has a value that cannot be interpreted."), key, group_name); g_error_free (key_file_error); } else g_propagate_error (error, key_file_error); } return int_value; } /** * g_key_file_set_integer: * @key_file: a #GKeyFile * @group_name: a group name * @key: a key * @value: an integer value * * Associates a new integer value with @key under @group_name. * If @key cannot be found then it is created. * * Since: 2.6 **/ void g_key_file_set_integer (GKeyFile *key_file, const gchar *group_name, const gchar *key, gint value) { gchar *result; g_return_if_fail (key_file != NULL); result = g_key_file_parse_integer_as_value (key_file, value); g_key_file_set_value (key_file, group_name, key, result); g_free (result); } /** * g_key_file_get_int64: * @key_file: a non-%NULL #GKeyFile * @group_name: a non-%NULL group name * @key: a non-%NULL key * @error: return location for a #GError * * Returns the value associated with @key under @group_name as a signed * 64-bit integer. This is similar to g_key_file_get_integer() but can return * 64-bit results without truncation. * * Returns: the value associated with the key as a signed 64-bit integer, or * 0 if the key was not found or could not be parsed. * * Since: 2.26 */ gint64 g_key_file_get_int64 (GKeyFile *key_file, const gchar *group_name, const gchar *key, GError **error) { gchar *s, *end; gint64 v; g_return_val_if_fail (key_file != NULL, -1); g_return_val_if_fail (group_name != NULL, -1); g_return_val_if_fail (key != NULL, -1); s = g_key_file_get_value (key_file, group_name, key, error); if (s == NULL) return 0; v = g_ascii_strtoll (s, &end, 10); if (*s == '\0' || *end != '\0') { g_set_error (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_INVALID_VALUE, _("Key '%s' in group '%s' has value '%s' " "where %s was expected"), key, group_name, s, "int64"); return 0; } g_free (s); return v; } /** * g_key_file_set_int64: * @key_file: a #GKeyFile * @group_name: a group name * @key: a key * @value: an integer value * * Associates a new integer value with @key under @group_name. * If @key cannot be found then it is created. * * Since: 2.26 **/ void g_key_file_set_int64 (GKeyFile *key_file, const gchar *group_name, const gchar *key, gint64 value) { gchar *result; g_return_if_fail (key_file != NULL); result = g_strdup_printf ("%" G_GINT64_FORMAT, value); g_key_file_set_value (key_file, group_name, key, result); g_free (result); } /** * g_key_file_get_uint64: * @key_file: a non-%NULL #GKeyFile * @group_name: a non-%NULL group name * @key: a non-%NULL key * @error: return location for a #GError * * Returns the value associated with @key under @group_name as an unsigned * 64-bit integer. This is similar to g_key_file_get_integer() but can return * large positive results without truncation. * * Returns: the value associated with the key as an unsigned 64-bit integer, * or 0 if the key was not found or could not be parsed. * * Since: 2.26 */ guint64 g_key_file_get_uint64 (GKeyFile *key_file, const gchar *group_name, const gchar *key, GError **error) { gchar *s, *end; guint64 v; g_return_val_if_fail (key_file != NULL, -1); g_return_val_if_fail (group_name != NULL, -1); g_return_val_if_fail (key != NULL, -1); s = g_key_file_get_value (key_file, group_name, key, error); if (s == NULL) return 0; v = g_ascii_strtoull (s, &end, 10); if (*s == '\0' || *end != '\0') { g_set_error (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_INVALID_VALUE, _("Key '%s' in group '%s' has value '%s' " "where %s was expected"), key, group_name, s, "uint64"); return 0; } g_free (s); return v; } /** * g_key_file_set_uint64: * @key_file: a #GKeyFile * @group_name: a group name * @key: a key * @value: an integer value * * Associates a new integer value with @key under @group_name. * If @key cannot be found then it is created. * * Since: 2.26 **/ void g_key_file_set_uint64 (GKeyFile *key_file, const gchar *group_name, const gchar *key, guint64 value) { gchar *result; g_return_if_fail (key_file != NULL); result = g_strdup_printf ("%" G_GUINT64_FORMAT, value); g_key_file_set_value (key_file, group_name, key, result); g_free (result); } /** * g_key_file_get_integer_list: * @key_file: a #GKeyFile * @group_name: a group name * @key: a key * @length: (out): the number of integers returned * @error: return location for a #GError * * Returns the values associated with @key under @group_name as * integers. * * If @key cannot be found then %NULL is returned and @error is set to * #G_KEY_FILE_ERROR_KEY_NOT_FOUND. Likewise, if the values associated * with @key cannot be interpreted as integers then %NULL is returned * and @error is set to #G_KEY_FILE_ERROR_INVALID_VALUE. * * Return value: (array length=length) (element-type gint) (transfer container): * the values associated with the key as a list of integers, or %NULL if * the key was not found or could not be parsed. The returned list of * integers should be freed with g_free() when no longer needed. * * Since: 2.6 **/ gint * g_key_file_get_integer_list (GKeyFile *key_file, const gchar *group_name, const gchar *key, gsize *length, GError **error) { GError *key_file_error = NULL; gchar **values; gint *int_values; gsize i, num_ints; g_return_val_if_fail (key_file != NULL, NULL); g_return_val_if_fail (group_name != NULL, NULL); g_return_val_if_fail (key != NULL, NULL); if (length) *length = 0; values = g_key_file_get_string_list (key_file, group_name, key, &num_ints, &key_file_error); if (key_file_error) g_propagate_error (error, key_file_error); if (!values) return NULL; int_values = g_new (gint, num_ints); for (i = 0; i < num_ints; i++) { int_values[i] = g_key_file_parse_value_as_integer (key_file, values[i], &key_file_error); if (key_file_error) { g_propagate_error (error, key_file_error); g_strfreev (values); g_free (int_values); return NULL; } } g_strfreev (values); if (length) *length = num_ints; return int_values; } /** * g_key_file_set_integer_list: * @key_file: a #GKeyFile * @group_name: a group name * @key: a key * @list: (array length=length): an array of integer values * @length: number of integer values in @list * * Associates a list of integer values with @key under @group_name. * If @key cannot be found then it is created. * * Since: 2.6 **/ void g_key_file_set_integer_list (GKeyFile *key_file, const gchar *group_name, const gchar *key, gint list[], gsize length) { GString *values; gsize i; g_return_if_fail (key_file != NULL); g_return_if_fail (list != NULL); values = g_string_sized_new (length * 16); for (i = 0; i < length; i++) { gchar *value; value = g_key_file_parse_integer_as_value (key_file, list[i]); g_string_append (values, value); g_string_append_c (values, key_file->list_separator); g_free (value); } g_key_file_set_value (key_file, group_name, key, values->str); g_string_free (values, TRUE); } /** * g_key_file_get_double: * @key_file: a #GKeyFile * @group_name: a group name * @key: a key * @error: return location for a #GError * * Returns the value associated with @key under @group_name as a * double. If @group_name is %NULL, the start_group is used. * * If @key cannot be found then 0.0 is returned and @error is set to * #G_KEY_FILE_ERROR_KEY_NOT_FOUND. Likewise, if the value associated * with @key cannot be interpreted as a double then 0.0 is returned * and @error is set to #G_KEY_FILE_ERROR_INVALID_VALUE. * * Return value: the value associated with the key as a double, or * 0.0 if the key was not found or could not be parsed. * * Since: 2.12 **/ gdouble g_key_file_get_double (GKeyFile *key_file, const gchar *group_name, const gchar *key, GError **error) { GError *key_file_error; gchar *value; gdouble double_value; g_return_val_if_fail (key_file != NULL, -1); g_return_val_if_fail (group_name != NULL, -1); g_return_val_if_fail (key != NULL, -1); key_file_error = NULL; value = g_key_file_get_value (key_file, group_name, key, &key_file_error); if (key_file_error) { g_propagate_error (error, key_file_error); return 0; } double_value = g_key_file_parse_value_as_double (key_file, value, &key_file_error); g_free (value); if (key_file_error) { if (g_error_matches (key_file_error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_INVALID_VALUE)) { g_set_error (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_INVALID_VALUE, _("Key file contains key '%s' in group '%s' " "which has a value that cannot be interpreted."), key, group_name); g_error_free (key_file_error); } else g_propagate_error (error, key_file_error); } return double_value; } /** * g_key_file_set_double: * @key_file: a #GKeyFile * @group_name: a group name * @key: a key * @value: an double value * * Associates a new double value with @key under @group_name. * If @key cannot be found then it is created. * * Since: 2.12 **/ void g_key_file_set_double (GKeyFile *key_file, const gchar *group_name, const gchar *key, gdouble value) { gchar result[G_ASCII_DTOSTR_BUF_SIZE]; g_return_if_fail (key_file != NULL); g_ascii_dtostr (result, sizeof (result), value); g_key_file_set_value (key_file, group_name, key, result); } /** * g_key_file_get_double_list: * @key_file: a #GKeyFile * @group_name: a group name * @key: a key * @length: (out): the number of doubles returned * @error: return location for a #GError * * Returns the values associated with @key under @group_name as * doubles. * * If @key cannot be found then %NULL is returned and @error is set to * #G_KEY_FILE_ERROR_KEY_NOT_FOUND. Likewise, if the values associated * with @key cannot be interpreted as doubles then %NULL is returned * and @error is set to #G_KEY_FILE_ERROR_INVALID_VALUE. * * Return value: (array length=length) (element-type gdouble) (transfer container): * the values associated with the key as a list of doubles, or %NULL if the * key was not found or could not be parsed. The returned list of doubles * should be freed with g_free() when no longer needed. * * Since: 2.12 **/ gdouble * g_key_file_get_double_list (GKeyFile *key_file, const gchar *group_name, const gchar *key, gsize *length, GError **error) { GError *key_file_error = NULL; gchar **values; gdouble *double_values; gsize i, num_doubles; g_return_val_if_fail (key_file != NULL, NULL); g_return_val_if_fail (group_name != NULL, NULL); g_return_val_if_fail (key != NULL, NULL); if (length) *length = 0; values = g_key_file_get_string_list (key_file, group_name, key, &num_doubles, &key_file_error); if (key_file_error) g_propagate_error (error, key_file_error); if (!values) return NULL; double_values = g_new (gdouble, num_doubles); for (i = 0; i < num_doubles; i++) { double_values[i] = g_key_file_parse_value_as_double (key_file, values[i], &key_file_error); if (key_file_error) { g_propagate_error (error, key_file_error); g_strfreev (values); g_free (double_values); return NULL; } } g_strfreev (values); if (length) *length = num_doubles; return double_values; } /** * g_key_file_set_double_list: * @key_file: a #GKeyFile * @group_name: a group name * @key: a key * @list: (array length=length): an array of double values * @length: number of double values in @list * * Associates a list of double values with @key under * @group_name. If @key cannot be found then it is created. * * Since: 2.12 **/ void g_key_file_set_double_list (GKeyFile *key_file, const gchar *group_name, const gchar *key, gdouble list[], gsize length) { GString *values; gsize i; g_return_if_fail (key_file != NULL); g_return_if_fail (list != NULL); values = g_string_sized_new (length * 16); for (i = 0; i < length; i++) { gchar result[G_ASCII_DTOSTR_BUF_SIZE]; g_ascii_dtostr( result, sizeof (result), list[i] ); g_string_append (values, result); g_string_append_c (values, key_file->list_separator); } g_key_file_set_value (key_file, group_name, key, values->str); g_string_free (values, TRUE); } static gboolean g_key_file_set_key_comment (GKeyFile *key_file, const gchar *group_name, const gchar *key, const gchar *comment, GError **error) { GKeyFileGroup *group; GKeyFileKeyValuePair *pair; GList *key_node, *comment_node, *tmp; group = g_key_file_lookup_group (key_file, group_name); if (!group) { g_set_error (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_GROUP_NOT_FOUND, _("Key file does not have group '%s'"), group_name ? group_name : "(null)"); return FALSE; } /* First find the key the comments are supposed to be * associated with */ key_node = g_key_file_lookup_key_value_pair_node (key_file, group, key); if (key_node == NULL) { g_set_error (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_KEY_NOT_FOUND, _("Key file does not have key '%s' in group '%s'"), key, group->name); return FALSE; } /* Then find all the comments already associated with the * key and free them */ tmp = key_node->next; while (tmp != NULL) { pair = (GKeyFileKeyValuePair *) tmp->data; if (pair->key != NULL) break; comment_node = tmp; tmp = tmp->next; g_key_file_remove_key_value_pair_node (key_file, group, comment_node); } if (comment == NULL) return TRUE; /* Now we can add our new comment */ pair = g_slice_new (GKeyFileKeyValuePair); pair->key = NULL; pair->value = g_key_file_parse_comment_as_value (key_file, comment); key_node = g_list_insert (key_node, pair, 1); return TRUE; } static gboolean g_key_file_set_group_comment (GKeyFile *key_file, const gchar *group_name, const gchar *comment, GError **error) { GKeyFileGroup *group; g_return_val_if_fail (g_key_file_is_group_name (group_name), FALSE); group = g_key_file_lookup_group (key_file, group_name); if (!group) { g_set_error (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_GROUP_NOT_FOUND, _("Key file does not have group '%s'"), group_name ? group_name : "(null)"); return FALSE; } /* First remove any existing comment */ if (group->comment) { g_key_file_key_value_pair_free (group->comment); group->comment = NULL; } if (comment == NULL) return TRUE; /* Now we can add our new comment */ group->comment = g_slice_new (GKeyFileKeyValuePair); group->comment->key = NULL; group->comment->value = g_key_file_parse_comment_as_value (key_file, comment); return TRUE; } static gboolean g_key_file_set_top_comment (GKeyFile *key_file, const gchar *comment, GError **error) { GList *group_node; GKeyFileGroup *group; GKeyFileKeyValuePair *pair; /* The last group in the list should be the top (comments only) * group in the file */ g_warn_if_fail (key_file->groups != NULL); group_node = g_list_last (key_file->groups); group = (GKeyFileGroup *) group_node->data; g_warn_if_fail (group->name == NULL); /* Note all keys must be comments at the top of * the file, so we can just free it all. */ g_list_free_full (group->key_value_pairs, (GDestroyNotify) g_key_file_key_value_pair_free); group->key_value_pairs = NULL; if (comment == NULL) return TRUE; pair = g_slice_new (GKeyFileKeyValuePair); pair->key = NULL; pair->value = g_key_file_parse_comment_as_value (key_file, comment); group->key_value_pairs = g_list_prepend (group->key_value_pairs, pair); return TRUE; } /** * g_key_file_set_comment: * @key_file: a #GKeyFile * @group_name: (allow-none): a group name, or %NULL * @key: (allow-none): a key * @comment: a comment * @error: return location for a #GError * * Places a comment above @key from @group_name. * If @key is %NULL then @comment will be written above @group_name. * If both @key and @group_name are %NULL, then @comment will be * written above the first group in the file. * * Returns: %TRUE if the comment was written, %FALSE otherwise * * Since: 2.6 **/ gboolean g_key_file_set_comment (GKeyFile *key_file, const gchar *group_name, const gchar *key, const gchar *comment, GError **error) { g_return_val_if_fail (key_file != NULL, FALSE); if (group_name != NULL && key != NULL) { if (!g_key_file_set_key_comment (key_file, group_name, key, comment, error)) return FALSE; } else if (group_name != NULL) { if (!g_key_file_set_group_comment (key_file, group_name, comment, error)) return FALSE; } else { if (!g_key_file_set_top_comment (key_file, comment, error)) return FALSE; } return TRUE; } static gchar * g_key_file_get_key_comment (GKeyFile *key_file, const gchar *group_name, const gchar *key, GError **error) { GKeyFileGroup *group; GKeyFileKeyValuePair *pair; GList *key_node, *tmp; GString *string; gchar *comment; g_return_val_if_fail (g_key_file_is_group_name (group_name), NULL); group = g_key_file_lookup_group (key_file, group_name); if (!group) { g_set_error (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_GROUP_NOT_FOUND, _("Key file does not have group '%s'"), group_name ? group_name : "(null)"); return NULL; } /* First find the key the comments are supposed to be * associated with */ key_node = g_key_file_lookup_key_value_pair_node (key_file, group, key); if (key_node == NULL) { g_set_error (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_KEY_NOT_FOUND, _("Key file does not have key '%s' in group '%s'"), key, group->name); return NULL; } string = NULL; /* Then find all the comments already associated with the * key and concatentate them. */ tmp = key_node->next; if (!key_node->next) return NULL; pair = (GKeyFileKeyValuePair *) tmp->data; if (pair->key != NULL) return NULL; while (tmp->next) { pair = (GKeyFileKeyValuePair *) tmp->next->data; if (pair->key != NULL) break; tmp = tmp->next; } while (tmp != key_node) { pair = (GKeyFileKeyValuePair *) tmp->data; if (string == NULL) string = g_string_sized_new (512); comment = g_key_file_parse_value_as_comment (key_file, pair->value); g_string_append (string, comment); g_free (comment); tmp = tmp->prev; } if (string != NULL) { comment = string->str; g_string_free (string, FALSE); } else comment = NULL; return comment; } static gchar * get_group_comment (GKeyFile *key_file, GKeyFileGroup *group, GError **error) { GString *string; GList *tmp; gchar *comment; string = NULL; tmp = group->key_value_pairs; while (tmp) { GKeyFileKeyValuePair *pair; pair = (GKeyFileKeyValuePair *) tmp->data; if (pair->key != NULL) { tmp = tmp->prev; break; } if (tmp->next == NULL) break; tmp = tmp->next; } while (tmp != NULL) { GKeyFileKeyValuePair *pair; pair = (GKeyFileKeyValuePair *) tmp->data; if (string == NULL) string = g_string_sized_new (512); comment = g_key_file_parse_value_as_comment (key_file, pair->value); g_string_append (string, comment); g_free (comment); tmp = tmp->prev; } if (string != NULL) return g_string_free (string, FALSE); return NULL; } static gchar * g_key_file_get_group_comment (GKeyFile *key_file, const gchar *group_name, GError **error) { GList *group_node; GKeyFileGroup *group; group = g_key_file_lookup_group (key_file, group_name); if (!group) { g_set_error (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_GROUP_NOT_FOUND, _("Key file does not have group '%s'"), group_name ? group_name : "(null)"); return NULL; } if (group->comment) return g_strdup (group->comment->value); group_node = g_key_file_lookup_group_node (key_file, group_name); group_node = group_node->next; group = (GKeyFileGroup *)group_node->data; return get_group_comment (key_file, group, error); } static gchar * g_key_file_get_top_comment (GKeyFile *key_file, GError **error) { GList *group_node; GKeyFileGroup *group; /* The last group in the list should be the top (comments only) * group in the file */ g_warn_if_fail (key_file->groups != NULL); group_node = g_list_last (key_file->groups); group = (GKeyFileGroup *) group_node->data; g_warn_if_fail (group->name == NULL); return get_group_comment (key_file, group, error); } /** * g_key_file_get_comment: * @key_file: a #GKeyFile * @group_name: (allow-none): a group name, or %NULL * @key: a key * @error: return location for a #GError * * Retrieves a comment above @key from @group_name. * If @key is %NULL then @comment will be read from above * @group_name. If both @key and @group_name are %NULL, then * @comment will be read from above the first group in the file. * * Returns: a comment that should be freed with g_free() * * Since: 2.6 **/ gchar * g_key_file_get_comment (GKeyFile *key_file, const gchar *group_name, const gchar *key, GError **error) { g_return_val_if_fail (key_file != NULL, NULL); if (group_name != NULL && key != NULL) return g_key_file_get_key_comment (key_file, group_name, key, error); else if (group_name != NULL) return g_key_file_get_group_comment (key_file, group_name, error); else return g_key_file_get_top_comment (key_file, error); } /** * g_key_file_remove_comment: * @key_file: a #GKeyFile * @group_name: (allow-none): a group name, or %NULL * @key: (allow-none): a key * @error: return location for a #GError * * Removes a comment above @key from @group_name. * If @key is %NULL then @comment will be removed above @group_name. * If both @key and @group_name are %NULL, then @comment will * be removed above the first group in the file. * * Returns: %TRUE if the comment was removed, %FALSE otherwise * * Since: 2.6 **/ gboolean g_key_file_remove_comment (GKeyFile *key_file, const gchar *group_name, const gchar *key, GError **error) { g_return_val_if_fail (key_file != NULL, FALSE); if (group_name != NULL && key != NULL) return g_key_file_set_key_comment (key_file, group_name, key, NULL, error); else if (group_name != NULL) return g_key_file_set_group_comment (key_file, group_name, NULL, error); else return g_key_file_set_top_comment (key_file, NULL, error); } /** * g_key_file_has_group: * @key_file: a #GKeyFile * @group_name: a group name * * Looks whether the key file has the group @group_name. * * Return value: %TRUE if @group_name is a part of @key_file, %FALSE * otherwise. * Since: 2.6 **/ gboolean g_key_file_has_group (GKeyFile *key_file, const gchar *group_name) { g_return_val_if_fail (key_file != NULL, FALSE); g_return_val_if_fail (group_name != NULL, FALSE); return g_key_file_lookup_group (key_file, group_name) != NULL; } /* This code remains from a historical attempt to add a new public API * which respects the GError rules. */ static gboolean g_key_file_has_key_full (GKeyFile *key_file, const gchar *group_name, const gchar *key, gboolean *has_key, GError **error) { GKeyFileKeyValuePair *pair; GKeyFileGroup *group; g_return_val_if_fail (key_file != NULL, FALSE); g_return_val_if_fail (group_name != NULL, FALSE); g_return_val_if_fail (key != NULL, FALSE); group = g_key_file_lookup_group (key_file, group_name); if (!group) { g_set_error (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_GROUP_NOT_FOUND, _("Key file does not have group '%s'"), group_name ? group_name : "(null)"); return FALSE; } pair = g_key_file_lookup_key_value_pair (key_file, group, key); if (has_key) *has_key = pair != NULL; return TRUE; } /** * g_key_file_has_key: (skip) * @key_file: a #GKeyFile * @group_name: a group name * @key: a key name * @error: return location for a #GError * * Looks whether the key file has the key @key in the group * @group_name. * * This function does not follow the rules for #GError strictly; * the return value both carries meaning and signals an error. To use * this function, you must pass a #GError pointer in @error, and check * whether it is not %NULL to see if an error occurred. * * Language bindings should use g_key_file_get_value() to test whether * or not a key exists. * * Return value: %TRUE if @key is a part of @group_name, %FALSE * otherwise. * * Since: 2.6 **/ gboolean g_key_file_has_key (GKeyFile *key_file, const gchar *group_name, const gchar *key, GError **error) { GError *temp_error = NULL; gboolean has_key; if (g_key_file_has_key_full (key_file, group_name, key, &has_key, &temp_error)) { return has_key; } else { g_propagate_error (error, temp_error); return FALSE; } } static void g_key_file_add_group (GKeyFile *key_file, const gchar *group_name) { GKeyFileGroup *group; g_return_if_fail (key_file != NULL); g_return_if_fail (g_key_file_is_group_name (group_name)); group = g_key_file_lookup_group (key_file, group_name); if (group != NULL) { key_file->current_group = group; return; } group = g_slice_new0 (GKeyFileGroup); group->name = g_strdup (group_name); group->lookup_map = g_hash_table_new (g_str_hash, g_str_equal); key_file->groups = g_list_prepend (key_file->groups, group); key_file->current_group = group; if (key_file->start_group == NULL) key_file->start_group = group; g_hash_table_insert (key_file->group_hash, (gpointer)group->name, group); } static void g_key_file_key_value_pair_free (GKeyFileKeyValuePair *pair) { if (pair != NULL) { g_free (pair->key); g_free (pair->value); g_slice_free (GKeyFileKeyValuePair, pair); } } /* Be careful not to call this function on a node with data in the * lookup map without removing it from the lookup map, first. * * Some current cases where this warning is not a concern are * when: * - the node being removed is a comment node * - the entire lookup map is getting destroyed soon after * anyway. */ static void g_key_file_remove_key_value_pair_node (GKeyFile *key_file, GKeyFileGroup *group, GList *pair_node) { GKeyFileKeyValuePair *pair; pair = (GKeyFileKeyValuePair *) pair_node->data; group->key_value_pairs = g_list_remove_link (group->key_value_pairs, pair_node); g_warn_if_fail (pair->value != NULL); g_key_file_key_value_pair_free (pair); g_list_free_1 (pair_node); } static void g_key_file_remove_group_node (GKeyFile *key_file, GList *group_node) { GKeyFileGroup *group; GList *tmp; group = (GKeyFileGroup *) group_node->data; if (group->name) g_hash_table_remove (key_file->group_hash, group->name); /* If the current group gets deleted make the current group the last * added group. */ if (key_file->current_group == group) { /* groups should always contain at least the top comment group, * unless g_key_file_clear has been called */ if (key_file->groups) key_file->current_group = (GKeyFileGroup *) key_file->groups->data; else key_file->current_group = NULL; } /* If the start group gets deleted make the start group the first * added group. */ if (key_file->start_group == group) { tmp = g_list_last (key_file->groups); while (tmp != NULL) { if (tmp != group_node && ((GKeyFileGroup *) tmp->data)->name != NULL) break; tmp = tmp->prev; } if (tmp) key_file->start_group = (GKeyFileGroup *) tmp->data; else key_file->start_group = NULL; } key_file->groups = g_list_remove_link (key_file->groups, group_node); tmp = group->key_value_pairs; while (tmp != NULL) { GList *pair_node; pair_node = tmp; tmp = tmp->next; g_key_file_remove_key_value_pair_node (key_file, group, pair_node); } g_warn_if_fail (group->key_value_pairs == NULL); if (group->comment) { g_key_file_key_value_pair_free (group->comment); group->comment = NULL; } if (group->lookup_map) { g_hash_table_destroy (group->lookup_map); group->lookup_map = NULL; } g_free ((gchar *) group->name); g_slice_free (GKeyFileGroup, group); g_list_free_1 (group_node); } /** * g_key_file_remove_group: * @key_file: a #GKeyFile * @group_name: a group name * @error: return location for a #GError or %NULL * * Removes the specified group, @group_name, * from the key file. * * Returns: %TRUE if the group was removed, %FALSE otherwise * * Since: 2.6 **/ gboolean g_key_file_remove_group (GKeyFile *key_file, const gchar *group_name, GError **error) { GList *group_node; g_return_val_if_fail (key_file != NULL, FALSE); g_return_val_if_fail (group_name != NULL, FALSE); group_node = g_key_file_lookup_group_node (key_file, group_name); if (!group_node) { g_set_error (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_GROUP_NOT_FOUND, _("Key file does not have group '%s'"), group_name); return FALSE; } g_key_file_remove_group_node (key_file, group_node); return TRUE; } static void g_key_file_add_key_value_pair (GKeyFile *key_file, GKeyFileGroup *group, GKeyFileKeyValuePair *pair) { g_hash_table_replace (group->lookup_map, pair->key, pair); group->key_value_pairs = g_list_prepend (group->key_value_pairs, pair); } static void g_key_file_add_key (GKeyFile *key_file, GKeyFileGroup *group, const gchar *key, const gchar *value) { GKeyFileKeyValuePair *pair; pair = g_slice_new (GKeyFileKeyValuePair); pair->key = g_strdup (key); pair->value = g_strdup (value); g_key_file_add_key_value_pair (key_file, group, pair); } /** * g_key_file_remove_key: * @key_file: a #GKeyFile * @group_name: a group name * @key: a key name to remove * @error: return location for a #GError or %NULL * * Removes @key in @group_name from the key file. * * Returns: %TRUE if the key was removed, %FALSE otherwise * * Since: 2.6 **/ gboolean g_key_file_remove_key (GKeyFile *key_file, const gchar *group_name, const gchar *key, GError **error) { GKeyFileGroup *group; GKeyFileKeyValuePair *pair; g_return_val_if_fail (key_file != NULL, FALSE); g_return_val_if_fail (group_name != NULL, FALSE); g_return_val_if_fail (key != NULL, FALSE); pair = NULL; group = g_key_file_lookup_group (key_file, group_name); if (!group) { g_set_error (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_GROUP_NOT_FOUND, _("Key file does not have group '%s'"), group_name ? group_name : "(null)"); return FALSE; } pair = g_key_file_lookup_key_value_pair (key_file, group, key); if (!pair) { g_set_error (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_KEY_NOT_FOUND, _("Key file does not have key '%s' in group '%s'"), key, group->name); return FALSE; } group->key_value_pairs = g_list_remove (group->key_value_pairs, pair); g_hash_table_remove (group->lookup_map, pair->key); g_key_file_key_value_pair_free (pair); return TRUE; } static GList * g_key_file_lookup_group_node (GKeyFile *key_file, const gchar *group_name) { GKeyFileGroup *group; GList *tmp; for (tmp = key_file->groups; tmp != NULL; tmp = tmp->next) { group = (GKeyFileGroup *) tmp->data; if (group && group->name && strcmp (group->name, group_name) == 0) break; } return tmp; } static GKeyFileGroup * g_key_file_lookup_group (GKeyFile *key_file, const gchar *group_name) { return (GKeyFileGroup *)g_hash_table_lookup (key_file->group_hash, group_name); } static GList * g_key_file_lookup_key_value_pair_node (GKeyFile *key_file, GKeyFileGroup *group, const gchar *key) { GList *key_node; for (key_node = group->key_value_pairs; key_node != NULL; key_node = key_node->next) { GKeyFileKeyValuePair *pair; pair = (GKeyFileKeyValuePair *) key_node->data; if (pair->key && strcmp (pair->key, key) == 0) break; } return key_node; } static GKeyFileKeyValuePair * g_key_file_lookup_key_value_pair (GKeyFile *key_file, GKeyFileGroup *group, const gchar *key) { return (GKeyFileKeyValuePair *) g_hash_table_lookup (group->lookup_map, key); } /* Lines starting with # or consisting entirely of whitespace are merely * recorded, not parsed. This function assumes all leading whitespace * has been stripped. */ static gboolean g_key_file_line_is_comment (const gchar *line) { return (*line == '#' || *line == '\0' || *line == '\n'); } static gboolean g_key_file_is_group_name (const gchar *name) { gchar *p, *q; if (name == NULL) return FALSE; p = q = (gchar *) name; while (*q && *q != ']' && *q != '[' && !g_ascii_iscntrl (*q)) q = g_utf8_find_next_char (q, NULL); if (*q != '\0' || q == p) return FALSE; return TRUE; } static gboolean g_key_file_is_key_name (const gchar *name) { gchar *p, *q; if (name == NULL) return FALSE; p = q = (gchar *) name; /* We accept a little more than the desktop entry spec says, * since gnome-vfs uses mime-types as keys in its cache. */ while (*q && *q != '=' && *q != '[' && *q != ']') q = g_utf8_find_next_char (q, NULL); /* No empty keys, please */ if (q == p) return FALSE; /* We accept spaces in the middle of keys to not break * existing apps, but we don't tolerate initial or final * spaces, which would lead to silent corruption when * rereading the file. */ if (*p == ' ' || q[-1] == ' ') return FALSE; if (*q == '[') { q++; while (*q && (g_unichar_isalnum (g_utf8_get_char_validated (q, -1)) || *q == '-' || *q == '_' || *q == '.' || *q == '@')) q = g_utf8_find_next_char (q, NULL); if (*q != ']') return FALSE; q++; } if (*q != '\0') return FALSE; return TRUE; } /* A group in a key file is made up of a starting '[' followed by one * or more letters making up the group name followed by ']'. */ static gboolean g_key_file_line_is_group (const gchar *line) { gchar *p; p = (gchar *) line; if (*p != '[') return FALSE; p++; while (*p && *p != ']') p = g_utf8_find_next_char (p, NULL); if (*p != ']') return FALSE; /* silently accept whitespace after the ] */ p = g_utf8_find_next_char (p, NULL); while (*p == ' ' || *p == '\t') p = g_utf8_find_next_char (p, NULL); if (*p) return FALSE; return TRUE; } static gboolean g_key_file_line_is_key_value_pair (const gchar *line) { gchar *p; p = (gchar *) g_utf8_strchr (line, -1, '='); if (!p) return FALSE; /* Key must be non-empty */ if (*p == line[0]) return FALSE; return TRUE; } static gchar * g_key_file_parse_value_as_string (GKeyFile *key_file, const gchar *value, GSList **pieces, GError **error) { gchar *string_value, *p, *q0, *q; string_value = g_new (gchar, strlen (value) + 1); p = (gchar *) value; q0 = q = string_value; while (*p) { if (*p == '\\') { p++; switch (*p) { case 's': *q = ' '; break; case 'n': *q = '\n'; break; case 't': *q = '\t'; break; case 'r': *q = '\r'; break; case '\\': *q = '\\'; break; case '\0': g_set_error_literal (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_INVALID_VALUE, _("Key file contains escape character " "at end of line")); break; default: if (pieces && *p == key_file->list_separator) *q = key_file->list_separator; else { *q++ = '\\'; *q = *p; if (*error == NULL) { gchar sequence[3]; sequence[0] = '\\'; sequence[1] = *p; sequence[2] = '\0'; g_set_error (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_INVALID_VALUE, _("Key file contains invalid escape " "sequence '%s'"), sequence); } } break; } } else { *q = *p; if (pieces && (*p == key_file->list_separator)) { *pieces = g_slist_prepend (*pieces, g_strndup (q0, q - q0)); q0 = q + 1; } } if (*p == '\0') break; q++; p++; } *q = '\0'; if (pieces) { if (q0 < q) *pieces = g_slist_prepend (*pieces, g_strndup (q0, q - q0)); *pieces = g_slist_reverse (*pieces); } return string_value; } static gchar * g_key_file_parse_string_as_value (GKeyFile *key_file, const gchar *string, gboolean escape_separator) { gchar *value, *p, *q; gsize length; gboolean parsing_leading_space; length = strlen (string) + 1; /* Worst case would be that every character needs to be escaped. * In other words every character turns to two characters */ value = g_new (gchar, 2 * length); p = (gchar *) string; q = value; parsing_leading_space = TRUE; while (p < (string + length - 1)) { gchar escaped_character[3] = { '\\', 0, 0 }; switch (*p) { case ' ': if (parsing_leading_space) { escaped_character[1] = 's'; strcpy (q, escaped_character); q += 2; } else { *q = *p; q++; } break; case '\t': if (parsing_leading_space) { escaped_character[1] = 't'; strcpy (q, escaped_character); q += 2; } else { *q = *p; q++; } break; case '\n': escaped_character[1] = 'n'; strcpy (q, escaped_character); q += 2; break; case '\r': escaped_character[1] = 'r'; strcpy (q, escaped_character); q += 2; break; case '\\': escaped_character[1] = '\\'; strcpy (q, escaped_character); q += 2; parsing_leading_space = FALSE; break; default: if (escape_separator && *p == key_file->list_separator) { escaped_character[1] = key_file->list_separator; strcpy (q, escaped_character); q += 2; parsing_leading_space = TRUE; } else { *q = *p; q++; parsing_leading_space = FALSE; } break; } p++; } *q = '\0'; return value; } static gint g_key_file_parse_value_as_integer (GKeyFile *key_file, const gchar *value, GError **error) { gchar *eof_int; glong long_value; gint int_value; errno = 0; long_value = strtol (value, &eof_int, 10); if (*value == '\0' || (*eof_int != '\0' && !g_ascii_isspace(*eof_int))) { gchar *value_utf8 = _g_utf8_make_valid (value); g_set_error (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_INVALID_VALUE, _("Value '%s' cannot be interpreted " "as a number."), value_utf8); g_free (value_utf8); return 0; } int_value = long_value; if (int_value != long_value || errno == ERANGE) { gchar *value_utf8 = _g_utf8_make_valid (value); g_set_error (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_INVALID_VALUE, _("Integer value '%s' out of range"), value_utf8); g_free (value_utf8); return 0; } return int_value; } static gchar * g_key_file_parse_integer_as_value (GKeyFile *key_file, gint value) { return g_strdup_printf ("%d", value); } static gdouble g_key_file_parse_value_as_double (GKeyFile *key_file, const gchar *value, GError **error) { gchar *end_of_valid_d; gdouble double_value = 0; double_value = g_ascii_strtod (value, &end_of_valid_d); if (*end_of_valid_d != '\0' || end_of_valid_d == value) { gchar *value_utf8 = _g_utf8_make_valid (value); g_set_error (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_INVALID_VALUE, _("Value '%s' cannot be interpreted " "as a float number."), value_utf8); g_free (value_utf8); } return double_value; } static gboolean g_key_file_parse_value_as_boolean (GKeyFile *key_file, const gchar *value, GError **error) { gchar *value_utf8; if (strcmp (value, "true") == 0 || strcmp (value, "1") == 0) return TRUE; else if (strcmp (value, "false") == 0 || strcmp (value, "0") == 0) return FALSE; value_utf8 = _g_utf8_make_valid (value); g_set_error (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_INVALID_VALUE, _("Value '%s' cannot be interpreted " "as a boolean."), value_utf8); g_free (value_utf8); return FALSE; } static gchar * g_key_file_parse_boolean_as_value (GKeyFile *key_file, gboolean value) { if (value) return g_strdup ("true"); else return g_strdup ("false"); } static gchar * g_key_file_parse_value_as_comment (GKeyFile *key_file, const gchar *value) { GString *string; gchar **lines; gsize i; string = g_string_sized_new (512); lines = g_strsplit (value, "\n", 0); for (i = 0; lines[i] != NULL; i++) { if (lines[i][0] != '#') g_string_append_printf (string, "%s\n", lines[i]); else g_string_append_printf (string, "%s\n", lines[i] + 1); } g_strfreev (lines); return g_string_free (string, FALSE); } static gchar * g_key_file_parse_comment_as_value (GKeyFile *key_file, const gchar *comment) { GString *string; gchar **lines; gsize i; string = g_string_sized_new (512); lines = g_strsplit (comment, "\n", 0); for (i = 0; lines[i] != NULL; i++) g_string_append_printf (string, "#%s%s", lines[i], lines[i + 1] == NULL? "" : "\n"); g_strfreev (lines); return g_string_free (string, FALSE); } pkg-config-0.29.1/glib/glib/gchecksum.c0000664000175000017500000014467712651243552014551 00000000000000/* gchecksum.h - data hashing functions * * Copyright (C) 2007 Emmanuele Bassi * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "config.h" #include #include "gchecksum.h" #include "gslice.h" #include "gmem.h" #include "gstrfuncs.h" #include "gtestutils.h" #include "gtypes.h" #include "glibintl.h" /** * SECTION:checksum * @title: Data Checksums * @short_description: computes the checksum for data * * GLib provides a generic API for computing checksums (or "digests") * for a sequence of arbitrary bytes, using various hashing algorithms * like MD5, SHA-1 and SHA-256. Checksums are commonly used in various * environments and specifications. * * GLib supports incremental checksums using the GChecksum data * structure, by calling g_checksum_update() as long as there's data * available and then using g_checksum_get_string() or * g_checksum_get_digest() to compute the checksum and return it either * as a string in hexadecimal form, or as a raw sequence of bytes. To * compute the checksum for binary blobs and NUL-terminated strings in * one go, use the convenience functions g_compute_checksum_for_data() * and g_compute_checksum_for_string(), respectively. * * Support for checksums has been added in GLib 2.16 **/ #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"; #define MD5_DATASIZE 64 #define MD5_DIGEST_LEN 16 typedef struct { guint32 buf[4]; guint32 bits[2]; union { guchar data[MD5_DATASIZE]; guint32 data32[MD5_DATASIZE / 4]; } u; guchar digest[MD5_DIGEST_LEN]; } Md5sum; #define SHA1_DATASIZE 64 #define SHA1_DIGEST_LEN 20 typedef struct { guint32 buf[5]; guint32 bits[2]; /* we pack 64 unsigned chars into 16 32-bit unsigned integers */ guint32 data[16]; guchar digest[SHA1_DIGEST_LEN]; } Sha1sum; #define SHA256_DATASIZE 64 #define SHA256_DIGEST_LEN 32 typedef struct { guint32 buf[8]; guint32 bits[2]; guint8 data[SHA256_DATASIZE]; 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; gchar *digest_str; union { Md5sum md5; Sha1sum sha1; Sha256sum sha256; Sha512sum sha512; } sum; }; /* we need different byte swapping functions because MD5 expects buffers * to be little-endian, while SHA1 and SHA256 expect them in big-endian * form. */ #if G_BYTE_ORDER == G_LITTLE_ENDIAN #define md5_byte_reverse(buffer,length) #else /* assume that the passed buffer is integer aligned */ static inline void md5_byte_reverse (guchar *buffer, gulong length) { guint32 bit; do { bit = (guint32) ((unsigned) buffer[3] << 8 | buffer[2]) << 16 | ((unsigned) buffer[1] << 8 | buffer[0]); * (guint32 *) buffer = bit; buffer += 4; } while (--length); } #endif /* G_BYTE_ORDER == G_LITTLE_ENDIAN */ #if G_BYTE_ORDER == G_BIG_ENDIAN #define sha_byte_reverse(buffer,length) #else static inline void sha_byte_reverse (guint32 *buffer, gint length) { length /= sizeof (guint32); while (length--) { *buffer = GUINT32_SWAP_LE_BE (*buffer); ++buffer; } } #endif /* G_BYTE_ORDER == G_BIG_ENDIAN */ static gchar * digest_to_string (guint8 *digest, gsize digest_len) { gint len = digest_len * 2; gint i; gchar *retval; retval = g_new (gchar, len + 1); for (i = 0; i < digest_len; i++) { guint8 byte = digest[i]; retval[2 * i] = hex_digits[byte >> 4]; retval[2 * i + 1] = hex_digits[byte & 0xf]; } retval[len] = 0; return retval; } /* * MD5 Checksum */ /* This MD5 digest computation is based on the equivalent code * written by Colin Plumb. It came with this notice: * * This code implements the MD5 message-digest algorithm. * The algorithm is due to Ron Rivest. This code was * written by Colin Plumb in 1993, no copyright is claimed. * This code is in the public domain; do with it what you wish. * * Equivalent code is available from RSA Data Security, Inc. * This code has been tested against that, and is equivalent, * except that you don't need to include two pages of legalese * with every copy. */ static void md5_sum_init (Md5sum *md5) { /* arbitrary constants */ md5->buf[0] = 0x67452301; md5->buf[1] = 0xefcdab89; md5->buf[2] = 0x98badcfe; md5->buf[3] = 0x10325476; md5->bits[0] = md5->bits[1] = 0; } /* * The core of the MD5 algorithm, this alters an existing MD5 hash to * reflect the addition of 16 longwords of new data. md5_sum_update() * blocks the data and converts bytes into longwords for this routine. */ static void md5_transform (guint32 buf[4], guint32 const in[16]) { register guint32 a, b, c, d; /* The four core functions - F1 is optimized somewhat */ #define F1(x, y, z) (z ^ (x & (y ^ z))) #define F2(x, y, z) F1 (z, x, y) #define F3(x, y, z) (x ^ y ^ z) #define F4(x, y, z) (y ^ (x | ~z)) /* This is the central step in the MD5 algorithm. */ #define md5_step(f, w, x, y, z, data, s) \ ( w += f (x, y, z) + data, w = w << s | w >> (32 - s), w += x ) a = buf[0]; b = buf[1]; c = buf[2]; d = buf[3]; md5_step (F1, a, b, c, d, in[0] + 0xd76aa478, 7); md5_step (F1, d, a, b, c, in[1] + 0xe8c7b756, 12); md5_step (F1, c, d, a, b, in[2] + 0x242070db, 17); md5_step (F1, b, c, d, a, in[3] + 0xc1bdceee, 22); md5_step (F1, a, b, c, d, in[4] + 0xf57c0faf, 7); md5_step (F1, d, a, b, c, in[5] + 0x4787c62a, 12); md5_step (F1, c, d, a, b, in[6] + 0xa8304613, 17); md5_step (F1, b, c, d, a, in[7] + 0xfd469501, 22); md5_step (F1, a, b, c, d, in[8] + 0x698098d8, 7); md5_step (F1, d, a, b, c, in[9] + 0x8b44f7af, 12); md5_step (F1, c, d, a, b, in[10] + 0xffff5bb1, 17); md5_step (F1, b, c, d, a, in[11] + 0x895cd7be, 22); md5_step (F1, a, b, c, d, in[12] + 0x6b901122, 7); md5_step (F1, d, a, b, c, in[13] + 0xfd987193, 12); md5_step (F1, c, d, a, b, in[14] + 0xa679438e, 17); md5_step (F1, b, c, d, a, in[15] + 0x49b40821, 22); md5_step (F2, a, b, c, d, in[1] + 0xf61e2562, 5); md5_step (F2, d, a, b, c, in[6] + 0xc040b340, 9); md5_step (F2, c, d, a, b, in[11] + 0x265e5a51, 14); md5_step (F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20); md5_step (F2, a, b, c, d, in[5] + 0xd62f105d, 5); md5_step (F2, d, a, b, c, in[10] + 0x02441453, 9); md5_step (F2, c, d, a, b, in[15] + 0xd8a1e681, 14); md5_step (F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20); md5_step (F2, a, b, c, d, in[9] + 0x21e1cde6, 5); md5_step (F2, d, a, b, c, in[14] + 0xc33707d6, 9); md5_step (F2, c, d, a, b, in[3] + 0xf4d50d87, 14); md5_step (F2, b, c, d, a, in[8] + 0x455a14ed, 20); md5_step (F2, a, b, c, d, in[13] + 0xa9e3e905, 5); md5_step (F2, d, a, b, c, in[2] + 0xfcefa3f8, 9); md5_step (F2, c, d, a, b, in[7] + 0x676f02d9, 14); md5_step (F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20); md5_step (F3, a, b, c, d, in[5] + 0xfffa3942, 4); md5_step (F3, d, a, b, c, in[8] + 0x8771f681, 11); md5_step (F3, c, d, a, b, in[11] + 0x6d9d6122, 16); md5_step (F3, b, c, d, a, in[14] + 0xfde5380c, 23); md5_step (F3, a, b, c, d, in[1] + 0xa4beea44, 4); md5_step (F3, d, a, b, c, in[4] + 0x4bdecfa9, 11); md5_step (F3, c, d, a, b, in[7] + 0xf6bb4b60, 16); md5_step (F3, b, c, d, a, in[10] + 0xbebfbc70, 23); md5_step (F3, a, b, c, d, in[13] + 0x289b7ec6, 4); md5_step (F3, d, a, b, c, in[0] + 0xeaa127fa, 11); md5_step (F3, c, d, a, b, in[3] + 0xd4ef3085, 16); md5_step (F3, b, c, d, a, in[6] + 0x04881d05, 23); md5_step (F3, a, b, c, d, in[9] + 0xd9d4d039, 4); md5_step (F3, d, a, b, c, in[12] + 0xe6db99e5, 11); md5_step (F3, c, d, a, b, in[15] + 0x1fa27cf8, 16); md5_step (F3, b, c, d, a, in[2] + 0xc4ac5665, 23); md5_step (F4, a, b, c, d, in[0] + 0xf4292244, 6); md5_step (F4, d, a, b, c, in[7] + 0x432aff97, 10); md5_step (F4, c, d, a, b, in[14] + 0xab9423a7, 15); md5_step (F4, b, c, d, a, in[5] + 0xfc93a039, 21); md5_step (F4, a, b, c, d, in[12] + 0x655b59c3, 6); md5_step (F4, d, a, b, c, in[3] + 0x8f0ccc92, 10); md5_step (F4, c, d, a, b, in[10] + 0xffeff47d, 15); md5_step (F4, b, c, d, a, in[1] + 0x85845dd1, 21); md5_step (F4, a, b, c, d, in[8] + 0x6fa87e4f, 6); md5_step (F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10); md5_step (F4, c, d, a, b, in[6] + 0xa3014314, 15); md5_step (F4, b, c, d, a, in[13] + 0x4e0811a1, 21); md5_step (F4, a, b, c, d, in[4] + 0xf7537e82, 6); md5_step (F4, d, a, b, c, in[11] + 0xbd3af235, 10); md5_step (F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15); md5_step (F4, b, c, d, a, in[9] + 0xeb86d391, 21); buf[0] += a; buf[1] += b; buf[2] += c; buf[3] += d; #undef F1 #undef F2 #undef F3 #undef F4 #undef md5_step } static void md5_sum_update (Md5sum *md5, const guchar *data, gsize length) { guint32 bit; bit = md5->bits[0]; md5->bits[0] = bit + ((guint32) length << 3); /* carry from low to high */ if (md5->bits[0] < bit) md5->bits[1] += 1; md5->bits[1] += length >> 29; /* bytes already in Md5sum->u.data */ bit = (bit >> 3) & 0x3f; /* handle any leading odd-sized chunks */ if (bit) { guchar *p = md5->u.data + bit; bit = MD5_DATASIZE - bit; if (length < bit) { memcpy (p, data, length); return; } memcpy (p, data, bit); md5_byte_reverse (md5->u.data, 16); md5_transform (md5->buf, md5->u.data32); data += bit; length -= bit; } /* process data in 64-byte chunks */ while (length >= MD5_DATASIZE) { memcpy (md5->u.data, data, MD5_DATASIZE); md5_byte_reverse (md5->u.data, 16); md5_transform (md5->buf, md5->u.data32); data += MD5_DATASIZE; length -= MD5_DATASIZE; } /* handle any remaining bytes of data */ memcpy (md5->u.data, data, length); } /* closes a checksum */ static void md5_sum_close (Md5sum *md5) { guint count; guchar *p; /* Compute number of bytes mod 64 */ count = (md5->bits[0] >> 3) & 0x3F; /* Set the first char of padding to 0x80. * This is safe since there is always at least one byte free */ p = md5->u.data + count; *p++ = 0x80; /* Bytes of padding needed to make 64 bytes */ count = MD5_DATASIZE - 1 - count; /* Pad out to 56 mod 64 */ if (count < 8) { /* Two lots of padding: Pad the first block to 64 bytes */ memset (p, 0, count); md5_byte_reverse (md5->u.data, 16); md5_transform (md5->buf, md5->u.data32); /* Now fill the next block with 56 bytes */ memset (md5->u.data, 0, MD5_DATASIZE - 8); } else { /* Pad block to 56 bytes */ memset (p, 0, count - 8); } md5_byte_reverse (md5->u.data, 14); /* Append length in bits and transform */ md5->u.data32[14] = md5->bits[0]; md5->u.data32[15] = md5->bits[1]; md5_transform (md5->buf, md5->u.data32); md5_byte_reverse ((guchar *) md5->buf, 4); memcpy (md5->digest, md5->buf, 16); /* Reset buffers in case they contain sensitive data */ memset (md5->buf, 0, sizeof (md5->buf)); memset (md5->u.data, 0, sizeof (md5->u.data)); } static gchar * md5_sum_to_string (Md5sum *md5) { return digest_to_string (md5->digest, MD5_DIGEST_LEN); } static void md5_sum_digest (Md5sum *md5, guint8 *digest) { gint i; for (i = 0; i < MD5_DIGEST_LEN; i++) digest[i] = md5->digest[i]; } /* * SHA-1 Checksum */ /* The following implementation comes from D-Bus dbus-sha.c. I've changed * it to use GLib types and to work more like the MD5 implementation above. * I left the comments to have an history of this code. * -- Emmanuele Bassi, ebassi@gnome.org */ /* The following comments have the history of where this code * comes from. I actually copied it from GNet in GNOME CVS. * - hp@redhat.com */ /* * sha.h : Implementation of the Secure Hash Algorithm * * Part of the Python Cryptography Toolkit, version 1.0.0 * * Copyright (C) 1995, A.M. Kuchling * * Distribute and use freely; there are no restrictions on further * dissemination and usage except those imposed by the laws of your * country of residence. * */ /* SHA: NIST's Secure Hash Algorithm */ /* Based on SHA code originally posted to sci.crypt by Peter Gutmann in message <30ajo5$oe8@ccu2.auckland.ac.nz>. Modified to test for endianness on creation of SHA objects by AMK. Also, the original specification of SHA was found to have a weakness by NSA/NIST. This code implements the fixed version of SHA. */ /* Here's the first paragraph of Peter Gutmann's posting: The following is my SHA (FIPS 180) code updated to allow use of the "fixed" SHA, thanks to Jim Gillogly and an anonymous contributor for the information on what's changed in the new version. The fix is a simple change which involves adding a single rotate in the initial expansion function. It is unknown whether this is an optimal solution to the problem which was discovered in the SHA or whether it's simply a bandaid which fixes the problem with a minimum of effort (for example the reengineering of a great many Capstone chips). */ static void sha1_sum_init (Sha1sum *sha1) { /* initialize constants */ sha1->buf[0] = 0x67452301L; sha1->buf[1] = 0xEFCDAB89L; sha1->buf[2] = 0x98BADCFEL; sha1->buf[3] = 0x10325476L; sha1->buf[4] = 0xC3D2E1F0L; /* initialize bits */ sha1->bits[0] = sha1->bits[1] = 0; } /* The SHA f()-functions. */ #define f1(x,y,z) (z ^ (x & (y ^ z))) /* Rounds 0-19 */ #define f2(x,y,z) (x ^ y ^ z) /* Rounds 20-39 */ #define f3(x,y,z) (( x & y) | (z & (x | y))) /* Rounds 40-59 */ #define f4(x,y,z) (x ^ y ^ z) /* Rounds 60-79 */ /* The SHA Mysterious Constants */ #define K1 0x5A827999L /* Rounds 0-19 */ #define K2 0x6ED9EBA1L /* Rounds 20-39 */ #define K3 0x8F1BBCDCL /* Rounds 40-59 */ #define K4 0xCA62C1D6L /* Rounds 60-79 */ /* 32-bit rotate left - kludged with shifts */ #define ROTL(n,X) (((X) << n ) | ((X) >> (32 - n))) /* The initial expanding function. The hash function is defined over an 80-word expanded input array W, where the first 16 are copies of the input data, and the remaining 64 are defined by W[ i ] = W[ i - 16 ] ^ W[ i - 14 ] ^ W[ i - 8 ] ^ W[ i - 3 ] This implementation generates these values on the fly in a circular buffer - thanks to Colin Plumb, colin@nyx10.cs.du.edu for this optimization. The updated SHA changes the expanding function by adding a rotate of 1 bit. Thanks to Jim Gillogly, jim@rand.org, and an anonymous contributor for this information */ #define expand(W,i) (W[ i & 15 ] = ROTL (1, (W[ i & 15] ^ \ W[(i - 14) & 15] ^ \ W[(i - 8) & 15] ^ \ W[(i - 3) & 15]))) /* The prototype SHA sub-round. The fundamental sub-round is: a' = e + ROTL( 5, a ) + f( b, c, d ) + k + data; b' = a; c' = ROTL( 30, b ); d' = c; e' = d; but this is implemented by unrolling the loop 5 times and renaming the variables ( e, a, b, c, d ) = ( a', b', c', d', e' ) each iteration. This code is then replicated 20 times for each of the 4 functions, using the next 20 values from the W[] array each time */ #define subRound(a, b, c, d, e, f, k, data) \ (e += ROTL (5, a) + f(b, c, d) + k + data, b = ROTL (30, b)) static void sha1_transform (guint32 buf[5], guint32 in[16]) { guint32 A, B, C, D, E; A = buf[0]; B = buf[1]; C = buf[2]; D = buf[3]; E = buf[4]; /* Heavy mangling, in 4 sub-rounds of 20 iterations each. */ subRound (A, B, C, D, E, f1, K1, in[0]); subRound (E, A, B, C, D, f1, K1, in[1]); subRound (D, E, A, B, C, f1, K1, in[2]); subRound (C, D, E, A, B, f1, K1, in[3]); subRound (B, C, D, E, A, f1, K1, in[4]); subRound (A, B, C, D, E, f1, K1, in[5]); subRound (E, A, B, C, D, f1, K1, in[6]); subRound (D, E, A, B, C, f1, K1, in[7]); subRound (C, D, E, A, B, f1, K1, in[8]); subRound (B, C, D, E, A, f1, K1, in[9]); subRound (A, B, C, D, E, f1, K1, in[10]); subRound (E, A, B, C, D, f1, K1, in[11]); subRound (D, E, A, B, C, f1, K1, in[12]); subRound (C, D, E, A, B, f1, K1, in[13]); subRound (B, C, D, E, A, f1, K1, in[14]); subRound (A, B, C, D, E, f1, K1, in[15]); subRound (E, A, B, C, D, f1, K1, expand (in, 16)); subRound (D, E, A, B, C, f1, K1, expand (in, 17)); subRound (C, D, E, A, B, f1, K1, expand (in, 18)); subRound (B, C, D, E, A, f1, K1, expand (in, 19)); subRound (A, B, C, D, E, f2, K2, expand (in, 20)); subRound (E, A, B, C, D, f2, K2, expand (in, 21)); subRound (D, E, A, B, C, f2, K2, expand (in, 22)); subRound (C, D, E, A, B, f2, K2, expand (in, 23)); subRound (B, C, D, E, A, f2, K2, expand (in, 24)); subRound (A, B, C, D, E, f2, K2, expand (in, 25)); subRound (E, A, B, C, D, f2, K2, expand (in, 26)); subRound (D, E, A, B, C, f2, K2, expand (in, 27)); subRound (C, D, E, A, B, f2, K2, expand (in, 28)); subRound (B, C, D, E, A, f2, K2, expand (in, 29)); subRound (A, B, C, D, E, f2, K2, expand (in, 30)); subRound (E, A, B, C, D, f2, K2, expand (in, 31)); subRound (D, E, A, B, C, f2, K2, expand (in, 32)); subRound (C, D, E, A, B, f2, K2, expand (in, 33)); subRound (B, C, D, E, A, f2, K2, expand (in, 34)); subRound (A, B, C, D, E, f2, K2, expand (in, 35)); subRound (E, A, B, C, D, f2, K2, expand (in, 36)); subRound (D, E, A, B, C, f2, K2, expand (in, 37)); subRound (C, D, E, A, B, f2, K2, expand (in, 38)); subRound (B, C, D, E, A, f2, K2, expand (in, 39)); subRound (A, B, C, D, E, f3, K3, expand (in, 40)); subRound (E, A, B, C, D, f3, K3, expand (in, 41)); subRound (D, E, A, B, C, f3, K3, expand (in, 42)); subRound (C, D, E, A, B, f3, K3, expand (in, 43)); subRound (B, C, D, E, A, f3, K3, expand (in, 44)); subRound (A, B, C, D, E, f3, K3, expand (in, 45)); subRound (E, A, B, C, D, f3, K3, expand (in, 46)); subRound (D, E, A, B, C, f3, K3, expand (in, 47)); subRound (C, D, E, A, B, f3, K3, expand (in, 48)); subRound (B, C, D, E, A, f3, K3, expand (in, 49)); subRound (A, B, C, D, E, f3, K3, expand (in, 50)); subRound (E, A, B, C, D, f3, K3, expand (in, 51)); subRound (D, E, A, B, C, f3, K3, expand (in, 52)); subRound (C, D, E, A, B, f3, K3, expand (in, 53)); subRound (B, C, D, E, A, f3, K3, expand (in, 54)); subRound (A, B, C, D, E, f3, K3, expand (in, 55)); subRound (E, A, B, C, D, f3, K3, expand (in, 56)); subRound (D, E, A, B, C, f3, K3, expand (in, 57)); subRound (C, D, E, A, B, f3, K3, expand (in, 58)); subRound (B, C, D, E, A, f3, K3, expand (in, 59)); subRound (A, B, C, D, E, f4, K4, expand (in, 60)); subRound (E, A, B, C, D, f4, K4, expand (in, 61)); subRound (D, E, A, B, C, f4, K4, expand (in, 62)); subRound (C, D, E, A, B, f4, K4, expand (in, 63)); subRound (B, C, D, E, A, f4, K4, expand (in, 64)); subRound (A, B, C, D, E, f4, K4, expand (in, 65)); subRound (E, A, B, C, D, f4, K4, expand (in, 66)); subRound (D, E, A, B, C, f4, K4, expand (in, 67)); subRound (C, D, E, A, B, f4, K4, expand (in, 68)); subRound (B, C, D, E, A, f4, K4, expand (in, 69)); subRound (A, B, C, D, E, f4, K4, expand (in, 70)); subRound (E, A, B, C, D, f4, K4, expand (in, 71)); subRound (D, E, A, B, C, f4, K4, expand (in, 72)); subRound (C, D, E, A, B, f4, K4, expand (in, 73)); subRound (B, C, D, E, A, f4, K4, expand (in, 74)); subRound (A, B, C, D, E, f4, K4, expand (in, 75)); subRound (E, A, B, C, D, f4, K4, expand (in, 76)); subRound (D, E, A, B, C, f4, K4, expand (in, 77)); subRound (C, D, E, A, B, f4, K4, expand (in, 78)); subRound (B, C, D, E, A, f4, K4, expand (in, 79)); /* Build message digest */ buf[0] += A; buf[1] += B; buf[2] += C; buf[3] += D; buf[4] += E; } #undef K1 #undef K2 #undef K3 #undef K4 #undef f1 #undef f2 #undef f3 #undef f4 #undef ROTL #undef expand #undef subRound static void sha1_sum_update (Sha1sum *sha1, const guchar *buffer, gsize count) { guint32 tmp; guint dataCount; /* Update bitcount */ tmp = sha1->bits[0]; if ((sha1->bits[0] = tmp + ((guint32) count << 3) ) < tmp) sha1->bits[1] += 1; /* Carry from low to high */ sha1->bits[1] += count >> 29; /* Get count of bytes already in data */ dataCount = (guint) (tmp >> 3) & 0x3F; /* Handle any leading odd-sized chunks */ if (dataCount) { guchar *p = (guchar *) sha1->data + dataCount; dataCount = SHA1_DATASIZE - dataCount; if (count < dataCount) { memcpy (p, buffer, count); return; } memcpy (p, buffer, dataCount); sha_byte_reverse (sha1->data, SHA1_DATASIZE); sha1_transform (sha1->buf, sha1->data); buffer += dataCount; count -= dataCount; } /* Process data in SHA1_DATASIZE chunks */ while (count >= SHA1_DATASIZE) { memcpy (sha1->data, buffer, SHA1_DATASIZE); sha_byte_reverse (sha1->data, SHA1_DATASIZE); sha1_transform (sha1->buf, sha1->data); buffer += SHA1_DATASIZE; count -= SHA1_DATASIZE; } /* Handle any remaining bytes of data. */ memcpy (sha1->data, buffer, count); } /* Final wrapup - pad to SHA_DATASIZE-byte boundary with the bit pattern 1 0* (64-bit count of bits processed, MSB-first) */ static void sha1_sum_close (Sha1sum *sha1) { gint count; guchar *data_p; /* Compute number of bytes mod 64 */ count = (gint) ((sha1->bits[0] >> 3) & 0x3f); /* Set the first char of padding to 0x80. This is safe since there is always at least one byte free */ data_p = (guchar *) sha1->data + count; *data_p++ = 0x80; /* Bytes of padding needed to make 64 bytes */ count = SHA1_DATASIZE - 1 - count; /* Pad out to 56 mod 64 */ if (count < 8) { /* Two lots of padding: Pad the first block to 64 bytes */ memset (data_p, 0, count); sha_byte_reverse (sha1->data, SHA1_DATASIZE); sha1_transform (sha1->buf, sha1->data); /* Now fill the next block with 56 bytes */ memset (sha1->data, 0, SHA1_DATASIZE - 8); } else { /* Pad block to 56 bytes */ memset (data_p, 0, count - 8); } /* Append length in bits and transform */ sha1->data[14] = sha1->bits[1]; sha1->data[15] = sha1->bits[0]; sha_byte_reverse (sha1->data, SHA1_DATASIZE - 8); sha1_transform (sha1->buf, sha1->data); sha_byte_reverse (sha1->buf, SHA1_DIGEST_LEN); memcpy (sha1->digest, sha1->buf, SHA1_DIGEST_LEN); /* Reset buffers in case they contain sensitive data */ memset (sha1->buf, 0, sizeof (sha1->buf)); memset (sha1->data, 0, sizeof (sha1->data)); } static gchar * sha1_sum_to_string (Sha1sum *sha1) { return digest_to_string (sha1->digest, SHA1_DIGEST_LEN); } static void sha1_sum_digest (Sha1sum *sha1, guint8 *digest) { gint i; for (i = 0; i < SHA1_DIGEST_LEN; i++) digest[i] = sha1->digest[i]; } /* * SHA-256 Checksum */ /* adapted from the SHA256 implementation in gsk/src/hash/gskhash.c. * * Copyright (C) 2006 Dave Benson * Released under the terms of the GNU Lesser General Public License */ static void sha256_sum_init (Sha256sum *sha256) { sha256->buf[0] = 0x6a09e667; sha256->buf[1] = 0xbb67ae85; sha256->buf[2] = 0x3c6ef372; sha256->buf[3] = 0xa54ff53a; sha256->buf[4] = 0x510e527f; sha256->buf[5] = 0x9b05688c; sha256->buf[6] = 0x1f83d9ab; sha256->buf[7] = 0x5be0cd19; sha256->bits[0] = sha256->bits[1] = 0; } #define GET_UINT32(n,b,i) G_STMT_START{ \ (n) = ((guint32) (b)[(i) ] << 24) \ | ((guint32) (b)[(i) + 1] << 16) \ | ((guint32) (b)[(i) + 2] << 8) \ | ((guint32) (b)[(i) + 3] ); } G_STMT_END #define PUT_UINT32(n,b,i) G_STMT_START{ \ (b)[(i) ] = (guint8) ((n) >> 24); \ (b)[(i) + 1] = (guint8) ((n) >> 16); \ (b)[(i) + 2] = (guint8) ((n) >> 8); \ (b)[(i) + 3] = (guint8) ((n) ); } G_STMT_END static void sha256_transform (guint32 buf[8], guint8 const data[64]) { guint32 temp1, temp2, W[64]; guint32 A, B, C, D, E, F, G, H; GET_UINT32 (W[0], data, 0); GET_UINT32 (W[1], data, 4); GET_UINT32 (W[2], data, 8); GET_UINT32 (W[3], data, 12); GET_UINT32 (W[4], data, 16); GET_UINT32 (W[5], data, 20); GET_UINT32 (W[6], data, 24); GET_UINT32 (W[7], data, 28); GET_UINT32 (W[8], data, 32); GET_UINT32 (W[9], data, 36); GET_UINT32 (W[10], data, 40); GET_UINT32 (W[11], data, 44); GET_UINT32 (W[12], data, 48); GET_UINT32 (W[13], data, 52); GET_UINT32 (W[14], data, 56); GET_UINT32 (W[15], data, 60); #define SHR(x,n) ((x & 0xFFFFFFFF) >> n) #define ROTR(x,n) (SHR (x,n) | (x << (32 - n))) #define S0(x) (ROTR (x, 7) ^ ROTR (x,18) ^ SHR (x, 3)) #define S1(x) (ROTR (x,17) ^ ROTR (x,19) ^ SHR (x,10)) #define S2(x) (ROTR (x, 2) ^ ROTR (x,13) ^ ROTR (x,22)) #define S3(x) (ROTR (x, 6) ^ ROTR (x,11) ^ ROTR (x,25)) #define F0(x,y,z) ((x & y) | (z & (x | y))) #define F1(x,y,z) (z ^ (x & (y ^ z))) #define R(t) (W[t] = S1(W[t - 2]) + W[t - 7] + \ S0(W[t - 15]) + W[t - 16]) #define P(a,b,c,d,e,f,g,h,x,K) G_STMT_START { \ temp1 = h + S3(e) + F1(e,f,g) + K + x; \ temp2 = S2(a) + F0(a,b,c); \ d += temp1; h = temp1 + temp2; } G_STMT_END A = buf[0]; B = buf[1]; C = buf[2]; D = buf[3]; E = buf[4]; F = buf[5]; G = buf[6]; H = buf[7]; P (A, B, C, D, E, F, G, H, W[ 0], 0x428A2F98); P (H, A, B, C, D, E, F, G, W[ 1], 0x71374491); P (G, H, A, B, C, D, E, F, W[ 2], 0xB5C0FBCF); P (F, G, H, A, B, C, D, E, W[ 3], 0xE9B5DBA5); P (E, F, G, H, A, B, C, D, W[ 4], 0x3956C25B); P (D, E, F, G, H, A, B, C, W[ 5], 0x59F111F1); P (C, D, E, F, G, H, A, B, W[ 6], 0x923F82A4); P (B, C, D, E, F, G, H, A, W[ 7], 0xAB1C5ED5); P (A, B, C, D, E, F, G, H, W[ 8], 0xD807AA98); P (H, A, B, C, D, E, F, G, W[ 9], 0x12835B01); P (G, H, A, B, C, D, E, F, W[10], 0x243185BE); P (F, G, H, A, B, C, D, E, W[11], 0x550C7DC3); P (E, F, G, H, A, B, C, D, W[12], 0x72BE5D74); P (D, E, F, G, H, A, B, C, W[13], 0x80DEB1FE); P (C, D, E, F, G, H, A, B, W[14], 0x9BDC06A7); P (B, C, D, E, F, G, H, A, W[15], 0xC19BF174); P (A, B, C, D, E, F, G, H, R(16), 0xE49B69C1); P (H, A, B, C, D, E, F, G, R(17), 0xEFBE4786); P (G, H, A, B, C, D, E, F, R(18), 0x0FC19DC6); P (F, G, H, A, B, C, D, E, R(19), 0x240CA1CC); P (E, F, G, H, A, B, C, D, R(20), 0x2DE92C6F); P (D, E, F, G, H, A, B, C, R(21), 0x4A7484AA); P (C, D, E, F, G, H, A, B, R(22), 0x5CB0A9DC); P (B, C, D, E, F, G, H, A, R(23), 0x76F988DA); P (A, B, C, D, E, F, G, H, R(24), 0x983E5152); P (H, A, B, C, D, E, F, G, R(25), 0xA831C66D); P (G, H, A, B, C, D, E, F, R(26), 0xB00327C8); P (F, G, H, A, B, C, D, E, R(27), 0xBF597FC7); P (E, F, G, H, A, B, C, D, R(28), 0xC6E00BF3); P (D, E, F, G, H, A, B, C, R(29), 0xD5A79147); P (C, D, E, F, G, H, A, B, R(30), 0x06CA6351); P (B, C, D, E, F, G, H, A, R(31), 0x14292967); P (A, B, C, D, E, F, G, H, R(32), 0x27B70A85); P (H, A, B, C, D, E, F, G, R(33), 0x2E1B2138); P (G, H, A, B, C, D, E, F, R(34), 0x4D2C6DFC); P (F, G, H, A, B, C, D, E, R(35), 0x53380D13); P (E, F, G, H, A, B, C, D, R(36), 0x650A7354); P (D, E, F, G, H, A, B, C, R(37), 0x766A0ABB); P (C, D, E, F, G, H, A, B, R(38), 0x81C2C92E); P (B, C, D, E, F, G, H, A, R(39), 0x92722C85); P (A, B, C, D, E, F, G, H, R(40), 0xA2BFE8A1); P (H, A, B, C, D, E, F, G, R(41), 0xA81A664B); P (G, H, A, B, C, D, E, F, R(42), 0xC24B8B70); P (F, G, H, A, B, C, D, E, R(43), 0xC76C51A3); P (E, F, G, H, A, B, C, D, R(44), 0xD192E819); P (D, E, F, G, H, A, B, C, R(45), 0xD6990624); P (C, D, E, F, G, H, A, B, R(46), 0xF40E3585); P (B, C, D, E, F, G, H, A, R(47), 0x106AA070); P (A, B, C, D, E, F, G, H, R(48), 0x19A4C116); P (H, A, B, C, D, E, F, G, R(49), 0x1E376C08); P (G, H, A, B, C, D, E, F, R(50), 0x2748774C); P (F, G, H, A, B, C, D, E, R(51), 0x34B0BCB5); P (E, F, G, H, A, B, C, D, R(52), 0x391C0CB3); P (D, E, F, G, H, A, B, C, R(53), 0x4ED8AA4A); P (C, D, E, F, G, H, A, B, R(54), 0x5B9CCA4F); P (B, C, D, E, F, G, H, A, R(55), 0x682E6FF3); P (A, B, C, D, E, F, G, H, R(56), 0x748F82EE); P (H, A, B, C, D, E, F, G, R(57), 0x78A5636F); P (G, H, A, B, C, D, E, F, R(58), 0x84C87814); P (F, G, H, A, B, C, D, E, R(59), 0x8CC70208); P (E, F, G, H, A, B, C, D, R(60), 0x90BEFFFA); P (D, E, F, G, H, A, B, C, R(61), 0xA4506CEB); P (C, D, E, F, G, H, A, B, R(62), 0xBEF9A3F7); P (B, C, D, E, F, G, H, A, R(63), 0xC67178F2); #undef SHR #undef ROTR #undef S0 #undef S1 #undef S2 #undef S3 #undef F0 #undef F1 #undef R #undef P buf[0] += A; buf[1] += B; buf[2] += C; buf[3] += D; buf[4] += E; buf[5] += F; buf[6] += G; buf[7] += H; } static void sha256_sum_update (Sha256sum *sha256, const guchar *buffer, gsize length) { guint32 left, fill; const guint8 *input = buffer; if (length == 0) return; left = sha256->bits[0] & 0x3F; fill = 64 - left; sha256->bits[0] += length; sha256->bits[0] &= 0xFFFFFFFF; if (sha256->bits[0] < length) sha256->bits[1]++; if (left > 0 && length >= fill) { memcpy ((sha256->data + left), input, fill); sha256_transform (sha256->buf, sha256->data); length -= fill; input += fill; left = 0; } while (length >= SHA256_DATASIZE) { sha256_transform (sha256->buf, input); length -= 64; input += 64; } if (length) memcpy (sha256->data + left, input, length); } static guint8 sha256_padding[64] = { 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; static void sha256_sum_close (Sha256sum *sha256) { guint32 last, padn; guint32 high, low; guint8 msglen[8]; high = (sha256->bits[0] >> 29) | (sha256->bits[1] << 3); low = (sha256->bits[0] << 3); PUT_UINT32 (high, msglen, 0); PUT_UINT32 (low, msglen, 4); last = sha256->bits[0] & 0x3F; padn = (last < 56) ? (56 - last) : (120 - last); sha256_sum_update (sha256, sha256_padding, padn); sha256_sum_update (sha256, msglen, 8); PUT_UINT32 (sha256->buf[0], sha256->digest, 0); PUT_UINT32 (sha256->buf[1], sha256->digest, 4); PUT_UINT32 (sha256->buf[2], sha256->digest, 8); PUT_UINT32 (sha256->buf[3], sha256->digest, 12); PUT_UINT32 (sha256->buf[4], sha256->digest, 16); PUT_UINT32 (sha256->buf[5], sha256->digest, 20); PUT_UINT32 (sha256->buf[6], sha256->digest, 24); PUT_UINT32 (sha256->buf[7], sha256->digest, 28); } #undef PUT_UINT32 #undef GET_UINT32 static gchar * sha256_sum_to_string (Sha256sum *sha256) { return digest_to_string (sha256->digest, SHA256_DIGEST_LEN); } static void sha256_sum_digest (Sha256sum *sha256, guint8 *digest) { gint i; for (i = 0; i < SHA256_DIGEST_LEN; i++) 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 */ /* 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 */ /** * g_checksum_type_get_length: * @checksum_type: a #GChecksumType * * Gets the length in bytes of digests of type @checksum_type * * Return value: the checksum length, or -1 if @checksum_type is * not supported. * * Since: 2.16 */ gssize g_checksum_type_get_length (GChecksumType checksum_type) { gssize len = -1; switch (checksum_type) { case G_CHECKSUM_MD5: len = MD5_DIGEST_LEN; break; case G_CHECKSUM_SHA1: len = SHA1_DIGEST_LEN; break; case G_CHECKSUM_SHA256: len = SHA256_DIGEST_LEN; break; case G_CHECKSUM_SHA512: len = SHA512_DIGEST_LEN; break; default: len = -1; break; } return len; } /** * g_checksum_new: * @checksum_type: the desired type of checksum * * Creates a new #GChecksum, using the checksum algorithm @checksum_type. * If the @checksum_type is not known, %NULL is returned. * A #GChecksum can be used to compute the checksum, or digest, of an * arbitrary binary blob, using different hashing algorithms. * * A #GChecksum works by feeding a binary blob through g_checksum_update() * until there is data to be checked; the digest can then be extracted * using g_checksum_get_string(), which will return the checksum as a * hexadecimal string; or g_checksum_get_digest(), which will return a * vector of raw bytes. Once either g_checksum_get_string() or * g_checksum_get_digest() have been called on a #GChecksum, the checksum * will be closed and it won't be possible to call g_checksum_update() * on it anymore. * * Return value: (transfer full): the newly created #GChecksum, or %NULL. * Use g_checksum_free() to free the memory allocated by it. * * Since: 2.16 */ GChecksum * g_checksum_new (GChecksumType checksum_type) { GChecksum *checksum; if (! IS_VALID_TYPE (checksum_type)) return NULL; checksum = g_slice_new0 (GChecksum); checksum->type = checksum_type; g_checksum_reset (checksum); return checksum; } /** * g_checksum_reset: * @checksum: the #GChecksum to reset * * Resets the state of the @checksum back to its initial state. * * Since: 2.18 **/ void g_checksum_reset (GChecksum *checksum) { g_return_if_fail (checksum != NULL); g_free (checksum->digest_str); checksum->digest_str = NULL; switch (checksum->type) { case G_CHECKSUM_MD5: md5_sum_init (&(checksum->sum.md5)); break; case G_CHECKSUM_SHA1: sha1_sum_init (&(checksum->sum.sha1)); break; 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; } } /** * g_checksum_copy: * @checksum: the #GChecksum to copy * * Copies a #GChecksum. If @checksum has been closed, by calling * g_checksum_get_string() or g_checksum_get_digest(), the copied * checksum will be closed as well. * * Return value: the copy of the passed #GChecksum. Use g_checksum_free() * when finished using it. * * Since: 2.16 */ GChecksum * g_checksum_copy (const GChecksum *checksum) { GChecksum *copy; g_return_val_if_fail (checksum != NULL, NULL); copy = g_slice_new (GChecksum); *copy = *checksum; copy->digest_str = g_strdup (checksum->digest_str); return copy; } /** * g_checksum_free: * @checksum: a #GChecksum * * Frees the memory allocated for @checksum. * * Since: 2.16 */ void g_checksum_free (GChecksum *checksum) { if (G_LIKELY (checksum)) { g_free (checksum->digest_str); g_slice_free (GChecksum, checksum); } } /** * g_checksum_update: * @checksum: a #GChecksum * @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 * open, that is g_checksum_get_string() or g_checksum_get_digest() must * not have been called on @checksum. * * Since: 2.16 */ void g_checksum_update (GChecksum *checksum, const guchar *data, gssize length) { g_return_if_fail (checksum != NULL); g_return_if_fail (length == 0 || data != NULL); if (length < 0) length = strlen ((const gchar *) data); if (checksum->digest_str) { g_warning ("The checksum '%s' has been closed and cannot be updated " "anymore.", checksum->digest_str); return; } switch (checksum->type) { case G_CHECKSUM_MD5: md5_sum_update (&(checksum->sum.md5), data, length); break; case G_CHECKSUM_SHA1: sha1_sum_update (&(checksum->sum.sha1), data, length); break; 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; } } /** * g_checksum_get_string: * @checksum: a #GChecksum * * Gets the digest as an hexadecimal string. * * Once this function has been called the #GChecksum can no longer be * updated with g_checksum_update(). * * The hexadecimal characters will be lower case. * * Return value: the hexadecimal representation of the checksum. The * returned string is owned by the checksum and should not be modified * or freed. * * Since: 2.16 */ const gchar * g_checksum_get_string (GChecksum *checksum) { gchar *str = NULL; g_return_val_if_fail (checksum != NULL, NULL); if (checksum->digest_str) return checksum->digest_str; switch (checksum->type) { case G_CHECKSUM_MD5: md5_sum_close (&(checksum->sum.md5)); str = md5_sum_to_string (&(checksum->sum.md5)); break; case G_CHECKSUM_SHA1: sha1_sum_close (&(checksum->sum.sha1)); str = sha1_sum_to_string (&(checksum->sum.sha1)); break; case G_CHECKSUM_SHA256: 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; } checksum->digest_str = str; return checksum->digest_str; } /** * 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. * After the call it contains the length of the digest. * * Gets the digest from @checksum as a raw binary vector and places it * into @buffer. The size of the digest depends on the type of checksum. * * Once this function has been called, the #GChecksum is closed and can * no longer be updated with g_checksum_update(). * * Since: 2.16 */ void g_checksum_get_digest (GChecksum *checksum, guint8 *buffer, gsize *digest_len) { gboolean checksum_open = FALSE; gchar *str = NULL; gsize len; g_return_if_fail (checksum != NULL); len = g_checksum_type_get_length (checksum->type); g_return_if_fail (*digest_len >= len); checksum_open = !!(checksum->digest_str == NULL); switch (checksum->type) { case G_CHECKSUM_MD5: if (checksum_open) { md5_sum_close (&(checksum->sum.md5)); str = md5_sum_to_string (&(checksum->sum.md5)); } md5_sum_digest (&(checksum->sum.md5), buffer); break; case G_CHECKSUM_SHA1: if (checksum_open) { sha1_sum_close (&(checksum->sum.sha1)); str = sha1_sum_to_string (&(checksum->sum.sha1)); } sha1_sum_digest (&(checksum->sum.sha1), buffer); break; case G_CHECKSUM_SHA256: if (checksum_open) { sha256_sum_close (&(checksum->sum.sha256)); str = sha256_sum_to_string (&(checksum->sum.sha256)); } 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; } if (str) checksum->digest_str = str; *digest_len = len; } /** * g_compute_checksum_for_data: * @checksum_type: a #GChecksumType * @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 * 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.16 */ gchar * g_compute_checksum_for_data (GChecksumType checksum_type, const guchar *data, gsize length) { GChecksum *checksum; gchar *retval; g_return_val_if_fail (IS_VALID_TYPE (checksum_type), NULL); g_return_val_if_fail (length == 0 || data != NULL, NULL); checksum = g_checksum_new (checksum_type); if (!checksum) return NULL; g_checksum_update (checksum, data, length); retval = g_strdup (g_checksum_get_string (checksum)); g_checksum_free (checksum); return retval; } /** * g_compute_checksum_for_string: * @checksum_type: a #GChecksumType * @str: the string to compute the checksum of * @length: the length of the string, or -1 if the string is null-terminated. * * Computes the checksum of a string. * * The hexadecimal string returned will be in lower case. * * Return value: the checksum as a hexadecimal string. The returned string * should be freed with g_free() when done using it. * * Since: 2.16 */ gchar * g_compute_checksum_for_string (GChecksumType checksum_type, const gchar *str, gssize length) { g_return_val_if_fail (IS_VALID_TYPE (checksum_type), NULL); g_return_val_if_fail (length == 0 || str != NULL, NULL); if (length < 0) length = strlen (str); 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); } pkg-config-0.29.1/glib/glib/gspawn.c0000664000175000017500000016273312651243552014070 00000000000000/* gspawn.c - Process launching * * Copyright 2000 Red Hat, Inc. * g_execvpe implementation based on GNU libc execvp: * Copyright 1991, 92, 95, 96, 97, 98, 99 Free Software Foundation, Inc. * * GLib is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * GLib is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with GLib; see the file COPYING.LIB. If not, write * to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "config.h" #include #include #include #include #include #include #include #include #include /* for fdwalk */ #include #ifdef HAVE_SYS_SELECT_H #include #endif /* HAVE_SYS_SELECT_H */ #ifdef HAVE_SYS_RESOURCE_H #include #endif /* HAVE_SYS_RESOURCE_H */ #include "gspawn.h" #include "gthread.h" #include "glib/gstdio.h" #include "genviron.h" #include "gmem.h" #include "gshell.h" #include "gstring.h" #include "gstrfuncs.h" #include "gtestutils.h" #include "gutils.h" #include "glibintl.h" /** * SECTION:spawn * @Short_description: process launching * @Title: Spawning Processes */ static gint g_execute (const gchar *file, gchar **argv, gchar **envp, gboolean search_path, gboolean search_path_from_envp); static gboolean make_pipe (gint p[2], GError **error); static gboolean fork_exec_with_pipes (gboolean intermediate_child, const gchar *working_directory, gchar **argv, gchar **envp, gboolean close_descriptors, gboolean search_path, gboolean search_path_from_envp, gboolean stdout_to_null, gboolean stderr_to_null, gboolean child_inherits_stdin, gboolean file_and_argv_zero, GSpawnChildSetupFunc child_setup, gpointer user_data, GPid *child_pid, gint *standard_input, gint *standard_output, gint *standard_error, GError **error); 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: * @working_directory: (allow-none): child's current working directory, or %NULL to inherit parent's * @argv: (array zero-terminated=1): child's argument vector * @envp: (array zero-terminated=1) (allow-none): child's environment, or %NULL to inherit parent's * @flags: flags from #GSpawnFlags * @child_setup: (scope async) (allow-none): function to run in the child just before exec() * @user_data: (closure): user data for @child_setup * @child_pid: (out) (allow-none): return location for child process reference, or %NULL * @error: return location for error * * See g_spawn_async_with_pipes() for a full description; this function * simply calls the g_spawn_async_with_pipes() without any pipes. * * You should call g_spawn_close_pid() on the returned child process * reference when you don't need it any more. * * * If you are writing a GTK+ application, and the program you * are spawning is a graphical application, too, then you may * want to use gdk_spawn_on_screen() instead to ensure that * the spawned program opens its windows on the right screen. * * * Note that the returned @child_pid on Windows is a * handle to the child process and not its identifier. Process handles * and process identifiers are different concepts on Windows. * * * Return value: %TRUE on success, %FALSE if error is set **/ gboolean g_spawn_async (const gchar *working_directory, gchar **argv, gchar **envp, GSpawnFlags flags, GSpawnChildSetupFunc child_setup, gpointer user_data, GPid *child_pid, GError **error) { g_return_val_if_fail (argv != NULL, FALSE); return g_spawn_async_with_pipes (working_directory, argv, envp, flags, child_setup, user_data, child_pid, NULL, NULL, NULL, error); } /* Avoids a danger in threaded situations (calling close() * on a file descriptor twice, and another thread has * re-opened it since the first close) */ static void close_and_invalidate (gint *fd) { if (*fd < 0) return; else { (void) g_close (*fd, NULL); *fd = -1; } } /* Some versions of OS X define READ_OK in public headers */ #undef READ_OK typedef enum { READ_FAILED = 0, /* FALSE */ READ_OK, READ_EOF } ReadResult; static ReadResult read_data (GString *str, gint fd, GError **error) { gssize bytes; gchar buf[4096]; again: bytes = read (fd, buf, 4096); if (bytes == 0) return READ_EOF; else if (bytes > 0) { g_string_append_len (str, buf, bytes); return READ_OK; } else if (errno == EINTR) goto again; else { int errsv = errno; g_set_error (error, G_SPAWN_ERROR, G_SPAWN_ERROR_READ, _("Failed to read data from child process (%s)"), g_strerror (errsv)); return READ_FAILED; } } /** * g_spawn_sync: * @working_directory: (allow-none): child's current working directory, or %NULL to inherit parent's * @argv: (array zero-terminated=1): child's argument vector * @envp: (array zero-terminated=1) (allow-none): child's environment, or %NULL to inherit parent's * @flags: flags from #GSpawnFlags * @child_setup: (scope async) (allow-none): function to run in the child just before exec() * @user_data: (closure): user data for @child_setup * @standard_output: (out) (array zero-terminated=1) (element-type guint8) (allow-none): return location for child output, or %NULL * @standard_error: (out) (array zero-terminated=1) (element-type guint8) (allow-none): return location for child error messages, or %NULL * @exit_status: (out) (allow-none): return location for child exit status, as returned by waitpid(), or %NULL * @error: return location for error, or %NULL * * Executes a child synchronously (waits for the child to exit before returning). * All output from the child is stored in @standard_output and @standard_error, * if those parameters are non-%NULL. 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 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 * how these functions work on Windows. * * Return value: %TRUE on success, %FALSE if an error was set. **/ gboolean g_spawn_sync (const gchar *working_directory, gchar **argv, gchar **envp, GSpawnFlags flags, GSpawnChildSetupFunc child_setup, gpointer user_data, gchar **standard_output, gchar **standard_error, gint *exit_status, GError **error) { gint outpipe = -1; gint errpipe = -1; GPid pid; fd_set fds; gint ret; GString *outstr = NULL; GString *errstr = NULL; gboolean failed; gint status; g_return_val_if_fail (argv != NULL, FALSE); g_return_val_if_fail (!(flags & G_SPAWN_DO_NOT_REAP_CHILD), FALSE); g_return_val_if_fail (standard_output == NULL || !(flags & G_SPAWN_STDOUT_TO_DEV_NULL), FALSE); g_return_val_if_fail (standard_error == NULL || !(flags & G_SPAWN_STDERR_TO_DEV_NULL), FALSE); /* Just to ensure segfaults if callers try to use * these when an error is reported. */ if (standard_output) *standard_output = NULL; if (standard_error) *standard_error = NULL; if (!fork_exec_with_pipes (FALSE, working_directory, argv, envp, !(flags & G_SPAWN_LEAVE_DESCRIPTORS_OPEN), (flags & G_SPAWN_SEARCH_PATH) != 0, (flags & G_SPAWN_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, (flags & G_SPAWN_FILE_AND_ARGV_ZERO) != 0, child_setup, user_data, &pid, NULL, standard_output ? &outpipe : NULL, standard_error ? &errpipe : NULL, error)) return FALSE; /* Read data from child. */ failed = FALSE; if (outpipe >= 0) { outstr = g_string_new (NULL); } if (errpipe >= 0) { errstr = g_string_new (NULL); } /* Read data until we get EOF on both pipes. */ while (!failed && (outpipe >= 0 || errpipe >= 0)) { ret = 0; FD_ZERO (&fds); if (outpipe >= 0) FD_SET (outpipe, &fds); if (errpipe >= 0) FD_SET (errpipe, &fds); ret = select (MAX (outpipe, errpipe) + 1, &fds, NULL, NULL, NULL /* no timeout */); if (ret < 0) { int errsv = errno; if (errno == EINTR) continue; failed = TRUE; g_set_error (error, G_SPAWN_ERROR, G_SPAWN_ERROR_READ, _("Unexpected error in select() reading data from a child process (%s)"), g_strerror (errsv)); break; } if (outpipe >= 0 && FD_ISSET (outpipe, &fds)) { switch (read_data (outstr, outpipe, error)) { case READ_FAILED: failed = TRUE; break; case READ_EOF: close_and_invalidate (&outpipe); outpipe = -1; break; default: break; } if (failed) break; } if (errpipe >= 0 && FD_ISSET (errpipe, &fds)) { switch (read_data (errstr, errpipe, error)) { case READ_FAILED: failed = TRUE; break; case READ_EOF: close_and_invalidate (&errpipe); errpipe = -1; break; default: break; } if (failed) break; } } /* These should only be open still if we had an error. */ if (outpipe >= 0) close_and_invalidate (&outpipe); if (errpipe >= 0) close_and_invalidate (&errpipe); /* Wait for child to exit, even if we have * an error pending. */ again: ret = waitpid (pid, &status, 0); if (ret < 0) { if (errno == EINTR) goto again; else if (errno == ECHILD) { if (exit_status) { g_warning ("In call to g_spawn_sync(), exit status of a child process was requested but 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 { /* We don't need the exit status. */ } } else { if (!failed) /* avoid error pileups */ { int errsv = errno; failed = TRUE; g_set_error (error, G_SPAWN_ERROR, G_SPAWN_ERROR_READ, _("Unexpected error in waitpid() (%s)"), g_strerror (errsv)); } } } if (failed) { if (outstr) g_string_free (outstr, TRUE); if (errstr) g_string_free (errstr, TRUE); return FALSE; } else { if (exit_status) *exit_status = status; if (standard_output) *standard_output = g_string_free (outstr, FALSE); if (standard_error) *standard_error = g_string_free (errstr, FALSE); return TRUE; } } /** * g_spawn_async_with_pipes: * @working_directory: (allow-none): child's current working directory, or %NULL to inherit parent's, in the GLib file name encoding * @argv: (array zero-terminated=1): child's argument vector, in the GLib file name encoding * @envp: (array zero-terminated=1) (allow-none): child's environment, or %NULL to inherit parent's, in the GLib file name encoding * @flags: flags from #GSpawnFlags * @child_setup: (scope async) (allow-none): function to run in the child just before exec() * @user_data: (closure): user data for @child_setup * @child_pid: (out) (allow-none): return location for child process ID, or %NULL * @standard_input: (out) (allow-none): return location for file descriptor to write to child's stdin, or %NULL * @standard_output: (out) (allow-none): return location for file descriptor to read child's stdout, or %NULL * @standard_error: (out) (allow-none): return location for file descriptor to read child's stderr, or %NULL * @error: return location for error * * Executes a child program asynchronously (your program will not * block waiting for the child to exit). The child program is * specified by the only argument that must be provided, @argv. @argv * should be a %NULL-terminated array of strings, to be passed as the * argument vector for the child. The first string in @argv is of * course the name of the program to execute. By default, the name of * the program must be a full path. If @flags contains the * %G_SPAWN_SEARCH_PATH flag, the PATH environment variable * is used to search for the executable. If @flags contains the * %G_SPAWN_SEARCH_PATH_FROM_ENVP flag, the PATH 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 PATH 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 * dangerous in some cases when the current directory is world-writable. * * On Windows, note that all the string or string vector arguments to * this function and the other g_spawn*() functions are in UTF-8, the * GLib file name encoding. Unicode characters that are not part of * the system codepage passed in these arguments will be correctly * available in the spawned program only if it uses wide character API * to retrieve its command line. For C programs built with Microsoft's * tools it is enough to make the program have a wmain() instead of * main(). wmain() has a wide character argument vector as parameter. * * At least currently, mingw doesn't support wmain(), so if you use * mingw to develop the spawned program, it will have to call the * undocumented function __wgetmainargs() to get the wide character * argument vector and environment. See gspawn-win32-helper.c in the * GLib sources or init.c in the mingw runtime sources for a prototype * for that function. Alternatively, you can retrieve the Win32 system * level wide character command line passed to the spawned program * using the GetCommandLineW() function. * * On Windows the low-level child process creation API * CreateProcess() doesn't use argument vectors, * but a command line. The C runtime library's * spawn*() family of functions (which * g_spawn_async_with_pipes() eventually calls) paste the argument * vector elements together into a command line, and the C runtime startup code * does a corresponding reconstruction of an argument vector from the * command line, to be passed to main(). Complications arise when you have * argument vector elements that contain spaces of double quotes. The * spawn*() functions don't do any quoting or * escaping, but on the other hand the startup code does do unquoting * and unescaping in order to enable receiving arguments with embedded * spaces or double quotes. To work around this asymmetry, * g_spawn_async_with_pipes() will do quoting and escaping on argument * vector elements that need it before calling the C runtime * spawn() function. * * The returned @child_pid on Windows is a handle to the child * process, not its identifier. Process handles and process * identifiers are different concepts on Windows. * * @envp is a %NULL-terminated array of strings, where each string * has the form KEY=VALUE. This will become * the child's environment. If @envp is %NULL, the child inherits its * parent's environment. * * @flags should be the bitwise OR of any flags you want to affect the * function's behaviour. The %G_SPAWN_DO_NOT_REAP_CHILD means that the * child will not automatically be reaped; you must use a child watch to * be notified about the death of the child process. Eventually you must * call g_spawn_close_pid() on the @child_pid, in order to free * resources which may be associated with the child process. (On Unix, * using a child watch is equivalent to calling waitpid() or handling * the SIGCHLD signal manually. On Windows, calling g_spawn_close_pid() * is equivalent to calling CloseHandle() on the process handle returned * in @child_pid). See g_child_watch_add(). * * %G_SPAWN_LEAVE_DESCRIPTORS_OPEN means that the parent's open file * descriptors will be inherited by the child; otherwise all * descriptors except stdin/stdout/stderr will be closed before * calling exec() in the child. %G_SPAWN_SEARCH_PATH * means that argv[0] need not be an absolute path, it * will be looked for in the PATH environment variable. * %G_SPAWN_SEARCH_PATH_FROM_ENVP means need not be an absolute path, it * will be looked for in the PATH 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. * %G_SPAWN_STDERR_TO_DEV_NULL means that the child's standard error * will be discarded, instead of going to the same location as the parent's * standard error. If you use this flag, @standard_error must be %NULL. * %G_SPAWN_CHILD_INHERITS_STDIN means that the child will inherit the parent's * standard input (by default, the child's standard input is attached to * /dev/null). If you use this flag, @standard_input must be %NULL. * %G_SPAWN_FILE_AND_ARGV_ZERO means that the first element of @argv is * the file to execute, while the remaining elements are the * actual argument vector to pass to the file. Normally * g_spawn_async_with_pipes() uses @argv[0] as the file to execute, and * passes all of @argv to the child. * * @child_setup and @user_data are a function and user data. On POSIX * platforms, the function is called in the child after GLib has * performed all the setup it plans to perform (including creating * pipes, closing file descriptors, etc.) but before calling * exec(). That is, @child_setup is called just * before calling exec() in the child. Obviously * actions taken in this function will only affect the child, not the * parent. * * On Windows, there is no separate fork() and exec() * functionality. Child processes are created and run with a single * API call, CreateProcess(). There is no sensible thing @child_setup * could be used for on Windows so it is ignored and not called. * * If non-%NULL, @child_pid will on Unix be filled with the child's * process ID. You can use the process ID to send signals to the * child, or to use g_child_watch_add() (or waitpid()) if you specified the * %G_SPAWN_DO_NOT_REAP_CHILD flag. On Windows, @child_pid will be * filled with a handle to the child process only if you specified the * %G_SPAWN_DO_NOT_REAP_CHILD flag. You can then access the child * process using the Win32 API, for example wait for its termination * with the WaitFor*() functions, or examine its * exit code with GetExitCodeProcess(). You should close the handle * with CloseHandle() or g_spawn_close_pid() when you no longer need it. * * If non-%NULL, the @standard_input, @standard_output, @standard_error * locations will be filled with file descriptors for writing to the child's * standard input or reading from its standard output or standard error. * The caller of g_spawn_async_with_pipes() must close these file descriptors * when they are no longer in use. If these parameters are %NULL, the corresponding * pipe won't be created. * * If @standard_input is NULL, the child's standard input is attached to * /dev/null unless %G_SPAWN_CHILD_INHERITS_STDIN is set. * * If @standard_error is NULL, the child's standard error goes to the same * location as the parent's standard error unless %G_SPAWN_STDERR_TO_DEV_NULL * is set. * * If @standard_output is NULL, the child's standard output goes to the same * location as the parent's standard output unless %G_SPAWN_STDOUT_TO_DEV_NULL * is set. * * @error can be %NULL to ignore errors, or non-%NULL to report errors. * If an error is set, the function returns %FALSE. Errors * are reported even if they occur in the child (for example if the * executable in argv[0] is not found). Typically * the message field of returned errors should be displayed * to users. Possible errors are those from the #G_SPAWN_ERROR domain. * * If an error occurs, @child_pid, @standard_input, @standard_output, * and @standard_error will not be filled with valid values. * * If @child_pid is not %NULL and an error does not occur then the returned * process reference must be closed using g_spawn_close_pid(). * * * If you are writing a GTK+ application, and the program you * are spawning is a graphical application, too, then you may * want to use gdk_spawn_on_screen_with_pipes() instead to ensure that * the spawned program opens its windows on the right screen. * * * Return value: %TRUE on success, %FALSE if an error was set **/ gboolean g_spawn_async_with_pipes (const gchar *working_directory, gchar **argv, gchar **envp, GSpawnFlags flags, GSpawnChildSetupFunc child_setup, gpointer user_data, GPid *child_pid, gint *standard_input, gint *standard_output, gint *standard_error, GError **error) { g_return_val_if_fail (argv != NULL, FALSE); g_return_val_if_fail (standard_output == NULL || !(flags & G_SPAWN_STDOUT_TO_DEV_NULL), FALSE); g_return_val_if_fail (standard_error == NULL || !(flags & G_SPAWN_STDERR_TO_DEV_NULL), FALSE); /* can't inherit stdin if we have an input pipe. */ g_return_val_if_fail (standard_input == NULL || !(flags & G_SPAWN_CHILD_INHERITS_STDIN), FALSE); return fork_exec_with_pipes (!(flags & G_SPAWN_DO_NOT_REAP_CHILD), working_directory, argv, envp, !(flags & G_SPAWN_LEAVE_DESCRIPTORS_OPEN), (flags & G_SPAWN_SEARCH_PATH) != 0, (flags & G_SPAWN_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, (flags & G_SPAWN_FILE_AND_ARGV_ZERO) != 0, child_setup, user_data, child_pid, standard_input, standard_output, standard_error, error); } /** * g_spawn_command_line_sync: * @command_line: a command line * @standard_output: (out) (array zero-terminated=1) (element-type guint8) (allow-none): return location for child output * @standard_error: (out) (array zero-terminated=1) (element-type guint8) (allow-none): return location for child errors * @exit_status: (out) (allow-none): return location for child exit status, as returned by waitpid() * @error: return location for errors * * A simple version of g_spawn_sync() with little-used parameters * removed, taking a command line instead of an argument vector. See * g_spawn_sync() for full details. @command_line will be parsed by * g_shell_parse_argv(). Unlike g_spawn_sync(), the %G_SPAWN_SEARCH_PATH flag * is enabled. Note that %G_SPAWN_SEARCH_PATH can have security * implications, so consider using g_spawn_sync() directly if * appropriate. Possible errors are those from g_spawn_sync() and those * from g_shell_parse_argv(). * * If @exit_status is non-%NULL, the 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 * Windows command interpreter rules. * Space is a separator, and backslashes are * special. Thus you cannot simply pass a @command_line containing * canonical Windows paths, like "c:\\program files\\app\\app.exe", as * the backslashes will be eaten, and the space will act as a * separator. You need to enclose such paths with single quotes, like * "'c:\\program files\\app\\app.exe' 'e:\\folder\\argument.txt'". * * Return value: %TRUE on success, %FALSE if an error was set **/ gboolean g_spawn_command_line_sync (const gchar *command_line, gchar **standard_output, gchar **standard_error, gint *exit_status, GError **error) { gboolean retval; gchar **argv = NULL; g_return_val_if_fail (command_line != NULL, FALSE); if (!g_shell_parse_argv (command_line, NULL, &argv, error)) return FALSE; retval = g_spawn_sync (NULL, argv, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, standard_output, standard_error, exit_status, error); g_strfreev (argv); return retval; } /** * g_spawn_command_line_async: * @command_line: a command line * @error: return location for errors * * A simple version of g_spawn_async() that parses a command line with * g_shell_parse_argv() and passes it to g_spawn_async(). Runs a * command line in the background. Unlike g_spawn_async(), the * %G_SPAWN_SEARCH_PATH flag is enabled, other flags are not. Note * that %G_SPAWN_SEARCH_PATH can have security implications, so * consider using g_spawn_async() directly if appropriate. Possible * errors are those from g_shell_parse_argv() and g_spawn_async(). * * The same concerns on Windows apply as for g_spawn_command_line_sync(). * * Return value: %TRUE on success, %FALSE if error is set. **/ gboolean g_spawn_command_line_async (const gchar *command_line, GError **error) { gboolean retval; gchar **argv = NULL; g_return_val_if_fail (command_line != NULL, FALSE); if (!g_shell_parse_argv (command_line, NULL, &argv, error)) return FALSE; retval = g_spawn_async (NULL, argv, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, NULL, error); g_strfreev (argv); return retval; } /** * 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 * waitpid(2) returns, and on Windows it is * guaranteed to be the result of * GetExitCodeProcess(). 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 domain and code 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 WIFEXITED 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 * WIFEXITED() and WEXITSTATUS() * 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) { switch (en) { #ifdef EACCES case EACCES: return G_SPAWN_ERROR_ACCES; break; #endif #ifdef EPERM case EPERM: return G_SPAWN_ERROR_PERM; break; #endif #ifdef E2BIG case E2BIG: return G_SPAWN_ERROR_TOO_BIG; break; #endif #ifdef ENOEXEC case ENOEXEC: return G_SPAWN_ERROR_NOEXEC; break; #endif #ifdef ENAMETOOLONG case ENAMETOOLONG: return G_SPAWN_ERROR_NAMETOOLONG; break; #endif #ifdef ENOENT case ENOENT: return G_SPAWN_ERROR_NOENT; break; #endif #ifdef ENOMEM case ENOMEM: return G_SPAWN_ERROR_NOMEM; break; #endif #ifdef ENOTDIR case ENOTDIR: return G_SPAWN_ERROR_NOTDIR; break; #endif #ifdef ELOOP case ELOOP: return G_SPAWN_ERROR_LOOP; break; #endif #ifdef ETXTBUSY case ETXTBUSY: return G_SPAWN_ERROR_TXTBUSY; break; #endif #ifdef EIO case EIO: return G_SPAWN_ERROR_IO; break; #endif #ifdef ENFILE case ENFILE: return G_SPAWN_ERROR_NFILE; break; #endif #ifdef EMFILE case EMFILE: return G_SPAWN_ERROR_MFILE; break; #endif #ifdef EINVAL case EINVAL: return G_SPAWN_ERROR_INVAL; break; #endif #ifdef EISDIR case EISDIR: return G_SPAWN_ERROR_ISDIR; break; #endif #ifdef ELIBBAD case ELIBBAD: return G_SPAWN_ERROR_LIBBAD; break; #endif default: return G_SPAWN_ERROR_FAILED; break; } } static gssize write_all (gint fd, gconstpointer vbuf, gsize to_write) { gchar *buf = (gchar *) vbuf; while (to_write > 0) { gssize count = write (fd, buf, to_write); if (count < 0) { if (errno != EINTR) return FALSE; } else { to_write -= count; buf += count; } } return TRUE; } G_GNUC_NORETURN static void write_err_and_exit (gint fd, gint msg) { gint en = errno; write_all (fd, &msg, sizeof(msg)); write_all (fd, &en, sizeof(en)); _exit (1); } static int set_cloexec (void *data, gint fd) { if (fd >= GPOINTER_TO_INT (data)) fcntl (fd, F_SETFD, FD_CLOEXEC); return 0; } #ifndef HAVE_FDWALK static int fdwalk (int (*cb)(void *data, int fd), void *data) { gint open_max; gint fd; gint res = 0; #ifdef HAVE_SYS_RESOURCE_H struct rlimit rl; #endif #ifdef __linux__ DIR *d; if ((d = opendir("/proc/self/fd"))) { struct dirent *de; while ((de = readdir(d))) { glong l; gchar *e = NULL; if (de->d_name[0] == '.') continue; errno = 0; l = strtol(de->d_name, &e, 10); if (errno != 0 || !e || *e) continue; fd = (gint) l; if ((glong) fd != l) continue; if (fd == dirfd(d)) continue; if ((res = cb (data, fd)) != 0) break; } closedir(d); return res; } /* If /proc is not mounted or not accessible we fall back to the old * rlimit trick */ #endif #ifdef HAVE_SYS_RESOURCE_H if (getrlimit(RLIMIT_NOFILE, &rl) == 0 && rl.rlim_max != RLIM_INFINITY) open_max = rl.rlim_max; else #endif open_max = sysconf (_SC_OPEN_MAX); for (fd = 0; fd < open_max; fd++) if ((res = cb (data, fd)) != 0) break; return res; } #endif static gint sane_dup2 (gint fd1, gint fd2) { gint ret; retry: ret = dup2 (fd1, fd2); if (ret < 0 && errno == EINTR) goto retry; return ret; } static gint sane_open (const char *path, gint mode) { gint ret; retry: ret = open (path, mode); if (ret < 0 && errno == EINTR) goto retry; return ret; } enum { CHILD_CHDIR_FAILED, CHILD_EXEC_FAILED, CHILD_DUP2_FAILED, CHILD_FORK_FAILED }; static void do_exec (gint child_err_report_fd, gint stdin_fd, gint stdout_fd, gint stderr_fd, const gchar *working_directory, gchar **argv, gchar **envp, gboolean close_descriptors, gboolean search_path, gboolean search_path_from_envp, gboolean stdout_to_null, gboolean stderr_to_null, gboolean child_inherits_stdin, gboolean file_and_argv_zero, GSpawnChildSetupFunc child_setup, gpointer user_data) { if (working_directory && chdir (working_directory) < 0) write_err_and_exit (child_err_report_fd, CHILD_CHDIR_FAILED); /* Close all file descriptors but stdin stdout and stderr as * soon as we exec. Note that this includes * child_err_report_fd, which keeps the parent from blocking * forever on the other end of that pipe. */ if (close_descriptors) { fdwalk (set_cloexec, GINT_TO_POINTER(3)); } else { /* We need to do child_err_report_fd anyway */ set_cloexec (GINT_TO_POINTER(0), child_err_report_fd); } /* Redirect pipes as required */ if (stdin_fd >= 0) { /* dup2 can't actually fail here I don't think */ if (sane_dup2 (stdin_fd, 0) < 0) write_err_and_exit (child_err_report_fd, CHILD_DUP2_FAILED); /* ignore this if it doesn't work */ close_and_invalidate (&stdin_fd); } else if (!child_inherits_stdin) { /* Keep process from blocking on a read of stdin */ gint read_null = open ("/dev/null", O_RDONLY); g_assert (read_null != -1); sane_dup2 (read_null, 0); close_and_invalidate (&read_null); } if (stdout_fd >= 0) { /* dup2 can't actually fail here I don't think */ if (sane_dup2 (stdout_fd, 1) < 0) write_err_and_exit (child_err_report_fd, CHILD_DUP2_FAILED); /* ignore this if it doesn't work */ close_and_invalidate (&stdout_fd); } else if (stdout_to_null) { gint write_null = sane_open ("/dev/null", O_WRONLY); g_assert (write_null != -1); sane_dup2 (write_null, 1); close_and_invalidate (&write_null); } if (stderr_fd >= 0) { /* dup2 can't actually fail here I don't think */ if (sane_dup2 (stderr_fd, 2) < 0) write_err_and_exit (child_err_report_fd, CHILD_DUP2_FAILED); /* ignore this if it doesn't work */ close_and_invalidate (&stderr_fd); } else if (stderr_to_null) { gint write_null = sane_open ("/dev/null", O_WRONLY); sane_dup2 (write_null, 2); close_and_invalidate (&write_null); } /* Call user function just before we exec */ if (child_setup) { (* child_setup) (user_data); } g_execute (argv[0], file_and_argv_zero ? argv + 1 : argv, envp, search_path, search_path_from_envp); /* Exec failed */ write_err_and_exit (child_err_report_fd, CHILD_EXEC_FAILED); } static gboolean read_ints (int fd, gint* buf, gint n_ints_in_buf, gint *n_ints_read, GError **error) { gsize bytes = 0; while (TRUE) { gssize chunk; if (bytes >= sizeof(gint)*2) break; /* give up, who knows what happened, should not be * possible. */ again: chunk = read (fd, ((gchar*)buf) + bytes, sizeof(gint) * n_ints_in_buf - bytes); if (chunk < 0 && errno == EINTR) goto again; if (chunk < 0) { int errsv = errno; /* Some weird shit happened, bail out */ g_set_error (error, G_SPAWN_ERROR, G_SPAWN_ERROR_FAILED, _("Failed to read from child pipe (%s)"), g_strerror (errsv)); return FALSE; } else if (chunk == 0) break; /* EOF */ else /* chunk > 0 */ bytes += chunk; } *n_ints_read = (gint)(bytes / sizeof(gint)); return TRUE; } static gboolean fork_exec_with_pipes (gboolean intermediate_child, const gchar *working_directory, gchar **argv, gchar **envp, gboolean close_descriptors, gboolean search_path, gboolean search_path_from_envp, gboolean stdout_to_null, gboolean stderr_to_null, gboolean child_inherits_stdin, gboolean file_and_argv_zero, GSpawnChildSetupFunc child_setup, gpointer user_data, GPid *child_pid, gint *standard_input, gint *standard_output, gint *standard_error, GError **error) { GPid pid = -1; gint stdin_pipe[2] = { -1, -1 }; gint stdout_pipe[2] = { -1, -1 }; gint stderr_pipe[2] = { -1, -1 }; gint child_err_report_pipe[2] = { -1, -1 }; gint child_pid_report_pipe[2] = { -1, -1 }; gint status; if (!make_pipe (child_err_report_pipe, error)) return FALSE; if (intermediate_child && !make_pipe (child_pid_report_pipe, error)) goto cleanup_and_fail; if (standard_input && !make_pipe (stdin_pipe, error)) goto cleanup_and_fail; if (standard_output && !make_pipe (stdout_pipe, error)) goto cleanup_and_fail; if (standard_error && !make_pipe (stderr_pipe, error)) goto cleanup_and_fail; pid = fork (); if (pid < 0) { int errsv = errno; g_set_error (error, G_SPAWN_ERROR, G_SPAWN_ERROR_FORK, _("Failed to fork (%s)"), g_strerror (errsv)); goto cleanup_and_fail; } else if (pid == 0) { /* Immediate child. This may or may not be the child that * actually execs the new process. */ /* Reset some signal handlers that we may use */ signal (SIGCHLD, SIG_DFL); signal (SIGINT, SIG_DFL); signal (SIGTERM, SIG_DFL); signal (SIGHUP, SIG_DFL); /* Be sure we crash if the parent exits * and we write to the err_report_pipe */ signal (SIGPIPE, SIG_DFL); /* Close the parent's end of the pipes; * not needed in the close_descriptors case, * though */ close_and_invalidate (&child_err_report_pipe[0]); close_and_invalidate (&child_pid_report_pipe[0]); close_and_invalidate (&stdin_pipe[1]); close_and_invalidate (&stdout_pipe[0]); close_and_invalidate (&stderr_pipe[0]); if (intermediate_child) { /* We need to fork an intermediate child that launches the * final child. The purpose of the intermediate child * is to exit, so we can waitpid() it immediately. * Then the grandchild will not become a zombie. */ GPid grandchild_pid; grandchild_pid = fork (); if (grandchild_pid < 0) { /* report -1 as child PID */ write_all (child_pid_report_pipe[1], &grandchild_pid, sizeof(grandchild_pid)); write_err_and_exit (child_err_report_pipe[1], CHILD_FORK_FAILED); } else if (grandchild_pid == 0) { close_and_invalidate (&child_pid_report_pipe[1]); do_exec (child_err_report_pipe[1], stdin_pipe[0], stdout_pipe[1], stderr_pipe[1], working_directory, argv, envp, close_descriptors, search_path, search_path_from_envp, stdout_to_null, stderr_to_null, child_inherits_stdin, file_and_argv_zero, child_setup, user_data); } else { write_all (child_pid_report_pipe[1], &grandchild_pid, sizeof(grandchild_pid)); close_and_invalidate (&child_pid_report_pipe[1]); _exit (0); } } else { /* Just run the child. */ do_exec (child_err_report_pipe[1], stdin_pipe[0], stdout_pipe[1], stderr_pipe[1], working_directory, argv, envp, close_descriptors, search_path, search_path_from_envp, stdout_to_null, stderr_to_null, child_inherits_stdin, file_and_argv_zero, child_setup, user_data); } } else { /* Parent */ gint buf[2]; gint n_ints = 0; /* Close the uncared-about ends of the pipes */ close_and_invalidate (&child_err_report_pipe[1]); close_and_invalidate (&child_pid_report_pipe[1]); close_and_invalidate (&stdin_pipe[0]); close_and_invalidate (&stdout_pipe[1]); close_and_invalidate (&stderr_pipe[1]); /* If we had an intermediate child, reap it */ if (intermediate_child) { wait_again: if (waitpid (pid, &status, 0) < 0) { if (errno == EINTR) goto wait_again; else if (errno == ECHILD) ; /* do nothing, child already reaped */ else g_warning ("waitpid() should not fail in " "'fork_exec_with_pipes'"); } } if (!read_ints (child_err_report_pipe[0], buf, 2, &n_ints, error)) goto cleanup_and_fail; if (n_ints >= 2) { /* Error from the child. */ switch (buf[0]) { case CHILD_CHDIR_FAILED: g_set_error (error, G_SPAWN_ERROR, G_SPAWN_ERROR_CHDIR, _("Failed to change to directory '%s' (%s)"), working_directory, g_strerror (buf[1])); break; case CHILD_EXEC_FAILED: g_set_error (error, G_SPAWN_ERROR, exec_err_to_g_error (buf[1]), _("Failed to execute child process \"%s\" (%s)"), argv[0], g_strerror (buf[1])); break; case CHILD_DUP2_FAILED: g_set_error (error, G_SPAWN_ERROR, G_SPAWN_ERROR_FAILED, _("Failed to redirect output or input of child process (%s)"), g_strerror (buf[1])); break; case CHILD_FORK_FAILED: g_set_error (error, G_SPAWN_ERROR, G_SPAWN_ERROR_FORK, _("Failed to fork child process (%s)"), g_strerror (buf[1])); break; default: g_set_error (error, G_SPAWN_ERROR, G_SPAWN_ERROR_FAILED, _("Unknown error executing child process \"%s\""), argv[0]); break; } goto cleanup_and_fail; } /* Get child pid from intermediate child pipe. */ if (intermediate_child) { n_ints = 0; if (!read_ints (child_pid_report_pipe[0], buf, 1, &n_ints, error)) goto cleanup_and_fail; if (n_ints < 1) { int errsv = errno; g_set_error (error, G_SPAWN_ERROR, G_SPAWN_ERROR_FAILED, _("Failed to read enough data from child pid pipe (%s)"), g_strerror (errsv)); goto cleanup_and_fail; } else { /* we have the child pid */ pid = buf[0]; } } /* Success against all odds! return the information */ close_and_invalidate (&child_err_report_pipe[0]); close_and_invalidate (&child_pid_report_pipe[0]); if (child_pid) *child_pid = pid; if (standard_input) *standard_input = stdin_pipe[1]; if (standard_output) *standard_output = stdout_pipe[0]; if (standard_error) *standard_error = stderr_pipe[0]; return TRUE; } cleanup_and_fail: /* There was an error from the Child, reap the child to avoid it being a zombie. */ if (pid > 0) { wait_failed: if (waitpid (pid, NULL, 0) < 0) { if (errno == EINTR) goto wait_failed; else if (errno == ECHILD) ; /* do nothing, child already reaped */ else g_warning ("waitpid() should not fail in " "'fork_exec_with_pipes'"); } } close_and_invalidate (&child_err_report_pipe[0]); close_and_invalidate (&child_err_report_pipe[1]); close_and_invalidate (&child_pid_report_pipe[0]); close_and_invalidate (&child_pid_report_pipe[1]); close_and_invalidate (&stdin_pipe[0]); close_and_invalidate (&stdin_pipe[1]); close_and_invalidate (&stdout_pipe[0]); close_and_invalidate (&stdout_pipe[1]); close_and_invalidate (&stderr_pipe[0]); close_and_invalidate (&stderr_pipe[1]); return FALSE; } static gboolean make_pipe (gint p[2], GError **error) { if (pipe (p) < 0) { gint errsv = errno; g_set_error (error, G_SPAWN_ERROR, G_SPAWN_ERROR_FAILED, _("Failed to create pipe for communicating with child process (%s)"), g_strerror (errsv)); return FALSE; } else return TRUE; } /* Based on execvp from GNU C Library */ static void script_execute (const gchar *file, gchar **argv, gchar **envp) { /* Count the arguments. */ int argc = 0; while (argv[argc]) ++argc; /* Construct an argument list for the shell. */ { gchar **new_argv; new_argv = g_new0 (gchar*, argc + 2); /* /bin/sh and NULL */ new_argv[0] = (char *) "/bin/sh"; new_argv[1] = (char *) file; while (argc > 0) { new_argv[argc + 1] = argv[argc]; --argc; } /* Execute the shell. */ if (envp) execve (new_argv[0], new_argv, envp); else execv (new_argv[0], new_argv); g_free (new_argv); } } static gchar* my_strchrnul (const gchar *str, gchar c) { gchar *p = (gchar*) str; while (*p && (*p != c)) ++p; return p; } static gint g_execute (const gchar *file, gchar **argv, gchar **envp, gboolean search_path, gboolean search_path_from_envp) { if (*file == '\0') { /* We check the simple case first. */ errno = ENOENT; return -1; } if (!(search_path || search_path_from_envp) || strchr (file, '/') != NULL) { /* Don't search when it contains a slash. */ if (envp) execve (file, argv, envp); else execv (file, argv); if (errno == ENOEXEC) script_execute (file, argv, envp); } else { gboolean got_eacces = 0; const gchar *path, *p; gchar *name, *freeme; gsize len; gsize pathlen; 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 * search path in libc is the current directory followed by * the path 'confstr' returns for '_CS_PATH'. */ /* In GLib we put . last, for security, and don't use the * unportable confstr(); UNIX98 does not actually specify * what to search if PATH is unset. POSIX may, dunno. */ path = "/bin:/usr/bin:."; } len = strlen (file) + 1; pathlen = strlen (path); freeme = name = g_malloc (pathlen + len + 1); /* Copy the file name at the top, including '\0' */ memcpy (name + pathlen + 1, file, len); name = name + pathlen; /* And add the slash before the filename */ *name = '/'; p = path; do { char *startp; path = p; p = my_strchrnul (path, ':'); if (p == path) /* Two adjacent colons, or a colon at the beginning or the end * of 'PATH' means to search the current directory. */ startp = name + 1; else startp = memcpy (name - (p - path), path, p - path); /* Try to execute this name. If it works, execv will not return. */ if (envp) execve (startp, argv, envp); else execv (startp, argv); if (errno == ENOEXEC) script_execute (startp, argv, envp); switch (errno) { case EACCES: /* Record the we got a 'Permission denied' error. If we end * up finding no executable we can use, we want to diagnose * that we did find one but were denied access. */ got_eacces = TRUE; /* FALL THRU */ case ENOENT: #ifdef ESTALE case ESTALE: #endif #ifdef ENOTDIR case ENOTDIR: #endif /* Those errors indicate the file is missing or not executable * by us, in which case we want to just try the next path * directory. */ break; case ENODEV: case ETIMEDOUT: /* Some strange filesystems like AFS return even * stranger error numbers. They cannot reasonably mean anything * else so ignore those, too. */ break; default: /* Some other error means we found an executable file, but * something went wrong executing it; return the error to our * caller. */ g_free (freeme); return -1; } } while (*p++ != '\0'); /* We tried every element and none of them worked. */ if (got_eacces) /* At least one failure was due to permissions, so report that * error. */ errno = EACCES; g_free (freeme); } /* Return the error from the last attempt (probably ENOENT). */ return -1; } /** * g_spawn_close_pid: * @pid: The process reference to close * * On some platforms, notably Windows, the #GPid type represents a resource * which must be closed to prevent resource leaking. g_spawn_close_pid() * is provided for this purpose. It should be used on all platforms, even * though it doesn't do anything under UNIX. **/ void g_spawn_close_pid (GPid pid) { } pkg-config-0.29.1/glib/glib/gversion.c0000664000175000017500000001271612275467762014435 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1998 Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the GLib Team and others 1997-2000. See the AUTHORS * file for a list of people on the GLib Team. See the ChangeLog * files for a list of changes. These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/. */ #include "config.h" #include "gversion.h" /** * SECTION:version * @Title: Version Information * @Short_description: variables and functions to check the GLib version * * GLib provides version information, primarily useful in configure * checks for builds that have a configure script. Applications will * not typically use the features described here. * * The GLib headers annotate deprecated APIs in a way that produces * compiler warnings if these deprecated APIs are used. The warnings * can be turned off by defining the macro %GLIB_DISABLE_DEPRECATION_WARNINGS * before including the glib.h header. * * GLib also provides support for building applications against * defined subsets of deprecated or new GLib APIs. Define the macro * %GLIB_VERSION_MIN_REQUIRED to specify up to what version of GLib * you want to receive warnings about deprecated APIs. Define the * macro %GLIB_VERSION_MAX_ALLOWED to specify the newest version of * GLib whose API you want to use. */ /** * GLIB_MAJOR_VERSION: * * The major version number of the GLib library. * * Like #glib_major_version, but from the headers used at * application compile time, rather than from the library * linked against at application run time. */ /** * GLIB_MINOR_VERSION: * * The minor version number of the GLib library. * * Like #gtk_minor_version, but from the headers used at * application compile time, rather than from the library * linked against at application run time. */ /** * GLIB_MICRO_VERSION: * * The micro version number of the GLib library. * * Like #gtk_micro_version, but from the headers used at * application compile time, rather than from the library * linked against at application run time. */ /** * GLIB_CHECK_VERSION: * @major: the major version to check for * @minor: the minor version to check for * @micro: the micro version to check for * * Checks the version of the GLib library that is being compiled * against. * * * Checking the version of the GLib library * * if (!GLIB_CHECK_VERSION (1, 2, 0)) * g_error ("GLib version 1.2.0 or above is needed"); * * * * See glib_check_version() for a runtime check. * * Returns: %TRUE if the version of the GLib header files * is the same as or newer than the passed-in version. */ const guint glib_major_version = GLIB_MAJOR_VERSION; const guint glib_minor_version = GLIB_MINOR_VERSION; const guint glib_micro_version = GLIB_MICRO_VERSION; const guint glib_interface_age = GLIB_INTERFACE_AGE; const guint glib_binary_age = GLIB_BINARY_AGE; /** * glib_check_version: * @required_major: the required major version. * @required_minor: the required minor version. * @required_micro: the required micro version. * * Checks that the GLib library in use is compatible with the * given version. Generally you would pass in the constants * #GLIB_MAJOR_VERSION, #GLIB_MINOR_VERSION, #GLIB_MICRO_VERSION * as the three arguments to this function; that produces * a check that the library in use is compatible with * the version of GLib the application or module was compiled * against. * * Compatibility is defined by two things: first the version * of the running library is newer than the version * @required_major.required_minor.@required_micro. Second * the running library must be binary compatible with the * version @required_major.required_minor.@required_micro * (same major version.) * * Return value: %NULL if the GLib library is compatible with the * given version, or a string describing the version mismatch. * The returned string is owned by GLib and must not be modified * or freed. * * Since: 2.6 */ const gchar * glib_check_version (guint required_major, guint required_minor, guint required_micro) { gint glib_effective_micro = 100 * GLIB_MINOR_VERSION + GLIB_MICRO_VERSION; gint required_effective_micro = 100 * required_minor + required_micro; if (required_major > GLIB_MAJOR_VERSION) return "GLib version too old (major mismatch)"; if (required_major < GLIB_MAJOR_VERSION) return "GLib version too new (major mismatch)"; if (required_effective_micro < glib_effective_micro - GLIB_BINARY_AGE) return "GLib version too new (micro mismatch)"; if (required_effective_micro > glib_effective_micro) return "GLib version too old (micro mismatch)"; return NULL; } pkg-config-0.29.1/glib/glib/gdatetime.c0000664000175000017500000022715112651243552014530 00000000000000/* gdatetime.c * * Copyright (C) 2009-2010 Christian Hergert * Copyright (C) 2010 Thiago Santos * Copyright (C) 2010 Emmanuele Bassi * Copyright © 2010 Codethink Limited * * This library is free software; you can redistribute it 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 * licence, or (at your option) any later version. * * This is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public * License for more details. * * You should 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. * * Authors: Christian Hergert * Thiago Santos * Emmanuele Bassi * Ryan Lortie */ /* Algorithms within this file are based on the Calendar FAQ by * Claus Tondering. It can be found at * http://www.tondering.dk/claus/cal/calendar29.txt * * Copyright and disclaimer * ------------------------ * This document is Copyright (C) 2008 by Claus Tondering. * E-mail: claus@tondering.dk. (Please include the word * "calendar" in the subject line.) * The document may be freely distributed, provided this * copyright notice is included and no money is charged for * the document. * * This document is provided "as is". No warranties are made as * to its correctness. */ /* Prologue {{{1 */ #include "config.h" #include #include #ifdef HAVE_UNISTD_H #include #endif #ifdef HAVE_LANGINFO_TIME #include #endif #include "gdatetime.h" #include "gslice.h" #include "gatomic.h" #include "gcharset.h" #include "gconvert.h" #include "gfileutils.h" #include "ghash.h" #include "gmain.h" #include "gmappedfile.h" #include "gstrfuncs.h" #include "gtestutils.h" #include "gthread.h" #include "gtimezone.h" #include "glibintl.h" #ifndef G_OS_WIN32 #include #include #endif /* !G_OS_WIN32 */ /** * SECTION:date-time * @title: GDateTime * @short_description: a structure representing Date and Time * @see_also: #GTimeZone * * #GDateTime is a structure that combines a Gregorian date and time * into a single structure. It provides many conversion and methods to * manipulate dates and times. Time precision is provided down to * microseconds and the time can range (proleptically) from 0001-01-01 * 00:00:00 to 9999-12-31 23:59:59.999999. #GDateTime follows POSIX * time in the sense that it is oblivious to leap seconds. * * #GDateTime is an immutable object; once it has been created it cannot * be modified further. All modifiers will create a new #GDateTime. * Nearly all such functions can fail due to the date or time going out * of range, in which case %NULL will be returned. * * #GDateTime is reference counted: the reference count is increased by calling * g_date_time_ref() and decreased by calling g_date_time_unref(). When the * reference count drops to 0, the resources allocated by the #GDateTime * structure are released. * * Many parts of the API may produce non-obvious results. As an * example, adding two months to January 31st will yield March 31st * whereas adding one month and then one month again will yield either * March 28th or March 29th. Also note that adding 24 hours is not * always the same as adding one day (since days containing daylight * savings time transitions are either 23 or 25 hours in length). * * #GDateTime is available since GLib 2.26. */ struct _GDateTime { /* Microsecond timekeeping within Day */ guint64 usec; /* TimeZone information */ GTimeZone *tz; gint interval; /* 1 is 0001-01-01 in Proleptic Gregorian */ gint32 days; volatile gint ref_count; }; /* Time conversion {{{1 */ #define UNIX_EPOCH_START 719163 #define INSTANT_TO_UNIX(instant) \ ((instant)/USEC_PER_SECOND - UNIX_EPOCH_START * SEC_PER_DAY) #define UNIX_TO_INSTANT(unix) \ (((unix) + UNIX_EPOCH_START * SEC_PER_DAY) * USEC_PER_SECOND) #define DAYS_IN_4YEARS 1461 /* days in 4 years */ #define DAYS_IN_100YEARS 36524 /* days in 100 years */ #define DAYS_IN_400YEARS 146097 /* days in 400 years */ #define USEC_PER_SECOND (G_GINT64_CONSTANT (1000000)) #define USEC_PER_MINUTE (G_GINT64_CONSTANT (60000000)) #define USEC_PER_HOUR (G_GINT64_CONSTANT (3600000000)) #define USEC_PER_MILLISECOND (G_GINT64_CONSTANT (1000)) #define USEC_PER_DAY (G_GINT64_CONSTANT (86400000000)) #define SEC_PER_DAY (G_GINT64_CONSTANT (86400)) #define SECS_PER_MINUTE (60) #define SECS_PER_HOUR (60 * SECS_PER_MINUTE) #define SECS_PER_DAY (24 * SECS_PER_HOUR) #define SECS_PER_YEAR (365 * SECS_PER_DAY) #define SECS_PER_JULIAN (DAYS_PER_PERIOD * SECS_PER_DAY) #define GREGORIAN_LEAP(y) ((((y) % 4) == 0) && (!((((y) % 100) == 0) && (((y) % 400) != 0)))) #define JULIAN_YEAR(d) ((d)->julian / 365.25) #define DAYS_PER_PERIOD (G_GINT64_CONSTANT (2914695)) static const guint16 days_in_months[2][13] = { { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }, { 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 } }; static const guint16 days_in_year[2][13] = { { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 }, { 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366 } }; #ifdef HAVE_LANGINFO_TIME #define GET_AMPM(d) ((g_date_time_get_hour (d) < 12) ? \ nl_langinfo (AM_STR) : \ nl_langinfo (PM_STR)) #define PREFERRED_DATE_TIME_FMT nl_langinfo (D_T_FMT) #define PREFERRED_DATE_FMT nl_langinfo (D_FMT) #define PREFERRED_TIME_FMT nl_langinfo (T_FMT) #define PREFERRED_TIME_FMT nl_langinfo (T_FMT) #define PREFERRED_12HR_TIME_FMT nl_langinfo (T_FMT_AMPM) static const gint weekday_item[2][7] = { { ABDAY_2, ABDAY_3, ABDAY_4, ABDAY_5, ABDAY_6, ABDAY_7, ABDAY_1 }, { DAY_2, DAY_3, DAY_4, DAY_5, DAY_6, DAY_7, DAY_1 } }; static const gint month_item[2][12] = { { ABMON_1, ABMON_2, ABMON_3, ABMON_4, ABMON_5, ABMON_6, ABMON_7, ABMON_8, ABMON_9, ABMON_10, ABMON_11, ABMON_12 }, { MON_1, MON_2, MON_3, MON_4, MON_5, MON_6, MON_7, MON_8, MON_9, MON_10, MON_11, MON_12 }, }; #define WEEKDAY_ABBR(d) nl_langinfo (weekday_item[0][g_date_time_get_day_of_week (d) - 1]) #define WEEKDAY_FULL(d) nl_langinfo (weekday_item[1][g_date_time_get_day_of_week (d) - 1]) #define MONTH_ABBR(d) nl_langinfo (month_item[0][g_date_time_get_month (d) - 1]) #define MONTH_FULL(d) nl_langinfo (month_item[1][g_date_time_get_month (d) - 1]) #else #define GET_AMPM(d) ((g_date_time_get_hour (d) < 12) \ /* Translators: 'before midday' indicator */ \ ? C_("GDateTime", "AM") \ /* Translators: 'after midday' indicator */ \ : C_("GDateTime", "PM")) /* Translators: this is the preferred format for expressing the date and the time */ #define PREFERRED_DATE_TIME_FMT C_("GDateTime", "%a %b %e %H:%M:%S %Y") /* Translators: this is the preferred format for expressing the date */ #define PREFERRED_DATE_FMT C_("GDateTime", "%m/%d/%y") /* Translators: this is the preferred format for expressing the time */ #define PREFERRED_TIME_FMT C_("GDateTime", "%H:%M:%S") /* Translators: this is the preferred format for expressing 12 hour time */ #define PREFERRED_12HR_TIME_FMT C_("GDateTime", "%I:%M:%S %p") #define WEEKDAY_ABBR(d) (get_weekday_name_abbr (g_date_time_get_day_of_week (d))) #define WEEKDAY_FULL(d) (get_weekday_name (g_date_time_get_day_of_week (d))) #define MONTH_ABBR(d) (get_month_name_abbr (g_date_time_get_month (d))) #define MONTH_FULL(d) (get_month_name (g_date_time_get_month (d))) static const gchar * get_month_name (gint month) { switch (month) { case 1: return C_("full month name", "January"); case 2: return C_("full month name", "February"); case 3: return C_("full month name", "March"); case 4: return C_("full month name", "April"); case 5: return C_("full month name", "May"); case 6: return C_("full month name", "June"); case 7: return C_("full month name", "July"); case 8: return C_("full month name", "August"); case 9: return C_("full month name", "September"); case 10: return C_("full month name", "October"); case 11: return C_("full month name", "November"); case 12: return C_("full month name", "December"); default: g_warning ("Invalid month number %d", month); } return NULL; } static const gchar * get_month_name_abbr (gint month) { switch (month) { case 1: return C_("abbreviated month name", "Jan"); case 2: return C_("abbreviated month name", "Feb"); case 3: return C_("abbreviated month name", "Mar"); case 4: return C_("abbreviated month name", "Apr"); case 5: return C_("abbreviated month name", "May"); case 6: return C_("abbreviated month name", "Jun"); case 7: return C_("abbreviated month name", "Jul"); case 8: return C_("abbreviated month name", "Aug"); case 9: return C_("abbreviated month name", "Sep"); case 10: return C_("abbreviated month name", "Oct"); case 11: return C_("abbreviated month name", "Nov"); case 12: return C_("abbreviated month name", "Dec"); default: g_warning ("Invalid month number %d", month); } return NULL; } static const gchar * get_weekday_name (gint day) { switch (day) { case 1: return C_("full weekday name", "Monday"); case 2: return C_("full weekday name", "Tuesday"); case 3: return C_("full weekday name", "Wednesday"); case 4: return C_("full weekday name", "Thursday"); case 5: return C_("full weekday name", "Friday"); case 6: return C_("full weekday name", "Saturday"); case 7: return C_("full weekday name", "Sunday"); default: g_warning ("Invalid week day number %d", day); } return NULL; } static const gchar * get_weekday_name_abbr (gint day) { switch (day) { case 1: return C_("abbreviated weekday name", "Mon"); case 2: return C_("abbreviated weekday name", "Tue"); case 3: return C_("abbreviated weekday name", "Wed"); case 4: return C_("abbreviated weekday name", "Thu"); case 5: return C_("abbreviated weekday name", "Fri"); case 6: return C_("abbreviated weekday name", "Sat"); case 7: return C_("abbreviated weekday name", "Sun"); default: g_warning ("Invalid week day number %d", day); } return NULL; } #endif /* HAVE_LANGINFO_TIME */ static inline gint ymd_to_days (gint year, gint month, gint day) { gint64 days; days = (year - 1) * 365 + ((year - 1) / 4) - ((year - 1) / 100) + ((year - 1) / 400); days += days_in_year[0][month - 1]; if (GREGORIAN_LEAP (year) && month > 2) day++; days += day; return days; } static void g_date_time_get_week_number (GDateTime *datetime, gint *week_number, gint *day_of_week, gint *day_of_year) { gint a, b, c, d, e, f, g, n, s, month, day, year; g_date_time_get_ymd (datetime, &year, &month, &day); if (month <= 2) { a = g_date_time_get_year (datetime) - 1; b = (a / 4) - (a / 100) + (a / 400); c = ((a - 1) / 4) - ((a - 1) / 100) + ((a - 1) / 400); s = b - c; e = 0; f = day - 1 + (31 * (month - 1)); } else { a = year; b = (a / 4) - (a / 100) + (a / 400); c = ((a - 1) / 4) - ((a - 1) / 100) + ((a - 1) / 400); s = b - c; e = s + 1; f = day + (((153 * (month - 3)) + 2) / 5) + 58 + s; } g = (a + b) % 7; d = (f + g - e) % 7; n = f + 3 - d; if (week_number) { if (n < 0) *week_number = 53 - ((g - s) / 5); else if (n > 364 + s) *week_number = 1; else *week_number = (n / 7) + 1; } if (day_of_week) *day_of_week = d + 1; if (day_of_year) *day_of_year = f + 1; } /* Lifecycle {{{1 */ static GDateTime * g_date_time_alloc (GTimeZone *tz) { GDateTime *datetime; datetime = g_slice_new0 (GDateTime); datetime->tz = g_time_zone_ref (tz); datetime->ref_count = 1; return datetime; } /** * g_date_time_ref: * @datetime: a #GDateTime * * Atomically increments the reference count of @datetime by one. * * Return value: the #GDateTime with the reference count increased * * Since: 2.26 */ GDateTime * g_date_time_ref (GDateTime *datetime) { g_return_val_if_fail (datetime != NULL, NULL); g_return_val_if_fail (datetime->ref_count > 0, NULL); g_atomic_int_inc (&datetime->ref_count); return datetime; } /** * g_date_time_unref: * @datetime: a #GDateTime * * Atomically decrements the reference count of @datetime by one. * * When the reference count reaches zero, the resources allocated by * @datetime are freed * * Since: 2.26 */ void g_date_time_unref (GDateTime *datetime) { g_return_if_fail (datetime != NULL); g_return_if_fail (datetime->ref_count > 0); if (g_atomic_int_dec_and_test (&datetime->ref_count)) { g_time_zone_unref (datetime->tz); g_slice_free (GDateTime, datetime); } } /* Internal state transformers {{{1 */ /*< internal > * g_date_time_to_instant: * @datetime: a #GDateTime * * Convert a @datetime into an instant. * * An instant is a number that uniquely describes a particular * microsecond in time, taking time zone considerations into account. * (ie: "03:00 -0400" is the same instant as "02:00 -0500"). * * An instant is always positive but we use a signed return value to * avoid troubles with C. */ static gint64 g_date_time_to_instant (GDateTime *datetime) { gint64 offset; offset = g_time_zone_get_offset (datetime->tz, datetime->interval); offset *= USEC_PER_SECOND; return datetime->days * USEC_PER_DAY + datetime->usec - offset; } /*< internal > * g_date_time_from_instant: * @tz: a #GTimeZone * @instant: a instant in time * * Creates a #GDateTime from a time zone and an instant. * * This might fail if the time ends up being out of range. */ static GDateTime * g_date_time_from_instant (GTimeZone *tz, gint64 instant) { GDateTime *datetime; gint64 offset; if (instant < 0 || instant > G_GINT64_CONSTANT (1000000000000000000)) return NULL; datetime = g_date_time_alloc (tz); datetime->interval = g_time_zone_find_interval (tz, G_TIME_TYPE_UNIVERSAL, INSTANT_TO_UNIX (instant)); offset = g_time_zone_get_offset (datetime->tz, datetime->interval); offset *= USEC_PER_SECOND; instant += offset; datetime->days = instant / USEC_PER_DAY; datetime->usec = instant % USEC_PER_DAY; if (datetime->days < 1 || 3652059 < datetime->days) { g_date_time_unref (datetime); datetime = NULL; } return datetime; } /*< internal > * g_date_time_deal_with_date_change: * @datetime: a #GDateTime * * This function should be called whenever the date changes by adding * days, months or years. It does three things. * * First, we ensure that the date falls between 0001-01-01 and * 9999-12-31 and return %FALSE if it does not. * * Next we update the ->interval field. * * Finally, we ensure that the resulting date and time pair exists (by * ensuring that our time zone has an interval containing it) and * adjusting as required. For example, if we have the time 02:30:00 on * March 13 2010 in Toronto and we add 1 day to it, we would end up with * 2:30am on March 14th, which doesn't exist. In that case, we bump the * time up to 3:00am. */ static gboolean g_date_time_deal_with_date_change (GDateTime *datetime) { GTimeType was_dst; gint64 full_time; gint64 usec; if (datetime->days < 1 || datetime->days > 3652059) return FALSE; was_dst = g_time_zone_is_dst (datetime->tz, datetime->interval); full_time = datetime->days * USEC_PER_DAY + datetime->usec; usec = full_time % USEC_PER_SECOND; full_time /= USEC_PER_SECOND; full_time -= UNIX_EPOCH_START * SEC_PER_DAY; datetime->interval = g_time_zone_adjust_time (datetime->tz, was_dst, &full_time); full_time += UNIX_EPOCH_START * SEC_PER_DAY; full_time *= USEC_PER_SECOND; full_time += usec; datetime->days = full_time / USEC_PER_DAY; datetime->usec = full_time % USEC_PER_DAY; /* maybe daylight time caused us to shift to a different day, * but it definitely didn't push us into a different year */ return TRUE; } static GDateTime * g_date_time_replace_days (GDateTime *datetime, gint days) { GDateTime *new; new = g_date_time_alloc (datetime->tz); new->interval = datetime->interval; new->usec = datetime->usec; new->days = days; if (!g_date_time_deal_with_date_change (new)) { g_date_time_unref (new); new = NULL; } return new; } /* now/unix/timeval Constructors {{{1 */ /*< internal > * g_date_time_new_from_timeval: * @tz: a #GTimeZone * @tv: a #GTimeVal * * Creates a #GDateTime corresponding to the given #GTimeVal @tv in the * given time zone @tz. * * The time contained in a #GTimeVal is always stored in the form of * seconds elapsed since 1970-01-01 00:00:00 UTC, regardless of the * given time zone. * * This call can fail (returning %NULL) if @tv represents a time outside * of the supported range of #GDateTime. * * You should release the return value by calling g_date_time_unref() * when you are done with it. * * Returns: a new #GDateTime, or %NULL * * Since: 2.26 **/ static GDateTime * g_date_time_new_from_timeval (GTimeZone *tz, const GTimeVal *tv) { return g_date_time_from_instant (tz, tv->tv_usec + UNIX_TO_INSTANT (tv->tv_sec)); } /*< internal > * g_date_time_new_from_unix: * @tz: a #GTimeZone * @t: the Unix time * * Creates a #GDateTime corresponding to the given Unix time @t in the * given time zone @tz. * * Unix time is the number of seconds that have elapsed since 1970-01-01 * 00:00:00 UTC, regardless of the time zone given. * * This call can fail (returning %NULL) if @t represents a time outside * of the supported range of #GDateTime. * * You should release the return value by calling g_date_time_unref() * when you are done with it. * * Returns: a new #GDateTime, or %NULL * * Since: 2.26 **/ static GDateTime * g_date_time_new_from_unix (GTimeZone *tz, gint64 secs) { return g_date_time_from_instant (tz, UNIX_TO_INSTANT (secs)); } /** * g_date_time_new_now: * @tz: a #GTimeZone * * Creates a #GDateTime corresponding to this exact instant in the given * time zone @tz. The time is as accurate as the system allows, to a * maximum accuracy of 1 microsecond. * * This function will always succeed unless the system clock is set to * truly insane values (or unless GLib is still being used after the * year 9999). * * You should release the return value by calling g_date_time_unref() * when you are done with it. * * Returns: a new #GDateTime, or %NULL * * Since: 2.26 **/ GDateTime * g_date_time_new_now (GTimeZone *tz) { GTimeVal tv; g_get_current_time (&tv); return g_date_time_new_from_timeval (tz, &tv); } /** * g_date_time_new_now_local: * * Creates a #GDateTime corresponding to this exact instant in the local * time zone. * * This is equivalent to calling g_date_time_new_now() with the time * zone returned by g_time_zone_new_local(). * * Returns: a new #GDateTime, or %NULL * * Since: 2.26 **/ GDateTime * g_date_time_new_now_local (void) { GDateTime *datetime; GTimeZone *local; local = g_time_zone_new_local (); datetime = g_date_time_new_now (local); g_time_zone_unref (local); return datetime; } /** * g_date_time_new_now_utc: * * Creates a #GDateTime corresponding to this exact instant in UTC. * * This is equivalent to calling g_date_time_new_now() with the time * zone returned by g_time_zone_new_utc(). * * Returns: a new #GDateTime, or %NULL * * Since: 2.26 **/ GDateTime * g_date_time_new_now_utc (void) { GDateTime *datetime; GTimeZone *utc; utc = g_time_zone_new_utc (); datetime = g_date_time_new_now (utc); g_time_zone_unref (utc); return datetime; } /** * g_date_time_new_from_unix_local: * @t: the Unix time * * Creates a #GDateTime corresponding to the given Unix time @t in the * local time zone. * * Unix time is the number of seconds that have elapsed since 1970-01-01 * 00:00:00 UTC, regardless of the local time offset. * * This call can fail (returning %NULL) if @t represents a time outside * of the supported range of #GDateTime. * * You should release the return value by calling g_date_time_unref() * when you are done with it. * * Returns: a new #GDateTime, or %NULL * * Since: 2.26 **/ GDateTime * g_date_time_new_from_unix_local (gint64 t) { GDateTime *datetime; GTimeZone *local; local = g_time_zone_new_local (); datetime = g_date_time_new_from_unix (local, t); g_time_zone_unref (local); return datetime; } /** * g_date_time_new_from_unix_utc: * @t: the Unix time * * Creates a #GDateTime corresponding to the given Unix time @t in UTC. * * Unix time is the number of seconds that have elapsed since 1970-01-01 * 00:00:00 UTC. * * This call can fail (returning %NULL) if @t represents a time outside * of the supported range of #GDateTime. * * You should release the return value by calling g_date_time_unref() * when you are done with it. * * Returns: a new #GDateTime, or %NULL * * Since: 2.26 **/ GDateTime * g_date_time_new_from_unix_utc (gint64 t) { GDateTime *datetime; GTimeZone *utc; utc = g_time_zone_new_utc (); datetime = g_date_time_new_from_unix (utc, t); g_time_zone_unref (utc); return datetime; } /** * g_date_time_new_from_timeval_local: * @tv: a #GTimeVal * * Creates a #GDateTime corresponding to the given #GTimeVal @tv in the * local time zone. * * The time contained in a #GTimeVal is always stored in the form of * seconds elapsed since 1970-01-01 00:00:00 UTC, regardless of the * local time offset. * * This call can fail (returning %NULL) if @tv represents a time outside * of the supported range of #GDateTime. * * You should release the return value by calling g_date_time_unref() * when you are done with it. * * Returns: a new #GDateTime, or %NULL * * Since: 2.26 **/ GDateTime * g_date_time_new_from_timeval_local (const GTimeVal *tv) { GDateTime *datetime; GTimeZone *local; local = g_time_zone_new_local (); datetime = g_date_time_new_from_timeval (local, tv); g_time_zone_unref (local); return datetime; } /** * g_date_time_new_from_timeval_utc: * @tv: a #GTimeVal * * Creates a #GDateTime corresponding to the given #GTimeVal @tv in UTC. * * The time contained in a #GTimeVal is always stored in the form of * seconds elapsed since 1970-01-01 00:00:00 UTC. * * This call can fail (returning %NULL) if @tv represents a time outside * of the supported range of #GDateTime. * * You should release the return value by calling g_date_time_unref() * when you are done with it. * * Returns: a new #GDateTime, or %NULL * * Since: 2.26 **/ GDateTime * g_date_time_new_from_timeval_utc (const GTimeVal *tv) { GDateTime *datetime; GTimeZone *utc; utc = g_time_zone_new_utc (); datetime = g_date_time_new_from_timeval (utc, tv); g_time_zone_unref (utc); return datetime; } /* full new functions {{{1 */ /** * g_date_time_new: * @tz: a #GTimeZone * @year: the year component of the date * @month: the month component of the date * @day: the day component of the date * @hour: the hour component of the date * @minute: the minute component of the date * @seconds: the number of seconds past the minute * * Creates a new #GDateTime corresponding to the given date and time in * the time zone @tz. * * The @year must be between 1 and 9999, @month between 1 and 12 and @day * between 1 and 28, 29, 30 or 31 depending on the month and the year. * * @hour must be between 0 and 23 and @minute must be between 0 and 59. * * @seconds must be at least 0.0 and must be strictly less than 60.0. * It will be rounded down to the nearest microsecond. * * If the given time is not representable in the given time zone (for * example, 02:30 on March 14th 2010 in Toronto, due to daylight savings * time) then the time will be rounded up to the nearest existing time * (in this case, 03:00). If this matters to you then you should verify * the return value for containing the same as the numbers you gave. * * In the case that the given time is ambiguous in the given time zone * (for example, 01:30 on November 7th 2010 in Toronto, due to daylight * savings time) then the time falling within standard (ie: * non-daylight) time is taken. * * It not considered a programmer error for the values to this function * to be out of range, but in the case that they are, the function will * return %NULL. * * You should release the return value by calling g_date_time_unref() * when you are done with it. * * Returns: a new #GDateTime, or %NULL * * Since: 2.26 **/ GDateTime * g_date_time_new (GTimeZone *tz, gint year, gint month, gint day, gint hour, gint minute, gdouble seconds) { 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) + (minute * USEC_PER_MINUTE) + (gint64) (seconds * USEC_PER_SECOND); full_time = SEC_PER_DAY * (ymd_to_days (year, month, day) - UNIX_EPOCH_START) + SECS_PER_HOUR * hour + SECS_PER_MINUTE * minute + (int) seconds; datetime->interval = g_time_zone_adjust_time (datetime->tz, G_TIME_TYPE_STANDARD, &full_time); full_time += UNIX_EPOCH_START * SEC_PER_DAY; datetime->days = full_time / SEC_PER_DAY; datetime->usec = (full_time % SEC_PER_DAY) * USEC_PER_SECOND; datetime->usec += ((int) (seconds * USEC_PER_SECOND)) % USEC_PER_SECOND; return datetime; } /** * g_date_time_new_local: * @year: the year component of the date * @month: the month component of the date * @day: the day component of the date * @hour: the hour component of the date * @minute: the minute component of the date * @seconds: the number of seconds past the minute * * Creates a new #GDateTime corresponding to the given date and time in * the local time zone. * * This call is equivalent to calling g_date_time_new() with the time * zone returned by g_time_zone_new_local(). * * Returns: a #GDateTime, or %NULL * * Since: 2.26 **/ GDateTime * g_date_time_new_local (gint year, gint month, gint day, gint hour, gint minute, gdouble seconds) { GDateTime *datetime; GTimeZone *local; local = g_time_zone_new_local (); datetime = g_date_time_new (local, year, month, day, hour, minute, seconds); g_time_zone_unref (local); return datetime; } /** * g_date_time_new_utc: * @year: the year component of the date * @month: the month component of the date * @day: the day component of the date * @hour: the hour component of the date * @minute: the minute component of the date * @seconds: the number of seconds past the minute * * Creates a new #GDateTime corresponding to the given date and time in * UTC. * * This call is equivalent to calling g_date_time_new() with the time * zone returned by g_time_zone_new_utc(). * * Returns: a #GDateTime, or %NULL * * Since: 2.26 **/ GDateTime * g_date_time_new_utc (gint year, gint month, gint day, gint hour, gint minute, gdouble seconds) { GDateTime *datetime; GTimeZone *utc; utc = g_time_zone_new_utc (); datetime = g_date_time_new (utc, year, month, day, hour, minute, seconds); g_time_zone_unref (utc); return datetime; } /* Adders {{{1 */ /** * g_date_time_add: * @datetime: a #GDateTime * @timespan: a #GTimeSpan * * Creates a copy of @datetime and adds the specified timespan to the copy. * * Return value: the newly created #GDateTime which should be freed with * g_date_time_unref(). * * Since: 2.26 */ GDateTime* g_date_time_add (GDateTime *datetime, GTimeSpan timespan) { return g_date_time_from_instant (datetime->tz, timespan + g_date_time_to_instant (datetime)); } /** * g_date_time_add_years: * @datetime: a #GDateTime * @years: the number of years * * Creates a copy of @datetime and adds the specified number of years to the * copy. * * Return value: the newly created #GDateTime which should be freed with * g_date_time_unref(). * * Since: 2.26 */ GDateTime * g_date_time_add_years (GDateTime *datetime, gint years) { gint year, month, day; g_return_val_if_fail (datetime != NULL, NULL); if (years < -10000 || years > 10000) return NULL; g_date_time_get_ymd (datetime, &year, &month, &day); year += years; /* only possible issue is if we've entered a year with no February 29 */ if (month == 2 && day == 29 && !GREGORIAN_LEAP (year)) day = 28; return g_date_time_replace_days (datetime, ymd_to_days (year, month, day)); } /** * g_date_time_add_months: * @datetime: a #GDateTime * @months: the number of months * * Creates a copy of @datetime and adds the specified number of months to the * copy. * * Return value: the newly created #GDateTime which should be freed with * g_date_time_unref(). * * Since: 2.26 */ GDateTime* g_date_time_add_months (GDateTime *datetime, gint months) { gint year, month, day; g_return_val_if_fail (datetime != NULL, NULL); g_date_time_get_ymd (datetime, &year, &month, &day); if (months < -120000 || months > 120000) return NULL; year += months / 12; month += months % 12; if (month < 1) { month += 12; year--; } else if (month > 12) { month -= 12; year++; } day = MIN (day, days_in_months[GREGORIAN_LEAP (year)][month]); return g_date_time_replace_days (datetime, ymd_to_days (year, month, day)); } /** * g_date_time_add_weeks: * @datetime: a #GDateTime * @weeks: the number of weeks * * Creates a copy of @datetime and adds the specified number of weeks to the * copy. * * Return value: the newly created #GDateTime which should be freed with * g_date_time_unref(). * * Since: 2.26 */ GDateTime* g_date_time_add_weeks (GDateTime *datetime, gint weeks) { g_return_val_if_fail (datetime != NULL, NULL); return g_date_time_add_days (datetime, weeks * 7); } /** * g_date_time_add_days: * @datetime: a #GDateTime * @days: the number of days * * Creates a copy of @datetime and adds the specified number of days to the * copy. * * Return value: the newly created #GDateTime which should be freed with * g_date_time_unref(). * * Since: 2.26 */ GDateTime* g_date_time_add_days (GDateTime *datetime, gint days) { g_return_val_if_fail (datetime != NULL, NULL); if (days < -3660000 || days > 3660000) return NULL; return g_date_time_replace_days (datetime, datetime->days + days); } /** * g_date_time_add_hours: * @datetime: a #GDateTime * @hours: the number of hours to add * * Creates a copy of @datetime and adds the specified number of hours * * Return value: the newly created #GDateTime which should be freed with * g_date_time_unref(). * * Since: 2.26 */ GDateTime* g_date_time_add_hours (GDateTime *datetime, gint hours) { return g_date_time_add (datetime, hours * USEC_PER_HOUR); } /** * g_date_time_add_minutes: * @datetime: a #GDateTime * @minutes: the number of minutes to add * * Creates a copy of @datetime adding the specified number of minutes. * * Return value: the newly created #GDateTime which should be freed with * g_date_time_unref(). * * Since: 2.26 */ GDateTime* g_date_time_add_minutes (GDateTime *datetime, gint minutes) { return g_date_time_add (datetime, minutes * USEC_PER_MINUTE); } /** * g_date_time_add_seconds: * @datetime: a #GDateTime * @seconds: the number of seconds to add * * Creates a copy of @datetime and adds the specified number of seconds. * * Return value: the newly created #GDateTime which should be freed with * g_date_time_unref(). * * Since: 2.26 */ GDateTime* g_date_time_add_seconds (GDateTime *datetime, gdouble seconds) { return g_date_time_add (datetime, seconds * USEC_PER_SECOND); } /** * g_date_time_add_full: * @datetime: a #GDateTime * @years: the number of years to add * @months: the number of months to add * @days: the number of days to add * @hours: the number of hours to add * @minutes: the number of minutes to add * @seconds: the number of seconds to add * * Creates a new #GDateTime adding the specified values to the current date and * time in @datetime. * * Return value: the newly created #GDateTime that should be freed with * g_date_time_unref(). * * Since: 2.26 */ GDateTime * g_date_time_add_full (GDateTime *datetime, gint years, gint months, gint days, gint hours, gint minutes, gdouble seconds) { gint year, month, day; gint64 full_time; GDateTime *new; gint interval; g_return_val_if_fail (datetime != NULL, NULL); g_date_time_get_ymd (datetime, &year, &month, &day); months += years * 12; if (months < -120000 || months > 120000) return NULL; if (days < -3660000 || days > 3660000) return NULL; year += months / 12; month += months % 12; if (month < 1) { month += 12; year--; } else if (month > 12) { month -= 12; year++; } day = MIN (day, days_in_months[GREGORIAN_LEAP (year)][month]); /* full_time is now in unix (local) time */ full_time = datetime->usec / USEC_PER_SECOND + SEC_PER_DAY * (ymd_to_days (year, month, day) + days - UNIX_EPOCH_START); interval = g_time_zone_adjust_time (datetime->tz, g_time_zone_is_dst (datetime->tz, datetime->interval), &full_time); /* move to UTC unix time */ full_time -= g_time_zone_get_offset (datetime->tz, interval); /* convert back to an instant, add back fractional seconds */ full_time += UNIX_EPOCH_START * SEC_PER_DAY; full_time = full_time * USEC_PER_SECOND + datetime->usec % USEC_PER_SECOND; /* do the actual addition now */ full_time += (hours * USEC_PER_HOUR) + (minutes * USEC_PER_MINUTE) + (gint64) (seconds * USEC_PER_SECOND); /* find the new interval */ interval = g_time_zone_find_interval (datetime->tz, G_TIME_TYPE_UNIVERSAL, INSTANT_TO_UNIX (full_time)); /* convert back into local time */ full_time += USEC_PER_SECOND * g_time_zone_get_offset (datetime->tz, interval); /* split into days and usec of a new datetime */ new = g_date_time_alloc (datetime->tz); new->interval = interval; new->days = full_time / USEC_PER_DAY; new->usec = full_time % USEC_PER_DAY; /* XXX validate */ return new; } /* Compare, difference, hash, equal {{{1 */ /** * g_date_time_compare: * @dt1: first #GDateTime to compare * @dt2: second #GDateTime to compare * * A comparison function for #GDateTimes that is suitable * as a #GCompareFunc. Both #GDateTimes must be non-%NULL. * * Return value: -1, 0 or 1 if @dt1 is less than, equal to or greater * than @dt2. * * Since: 2.26 */ gint g_date_time_compare (gconstpointer dt1, gconstpointer dt2) { gint64 difference; difference = g_date_time_difference ((GDateTime *) dt1, (GDateTime *) dt2); if (difference < 0) return -1; else if (difference > 0) return 1; else return 0; } /** * g_date_time_difference: * @end: a #GDateTime * @begin: a #GDateTime * * Calculates the difference in time between @end and @begin. The * #GTimeSpan that is returned is effectively @end - @begin (ie: * positive if the first parameter is larger). * * Return value: the difference between the two #GDateTime, as a time * span expressed in microseconds. * * Since: 2.26 */ GTimeSpan g_date_time_difference (GDateTime *end, GDateTime *begin) { g_return_val_if_fail (begin != NULL, 0); g_return_val_if_fail (end != NULL, 0); return g_date_time_to_instant (end) - g_date_time_to_instant (begin); } /** * g_date_time_hash: * @datetime: a #GDateTime * * Hashes @datetime into a #guint, suitable for use within #GHashTable. * * Return value: a #guint containing the hash * * Since: 2.26 */ guint g_date_time_hash (gconstpointer datetime) { return g_date_time_to_instant ((GDateTime *) datetime); } /** * g_date_time_equal: * @dt1: a #GDateTime * @dt2: a #GDateTime * * Checks to see if @dt1 and @dt2 are equal. * * Equal here means that they represent the same moment after converting * them to the same time zone. * * Return value: %TRUE if @dt1 and @dt2 are equal * * Since: 2.26 */ gboolean g_date_time_equal (gconstpointer dt1, gconstpointer dt2) { return g_date_time_difference ((GDateTime *) dt1, (GDateTime *) dt2) == 0; } /* Year, Month, Day Getters {{{1 */ /** * g_date_time_get_ymd: * @datetime: a #GDateTime. * @year: (out) (allow-none): the return location for the gregorian year, or %NULL. * @month: (out) (allow-none): the return location for the month of the year, or %NULL. * @day: (out) (allow-none): the return location for the day of the month, or %NULL. * * Retrieves the Gregorian day, month, and year of a given #GDateTime. * * Since: 2.26 **/ void g_date_time_get_ymd (GDateTime *datetime, gint *year, gint *month, gint *day) { gint the_year; gint the_month; gint the_day; gint remaining_days; gint y100_cycles; gint y4_cycles; gint y1_cycles; gint preceding; gboolean leap; g_return_if_fail (datetime != NULL); remaining_days = datetime->days; /* * We need to convert an offset in days to its year/month/day representation. * Leap years makes this a little trickier than it should be, so we use * 400, 100 and 4 years cycles here to get to the correct year. */ /* Our days offset starts sets 0001-01-01 as day 1, if it was day 0 our * math would be simpler, so let's do it */ remaining_days--; the_year = (remaining_days / DAYS_IN_400YEARS) * 400 + 1; remaining_days = remaining_days % DAYS_IN_400YEARS; y100_cycles = remaining_days / DAYS_IN_100YEARS; remaining_days = remaining_days % DAYS_IN_100YEARS; the_year += y100_cycles * 100; y4_cycles = remaining_days / DAYS_IN_4YEARS; remaining_days = remaining_days % DAYS_IN_4YEARS; the_year += y4_cycles * 4; y1_cycles = remaining_days / 365; the_year += y1_cycles; remaining_days = remaining_days % 365; if (y1_cycles == 4 || y100_cycles == 4) { g_assert (remaining_days == 0); /* special case that indicates that the date is actually one year before, * in the 31th of December */ the_year--; the_month = 12; the_day = 31; goto end; } /* now get the month and the day */ leap = y1_cycles == 3 && (y4_cycles != 24 || y100_cycles == 3); g_assert (leap == GREGORIAN_LEAP(the_year)); the_month = (remaining_days + 50) >> 5; preceding = (days_in_year[0][the_month - 1] + (the_month > 2 && leap)); if (preceding > remaining_days) { /* estimate is too large */ the_month -= 1; preceding -= leap ? days_in_months[1][the_month] : days_in_months[0][the_month]; } remaining_days -= preceding; g_assert(0 <= remaining_days); the_day = remaining_days + 1; end: if (year) *year = the_year; if (month) *month = the_month; if (day) *day = the_day; } /** * g_date_time_get_year: * @datetime: A #GDateTime * * Retrieves the year represented by @datetime in the Gregorian calendar. * * Return value: the year represented by @datetime * * Since: 2.26 */ gint g_date_time_get_year (GDateTime *datetime) { gint year; g_return_val_if_fail (datetime != NULL, 0); g_date_time_get_ymd (datetime, &year, NULL, NULL); return year; } /** * g_date_time_get_month: * @datetime: a #GDateTime * * Retrieves the month of the year represented by @datetime in the Gregorian * calendar. * * Return value: the month represented by @datetime * * Since: 2.26 */ gint g_date_time_get_month (GDateTime *datetime) { gint month; g_return_val_if_fail (datetime != NULL, 0); g_date_time_get_ymd (datetime, NULL, &month, NULL); return month; } /** * g_date_time_get_day_of_month: * @datetime: a #GDateTime * * Retrieves the day of the month represented by @datetime in the gregorian * calendar. * * Return value: the day of the month * * Since: 2.26 */ gint g_date_time_get_day_of_month (GDateTime *datetime) { gint day_of_year, i; const guint16 *days; guint16 last = 0; g_return_val_if_fail (datetime != NULL, 0); days = days_in_year[GREGORIAN_LEAP (g_date_time_get_year (datetime)) ? 1 : 0]; g_date_time_get_week_number (datetime, NULL, NULL, &day_of_year); for (i = 1; i <= 12; i++) { if (days [i] >= day_of_year) return day_of_year - last; last = days [i]; } g_warn_if_reached (); return 0; } /* Week of year / day of week getters {{{1 */ /** * g_date_time_get_week_numbering_year: * @datetime: a #GDateTime * * Returns the ISO 8601 week-numbering year in which the week containing * @datetime falls. * * This function, taken together with g_date_time_get_week_of_year() and * g_date_time_get_day_of_week() can be used to determine the full ISO * week date on which @datetime falls. * * This is usually equal to the normal Gregorian year (as returned by * g_date_time_get_year()), except as detailed below: * * For Thursday, the week-numbering year is always equal to the usual * calendar year. For other days, the number is such that every day * within a complete week (Monday to Sunday) is contained within the * same week-numbering year. * * For Monday, Tuesday and Wednesday occurring near the end of the year, * this may mean that the week-numbering year is one greater than the * calendar year (so that these days have the same week-numbering year * as the Thursday occurring early in the next year). * * For Friday, Saturaday and Sunday occurring near the start of the year, * this may mean that the week-numbering year is one less than the * calendar year (so that these days have the same week-numbering year * as the Thursday occurring late in the previous year). * * An equivalent description is that the week-numbering year is equal to * the calendar year containing the majority of the days in the current * week (Monday to Sunday). * * Note that January 1 0001 in the proleptic Gregorian calendar is a * Monday, so this function never returns 0. * * Returns: the ISO 8601 week-numbering year for @datetime * * Since: 2.26 **/ gint g_date_time_get_week_numbering_year (GDateTime *datetime) { gint year, month, day, weekday; g_date_time_get_ymd (datetime, &year, &month, &day); weekday = g_date_time_get_day_of_week (datetime); /* January 1, 2, 3 might be in the previous year if they occur after * Thursday. * * Jan 1: Friday, Saturday, Sunday => day 1: weekday 5, 6, 7 * Jan 2: Saturday, Sunday => day 2: weekday 6, 7 * Jan 3: Sunday => day 3: weekday 7 * * So we have a special case if (day - weekday) <= -4 */ if (month == 1 && (day - weekday) <= -4) return year - 1; /* December 29, 30, 31 might be in the next year if they occur before * Thursday. * * Dec 31: Monday, Tuesday, Wednesday => day 31: weekday 1, 2, 3 * Dec 30: Monday, Tuesday => day 30: weekday 1, 2 * Dec 29: Monday => day 29: weekday 1 * * So we have a special case if (day - weekday) >= 28 */ else if (month == 12 && (day - weekday) >= 28) return year + 1; else return year; } /** * g_date_time_get_week_of_year: * @datetime: a #GDateTime * * Returns the ISO 8601 week number for the week containing @datetime. * The ISO 8601 week number is the same for every day of the week (from * Moday through Sunday). That can produce some unusual results * (described below). * * The first week of the year is week 1. This is the week that contains * the first Thursday of the year. Equivalently, this is the first week * that has more than 4 of its days falling within the calendar year. * * The value 0 is never returned by this function. Days contained * within a year but occurring before the first ISO 8601 week of that * year are considered as being contained in the last week of the * previous year. Similarly, the final days of a calendar year may be * considered as being part of the first ISO 8601 week of the next year * if 4 or more days of that week are contained within the new year. * * Returns: the ISO 8601 week number for @datetime. * * Since: 2.26 */ gint g_date_time_get_week_of_year (GDateTime *datetime) { gint weeknum; g_return_val_if_fail (datetime != NULL, 0); g_date_time_get_week_number (datetime, &weeknum, NULL, NULL); return weeknum; } /** * g_date_time_get_day_of_week: * @datetime: a #GDateTime * * Retrieves the ISO 8601 day of the week on which @datetime falls (1 is * Monday, 2 is Tuesday... 7 is Sunday). * * Return value: the day of the week * * Since: 2.26 */ gint g_date_time_get_day_of_week (GDateTime *datetime) { g_return_val_if_fail (datetime != NULL, 0); return (datetime->days - 1) % 7 + 1; } /* Day of year getter {{{1 */ /** * g_date_time_get_day_of_year: * @datetime: a #GDateTime * * Retrieves the day of the year represented by @datetime in the Gregorian * calendar. * * Return value: the day of the year * * Since: 2.26 */ gint g_date_time_get_day_of_year (GDateTime *datetime) { gint doy = 0; g_return_val_if_fail (datetime != NULL, 0); g_date_time_get_week_number (datetime, NULL, NULL, &doy); return doy; } /* Time component getters {{{1 */ /** * g_date_time_get_hour: * @datetime: a #GDateTime * * Retrieves the hour of the day represented by @datetime * * Return value: the hour of the day * * Since: 2.26 */ gint g_date_time_get_hour (GDateTime *datetime) { g_return_val_if_fail (datetime != NULL, 0); return (datetime->usec / USEC_PER_HOUR); } /** * g_date_time_get_minute: * @datetime: a #GDateTime * * Retrieves the minute of the hour represented by @datetime * * Return value: the minute of the hour * * Since: 2.26 */ gint g_date_time_get_minute (GDateTime *datetime) { g_return_val_if_fail (datetime != NULL, 0); return (datetime->usec % USEC_PER_HOUR) / USEC_PER_MINUTE; } /** * g_date_time_get_second: * @datetime: a #GDateTime * * Retrieves the second of the minute represented by @datetime * * Return value: the second represented by @datetime * * Since: 2.26 */ gint g_date_time_get_second (GDateTime *datetime) { g_return_val_if_fail (datetime != NULL, 0); return (datetime->usec % USEC_PER_MINUTE) / USEC_PER_SECOND; } /** * g_date_time_get_microsecond: * @datetime: a #GDateTime * * Retrieves the microsecond of the date represented by @datetime * * Return value: the microsecond of the second * * Since: 2.26 */ gint g_date_time_get_microsecond (GDateTime *datetime) { g_return_val_if_fail (datetime != NULL, 0); return (datetime->usec % USEC_PER_SECOND); } /** * g_date_time_get_seconds: * @datetime: a #GDateTime * * Retrieves the number of seconds since the start of the last minute, * including the fractional part. * * Returns: the number of seconds * * Since: 2.26 **/ gdouble g_date_time_get_seconds (GDateTime *datetime) { g_return_val_if_fail (datetime != NULL, 0); return (datetime->usec % USEC_PER_MINUTE) / 1000000.0; } /* Exporters {{{1 */ /** * g_date_time_to_unix: * @datetime: a #GDateTime * * Gives the Unix time corresponding to @datetime, rounding down to the * nearest second. * * Unix time is the number of seconds that have elapsed since 1970-01-01 * 00:00:00 UTC, regardless of the time zone associated with @datetime. * * Returns: the Unix time corresponding to @datetime * * Since: 2.26 **/ gint64 g_date_time_to_unix (GDateTime *datetime) { return INSTANT_TO_UNIX (g_date_time_to_instant (datetime)); } /** * g_date_time_to_timeval: * @datetime: a #GDateTime * @tv: a #GTimeVal to modify * * Stores the instant in time that @datetime represents into @tv. * * The time contained in a #GTimeVal is always stored in the form of * seconds elapsed since 1970-01-01 00:00:00 UTC, regardless of the time * zone associated with @datetime. * * On systems where 'long' is 32bit (ie: all 32bit systems and all * Windows systems), a #GTimeVal is incapable of storing the entire * range of values that #GDateTime is capable of expressing. On those * systems, this function returns %FALSE to indicate that the time is * out of range. * * On systems where 'long' is 64bit, this function never fails. * * Returns: %TRUE if successful, else %FALSE * * Since: 2.26 **/ gboolean g_date_time_to_timeval (GDateTime *datetime, GTimeVal *tv) { tv->tv_sec = INSTANT_TO_UNIX (g_date_time_to_instant (datetime)); tv->tv_usec = datetime->usec % USEC_PER_SECOND; return TRUE; } /* Timezone queries {{{1 */ /** * g_date_time_get_utc_offset: * @datetime: a #GDateTime * * Determines the offset to UTC in effect at the time and in the time * zone of @datetime. * * The offset is the number of microseconds that you add to UTC time to * arrive at local time for the time zone (ie: negative numbers for time * zones west of GMT, positive numbers for east). * * If @datetime represents UTC time, then the offset is always zero. * * Returns: the number of microseconds that should be added to UTC to * get the local time * * Since: 2.26 **/ GTimeSpan g_date_time_get_utc_offset (GDateTime *datetime) { gint offset; g_return_val_if_fail (datetime != NULL, 0); offset = g_time_zone_get_offset (datetime->tz, datetime->interval); return (gint64) offset * USEC_PER_SECOND; } /** * g_date_time_get_timezone_abbreviation: * @datetime: a #GDateTime * * Determines the time zone abbreviation to be used at the time and in * the time zone of @datetime. * * For example, in Toronto this is currently "EST" during the winter * months and "EDT" during the summer months when daylight savings * time is in effect. * * Returns: (transfer none): the time zone abbreviation. The returned * string is owned by the #GDateTime and it should not be * modified or freed * * Since: 2.26 **/ const gchar * g_date_time_get_timezone_abbreviation (GDateTime *datetime) { g_return_val_if_fail (datetime != NULL, NULL); return g_time_zone_get_abbreviation (datetime->tz, datetime->interval); } /** * g_date_time_is_daylight_savings: * @datetime: a #GDateTime * * Determines if daylight savings time is in effect at the time and in * the time zone of @datetime. * * Returns: %TRUE if daylight savings time is in effect * * Since: 2.26 **/ gboolean g_date_time_is_daylight_savings (GDateTime *datetime) { g_return_val_if_fail (datetime != NULL, FALSE); return g_time_zone_is_dst (datetime->tz, datetime->interval); } /* Timezone convert {{{1 */ /** * g_date_time_to_timezone: * @datetime: a #GDateTime * @tz: the new #GTimeZone * * Create a new #GDateTime corresponding to the same instant in time as * @datetime, but in the time zone @tz. * * This call can fail in the case that the time goes out of bounds. For * example, converting 0001-01-01 00:00:00 UTC to a time zone west of * Greenwich will fail (due to the year 0 being out of range). * * You should release the return value by calling g_date_time_unref() * when you are done with it. * * Returns: a new #GDateTime, or %NULL * * Since: 2.26 **/ GDateTime * g_date_time_to_timezone (GDateTime *datetime, GTimeZone *tz) { return g_date_time_from_instant (tz, g_date_time_to_instant (datetime)); } /** * g_date_time_to_local: * @datetime: a #GDateTime * * Creates a new #GDateTime corresponding to the same instant in time as * @datetime, but in the local time zone. * * This call is equivalent to calling g_date_time_to_timezone() with the * time zone returned by g_time_zone_new_local(). * * Returns: the newly created #GDateTime * * Since: 2.26 **/ GDateTime * g_date_time_to_local (GDateTime *datetime) { GDateTime *new; GTimeZone *local; local = g_time_zone_new_local (); new = g_date_time_to_timezone (datetime, local); g_time_zone_unref (local); return new; } /** * g_date_time_to_utc: * @datetime: a #GDateTime * * Creates a new #GDateTime corresponding to the same instant in time as * @datetime, but in UTC. * * This call is equivalent to calling g_date_time_to_timezone() with the * time zone returned by g_time_zone_new_utc(). * * Returns: the newly created #GDateTime * * Since: 2.26 **/ GDateTime * g_date_time_to_utc (GDateTime *datetime) { GDateTime *new; GTimeZone *utc; utc = g_time_zone_new_utc (); new = g_date_time_to_timezone (datetime, utc); g_time_zone_unref (utc); return new; } /* 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, gchar *pad, gint width, guint32 number) { const gchar *ascii_digits[10] = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" }; const gchar **digits = ascii_digits; const gchar *tmp[10]; gint i = 0; g_return_if_fail (width <= 10); #ifdef HAVE_LANGINFO_OUTDIGIT if (use_alt_digits) { static const gchar *alt_digits[10]; static gsize initialised; /* 2^32 has 10 digits */ if G_UNLIKELY (g_once_init_enter (&initialised)) { #define DO_DIGIT(n) \ alt_digits[n] = nl_langinfo (_NL_CTYPE_OUTDIGIT## n ##_MB) DO_DIGIT(0); DO_DIGIT(1); DO_DIGIT(2); DO_DIGIT(3); DO_DIGIT(4); DO_DIGIT(5); DO_DIGIT(6); DO_DIGIT(7); DO_DIGIT(8); DO_DIGIT(9); #undef DO_DIGIT g_once_init_leave (&initialised, TRUE); } digits = alt_digits; } #endif /* HAVE_LANGINFO_OUTDIGIT */ do { tmp[i++] = digits[number % 10]; number /= 10; } while (number); while (pad && i < width) tmp[i++] = *pad == '0' ? digits[0] : pad; /* should really be impossible */ g_assert (i <= 10); while (i) g_string_append (str, tmp[--i]); } static gboolean g_date_time_format_locale (GDateTime *datetime, const gchar *format, GString *outstr, gboolean locale_is_utf8); /* g_date_time_format() subroutine that takes a locale-encoded format * string and produces a locale-encoded date/time string. */ static gboolean g_date_time_locale_format_locale (GDateTime *datetime, const gchar *format, GString *outstr, gboolean locale_is_utf8) { gchar *utf8_format; gboolean success; if (locale_is_utf8) return g_date_time_format_locale (datetime, format, outstr, locale_is_utf8); utf8_format = g_locale_to_utf8 (format, -1, NULL, NULL, NULL); if (!utf8_format) return FALSE; success = g_date_time_format_locale (datetime, utf8_format, outstr, locale_is_utf8); g_free (utf8_format); return success; } /* g_date_time_format() subroutine that takes a UTF-8 format * string and produces a locale-encoded date/time string. */ static gboolean g_date_time_format_locale (GDateTime *datetime, const gchar *format, GString *outstr, gboolean locale_is_utf8) { guint len; guint colons; gchar *tmp; gunichar c; gboolean alt_digits = FALSE; gboolean pad_set = FALSE; gchar *pad = ""; gchar *ampm; const gchar *tz; while (*format) { len = strcspn (format, "%"); if (len) { if (locale_is_utf8) g_string_append_len (outstr, format, len); else { tmp = g_locale_from_utf8 (format, len, NULL, NULL, NULL); if (!tmp) return FALSE; g_string_append (outstr, tmp); g_free (tmp); } } format += len; if (!*format) break; g_assert (*format == '%'); format++; if (!*format) break; colons = 0; alt_digits = FALSE; pad_set = FALSE; next_mod: c = g_utf8_get_char (format); format = g_utf8_next_char (format); switch (c) { case 'a': g_string_append (outstr, WEEKDAY_ABBR (datetime)); break; case 'A': g_string_append (outstr, WEEKDAY_FULL (datetime)); break; case 'b': g_string_append (outstr, MONTH_ABBR (datetime)); break; case 'B': g_string_append (outstr, MONTH_FULL (datetime)); break; case 'c': { if (!g_date_time_locale_format_locale (datetime, PREFERRED_DATE_TIME_FMT, outstr, locale_is_utf8)) return FALSE; } break; case 'C': format_number (outstr, alt_digits, pad_set ? pad : "0", 2, g_date_time_get_year (datetime) / 100); break; case 'd': format_number (outstr, alt_digits, pad_set ? pad : "0", 2, g_date_time_get_day_of_month (datetime)); break; case 'e': format_number (outstr, alt_digits, pad_set ? pad : " ", 2, g_date_time_get_day_of_month (datetime)); break; case 'F': g_string_append_printf (outstr, "%d-%02d-%02d", g_date_time_get_year (datetime), g_date_time_get_month (datetime), g_date_time_get_day_of_month (datetime)); break; case 'g': format_number (outstr, alt_digits, pad_set ? pad : "0", 2, g_date_time_get_week_numbering_year (datetime) % 100); break; case 'G': format_number (outstr, alt_digits, pad_set ? pad : 0, 0, g_date_time_get_week_numbering_year (datetime)); break; case 'h': g_string_append (outstr, MONTH_ABBR (datetime)); break; case 'H': format_number (outstr, alt_digits, pad_set ? pad : "0", 2, g_date_time_get_hour (datetime)); break; case 'I': format_number (outstr, alt_digits, pad_set ? pad : "0", 2, (g_date_time_get_hour (datetime) + 11) % 12 + 1); break; case 'j': format_number (outstr, alt_digits, pad_set ? pad : "0", 3, g_date_time_get_day_of_year (datetime)); break; case 'k': format_number (outstr, alt_digits, pad_set ? pad : " ", 2, g_date_time_get_hour (datetime)); break; case 'l': format_number (outstr, alt_digits, pad_set ? pad : " ", 2, (g_date_time_get_hour (datetime) + 11) % 12 + 1); break; case 'n': g_string_append_c (outstr, '\n'); break; case 'm': format_number (outstr, alt_digits, pad_set ? pad : "0", 2, g_date_time_get_month (datetime)); break; case 'M': format_number (outstr, alt_digits, pad_set ? pad : "0", 2, g_date_time_get_minute (datetime)); break; case 'O': alt_digits = TRUE; goto next_mod; case 'p': ampm = (gchar *) GET_AMPM (datetime); if (!locale_is_utf8) { ampm = tmp = g_locale_to_utf8 (ampm, -1, NULL, NULL, NULL); if (!tmp) return FALSE; } ampm = g_utf8_strup (ampm, -1); if (!locale_is_utf8) { g_free (tmp); tmp = g_locale_from_utf8 (ampm, -1, NULL, NULL, NULL); g_free (ampm); if (!tmp) return FALSE; ampm = tmp; } g_string_append (outstr, ampm); g_free (ampm); break; case 'P': ampm = (gchar *) GET_AMPM (datetime); if (!locale_is_utf8) { ampm = tmp = g_locale_to_utf8 (ampm, -1, NULL, NULL, NULL); if (!tmp) return FALSE; } ampm = g_utf8_strdown (ampm, -1); if (!locale_is_utf8) { g_free (tmp); tmp = g_locale_from_utf8 (ampm, -1, NULL, NULL, NULL); g_free (ampm); if (!tmp) return FALSE; ampm = tmp; } g_string_append (outstr, ampm); g_free (ampm); break; case 'r': { if (!g_date_time_locale_format_locale (datetime, PREFERRED_12HR_TIME_FMT, outstr, locale_is_utf8)) return FALSE; } break; case 'R': g_string_append_printf (outstr, "%02d:%02d", g_date_time_get_hour (datetime), g_date_time_get_minute (datetime)); break; case 's': g_string_append_printf (outstr, "%" G_GINT64_FORMAT, g_date_time_to_unix (datetime)); break; case 'S': format_number (outstr, alt_digits, pad_set ? pad : "0", 2, g_date_time_get_second (datetime)); break; case 't': g_string_append_c (outstr, '\t'); break; case 'T': g_string_append_printf (outstr, "%02d:%02d:%02d", g_date_time_get_hour (datetime), g_date_time_get_minute (datetime), g_date_time_get_second (datetime)); break; case 'u': format_number (outstr, alt_digits, 0, 0, g_date_time_get_day_of_week (datetime)); break; case 'V': format_number (outstr, alt_digits, pad_set ? pad : "0", 2, g_date_time_get_week_of_year (datetime)); break; case 'w': format_number (outstr, alt_digits, 0, 0, g_date_time_get_day_of_week (datetime) % 7); break; case 'x': { if (!g_date_time_locale_format_locale (datetime, PREFERRED_DATE_FMT, outstr, locale_is_utf8)) return FALSE; } break; case 'X': { if (!g_date_time_locale_format_locale (datetime, PREFERRED_TIME_FMT, outstr, locale_is_utf8)) return FALSE; } break; case 'y': format_number (outstr, alt_digits, pad_set ? pad : "0", 2, g_date_time_get_year (datetime) % 100); break; case 'Y': format_number (outstr, alt_digits, 0, 0, g_date_time_get_year (datetime)); break; case 'z': { 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); if (!locale_is_utf8) { tz = tmp = g_locale_from_utf8 (tz, -1, NULL, NULL, NULL); if (!tmp) return FALSE; } g_string_append (outstr, tz); if (!locale_is_utf8) g_free (tmp); break; case '%': g_string_append_c (outstr, '%'); break; case '-': pad_set = TRUE; pad = ""; goto next_mod; case '_': pad_set = TRUE; pad = " "; goto next_mod; case '0': 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; } } return TRUE; } /** * g_date_time_format: * @datetime: A #GDateTime * @format: a valid UTF-8 string, containing the format for the * #GDateTime * * Creates a newly allocated string representing the requested @format. * * The format strings understood by this function are a subset of the * strftime() format language as specified by C99. The \%D, \%U and \%W * conversions are not supported, nor is the 'E' modifier. The GNU * extensions \%k, \%l, \%s and \%P are supported, however, as are the * '0', '_' and '-' modifiers. * * In contrast to strftime(), this function always produces a UTF-8 * string, regardless of the current locale. Note that the rendering of * many formats is locale-dependent and may not match the strftime() * output exactly. * * The following format specifiers are supported: * * * * \%a: * * the abbreviated weekday name according to the current locale * * * \%A: * * the full weekday name according to the current locale * * * \%b: * * the abbreviated month name according to the current locale * * * \%B: * * the full month name according to the current locale * * * \%c: * * the preferred date and time representation for the current locale * * * \%C: * * The century number (year/100) as a 2-digit integer (00-99) * * * \%d: * * the day of the month as a decimal number (range 01 to 31) * * * \%e: * * the day of the month as a decimal number (range 1 to 31) * * * \%F: * * equivalent to \%Y-\%m-\%d (the ISO 8601 date * format) * * * \%g: * * the last two digits of the ISO 8601 week-based year as a decimal * number (00-99). This works well with \%V and \%u. * * * \%G: * * the ISO 8601 week-based year as a decimal number. This works well * with \%V and \%u. * * * \%h: * * equivalent to \%b * * * \%H: * * the hour as a decimal number using a 24-hour clock (range 00 to * 23) * * * \%I: * * the hour as a decimal number using a 12-hour clock (range 01 to * 12) * * * \%j: * * the day of the year as a decimal number (range 001 to 366) * * * \%k: * * the hour (24-hour clock) as a decimal number (range 0 to 23); * single digits are preceded by a blank * * * \%l: * * the hour (12-hour clock) as a decimal number (range 1 to 12); * single digits are preceded by a blank * * * \%m: * * the month as a decimal number (range 01 to 12) * * * \%M: * * the minute as a decimal number (range 00 to 59) * * * \%p: * * either "AM" or "PM" according to the given time value, or the * corresponding strings for the current locale. Noon is treated as * "PM" and midnight as "AM". * * * \%P: * * like \%p but lowercase: "am" or "pm" or a corresponding string for * the current locale * * * \%r: * * the time in a.m. or p.m. notation * * * \%R: * * the time in 24-hour notation (\%H:\%M) * * * \%s: * * the number of seconds since the Epoch, that is, since 1970-01-01 * 00:00:00 UTC * * * \%S: * * the second as a decimal number (range 00 to 60) * * * \%t: * * a tab character * * * \%T: * * the time in 24-hour notation with seconds (\%H:\%M:\%S) * * * \%u: * * the ISO 8601 standard day of the week as a decimal, range 1 to 7, * Monday being 1. This works well with \%G and \%V. * * * \%V: * * the ISO 8601 standard week number of the current year as a decimal * number, range 01 to 53, where week 1 is the first week that has at * least 4 days in the new year. See g_date_time_get_week_of_year(). * This works well with \%G and \%u. * * * \%w: * * the day of the week as a decimal, range 0 to 6, Sunday being 0. * This is not the ISO 8601 standard format -- use \%u instead. * * * \%x: * * the preferred date representation for the current locale without * the time * * * \%X: * * the preferred time representation for the current locale without * the date * * * \%y: * * the year as a decimal number without the century * * * \%Y: * * the year as a decimal number including the century * * * \%z: * * the time zone as an offset from UTC (+hhmm) * * * \%:z: * * the time zone as an offset from UTC (+hh:mm). This is a gnulib strftime extension. Since: 2.38 * * * \%::z: * * the time zone as an offset from UTC (+hh:mm:ss). This is a gnulib strftime extension. Since: 2.38 * * * \%:::z: * * 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 * * * \%Z: * * the time zone or name or abbreviation * * * \%\%: * * a literal \% character * * * * Some conversion specifications can be modified by preceding the * conversion specifier by one or more modifier characters. The * following modifiers are supported for many of the numeric * conversions: * * * O * * Use alternative numeric symbols, if the current locale * supports those. * * * * _ * * Pad a numeric result with spaces. * This overrides the default padding for the specifier. * * * * - * * Do not pad a numeric result. * This overrides the default padding for the specifier. * * * * 0 * * Pad a numeric result with zeros. * This overrides the default padding for the specifier. * * * * * Returns: a newly allocated string formatted to the requested format * or %NULL in the case that there was an error. The string * should be freed with g_free(). * * Since: 2.26 */ gchar * g_date_time_format (GDateTime *datetime, const gchar *format) { GString *outstr; gchar *utf8; gboolean locale_is_utf8 = g_get_charset (NULL); g_return_val_if_fail (datetime != NULL, NULL); g_return_val_if_fail (format != NULL, NULL); g_return_val_if_fail (g_utf8_validate (format, -1, NULL), NULL); outstr = g_string_sized_new (strlen (format) * 2); if (!g_date_time_format_locale (datetime, format, outstr, locale_is_utf8)) { g_string_free (outstr, TRUE); return NULL; } if (locale_is_utf8) return g_string_free (outstr, FALSE); utf8 = g_locale_to_utf8 (outstr->str, outstr->len, NULL, NULL, NULL); g_string_free (outstr, TRUE); return utf8; } /* Epilogue {{{1 */ /* vim:set foldmethod=marker: */ pkg-config-0.29.1/glib/glib/gvariant-core.h0000664000175000017500000000316412651243552015327 00000000000000/* * Copyright © 2007, 2008 Ryan Lortie * Copyright © 2010 Codethink Limited * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * 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_VARIANT_CORE_H__ #define __G_VARIANT_CORE_H__ #include #include #include /* gvariant-core.c */ GVariant * g_variant_new_from_children (const GVariantType *type, GVariant **children, gsize n_children, gboolean trusted); gboolean g_variant_is_trusted (GVariant *value); GVariantTypeInfo * g_variant_get_type_info (GVariant *value); #endif /* __G_VARIANT_CORE_H__ */ pkg-config-0.29.1/glib/glib/goption.h0000664000175000017500000003731712651243552014254 00000000000000/* goption.h - Option parser * * Copyright (C) 2004 Anders Carlsson * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __G_OPTION_H__ #define __G_OPTION_H__ #if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) #error "Only can be included directly." #endif #include #include G_BEGIN_DECLS /** * GOptionContext: * * A GOptionContext struct defines which options * are accepted by the commandline option parser. The struct has only private * fields and should not be directly accessed. */ typedef struct _GOptionContext GOptionContext; /** * GOptionGroup: * * A GOptionGroup struct defines the options in a single * group. The struct has only private fields and should not be directly accessed. * * All options in a group share the same translation function. Libraries which * need to parse commandline options are expected to provide a function for * getting a GOptionGroup holding their options, which * the application can then add to its #GOptionContext. */ typedef struct _GOptionGroup GOptionGroup; typedef struct _GOptionEntry GOptionEntry; /** * GOptionFlags: * @G_OPTION_FLAG_HIDDEN: The option doesn't appear in * output. * @G_OPTION_FLAG_IN_MAIN: The option appears in the main section of the * output, even if it is defined in a group. * @G_OPTION_FLAG_REVERSE: For options of the %G_OPTION_ARG_NONE kind, this flag * indicates that the sense of the option is reversed. * @G_OPTION_FLAG_NO_ARG: For options of the %G_OPTION_ARG_CALLBACK kind, * this flag indicates that the callback does not take any argument * (like a %G_OPTION_ARG_NONE option). Since 2.8 * @G_OPTION_FLAG_FILENAME: For options of the %G_OPTION_ARG_CALLBACK * kind, this flag indicates that the argument should be passed to the * callback in the GLib filename encoding rather than UTF-8. Since 2.8 * @G_OPTION_FLAG_OPTIONAL_ARG: For options of the %G_OPTION_ARG_CALLBACK * kind, this flag indicates that the argument supply is optional. If no argument * is given then data of %GOptionParseFunc will be set to NULL. Since 2.8 * @G_OPTION_FLAG_NOALIAS: This flag turns off the automatic conflict resolution * which prefixes long option names with groupname- if * there is a conflict. This option should only be used in situations where * aliasing is necessary to model some legacy commandline interface. It is * not safe to use this option, unless all option groups are under your * direct control. Since 2.8. * * Flags which modify individual options. */ typedef enum { G_OPTION_FLAG_HIDDEN = 1 << 0, G_OPTION_FLAG_IN_MAIN = 1 << 1, G_OPTION_FLAG_REVERSE = 1 << 2, G_OPTION_FLAG_NO_ARG = 1 << 3, G_OPTION_FLAG_FILENAME = 1 << 4, G_OPTION_FLAG_OPTIONAL_ARG = 1 << 5, G_OPTION_FLAG_NOALIAS = 1 << 6 } GOptionFlags; /** * GOptionArg: * @G_OPTION_ARG_NONE: No extra argument. This is useful for simple flags. * @G_OPTION_ARG_STRING: The option takes a string argument. * @G_OPTION_ARG_INT: The option takes an integer argument. * @G_OPTION_ARG_CALLBACK: The option provides a callback to parse the * extra argument. * @G_OPTION_ARG_FILENAME: The option takes a filename as argument. * @G_OPTION_ARG_STRING_ARRAY: The option takes a string argument, multiple * uses of the option are collected into an array of strings. * @G_OPTION_ARG_FILENAME_ARRAY: The option takes a filename as argument, * multiple uses of the option are collected into an array of strings. * @G_OPTION_ARG_DOUBLE: The option takes a double argument. The argument * can be formatted either for the user's locale or for the "C" locale. Since 2.12 * @G_OPTION_ARG_INT64: The option takes a 64-bit integer. Like %G_OPTION_ARG_INT * but for larger numbers. The number can be in decimal base, or in hexadecimal * (when prefixed with 0x, for example, 0xffffffff). * Since 2.12 * * The #GOptionArg enum values determine which type of extra argument the * options expect to find. If an option expects an extra argument, it * can be specified in several ways; with a short option: * , with a long option: * or combined in a single argument: . */ typedef enum { G_OPTION_ARG_NONE, G_OPTION_ARG_STRING, G_OPTION_ARG_INT, G_OPTION_ARG_CALLBACK, G_OPTION_ARG_FILENAME, G_OPTION_ARG_STRING_ARRAY, G_OPTION_ARG_FILENAME_ARRAY, G_OPTION_ARG_DOUBLE, G_OPTION_ARG_INT64 } GOptionArg; /** * GOptionArgFunc: * @option_name: The name of the option being parsed. This will be either a * single dash followed by a single letter (for a short name) or two dashes * followed by a long option name. * @value: The value to be parsed. * @data: User data added to the #GOptionGroup containing the option when it * was created with g_option_group_new() * @error: A return location for errors. The error code %G_OPTION_ERROR_FAILED * is intended to be used for errors in #GOptionArgFunc callbacks. * * The type of function to be passed as callback for %G_OPTION_ARG_CALLBACK * options. * * Returns: %TRUE if the option was successfully parsed, %FALSE if an error * occurred, in which case @error should be set with g_set_error() */ typedef gboolean (*GOptionArgFunc) (const gchar *option_name, const gchar *value, gpointer data, GError **error); /** * GOptionParseFunc: * @context: The active #GOptionContext * @group: The group to which the function belongs * @data: User data added to the #GOptionGroup containing the option when it * was created with g_option_group_new() * @error: A return location for error details * * The type of function that can be called before and after parsing. * * Returns: %TRUE if the function completed successfully, %FALSE if an error * occurred, in which case @error should be set with g_set_error() */ typedef gboolean (*GOptionParseFunc) (GOptionContext *context, GOptionGroup *group, gpointer data, GError **error); /** * GOptionErrorFunc: * @context: The active #GOptionContext * @group: The group to which the function belongs * @data: User data added to the #GOptionGroup containing the option when it * was created with g_option_group_new() * @error: The #GError containing details about the parse error * * The type of function to be used as callback when a parse error occurs. */ typedef void (*GOptionErrorFunc) (GOptionContext *context, GOptionGroup *group, gpointer data, GError **error); /** * G_OPTION_ERROR: * * Error domain for option parsing. Errors in this domain will * be from the #GOptionError enumeration. See #GError for information on * error domains. */ #define G_OPTION_ERROR (g_option_error_quark ()) /** * GOptionError: * @G_OPTION_ERROR_UNKNOWN_OPTION: An option was not known to the parser. * This error will only be reported, if the parser hasn't been instructed * to ignore unknown options, see g_option_context_set_ignore_unknown_options(). * @G_OPTION_ERROR_BAD_VALUE: A value couldn't be parsed. * @G_OPTION_ERROR_FAILED: A #GOptionArgFunc callback failed. * * Error codes returned by option parsing. */ typedef enum { G_OPTION_ERROR_UNKNOWN_OPTION, G_OPTION_ERROR_BAD_VALUE, G_OPTION_ERROR_FAILED } GOptionError; GLIB_AVAILABLE_IN_ALL GQuark g_option_error_quark (void); /** * GOptionEntry: * @long_name: The long name of an option can be used to specify it * in a commandline as --long_name. Every * option must have a long name. To resolve conflicts if multiple * option groups contain the same long name, it is also possible to * specify the option as * --groupname-long_name. * @short_name: If an option has a short name, it can be specified * -short_name in a commandline. @short_name must be * a printable ASCII character different from '-', or zero if the option has no * short name. * @flags: Flags from #GOptionFlags. * @arg: The type of the option, as a #GOptionArg. * @arg_data: If the @arg type is %G_OPTION_ARG_CALLBACK, then @arg_data must * point to a #GOptionArgFunc callback function, which will be called to handle * the extra argument. Otherwise, @arg_data is a pointer to a location to store * the value, the required type of the location depends on the @arg type: * * * %G_OPTION_ARG_NONE * %gboolean * * * %G_OPTION_ARG_STRING * %gchar* * * * %G_OPTION_ARG_INT * %gint * * * %G_OPTION_ARG_FILENAME * %gchar* * * * %G_OPTION_ARG_STRING_ARRAY * %gchar** * * * %G_OPTION_ARG_FILENAME_ARRAY * %gchar** * * * %G_OPTION_ARG_DOUBLE * %gdouble * * * If @arg type is %G_OPTION_ARG_STRING or %G_OPTION_ARG_FILENAME the location * will contain a newly allocated string if the option was given. That string * needs to be freed by the callee using g_free(). Likewise if @arg type is * %G_OPTION_ARG_STRING_ARRAY or %G_OPTION_ARG_FILENAME_ARRAY, the data should * be freed using g_strfreev(). * @description: the description for the option in * output. The @description is translated using the @translate_func of the * group, see g_option_group_set_translation_domain(). * @arg_description: The placeholder to use for the extra argument parsed * by the option in * output. The @arg_description is translated using the @translate_func of the * group, see g_option_group_set_translation_domain(). * * A GOptionEntry defines a single option. * To have an effect, they must be added to a #GOptionGroup with * g_option_context_add_main_entries() or g_option_group_add_entries(). */ struct _GOptionEntry { const gchar *long_name; gchar short_name; gint flags; GOptionArg arg; gpointer arg_data; const gchar *description; const gchar *arg_description; }; /** * G_OPTION_REMAINING: * * If a long option in the main group has this name, it is not treated as a * regular option. Instead it collects all non-option arguments which would * otherwise be left in argv. The option must be of type * %G_OPTION_ARG_CALLBACK, %G_OPTION_ARG_STRING_ARRAY * or %G_OPTION_ARG_FILENAME_ARRAY. * * * Using #G_OPTION_REMAINING instead of simply scanning argv * for leftover arguments has the advantage that GOption takes care of * necessary encoding conversions for strings or filenames. * * Since: 2.6 */ #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); G_END_DECLS #endif /* __G_OPTION_H__ */ pkg-config-0.29.1/glib/glib/guniprop.c0000664000175000017500000012706512651243552014433 00000000000000/* guniprop.c - Unicode character properties. * * Copyright (C) 1999 Tom Tromey * Copyright (C) 2000 Red Hat, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "config.h" #include #include #include #include #include "gmem.h" #include "gstring.h" #include "gtestutils.h" #include "gtypes.h" #include "gunicode.h" #include "gunichartables.h" #include "gmirroringtable.h" #include "gscripttable.h" #include "gunicodeprivate.h" #ifdef G_OS_WIN32 #include "gwin32.h" #endif #define ATTR_TABLE(Page) (((Page) <= G_UNICODE_LAST_PAGE_PART1) \ ? attr_table_part1[Page] \ : attr_table_part2[(Page) - 0xe00]) #define ATTTABLE(Page, Char) \ ((ATTR_TABLE(Page) == G_UNICODE_MAX_TABLE_INDEX) ? 0 : (attr_data[ATTR_TABLE(Page)][Char])) #define TTYPE_PART1(Page, Char) \ ((type_table_part1[Page] >= G_UNICODE_MAX_TABLE_INDEX) \ ? (type_table_part1[Page] - G_UNICODE_MAX_TABLE_INDEX) \ : (type_data[type_table_part1[Page]][Char])) #define TTYPE_PART2(Page, Char) \ ((type_table_part2[Page] >= G_UNICODE_MAX_TABLE_INDEX) \ ? (type_table_part2[Page] - G_UNICODE_MAX_TABLE_INDEX) \ : (type_data[type_table_part2[Page]][Char])) #define TYPE(Char) \ (((Char) <= G_UNICODE_LAST_CHAR_PART1) \ ? TTYPE_PART1 ((Char) >> 8, (Char) & 0xff) \ : (((Char) >= 0xe0000 && (Char) <= G_UNICODE_LAST_CHAR) \ ? TTYPE_PART2 (((Char) - 0xe0000) >> 8, (Char) & 0xff) \ : G_UNICODE_UNASSIGNED)) #define IS(Type, Class) (((guint)1 << (Type)) & (Class)) #define OR(Type, Rest) (((guint)1 << (Type)) | (Rest)) #define ISALPHA(Type) IS ((Type), \ OR (G_UNICODE_LOWERCASE_LETTER, \ OR (G_UNICODE_UPPERCASE_LETTER, \ OR (G_UNICODE_TITLECASE_LETTER, \ OR (G_UNICODE_MODIFIER_LETTER, \ OR (G_UNICODE_OTHER_LETTER, 0)))))) #define ISALDIGIT(Type) IS ((Type), \ OR (G_UNICODE_DECIMAL_NUMBER, \ OR (G_UNICODE_LETTER_NUMBER, \ OR (G_UNICODE_OTHER_NUMBER, \ OR (G_UNICODE_LOWERCASE_LETTER, \ OR (G_UNICODE_UPPERCASE_LETTER, \ OR (G_UNICODE_TITLECASE_LETTER, \ OR (G_UNICODE_MODIFIER_LETTER, \ OR (G_UNICODE_OTHER_LETTER, 0))))))))) #define ISMARK(Type) IS ((Type), \ OR (G_UNICODE_NON_SPACING_MARK, \ OR (G_UNICODE_SPACING_MARK, \ OR (G_UNICODE_ENCLOSING_MARK, 0)))) #define ISZEROWIDTHTYPE(Type) IS ((Type), \ OR (G_UNICODE_NON_SPACING_MARK, \ OR (G_UNICODE_ENCLOSING_MARK, \ OR (G_UNICODE_FORMAT, 0)))) /** * g_unichar_isalnum: * @c: a Unicode character * * Determines whether a character is alphanumeric. * Given some UTF-8 text, obtain a character value * with g_utf8_get_char(). * * Return value: %TRUE if @c is an alphanumeric character **/ gboolean g_unichar_isalnum (gunichar c) { return ISALDIGIT (TYPE (c)) ? TRUE : FALSE; } /** * g_unichar_isalpha: * @c: a Unicode character * * Determines whether a character is alphabetic (i.e. a letter). * Given some UTF-8 text, obtain a character value with * g_utf8_get_char(). * * Return value: %TRUE if @c is an alphabetic character **/ gboolean g_unichar_isalpha (gunichar c) { return ISALPHA (TYPE (c)) ? TRUE : FALSE; } /** * g_unichar_iscntrl: * @c: a Unicode character * * Determines whether a character is a control character. * Given some UTF-8 text, obtain a character value with * g_utf8_get_char(). * * Return value: %TRUE if @c is a control character **/ gboolean g_unichar_iscntrl (gunichar c) { return TYPE (c) == G_UNICODE_CONTROL; } /** * g_unichar_isdigit: * @c: a Unicode character * * Determines whether a character is numeric (i.e. a digit). This * covers ASCII 0-9 and also digits in other languages/scripts. Given * some UTF-8 text, obtain a character value with g_utf8_get_char(). * * Return value: %TRUE if @c is a digit **/ gboolean g_unichar_isdigit (gunichar c) { return TYPE (c) == G_UNICODE_DECIMAL_NUMBER; } /** * g_unichar_isgraph: * @c: a Unicode character * * Determines whether a character is printable and not a space * (returns %FALSE for control characters, format characters, and * spaces). g_unichar_isprint() is similar, but returns %TRUE for * spaces. Given some UTF-8 text, obtain a character value with * g_utf8_get_char(). * * Return value: %TRUE if @c is printable unless it's a space **/ gboolean g_unichar_isgraph (gunichar c) { return !IS (TYPE(c), OR (G_UNICODE_CONTROL, OR (G_UNICODE_FORMAT, OR (G_UNICODE_UNASSIGNED, OR (G_UNICODE_SURROGATE, OR (G_UNICODE_SPACE_SEPARATOR, 0)))))); } /** * g_unichar_islower: * @c: a Unicode character * * Determines whether a character is a lowercase letter. * Given some UTF-8 text, obtain a character value with * g_utf8_get_char(). * * Return value: %TRUE if @c is a lowercase letter **/ gboolean g_unichar_islower (gunichar c) { return TYPE (c) == G_UNICODE_LOWERCASE_LETTER; } /** * g_unichar_isprint: * @c: a Unicode character * * Determines whether a character is printable. * Unlike g_unichar_isgraph(), returns %TRUE for spaces. * Given some UTF-8 text, obtain a character value with * g_utf8_get_char(). * * Return value: %TRUE if @c is printable **/ gboolean g_unichar_isprint (gunichar c) { return !IS (TYPE(c), OR (G_UNICODE_CONTROL, OR (G_UNICODE_FORMAT, OR (G_UNICODE_UNASSIGNED, OR (G_UNICODE_SURROGATE, 0))))); } /** * g_unichar_ispunct: * @c: a Unicode character * * Determines whether a character is punctuation or a symbol. * Given some UTF-8 text, obtain a character value with * g_utf8_get_char(). * * Return value: %TRUE if @c is a punctuation or symbol character **/ gboolean g_unichar_ispunct (gunichar c) { return IS (TYPE(c), OR (G_UNICODE_CONNECT_PUNCTUATION, OR (G_UNICODE_DASH_PUNCTUATION, OR (G_UNICODE_CLOSE_PUNCTUATION, OR (G_UNICODE_FINAL_PUNCTUATION, OR (G_UNICODE_INITIAL_PUNCTUATION, OR (G_UNICODE_OTHER_PUNCTUATION, OR (G_UNICODE_OPEN_PUNCTUATION, OR (G_UNICODE_CURRENCY_SYMBOL, OR (G_UNICODE_MODIFIER_SYMBOL, OR (G_UNICODE_MATH_SYMBOL, OR (G_UNICODE_OTHER_SYMBOL, 0)))))))))))) ? TRUE : FALSE; } /** * g_unichar_isspace: * @c: a Unicode character * * Determines whether a character is a space, tab, or line separator * (newline, carriage return, etc.). Given some UTF-8 text, obtain a * character value with g_utf8_get_char(). * * (Note: don't use this to do word breaking; you have to use * Pango or equivalent to get word breaking right, the algorithm * is fairly complex.) * * Return value: %TRUE if @c is a space character **/ gboolean g_unichar_isspace (gunichar c) { switch (c) { /* special-case these since Unicode thinks they are not spaces */ case '\t': case '\n': case '\r': case '\f': return TRUE; break; default: { return IS (TYPE(c), OR (G_UNICODE_SPACE_SEPARATOR, OR (G_UNICODE_LINE_SEPARATOR, OR (G_UNICODE_PARAGRAPH_SEPARATOR, 0)))) ? TRUE : FALSE; } break; } } /** * g_unichar_ismark: * @c: a Unicode character * * Determines whether a character is a mark (non-spacing mark, * combining mark, or enclosing mark in Unicode speak). * Given some UTF-8 text, obtain a character value * with g_utf8_get_char(). * * Note: in most cases where isalpha characters are allowed, * ismark characters should be allowed to as they are essential * for writing most European languages as well as many non-Latin * scripts. * * Return value: %TRUE if @c is a mark character * * Since: 2.14 **/ gboolean g_unichar_ismark (gunichar c) { return ISMARK (TYPE (c)); } /** * g_unichar_isupper: * @c: a Unicode character * * Determines if a character is uppercase. * * Return value: %TRUE if @c is an uppercase character **/ gboolean g_unichar_isupper (gunichar c) { return TYPE (c) == G_UNICODE_UPPERCASE_LETTER; } /** * g_unichar_istitle: * @c: a Unicode character * * Determines if a character is titlecase. Some characters in * Unicode which are composites, such as the DZ digraph * have three case variants instead of just two. The titlecase * form is used at the beginning of a word where only the * first letter is capitalized. The titlecase form of the DZ * digraph is U+01F2 LATIN CAPITAL LETTTER D WITH SMALL LETTER Z. * * Return value: %TRUE if the character is titlecase **/ gboolean g_unichar_istitle (gunichar c) { unsigned int i; for (i = 0; i < G_N_ELEMENTS (title_table); ++i) if (title_table[i][0] == c) return TRUE; return FALSE; } /** * g_unichar_isxdigit: * @c: a Unicode character. * * Determines if a character is a hexidecimal digit. * * Return value: %TRUE if the character is a hexadecimal digit **/ gboolean g_unichar_isxdigit (gunichar c) { return ((c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F') || (TYPE (c) == G_UNICODE_DECIMAL_NUMBER)); } /** * g_unichar_isdefined: * @c: a Unicode character * * Determines if a given character is assigned in the Unicode * standard. * * Return value: %TRUE if the character has an assigned value **/ gboolean g_unichar_isdefined (gunichar c) { return !IS (TYPE(c), OR (G_UNICODE_UNASSIGNED, OR (G_UNICODE_SURROGATE, 0))); } /** * g_unichar_iszerowidth: * @c: a Unicode character * * Determines if a given character typically takes zero width when rendered. * The return value is %TRUE for all non-spacing and enclosing marks * (e.g., combining accents), format characters, zero-width * space, but not U+00AD SOFT HYPHEN. * * A typical use of this function is with one of g_unichar_iswide() or * g_unichar_iswide_cjk() to determine the number of cells a string occupies * when displayed on a grid display (terminals). However, note that not all * terminals support zero-width rendering of zero-width marks. * * Return value: %TRUE if the character has zero width * * Since: 2.14 **/ gboolean g_unichar_iszerowidth (gunichar c) { if (G_UNLIKELY (c == 0x00AD)) return FALSE; if (G_UNLIKELY (ISZEROWIDTHTYPE (TYPE (c)))) return TRUE; if (G_UNLIKELY ((c >= 0x1160 && c < 0x1200) || c == 0x200B)) return TRUE; return FALSE; } struct Interval { gunichar start, end; }; static int interval_compare (const void *key, const void *elt) { gunichar c = GPOINTER_TO_UINT (key); struct Interval *interval = (struct Interval *)elt; if (c < interval->start) return -1; if (c > interval->end) return +1; return 0; } /* * NOTE: * * The tables for g_unichar_iswide() and g_unichar_iswide_cjk() are * generated from the Unicode Character Database's file * extracted/DerivedEastAsianWidth.txt using the gen-iswide-table.py * in this way: * * ./gen-iswide-table.py < path/to/ucd/extracted/DerivedEastAsianWidth.txt | fmt * * Last update for Unicode 6.0. */ /** * g_unichar_iswide: * @c: a Unicode character * * Determines if a character is typically rendered in a double-width * cell. * * Return value: %TRUE if the character is wide **/ gboolean g_unichar_iswide (gunichar c) { /* See NOTE earlier for how to update this table. */ static const struct Interval wide[] = { {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} }; if (bsearch (GUINT_TO_POINTER (c), wide, G_N_ELEMENTS (wide), sizeof wide[0], interval_compare)) return TRUE; return FALSE; } /** * g_unichar_iswide_cjk: * @c: a Unicode character * * Determines if a character is typically rendered in a double-width * cell under legacy East Asian locales. If a character is wide according to * g_unichar_iswide(), then it is also reported wide with this function, but * the converse is not necessarily true. See the * Unicode Standard * Annex #11 for details. * * If a character passes the g_unichar_iswide() test then it will also pass * this test, but not the other way around. Note that some characters may * pas both this test and g_unichar_iszerowidth(). * * Return value: %TRUE if the character is wide in legacy East Asian locales * * Since: 2.12 */ gboolean g_unichar_iswide_cjk (gunichar c) { /* See NOTE earlier for how to update this table. */ static const struct Interval ambiguous[] = { {0x00A1, 0x00A1}, {0x00A4, 0x00A4}, {0x00A7, 0x00A8}, {0x00AA, 0x00AA}, {0x00AD, 0x00AE}, {0x00B0, 0x00B4}, {0x00B6, 0x00BA}, {0x00BC, 0x00BF}, {0x00C6, 0x00C6}, {0x00D0, 0x00D0}, {0x00D7, 0x00D8}, {0x00DE, 0x00E1}, {0x00E6, 0x00E6}, {0x00E8, 0x00EA}, {0x00EC, 0x00ED}, {0x00F0, 0x00F0}, {0x00F2, 0x00F3}, {0x00F7, 0x00FA}, {0x00FC, 0x00FC}, {0x00FE, 0x00FE}, {0x0101, 0x0101}, {0x0111, 0x0111}, {0x0113, 0x0113}, {0x011B, 0x011B}, {0x0126, 0x0127}, {0x012B, 0x012B}, {0x0131, 0x0133}, {0x0138, 0x0138}, {0x013F, 0x0142}, {0x0144, 0x0144}, {0x0148, 0x014B}, {0x014D, 0x014D}, {0x0152, 0x0153}, {0x0166, 0x0167}, {0x016B, 0x016B}, {0x01CE, 0x01CE}, {0x01D0, 0x01D0}, {0x01D2, 0x01D2}, {0x01D4, 0x01D4}, {0x01D6, 0x01D6}, {0x01D8, 0x01D8}, {0x01DA, 0x01DA}, {0x01DC, 0x01DC}, {0x0251, 0x0251}, {0x0261, 0x0261}, {0x02C4, 0x02C4}, {0x02C7, 0x02C7}, {0x02C9, 0x02CB}, {0x02CD, 0x02CD}, {0x02D0, 0x02D0}, {0x02D8, 0x02DB}, {0x02DD, 0x02DD}, {0x02DF, 0x02DF}, {0x0300, 0x036F}, {0x0391, 0x03A1}, {0x03A3, 0x03A9}, {0x03B1, 0x03C1}, {0x03C3, 0x03C9}, {0x0401, 0x0401}, {0x0410, 0x044F}, {0x0451, 0x0451}, {0x2010, 0x2010}, {0x2013, 0x2016}, {0x2018, 0x2019}, {0x201C, 0x201D}, {0x2020, 0x2022}, {0x2024, 0x2027}, {0x2030, 0x2030}, {0x2032, 0x2033}, {0x2035, 0x2035}, {0x203B, 0x203B}, {0x203E, 0x203E}, {0x2074, 0x2074}, {0x207F, 0x207F}, {0x2081, 0x2084}, {0x20AC, 0x20AC}, {0x2103, 0x2103}, {0x2105, 0x2105}, {0x2109, 0x2109}, {0x2113, 0x2113}, {0x2116, 0x2116}, {0x2121, 0x2122}, {0x2126, 0x2126}, {0x212B, 0x212B}, {0x2153, 0x2154}, {0x215B, 0x215E}, {0x2160, 0x216B}, {0x2170, 0x2179}, {0x2189, 0x2189}, {0x2190, 0x2199}, {0x21B8, 0x21B9}, {0x21D2, 0x21D2}, {0x21D4, 0x21D4}, {0x21E7, 0x21E7}, {0x2200, 0x2200}, {0x2202, 0x2203}, {0x2207, 0x2208}, {0x220B, 0x220B}, {0x220F, 0x220F}, {0x2211, 0x2211}, {0x2215, 0x2215}, {0x221A, 0x221A}, {0x221D, 0x2220}, {0x2223, 0x2223}, {0x2225, 0x2225}, {0x2227, 0x222C}, {0x222E, 0x222E}, {0x2234, 0x2237}, {0x223C, 0x223D}, {0x2248, 0x2248}, {0x224C, 0x224C}, {0x2252, 0x2252}, {0x2260, 0x2261}, {0x2264, 0x2267}, {0x226A, 0x226B}, {0x226E, 0x226F}, {0x2282, 0x2283}, {0x2286, 0x2287}, {0x2295, 0x2295}, {0x2299, 0x2299}, {0x22A5, 0x22A5}, {0x22BF, 0x22BF}, {0x2312, 0x2312}, {0x2460, 0x24E9}, {0x24EB, 0x254B}, {0x2550, 0x2573}, {0x2580, 0x258F}, {0x2592, 0x2595}, {0x25A0, 0x25A1}, {0x25A3, 0x25A9}, {0x25B2, 0x25B3}, {0x25B6, 0x25B7}, {0x25BC, 0x25BD}, {0x25C0, 0x25C1}, {0x25C6, 0x25C8}, {0x25CB, 0x25CB}, {0x25CE, 0x25D1}, {0x25E2, 0x25E5}, {0x25EF, 0x25EF}, {0x2605, 0x2606}, {0x2609, 0x2609}, {0x260E, 0x260F}, {0x2614, 0x2615}, {0x261C, 0x261C}, {0x261E, 0x261E}, {0x2640, 0x2640}, {0x2642, 0x2642}, {0x2660, 0x2661}, {0x2663, 0x2665}, {0x2667, 0x266A}, {0x266C, 0x266D}, {0x266F, 0x266F}, {0x269E, 0x269F}, {0x26BE, 0x26BF}, {0x26C4, 0x26CD}, {0x26CF, 0x26E1}, {0x26E3, 0x26E3}, {0x26E8, 0x26FF}, {0x273D, 0x273D}, {0x2757, 0x2757}, {0x2776, 0x277F}, {0x2B55, 0x2B59}, {0x3248, 0x324F}, {0xE000, 0xF8FF}, {0xFE00, 0xFE0F}, {0xFFFD, 0xFFFD}, {0x1F100, 0x1F10A}, {0x1F110, 0x1F12D}, {0x1F130, 0x1F169}, {0x1F170, 0x1F19A}, {0xE0100, 0xE01EF}, {0xF0000, 0xFFFFD}, {0x100000, 0x10FFFD} }; if (g_unichar_iswide (c)) return TRUE; if (bsearch (GUINT_TO_POINTER (c), ambiguous, G_N_ELEMENTS (ambiguous), sizeof ambiguous[0], interval_compare)) return TRUE; return FALSE; } /** * g_unichar_toupper: * @c: a Unicode character * * Converts a character to uppercase. * * Return value: the result of converting @c to uppercase. * If @c is not an lowercase or titlecase character, * or has no upper case equivalent @c is returned unchanged. **/ gunichar g_unichar_toupper (gunichar c) { int t = TYPE (c); if (t == G_UNICODE_LOWERCASE_LETTER) { gunichar val = ATTTABLE (c >> 8, c & 0xff); if (val >= 0x1000000) { const gchar *p = special_case_table + val - 0x1000000; val = g_utf8_get_char (p); } /* Some lowercase letters, e.g., U+000AA, FEMININE ORDINAL INDICATOR, * do not have an uppercase equivalent, in which case val will be * zero. */ return val ? val : c; } else if (t == G_UNICODE_TITLECASE_LETTER) { unsigned int i; for (i = 0; i < G_N_ELEMENTS (title_table); ++i) { if (title_table[i][0] == c) return title_table[i][1] ? title_table[i][1] : c; } } return c; } /** * g_unichar_tolower: * @c: a Unicode character. * * Converts a character to lower case. * * Return value: the result of converting @c to lower case. * If @c is not an upperlower or titlecase character, * or has no lowercase equivalent @c is returned unchanged. **/ gunichar g_unichar_tolower (gunichar c) { int t = TYPE (c); if (t == G_UNICODE_UPPERCASE_LETTER) { gunichar val = ATTTABLE (c >> 8, c & 0xff); if (val >= 0x1000000) { const gchar *p = special_case_table + val - 0x1000000; return g_utf8_get_char (p); } else { /* Not all uppercase letters are guaranteed to have a lowercase * equivalent. If this is the case, val will be zero. */ return val ? val : c; } } else if (t == G_UNICODE_TITLECASE_LETTER) { unsigned int i; for (i = 0; i < G_N_ELEMENTS (title_table); ++i) { if (title_table[i][0] == c) return title_table[i][2]; } } return c; } /** * g_unichar_totitle: * @c: a Unicode character * * Converts a character to the titlecase. * * Return value: the result of converting @c to titlecase. * If @c is not an uppercase or lowercase character, * @c is returned unchanged. **/ gunichar g_unichar_totitle (gunichar c) { unsigned int i; for (i = 0; i < G_N_ELEMENTS (title_table); ++i) { if (title_table[i][0] == c || title_table[i][1] == c || title_table[i][2] == c) return title_table[i][0]; } if (TYPE (c) == G_UNICODE_LOWERCASE_LETTER) return g_unichar_toupper (c); return c; } /** * g_unichar_digit_value: * @c: a Unicode character * * Determines the numeric value of a character as a decimal * digit. * * Return value: If @c is a decimal digit (according to * g_unichar_isdigit()), its numeric value. Otherwise, -1. **/ int g_unichar_digit_value (gunichar c) { if (TYPE (c) == G_UNICODE_DECIMAL_NUMBER) return ATTTABLE (c >> 8, c & 0xff); return -1; } /** * g_unichar_xdigit_value: * @c: a Unicode character * * Determines the numeric value of a character as a hexidecimal * digit. * * Return value: If @c is a hex digit (according to * g_unichar_isxdigit()), its numeric value. Otherwise, -1. **/ int g_unichar_xdigit_value (gunichar c) { if (c >= 'A' && c <= 'F') return c - 'A' + 10; if (c >= 'a' && c <= 'f') return c - 'a' + 10; if (TYPE (c) == G_UNICODE_DECIMAL_NUMBER) return ATTTABLE (c >> 8, c & 0xff); return -1; } /** * g_unichar_type: * @c: a Unicode character * * Classifies a Unicode character by type. * * Return value: the type of the character. **/ GUnicodeType g_unichar_type (gunichar c) { return TYPE (c); } /* * Case mapping functions */ typedef enum { LOCALE_NORMAL, LOCALE_TURKIC, LOCALE_LITHUANIAN } LocaleType; static LocaleType get_locale_type (void) { #ifdef G_OS_WIN32 char *tem = g_win32_getlocale (); char locale[2]; locale[0] = tem[0]; locale[1] = tem[1]; g_free (tem); #else const char *locale = setlocale (LC_CTYPE, NULL); if (locale == NULL) return LOCALE_NORMAL; #endif switch (locale[0]) { case 'a': if (locale[1] == 'z') return LOCALE_TURKIC; break; case 'l': if (locale[1] == 't') return LOCALE_LITHUANIAN; break; case 't': if (locale[1] == 'r') return LOCALE_TURKIC; break; } return LOCALE_NORMAL; } static gint output_marks (const char **p_inout, char *out_buffer, gboolean remove_dot) { const char *p = *p_inout; gint len = 0; while (*p) { gunichar c = g_utf8_get_char (p); if (ISMARK (TYPE (c))) { if (!remove_dot || c != 0x307 /* COMBINING DOT ABOVE */) len += g_unichar_to_utf8 (c, out_buffer ? out_buffer + len : NULL); p = g_utf8_next_char (p); } else break; } *p_inout = p; return len; } static gint output_special_case (gchar *out_buffer, int offset, int type, int which) { const gchar *p = special_case_table + offset; gint len; if (type != G_UNICODE_TITLECASE_LETTER) p = g_utf8_next_char (p); if (which == 1) p += strlen (p) + 1; len = strlen (p); if (out_buffer) memcpy (out_buffer, p, len); return len; } static gsize real_toupper (const gchar *str, gssize max_len, gchar *out_buffer, LocaleType locale_type) { const gchar *p = str; const char *last = NULL; gsize len = 0; gboolean last_was_i = FALSE; while ((max_len < 0 || p < str + max_len) && *p) { gunichar c = g_utf8_get_char (p); int t = TYPE (c); gunichar val; last = p; p = g_utf8_next_char (p); if (locale_type == LOCALE_LITHUANIAN) { if (c == 'i') last_was_i = TRUE; else { if (last_was_i) { /* Nasty, need to remove any dot above. Though * I think only E WITH DOT ABOVE occurs in practice * which could simplify this considerably. */ gsize decomp_len, i; gunichar decomp[G_UNICHAR_MAX_DECOMPOSITION_LENGTH]; decomp_len = g_unichar_fully_decompose (c, FALSE, decomp, G_N_ELEMENTS (decomp)); for (i=0; i < decomp_len; i++) { if (decomp[i] != 0x307 /* COMBINING DOT ABOVE */) len += g_unichar_to_utf8 (g_unichar_toupper (decomp[i]), out_buffer ? out_buffer + len : NULL); } len += output_marks (&p, out_buffer ? out_buffer + len : NULL, TRUE); continue; } if (!ISMARK (t)) last_was_i = FALSE; } } if (locale_type == LOCALE_TURKIC && c == 'i') { /* i => LATIN CAPITAL LETTER I WITH DOT ABOVE */ len += g_unichar_to_utf8 (0x130, out_buffer ? out_buffer + len : NULL); } else if (c == 0x0345) /* COMBINING GREEK YPOGEGRAMMENI */ { /* Nasty, need to move it after other combining marks .. this would go away if * we normalized first. */ len += output_marks (&p, out_buffer ? out_buffer + len : NULL, FALSE); /* And output as GREEK CAPITAL LETTER IOTA */ len += g_unichar_to_utf8 (0x399, out_buffer ? out_buffer + len : NULL); } else if (IS (t, OR (G_UNICODE_LOWERCASE_LETTER, OR (G_UNICODE_TITLECASE_LETTER, 0)))) { val = ATTTABLE (c >> 8, c & 0xff); if (val >= 0x1000000) { len += output_special_case (out_buffer ? out_buffer + len : NULL, val - 0x1000000, t, t == G_UNICODE_LOWERCASE_LETTER ? 0 : 1); } else { if (t == G_UNICODE_TITLECASE_LETTER) { unsigned int i; for (i = 0; i < G_N_ELEMENTS (title_table); ++i) { if (title_table[i][0] == c) { val = title_table[i][1]; break; } } } /* Some lowercase letters, e.g., U+000AA, FEMININE ORDINAL INDICATOR, * do not have an uppercase equivalent, in which case val will be * zero. */ len += g_unichar_to_utf8 (val ? val : c, out_buffer ? out_buffer + len : NULL); } } else { gsize char_len = g_utf8_skip[*(guchar *)last]; if (out_buffer) memcpy (out_buffer + len, last, char_len); len += char_len; } } return len; } /** * g_utf8_strup: * @str: a UTF-8 encoded string * @len: length of @str, in bytes, or -1 if @str is nul-terminated. * * Converts all Unicode characters in the string that have a case * to uppercase. The exact manner that this is done depends * on the current locale, and may result in the number of * characters in the string increasing. (For instance, the * German ess-zet will be changed to SS.) * * Return value: a newly allocated string, with all characters * converted to uppercase. **/ gchar * g_utf8_strup (const gchar *str, gssize len) { gsize result_len; LocaleType locale_type; gchar *result; g_return_val_if_fail (str != NULL, NULL); locale_type = get_locale_type (); /* * We use a two pass approach to keep memory management simple */ result_len = real_toupper (str, len, NULL, locale_type); result = g_malloc (result_len + 1); real_toupper (str, len, result, locale_type); result[result_len] = '\0'; return result; } /* traverses the string checking for characters with combining class == 230 * until a base character is found */ static gboolean has_more_above (const gchar *str) { const gchar *p = str; gint combining_class; while (*p) { combining_class = g_unichar_combining_class (g_utf8_get_char (p)); if (combining_class == 230) return TRUE; else if (combining_class == 0) break; p = g_utf8_next_char (p); } return FALSE; } static gsize real_tolower (const gchar *str, gssize max_len, gchar *out_buffer, LocaleType locale_type) { const gchar *p = str; const char *last = NULL; gsize len = 0; while ((max_len < 0 || p < str + max_len) && *p) { gunichar c = g_utf8_get_char (p); int t = TYPE (c); gunichar val; last = p; p = g_utf8_next_char (p); if (locale_type == LOCALE_TURKIC && c == 'I') { if (g_utf8_get_char (p) == 0x0307) { /* I + COMBINING DOT ABOVE => i (U+0069) */ len += g_unichar_to_utf8 (0x0069, out_buffer ? out_buffer + len : NULL); p = g_utf8_next_char (p); } else { /* I => LATIN SMALL LETTER DOTLESS I */ len += g_unichar_to_utf8 (0x131, out_buffer ? out_buffer + len : NULL); } } /* Introduce an explicit dot above when lowercasing capital I's and J's * whenever there are more accents above. [SpecialCasing.txt] */ else if (locale_type == LOCALE_LITHUANIAN && (c == 0x00cc || c == 0x00cd || c == 0x0128)) { len += g_unichar_to_utf8 (0x0069, out_buffer ? out_buffer + len : NULL); len += g_unichar_to_utf8 (0x0307, out_buffer ? out_buffer + len : NULL); switch (c) { case 0x00cc: len += g_unichar_to_utf8 (0x0300, out_buffer ? out_buffer + len : NULL); break; case 0x00cd: len += g_unichar_to_utf8 (0x0301, out_buffer ? out_buffer + len : NULL); break; case 0x0128: len += g_unichar_to_utf8 (0x0303, out_buffer ? out_buffer + len : NULL); break; } } else if (locale_type == LOCALE_LITHUANIAN && (c == 'I' || c == 'J' || c == 0x012e) && has_more_above (p)) { len += g_unichar_to_utf8 (g_unichar_tolower (c), out_buffer ? out_buffer + len : NULL); len += g_unichar_to_utf8 (0x0307, out_buffer ? out_buffer + len : NULL); } else if (c == 0x03A3) /* GREEK CAPITAL LETTER SIGMA */ { if ((max_len < 0 || p < str + max_len) && *p) { gunichar next_c = g_utf8_get_char (p); int next_type = TYPE(next_c); /* SIGMA mapps differently depending on whether it is * final or not. The following simplified test would * fail in the case of combining marks following the * sigma, but I don't think that occurs in real text. * The test here matches that in ICU. */ if (ISALPHA (next_type)) /* Lu,Ll,Lt,Lm,Lo */ val = 0x3c3; /* GREEK SMALL SIGMA */ else val = 0x3c2; /* GREEK SMALL FINAL SIGMA */ } else val = 0x3c2; /* GREEK SMALL FINAL SIGMA */ len += g_unichar_to_utf8 (val, out_buffer ? out_buffer + len : NULL); } else if (IS (t, OR (G_UNICODE_UPPERCASE_LETTER, OR (G_UNICODE_TITLECASE_LETTER, 0)))) { val = ATTTABLE (c >> 8, c & 0xff); if (val >= 0x1000000) { len += output_special_case (out_buffer ? out_buffer + len : NULL, val - 0x1000000, t, 0); } else { if (t == G_UNICODE_TITLECASE_LETTER) { unsigned int i; for (i = 0; i < G_N_ELEMENTS (title_table); ++i) { if (title_table[i][0] == c) { val = title_table[i][2]; break; } } } /* Not all uppercase letters are guaranteed to have a lowercase * equivalent. If this is the case, val will be zero. */ len += g_unichar_to_utf8 (val ? val : c, out_buffer ? out_buffer + len : NULL); } } else { gsize char_len = g_utf8_skip[*(guchar *)last]; if (out_buffer) memcpy (out_buffer + len, last, char_len); len += char_len; } } return len; } /** * g_utf8_strdown: * @str: a UTF-8 encoded string * @len: length of @str, in bytes, or -1 if @str is nul-terminated. * * Converts all Unicode characters in the string that have a case * to lowercase. The exact manner that this is done depends * on the current locale, and may result in the number of * characters in the string changing. * * Return value: a newly allocated string, with all characters * converted to lowercase. **/ gchar * g_utf8_strdown (const gchar *str, gssize len) { gsize result_len; LocaleType locale_type; gchar *result; g_return_val_if_fail (str != NULL, NULL); locale_type = get_locale_type (); /* * We use a two pass approach to keep memory management simple */ result_len = real_tolower (str, len, NULL, locale_type); result = g_malloc (result_len + 1); real_tolower (str, len, result, locale_type); result[result_len] = '\0'; return result; } /** * g_utf8_casefold: * @str: a UTF-8 encoded string * @len: length of @str, in bytes, or -1 if @str is nul-terminated. * * Converts a string into a form that is independent of case. The * result will not correspond to any particular case, but can be * compared for equality or ordered with the results of calling * g_utf8_casefold() on other strings. * * Note that calling g_utf8_casefold() followed by g_utf8_collate() is * only an approximation to the correct linguistic case insensitive * ordering, though it is a fairly good one. Getting this exactly * right would require a more sophisticated collation function that * takes case sensitivity into account. GLib does not currently * provide such a function. * * Return value: a newly allocated string, that is a * case independent form of @str. **/ gchar * g_utf8_casefold (const gchar *str, gssize len) { GString *result; const char *p; g_return_val_if_fail (str != NULL, NULL); result = g_string_new (NULL); p = str; while ((len < 0 || p < str + len) && *p) { gunichar ch = g_utf8_get_char (p); int start = 0; int end = G_N_ELEMENTS (casefold_table); if (ch >= casefold_table[start].ch && ch <= casefold_table[end - 1].ch) { while (TRUE) { int half = (start + end) / 2; if (ch == casefold_table[half].ch) { g_string_append (result, casefold_table[half].data); goto next; } else if (half == start) break; else if (ch > casefold_table[half].ch) start = half; else end = half; } } g_string_append_unichar (result, g_unichar_tolower (ch)); next: p = g_utf8_next_char (p); } return g_string_free (result, FALSE); } /** * g_unichar_get_mirror_char: * @ch: a Unicode character * @mirrored_ch: location to store the mirrored character * * In Unicode, some characters are mirrored. This * means that their images are mirrored horizontally in text that is laid * out from right to left. For instance, "(" would become its mirror image, * ")", in right-to-left text. * * If @ch has the Unicode mirrored property and there is another unicode * character that typically has a glyph that is the mirror image of @ch's * glyph and @mirrored_ch is set, it puts that character in the address * pointed to by @mirrored_ch. Otherwise the original character is put. * * Return value: %TRUE if @ch has a mirrored character, %FALSE otherwise * * Since: 2.4 **/ gboolean g_unichar_get_mirror_char (gunichar ch, gunichar *mirrored_ch) { gboolean found; gunichar mirrored; mirrored = GLIB_GET_MIRRORING(ch); found = ch != mirrored; if (mirrored_ch) *mirrored_ch = mirrored; return found; } #define G_SCRIPT_TABLE_MIDPOINT (G_N_ELEMENTS (g_script_table) / 2) static inline GUnicodeScript g_unichar_get_script_bsearch (gunichar ch) { int lower = 0; int upper = G_N_ELEMENTS (g_script_table) - 1; static int saved_mid = G_SCRIPT_TABLE_MIDPOINT; int mid = saved_mid; do { if (ch < g_script_table[mid].start) upper = mid - 1; else if (ch >= g_script_table[mid].start + g_script_table[mid].chars) lower = mid + 1; else return g_script_table[saved_mid = mid].script; mid = (lower + upper) / 2; } while (lower <= upper); return G_UNICODE_SCRIPT_UNKNOWN; } /** * g_unichar_get_script: * @ch: a Unicode character * * Looks up the #GUnicodeScript for a particular character (as defined * by Unicode Standard Annex \#24). No check is made for @ch being a * valid Unicode character; if you pass in invalid character, the * result is undefined. * * This function is equivalent to pango_script_for_unichar() and the * two are interchangeable. * * Return value: the #GUnicodeScript for the character. * * Since: 2.14 */ GUnicodeScript g_unichar_get_script (gunichar ch) { if (ch < G_EASY_SCRIPTS_RANGE) return g_script_easy_table[ch]; else return g_unichar_get_script_bsearch (ch); } /* http://unicode.org/iso15924/ */ static const guint32 iso15924_tags[] = { #define PACK(a,b,c,d) ((guint32)((((guint8)(a))<<24)|(((guint8)(b))<<16)|(((guint8)(c))<<8)|((guint8)(d)))) PACK ('Z','y','y','y'), /* G_UNICODE_SCRIPT_COMMON */ PACK ('Z','i','n','h'), /* G_UNICODE_SCRIPT_INHERITED */ PACK ('A','r','a','b'), /* G_UNICODE_SCRIPT_ARABIC */ PACK ('A','r','m','n'), /* G_UNICODE_SCRIPT_ARMENIAN */ PACK ('B','e','n','g'), /* G_UNICODE_SCRIPT_BENGALI */ PACK ('B','o','p','o'), /* G_UNICODE_SCRIPT_BOPOMOFO */ PACK ('C','h','e','r'), /* G_UNICODE_SCRIPT_CHEROKEE */ PACK ('C','o','p','t'), /* G_UNICODE_SCRIPT_COPTIC */ PACK ('C','y','r','l'), /* G_UNICODE_SCRIPT_CYRILLIC */ PACK ('D','s','r','t'), /* G_UNICODE_SCRIPT_DESERET */ PACK ('D','e','v','a'), /* G_UNICODE_SCRIPT_DEVANAGARI */ PACK ('E','t','h','i'), /* G_UNICODE_SCRIPT_ETHIOPIC */ PACK ('G','e','o','r'), /* G_UNICODE_SCRIPT_GEORGIAN */ PACK ('G','o','t','h'), /* G_UNICODE_SCRIPT_GOTHIC */ PACK ('G','r','e','k'), /* G_UNICODE_SCRIPT_GREEK */ PACK ('G','u','j','r'), /* G_UNICODE_SCRIPT_GUJARATI */ PACK ('G','u','r','u'), /* G_UNICODE_SCRIPT_GURMUKHI */ PACK ('H','a','n','i'), /* G_UNICODE_SCRIPT_HAN */ PACK ('H','a','n','g'), /* G_UNICODE_SCRIPT_HANGUL */ PACK ('H','e','b','r'), /* G_UNICODE_SCRIPT_HEBREW */ PACK ('H','i','r','a'), /* G_UNICODE_SCRIPT_HIRAGANA */ PACK ('K','n','d','a'), /* G_UNICODE_SCRIPT_KANNADA */ PACK ('K','a','n','a'), /* G_UNICODE_SCRIPT_KATAKANA */ PACK ('K','h','m','r'), /* G_UNICODE_SCRIPT_KHMER */ PACK ('L','a','o','o'), /* G_UNICODE_SCRIPT_LAO */ PACK ('L','a','t','n'), /* G_UNICODE_SCRIPT_LATIN */ PACK ('M','l','y','m'), /* G_UNICODE_SCRIPT_MALAYALAM */ PACK ('M','o','n','g'), /* G_UNICODE_SCRIPT_MONGOLIAN */ PACK ('M','y','m','r'), /* G_UNICODE_SCRIPT_MYANMAR */ PACK ('O','g','a','m'), /* G_UNICODE_SCRIPT_OGHAM */ PACK ('I','t','a','l'), /* G_UNICODE_SCRIPT_OLD_ITALIC */ PACK ('O','r','y','a'), /* G_UNICODE_SCRIPT_ORIYA */ PACK ('R','u','n','r'), /* G_UNICODE_SCRIPT_RUNIC */ PACK ('S','i','n','h'), /* G_UNICODE_SCRIPT_SINHALA */ PACK ('S','y','r','c'), /* G_UNICODE_SCRIPT_SYRIAC */ PACK ('T','a','m','l'), /* G_UNICODE_SCRIPT_TAMIL */ PACK ('T','e','l','u'), /* G_UNICODE_SCRIPT_TELUGU */ PACK ('T','h','a','a'), /* G_UNICODE_SCRIPT_THAANA */ PACK ('T','h','a','i'), /* G_UNICODE_SCRIPT_THAI */ PACK ('T','i','b','t'), /* G_UNICODE_SCRIPT_TIBETAN */ PACK ('C','a','n','s'), /* G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL */ PACK ('Y','i','i','i'), /* G_UNICODE_SCRIPT_YI */ PACK ('T','g','l','g'), /* G_UNICODE_SCRIPT_TAGALOG */ PACK ('H','a','n','o'), /* G_UNICODE_SCRIPT_HANUNOO */ PACK ('B','u','h','d'), /* G_UNICODE_SCRIPT_BUHID */ PACK ('T','a','g','b'), /* G_UNICODE_SCRIPT_TAGBANWA */ /* Unicode-4.0 additions */ PACK ('B','r','a','i'), /* G_UNICODE_SCRIPT_BRAILLE */ PACK ('C','p','r','t'), /* G_UNICODE_SCRIPT_CYPRIOT */ PACK ('L','i','m','b'), /* G_UNICODE_SCRIPT_LIMBU */ PACK ('O','s','m','a'), /* G_UNICODE_SCRIPT_OSMANYA */ PACK ('S','h','a','w'), /* G_UNICODE_SCRIPT_SHAVIAN */ PACK ('L','i','n','b'), /* G_UNICODE_SCRIPT_LINEAR_B */ PACK ('T','a','l','e'), /* G_UNICODE_SCRIPT_TAI_LE */ PACK ('U','g','a','r'), /* G_UNICODE_SCRIPT_UGARITIC */ /* Unicode-4.1 additions */ PACK ('T','a','l','u'), /* G_UNICODE_SCRIPT_NEW_TAI_LUE */ PACK ('B','u','g','i'), /* G_UNICODE_SCRIPT_BUGINESE */ PACK ('G','l','a','g'), /* G_UNICODE_SCRIPT_GLAGOLITIC */ PACK ('T','f','n','g'), /* G_UNICODE_SCRIPT_TIFINAGH */ PACK ('S','y','l','o'), /* G_UNICODE_SCRIPT_SYLOTI_NAGRI */ PACK ('X','p','e','o'), /* G_UNICODE_SCRIPT_OLD_PERSIAN */ PACK ('K','h','a','r'), /* G_UNICODE_SCRIPT_KHAROSHTHI */ /* Unicode-5.0 additions */ PACK ('Z','z','z','z'), /* G_UNICODE_SCRIPT_UNKNOWN */ PACK ('B','a','l','i'), /* G_UNICODE_SCRIPT_BALINESE */ PACK ('X','s','u','x'), /* G_UNICODE_SCRIPT_CUNEIFORM */ PACK ('P','h','n','x'), /* G_UNICODE_SCRIPT_PHOENICIAN */ PACK ('P','h','a','g'), /* G_UNICODE_SCRIPT_PHAGS_PA */ PACK ('N','k','o','o'), /* G_UNICODE_SCRIPT_NKO */ /* Unicode-5.1 additions */ PACK ('K','a','l','i'), /* G_UNICODE_SCRIPT_KAYAH_LI */ PACK ('L','e','p','c'), /* G_UNICODE_SCRIPT_LEPCHA */ PACK ('R','j','n','g'), /* G_UNICODE_SCRIPT_REJANG */ PACK ('S','u','n','d'), /* G_UNICODE_SCRIPT_SUNDANESE */ PACK ('S','a','u','r'), /* G_UNICODE_SCRIPT_SAURASHTRA */ PACK ('C','h','a','m'), /* G_UNICODE_SCRIPT_CHAM */ PACK ('O','l','c','k'), /* G_UNICODE_SCRIPT_OL_CHIKI */ PACK ('V','a','i','i'), /* G_UNICODE_SCRIPT_VAI */ PACK ('C','a','r','i'), /* G_UNICODE_SCRIPT_CARIAN */ PACK ('L','y','c','i'), /* G_UNICODE_SCRIPT_LYCIAN */ PACK ('L','y','d','i'), /* G_UNICODE_SCRIPT_LYDIAN */ /* Unicode-5.2 additions */ PACK ('A','v','s','t'), /* G_UNICODE_SCRIPT_AVESTAN */ PACK ('B','a','m','u'), /* G_UNICODE_SCRIPT_BAMUM */ PACK ('E','g','y','p'), /* G_UNICODE_SCRIPT_EGYPTIAN_HIEROGLYPHS */ PACK ('A','r','m','i'), /* G_UNICODE_SCRIPT_IMPERIAL_ARAMAIC */ PACK ('P','h','l','i'), /* G_UNICODE_SCRIPT_INSCRIPTIONAL_PAHLAVI */ PACK ('P','r','t','i'), /* G_UNICODE_SCRIPT_INSCRIPTIONAL_PARTHIAN */ PACK ('J','a','v','a'), /* G_UNICODE_SCRIPT_JAVANESE */ PACK ('K','t','h','i'), /* G_UNICODE_SCRIPT_KAITHI */ PACK ('L','i','s','u'), /* G_UNICODE_SCRIPT_LISU */ PACK ('M','t','e','i'), /* G_UNICODE_SCRIPT_MEETEI_MAYEK */ PACK ('S','a','r','b'), /* G_UNICODE_SCRIPT_OLD_SOUTH_ARABIAN */ PACK ('O','r','k','h'), /* G_UNICODE_SCRIPT_OLD_TURKIC */ PACK ('S','a','m','r'), /* G_UNICODE_SCRIPT_SAMARITAN */ PACK ('L','a','n','a'), /* G_UNICODE_SCRIPT_TAI_THAM */ PACK ('T','a','v','t'), /* G_UNICODE_SCRIPT_TAI_VIET */ /* Unicode-6.0 additions */ PACK ('B','a','t','k'), /* G_UNICODE_SCRIPT_BATAK */ PACK ('B','r','a','h'), /* G_UNICODE_SCRIPT_BRAHMI */ PACK ('M','a','n','d'), /* G_UNICODE_SCRIPT_MANDAIC */ /* Unicode-6.1 additions */ PACK ('C','a','k','m'), /* G_UNICODE_SCRIPT_CHAKMA */ PACK ('M','e','r','c'), /* G_UNICODE_SCRIPT_MEROITIC_CURSIVE */ PACK ('M','e','r','o'), /* G_UNICODE_SCRIPT_MEROITIC_HIEROGLYPHS */ PACK ('P','l','r','d'), /* G_UNICODE_SCRIPT_MIAO */ PACK ('S','h','r','d'), /* G_UNICODE_SCRIPT_SHARADA */ PACK ('S','o','r','a'), /* G_UNICODE_SCRIPT_SORA_SOMPENG */ PACK ('T','a','k','r'), /* G_UNICODE_SCRIPT_TAKRI */ #undef PACK }; /** * g_unicode_script_to_iso15924: * @script: a Unicode script * * Looks up the ISO 15924 code for @script. ISO 15924 assigns four-letter * codes to scripts. For example, the code for Arabic is 'Arab'. The * four letter codes are encoded as a @guint32 by this function in a * big-endian fashion. That is, the code returned for Arabic is * 0x41726162 (0x41 is ASCII code for 'A', 0x72 is ASCII code for 'r', etc). * * See Codes for the * representation of names of scripts for details. * * Return value: the ISO 15924 code for @script, encoded as an integer, * of zero if @script is %G_UNICODE_SCRIPT_INVALID_CODE or * ISO 15924 code 'Zzzz' (script code for UNKNOWN) if @script is not understood. * * Since: 2.30 */ guint32 g_unicode_script_to_iso15924 (GUnicodeScript script) { if (G_UNLIKELY (script == G_UNICODE_SCRIPT_INVALID_CODE)) return 0; if (G_UNLIKELY (script < 0 || script >= (int) G_N_ELEMENTS (iso15924_tags))) return 0x5A7A7A7A; return iso15924_tags[script]; } /** * g_unicode_script_from_iso15924: * @iso15924: a Unicode script * * Looks up the Unicode script for @iso15924. ISO 15924 assigns four-letter * codes to scripts. For example, the code for Arabic is 'Arab'. * This function accepts four letter codes encoded as a @guint32 in a * big-endian fashion. That is, the code expected for Arabic is * 0x41726162 (0x41 is ASCII code for 'A', 0x72 is ASCII code for 'r', etc). * * See Codes for the * representation of names of scripts for details. * * Return value: the Unicode script for @iso15924, or * of %G_UNICODE_SCRIPT_INVALID_CODE if @iso15924 is zero and * %G_UNICODE_SCRIPT_UNKNOWN if @iso15924 is unknown. * * Since: 2.30 */ GUnicodeScript g_unicode_script_from_iso15924 (guint32 iso15924) { unsigned int i; if (!iso15924) return G_UNICODE_SCRIPT_INVALID_CODE; for (i = 0; i < G_N_ELEMENTS (iso15924_tags); i++) if (iso15924_tags[i] == iso15924) return (GUnicodeScript) i; return G_UNICODE_SCRIPT_UNKNOWN; } pkg-config-0.29.1/glib/glib/gqsort.h0000664000175000017500000000304112651243552014077 00000000000000 /* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the GLib Team and others 1997-2000. See the AUTHORS * file for a list of people on the GLib Team. See the ChangeLog * files for a list of changes. These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/. */ #ifndef __G_QSORT_H__ #define __G_QSORT_H__ #if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) #error "Only can be included directly." #endif #include G_BEGIN_DECLS GLIB_AVAILABLE_IN_ALL void g_qsort_with_data (gconstpointer pbase, gint total_elems, gsize size, GCompareDataFunc compare_func, gpointer user_data); G_END_DECLS #endif /* __G_QSORT_H__ */ pkg-config-0.29.1/glib/glib/deprecated/0000775000175000017500000000000012665370347014601 500000000000000pkg-config-0.29.1/glib/glib/deprecated/gcompletion.h0000664000175000017500000000566012651243552017211 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the GLib Team and others 1997-2000. See the AUTHORS * file for a list of people on the GLib Team. See the ChangeLog * files for a list of changes. These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/. */ #ifndef __G_COMPLETION_H__ #define __G_COMPLETION_H__ #if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) #error "Only can be included directly." #endif #include G_BEGIN_DECLS typedef struct _GCompletion GCompletion; typedef gchar* (*GCompletionFunc) (gpointer); /* GCompletion */ typedef gint (*GCompletionStrncmpFunc) (const gchar *s1, const gchar *s2, gsize n); struct _GCompletion { GList* items; GCompletionFunc func; gchar* prefix; GList* cache; GCompletionStrncmpFunc strncmp_func; }; GLIB_DEPRECATED_IN_2_26 GCompletion* g_completion_new (GCompletionFunc func); GLIB_DEPRECATED_IN_2_26 void g_completion_add_items (GCompletion* cmp, GList* items); GLIB_DEPRECATED_IN_2_26 void g_completion_remove_items (GCompletion* cmp, GList* items); GLIB_DEPRECATED_IN_2_26 void g_completion_clear_items (GCompletion* cmp); GLIB_DEPRECATED_IN_2_26 GList* g_completion_complete (GCompletion* cmp, const gchar* prefix, gchar** new_prefix); GLIB_DEPRECATED_IN_2_26 GList* g_completion_complete_utf8 (GCompletion *cmp, const gchar* prefix, gchar** new_prefix); GLIB_DEPRECATED_IN_2_26 void g_completion_set_compare (GCompletion *cmp, GCompletionStrncmpFunc strncmp_func); GLIB_DEPRECATED_IN_2_26 void g_completion_free (GCompletion* cmp); G_END_DECLS #endif /* __G_COMPLETION_H__ */ pkg-config-0.29.1/glib/glib/deprecated/gthread-deprecated.c0000664000175000017500000013072712651243552020403 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * gthread.c: MT safety related functions * Copyright 1998 Sebastian Wilhelmi; University of Karlsruhe * Owen Taylor * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "config.h" /* we know we are deprecated here, no need for warnings */ #define GLIB_DISABLE_DEPRECATION_WARNINGS #include "gmessages.h" #include "gslice.h" #include "gmain.h" #include "gthread.h" #include "gthreadprivate.h" #include "deprecated/gthread.h" #include "garray.h" #include "gutils.h" /* {{{1 Documentation */ /** * SECTION:threads-deprecated * @title: Deprecated thread API * @short_description: old thread APIs (for reference only) * @see_also: #GThread * * These APIs are deprecated. You should not use them in new code. * This section remains only to assist with understanding code that was * written to use these APIs at some point in the past. **/ /** * GThreadPriority: * @G_THREAD_PRIORITY_LOW: a priority lower than normal * @G_THREAD_PRIORITY_NORMAL: the default priority * @G_THREAD_PRIORITY_HIGH: a priority higher than normal * @G_THREAD_PRIORITY_URGENT: the highest priority * * Deprecated:2.32: Thread priorities no longer have any effect. */ /** * GThreadFunctions: * @mutex_new: virtual function pointer for g_mutex_new() * @mutex_lock: virtual function pointer for g_mutex_lock() * @mutex_trylock: virtual function pointer for g_mutex_trylock() * @mutex_unlock: virtual function pointer for g_mutex_unlock() * @mutex_free: virtual function pointer for g_mutex_free() * @cond_new: virtual function pointer for g_cond_new() * @cond_signal: virtual function pointer for g_cond_signal() * @cond_broadcast: virtual function pointer for g_cond_broadcast() * @cond_wait: virtual function pointer for g_cond_wait() * @cond_timed_wait: virtual function pointer for g_cond_timed_wait() * @cond_free: virtual function pointer for g_cond_free() * @private_new: virtual function pointer for g_private_new() * @private_get: virtual function pointer for g_private_get() * @private_set: virtual function pointer for g_private_set() * @thread_create: virtual function pointer for g_thread_create() * @thread_yield: virtual function pointer for g_thread_yield() * @thread_join: virtual function pointer for g_thread_join() * @thread_exit: virtual function pointer for g_thread_exit() * @thread_set_priority: virtual function pointer for * g_thread_set_priority() * @thread_self: virtual function pointer for g_thread_self() * @thread_equal: used internally by recursive mutex locks and by some * assertion checks * * This function table is no longer used by g_thread_init() * to initialize the thread system. */ /** * G_THREADS_IMPL_POSIX: * * This macro is defined if POSIX style threads are used. * * Deprecated:2.32:POSIX threads are in use on all non-Windows systems. * Use G_OS_WIN32 to detect Windows. */ /** * G_THREADS_IMPL_WIN32: * * This macro is defined if Windows style threads are used. * * Deprecated:2.32:Use G_OS_WIN32 to detect Windows. */ /* {{{1 Exported Variables */ /* Set this FALSE to have previously-compiled GStaticMutex code use the * slow path (ie: call into us) to avoid compatibility problems. */ gboolean g_thread_use_default_impl = FALSE; GThreadFunctions g_thread_functions_for_glib_use = { g_mutex_new, g_mutex_lock, g_mutex_trylock, g_mutex_unlock, g_mutex_free, g_cond_new, g_cond_signal, g_cond_broadcast, g_cond_wait, g_cond_timed_wait, g_cond_free, g_private_new, g_private_get, g_private_set, NULL, g_thread_yield, NULL, NULL, NULL, NULL, NULL, }; static guint64 gettime (void) { return g_get_monotonic_time () * 1000; } guint64 (*g_thread_gettime) (void) = gettime; /* Initialisation {{{1 ---------------------------------------------------- */ gboolean g_threads_got_initialized = TRUE; /** * g_thread_init: * @vtable: a function table of type #GThreadFunctions, that provides * the entry points to the thread system to be used. Since 2.32, * this parameter is ignored and should always be %NULL * * If you use GLib from more than one thread, you must initialize the * thread system by calling g_thread_init(). * * Since version 2.24, calling g_thread_init() multiple times is allowed, * but nothing happens except for the first call. * * Since version 2.32, GLib does not support custom thread implementations * anymore and the @vtable parameter is ignored and you should pass %NULL. * * g_thread_init() must not be called directly or indirectly * in a callback from GLib. Also no mutexes may be currently locked while * calling g_thread_init(). * * To use g_thread_init() in your program, you have to link * with the libraries that the command pkg-config --libs * gthread-2.0 outputs. This is not the case for all the * other thread-related functions of GLib. Those can be used without * having to link with the thread libraries. * * Deprecated:2.32: This function is no longer necessary. The GLib * threading system is automatically initialized at the start * of your program. */ /** * g_thread_get_initialized: * * Indicates if g_thread_init() has been called. * * Returns: %TRUE if threads have been initialized. * * Since: 2.20 */ gboolean g_thread_get_initialized (void) { return g_thread_supported (); } /* We need this for ABI compatibility */ GLIB_AVAILABLE_IN_ALL void g_thread_init_glib (void); void g_thread_init_glib (void) { } /* Internal variables {{{1 */ static GSList *g_thread_all_threads = NULL; static GSList *g_thread_free_indices = NULL; /* Protects g_thread_all_threads and g_thread_free_indices */ G_LOCK_DEFINE_STATIC (g_static_mutex); G_LOCK_DEFINE_STATIC (g_thread); /* Misc. GThread functions {{{1 */ /** * g_thread_set_priority: * @thread: a #GThread. * @priority: ignored * * This function does nothing. * * Deprecated:2.32: Thread priorities no longer have any effect. */ void g_thread_set_priority (GThread *thread, GThreadPriority priority) { } /** * g_thread_foreach: * @thread_func: function to call for all #GThread structures * @user_data: second argument to @thread_func * * Call @thread_func on all #GThreads that have been * created with g_thread_create(). * * Note that threads may decide to exit while @thread_func is * running, so without intimate knowledge about the lifetime of * foreign threads, @thread_func shouldn't access the GThread* * pointer passed in as first argument. However, @thread_func will * not be called for threads which are known to have exited already. * * Due to thread lifetime checks, this function has an execution complexity * which is quadratic in the number of existing threads. * * Since: 2.10 * * Deprecated:2.32: There aren't many things you can do with a #GThread, * except comparing it with one that was returned from g_thread_create(). * There are better ways to find out if your thread is still alive. */ void g_thread_foreach (GFunc thread_func, gpointer user_data) { GSList *slist = NULL; GRealThread *thread; g_return_if_fail (thread_func != NULL); /* snapshot the list of threads for iteration */ G_LOCK (g_thread); slist = g_slist_copy (g_thread_all_threads); G_UNLOCK (g_thread); /* walk the list, skipping non-existent threads */ while (slist) { GSList *node = slist; slist = node->next; /* check whether the current thread still exists */ G_LOCK (g_thread); if (g_slist_find (g_thread_all_threads, node->data)) thread = node->data; else thread = NULL; G_UNLOCK (g_thread); if (thread) thread_func (thread, user_data); g_slist_free_1 (node); } } static void g_enumerable_thread_remove (gpointer data) { GRealThread *thread = data; G_LOCK (g_thread); g_thread_all_threads = g_slist_remove (g_thread_all_threads, thread); G_UNLOCK (g_thread); } GPrivate enumerable_thread_private = G_PRIVATE_INIT (g_enumerable_thread_remove); static void g_enumerable_thread_add (GRealThread *thread) { G_LOCK (g_thread); g_thread_all_threads = g_slist_prepend (g_thread_all_threads, thread); G_UNLOCK (g_thread); g_private_set (&enumerable_thread_private, thread); } static gpointer g_deprecated_thread_proxy (gpointer data) { GRealThread *real = data; g_enumerable_thread_add (real); return g_thread_proxy (data); } /** * g_thread_create: * @func: a function to execute in the new thread * @data: an argument to supply to the new thread * @joinable: should this thread be joinable? * @error: return location for error, or %NULL * * This function creates a new thread. * * The new thread executes the function @func with the argument @data. * If the thread was created successfully, it is returned. * * @error can be %NULL to ignore errors, or non-%NULL to report errors. * The error is set, if and only if the function returns %NULL. * * This function returns a reference to the created thread only if * @joinable is %TRUE. In that case, you must free this reference by * calling g_thread_unref() or g_thread_join(). If @joinable is %FALSE * then you should probably not touch the return value. * * Returns: the new #GThread on success * * Deprecated:2.32: Use g_thread_new() instead */ GThread * g_thread_create (GThreadFunc func, gpointer data, gboolean joinable, GError **error) { return g_thread_create_full (func, data, 0, joinable, 0, 0, error); } /** * g_thread_create_full: * @func: a function to execute in the new thread. * @data: an argument to supply to the new thread. * @stack_size: a stack size for the new thread. * @joinable: should this thread be joinable? * @bound: ignored * @priority: ignored * @error: return location for error. * * 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(). */ GThread * g_thread_create_full (GThreadFunc func, gpointer data, gulong stack_size, gboolean joinable, gboolean bound, GThreadPriority priority, GError **error) { GThread *thread; thread = g_thread_new_internal (NULL, g_deprecated_thread_proxy, func, data, stack_size, error); if (thread && !joinable) { thread->joinable = FALSE; g_thread_unref (thread); } return thread; } /* GOnce {{{1 ------------------------------------------------------------- */ gboolean g_once_init_enter_impl (volatile gsize *location) { return (g_once_init_enter) (location); } /* GStaticMutex {{{1 ------------------------------------------------------ */ /** * GStaticMutex: * * A #GStaticMutex works like a #GMutex. * * Prior to GLib 2.32, GStaticMutex had the significant advantage * that it doesn't need to be created at run-time, but can be defined * at compile-time. Since 2.32, #GMutex can be statically allocated * as well, and GStaticMutex has been deprecated. * * Here is a version of our give_me_next_number() example using * a GStaticMutex. * * * * Using <structname>GStaticMutex</structname> * to simplify thread-safe programming * * * int * give_me_next_number (void) * { * static int current_number = 0; * int ret_val; * static GStaticMutex mutex = G_STATIC_MUTEX_INIT; * * g_static_mutex_lock (&mutex); * ret_val = current_number = calc_next_number (current_number); * g_static_mutex_unlock (&mutex); * * return ret_val; * } * * * * Sometimes you would like to dynamically create a mutex. If you don't * want to require prior calling to g_thread_init(), because your code * should also be usable in non-threaded programs, you are not able to * use g_mutex_new() and thus #GMutex, as that requires a prior call to * g_thread_init(). In theses cases you can also use a #GStaticMutex. * It must be initialized with g_static_mutex_init() before using it * and freed with with g_static_mutex_free() when not needed anymore to * free up any allocated resources. * * Even though #GStaticMutex is not opaque, it should only be used with * the following functions, as it is defined differently on different * platforms. * * All of the g_static_mutex_* functions apart * from g_static_mutex_get_mutex can also be used * even if g_thread_init() has not yet been called. Then they do * nothing, apart from g_static_mutex_trylock, * which does nothing but returning %TRUE. * * All of the g_static_mutex_* * functions are actually macros. Apart from taking their addresses, you * can however use them as if they were functions. **/ /** * G_STATIC_MUTEX_INIT: * * A #GStaticMutex must be initialized with this macro, before it can * be used. This macro can used be to initialize a variable, but it * cannot be assigned to a variable. In that case you have to use * g_static_mutex_init(). * * |[ * GStaticMutex my_mutex = G_STATIC_MUTEX_INIT; * ]| **/ /** * g_static_mutex_init: * @mutex: a #GStaticMutex to be initialized. * * Initializes @mutex. * Alternatively you can initialize it with #G_STATIC_MUTEX_INIT. * * Deprecated: 2.32: Use g_mutex_init() */ void g_static_mutex_init (GStaticMutex *mutex) { static const GStaticMutex init_mutex = G_STATIC_MUTEX_INIT; g_return_if_fail (mutex); *mutex = init_mutex; } /* IMPLEMENTATION NOTE: * * On some platforms a GStaticMutex is actually a normal GMutex stored * inside of a structure instead of being allocated dynamically. We can * only do this for platforms on which we know, in advance, how to * allocate (size) and initialise (value) that memory. * * On other platforms, a GStaticMutex is nothing more than a pointer to * a GMutex. In that case, the first access we make to the static mutex * must first allocate the normal GMutex and store it into the pointer. * * configure.ac writes macros into glibconfig.h to determine if * g_static_mutex_get_mutex() accesses the structure in memory directly * (on platforms where we are able to do that) or if it ends up here, * where we may have to allocate the GMutex before returning it. */ /** * g_static_mutex_get_mutex: * @mutex: a #GStaticMutex. * * 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 * g_static_mutex_get_mutex_impl (GStaticMutex* mutex) { GMutex *result; if (!g_thread_supported ()) return NULL; result = g_atomic_pointer_get (&mutex->mutex); if (!result) { G_LOCK (g_static_mutex); result = mutex->mutex; if (!result) { result = g_mutex_new (); g_atomic_pointer_set (&mutex->mutex, result); } G_UNLOCK (g_static_mutex); } return result; } /* IMPLEMENTATION NOTE: * * g_static_mutex_lock(), g_static_mutex_trylock() and * g_static_mutex_unlock() are all preprocessor macros that wrap the * corresponding g_mutex_*() function around a call to * g_static_mutex_get_mutex(). */ /** * g_static_mutex_lock: * @mutex: a #GStaticMutex. * * Works like g_mutex_lock(), but for a #GStaticMutex. * * Deprecated: 2.32: Use g_mutex_lock() */ /** * g_static_mutex_trylock: * @mutex: a #GStaticMutex. * * Works like g_mutex_trylock(), but for a #GStaticMutex. * * Returns: %TRUE, if the #GStaticMutex could be locked. * * Deprecated: 2.32: Use g_mutex_trylock() */ /** * g_static_mutex_unlock: * @mutex: a #GStaticMutex. * * Works like g_mutex_unlock(), but for a #GStaticMutex. * * Deprecated: 2.32: Use g_mutex_unlock() */ /** * g_static_mutex_free: * @mutex: a #GStaticMutex to be freed. * * Releases all resources allocated to @mutex. * * You don't have to call this functions for a #GStaticMutex with an * unbounded lifetime, i.e. objects declared 'static', but if you have * a #GStaticMutex as a member of a structure and the structure is * freed, you should also free the #GStaticMutex. * * Calling g_static_mutex_free() on a locked mutex may * result in undefined behaviour. * * Deprecated: 2.32: Use g_mutex_clear() */ void g_static_mutex_free (GStaticMutex* mutex) { GMutex **runtime_mutex; g_return_if_fail (mutex); /* The runtime_mutex is the first (or only) member of GStaticMutex, * see both versions (of glibconfig.h) in configure.ac. Note, that * this variable is NULL, if g_thread_init() hasn't been called or * if we're using the default thread implementation and it provides * static mutexes. */ runtime_mutex = ((GMutex**)mutex); if (*runtime_mutex) g_mutex_free (*runtime_mutex); *runtime_mutex = NULL; } /* {{{1 GStaticRecMutex */ /** * GStaticRecMutex: * * A #GStaticRecMutex works like a #GStaticMutex, but it can be locked * multiple times by one thread. If you enter it n times, you have to * unlock it n times again to let other threads lock it. An exception * is the function g_static_rec_mutex_unlock_full(): that allows you to * unlock a #GStaticRecMutex completely returning the depth, (i.e. the * number of times this mutex was locked). The depth can later be used * to restore the state of the #GStaticRecMutex by calling * g_static_rec_mutex_lock_full(). In GLib 2.32, #GStaticRecMutex has * been deprecated in favor of #GRecMutex. * * Even though #GStaticRecMutex is not opaque, it should only be used * with the following functions. * * All of the g_static_rec_mutex_* functions can * be used even if g_thread_init() has not been called. Then they do * nothing, apart from g_static_rec_mutex_trylock, * which does nothing but returning %TRUE. **/ /** * G_STATIC_REC_MUTEX_INIT: * * A #GStaticRecMutex must be initialized with this macro before it can * be used. This macro can used be to initialize a variable, but it * cannot be assigned to a variable. In that case you have to use * g_static_rec_mutex_init(). * * |[ * GStaticRecMutex my_mutex = G_STATIC_REC_MUTEX_INIT; * ]| */ /** * g_static_rec_mutex_init: * @mutex: a #GStaticRecMutex to be initialized. * * A #GStaticRecMutex must be initialized with this function before it * can be used. Alternatively you can initialize it with * #G_STATIC_REC_MUTEX_INIT. * * Deprecated: 2.32: Use g_rec_mutex_init() */ void g_static_rec_mutex_init (GStaticRecMutex *mutex) { static const GStaticRecMutex init_mutex = G_STATIC_REC_MUTEX_INIT; g_return_if_fail (mutex); *mutex = init_mutex; } static GRecMutex * g_static_rec_mutex_get_rec_mutex_impl (GStaticRecMutex* mutex) { GRecMutex *result; if (!g_thread_supported ()) return NULL; result = g_atomic_pointer_get (&mutex->mutex.mutex); if (!result) { G_LOCK (g_static_mutex); result = (GRecMutex *) mutex->mutex.mutex; if (!result) { result = g_slice_new (GRecMutex); g_rec_mutex_init (result); g_atomic_pointer_set (&mutex->mutex.mutex, result); } G_UNLOCK (g_static_mutex); } return result; } /** * g_static_rec_mutex_lock: * @mutex: a #GStaticRecMutex to lock. * * Locks @mutex. If @mutex is already locked by another thread, the * current thread will block until @mutex is unlocked by the other * thread. If @mutex is already locked by the calling thread, this * functions increases the depth of @mutex and returns immediately. * * Deprecated: 2.32: Use g_rec_mutex_lock() */ void g_static_rec_mutex_lock (GStaticRecMutex* mutex) { GRecMutex *rm; rm = g_static_rec_mutex_get_rec_mutex_impl (mutex); g_rec_mutex_lock (rm); mutex->depth++; } /** * g_static_rec_mutex_trylock: * @mutex: a #GStaticRecMutex to lock. * * Tries to lock @mutex. If @mutex is already locked by another thread, * it immediately returns %FALSE. Otherwise it locks @mutex and returns * %TRUE. If @mutex is already locked by the calling thread, this * functions increases the depth of @mutex and immediately returns * %TRUE. * * Returns: %TRUE, if @mutex could be locked. * * Deprecated: 2.32: Use g_rec_mutex_trylock() */ gboolean g_static_rec_mutex_trylock (GStaticRecMutex* mutex) { GRecMutex *rm; rm = g_static_rec_mutex_get_rec_mutex_impl (mutex); if (g_rec_mutex_trylock (rm)) { mutex->depth++; return TRUE; } else return FALSE; } /** * g_static_rec_mutex_unlock: * @mutex: a #GStaticRecMutex to unlock. * * Unlocks @mutex. Another thread will be allowed to lock @mutex only * when it has been unlocked as many times as it had been locked * before. If @mutex is completely unlocked and another thread is * blocked in a g_static_rec_mutex_lock() call for @mutex, it will be * woken and can lock @mutex itself. * * Deprecated: 2.32: Use g_rec_mutex_unlock() */ void g_static_rec_mutex_unlock (GStaticRecMutex* mutex) { GRecMutex *rm; rm = g_static_rec_mutex_get_rec_mutex_impl (mutex); mutex->depth--; g_rec_mutex_unlock (rm); } /** * g_static_rec_mutex_lock_full: * @mutex: a #GStaticRecMutex to lock. * @depth: number of times this mutex has to be unlocked to be * completely unlocked. * * Works like calling g_static_rec_mutex_lock() for @mutex @depth times. * * Deprecated: 2.32: Use g_rec_mutex_lock() */ void g_static_rec_mutex_lock_full (GStaticRecMutex *mutex, guint depth) { GRecMutex *rm; rm = g_static_rec_mutex_get_rec_mutex_impl (mutex); while (depth--) { g_rec_mutex_lock (rm); mutex->depth++; } } /** * g_static_rec_mutex_unlock_full: * @mutex: a #GStaticRecMutex to completely unlock. * * Completely unlocks @mutex. If another thread is blocked in a * g_static_rec_mutex_lock() call for @mutex, it will be woken and can * lock @mutex itself. This function returns the number of times that * @mutex has been locked by the current thread. To restore the state * before the call to g_static_rec_mutex_unlock_full() you can call * g_static_rec_mutex_lock_full() with the depth returned by this * function. * * Returns: number of times @mutex has been locked by the current * thread. * * Deprecated: 2.32: Use g_rec_mutex_unlock() */ guint g_static_rec_mutex_unlock_full (GStaticRecMutex *mutex) { GRecMutex *rm; gint depth; gint i; rm = g_static_rec_mutex_get_rec_mutex_impl (mutex); /* all access to mutex->depth done while still holding the lock */ depth = mutex->depth; i = mutex->depth; mutex->depth = 0; while (i--) g_rec_mutex_unlock (rm); return depth; } /** * g_static_rec_mutex_free: * @mutex: a #GStaticRecMutex to be freed. * * Releases all resources allocated to a #GStaticRecMutex. * * You don't have to call this functions for a #GStaticRecMutex with an * unbounded lifetime, i.e. objects declared 'static', but if you have * a #GStaticRecMutex as a member of a structure and the structure is * freed, you should also free the #GStaticRecMutex. * * Deprecated: 2.32: Use g_rec_mutex_clear() */ void g_static_rec_mutex_free (GStaticRecMutex *mutex) { g_return_if_fail (mutex); if (mutex->mutex.mutex) { GRecMutex *rm = (GRecMutex *) mutex->mutex.mutex; g_rec_mutex_clear (rm); g_slice_free (GRecMutex, rm); } } /* GStaticRWLock {{{1 ----------------------------------------------------- */ /** * GStaticRWLock: * * The #GStaticRWLock struct represents a read-write lock. A read-write * lock can be used for protecting data that some portions of code only * read from, while others also write. In such situations it is * desirable that several readers can read at once, whereas of course * only one writer may write at a time. Take a look at the following * example: * * * An array with access functions * * GStaticRWLock rwlock = G_STATIC_RW_LOCK_INIT; * GPtrArray *array; * * gpointer * my_array_get (guint index) * { * gpointer retval = NULL; * * if (!array) * return NULL; * * g_static_rw_lock_reader_lock (&rwlock); * if (index < array->len) * retval = g_ptr_array_index (array, index); * g_static_rw_lock_reader_unlock (&rwlock); * * return retval; * } * * void * my_array_set (guint index, gpointer data) * { * g_static_rw_lock_writer_lock (&rwlock); * * if (!array) * array = g_ptr_array_new (); * * if (index >= array->len) * g_ptr_array_set_size (array, index+1); * g_ptr_array_index (array, index) = data; * * g_static_rw_lock_writer_unlock (&rwlock); * } * * * * This example shows an array which can be accessed by many readers * (the my_array_get() function) simultaneously, * whereas the writers (the my_array_set() * function) will only be allowed once at a time and only if no readers * currently access the array. This is because of the potentially * dangerous resizing of the array. Using these functions is fully * multi-thread safe now. * * Most of the time, writers should have precedence over readers. That * means, for this implementation, that as soon as a writer wants to * lock the data, no other reader is allowed to lock the data, whereas, * of course, the readers that already have locked the data are allowed * to finish their operation. As soon as the last reader unlocks the * data, the writer will lock it. * * Even though #GStaticRWLock is not opaque, it should only be used * with the following functions. * * All of the g_static_rw_lock_* functions can be * used even if g_thread_init() has not been called. Then they do * nothing, apart from g_static_rw_lock_*_trylock, * which does nothing but returning %TRUE. * * A read-write lock has a higher overhead than a mutex. For * example, both g_static_rw_lock_reader_lock() and * g_static_rw_lock_reader_unlock() have to lock and unlock a * #GStaticMutex, so it takes at least twice the time to lock and unlock * a #GStaticRWLock that it does to lock and unlock a #GStaticMutex. So * only data structures that are accessed by multiple readers, and which * keep the lock for a considerable time justify a #GStaticRWLock. The * above example most probably would fare better with a * #GStaticMutex. * * Deprecated: 2.32: Use a #GRWLock instead **/ /** * G_STATIC_RW_LOCK_INIT: * * A #GStaticRWLock must be initialized with this macro before it can * be used. This macro can used be to initialize a variable, but it * cannot be assigned to a variable. In that case you have to use * g_static_rw_lock_init(). * * |[ * GStaticRWLock my_lock = G_STATIC_RW_LOCK_INIT; * ]| */ /** * g_static_rw_lock_init: * @lock: a #GStaticRWLock to be initialized. * * A #GStaticRWLock must be initialized with this function before it * can be used. Alternatively you can initialize it with * #G_STATIC_RW_LOCK_INIT. * * Deprecated: 2.32: Use g_rw_lock_init() instead */ void g_static_rw_lock_init (GStaticRWLock* lock) { static const GStaticRWLock init_lock = G_STATIC_RW_LOCK_INIT; g_return_if_fail (lock); *lock = init_lock; } inline static void g_static_rw_lock_wait (GCond** cond, GStaticMutex* mutex) { if (!*cond) *cond = g_cond_new (); g_cond_wait (*cond, g_static_mutex_get_mutex (mutex)); } inline static void g_static_rw_lock_signal (GStaticRWLock* lock) { if (lock->want_to_write && lock->write_cond) g_cond_signal (lock->write_cond); else if (lock->want_to_read && lock->read_cond) g_cond_broadcast (lock->read_cond); } /** * g_static_rw_lock_reader_lock: * @lock: a #GStaticRWLock to lock for reading. * * Locks @lock for reading. There may be unlimited concurrent locks for * reading of a #GStaticRWLock at the same time. If @lock is already * locked for writing by another thread or if another thread is already * waiting to lock @lock for writing, this function will block until * @lock is unlocked by the other writing thread and no other writing * threads want to lock @lock. This lock has to be unlocked by * g_static_rw_lock_reader_unlock(). * * #GStaticRWLock is not recursive. It might seem to be possible to * recursively lock for reading, but that can result in a deadlock, due * to writer preference. * * Deprecated: 2.32: Use g_rw_lock_reader_lock() instead */ void g_static_rw_lock_reader_lock (GStaticRWLock* lock) { g_return_if_fail (lock); if (!g_threads_got_initialized) return; g_static_mutex_lock (&lock->mutex); lock->want_to_read++; while (lock->have_writer || lock->want_to_write) g_static_rw_lock_wait (&lock->read_cond, &lock->mutex); lock->want_to_read--; lock->read_counter++; g_static_mutex_unlock (&lock->mutex); } /** * g_static_rw_lock_reader_trylock: * @lock: a #GStaticRWLock to lock 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 * lock @lock for writing, immediately returns %FALSE. Otherwise locks * @lock for reading and returns %TRUE. This lock has to be unlocked by * g_static_rw_lock_reader_unlock(). * * Returns: %TRUE, if @lock could be locked for reading. * * Deprectated: 2.32: Use g_rw_lock_reader_trylock() instead */ gboolean g_static_rw_lock_reader_trylock (GStaticRWLock* lock) { gboolean ret_val = FALSE; g_return_val_if_fail (lock, FALSE); if (!g_threads_got_initialized) return TRUE; g_static_mutex_lock (&lock->mutex); if (!lock->have_writer && !lock->want_to_write) { lock->read_counter++; ret_val = TRUE; } g_static_mutex_unlock (&lock->mutex); return ret_val; } /** * g_static_rw_lock_reader_unlock: * @lock: a #GStaticRWLock to unlock after reading. * * Unlocks @lock. If a thread waits to lock @lock for writing and all * locks for reading have been unlocked, the waiting thread is woken up * and can lock @lock for writing. * * Deprectated: 2.32: Use g_rw_lock_reader_unlock() instead */ void g_static_rw_lock_reader_unlock (GStaticRWLock* lock) { g_return_if_fail (lock); if (!g_threads_got_initialized) return; g_static_mutex_lock (&lock->mutex); lock->read_counter--; if (lock->read_counter == 0) g_static_rw_lock_signal (lock); g_static_mutex_unlock (&lock->mutex); } /** * g_static_rw_lock_writer_lock: * @lock: a #GStaticRWLock to lock for writing. * * Locks @lock for writing. If @lock is already locked for writing or * reading by other threads, this function will block until @lock is * completely unlocked and then lock @lock for writing. While this * functions waits to lock @lock, no other thread can lock @lock for * reading. When @lock is locked for writing, no other thread can lock * @lock (neither for reading nor writing). This lock has to be * unlocked by g_static_rw_lock_writer_unlock(). * * Deprectated: 2.32: Use g_rw_lock_writer_lock() instead */ void g_static_rw_lock_writer_lock (GStaticRWLock* lock) { g_return_if_fail (lock); if (!g_threads_got_initialized) return; g_static_mutex_lock (&lock->mutex); lock->want_to_write++; while (lock->have_writer || lock->read_counter) g_static_rw_lock_wait (&lock->write_cond, &lock->mutex); lock->want_to_write--; lock->have_writer = TRUE; g_static_mutex_unlock (&lock->mutex); } /** * g_static_rw_lock_writer_trylock: * @lock: a #GStaticRWLock to lock 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 g_static_rw_lock_writer_trylock (GStaticRWLock* lock) { gboolean ret_val = FALSE; g_return_val_if_fail (lock, FALSE); if (!g_threads_got_initialized) return TRUE; g_static_mutex_lock (&lock->mutex); if (!lock->have_writer && !lock->read_counter) { lock->have_writer = TRUE; ret_val = TRUE; } g_static_mutex_unlock (&lock->mutex); return ret_val; } /** * g_static_rw_lock_writer_unlock: * @lock: a #GStaticRWLock to unlock after writing. * * Unlocks @lock. If a thread is waiting to lock @lock for writing and * all locks for reading have been unlocked, the waiting thread is * woken up and can lock @lock for writing. If no thread is waiting to * lock @lock for writing, and some thread or threads are waiting to * lock @lock for reading, the waiting threads are woken up and can * lock @lock for reading. * * Deprectated: 2.32: Use g_rw_lock_writer_unlock() instead */ void g_static_rw_lock_writer_unlock (GStaticRWLock* lock) { g_return_if_fail (lock); if (!g_threads_got_initialized) return; g_static_mutex_lock (&lock->mutex); lock->have_writer = FALSE; g_static_rw_lock_signal (lock); g_static_mutex_unlock (&lock->mutex); } /** * g_static_rw_lock_free: * @lock: a #GStaticRWLock to be freed. * * Releases all resources allocated to @lock. * * You don't have to call this functions for a #GStaticRWLock with an * unbounded lifetime, i.e. objects declared 'static', but if you have * a #GStaticRWLock as a member of a structure, and the structure is * freed, you should also free the #GStaticRWLock. * * Deprecated: 2.32: Use a #GRWLock instead */ void g_static_rw_lock_free (GStaticRWLock* lock) { g_return_if_fail (lock); if (lock->read_cond) { g_cond_free (lock->read_cond); lock->read_cond = NULL; } if (lock->write_cond) { g_cond_free (lock->write_cond); lock->write_cond = NULL; } g_static_mutex_free (&lock->mutex); } /* GPrivate {{{1 ------------------------------------------------------ */ /** * g_private_new: * @notify: a #GDestroyNotify * * Creates a new #GPrivate. * * Deprecated:2.32: dynamic allocation of #GPrivate is a bad idea. Use * static storage and G_PRIVATE_INIT() instead. * * Returns: a newly allocated #GPrivate (which can never be destroyed) */ GPrivate * g_private_new (GDestroyNotify notify) { GPrivate tmp = G_PRIVATE_INIT (notify); GPrivate *key; key = g_slice_new (GPrivate); *key = tmp; return key; } /* {{{1 GStaticPrivate */ typedef struct _GStaticPrivateNode GStaticPrivateNode; struct _GStaticPrivateNode { gpointer data; GDestroyNotify destroy; GStaticPrivate *owner; }; static void g_static_private_cleanup (gpointer data) { GArray *array = data; guint i; for (i = 0; i < array->len; i++ ) { GStaticPrivateNode *node = &g_array_index (array, GStaticPrivateNode, i); if (node->destroy) node->destroy (node->data); } g_array_free (array, TRUE); } GPrivate static_private_private = G_PRIVATE_INIT (g_static_private_cleanup); /** * GStaticPrivate: * * A #GStaticPrivate works almost like a #GPrivate, but it has one * significant advantage. It doesn't need to be created at run-time * like a #GPrivate, but can be defined at compile-time. This is * similar to the difference between #GMutex and #GStaticMutex. Now * look at our give_me_next_number() example with * #GStaticPrivate: * * * Using GStaticPrivate for per-thread data * * int * give_me_next_number () * { * static GStaticPrivate current_number_key = G_STATIC_PRIVATE_INIT; * int *current_number = g_static_private_get (&current_number_key); * * if (!current_number) * { * current_number = g_new (int,1); * *current_number = 0; * g_static_private_set (&current_number_key, current_number, g_free); * } * * *current_number = calc_next_number (*current_number); * * return *current_number; * } * * */ /** * G_STATIC_PRIVATE_INIT: * * Every #GStaticPrivate must be initialized with this macro, before it * can be used. * * |[ * GStaticPrivate my_private = G_STATIC_PRIVATE_INIT; * ]| */ /** * g_static_private_init: * @private_key: a #GStaticPrivate to be initialized * * Initializes @private_key. Alternatively you can initialize it with * #G_STATIC_PRIVATE_INIT. */ void g_static_private_init (GStaticPrivate *private_key) { private_key->index = 0; } /** * g_static_private_get: * @private_key: a #GStaticPrivate * * Works like g_private_get() only for a #GStaticPrivate. * * This function works even if g_thread_init() has not yet been called. * * Returns: the corresponding pointer */ gpointer g_static_private_get (GStaticPrivate *private_key) { GArray *array; gpointer ret = NULL; array = g_private_get (&static_private_private); if (array && private_key->index != 0 && private_key->index <= array->len) { GStaticPrivateNode *node; node = &g_array_index (array, GStaticPrivateNode, private_key->index - 1); /* Deal with the possibility that the GStaticPrivate which used * to have this index got freed and the index got allocated to * a new one. In this case, the data in the node is stale, so * free it and return NULL. */ if (G_UNLIKELY (node->owner != private_key)) { if (node->destroy) node->destroy (node->data); node->destroy = NULL; node->data = NULL; node->owner = NULL; } ret = node->data; } return ret; } /** * g_static_private_set: * @private_key: a #GStaticPrivate * @data: the new pointer * @notify: a function to be called with the pointer whenever the * current thread ends or sets this pointer again * * Sets the pointer keyed to @private_key for the current thread and * the function @notify to be called with that pointer (%NULL or * non-%NULL), whenever the pointer is set again or whenever the * current thread ends. * * This function works even if g_thread_init() has not yet been called. * If g_thread_init() is called later, the @data keyed to @private_key * will be inherited only by the main thread, i.e. the one that called * g_thread_init(). * * @notify is used quite differently from @destructor in * g_private_new(). */ void g_static_private_set (GStaticPrivate *private_key, gpointer data, GDestroyNotify notify) { GArray *array; static guint next_index = 0; GStaticPrivateNode *node; if (!private_key->index) { G_LOCK (g_thread); if (!private_key->index) { if (g_thread_free_indices) { private_key->index = GPOINTER_TO_UINT (g_thread_free_indices->data); g_thread_free_indices = g_slist_delete_link (g_thread_free_indices, g_thread_free_indices); } else private_key->index = ++next_index; } G_UNLOCK (g_thread); } array = g_private_get (&static_private_private); if (!array) { array = g_array_new (FALSE, TRUE, sizeof (GStaticPrivateNode)); g_private_set (&static_private_private, array); } if (private_key->index > array->len) g_array_set_size (array, private_key->index); node = &g_array_index (array, GStaticPrivateNode, private_key->index - 1); if (node->destroy) node->destroy (node->data); node->data = data; node->destroy = notify; node->owner = private_key; } /** * g_static_private_free: * @private_key: a #GStaticPrivate to be freed * * Releases all resources allocated to @private_key. * * You don't have to call this functions for a #GStaticPrivate with an * unbounded lifetime, i.e. objects declared 'static', but if you have * a #GStaticPrivate as a member of a structure and the structure is * freed, you should also free the #GStaticPrivate. */ void g_static_private_free (GStaticPrivate *private_key) { guint idx = private_key->index; if (!idx) return; private_key->index = 0; /* Freeing the per-thread data is deferred to either the * thread end or the next g_static_private_get() call for * the same index. */ G_LOCK (g_thread); g_thread_free_indices = g_slist_prepend (g_thread_free_indices, GUINT_TO_POINTER (idx)); G_UNLOCK (g_thread); } /* GMutex {{{1 ------------------------------------------------------ */ /** * g_mutex_new: * * Allocates and initializes a new #GMutex. * * Returns: a newly allocated #GMutex. Use g_mutex_free() to free * * Deprecated: 2.32: GMutex can now be statically allocated, or embedded * in structures and initialised with g_mutex_init(). */ GMutex * g_mutex_new (void) { GMutex *mutex; mutex = g_slice_new (GMutex); g_mutex_init (mutex); return mutex; } /** * g_mutex_free: * @mutex: a #GMutex * * Destroys a @mutex that has been created with g_mutex_new(). * * Calling g_mutex_free() on a locked mutex may result * in undefined behaviour. * * Deprecated: 2.32: GMutex can now be statically allocated, or embedded * in structures and initialised with g_mutex_init(). */ void g_mutex_free (GMutex *mutex) { g_mutex_clear (mutex); g_slice_free (GMutex, mutex); } /* GCond {{{1 ------------------------------------------------------ */ /** * g_cond_new: * * Allocates and initializes a new #GCond. * * Returns: a newly allocated #GCond. Free with g_cond_free() * * Deprecated: 2.32: GCond can now be statically allocated, or embedded * in structures and initialised with g_cond_init(). */ GCond * g_cond_new (void) { GCond *cond; cond = g_slice_new (GCond); g_cond_init (cond); return cond; } /** * g_cond_free: * @cond: a #GCond * * Destroys a #GCond that has been created with g_cond_new(). * * Calling g_cond_free() for a #GCond on which threads are * blocking leads to undefined behaviour. * * Deprecated: 2.32: GCond can now be statically allocated, or embedded * in structures and initialised with g_cond_init(). */ void g_cond_free (GCond *cond) { g_cond_clear (cond); g_slice_free (GCond, cond); } /** * g_cond_timed_wait: * @cond: a #GCond * @mutex: a #GMutex that is currently locked * @abs_time: a #GTimeVal, determining the final time * * Waits until this thread is woken up on @cond, but not longer than * until the time specified by @abs_time. The @mutex is unlocked before * falling asleep and locked again before resuming. * * If @abs_time is %NULL, g_cond_timed_wait() acts like g_cond_wait(). * * This function can be used even if g_thread_init() has not yet been * called, and, in that case, will immediately return %TRUE. * * To easily calculate @abs_time a combination of g_get_current_time() * and g_time_val_add() can be used. * * Returns: %TRUE if @cond was signalled, or %FALSE on timeout * Deprecated:2.32: Use g_cond_wait_until() instead. */ gboolean g_cond_timed_wait (GCond *cond, GMutex *mutex, GTimeVal *abs_time) { gint64 end_time; if (abs_time == NULL) { g_cond_wait (cond, mutex); return TRUE; } end_time = abs_time->tv_sec; end_time *= 1000000; end_time += abs_time->tv_usec; #ifdef CLOCK_MONOTONIC /* would be nice if we had clock_rtoffset, but that didn't seem to * make it into the kernel yet... */ end_time += g_get_monotonic_time () - g_get_real_time (); #else /* if CLOCK_MONOTONIC is not defined then g_get_montonic_time() and * g_get_real_time() are returning the same clock, so don't bother... */ #endif return g_cond_wait_until (cond, mutex, end_time); } /* {{{1 Epilogue */ /* vim: set foldmethod=marker: */ pkg-config-0.29.1/glib/glib/deprecated/grel.h0000664000175000017500000000725012651243552015617 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the GLib Team and others 1997-2000. See the AUTHORS * file for a list of people on the GLib Team. See the ChangeLog * files for a list of changes. These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/. */ #ifndef __G_REL_H__ #define __G_REL_H__ #if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) #error "Only can be included directly." #endif #include G_BEGIN_DECLS typedef struct _GRelation GRelation; typedef struct _GTuples GTuples; struct _GTuples { guint len; }; /* GRelation * * Indexed Relations. Imagine a really simple table in a * database. Relations are not ordered. This data type is meant for * maintaining a N-way mapping. * * g_relation_new() creates a relation with FIELDS fields * * g_relation_destroy() frees all resources * g_tuples_destroy() frees the result of g_relation_select() * * g_relation_index() indexes relation FIELD with the provided * equality and hash functions. this must be done before any * calls to insert are made. * * g_relation_insert() inserts a new tuple. you are expected to * provide the right number of fields. * * g_relation_delete() deletes all relations with KEY in FIELD * g_relation_select() returns ... * g_relation_count() counts ... */ GLIB_DEPRECATED_IN_2_26 GRelation* g_relation_new (gint fields); GLIB_DEPRECATED_IN_2_26 void g_relation_destroy (GRelation *relation); GLIB_DEPRECATED_IN_2_26 void g_relation_index (GRelation *relation, gint field, GHashFunc hash_func, GEqualFunc key_equal_func); GLIB_DEPRECATED_IN_2_26 void g_relation_insert (GRelation *relation, ...); GLIB_DEPRECATED_IN_2_26 gint g_relation_delete (GRelation *relation, gconstpointer key, gint field); GLIB_DEPRECATED_IN_2_26 GTuples* g_relation_select (GRelation *relation, gconstpointer key, gint field); GLIB_DEPRECATED_IN_2_26 gint g_relation_count (GRelation *relation, gconstpointer key, gint field); GLIB_DEPRECATED_IN_2_26 gboolean g_relation_exists (GRelation *relation, ...); GLIB_DEPRECATED_IN_2_26 void g_relation_print (GRelation *relation); GLIB_DEPRECATED_IN_2_26 void g_tuples_destroy (GTuples *tuples); GLIB_DEPRECATED_IN_2_26 gpointer g_tuples_index (GTuples *tuples, gint index_, gint field); G_END_DECLS #endif /* __G_REL_H__ */ pkg-config-0.29.1/glib/glib/deprecated/gmain.h0000664000175000017500000000766012651243552015766 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the GLib Team and others 1997-2000. See the AUTHORS * file for a list of people on the GLib Team. See the ChangeLog * files for a list of changes. These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/. */ #ifndef __G_DEPRECATED_MAIN_H__ #define __G_DEPRECATED_MAIN_H__ #if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) #error "Only can be included directly." #endif #include G_BEGIN_DECLS /* ============== Compat main loop stuff ================== */ /** * g_main_new: * @is_running: set to %TRUE to indicate that the loop is running. This * is not very important since calling g_main_run() will set this * to %TRUE anyway. * * Creates a new #GMainLoop for th default main context. * * Returns: a new #GMainLoop * * Deprecated: 2.2: Use g_main_loop_new() instead */ #define g_main_new(is_running) g_main_loop_new (NULL, is_running) /** * g_main_run: * @loop: a #GMainLoop * * Runs a main loop until it stops running. * * Deprecated: 2.2: Use g_main_loop_run() instead */ #define g_main_run(loop) g_main_loop_run(loop) /** * g_main_quit: * @loop: a #GMainLoop * * Stops the #GMainLoop. * If g_main_run() was called to run the #GMainLoop, it will now return. * * Deprecated: 2.2: Use g_main_loop_quit() instead */ #define g_main_quit(loop) g_main_loop_quit(loop) /** * g_main_destroy: * @loop: a #GMainLoop * * Frees the memory allocated for the #GMainLoop. * * Deprecated: 2.2: Use g_main_loop_unref() instead */ #define g_main_destroy(loop) g_main_loop_unref(loop) /** * g_main_is_running: * @loop: a #GMainLoop * * Checks if the main loop is running. * * Returns: %TRUE if the main loop is running * * Deprecated: 2.2: Use g_main_loop_is_running() instead */ #define g_main_is_running(loop) g_main_loop_is_running(loop) /** * g_main_iteration: * @may_block: set to %TRUE if it should block (i.e. wait) until an event * source becomes ready. It will return after an event source has been * processed. If set to %FALSE it will return immediately if no event * source is ready to be processed. * * Runs a single iteration for the default #GMainContext. * * Returns: %TRUE if more events are pending. * * Deprecated: 2.2: Use g_main_context_iteration() instead. */ #define g_main_iteration(may_block) g_main_context_iteration (NULL, may_block) /** * g_main_pending: * * Checks if any events are pending for the default #GMainContext * (i.e. ready to be processed). * * Returns: %TRUE if any events are pending. * * Deprected: 2.2: Use g_main_context_pending() instead. */ #define g_main_pending() g_main_context_pending (NULL) /** * g_main_set_poll_func: * @func: the function to call to poll all file descriptors * * Sets the function to use for the handle polling of file descriptors * for the default main context. * * Deprecated: 2.2: Use g_main_context_set_poll_func() again */ #define g_main_set_poll_func(func) g_main_context_set_poll_func (NULL, func) G_END_DECLS #endif /* __G_DEPRECATED_MAIN_H__ */ pkg-config-0.29.1/glib/glib/deprecated/gcache.h0000664000175000017500000000545312651243552016103 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the GLib Team and others 1997-2000. See the AUTHORS * file for a list of people on the GLib Team. See the ChangeLog * files for a list of changes. These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/. */ #ifndef __G_CACHE_H__ #define __G_CACHE_H__ #if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) #error "Only can be included directly." #endif #include G_BEGIN_DECLS typedef struct _GCache GCache; typedef gpointer (*GCacheNewFunc) (gpointer key); typedef gpointer (*GCacheDupFunc) (gpointer value); typedef void (*GCacheDestroyFunc) (gpointer value); /* Caches */ GLIB_DEPRECATED GCache* g_cache_new (GCacheNewFunc value_new_func, GCacheDestroyFunc value_destroy_func, GCacheDupFunc key_dup_func, GCacheDestroyFunc key_destroy_func, GHashFunc hash_key_func, GHashFunc hash_value_func, GEqualFunc key_equal_func); GLIB_DEPRECATED void g_cache_destroy (GCache *cache); GLIB_DEPRECATED gpointer g_cache_insert (GCache *cache, gpointer key); GLIB_DEPRECATED void g_cache_remove (GCache *cache, gconstpointer value); GLIB_DEPRECATED void g_cache_key_foreach (GCache *cache, GHFunc func, gpointer user_data); GLIB_DEPRECATED void g_cache_value_foreach (GCache *cache, GHFunc func, gpointer user_data); G_END_DECLS #endif /* __G_CACHE_H__ */ pkg-config-0.29.1/glib/glib/deprecated/gcache.c0000664000175000017500000002366112651243552016077 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the GLib Team and others 1997-2000. See the AUTHORS * file for a list of people on the GLib Team. See the ChangeLog * files for a list of changes. These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/. */ /* * MT safe */ #include "config.h" #include "gcache.h" #include "gslice.h" #include "ghash.h" #include "gtestutils.h" /** * SECTION:caches * @title: Caches * @short_description: caches allow sharing of complex data structures * to save resources * * A #GCache allows sharing of complex data structures, in order to * save system resources. * * GCache uses keys and values. A GCache key describes the properties * of a particular resource. A GCache value is the actual resource. * * GCache has been marked as deprecated, since this API is rarely * used and not very actively maintained. */ typedef struct _GCacheNode GCacheNode; struct _GCacheNode { /* A reference counted node */ gpointer value; gint ref_count; }; /** * GCache: * * The #GCache struct is an opaque data structure containing * information about a #GCache. It should only be accessed via the * following functions. * * Deprecated:2.32: Use a #GHashTable instead */ struct _GCache { /* Called to create a value from a key */ GCacheNewFunc value_new_func; /* Called to destroy a value */ GCacheDestroyFunc value_destroy_func; /* Called to duplicate a key */ GCacheDupFunc key_dup_func; /* Called to destroy a key */ GCacheDestroyFunc key_destroy_func; /* Associates keys with nodes */ GHashTable *key_table; /* Associates nodes with keys */ GHashTable *value_table; }; static inline GCacheNode* g_cache_node_new (gpointer value) { GCacheNode *node = g_slice_new (GCacheNode); node->value = value; node->ref_count = 1; return node; } static inline void g_cache_node_destroy (GCacheNode *node) { g_slice_free (GCacheNode, node); } /** * g_cache_new: * @value_new_func: a function to create a new object given a key. * This is called by g_cache_insert() if an object * with the given key does not already exist * @value_destroy_func: a function to destroy an object. It is called * by g_cache_remove() when the object is no * longer needed (i.e. its reference count drops * to 0) * @key_dup_func: a function to copy a key. It is called by * g_cache_insert() if the key does not already exist in * the #GCache * @key_destroy_func: a function to destroy a key. It is called by * g_cache_remove() when the object is no longer * needed (i.e. its reference count drops to 0) * @hash_key_func: a function to create a hash value from a key * @hash_value_func: a function to create a hash value from a value * @key_equal_func: a function to compare two keys. It should return * %TRUE if the two keys are equivalent * * Creates a new #GCache. * * Returns: a new #GCache * * Deprecated:2.32: Use a #GHashTable instead */ /** * GCacheNewFunc: * @key: a #GCache 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. */ /** * GCacheDestroyFunc: * @value: the #GCache value to destroy * * Specifies the type of the @value_destroy_func and @key_destroy_func * functions passed to g_cache_new(). The functions are passed a * pointer to the #GCache key or #GCache value and should free any * memory and other resources associated with it. */ /** * GCacheDupFunc: * @value: the #GCache key to destroy (not a * #GCache value as it seems) * * Specifies the type of the @key_dup_func function passed to * g_cache_new(). The function is passed a key * (not 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, GCacheDestroyFunc value_destroy_func, GCacheDupFunc key_dup_func, GCacheDestroyFunc key_destroy_func, GHashFunc hash_key_func, GHashFunc hash_value_func, GEqualFunc key_equal_func) { GCache *cache; g_return_val_if_fail (value_new_func != NULL, NULL); g_return_val_if_fail (value_destroy_func != NULL, NULL); g_return_val_if_fail (key_dup_func != NULL, NULL); g_return_val_if_fail (key_destroy_func != NULL, NULL); g_return_val_if_fail (hash_key_func != NULL, NULL); g_return_val_if_fail (hash_value_func != NULL, NULL); g_return_val_if_fail (key_equal_func != NULL, NULL); cache = g_slice_new (GCache); cache->value_new_func = value_new_func; cache->value_destroy_func = value_destroy_func; cache->key_dup_func = key_dup_func; cache->key_destroy_func = key_destroy_func; cache->key_table = g_hash_table_new (hash_key_func, key_equal_func); cache->value_table = g_hash_table_new (hash_value_func, NULL); return cache; } /** * g_cache_destroy: * @cache: a #GCache * * Frees the memory allocated for the #GCache. * * Note that it does not destroy the keys and values which were * contained in the #GCache. * * Deprecated:2.32: Use a #GHashTable instead */ void g_cache_destroy (GCache *cache) { g_return_if_fail (cache != NULL); g_hash_table_destroy (cache->key_table); g_hash_table_destroy (cache->value_table); g_slice_free (GCache, cache); } /** * g_cache_insert: * @cache: a #GCache * @key: a key describing a #GCache object * * Gets the value corresponding to the given key, creating it if * necessary. It first checks if the value already exists in the * #GCache, by using the @key_equal_func function passed to * g_cache_new(). If it does already exist it is returned, and its * reference count is increased by one. If the value does not currently * exist, if is created by calling the @value_new_func. The key is * duplicated by calling @key_dup_func and the duplicated key and value * are inserted into the #GCache. * * Returns: a pointer to a #GCache value * * Deprecated:2.32: Use a #GHashTable instead */ gpointer g_cache_insert (GCache *cache, gpointer key) { GCacheNode *node; gpointer value; g_return_val_if_fail (cache != NULL, NULL); node = g_hash_table_lookup (cache->key_table, key); if (node) { node->ref_count += 1; return node->value; } key = (* cache->key_dup_func) (key); value = (* cache->value_new_func) (key); node = g_cache_node_new (value); g_hash_table_insert (cache->key_table, key, node); g_hash_table_insert (cache->value_table, value, key); return node->value; } /** * g_cache_remove: * @cache: a #GCache * @value: the value to remove * * Decreases the reference count of the given value. If it drops to 0 * then the value and its corresponding key are destroyed, using the * @value_destroy_func and @key_destroy_func passed to g_cache_new(). * * Deprecated:2.32: Use a #GHashTable instead */ void g_cache_remove (GCache *cache, gconstpointer value) { GCacheNode *node; gpointer key; g_return_if_fail (cache != NULL); key = g_hash_table_lookup (cache->value_table, value); node = g_hash_table_lookup (cache->key_table, key); g_return_if_fail (node != NULL); node->ref_count -= 1; if (node->ref_count == 0) { g_hash_table_remove (cache->value_table, value); g_hash_table_remove (cache->key_table, key); (* cache->key_destroy_func) (key); (* cache->value_destroy_func) (node->value); g_cache_node_destroy (node); } } /** * g_cache_key_foreach: * @cache: a #GCache * @func: the function to call with each #GCache key * @user_data: user data to pass to the function * * Calls the given function for each of the keys in the #GCache. * * NOTE @func is passed three parameters, the value and key of a cache * entry and the @user_data. The order of value and key is different * from the order in which g_hash_table_foreach() passes key-value * pairs to its callback function ! * * Deprecated:2.32: Use a #GHashTable instead */ void g_cache_key_foreach (GCache *cache, GHFunc func, gpointer user_data) { g_return_if_fail (cache != NULL); g_return_if_fail (func != NULL); g_hash_table_foreach (cache->value_table, func, user_data); } /** * g_cache_value_foreach: * @cache: a #GCache * @func: the function to call with each #GCache value * @user_data: user data to pass to the function * * Calls the given function for each of the values in the #GCache. * * Deprecated:2.10: The reason is that it passes pointers to internal * data structures to @func; use g_cache_key_foreach() instead */ void g_cache_value_foreach (GCache *cache, GHFunc func, gpointer user_data) { g_return_if_fail (cache != NULL); g_return_if_fail (func != NULL); g_hash_table_foreach (cache->key_table, func, user_data); } pkg-config-0.29.1/glib/glib/deprecated/gallocator.h0000664000175000017500000000637612651243552017025 00000000000000/* * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the licence, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * 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_ALLOCATOR_H__ #define __G_ALLOCATOR_H__ #if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) #error "Only can be included directly." #endif #include G_BEGIN_DECLS typedef struct _GAllocator GAllocator; typedef struct _GMemChunk GMemChunk; #define G_ALLOC_ONLY 1 #define G_ALLOC_AND_FREE 2 #define G_ALLOCATOR_LIST 1 #define G_ALLOCATOR_SLIST 2 #define G_ALLOCATOR_NODE 3 #define g_chunk_new(type, chunk) ((type *) g_mem_chunk_alloc (chunk)) #define g_chunk_new0(type, chunk) ((type *) g_mem_chunk_alloc0 (chunk)) #define g_chunk_free(mem, mem_chunk) (g_mem_chunk_free (mem_chunk, mem)) #define g_mem_chunk_create(type, x, y) (g_mem_chunk_new (NULL, sizeof (type), 0, 0)) GLIB_DEPRECATED GMemChunk * g_mem_chunk_new (const gchar *name, gint atom_size, gsize area_size, gint type); GLIB_DEPRECATED void g_mem_chunk_destroy (GMemChunk *mem_chunk); GLIB_DEPRECATED gpointer g_mem_chunk_alloc (GMemChunk *mem_chunk); GLIB_DEPRECATED gpointer g_mem_chunk_alloc0 (GMemChunk *mem_chunk); GLIB_DEPRECATED void g_mem_chunk_free (GMemChunk *mem_chunk, gpointer mem); GLIB_DEPRECATED void g_mem_chunk_clean (GMemChunk *mem_chunk); GLIB_DEPRECATED void g_mem_chunk_reset (GMemChunk *mem_chunk); GLIB_DEPRECATED void g_mem_chunk_print (GMemChunk *mem_chunk); GLIB_DEPRECATED void g_mem_chunk_info (void); GLIB_DEPRECATED void g_blow_chunks (void); GLIB_DEPRECATED GAllocator * g_allocator_new (const gchar *name, guint n_preallocs); GLIB_DEPRECATED void g_allocator_free (GAllocator *allocator); GLIB_DEPRECATED void g_list_push_allocator (GAllocator *allocator); GLIB_DEPRECATED void g_list_pop_allocator (void); GLIB_DEPRECATED void g_slist_push_allocator (GAllocator *allocator); GLIB_DEPRECATED void g_slist_pop_allocator (void); GLIB_DEPRECATED void g_node_push_allocator (GAllocator *allocator); GLIB_DEPRECATED void g_node_pop_allocator (void); G_END_DECLS #endif /* __G_ALLOCATOR_H__ */ pkg-config-0.29.1/glib/glib/deprecated/gallocator.c0000664000175000017500000000551212275467762017024 00000000000000/* * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the licence, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "config.h" /* we know we are deprecated here, no need for warnings */ #define GLIB_DISABLE_DEPRECATION_WARNINGS #include "gallocator.h" #include #include struct _GMemChunk { guint alloc_size; /* the size of an atom */ }; GMemChunk* g_mem_chunk_new (const gchar *name, gint atom_size, gsize area_size, gint type) { GMemChunk *mem_chunk; g_return_val_if_fail (atom_size > 0, NULL); mem_chunk = g_slice_new (GMemChunk); mem_chunk->alloc_size = atom_size; return mem_chunk; } void g_mem_chunk_destroy (GMemChunk *mem_chunk) { g_return_if_fail (mem_chunk != NULL); g_slice_free (GMemChunk, mem_chunk); } gpointer g_mem_chunk_alloc (GMemChunk *mem_chunk) { g_return_val_if_fail (mem_chunk != NULL, NULL); return g_slice_alloc (mem_chunk->alloc_size); } gpointer g_mem_chunk_alloc0 (GMemChunk *mem_chunk) { g_return_val_if_fail (mem_chunk != NULL, NULL); return g_slice_alloc0 (mem_chunk->alloc_size); } void g_mem_chunk_free (GMemChunk *mem_chunk, gpointer mem) { g_return_if_fail (mem_chunk != NULL); g_slice_free1 (mem_chunk->alloc_size, mem); } GAllocator* g_allocator_new (const gchar *name, guint n_preallocs) { /* some (broken) GAllocator uses depend on non-NULL allocators */ return (void *) 1; } void g_allocator_free (GAllocator *allocator) { } void g_mem_chunk_clean (GMemChunk *mem_chunk) { } void g_mem_chunk_reset (GMemChunk *mem_chunk) { } void g_mem_chunk_print (GMemChunk *mem_chunk) { } void g_mem_chunk_info (void) { } void g_blow_chunks (void) { } void g_list_push_allocator (GAllocator *allocator) { } void g_list_pop_allocator (void) { } void g_slist_push_allocator (GAllocator *allocator) { } void g_slist_pop_allocator (void) { } void g_node_push_allocator (GAllocator *allocator) { } void g_node_pop_allocator (void) { } pkg-config-0.29.1/glib/glib/deprecated/grel.c0000664000175000017500000004125612651243552015616 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* * Modified by the GLib Team and others 1997-2000. See the AUTHORS * file for a list of people on the GLib Team. See the ChangeLog * files for a list of changes. These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/. */ /* * MT safe */ #include "config.h" /* we know we are deprecated here, no need for warnings */ #define GLIB_DISABLE_DEPRECATION_WARNINGS #include "grel.h" #include #include #include #include #include #include #include /** * SECTION:relations * @title: Relations and Tuples * @short_description: tables of data which can be indexed on any * number of fields * * A #GRelation is a table of data which can be indexed on any number * of fields, rather like simple database tables. A #GRelation contains * a number of records, called tuples. Each record contains a number of * fields. Records are not ordered, so it is not possible to find the * record at a particular index. * * Note that #GRelation tables are currently limited to 2 fields. * * To create a GRelation, use g_relation_new(). * * To specify which fields should be indexed, use g_relation_index(). * Note that this must be called before any tuples are added to the * #GRelation. * * To add records to a #GRelation use g_relation_insert(). * * To determine if a given record appears in a #GRelation, use * g_relation_exists(). Note that fields are compared directly, so * pointers must point to the exact same position (i.e. different * copies of the same string will not match.) * * To count the number of records which have a particular value in a * given field, use g_relation_count(). * * To get all the records which have a particular value in a given * field, use g_relation_select(). To access fields of the resulting * records, use g_tuples_index(). To free the resulting records use * g_tuples_destroy(). * * To delete all records which have a particular value in a given * field, use g_relation_delete(). * * To destroy the #GRelation, use g_relation_destroy(). * * To help debug #GRelation objects, use g_relation_print(). * * GRelation has been marked as deprecated, since this API has never * been fully implemented, is not very actively maintained and rarely * used. **/ typedef struct _GRealTuples GRealTuples; /** * GRelation: * * The #GRelation struct is an opaque data structure to represent a * Relation. It should * only be accessed via the following functions. **/ struct _GRelation { gint fields; gint current_field; GHashTable *all_tuples; GHashTable **hashed_tuple_tables; gint count; }; /** * GTuples: * @len: the number of records that matched. * * The #GTuples struct is used to return records (or tuples) from the * #GRelation by g_relation_select(). It only contains one public * member - the number of records that matched. To access the matched * records, you must use g_tuples_index(). **/ struct _GRealTuples { gint len; gint width; gpointer *data; }; static gboolean tuple_equal_2 (gconstpointer v_a, gconstpointer v_b) { gpointer* a = (gpointer*) v_a; gpointer* b = (gpointer*) v_b; return a[0] == b[0] && a[1] == b[1]; } static guint tuple_hash_2 (gconstpointer v_a) { #if GLIB_SIZEOF_VOID_P > GLIB_SIZEOF_LONG /* In practise this snippet has been written for 64-bit Windows * where ints are 32 bits, pointers 64 bits. More exotic platforms * need more tweaks. */ guint* a = (guint*) v_a; return (a[0] ^ a[1] ^ a[2] ^ a[3]); #else gpointer* a = (gpointer*) v_a; return (gulong)a[0] ^ (gulong)a[1]; #endif } static GHashFunc tuple_hash (gint fields) { switch (fields) { case 2: return tuple_hash_2; default: g_error ("no tuple hash for %d", fields); } return NULL; } static GEqualFunc tuple_equal (gint fields) { switch (fields) { case 2: return tuple_equal_2; default: g_error ("no tuple equal for %d", fields); } return NULL; } /** * g_relation_new: * @fields: the number of fields. * * 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* g_relation_new (gint fields) { GRelation* rel = g_new0 (GRelation, 1); rel->fields = fields; rel->all_tuples = g_hash_table_new (tuple_hash (fields), tuple_equal (fields)); rel->hashed_tuple_tables = g_new0 (GHashTable*, fields); return rel; } static void relation_delete_value_tuple (gpointer tuple_key, gpointer tuple_value, gpointer user_data) { GRelation *relation = user_data; gpointer *tuple = tuple_value; g_slice_free1 (relation->fields * sizeof (gpointer), tuple); } static void g_relation_free_array (gpointer key, gpointer value, gpointer user_data) { g_hash_table_destroy ((GHashTable*) value); } /** * g_relation_destroy: * @relation: a #GRelation. * * Destroys the #GRelation, freeing all memory allocated. However, it * does not free memory allocated for the tuple data, so you should * free that first if appropriate. * * Deprecated: 2.26: Rarely used API **/ void g_relation_destroy (GRelation *relation) { gint i; if (relation) { for (i = 0; i < relation->fields; i += 1) { if (relation->hashed_tuple_tables[i]) { g_hash_table_foreach (relation->hashed_tuple_tables[i], g_relation_free_array, NULL); g_hash_table_destroy (relation->hashed_tuple_tables[i]); } } g_hash_table_foreach (relation->all_tuples, relation_delete_value_tuple, relation); g_hash_table_destroy (relation->all_tuples); g_free (relation->hashed_tuple_tables); g_free (relation); } } /** * g_relation_index: * @relation: a #GRelation. * @field: the field to index, counting from 0. * @hash_func: a function to produce a hash value from the field data. * @key_equal_func: a function to compare two values of the given field. * * Creates an index on the given field. Note that this must be called * before any records are added to the #GRelation. * * Deprecated: 2.26: Rarely used API **/ void g_relation_index (GRelation *relation, gint field, GHashFunc hash_func, GEqualFunc key_equal_func) { g_return_if_fail (relation != NULL); g_return_if_fail (relation->count == 0 && relation->hashed_tuple_tables[field] == NULL); relation->hashed_tuple_tables[field] = g_hash_table_new (hash_func, key_equal_func); } /** * g_relation_insert: * @relation: a #GRelation. * @...: the fields of the record to add. These must match the * number of fields in the #GRelation, and of type #gpointer * or #gconstpointer. * * Inserts a record into a #GRelation. * * Deprecated: 2.26: Rarely used API **/ void g_relation_insert (GRelation *relation, ...) { gpointer* tuple = g_slice_alloc (relation->fields * sizeof (gpointer)); va_list args; gint i; va_start (args, relation); for (i = 0; i < relation->fields; i += 1) tuple[i] = va_arg (args, gpointer); va_end (args); g_hash_table_insert (relation->all_tuples, tuple, tuple); relation->count += 1; for (i = 0; i < relation->fields; i += 1) { GHashTable *table; gpointer key; GHashTable *per_key_table; table = relation->hashed_tuple_tables[i]; if (table == NULL) continue; key = tuple[i]; per_key_table = g_hash_table_lookup (table, key); if (per_key_table == NULL) { per_key_table = g_hash_table_new (tuple_hash (relation->fields), tuple_equal (relation->fields)); g_hash_table_insert (table, key, per_key_table); } g_hash_table_insert (per_key_table, tuple, tuple); } } static void g_relation_delete_tuple (gpointer tuple_key, gpointer tuple_value, gpointer user_data) { gpointer *tuple = (gpointer*) tuple_value; GRelation *relation = (GRelation *) user_data; gint j; g_assert (tuple_key == tuple_value); for (j = 0; j < relation->fields; j += 1) { GHashTable *one_table = relation->hashed_tuple_tables[j]; gpointer one_key; GHashTable *per_key_table; if (one_table == NULL) continue; if (j == relation->current_field) /* can't delete from the table we're foreaching in */ continue; one_key = tuple[j]; per_key_table = g_hash_table_lookup (one_table, one_key); g_hash_table_remove (per_key_table, tuple); } if (g_hash_table_remove (relation->all_tuples, tuple)) g_slice_free1 (relation->fields * sizeof (gpointer), tuple); relation->count -= 1; } /** * g_relation_delete: * @relation: a #GRelation. * @key: the value to compare with. * @field: the field of each record to match. * * 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 g_relation_delete (GRelation *relation, gconstpointer key, gint field) { GHashTable *table; GHashTable *key_table; gint count; g_return_val_if_fail (relation != NULL, 0); table = relation->hashed_tuple_tables[field]; count = relation->count; g_return_val_if_fail (table != NULL, 0); key_table = g_hash_table_lookup (table, key); if (!key_table) return 0; relation->current_field = field; g_hash_table_foreach (key_table, g_relation_delete_tuple, relation); g_hash_table_remove (table, key); g_hash_table_destroy (key_table); /* @@@ FIXME: Remove empty hash tables. */ return count - relation->count; } static void g_relation_select_tuple (gpointer tuple_key, gpointer tuple_value, gpointer user_data) { gpointer *tuple = (gpointer*) tuple_value; GRealTuples *tuples = (GRealTuples*) user_data; gint stride = sizeof (gpointer) * tuples->width; g_assert (tuple_key == tuple_value); memcpy (tuples->data + (tuples->len * tuples->width), tuple, stride); tuples->len += 1; } /** * g_relation_select: * @relation: a #GRelation. * @key: the value to compare with. * @field: the field of each record to match. * * 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* g_relation_select (GRelation *relation, gconstpointer key, gint field) { GHashTable *table; GHashTable *key_table; GRealTuples *tuples; gint count; g_return_val_if_fail (relation != NULL, NULL); table = relation->hashed_tuple_tables[field]; g_return_val_if_fail (table != NULL, NULL); tuples = g_new0 (GRealTuples, 1); key_table = g_hash_table_lookup (table, key); if (!key_table) return (GTuples*)tuples; count = g_relation_count (relation, key, field); tuples->data = g_malloc (sizeof (gpointer) * relation->fields * count); tuples->width = relation->fields; g_hash_table_foreach (key_table, g_relation_select_tuple, tuples); g_assert (count == tuples->len); return (GTuples*)tuples; } /** * g_relation_count: * @relation: a #GRelation. * @key: the value to compare with. * @field: the field of each record to match. * * 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 g_relation_count (GRelation *relation, gconstpointer key, gint field) { GHashTable *table; GHashTable *key_table; g_return_val_if_fail (relation != NULL, 0); table = relation->hashed_tuple_tables[field]; g_return_val_if_fail (table != NULL, 0); key_table = g_hash_table_lookup (table, key); if (!key_table) return 0; return g_hash_table_size (key_table); } /** * g_relation_exists: * @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 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 g_relation_exists (GRelation *relation, ...) { gpointer *tuple = g_slice_alloc (relation->fields * sizeof (gpointer)); va_list args; gint i; gboolean result; va_start(args, relation); for (i = 0; i < relation->fields; i += 1) tuple[i] = va_arg(args, gpointer); va_end(args); result = g_hash_table_lookup (relation->all_tuples, tuple) != NULL; g_slice_free1 (relation->fields * sizeof (gpointer), tuple); return result; } /** * g_tuples_destroy: * @tuples: the tuple data to free. * * Frees the records which were returned by g_relation_select(). This * should always be called after g_relation_select() when you are * finished with the records. The records are not removed from the * #GRelation. * * Deprecated: 2.26: Rarely used API **/ void g_tuples_destroy (GTuples *tuples0) { GRealTuples *tuples = (GRealTuples*) tuples0; if (tuples) { g_free (tuples->data); g_free (tuples); } } /** * g_tuples_index: * @tuples: the tuple data, returned by g_relation_select(). * @index_: the index of the record. * @field: the field to return. * * 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 g_tuples_index (GTuples *tuples0, gint index, gint field) { GRealTuples *tuples = (GRealTuples*) tuples0; g_return_val_if_fail (tuples0 != NULL, NULL); g_return_val_if_fail (field < tuples->width, NULL); return tuples->data[index * tuples->width + field]; } /* Print */ static void g_relation_print_one (gpointer tuple_key, gpointer tuple_value, gpointer user_data) { gint i; GString *gstring; GRelation* rel = (GRelation*) user_data; gpointer* tuples = (gpointer*) tuple_value; gstring = g_string_new ("["); for (i = 0; i < rel->fields; i += 1) { g_string_append_printf (gstring, "%p", tuples[i]); if (i < (rel->fields - 1)) g_string_append (gstring, ","); } g_string_append (gstring, "]"); g_log (G_LOG_DOMAIN, G_LOG_LEVEL_INFO, "%s", gstring->str); g_string_free (gstring, TRUE); } static void g_relation_print_index (gpointer tuple_key, gpointer tuple_value, gpointer user_data) { GRelation* rel = (GRelation*) user_data; GHashTable* table = (GHashTable*) tuple_value; g_log (G_LOG_DOMAIN, G_LOG_LEVEL_INFO, "*** key %p", tuple_key); g_hash_table_foreach (table, g_relation_print_one, rel); } /** * g_relation_print: * @relation: a #GRelation. * * Outputs information about all records in a #GRelation, as well as * the indexes. It is for debugging. * * Deprecated: 2.26: Rarely used API **/ void g_relation_print (GRelation *relation) { gint i; g_log (G_LOG_DOMAIN, G_LOG_LEVEL_INFO, "*** all tuples (%d)", relation->count); g_hash_table_foreach (relation->all_tuples, g_relation_print_one, relation); for (i = 0; i < relation->fields; i += 1) { if (relation->hashed_tuple_tables[i] == NULL) continue; g_log (G_LOG_DOMAIN, G_LOG_LEVEL_INFO, "*** index %d", i); g_hash_table_foreach (relation->hashed_tuple_tables[i], g_relation_print_index, relation); } } pkg-config-0.29.1/glib/glib/deprecated/gcompletion.c0000664000175000017500000003111512651243552017176 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the GLib Team and others 1997-2000. See the AUTHORS * file for a list of people on the GLib Team. See the ChangeLog * files for a list of changes. These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/. */ /* * MT safe */ #include "config.h" /* we know we are deprecated here, no need for warnings */ #define GLIB_DISABLE_DEPRECATION_WARNINGS #include "gcompletion.h" #include #include #include #include /** * SECTION:completion * @title: Automatic String Completion * @short_description: support for automatic completion using a group * of target strings * * #GCompletion provides support for automatic completion of a string * using any group of target strings. It is typically used for file * name completion as is common in many UNIX shells. * * A #GCompletion is created using g_completion_new(). Target items are * added and removed with g_completion_add_items(), * g_completion_remove_items() and g_completion_clear_items(). A * completion attempt is requested with g_completion_complete() or * g_completion_complete_utf8(). When no longer needed, the * #GCompletion is freed with g_completion_free(). * * Items in the completion can be simple strings (e.g. filenames), or * pointers to arbitrary data structures. If data structures are used * you must provide a #GCompletionFunc in g_completion_new(), which * retrieves the item's string from the data structure. You can change * the way in which strings are compared by setting a different * #GCompletionStrncmpFunc in g_completion_set_compare(). * * GCompletion has been marked as deprecated, since this API is rarely * used and not very actively maintained. **/ /** * GCompletion: * @items: list of target items (strings or data structures). * @func: function which is called to get the string associated with a * target item. It is %NULL if the target items are strings. * @prefix: the last prefix passed to g_completion_complete() or * g_completion_complete_utf8(). * @cache: the list of items which begin with @prefix. * @strncmp_func: The function to use when comparing strings. Use * g_completion_set_compare() to modify this function. * * The data structure used for automatic completion. **/ /** * GCompletionFunc: * @Param1: the completion 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. **/ /** * GCompletionStrncmpFunc: * @s1: string to compare with @s2. * @s2: string to compare with @s1. * @n: maximal number of bytes to compare. * * 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, gchar** new_prefix); /** * g_completion_new: * @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. * * Creates a new #GCompletion. * * Returns: the new #GCompletion. **/ GCompletion* g_completion_new (GCompletionFunc func) { GCompletion* gcomp; gcomp = g_new (GCompletion, 1); gcomp->items = NULL; gcomp->cache = NULL; gcomp->prefix = NULL; gcomp->func = func; gcomp->strncmp_func = strncmp; return gcomp; } /** * g_completion_add_items: * @cmp: the #GCompletion. * @items: (transfer none): the list of items to add. * * Adds items to the #GCompletion. * * Deprecated: 2.26: Rarely used API **/ void g_completion_add_items (GCompletion* cmp, GList* items) { GList* it; g_return_if_fail (cmp != NULL); /* optimize adding to cache? */ if (cmp->cache) { g_list_free (cmp->cache); cmp->cache = NULL; } if (cmp->prefix) { g_free (cmp->prefix); cmp->prefix = NULL; } it = items; while (it) { cmp->items = g_list_prepend (cmp->items, it->data); it = it->next; } } /** * g_completion_remove_items: * @cmp: the #GCompletion. * @items: (transfer none): the items to remove. * * 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 **/ void g_completion_remove_items (GCompletion* cmp, GList* items) { GList* it; g_return_if_fail (cmp != NULL); it = items; while (cmp->items && it) { cmp->items = g_list_remove (cmp->items, it->data); it = it->next; } it = items; while (cmp->cache && it) { cmp->cache = g_list_remove(cmp->cache, it->data); it = it->next; } } /** * g_completion_clear_items: * @cmp: 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 **/ void g_completion_clear_items (GCompletion* cmp) { g_return_if_fail (cmp != NULL); g_list_free (cmp->items); cmp->items = NULL; g_list_free (cmp->cache); cmp->cache = NULL; g_free (cmp->prefix); cmp->prefix = NULL; } static void completion_check_cache (GCompletion* cmp, gchar** new_prefix) { register GList* list; register gsize len; register gsize i; register gsize plen; gchar* postfix; gchar* s; if (!new_prefix) return; if (!cmp->cache) { *new_prefix = NULL; return; } len = strlen(cmp->prefix); list = cmp->cache; s = cmp->func ? cmp->func (list->data) : (gchar*) list->data; postfix = s + len; plen = strlen (postfix); list = list->next; while (list && plen) { s = cmp->func ? cmp->func (list->data) : (gchar*) list->data; s += len; for (i = 0; i < plen; ++i) { if (postfix[i] != s[i]) break; } plen = i; list = list->next; } *new_prefix = g_new0 (gchar, len + plen + 1); strncpy (*new_prefix, cmp->prefix, len); strncpy (*new_prefix + len, postfix, plen); } /** * g_completion_complete_utf8: * @cmp: the #GCompletion * @prefix: the prefix string, typically used by the user, which is compared * with each of the items * @new_prefix: if non-%NULL, returns the longest prefix which is common to all * items that matched @prefix, or %NULL if no items matched @prefix. * This string should be freed when no longer needed. * * Attempts to complete the string @prefix using the #GCompletion target items. * In contrast to g_completion_complete(), this function returns the largest common * prefix that is a valid UTF-8 string, omitting a possible common partial * character. * * You should use this function instead of g_completion_complete() if your * items are UTF-8 strings. * * Return value: (element-type utf8) (transfer none): the list of items whose strings begin with @prefix. This should * not be changed. * * Since: 2.4 * * Deprecated: 2.26: Rarely used API **/ GList* g_completion_complete_utf8 (GCompletion *cmp, const gchar *prefix, gchar **new_prefix) { GList *list; gchar *p, *q; list = g_completion_complete (cmp, prefix, new_prefix); if (new_prefix && *new_prefix) { p = *new_prefix + strlen (*new_prefix); q = g_utf8_find_prev_char (*new_prefix, p); switch (g_utf8_get_char_validated (q, p - q)) { case (gunichar)-2: case (gunichar)-1: *q = 0; break; default: ; } } return list; } /** * g_completion_complete: * @cmp: the #GCompletion. * @prefix: the prefix string, typically typed by the user, which is * compared with each of the items. * @new_prefix: if non-%NULL, returns the longest prefix which is * common to all items that matched @prefix, or %NULL if * no items matched @prefix. This string should be freed * when no longer needed. * * 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* g_completion_complete (GCompletion* cmp, const gchar* prefix, gchar** new_prefix) { gsize plen, len; gboolean done = FALSE; GList* list; g_return_val_if_fail (cmp != NULL, NULL); g_return_val_if_fail (prefix != NULL, NULL); len = strlen (prefix); if (cmp->prefix && cmp->cache) { plen = strlen (cmp->prefix); if (plen <= len && ! cmp->strncmp_func (prefix, cmp->prefix, plen)) { /* use the cache */ list = cmp->cache; while (list) { GList *next = list->next; if (cmp->strncmp_func (prefix, cmp->func ? cmp->func (list->data) : (gchar*) list->data, len)) cmp->cache = g_list_delete_link (cmp->cache, list); list = next; } done = TRUE; } } if (!done) { /* normal code */ g_list_free (cmp->cache); cmp->cache = NULL; list = cmp->items; while (*prefix && list) { if (!cmp->strncmp_func (prefix, cmp->func ? cmp->func (list->data) : (gchar*) list->data, len)) cmp->cache = g_list_prepend (cmp->cache, list->data); list = list->next; } } if (cmp->prefix) { g_free (cmp->prefix); cmp->prefix = NULL; } if (cmp->cache) cmp->prefix = g_strdup (prefix); completion_check_cache (cmp, new_prefix); return *prefix ? cmp->cache : cmp->items; } /** * g_completion_free: * @cmp: 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 **/ void g_completion_free (GCompletion* cmp) { g_return_if_fail (cmp != NULL); g_completion_clear_items (cmp); g_free (cmp); } /** * g_completion_set_compare: * @cmp: a #GCompletion. * @strncmp_func: the string comparison function. * * Sets the function to use for string comparisons. The default string * comparison function is strncmp(). * * Deprecated: 2.26: Rarely used API **/ void g_completion_set_compare(GCompletion *cmp, GCompletionStrncmpFunc strncmp_func) { cmp->strncmp_func = strncmp_func; } #ifdef TEST_COMPLETION #include int main (int argc, char* argv[]) { FILE *file; gchar buf[1024]; GList *list; GList *result; GList *tmp; GCompletion *cmp; gint i; gchar *longp = NULL; if (argc < 3) { g_warning ("Usage: %s filename prefix1 [prefix2 ...]\n", argv[0]); return 1; } file = fopen (argv[1], "r"); if (!file) { g_warning ("Cannot open %s\n", argv[1]); return 1; } cmp = g_completion_new (NULL); list = g_list_alloc (); while (fgets (buf, 1024, file)) { list->data = g_strdup (buf); g_completion_add_items (cmp, list); } fclose (file); for (i = 2; i < argc; ++i) { printf ("COMPLETING: %s\n", argv[i]); result = g_completion_complete (cmp, argv[i], &longp); g_list_foreach (result, (GFunc) printf, NULL); printf ("LONG MATCH: %s\n", longp); g_free (longp); longp = NULL; } g_list_foreach (cmp->items, (GFunc) g_free, NULL); g_completion_free (cmp); g_list_free (list); return 0; } #endif pkg-config-0.29.1/glib/glib/deprecated/gthread.h0000664000175000017500000002360212651243552016303 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the GLib Team and others 1997-2000. See the AUTHORS * file for a list of people on the GLib Team. See the ChangeLog * files for a list of changes. These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/. */ #ifndef __G_DEPRECATED_THREAD_H__ #define __G_DEPRECATED_THREAD_H__ #if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) #error "Only can be included directly." #endif #include G_BEGIN_DECLS typedef enum { G_THREAD_PRIORITY_LOW, G_THREAD_PRIORITY_NORMAL, G_THREAD_PRIORITY_HIGH, G_THREAD_PRIORITY_URGENT } GThreadPriority; struct _GThread { /*< private >*/ GThreadFunc func; gpointer data; gboolean joinable; GThreadPriority priority; }; typedef struct _GThreadFunctions GThreadFunctions; struct _GThreadFunctions { GMutex* (*mutex_new) (void); void (*mutex_lock) (GMutex *mutex); gboolean (*mutex_trylock) (GMutex *mutex); void (*mutex_unlock) (GMutex *mutex); void (*mutex_free) (GMutex *mutex); GCond* (*cond_new) (void); void (*cond_signal) (GCond *cond); void (*cond_broadcast) (GCond *cond); void (*cond_wait) (GCond *cond, GMutex *mutex); gboolean (*cond_timed_wait) (GCond *cond, GMutex *mutex, GTimeVal *end_time); void (*cond_free) (GCond *cond); GPrivate* (*private_new) (GDestroyNotify destructor); gpointer (*private_get) (GPrivate *private_key); void (*private_set) (GPrivate *private_key, gpointer data); void (*thread_create) (GThreadFunc func, gpointer data, gulong stack_size, gboolean joinable, gboolean bound, GThreadPriority priority, gpointer thread, GError **error); void (*thread_yield) (void); void (*thread_join) (gpointer thread); void (*thread_exit) (void); void (*thread_set_priority)(gpointer thread, GThreadPriority priority); void (*thread_self) (gpointer thread); gboolean (*thread_equal) (gpointer thread1, gpointer thread2); }; GLIB_VAR GThreadFunctions g_thread_functions_for_glib_use; GLIB_VAR gboolean g_thread_use_default_impl; GLIB_VAR guint64 (*g_thread_gettime) (void); GLIB_DEPRECATED_IN_2_32_FOR(g_thread_new) GThread *g_thread_create (GThreadFunc func, gpointer data, gboolean joinable, GError **error); GLIB_DEPRECATED_IN_2_32_FOR(g_thread_new) GThread *g_thread_create_full (GThreadFunc func, gpointer data, gulong stack_size, gboolean joinable, gboolean bound, GThreadPriority priority, GError **error); GLIB_DEPRECATED_IN_2_32 void g_thread_set_priority (GThread *thread, GThreadPriority priority); GLIB_DEPRECATED_IN_2_32 void g_thread_foreach (GFunc thread_func, gpointer user_data); #ifndef G_OS_WIN32 #include #endif #define g_static_mutex_get_mutex g_static_mutex_get_mutex_impl #define G_STATIC_MUTEX_INIT { NULL } typedef struct { GMutex *mutex; #ifndef G_OS_WIN32 /* only for ABI compatibility reasons */ pthread_mutex_t unused; #endif } GStaticMutex; #define g_static_mutex_lock(mutex) \ g_mutex_lock (g_static_mutex_get_mutex (mutex)) #define g_static_mutex_trylock(mutex) \ g_mutex_trylock (g_static_mutex_get_mutex (mutex)) #define g_static_mutex_unlock(mutex) \ g_mutex_unlock (g_static_mutex_get_mutex (mutex)) GLIB_DEPRECATED_IN_2_32_FOR(g_mutex_init) void g_static_mutex_init (GStaticMutex *mutex); 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; struct _GStaticRecMutex { /*< private >*/ GStaticMutex mutex; guint depth; /* ABI compat only */ union { #ifdef G_OS_WIN32 void *owner; #else pthread_t owner; #endif gdouble dummy; } unused; }; #define G_STATIC_REC_MUTEX_INIT { G_STATIC_MUTEX_INIT } GLIB_DEPRECATED_IN_2_32_FOR(g_rec_mutex_init) void g_static_rec_mutex_init (GStaticRecMutex *mutex); GLIB_DEPRECATED_IN_2_32_FOR(g_rec_mutex_lock) void g_static_rec_mutex_lock (GStaticRecMutex *mutex); GLIB_DEPRECATED_IN_2_32_FOR(g_rec_mutex_try_lock) gboolean g_static_rec_mutex_trylock (GStaticRecMutex *mutex); GLIB_DEPRECATED_IN_2_32_FOR(g_rec_mutex_unlock) void g_static_rec_mutex_unlock (GStaticRecMutex *mutex); GLIB_DEPRECATED_IN_2_32 void g_static_rec_mutex_lock_full (GStaticRecMutex *mutex, guint depth); GLIB_DEPRECATED_IN_2_32 guint g_static_rec_mutex_unlock_full (GStaticRecMutex *mutex); GLIB_DEPRECATED_IN_2_32_FOR(g_rec_mutex_free) void g_static_rec_mutex_free (GStaticRecMutex *mutex); typedef struct _GStaticRWLock GStaticRWLock; struct _GStaticRWLock { /*< private >*/ GStaticMutex mutex; GCond *read_cond; GCond *write_cond; guint read_counter; gboolean have_writer; guint want_to_read; guint want_to_write; }; #define G_STATIC_RW_LOCK_INIT { G_STATIC_MUTEX_INIT, NULL, NULL, 0, FALSE, 0, 0 } GLIB_DEPRECATED_IN_2_32_FOR(g_rw_lock_init) void g_static_rw_lock_init (GStaticRWLock *lock); GLIB_DEPRECATED_IN_2_32_FOR(g_rw_lock_reader_lock) void g_static_rw_lock_reader_lock (GStaticRWLock *lock); GLIB_DEPRECATED_IN_2_32_FOR(g_rw_lock_reader_trylock) gboolean g_static_rw_lock_reader_trylock (GStaticRWLock *lock); GLIB_DEPRECATED_IN_2_32_FOR(g_rw_lock_reader_unlock) void g_static_rw_lock_reader_unlock (GStaticRWLock *lock); GLIB_DEPRECATED_IN_2_32_FOR(g_rw_lock_writer_lock) void g_static_rw_lock_writer_lock (GStaticRWLock *lock); GLIB_DEPRECATED_IN_2_32_FOR(g_rw_lock_writer_trylock) gboolean g_static_rw_lock_writer_trylock (GStaticRWLock *lock); GLIB_DEPRECATED_IN_2_32_FOR(g_rw_lock_writer_unlock) void g_static_rw_lock_writer_unlock (GStaticRWLock *lock); GLIB_DEPRECATED_IN_2_32_FOR(g_rw_lock_free) void g_static_rw_lock_free (GStaticRWLock *lock); GLIB_DEPRECATED_IN_2_32 GPrivate * g_private_new (GDestroyNotify notify); typedef struct _GStaticPrivate GStaticPrivate; struct _GStaticPrivate { /*< private >*/ guint index; }; #define G_STATIC_PRIVATE_INIT { 0 } GLIB_DEPRECATED_IN_2_32 void g_static_private_init (GStaticPrivate *private_key); GLIB_DEPRECATED_IN_2_32_FOR(g_private_get) gpointer g_static_private_get (GStaticPrivate *private_key); GLIB_DEPRECATED_IN_2_32_FOR(g_private_set) void g_static_private_set (GStaticPrivate *private_key, gpointer data, GDestroyNotify notify); GLIB_DEPRECATED_IN_2_32 void g_static_private_free (GStaticPrivate *private_key); GLIB_DEPRECATED_IN_2_32 gboolean g_once_init_enter_impl (volatile gsize *location); GLIB_DEPRECATED_IN_2_32 void g_thread_init (gpointer vtable); GLIB_DEPRECATED_IN_2_32 void g_thread_init_with_errorcheck_mutexes (gpointer vtable); GLIB_DEPRECATED_IN_2_32 gboolean g_thread_get_initialized (void); GLIB_VAR gboolean g_threads_got_initialized; #define g_thread_supported() (1) GLIB_DEPRECATED_IN_2_32 GMutex * g_mutex_new (void); GLIB_DEPRECATED_IN_2_32 void g_mutex_free (GMutex *mutex); GLIB_DEPRECATED_IN_2_32 GCond * g_cond_new (void); GLIB_DEPRECATED_IN_2_32 void g_cond_free (GCond *cond); GLIB_DEPRECATED_IN_2_32 gboolean g_cond_timed_wait (GCond *cond, GMutex *mutex, GTimeVal *timeval); G_END_DECLS #endif /* __G_DEPRECATED_THREAD_H__ */ pkg-config-0.29.1/glib/glib/gtree.c0000664000175000017500000010236512651243552013672 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the GLib Team and others 1997-2000. See the AUTHORS * file for a list of people on the GLib Team. See the ChangeLog * files for a list of changes. These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/. */ /* * MT safe */ #include "config.h" #include "gtree.h" #include "gatomic.h" #include "gtestutils.h" #include "gslice.h" /** * SECTION:trees-binary * @title: Balanced Binary Trees * @short_description: a sorted collection of key/value pairs optimized * for searching and traversing in order * * The #GTree structure and its associated functions provide a sorted * collection of key/value pairs optimized for searching and traversing * in order. * * To create a new #GTree use g_tree_new(). * * To insert a key/value pair into a #GTree use g_tree_insert(). * * To lookup the value corresponding to a given key, use * g_tree_lookup() and g_tree_lookup_extended(). * * To find out the number of nodes in a #GTree, use g_tree_nnodes(). To * get the height of a #GTree, use g_tree_height(). * * To traverse a #GTree, calling a function for each node visited in * the traversal, use g_tree_foreach(). * * To remove a key/value pair use g_tree_remove(). * * To destroy a #GTree, use g_tree_destroy(). **/ #undef G_TREE_DEBUG #define MAX_GTREE_HEIGHT 40 typedef struct _GTreeNode GTreeNode; /** * GTree: * * The GTree struct is an opaque data * structure representing a Balanced Binary Tree. It * should be accessed only by using the following functions. **/ struct _GTree { GTreeNode *root; GCompareDataFunc key_compare; GDestroyNotify key_destroy_func; GDestroyNotify value_destroy_func; gpointer key_compare_data; guint nnodes; gint ref_count; }; struct _GTreeNode { gpointer key; /* key for this node */ gpointer value; /* value stored at this node */ GTreeNode *left; /* left subtree */ GTreeNode *right; /* right subtree */ gint8 balance; /* height (right) - height (left) */ guint8 left_child; guint8 right_child; }; static GTreeNode* g_tree_node_new (gpointer key, gpointer value); static void g_tree_insert_internal (GTree *tree, gpointer key, gpointer value, gboolean replace); static gboolean g_tree_remove_internal (GTree *tree, gconstpointer key, gboolean steal); static GTreeNode* g_tree_node_balance (GTreeNode *node); static GTreeNode *g_tree_find_node (GTree *tree, gconstpointer key); static gint g_tree_node_pre_order (GTreeNode *node, GTraverseFunc traverse_func, gpointer data); static gint g_tree_node_in_order (GTreeNode *node, GTraverseFunc traverse_func, gpointer data); static gint g_tree_node_post_order (GTreeNode *node, GTraverseFunc traverse_func, gpointer data); static gpointer g_tree_node_search (GTreeNode *node, GCompareFunc search_func, gconstpointer data); static GTreeNode* g_tree_node_rotate_left (GTreeNode *node); static GTreeNode* g_tree_node_rotate_right (GTreeNode *node); #ifdef G_TREE_DEBUG static void g_tree_node_check (GTreeNode *node); #endif static GTreeNode* g_tree_node_new (gpointer key, gpointer value) { GTreeNode *node = g_slice_new (GTreeNode); node->balance = 0; node->left = NULL; node->right = NULL; node->left_child = FALSE; node->right_child = FALSE; node->key = key; node->value = value; return node; } /** * g_tree_new: * @key_compare_func: the function used to order the nodes in the #GTree. * It should return values similar to the standard strcmp() function - * 0 if the two arguments are equal, a negative value if the first argument * comes before the second, or a positive value if the first argument comes * after the second. * * Creates a new #GTree. * * Return value: a new #GTree. **/ GTree* g_tree_new (GCompareFunc key_compare_func) { g_return_val_if_fail (key_compare_func != NULL, NULL); return g_tree_new_full ((GCompareDataFunc) key_compare_func, NULL, NULL, NULL); } /** * g_tree_new_with_data: * @key_compare_func: qsort()-style comparison function. * @key_compare_data: data to pass to comparison function. * * Creates a new #GTree with a comparison function that accepts user data. * See g_tree_new() for more details. * * Return value: a new #GTree. **/ GTree* g_tree_new_with_data (GCompareDataFunc key_compare_func, gpointer key_compare_data) { g_return_val_if_fail (key_compare_func != NULL, NULL); return g_tree_new_full (key_compare_func, key_compare_data, NULL, NULL); } /** * g_tree_new_full: * @key_compare_func: qsort()-style comparison function. * @key_compare_data: data to pass to comparison function. * @key_destroy_func: a function to free the memory allocated for the key * used when removing the entry from the #GTree or %NULL if you don't * want to supply such a function. * @value_destroy_func: a function to free the memory allocated for the * value used when removing the entry from the #GTree or %NULL if you * don't want to supply such a function. * * Creates a new #GTree like g_tree_new() and allows to specify functions * to free the memory allocated for the key and value that get called when * removing the entry from the #GTree. * * Return value: a new #GTree. **/ GTree* g_tree_new_full (GCompareDataFunc key_compare_func, gpointer key_compare_data, GDestroyNotify key_destroy_func, GDestroyNotify value_destroy_func) { GTree *tree; g_return_val_if_fail (key_compare_func != NULL, NULL); tree = g_slice_new (GTree); tree->root = NULL; tree->key_compare = key_compare_func; tree->key_destroy_func = key_destroy_func; tree->value_destroy_func = value_destroy_func; tree->key_compare_data = key_compare_data; tree->nnodes = 0; tree->ref_count = 1; return tree; } static inline GTreeNode * g_tree_first_node (GTree *tree) { GTreeNode *tmp; if (!tree->root) return NULL; tmp = tree->root; while (tmp->left_child) tmp = tmp->left; return tmp; } static inline GTreeNode * g_tree_node_previous (GTreeNode *node) { GTreeNode *tmp; tmp = node->left; if (node->left_child) while (tmp->right_child) tmp = tmp->right; return tmp; } static inline GTreeNode * g_tree_node_next (GTreeNode *node) { GTreeNode *tmp; tmp = node->right; if (node->right_child) while (tmp->left_child) tmp = tmp->left; return tmp; } static void g_tree_remove_all (GTree *tree) { GTreeNode *node; GTreeNode *next; g_return_if_fail (tree != NULL); node = g_tree_first_node (tree); while (node) { next = g_tree_node_next (node); if (tree->key_destroy_func) tree->key_destroy_func (node->key); if (tree->value_destroy_func) tree->value_destroy_func (node->value); g_slice_free (GTreeNode, node); node = next; } tree->root = NULL; tree->nnodes = 0; } /** * g_tree_ref: * @tree: a #GTree. * * Increments the reference count of @tree by one. It is safe to call * this function from any thread. * * Return value: the passed in #GTree. * * Since: 2.22 **/ GTree * g_tree_ref (GTree *tree) { g_return_val_if_fail (tree != NULL, NULL); g_atomic_int_inc (&tree->ref_count); return tree; } /** * g_tree_unref: * @tree: a #GTree. * * Decrements the reference count of @tree by one. If the reference count * drops to 0, all keys and values will be destroyed (if destroy * functions were specified) and all memory allocated by @tree will be * released. * * It is safe to call this function from any thread. * * Since: 2.22 **/ void g_tree_unref (GTree *tree) { g_return_if_fail (tree != NULL); if (g_atomic_int_dec_and_test (&tree->ref_count)) { g_tree_remove_all (tree); g_slice_free (GTree, tree); } } /** * g_tree_destroy: * @tree: a #GTree. * * Removes all keys and values from the #GTree and decreases its * reference count by one. If keys and/or values are dynamically * allocated, you should either free them first or create the #GTree * using g_tree_new_full(). In the latter case the destroy functions * you supplied will be called on all keys and values before destroying * the #GTree. **/ void g_tree_destroy (GTree *tree) { g_return_if_fail (tree != NULL); g_tree_remove_all (tree); g_tree_unref (tree); } /** * g_tree_insert: * @tree: a #GTree. * @key: the key to insert. * @value: the value corresponding to the key. * * Inserts a key/value pair into a #GTree. If the given key already exists * in the #GTree its corresponding value is set to the new value. If you * supplied a value_destroy_func when creating the #GTree, the old value is * freed using that function. If you supplied a @key_destroy_func when * creating the #GTree, the passed key is freed using that function. * * The tree is automatically 'balanced' as new key/value pairs are added, * so that the distance from the root to every leaf is as small as possible. **/ void g_tree_insert (GTree *tree, gpointer key, gpointer value) { g_return_if_fail (tree != NULL); g_tree_insert_internal (tree, key, value, FALSE); #ifdef G_TREE_DEBUG g_tree_node_check (tree->root); #endif } /** * g_tree_replace: * @tree: a #GTree. * @key: the key to insert. * @value: the value corresponding to the key. * * Inserts a new key and value into a #GTree similar to g_tree_insert(). * The difference is that if the key already exists in the #GTree, it gets * replaced by the new key. If you supplied a @value_destroy_func when * creating the #GTree, the old value is freed using that function. If you * supplied a @key_destroy_func when creating the #GTree, the old key is * freed using that function. * * The tree is automatically 'balanced' as new key/value pairs are added, * so that the distance from the root to every leaf is as small as possible. **/ void g_tree_replace (GTree *tree, gpointer key, gpointer value) { g_return_if_fail (tree != NULL); g_tree_insert_internal (tree, key, value, TRUE); #ifdef G_TREE_DEBUG g_tree_node_check (tree->root); #endif } /* internal insert routine */ static void g_tree_insert_internal (GTree *tree, gpointer key, gpointer value, gboolean replace) { GTreeNode *node; GTreeNode *path[MAX_GTREE_HEIGHT]; int idx; g_return_if_fail (tree != NULL); if (!tree->root) { tree->root = g_tree_node_new (key, value); tree->nnodes++; return; } idx = 0; path[idx++] = NULL; node = tree->root; while (1) { int cmp = tree->key_compare (key, node->key, tree->key_compare_data); if (cmp == 0) { if (tree->value_destroy_func) tree->value_destroy_func (node->value); node->value = value; if (replace) { if (tree->key_destroy_func) tree->key_destroy_func (node->key); node->key = key; } else { /* free the passed key */ if (tree->key_destroy_func) tree->key_destroy_func (key); } return; } else if (cmp < 0) { if (node->left_child) { path[idx++] = node; node = node->left; } else { GTreeNode *child = g_tree_node_new (key, value); child->left = node->left; child->right = node; node->left = child; node->left_child = TRUE; node->balance -= 1; tree->nnodes++; break; } } else { if (node->right_child) { path[idx++] = node; node = node->right; } else { GTreeNode *child = g_tree_node_new (key, value); child->right = node->right; child->left = node; node->right = child; node->right_child = TRUE; node->balance += 1; tree->nnodes++; break; } } } /* restore balance. This is the goodness of a non-recursive implementation, when we are done with balancing we 'break' the loop and we are done. */ while (1) { GTreeNode *bparent = path[--idx]; gboolean left_node = (bparent && node == bparent->left); g_assert (!bparent || bparent->left == node || bparent->right == node); if (node->balance < -1 || node->balance > 1) { node = g_tree_node_balance (node); if (bparent == NULL) tree->root = node; else if (left_node) bparent->left = node; else bparent->right = node; } if (node->balance == 0 || bparent == NULL) break; if (left_node) bparent->balance -= 1; else bparent->balance += 1; node = bparent; } } /** * g_tree_remove: * @tree: a #GTree. * @key: the key to remove. * * Removes a key/value pair from a #GTree. * * If the #GTree was created using g_tree_new_full(), the key and value * are freed using the supplied destroy functions, otherwise you have to * make sure that any dynamically allocated values are freed yourself. * If the key does not exist in the #GTree, the function does nothing. * * Returns: %TRUE if the key was found (prior to 2.8, this function returned * nothing) **/ gboolean g_tree_remove (GTree *tree, gconstpointer key) { gboolean removed; g_return_val_if_fail (tree != NULL, FALSE); removed = g_tree_remove_internal (tree, key, FALSE); #ifdef G_TREE_DEBUG g_tree_node_check (tree->root); #endif return removed; } /** * g_tree_steal: * @tree: a #GTree. * @key: the key to remove. * * Removes a key and its associated value from a #GTree without calling * the key and value destroy functions. * * If the key does not exist in the #GTree, the function does nothing. * * Returns: %TRUE if the key was found (prior to 2.8, this function returned * nothing) **/ gboolean g_tree_steal (GTree *tree, gconstpointer key) { gboolean removed; g_return_val_if_fail (tree != NULL, FALSE); removed = g_tree_remove_internal (tree, key, TRUE); #ifdef G_TREE_DEBUG g_tree_node_check (tree->root); #endif return removed; } /* internal remove routine */ static gboolean g_tree_remove_internal (GTree *tree, gconstpointer key, gboolean steal) { GTreeNode *node, *parent, *balance; GTreeNode *path[MAX_GTREE_HEIGHT]; int idx; gboolean left_node; g_return_val_if_fail (tree != NULL, FALSE); if (!tree->root) return FALSE; idx = 0; path[idx++] = NULL; node = tree->root; while (1) { int cmp = tree->key_compare (key, node->key, tree->key_compare_data); if (cmp == 0) break; else if (cmp < 0) { if (!node->left_child) return FALSE; path[idx++] = node; node = node->left; } else { if (!node->right_child) return FALSE; path[idx++] = node; node = node->right; } } /* the following code is almost equal to g_tree_remove_node, except that we do not have to call g_tree_node_parent. */ balance = parent = path[--idx]; g_assert (!parent || parent->left == node || parent->right == node); left_node = (parent && node == parent->left); if (!node->left_child) { if (!node->right_child) { if (!parent) tree->root = NULL; else if (left_node) { parent->left_child = FALSE; parent->left = node->left; parent->balance += 1; } else { parent->right_child = FALSE; parent->right = node->right; parent->balance -= 1; } } else /* node has a right child */ { GTreeNode *tmp = g_tree_node_next (node); tmp->left = node->left; if (!parent) tree->root = node->right; else if (left_node) { parent->left = node->right; parent->balance += 1; } else { parent->right = node->right; parent->balance -= 1; } } } else /* node has a left child */ { if (!node->right_child) { GTreeNode *tmp = g_tree_node_previous (node); tmp->right = node->right; if (parent == NULL) tree->root = node->left; else if (left_node) { parent->left = node->left; parent->balance += 1; } else { parent->right = node->left; parent->balance -= 1; } } else /* node has a both children (pant, pant!) */ { GTreeNode *prev = node->left; GTreeNode *next = node->right; GTreeNode *nextp = node; int old_idx = idx + 1; idx++; /* path[idx] == parent */ /* find the immediately next node (and its parent) */ while (next->left_child) { path[++idx] = nextp = next; next = next->left; } path[old_idx] = next; balance = path[idx]; /* remove 'next' from the tree */ if (nextp != node) { if (next->right_child) nextp->left = next->right; else nextp->left_child = FALSE; nextp->balance += 1; next->right_child = TRUE; next->right = node->right; } else node->balance -= 1; /* set the prev to point to the right place */ while (prev->right_child) prev = prev->right; prev->right = next; /* prepare 'next' to replace 'node' */ next->left_child = TRUE; next->left = node->left; next->balance = node->balance; if (!parent) tree->root = next; else if (left_node) parent->left = next; else parent->right = next; } } /* restore balance */ if (balance) while (1) { GTreeNode *bparent = path[--idx]; g_assert (!bparent || bparent->left == balance || bparent->right == balance); left_node = (bparent && balance == bparent->left); if(balance->balance < -1 || balance->balance > 1) { balance = g_tree_node_balance (balance); if (!bparent) tree->root = balance; else if (left_node) bparent->left = balance; else bparent->right = balance; } if (balance->balance != 0 || !bparent) break; if (left_node) bparent->balance += 1; else bparent->balance -= 1; balance = bparent; } if (!steal) { if (tree->key_destroy_func) tree->key_destroy_func (node->key); if (tree->value_destroy_func) tree->value_destroy_func (node->value); } g_slice_free (GTreeNode, node); tree->nnodes--; return TRUE; } /** * g_tree_lookup: * @tree: a #GTree. * @key: the key to look up. * * Gets the value corresponding to the given key. Since a #GTree is * automatically balanced as key/value pairs are added, key lookup is very * fast. * * Return value: the value corresponding to the key, or %NULL if the key was * not found. **/ gpointer g_tree_lookup (GTree *tree, gconstpointer key) { GTreeNode *node; g_return_val_if_fail (tree != NULL, NULL); node = g_tree_find_node (tree, key); return node ? node->value : NULL; } /** * g_tree_lookup_extended: * @tree: a #GTree. * @lookup_key: the key to look up. * @orig_key: returns the original key. * @value: returns the value associated with the key. * * Looks up a key in the #GTree, returning the original key and the * associated value and a #gboolean which is %TRUE if the key was found. This * is useful if you need to free the memory allocated for the original key, * for example before calling g_tree_remove(). * * Return value: %TRUE if the key was found in the #GTree. **/ gboolean g_tree_lookup_extended (GTree *tree, gconstpointer lookup_key, gpointer *orig_key, gpointer *value) { GTreeNode *node; g_return_val_if_fail (tree != NULL, FALSE); node = g_tree_find_node (tree, lookup_key); if (node) { if (orig_key) *orig_key = node->key; if (value) *value = node->value; return TRUE; } else return FALSE; } /** * g_tree_foreach: * @tree: a #GTree. * @func: the function to call for each node visited. * If this function returns %TRUE, the traversal is stopped. * @user_data: user data to pass to the function. * * Calls the given function for each of the key/value pairs in the #GTree. * The function is passed the key and value of each pair, and the given * @data parameter. The tree is traversed in sorted order. * * The tree may not be modified while iterating over it (you can't * add/remove items). To remove all items matching a predicate, you need * to add each item to a list in your #GTraverseFunc as you walk over * the tree, then walk the list and remove each item. **/ void g_tree_foreach (GTree *tree, GTraverseFunc func, gpointer user_data) { GTreeNode *node; g_return_if_fail (tree != NULL); if (!tree->root) return; node = g_tree_first_node (tree); while (node) { if ((*func) (node->key, node->value, user_data)) break; node = g_tree_node_next (node); } } /** * g_tree_traverse: * @tree: a #GTree. * @traverse_func: the function to call for each node visited. If this * function returns %TRUE, the traversal is stopped. * @traverse_type: the order in which nodes are visited, one of %G_IN_ORDER, * %G_PRE_ORDER and %G_POST_ORDER. * @user_data: user data to pass to the function. * * Calls the given function for each node in the #GTree. * * Deprecated:2.2: The order of a balanced tree is somewhat arbitrary. If you * just want to visit all nodes in sorted order, use g_tree_foreach() * instead. If you really need to visit nodes in a different order, consider * using an N-ary Tree. **/ /** * GTraverseFunc: * @key: a key of a #GTree node. * @value: the value corresponding to the key. * @data: user data passed to g_tree_traverse(). * * 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: * @G_IN_ORDER: vists a node's left child first, then the node itself, * then its right child. This is the one to use if you * want the output sorted according to the compare * function. * @G_PRE_ORDER: visits a node, then its children. * @G_POST_ORDER: visits the node's children, then the node itself. * @G_LEVEL_ORDER: is not implemented for Balanced Binary * Trees. For N-ary Trees, it * vists the root node first, then its children, then * its grandchildren, and so on. Note that this is less * efficient than the other orders. * * Specifies the type of traveral performed by g_tree_traverse(), * g_node_traverse() and g_node_find(). **/ void g_tree_traverse (GTree *tree, GTraverseFunc traverse_func, GTraverseType traverse_type, gpointer user_data) { g_return_if_fail (tree != NULL); if (!tree->root) return; switch (traverse_type) { case G_PRE_ORDER: g_tree_node_pre_order (tree->root, traverse_func, user_data); break; case G_IN_ORDER: g_tree_node_in_order (tree->root, traverse_func, user_data); break; case G_POST_ORDER: g_tree_node_post_order (tree->root, traverse_func, user_data); break; case G_LEVEL_ORDER: g_warning ("g_tree_traverse(): traverse type G_LEVEL_ORDER isn't implemented."); break; } } /** * g_tree_search: * @tree: a #GTree * @search_func: a function used to search the #GTree * @user_data: the data passed as the second argument to @search_func * * Searches a #GTree using @search_func. * * The @search_func is called with a pointer to the key of a key/value * pair in the tree, and the passed in @user_data. If @search_func returns * 0 for a key/value pair, then the corresponding value is returned as * the result of g_tree_search(). If @search_func returns -1, searching * will proceed among the key/value pairs that have a smaller key; if * @search_func returns 1, searching will proceed among the key/value * pairs that have a larger key. * * Return value: the value corresponding to the found key, or %NULL if * the key was not found. */ gpointer g_tree_search (GTree *tree, GCompareFunc search_func, gconstpointer user_data) { g_return_val_if_fail (tree != NULL, NULL); if (tree->root) return g_tree_node_search (tree->root, search_func, user_data); else return NULL; } /** * g_tree_height: * @tree: a #GTree. * * Gets the height of a #GTree. * * If the #GTree contains no nodes, the height is 0. * If the #GTree contains only one root node the height is 1. * If the root node has children the height is 2, etc. * * Return value: the height of the #GTree. **/ gint g_tree_height (GTree *tree) { GTreeNode *node; gint height; g_return_val_if_fail (tree != NULL, 0); if (!tree->root) return 0; height = 0; node = tree->root; while (1) { height += 1 + MAX(node->balance, 0); if (!node->left_child) return height; node = node->left; } } /** * g_tree_nnodes: * @tree: a #GTree. * * Gets the number of nodes in a #GTree. * * Return value: the number of nodes in the #GTree. **/ gint g_tree_nnodes (GTree *tree) { g_return_val_if_fail (tree != NULL, 0); return tree->nnodes; } static GTreeNode* g_tree_node_balance (GTreeNode *node) { if (node->balance < -1) { if (node->left->balance > 0) node->left = g_tree_node_rotate_left (node->left); node = g_tree_node_rotate_right (node); } else if (node->balance > 1) { if (node->right->balance < 0) node->right = g_tree_node_rotate_right (node->right); node = g_tree_node_rotate_left (node); } return node; } static GTreeNode * g_tree_find_node (GTree *tree, gconstpointer key) { GTreeNode *node; gint cmp; node = tree->root; if (!node) return NULL; while (1) { cmp = tree->key_compare (key, node->key, tree->key_compare_data); if (cmp == 0) return node; else if (cmp < 0) { if (!node->left_child) return NULL; node = node->left; } else { if (!node->right_child) return NULL; node = node->right; } } } static gint g_tree_node_pre_order (GTreeNode *node, GTraverseFunc traverse_func, gpointer data) { if ((*traverse_func) (node->key, node->value, data)) return TRUE; if (node->left_child) { if (g_tree_node_pre_order (node->left, traverse_func, data)) return TRUE; } if (node->right_child) { if (g_tree_node_pre_order (node->right, traverse_func, data)) return TRUE; } return FALSE; } static gint g_tree_node_in_order (GTreeNode *node, GTraverseFunc traverse_func, gpointer data) { if (node->left_child) { if (g_tree_node_in_order (node->left, traverse_func, data)) return TRUE; } if ((*traverse_func) (node->key, node->value, data)) return TRUE; if (node->right_child) { if (g_tree_node_in_order (node->right, traverse_func, data)) return TRUE; } return FALSE; } static gint g_tree_node_post_order (GTreeNode *node, GTraverseFunc traverse_func, gpointer data) { if (node->left_child) { if (g_tree_node_post_order (node->left, traverse_func, data)) return TRUE; } if (node->right_child) { if (g_tree_node_post_order (node->right, traverse_func, data)) return TRUE; } if ((*traverse_func) (node->key, node->value, data)) return TRUE; return FALSE; } static gpointer g_tree_node_search (GTreeNode *node, GCompareFunc search_func, gconstpointer data) { gint dir; if (!node) return NULL; while (1) { dir = (* search_func) (node->key, data); if (dir == 0) return node->value; else if (dir < 0) { if (!node->left_child) return NULL; node = node->left; } else { if (!node->right_child) return NULL; node = node->right; } } } static GTreeNode* g_tree_node_rotate_left (GTreeNode *node) { GTreeNode *right; gint a_bal; gint b_bal; right = node->right; if (right->left_child) node->right = right->left; else { node->right_child = FALSE; right->left_child = TRUE; } right->left = node; a_bal = node->balance; b_bal = right->balance; if (b_bal <= 0) { if (a_bal >= 1) right->balance = b_bal - 1; else right->balance = a_bal + b_bal - 2; node->balance = a_bal - 1; } else { if (a_bal <= b_bal) right->balance = a_bal - 2; else right->balance = b_bal - 1; node->balance = a_bal - b_bal - 1; } return right; } static GTreeNode* g_tree_node_rotate_right (GTreeNode *node) { GTreeNode *left; gint a_bal; gint b_bal; left = node->left; if (left->right_child) node->left = left->right; else { node->left_child = FALSE; left->right_child = TRUE; } left->right = node; a_bal = node->balance; b_bal = left->balance; if (b_bal <= 0) { if (b_bal > a_bal) left->balance = b_bal + 1; else left->balance = a_bal + 2; node->balance = a_bal - b_bal + 1; } else { if (a_bal <= -1) left->balance = b_bal + 1; else left->balance = a_bal + b_bal + 2; node->balance = a_bal + 1; } return left; } #ifdef G_TREE_DEBUG static gint g_tree_node_height (GTreeNode *node) { gint left_height; gint right_height; if (node) { left_height = 0; right_height = 0; if (node->left_child) left_height = g_tree_node_height (node->left); if (node->right_child) right_height = g_tree_node_height (node->right); return MAX (left_height, right_height) + 1; } return 0; } static void g_tree_node_check (GTreeNode *node) { gint left_height; gint right_height; gint balance; GTreeNode *tmp; if (node) { if (node->left_child) { tmp = g_tree_node_previous (node); g_assert (tmp->right == node); } if (node->right_child) { tmp = g_tree_node_next (node); g_assert (tmp->left == node); } left_height = 0; right_height = 0; if (node->left_child) left_height = g_tree_node_height (node->left); if (node->right_child) right_height = g_tree_node_height (node->right); balance = right_height - left_height; g_assert (balance == node->balance); if (node->left_child) g_tree_node_check (node->left); if (node->right_child) g_tree_node_check (node->right); } } static void g_tree_node_dump (GTreeNode *node, gint indent) { g_print ("%*s%c\n", indent, "", *(char *)node->key); if (node->left_child) g_tree_node_dump (node->left, indent + 2); else if (node->left) g_print ("%*s<%c\n", indent + 2, "", *(char *)node->left->key); if (node->right_child) g_tree_node_dump (node->right, indent + 2); else if (node->right) g_print ("%*s>%c\n", indent + 2, "", *(char *)node->right->key); } void g_tree_dump (GTree *tree) { if (tree->root) g_tree_node_dump (tree->root, 0); } #endif pkg-config-0.29.1/glib/glib/gbase64.h0000664000175000017500000000453412651243552014023 00000000000000/* gbase64.h - Base64 coding functions * * Copyright (C) 2005 Alexander Larsson * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __G_BASE64_H__ #define __G_BASE64_H__ #if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) #error "Only can be included directly." #endif #include 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); G_END_DECLS #endif /* __G_BASE64_H__ */ pkg-config-0.29.1/glib/glib/gasyncqueue.c0000664000175000017500000005245312275467762015134 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * GAsyncQueue: asynchronous queue implementation, based on GQueue. * Copyright (C) 2000 Sebastian Wilhelmi; University of Karlsruhe * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * MT safe */ #include "config.h" #include "gasyncqueue.h" #include "gasyncqueueprivate.h" #include "gmain.h" #include "gmem.h" #include "gqueue.h" #include "gtestutils.h" #include "gtimer.h" #include "gthread.h" #include "deprecated/gthread.h" /** * SECTION:async_queues * @title: Asynchronous Queues * @short_description: asynchronous communication between threads * @see_also: #GThreadPool * * Often you need to communicate between different threads. In general * it's safer not to do this by shared memory, but by explicit message * passing. These messages only make sense asynchronously for * multi-threaded applications though, as a synchronous operation could * as well be done in the same thread. * * Asynchronous queues are an exception from most other GLib data * structures, as they can be used simultaneously from multiple threads * without explicit locking and they bring their own builtin reference * counting. This is because the nature of an asynchronous queue is that * it will always be used by at least 2 concurrent threads. * * For using an asynchronous queue you first have to create one with * g_async_queue_new(). #GAsyncQueue structs are reference counted, * use g_async_queue_ref() and g_async_queue_unref() to manage your * references. * * A thread which wants to send a message to that queue simply calls * g_async_queue_push() to push the message to the queue. * * A thread which is expecting messages from an asynchronous queue * simply calls g_async_queue_pop() for that queue. If no message is * available in the queue at that point, the thread is now put to sleep * until a message arrives. The message will be removed from the queue * and returned. The functions g_async_queue_try_pop() and * g_async_queue_timeout_pop() can be used to only check for the presence * of messages or to only wait a certain time for messages respectively. * * For almost every function there exist two variants, one that locks * the queue and one that doesn't. That way you can hold the queue lock * (acquire it with g_async_queue_lock() and release it with * g_async_queue_unlock()) over multiple queue accessing instructions. * This can be necessary to ensure the integrity of the queue, but should * only be used when really necessary, as it can make your life harder * if used unwisely. Normally you should only use the locking function * variants (those without the _unlocked suffix). * * In many cases, it may be more convenient to use #GThreadPool when * you need to distribute work to a set of worker threads instead of * using #GAsyncQueue manually. #GThreadPool uses a GAsyncQueue * internally. */ /** * GAsyncQueue: * * The GAsyncQueue struct is an opaque data structure which represents * an asynchronous queue. It should only be accessed through the * g_async_queue_* functions. */ struct _GAsyncQueue { GMutex mutex; GCond cond; GQueue queue; GDestroyNotify item_free_func; guint waiting_threads; gint ref_count; }; typedef struct { GCompareDataFunc func; gpointer user_data; } SortData; /** * g_async_queue_new: * * Creates a new asynchronous queue. * * Return value: a new #GAsyncQueue. Free with g_async_queue_unref() */ GAsyncQueue * g_async_queue_new (void) { return g_async_queue_new_full (NULL); } /** * g_async_queue_new_full: * @item_free_func: function to free queue elements * * Creates a new asynchronous queue and sets up a destroy notify * function that is used to free any remaining queue items when * the queue is destroyed after the final unref. * * Return value: a new #GAsyncQueue. Free with g_async_queue_unref() * * Since: 2.16 */ GAsyncQueue * g_async_queue_new_full (GDestroyNotify item_free_func) { GAsyncQueue *queue; queue = g_new (GAsyncQueue, 1); g_mutex_init (&queue->mutex); g_cond_init (&queue->cond); g_queue_init (&queue->queue); queue->waiting_threads = 0; queue->ref_count = 1; queue->item_free_func = item_free_func; return queue; } /** * g_async_queue_ref: * @queue: a #GAsyncQueue * * Increases the reference count of the asynchronous @queue by 1. * You do not need to hold the lock to call this function. * * Returns: the @queue that was passed in (since 2.6) */ GAsyncQueue * g_async_queue_ref (GAsyncQueue *queue) { g_return_val_if_fail (queue, NULL); g_atomic_int_inc (&queue->ref_count); return queue; } /** * g_async_queue_ref_unlocked: * @queue: a #GAsyncQueue * * Increases the reference count of the asynchronous @queue by 1. * * Deprecated: 2.8: Reference counting is done atomically. * so g_async_queue_ref() can be used regardless of the @queue's * lock. */ void g_async_queue_ref_unlocked (GAsyncQueue *queue) { g_return_if_fail (queue); g_atomic_int_inc (&queue->ref_count); } /** * g_async_queue_unref_and_unlock: * @queue: a #GAsyncQueue * * Decreases the reference count of the asynchronous @queue by 1 * and releases the lock. This function must be called while holding * the @queue's lock. If the reference count went to 0, the @queue * will be destroyed and the memory allocated will be freed. * * Deprecated: 2.8: Reference counting is done atomically. * so g_async_queue_unref() can be used regardless of the @queue's * lock. */ void g_async_queue_unref_and_unlock (GAsyncQueue *queue) { g_return_if_fail (queue); g_mutex_unlock (&queue->mutex); g_async_queue_unref (queue); } /** * g_async_queue_unref: * @queue: a #GAsyncQueue. * * Decreases the reference count of the asynchronous @queue by 1. * * If the reference count went to 0, the @queue will be destroyed * and the memory allocated will be freed. So you are not allowed * to use the @queue afterwards, as it might have disappeared. * You do not need to hold the lock to call this function. */ void g_async_queue_unref (GAsyncQueue *queue) { g_return_if_fail (queue); if (g_atomic_int_dec_and_test (&queue->ref_count)) { g_return_if_fail (queue->waiting_threads == 0); g_mutex_clear (&queue->mutex); g_cond_clear (&queue->cond); if (queue->item_free_func) g_queue_foreach (&queue->queue, (GFunc) queue->item_free_func, NULL); g_queue_clear (&queue->queue); g_free (queue); } } /** * g_async_queue_lock: * @queue: a #GAsyncQueue * * Acquires the @queue's lock. If another thread is already * holding the lock, this call will block until the lock * becomes available. * * Call g_async_queue_unlock() to drop the lock again. * * While holding the lock, you can only call the * g_async_queue_*_unlocked() functions * on @queue. Otherwise, deadlock may occur. */ void g_async_queue_lock (GAsyncQueue *queue) { g_return_if_fail (queue); g_mutex_lock (&queue->mutex); } /** * g_async_queue_unlock: * @queue: a #GAsyncQueue * * Releases the queue's lock. * * Calling this function when you have not acquired * the with g_async_queue_lock() leads to undefined * behaviour. */ void g_async_queue_unlock (GAsyncQueue *queue) { g_return_if_fail (queue); g_mutex_unlock (&queue->mutex); } /** * g_async_queue_push: * @queue: a #GAsyncQueue * @data: @data to push into the @queue * * Pushes the @data into the @queue. @data must not be %NULL. */ void g_async_queue_push (GAsyncQueue *queue, gpointer data) { g_return_if_fail (queue); g_return_if_fail (data); g_mutex_lock (&queue->mutex); g_async_queue_push_unlocked (queue, data); g_mutex_unlock (&queue->mutex); } /** * g_async_queue_push_unlocked: * @queue: a #GAsyncQueue * @data: @data to push into the @queue * * Pushes the @data into the @queue. @data must not be %NULL. * * This function must be called while holding the @queue's lock. */ void g_async_queue_push_unlocked (GAsyncQueue *queue, gpointer data) { g_return_if_fail (queue); g_return_if_fail (data); g_queue_push_head (&queue->queue, data); if (queue->waiting_threads > 0) g_cond_signal (&queue->cond); } /** * g_async_queue_push_sorted: * @queue: a #GAsyncQueue * @data: the @data to push into the @queue * @func: the #GCompareDataFunc is used to sort @queue * @user_data: user data passed to @func. * * Inserts @data into @queue using @func to determine the new * position. * * This function requires that the @queue is sorted before pushing on * new elements, see g_async_queue_sort(). * * This function will lock @queue before it sorts the queue and unlock * it when it is finished. * * For an example of @func see g_async_queue_sort(). * * Since: 2.10 */ void g_async_queue_push_sorted (GAsyncQueue *queue, gpointer data, GCompareDataFunc func, gpointer user_data) { g_return_if_fail (queue != NULL); g_mutex_lock (&queue->mutex); g_async_queue_push_sorted_unlocked (queue, data, func, user_data); g_mutex_unlock (&queue->mutex); } static gint g_async_queue_invert_compare (gpointer v1, gpointer v2, SortData *sd) { return -sd->func (v1, v2, sd->user_data); } /** * g_async_queue_push_sorted_unlocked: * @queue: a #GAsyncQueue * @data: the @data to push into the @queue * @func: the #GCompareDataFunc is used to sort @queue * @user_data: user data passed to @func. * * Inserts @data into @queue using @func to determine the new * position. * * The sort function @func is passed two elements of the @queue. * It should return 0 if they are equal, a negative value if the * first element should be higher in the @queue or a positive value * if the first element should be lower in the @queue than the second * element. * * This function requires that the @queue is sorted before pushing on * new elements, see g_async_queue_sort(). * * This function must be called while holding the @queue's lock. * * For an example of @func see g_async_queue_sort(). * * Since: 2.10 */ void g_async_queue_push_sorted_unlocked (GAsyncQueue *queue, gpointer data, GCompareDataFunc func, gpointer user_data) { SortData sd; g_return_if_fail (queue != NULL); sd.func = func; sd.user_data = user_data; g_queue_insert_sorted (&queue->queue, data, (GCompareDataFunc)g_async_queue_invert_compare, &sd); if (queue->waiting_threads > 0) g_cond_signal (&queue->cond); } static gpointer g_async_queue_pop_intern_unlocked (GAsyncQueue *queue, gboolean wait, gint64 end_time) { gpointer retval; if (!g_queue_peek_tail_link (&queue->queue) && wait) { queue->waiting_threads++; while (!g_queue_peek_tail_link (&queue->queue)) { if (end_time == -1) g_cond_wait (&queue->cond, &queue->mutex); else { if (!g_cond_wait_until (&queue->cond, &queue->mutex, end_time)) break; } } queue->waiting_threads--; } retval = g_queue_pop_tail (&queue->queue); g_assert (retval || !wait || end_time > 0); return retval; } /** * g_async_queue_pop: * @queue: a #GAsyncQueue * * Pops data from the @queue. If @queue is empty, this function * blocks until data becomes available. * * Return value: data from the queue */ gpointer g_async_queue_pop (GAsyncQueue *queue) { gpointer retval; g_return_val_if_fail (queue, NULL); g_mutex_lock (&queue->mutex); retval = g_async_queue_pop_intern_unlocked (queue, TRUE, -1); g_mutex_unlock (&queue->mutex); return retval; } /** * g_async_queue_pop_unlocked: * @queue: a #GAsyncQueue * * Pops data from the @queue. If @queue is empty, this function * blocks until data becomes available. * * This function must be called while holding the @queue's lock. * * Return value: data from the queue. */ gpointer g_async_queue_pop_unlocked (GAsyncQueue *queue) { g_return_val_if_fail (queue, NULL); return g_async_queue_pop_intern_unlocked (queue, TRUE, -1); } /** * g_async_queue_try_pop: * @queue: a #GAsyncQueue * * Tries to pop data from the @queue. If no data is available, * %NULL is returned. * * Return value: data from the queue or %NULL, when no data is * available immediately. */ gpointer g_async_queue_try_pop (GAsyncQueue *queue) { gpointer retval; g_return_val_if_fail (queue, NULL); g_mutex_lock (&queue->mutex); retval = g_async_queue_pop_intern_unlocked (queue, FALSE, -1); g_mutex_unlock (&queue->mutex); return retval; } /** * g_async_queue_try_pop_unlocked: * @queue: a #GAsyncQueue * * Tries to pop data from the @queue. If no data is available, * %NULL is returned. * * This function must be called while holding the @queue's lock. * * Return value: data from the queue or %NULL, when no data is * available immediately. */ gpointer g_async_queue_try_pop_unlocked (GAsyncQueue *queue) { g_return_val_if_fail (queue, NULL); return g_async_queue_pop_intern_unlocked (queue, FALSE, -1); } /** * g_async_queue_timeout_pop: * @queue: a #GAsyncQueue * @timeout: the number of microseconds to wait * * Pops data from the @queue. If the queue is empty, blocks for * @timeout microseconds, or until data becomes available. * * If no data is received before the timeout, %NULL is returned. * * Return value: data from the queue or %NULL, when no data is * received before the timeout. */ gpointer g_async_queue_timeout_pop (GAsyncQueue *queue, guint64 timeout) { gint64 end_time = g_get_monotonic_time () + timeout; gpointer retval; g_mutex_lock (&queue->mutex); retval = g_async_queue_pop_intern_unlocked (queue, TRUE, end_time); g_mutex_unlock (&queue->mutex); return retval; } /** * g_async_queue_timeout_pop_unlocked: * @queue: a #GAsyncQueue * @timeout: the number of microseconds to wait * * Pops data from the @queue. If the queue is empty, blocks for * @timeout microseconds, or until data becomes available. * * If no data is received before the timeout, %NULL is returned. * * This function must be called while holding the @queue's lock. * * Return value: data from the queue or %NULL, when no data is * received before the timeout. */ gpointer g_async_queue_timeout_pop_unlocked (GAsyncQueue *queue, guint64 timeout) { gint64 end_time = g_get_monotonic_time () + timeout; return g_async_queue_pop_intern_unlocked (queue, TRUE, end_time); } /** * g_async_queue_timed_pop: * @queue: a #GAsyncQueue * @end_time: a #GTimeVal, determining the final time * * Pops data from the @queue. If the queue is empty, blocks until * @end_time or until data becomes available. * * If no data is received before @end_time, %NULL is returned. * * To easily calculate @end_time, a combination of g_get_current_time() * and g_time_val_add() can be used. * * Return value: data from the queue or %NULL, when no data is * received before @end_time. * * Deprecated: use g_async_queue_timeout_pop(). */ gpointer g_async_queue_timed_pop (GAsyncQueue *queue, GTimeVal *end_time) { gint64 m_end_time; gpointer retval; g_return_val_if_fail (queue, NULL); if (end_time != NULL) { m_end_time = g_get_monotonic_time () + ((gint64)end_time->tv_sec * G_USEC_PER_SEC + end_time->tv_usec - g_get_real_time ()); } else m_end_time = -1; g_mutex_lock (&queue->mutex); retval = g_async_queue_pop_intern_unlocked (queue, TRUE, m_end_time); g_mutex_unlock (&queue->mutex); return retval; } /** * g_async_queue_timed_pop_unlocked: * @queue: a #GAsyncQueue * @end_time: a #GTimeVal, determining the final time * * Pops data from the @queue. If the queue is empty, blocks until * @end_time or until data becomes available. * * If no data is received before @end_time, %NULL is returned. * * To easily calculate @end_time, a combination of g_get_current_time() * and g_time_val_add() can be used. * * This function must be called while holding the @queue's lock. * * Return value: data from the queue or %NULL, when no data is * received before @end_time. * * Deprecated: use g_async_queue_timeout_pop_unlocked(). */ gpointer g_async_queue_timed_pop_unlocked (GAsyncQueue *queue, GTimeVal *end_time) { gint64 m_end_time; g_return_val_if_fail (queue, NULL); if (end_time != NULL) { m_end_time = g_get_monotonic_time () + (end_time->tv_sec * G_USEC_PER_SEC + end_time->tv_usec - g_get_real_time ()); } else m_end_time = -1; return g_async_queue_pop_intern_unlocked (queue, TRUE, m_end_time); } /** * g_async_queue_length: * @queue: a #GAsyncQueue. * * Returns the length of the queue. * * Actually this function returns the number of data items in * the queue minus the number of waiting threads, so a negative * value means waiting threads, and a positive value means available * entries in the @queue. A return value of 0 could mean n entries * in the queue and n threads waiting. This can happen due to locking * of the queue or due to scheduling. * * Return value: the length of the @queue */ gint g_async_queue_length (GAsyncQueue *queue) { gint retval; g_return_val_if_fail (queue, 0); g_mutex_lock (&queue->mutex); retval = queue->queue.length - queue->waiting_threads; g_mutex_unlock (&queue->mutex); return retval; } /** * g_async_queue_length_unlocked: * @queue: a #GAsyncQueue * * Returns the length of the queue. * * Actually this function returns the number of data items in * the queue minus the number of waiting threads, so a negative * value means waiting threads, and a positive value means available * entries in the @queue. A return value of 0 could mean n entries * in the queue and n threads waiting. This can happen due to locking * of the queue or due to scheduling. * * This function must be called while holding the @queue's lock. * * Return value: the length of the @queue. */ gint g_async_queue_length_unlocked (GAsyncQueue *queue) { g_return_val_if_fail (queue, 0); return queue->queue.length - queue->waiting_threads; } /** * g_async_queue_sort: * @queue: a #GAsyncQueue * @func: the #GCompareDataFunc is used to sort @queue * @user_data: user data passed to @func * * Sorts @queue using @func. * * The sort function @func is passed two elements of the @queue. * It should return 0 if they are equal, a negative value if the * first element should be higher in the @queue or a positive value * if the first element should be lower in the @queue than the second * element. * * This function will lock @queue before it sorts the queue and unlock * it when it is finished. * * If you were sorting a list of priority numbers to make sure the * lowest priority would be at the top of the queue, you could use: * |[ * gint32 id1; * gint32 id2; * * id1 = GPOINTER_TO_INT (element1); * id2 = GPOINTER_TO_INT (element2); * * return (id1 > id2 ? +1 : id1 == id2 ? 0 : -1); * ]| * * Since: 2.10 */ void g_async_queue_sort (GAsyncQueue *queue, GCompareDataFunc func, gpointer user_data) { g_return_if_fail (queue != NULL); g_return_if_fail (func != NULL); g_mutex_lock (&queue->mutex); g_async_queue_sort_unlocked (queue, func, user_data); g_mutex_unlock (&queue->mutex); } /** * g_async_queue_sort_unlocked: * @queue: a #GAsyncQueue * @func: the #GCompareDataFunc is used to sort @queue * @user_data: user data passed to @func * * Sorts @queue using @func. * * The sort function @func is passed two elements of the @queue. * It should return 0 if they are equal, a negative value if the * first element should be higher in the @queue or a positive value * if the first element should be lower in the @queue than the second * element. * * This function must be called while holding the @queue's lock. * * Since: 2.10 */ void g_async_queue_sort_unlocked (GAsyncQueue *queue, GCompareDataFunc func, gpointer user_data) { SortData sd; g_return_if_fail (queue != NULL); g_return_if_fail (func != NULL); sd.func = func; sd.user_data = user_data; g_queue_sort (&queue->queue, (GCompareDataFunc)g_async_queue_invert_compare, &sd); } /* * Private API */ GMutex * _g_async_queue_get_mutex (GAsyncQueue *queue) { g_return_val_if_fail (queue, NULL); return &queue->mutex; } pkg-config-0.29.1/glib/glib/grand.h0000664000175000017500000000626412651243552013665 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the GLib Team and others 1997-2000. See the AUTHORS * file for a list of people on the GLib Team. See the ChangeLog * files for a list of changes. These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/. */ #ifndef __G_RAND_H__ #define __G_RAND_H__ #if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) #error "Only can be included directly." #endif #include G_BEGIN_DECLS typedef struct _GRand GRand; /* GRand - a good and fast random number generator: Mersenne Twister * see http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html for more info. * The range functions return a value in the intervall [begin, end). * int -> [0..2^32-1] * int_range -> [begin..end-1] * double -> [0..1) * double_range -> [begin..end) */ 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); G_END_DECLS #endif /* __G_RAND_H__ */ pkg-config-0.29.1/glib/glib/gquark.c0000664000175000017500000002265112651243552014055 00000000000000/* 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 #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 Datasets and Keyed Data Lists. * * 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 always 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; } pkg-config-0.29.1/glib/glib/gthread.c0000664000175000017500000007724712651243552014214 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * gthread.c: MT safety related functions * Copyright 1998 Sebastian Wilhelmi; University of Karlsruhe * Owen Taylor * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* Prelude {{{1 ----------------------------------------------------------- */ /* * 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 */ /* implement gthread.h's inline functions */ #define G_IMPLEMENT_INLINES 1 #define __G_THREAD_C__ #include "config.h" #include "gthread.h" #include "gthreadprivate.h" #include #ifdef HAVE_UNISTD_H #include #endif #ifndef G_OS_WIN32 #include #include #else #include #endif /* G_OS_WIN32 */ #include "gslice.h" #include "gstrfuncs.h" #include "gtestutils.h" /** * SECTION:threads * @title: Threads * @short_description: portable support for threads, mutexes, locks, * conditions and thread private data * @see_also: #GThreadPool, #GAsyncQueue * * Threads act almost like processes, but unlike processes all threads * of one process share the same memory. This is good, as it provides * easy communication between the involved threads via this shared * memory, and it is bad, because strange things (so called * "Heisenbugs") might happen if the program is not carefully designed. * In particular, due to the concurrent nature of threads, no * assumptions on the order of execution of code running in different * threads can be made, unless order is explicitly forced by the * programmer through synchronization primitives. * * The aim of the thread-related functions in GLib is to provide a * portable means for writing multi-threaded software. There are * primitives for mutexes to protect the access to portions of memory * (#GMutex, #GRecMutex and #GRWLock). There is a facility to use * individual bits for locks (g_bit_lock()). There are primitives * for condition variables to allow synchronization of threads (#GCond). * There are primitives for thread-private data - data that every * thread has a private instance of (#GPrivate). There are facilities * for one-time initialization (#GOnce, g_once_init_enter()). Finally, * there are primitives to create and manage threads (#GThread). * * The GLib threading system used to be initialized with g_thread_init(). * This is no longer necessary. Since version 2.32, the GLib threading * system is automatically initialized at the start of your program, * and all thread-creation functions and synchronization primitives * are available right away. * * Note that it is not safe to assume that your program has no threads * even if you don't call g_thread_new() yourself. GLib and GIO can * and will create threads for their own purposes in some cases, such * as when using g_unix_signal_source_new() or when using GDBus. * * Originally, UNIX did not have threads, and therefore some traditional * UNIX APIs are problematic in threaded programs. Some notable examples * are * * * C library functions that return data in statically allocated * buffers, such as strtok() or strerror(). For many of these, * there are thread-safe variants with a _r suffix, or you can * look at corresponding GLib APIs (like g_strsplit() or g_strerror()). * * * setenv() and unsetenv() manipulate the process environment in * a not thread-safe way, and may interfere with getenv() calls * in other threads. Note that getenv() calls may be * hidden behind other APIs. For example, GNU gettext() * calls getenv() under the covers. In general, it is best to treat * the environment as readonly. If you absolutely have to modify the * environment, do it early in main(), when no other threads are around yet. * * * setlocale() changes the locale for the entire process, affecting * all threads. Temporary changes to the locale are often made to * change the behavior of string scanning or formatting functions * like scanf() or printf(). GLib offers a number of string APIs * (like g_ascii_formatd() or g_ascii_strtod()) that can often be * used as an alternative. Or you can use the uselocale() function * to change the locale only for the current thread. * * * fork() only takes the calling thread into the child's copy of the * process image. If other threads were executing in critical * sections they could have left mutexes locked which could easily * cause deadlocks in the new child. For this reason, you should * call exit() or exec() as soon as possible in the child and only * make signal-safe library calls before that. * * * daemon() uses fork() in a way contrary to what is described * above. It should not be used with GLib programs. * * * * GLib itself is internally completely thread-safe (all global data is * automatically locked), but individual data structure instances are * not automatically locked for performance reasons. For example, * you must coordinate accesses to the same #GHashTable from multiple * threads. The two notable exceptions from this rule are #GMainLoop * and #GAsyncQueue, which are thread-safe and * need no further application-level locking to be accessed from * multiple threads. Most refcounting functions such as g_object_ref() * are also thread-safe. */ /* G_LOCK Documentation {{{1 ---------------------------------------------- */ /** * G_LOCK_DEFINE: * @name: the name of the lock * * The G_LOCK_* macros provide a convenient interface to #GMutex. * #G_LOCK_DEFINE defines a lock. It can appear in any place where * variable definitions may appear in programs, i.e. in the first block * of a function or outside of functions. The @name parameter will be * mangled to get the name of the #GMutex. This means that you * can use names of existing variables as the parameter - e.g. the name * of the variable you intend to protect with the lock. Look at our * give_me_next_number() example using the * G_LOCK_* macros: * * * Using the <literal>G_LOCK_*</literal> convenience macros * * G_LOCK_DEFINE (current_number); * * int * give_me_next_number (void) * { * static int current_number = 0; * int ret_val; * * G_LOCK (current_number); * ret_val = current_number = calc_next_number (current_number); * G_UNLOCK (current_number); * * return ret_val; * } * * */ /** * G_LOCK_DEFINE_STATIC: * @name: the name of the lock * * This works like #G_LOCK_DEFINE, but it creates a static object. */ /** * G_LOCK_EXTERN: * @name: the name of the lock * * This declares a lock, that is defined with #G_LOCK_DEFINE in another * module. */ /** * G_LOCK: * @name: the name of the lock * * Works like g_mutex_lock(), but for a lock defined with * #G_LOCK_DEFINE. */ /** * G_TRYLOCK: * @name: the name of the lock * * Works like g_mutex_trylock(), but for a lock defined with * #G_LOCK_DEFINE. * * Returns: %TRUE, if the lock could be locked. */ /** * G_UNLOCK: * @name: the name of the lock * * Works like g_mutex_unlock(), but for a lock defined with * #G_LOCK_DEFINE. */ /* GMutex Documentation {{{1 ------------------------------------------ */ /** * GMutex: * * The #GMutex struct is an opaque data structure to represent a mutex * (mutual exclusion). It can be used to protect data against shared * access. Take for example the following function: * * * A function which will not work in a threaded environment * * int * give_me_next_number (void) * { * static int current_number = 0; * * /* now do a very complicated calculation to calculate the new * * number, this might for example be a random number generator * */ * current_number = calc_next_number (current_number); * * return current_number; * } * * * * It is easy to see that this won't work in a multi-threaded * application. There current_number must be protected against shared * access. A #GMutex can be used as a solution to this problem: * * * Using GMutex to protected a shared variable * * int * give_me_next_number (void) * { * static GMutex mutex; * static int current_number = 0; * int ret_val; * * g_mutex_lock (&mutex); * ret_val = current_number = calc_next_number (current_number); * g_mutex_unlock (&mutex); * * return ret_val; * } * * * * Notice that the #GMutex is not initialised to any particular value. * Its placement in static storage ensures that it will be initialised * to all-zeros, which is appropriate. * * If a #GMutex is placed in other contexts (eg: embedded in a struct) * then it must be explicitly initialised using g_mutex_init(). * * A #GMutex should only be accessed via g_mutex_ * functions. */ /* GRecMutex Documentation {{{1 -------------------------------------- */ /** * GRecMutex: * * The GRecMutex struct is an opaque data structure to represent a * recursive mutex. It is similar to a #GMutex with the difference * that it is possible to lock a GRecMutex multiple times in the same * thread without deadlock. When doing so, care has to be taken to * unlock the recursive mutex as often as it has been locked. * * If a #GRecMutex is allocated in static storage then it can be used * without initialisation. Otherwise, you should call * g_rec_mutex_init() on it and g_rec_mutex_clear() when done. * * A GRecMutex should only be accessed with the * g_rec_mutex_ functions. * * Since: 2.32 */ /* GRWLock Documentation {{{1 ---------------------------------------- */ /** * GRWLock: * * The GRWLock struct is an opaque data structure to represent a * reader-writer lock. It is similar to a #GMutex in that it allows * multiple threads to coordinate access to a shared resource. * * The difference to a mutex is that a reader-writer lock discriminates * between read-only ('reader') and full ('writer') access. While only * one thread at a time is allowed write access (by holding the 'writer' * lock via g_rw_lock_writer_lock()), multiple threads can gain * simultaneous read-only access (by holding the 'reader' lock via * g_rw_lock_reader_lock()). * * * An array with access functions * * GRWLock lock; * GPtrArray *array; * * gpointer * my_array_get (guint index) * { * gpointer retval = NULL; * * if (!array) * return NULL; * * g_rw_lock_reader_lock (&lock); * if (index < array->len) * retval = g_ptr_array_index (array, index); * g_rw_lock_reader_unlock (&lock); * * return retval; * } * * void * my_array_set (guint index, gpointer data) * { * g_rw_lock_writer_lock (&lock); * * if (!array) * array = g_ptr_array_new (); * * if (index >= array->len) * g_ptr_array_set_size (array, index+1); * g_ptr_array_index (array, index) = data; * * g_rw_lock_writer_unlock (&lock); * } * * * This example shows an array which can be accessed by many readers * (the my_array_get() function) simultaneously, * whereas the writers (the my_array_set() * function) will only be allowed once at a time and only if no readers * currently access the array. This is because of the potentially * dangerous resizing of the array. Using these functions is fully * multi-thread safe now. * * * * If a #GRWLock is allocated in static storage then it can be used * without initialisation. Otherwise, you should call * g_rw_lock_init() on it and g_rw_lock_clear() when done. * * A GRWLock should only be accessed with the * g_rw_lock_ functions. * * Since: 2.32 */ /* GCond Documentation {{{1 ------------------------------------------ */ /** * GCond: * * The #GCond struct is an opaque data structure that represents a * condition. Threads can block on a #GCond if they find a certain * condition to be false. If other threads change the state of this * condition they signal the #GCond, and that causes the waiting * threads to be woken up. * * Consider the following example of a shared variable. One or more * threads can wait for data to be published to the variable and when * another thread publishes the data, it can signal one of the waiting * threads to wake up to collect the data. * * * * Using GCond to block a thread until a condition is satisfied * * * gpointer current_data = NULL; * GMutex data_mutex; * GCond data_cond; * * void * push_data (gpointer data) * { * g_mutex_lock (&data_mutex); * current_data = data; * g_cond_signal (&data_cond); * g_mutex_unlock (&data_mutex); * } * * gpointer * pop_data (void) * { * gpointer data; * * g_mutex_lock (&data_mutex); * while (!current_data) * g_cond_wait (&data_cond, &data_mutex); * data = current_data; * current_data = NULL; * g_mutex_unlock (&data_mutex); * * return data; * } * * * * Whenever a thread calls pop_data() now, it will wait until * current_data is non-%NULL, i.e. until some other thread * has called push_data(). * * The example shows that use of a condition variable must always be * paired with a mutex. Without the use of a mutex, there would be a * race between the check of current_data by the * while loop in pop_data and waiting. * Specifically, another thread could set pop_data * after the check, and signal the cond (with nobody waiting on it) * before the first thread goes to sleep. #GCond is specifically useful * for its ability to release the mutex and go to sleep atomically. * * It is also important to use the g_cond_wait() and g_cond_wait_until() * functions only inside a loop which checks for the condition to be * true. See g_cond_wait() for an explanation of why the condition may * not be true even after it returns. * * If a #GCond is allocated in static storage then it can be used * without initialisation. Otherwise, you should call g_cond_init() on * it and g_cond_clear() when done. * * A #GCond should only be accessed via the g_cond_ * functions. */ /* GThread Documentation {{{1 ---------------------------------------- */ /** * GThread: * * The #GThread struct represents a running thread. This struct * is returned by g_thread_new() or g_thread_try_new(). You can * obtain the #GThread struct representing the current thead by * calling g_thread_self(). * * GThread is refcounted, see g_thread_ref() and g_thread_unref(). * The thread represented by it holds a reference while it is running, * and g_thread_join() consumes the reference that it is given, so * it is normally not necessary to manage GThread references * explicitly. * * The structure is opaque -- none of its fields may be directly * accessed. */ /** * GThreadFunc: * @data: data passed to the thread * * Specifies the type of the @func functions passed to g_thread_new() * or g_thread_try_new(). * * Returns: the return value of the thread */ /** * g_thread_supported: * * This macro returns %TRUE if the thread system is initialized, * and %FALSE if it is not. * * For language bindings, g_thread_get_initialized() provides * the same functionality as a function. * * Returns: %TRUE, if the thread system is initialized */ /* GThreadError {{{1 ------------------------------------------------------- */ /** * GThreadError: * @G_THREAD_ERROR_AGAIN: a thread couldn't be created due to resource * shortage. Try again later. * * Possible errors of thread related functions. **/ /** * G_THREAD_ERROR: * * The error domain of the GLib thread subsystem. **/ G_DEFINE_QUARK (g_thread_error, g_thread_error) /* Local Data {{{1 -------------------------------------------------------- */ static GMutex g_once_mutex; static GCond g_once_cond; static GSList *g_once_init_list = NULL; static void g_thread_cleanup (gpointer data); static GPrivate g_thread_specific_private = G_PRIVATE_INIT (g_thread_cleanup); G_LOCK_DEFINE_STATIC (g_thread_new); /* GOnce {{{1 ------------------------------------------------------------- */ /** * GOnce: * @status: the status of the #GOnce * @retval: the value returned by the call to the function, if @status * is %G_ONCE_STATUS_READY * * A #GOnce struct controls a one-time initialization function. Any * one-time initialization function must have its own unique #GOnce * struct. * * Since: 2.4 */ /** * G_ONCE_INIT: * * A #GOnce must be initialized with this macro before it can be used. * * |[ * GOnce my_once = G_ONCE_INIT; * ]| * * Since: 2.4 */ /** * GOnceStatus: * @G_ONCE_STATUS_NOTCALLED: the function has not been called yet. * @G_ONCE_STATUS_PROGRESS: the function call is currently in progress. * @G_ONCE_STATUS_READY: the function has been called. * * The possible statuses of a one-time initialization function * controlled by a #GOnce struct. * * Since: 2.4 */ /** * g_once: * @once: a #GOnce structure * @func: the #GThreadFunc function associated to @once. This function * is called only once, regardless of the number of times it and * its associated #GOnce struct are passed to g_once(). * @arg: data to be passed to @func * * The first call to this routine by a process with a given #GOnce * struct calls @func with the given argument. Thereafter, subsequent * calls to g_once() with the same #GOnce struct do not call @func * again, but return the stored result of the first call. On return * from g_once(), the status of @once will be %G_ONCE_STATUS_READY. * * For example, a mutex or a thread-specific data key must be created * exactly once. In a threaded environment, calling g_once() ensures * that the initialization is serialized across multiple threads. * * Calling g_once() recursively on the same #GOnce struct in * @func will lead to a deadlock. * * |[ * gpointer * get_debug_flags (void) * { * static GOnce my_once = G_ONCE_INIT; * * g_once (&my_once, parse_debug_flags, NULL); * * return my_once.retval; * } * ]| * * Since: 2.4 */ gpointer g_once_impl (GOnce *once, GThreadFunc func, gpointer arg) { g_mutex_lock (&g_once_mutex); while (once->status == G_ONCE_STATUS_PROGRESS) g_cond_wait (&g_once_cond, &g_once_mutex); if (once->status != G_ONCE_STATUS_READY) { once->status = G_ONCE_STATUS_PROGRESS; g_mutex_unlock (&g_once_mutex); once->retval = func (arg); g_mutex_lock (&g_once_mutex); once->status = G_ONCE_STATUS_READY; g_cond_broadcast (&g_once_cond); } g_mutex_unlock (&g_once_mutex); return once->retval; } /** * g_once_init_enter: * @location: location of a static initializable variable containing 0 * * Function to be called when starting a critical initialization * section. The argument @location must point to a static * 0-initialized variable that will be set to a value other than 0 at * the end of the initialization section. In combination with * g_once_init_leave() and the unique address @value_location, it can * be ensured that an initialization section will be executed only once * during a program's life time, and that concurrent threads are * blocked until initialization completed. To be used in constructs * like this: * * |[ * static gsize initialization_value = 0; * * if (g_once_init_enter (&initialization_value)) * { * gsize setup_value = 42; /** initialization code here **/ * * g_once_init_leave (&initialization_value, setup_value); * } * * /** use initialization_value here **/ * ]| * * Returns: %TRUE if the initialization section should be entered, * %FALSE and blocks otherwise * * Since: 2.14 */ gboolean (g_once_init_enter) (volatile void *location) { volatile gsize *value_location = location; gboolean need_init = FALSE; g_mutex_lock (&g_once_mutex); if (g_atomic_pointer_get (value_location) == NULL) { if (!g_slist_find (g_once_init_list, (void*) value_location)) { need_init = TRUE; g_once_init_list = g_slist_prepend (g_once_init_list, (void*) value_location); } else do g_cond_wait (&g_once_cond, &g_once_mutex); while (g_slist_find (g_once_init_list, (void*) value_location)); } g_mutex_unlock (&g_once_mutex); return need_init; } /** * g_once_init_leave: * @location: location of a static initializable variable containing 0 * @result: new non-0 value for *@value_location * * Counterpart to g_once_init_enter(). Expects a location of a static * 0-initialized initialization variable, and an initialization value * other than 0. Sets the variable to the initialization value, and * releases concurrent threads blocking in g_once_init_enter() on this * initialization variable. * * Since: 2.14 */ void (g_once_init_leave) (volatile void *location, gsize result) { volatile gsize *value_location = location; g_return_if_fail (g_atomic_pointer_get (value_location) == NULL); g_return_if_fail (result != 0); g_return_if_fail (g_once_init_list != NULL); g_atomic_pointer_set (value_location, result); g_mutex_lock (&g_once_mutex); g_once_init_list = g_slist_remove (g_once_init_list, (void*) value_location); g_cond_broadcast (&g_once_cond); g_mutex_unlock (&g_once_mutex); } /* GThread {{{1 -------------------------------------------------------- */ /** * g_thread_ref: * @thread: a #GThread * * Increase the reference count on @thread. * * Returns: a new reference to @thread * * Since: 2.32 */ GThread * g_thread_ref (GThread *thread) { GRealThread *real = (GRealThread *) thread; g_atomic_int_inc (&real->ref_count); return thread; } /** * g_thread_unref: * @thread: a #GThread * * Decrease the reference count on @thread, possibly freeing all * resources associated with it. * * Note that each thread holds a reference to its #GThread while * it is running, so it is safe to drop your own reference to it * if you don't need it anymore. * * Since: 2.32 */ void g_thread_unref (GThread *thread) { GRealThread *real = (GRealThread *) thread; if (g_atomic_int_dec_and_test (&real->ref_count)) { if (real->ours) g_system_thread_free (real); else g_slice_free (GRealThread, real); } } static void g_thread_cleanup (gpointer data) { g_thread_unref (data); } gpointer g_thread_proxy (gpointer data) { GRealThread* thread = data; g_assert (data); /* This has to happen before G_LOCK, as that might call g_thread_self */ g_private_set (&g_thread_specific_private, data); /* The lock makes sure that g_thread_new_internal() has a chance to * setup 'func' and 'data' before we make the call. */ G_LOCK (g_thread_new); G_UNLOCK (g_thread_new); if (thread->name) { g_system_thread_set_name (thread->name); g_free (thread->name); thread->name = NULL; } thread->retval = thread->thread.func (thread->thread.data); return NULL; } /** * g_thread_new: * @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 * * This function creates a new thread. The new thread starts by invoking * @func with the argument data. The thread will run until @func returns * or until g_thread_exit() is called from the new thread. The return value * of @func becomes the return value of the thread, which can be obtained * 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 * g_thread_try_new() if you want to attempt to deal with failures. * * To free the struct returned by this function, use g_thread_unref(). * Note that g_thread_join() implicitly unrefs the #GThread as well. * * Returns: the new #GThread * * Since: 2.32 */ GThread * g_thread_new (const gchar *name, GThreadFunc func, gpointer data) { GError *error = NULL; GThread *thread; thread = g_thread_new_internal (name, g_thread_proxy, func, data, 0, &error); if G_UNLIKELY (thread == NULL) g_error ("creating thread '%s': %s", name ? name : "", error->message); return thread; } /** * g_thread_try_new: * @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 * * This function is the same as g_thread_new() except that * it allows for the possibility of failure. * * If a thread can not be created (due to resource limits), * @error is set and %NULL is returned. * * Returns: the new #GThread, or %NULL if an error occurred * * Since: 2.32 */ GThread * g_thread_try_new (const gchar *name, GThreadFunc func, gpointer data, GError **error) { return g_thread_new_internal (name, g_thread_proxy, func, data, 0, error); } GThread * g_thread_new_internal (const gchar *name, GThreadFunc proxy, GThreadFunc func, gpointer data, gsize stack_size, GError **error) { GRealThread *thread; g_return_val_if_fail (func != NULL, NULL); G_LOCK (g_thread_new); thread = g_system_thread_new (proxy, stack_size, error); if (thread) { thread->ref_count = 2; thread->ours = TRUE; thread->thread.joinable = TRUE; thread->thread.func = func; thread->thread.data = data; thread->name = g_strdup (name); } G_UNLOCK (g_thread_new); return (GThread*) thread; } /** * g_thread_exit: * @retval: the return value of this thread * * Terminates the current thread. * * If another thread is waiting for us using g_thread_join() then the * waiting thread will be woken up and get @retval as the return value * of g_thread_join(). * * Calling g_thread_exit (retval) is equivalent to * returning @retval from the function @func, as given to g_thread_new(). * * * You must only call g_thread_exit() from a thread that you created * yourself with g_thread_new() or related APIs. You must not call * this function from a thread created with another threading library * or or from within a #GThreadPool. * */ void g_thread_exit (gpointer retval) { GRealThread* real = (GRealThread*) g_thread_self (); if G_UNLIKELY (!real->ours) g_error ("attempt to g_thread_exit() a thread not created by GLib"); real->retval = retval; g_system_thread_exit (); } /** * g_thread_join: * @thread: a #GThread * * Waits until @thread finishes, i.e. the function @func, as * given to g_thread_new(), returns or g_thread_exit() is called. * If @thread has already terminated, then g_thread_join() * returns immediately. * * Any thread can wait for any other thread by calling g_thread_join(), * not just its 'creator'. Calling g_thread_join() from multiple threads * for the same @thread leads to undefined behaviour. * * The value returned by @func or given to g_thread_exit() is * returned by this function. * * g_thread_join() consumes the reference to the passed-in @thread. * This will usually cause the #GThread struct and associated resources * to be freed. Use g_thread_ref() to obtain an extra reference if you * want to keep the GThread alive beyond the g_thread_join() call. * * Returns: the return value of the thread */ gpointer g_thread_join (GThread *thread) { GRealThread *real = (GRealThread*) thread; gpointer retval; g_return_val_if_fail (thread, NULL); g_return_val_if_fail (real->ours, NULL); g_system_thread_wait (real); retval = real->retval; /* Just to make sure, this isn't used any more */ thread->joinable = 0; g_thread_unref (thread); return retval; } /** * g_thread_self: * * This functions returns the #GThread corresponding to the * current thread. Note that this function does not increase * the reference count of the returned struct. * * This function will return a #GThread even for threads that * were not created by GLib (i.e. those created by other threading * APIs). This may be useful for thread identification purposes * (i.e. comparisons) but you must not use GLib functions (such * as g_thread_join()) on these threads. * * Returns: the #GThread representing the current thread */ GThread* g_thread_self (void) { GRealThread* thread = g_private_get (&g_thread_specific_private); if (!thread) { /* If no thread data is available, provide and set one. * This can happen for the main thread and for threads * that are not created by GLib. */ thread = g_slice_new0 (GRealThread); thread->ref_count = 1; g_private_set (&g_thread_specific_private, thread); } 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: */ pkg-config-0.29.1/glib/glib/gmessages.c0000664000175000017500000012132612651243552014540 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the GLib Team and others 1997-2000. See the AUTHORS * file for a list of people on the GLib Team. See the ChangeLog * files for a list of changes. These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/. */ /* * MT safe */ /** * SECTION:warnings * @Title: Message Output and Debugging Functions * @Short_description: functions to output messages and help debug applications * * These functions provide support for outputting messages. * * The g_return family of macros (g_return_if_fail(), * g_return_val_if_fail(), g_return_if_reached(), g_return_val_if_reached()) * should only be used for programming errors, a typical use case is * checking for invalid parameters at the beginning of a public function. * They should not be used if you just mean "if (error) return", they * should only be used if you mean "if (bug in program) return". * The program behavior is generally considered undefined after one * of these checks fails. They are not intended for normal control * flow, only to give a perhaps-helpful warning before giving up. */ #include "config.h" #include #include #include #include #ifdef HAVE_UNISTD_H #include #endif #include #include #include #include "gmessages-private.h" #include "glib-init.h" #include "gbacktrace.h" #include "gcharset.h" #include "gconvert.h" #include "genviron.h" #include "gmem.h" #include "gprintfint.h" #include "gtestutils.h" #include "gthread.h" #include "gstrfuncs.h" #include "gstring.h" #include "gpattern.h" #ifdef G_OS_WIN32 #include /* For getpid() */ #include # define _WIN32_WINDOWS 0x0401 /* to get IsDebuggerPresent */ # include #endif /** * SECTION:messages * @title: Message Logging * @short_description: versatile support for logging messages * with different levels of importance * * These functions provide support for logging error messages * or messages used for debugging. * * There are several built-in levels of messages, defined in * #GLogLevelFlags. These can be extended with user-defined levels. */ /** * G_LOG_DOMAIN: * * Defines the log domain. * * For applications, this is typically left as the default %NULL * (or "") domain. Libraries should define this so that any messages * which they log can be differentiated from messages from other * libraries and application code. But be careful not to define * it in any public header files. * * For example, GTK+ uses this in its Makefile.am: * |[ * INCLUDES = -DG_LOG_DOMAIN=\"Gtk\" * ]| */ /** * G_LOG_FATAL_MASK: * * GLib log levels that are considered fatal by default. */ /** * GLogFunc: * @log_domain: the log domain of the message * @log_level: the log level of the message (including the * fatal and recursion flags) * @message: the message to process * @user_data: user data, set in g_log_set_handler() * * Specifies the prototype of log handler functions. */ /** * GLogLevelFlags: * @G_LOG_FLAG_RECURSION: internal flag * @G_LOG_FLAG_FATAL: internal flag * @G_LOG_LEVEL_ERROR: log level for errors, see g_error(). * This level is also used for messages produced by g_assert(). * @G_LOG_LEVEL_CRITICAL: log level for critical messages, see g_critical(). * This level is also used for messages produced by g_return_if_fail() * and g_return_val_if_fail(). * @G_LOG_LEVEL_WARNING: log level for warnings, see g_warning() * @G_LOG_LEVEL_MESSAGE: log level for messages, see g_message() * @G_LOG_LEVEL_INFO: log level for informational messages * @G_LOG_LEVEL_DEBUG: log level for debug messages, see g_debug() * @G_LOG_LEVEL_MASK: a mask including all log levels * * Flags specifying the level of log messages. * * It is possible to change how GLib treats messages of the various * levels using g_log_set_handler() and g_log_set_fatal_mask(). */ /** * g_message: * @...: format string, followed by parameters to insert * into the format string (as with printf()) * * A convenience function/macro to log a normal message. */ /** * g_warning: * @...: format string, followed by parameters to insert * into the format string (as with printf()) * * A convenience function/macro to log a warning message. * * You can make warnings fatal at runtime by setting the * G_DEBUG environment variable (see * Running GLib Applications). */ /** * g_critical: * @...: format string, followed by parameters to insert * into the format string (as with printf()) * * Logs a "critical warning" (#G_LOG_LEVEL_CRITICAL). * It's more or less application-defined what constitutes * a critical vs. a regular warning. You could call * g_log_set_always_fatal() to make critical warnings exit * the program, then use g_critical() for fatal errors, for * example. * * You can also make critical warnings fatal at runtime by * setting the G_DEBUG environment variable (see * Running GLib Applications). */ /** * g_error: * @...: format string, followed by parameters to insert * into the format string (as with printf()) * * A convenience function/macro to log an error message. * * Error messages are always fatal, resulting in a call to * abort() to terminate the application. This function will * result in a core dump; don't use it for errors you expect. * Using this function indicates a bug in your program, i.e. * an assertion failure. * */ /** * g_debug: * @...: format string, followed by parameters to insert * into the format string (as with printf()) * * A convenience function/macro to log a debug message. * * Since: 2.6 */ /* --- structures --- */ typedef struct _GLogDomain GLogDomain; typedef struct _GLogHandler GLogHandler; struct _GLogDomain { gchar *log_domain; GLogLevelFlags fatal_mask; GLogHandler *handlers; GLogDomain *next; }; struct _GLogHandler { guint id; GLogLevelFlags log_level; GLogFunc log_func; gpointer data; GLogHandler *next; }; /* --- variables --- */ static GMutex g_messages_lock; 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 static gboolean win32_keep_fatal_message = FALSE; /* This default message will usually be overwritten. */ /* Yes, a fixed size buffer is bad. So sue me. But g_error() is never * called with huge strings, is it? */ static gchar fatal_msg_buf[1000] = "Unspecified fatal error encountered, aborting."; static gchar *fatal_msg_ptr = fatal_msg_buf; #undef write static inline int dowrite (int fd, const void *buf, unsigned int len) { if (win32_keep_fatal_message) { memcpy (fatal_msg_ptr, buf, len); fatal_msg_ptr += len; *fatal_msg_ptr = 0; return len; } write (fd, buf, len); return len; } #define write(fd, buf, len) dowrite(fd, buf, len) #endif static void write_string (int fd, const gchar *string) { int res; do res = write (fd, string, strlen (string)); while (G_UNLIKELY (res == -1 && errno == EINTR)); } static GLogDomain* g_log_find_domain_L (const gchar *log_domain) { register GLogDomain *domain; domain = g_log_domains; while (domain) { if (strcmp (domain->log_domain, log_domain) == 0) return domain; domain = domain->next; } return NULL; } static GLogDomain* g_log_domain_new_L (const gchar *log_domain) { register GLogDomain *domain; domain = g_new (GLogDomain, 1); domain->log_domain = g_strdup (log_domain); domain->fatal_mask = G_LOG_FATAL_MASK; domain->handlers = NULL; domain->next = g_log_domains; g_log_domains = domain; return domain; } static void g_log_domain_check_free_L (GLogDomain *domain) { if (domain->fatal_mask == G_LOG_FATAL_MASK && domain->handlers == NULL) { register GLogDomain *last, *work; last = NULL; work = g_log_domains; while (work) { if (work == domain) { if (last) last->next = domain->next; else g_log_domains = domain->next; g_free (domain->log_domain); g_free (domain); break; } last = work; work = last->next; } } } static GLogFunc g_log_domain_get_handler_L (GLogDomain *domain, GLogLevelFlags log_level, gpointer *data) { if (domain && log_level) { register GLogHandler *handler; handler = domain->handlers; while (handler) { if ((handler->log_level & log_level) == log_level) { *data = handler->data; return handler->log_func; } handler = handler->next; } } *data = default_log_data; return default_log_func; } /** * g_log_set_always_fatal: * @fatal_mask: the mask containing bits set for each level * of error which is to be fatal * * Sets the message levels which are always fatal, in any log domain. * When a message with any of these levels is logged the program terminates. * You can only set the levels defined by GLib to be fatal. * %G_LOG_LEVEL_ERROR is always fatal. * * You can also make some message levels fatal at runtime by setting * the G_DEBUG environment variable (see * Running GLib Applications). * * Returns: the old fatal mask */ GLogLevelFlags g_log_set_always_fatal (GLogLevelFlags fatal_mask) { GLogLevelFlags old_mask; /* restrict the global mask to levels that are known to glib * since this setting applies to all domains */ fatal_mask &= (1 << G_LOG_LEVEL_USER_SHIFT) - 1; /* force errors to be fatal */ fatal_mask |= G_LOG_LEVEL_ERROR; /* remove bogus flag */ fatal_mask &= ~G_LOG_FLAG_FATAL; g_mutex_lock (&g_messages_lock); old_mask = g_log_always_fatal; g_log_always_fatal = fatal_mask; g_mutex_unlock (&g_messages_lock); return old_mask; } /** * g_log_set_fatal_mask: * @log_domain: the log domain * @fatal_mask: the new fatal mask * * Sets the log levels which are fatal in the given domain. * %G_LOG_LEVEL_ERROR is always fatal. * * Returns: the old fatal mask for the log domain */ GLogLevelFlags g_log_set_fatal_mask (const gchar *log_domain, GLogLevelFlags fatal_mask) { GLogLevelFlags old_flags; register GLogDomain *domain; if (!log_domain) log_domain = ""; /* force errors to be fatal */ fatal_mask |= G_LOG_LEVEL_ERROR; /* remove bogus flag */ fatal_mask &= ~G_LOG_FLAG_FATAL; g_mutex_lock (&g_messages_lock); domain = g_log_find_domain_L (log_domain); if (!domain) domain = g_log_domain_new_L (log_domain); old_flags = domain->fatal_mask; domain->fatal_mask = fatal_mask; g_log_domain_check_free_L (domain); g_mutex_unlock (&g_messages_lock); return old_flags; } /** * g_log_set_handler: * @log_domain: (allow-none): the log domain, or %NULL for the default "" * application domain * @log_levels: the log levels to apply the log handler for. * To handle fatal and recursive messages as well, combine * the log levels with the #G_LOG_FLAG_FATAL and * #G_LOG_FLAG_RECURSION bit flags. * @log_func: the log handler function * @user_data: data passed to the log handler * * Sets the log handler for a domain and a set of log levels. * To handle fatal and recursive messages the @log_levels parameter * must be combined with the #G_LOG_FLAG_FATAL and #G_LOG_FLAG_RECURSION * bit flags. * * Note that since the #G_LOG_LEVEL_ERROR log level is always fatal, if * you want to set a handler for this log level you must combine it with * #G_LOG_FLAG_FATAL. * * * Adding a log handler for all warning messages in the default * (application) domain * * g_log_set_handler (NULL, G_LOG_LEVEL_WARNING | G_LOG_FLAG_FATAL * | G_LOG_FLAG_RECURSION, my_log_handler, NULL); * * * * * Adding a log handler for all critical messages from GTK+ * * g_log_set_handler ("Gtk", G_LOG_LEVEL_CRITICAL | G_LOG_FLAG_FATAL * | G_LOG_FLAG_RECURSION, my_log_handler, NULL); * * * * * Adding a log handler for <emphasis>all</emphasis> messages from * GLib * * g_log_set_handler ("GLib", G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL * | G_LOG_FLAG_RECURSION, my_log_handler, NULL); * * * * Returns: the id of the new handler */ guint g_log_set_handler (const gchar *log_domain, GLogLevelFlags log_levels, GLogFunc log_func, gpointer user_data) { static guint handler_id = 0; GLogDomain *domain; GLogHandler *handler; g_return_val_if_fail ((log_levels & G_LOG_LEVEL_MASK) != 0, 0); g_return_val_if_fail (log_func != NULL, 0); if (!log_domain) log_domain = ""; handler = g_new (GLogHandler, 1); g_mutex_lock (&g_messages_lock); domain = g_log_find_domain_L (log_domain); if (!domain) domain = g_log_domain_new_L (log_domain); handler->id = ++handler_id; handler->log_level = log_levels; handler->log_func = log_func; handler->data = user_data; handler->next = domain->handlers; domain->handlers = handler; g_mutex_unlock (&g_messages_lock); return handler_id; } /** * g_log_set_default_handler: * @log_func: the log handler function * @user_data: data passed to the log handler * * Installs a default log handler which is used if no * log handler has been set for the particular log domain * and log level combination. By default, GLib uses * g_log_default_handler() as default log handler. * * Returns: the previous default log handler * * Since: 2.6 */ GLogFunc g_log_set_default_handler (GLogFunc log_func, gpointer user_data) { GLogFunc old_log_func; g_mutex_lock (&g_messages_lock); old_log_func = default_log_func; default_log_func = log_func; default_log_data = user_data; g_mutex_unlock (&g_messages_lock); return old_log_func; } /** * g_test_log_set_fatal_handler: * @log_func: the log handler function. * @user_data: data passed to the log handler. * * Installs a non-error fatal log handler which can be * used to decide whether log messages which are counted * as fatal abort the program. * * The use case here is that you are running a test case * that depends on particular libraries or circumstances * and cannot prevent certain known critical or warning * messages. So you install a handler that compares the * domain and message to precisely not abort in such a case. * * Note that the handler is reset at the beginning of * any test case, so you have to set it inside each test * function which needs the special behavior. * * This handler has no effect on g_error messages. * * Since: 2.22 **/ void g_test_log_set_fatal_handler (GTestLogFatalFunc log_func, gpointer user_data) { g_mutex_lock (&g_messages_lock); fatal_log_func = log_func; fatal_log_data = user_data; g_mutex_unlock (&g_messages_lock); } /** * g_log_remove_handler: * @log_domain: the log domain * @handler_id: the id of the handler, which was returned * in g_log_set_handler() * * Removes the log handler. */ void g_log_remove_handler (const gchar *log_domain, guint handler_id) { register GLogDomain *domain; g_return_if_fail (handler_id > 0); if (!log_domain) log_domain = ""; g_mutex_lock (&g_messages_lock); domain = g_log_find_domain_L (log_domain); if (domain) { GLogHandler *work, *last; last = NULL; work = domain->handlers; while (work) { if (work->id == handler_id) { if (last) last->next = work->next; else domain->handlers = work->next; g_log_domain_check_free_L (domain); g_mutex_unlock (&g_messages_lock); g_free (work); return; } last = work; work = last->next; } } g_mutex_unlock (&g_messages_lock); g_warning ("%s: could not find handler with id '%d' for domain \"%s\"", G_STRLOC, handler_id, log_domain); } #define CHAR_IS_SAFE(wc) (!((wc < 0x20 && wc != '\t' && wc != '\n' && wc != '\r') || \ (wc == 0x7f) || \ (wc >= 0x80 && wc < 0xa0))) static gchar* strdup_convert (const gchar *string, const gchar *charset) { if (!g_utf8_validate (string, -1, NULL)) { GString *gstring = g_string_new ("[Invalid UTF-8] "); guchar *p; for (p = (guchar *)string; *p; p++) { if (CHAR_IS_SAFE(*p) && !(*p == '\r' && *(p + 1) != '\n') && *p < 0x80) g_string_append_c (gstring, *p); else g_string_append_printf (gstring, "\\x%02x", (guint)(guchar)*p); } return g_string_free (gstring, FALSE); } else { GError *err = NULL; gchar *result = g_convert_with_fallback (string, -1, charset, "UTF-8", "?", NULL, NULL, &err); if (result) return result; else { /* Not thread-safe, but doesn't matter if we print the warning twice */ static gboolean warned = FALSE; if (!warned) { warned = TRUE; _g_fprintf (stderr, "GLib: Cannot convert message: %s\n", err->message); } g_error_free (err); return g_strdup (string); } } } /* For a radix of 8 we need at most 3 output bytes for 1 input * byte. Additionally we might need up to 2 output bytes for the * readix prefix and 1 byte for the trailing NULL. */ #define FORMAT_UNSIGNED_BUFSIZE ((GLIB_SIZEOF_LONG * 3) + 3) static void format_unsigned (gchar *buf, gulong num, guint radix) { gulong tmp; gchar c; gint i, n; /* we may not call _any_ GLib functions here (or macros like g_return_if_fail()) */ if (radix != 8 && radix != 10 && radix != 16) { *buf = '\000'; return; } if (!num) { *buf++ = '0'; *buf = '\000'; return; } if (radix == 16) { *buf++ = '0'; *buf++ = 'x'; } else if (radix == 8) { *buf++ = '0'; } n = 0; tmp = num; while (tmp) { tmp /= radix; n++; } i = n; /* Again we can't use g_assert; actually this check should _never_ fail. */ if (n > FORMAT_UNSIGNED_BUFSIZE - 3) { *buf = '\000'; return; } while (num) { i--; c = (num % radix); if (c < 10) buf[i] = c + '0'; else buf[i] = c + 'a' - 10; num /= radix; } buf[n] = '\000'; } /* string size big enough to hold level prefix */ #define STRING_BUFFER_SIZE (FORMAT_UNSIGNED_BUFSIZE + 32) #define ALERT_LEVELS (G_LOG_LEVEL_ERROR | G_LOG_LEVEL_CRITICAL | G_LOG_LEVEL_WARNING) /* these are emitted by the default log handler */ #define DEFAULT_LEVELS (G_LOG_LEVEL_ERROR | G_LOG_LEVEL_CRITICAL | G_LOG_LEVEL_WARNING | G_LOG_LEVEL_MESSAGE) /* these are filtered by G_MESSAGES_DEBUG by the default log handler */ #define INFO_LEVELS (G_LOG_LEVEL_INFO | G_LOG_LEVEL_DEBUG) static int mklevel_prefix (gchar level_prefix[STRING_BUFFER_SIZE], GLogLevelFlags log_level) { gboolean to_stdout = TRUE; /* we may not call _any_ GLib functions here */ switch (log_level & G_LOG_LEVEL_MASK) { case G_LOG_LEVEL_ERROR: strcpy (level_prefix, "ERROR"); to_stdout = FALSE; break; case G_LOG_LEVEL_CRITICAL: strcpy (level_prefix, "CRITICAL"); to_stdout = FALSE; break; case G_LOG_LEVEL_WARNING: strcpy (level_prefix, "WARNING"); to_stdout = FALSE; break; case G_LOG_LEVEL_MESSAGE: strcpy (level_prefix, "Message"); to_stdout = FALSE; break; case G_LOG_LEVEL_INFO: strcpy (level_prefix, "INFO"); break; case G_LOG_LEVEL_DEBUG: strcpy (level_prefix, "DEBUG"); break; default: if (log_level) { strcpy (level_prefix, "LOG-"); format_unsigned (level_prefix + 4, log_level & G_LOG_LEVEL_MASK, 16); } else strcpy (level_prefix, "LOG"); break; } if (log_level & G_LOG_FLAG_RECURSION) strcat (level_prefix, " (recursed)"); if (log_level & ALERT_LEVELS) strcat (level_prefix, " **"); #ifdef G_OS_WIN32 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 * pattern * * 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: * * |[ * /* g_main_context_push_thread_default() should fail if the * * context is already owned by another thread. * */ * 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, const gchar *message, gpointer unused_data) { gchar level_prefix[STRING_BUFFER_SIZE]; #ifndef G_OS_WIN32 gchar pid_string[FORMAT_UNSIGNED_BUFSIZE]; #endif int fd; /* we cannot call _any_ GLib functions in this fallback handler, * which is why we skip UTF-8 conversion, etc. * since we either recursed or ran out of memory, we're in a pretty * pathologic situation anyways, what we can do is giving the * the process ID unconditionally however. */ fd = mklevel_prefix (level_prefix, log_level); if (!message) message = "(NULL) message"; #ifndef G_OS_WIN32 format_unsigned (pid_string, getpid (), 10); #endif if (log_domain) write_string (fd, "\n"); else write_string (fd, "\n** "); #ifndef G_OS_WIN32 write_string (fd, "(process:"); write_string (fd, pid_string); write_string (fd, "): "); #endif if (log_domain) { write_string (fd, log_domain); write_string (fd, "-"); } write_string (fd, level_prefix); write_string (fd, ": "); write_string (fd, message); } static void escape_string (GString *string) { const char *p = string->str; gunichar wc; while (p < string->str + string->len) { gboolean safe; wc = g_utf8_get_char_validated (p, -1); if (wc == (gunichar)-1 || wc == (gunichar)-2) { gchar *tmp; guint pos; pos = p - string->str; /* Emit invalid UTF-8 as hex escapes */ tmp = g_strdup_printf ("\\x%02x", (guint)(guchar)*p); g_string_erase (string, pos, 1); g_string_insert (string, pos, tmp); p = string->str + (pos + 4); /* Skip over escape sequence */ g_free (tmp); continue; } if (wc == '\r') { safe = *(p + 1) == '\n'; } else { safe = CHAR_IS_SAFE (wc); } if (!safe) { gchar *tmp; guint pos; pos = p - string->str; /* Largest char we escape is 0x0a, so we don't have to worry * about 8-digit \Uxxxxyyyy */ tmp = g_strdup_printf ("\\u%04x", wc); g_string_erase (string, pos, g_utf8_next_char (p) - p); g_string_insert (string, pos, tmp); g_free (tmp); p = string->str + (pos + 6); /* Skip over escape sequence */ } else p = g_utf8_next_char (p); } } /** * g_log_default_handler: * @log_domain: the log domain of the message * @log_level: the level of the message * @message: the message * @unused_data: data passed from g_log() which is unused * * The default log handler set up by GLib; g_log_set_default_handler() * allows to install an alternate default log handler. * This is used if no log handler has been set for the particular log * domain and log level combination. It outputs the message to stderr * or stdout and if the log level is fatal it calls abort(). * * The behavior of this log handler can be influenced by a number of * environment variables: * * * G_MESSAGES_PREFIXED * * A :-separated list of log levels for which messages should * be prefixed by the program name and PID of the aplication. * * * * G_MESSAGES_DEBUG * * A space-separated list of log domains for which debug and * informational messages are printed. By default these * messages are not printed. * * * * * stderr is used for levels %G_LOG_LEVEL_ERROR, %G_LOG_LEVEL_CRITICAL, * %G_LOG_LEVEL_WARNING and %G_LOG_LEVEL_MESSAGE. stdout is used for * the rest. */ void g_log_default_handler (const gchar *log_domain, GLogLevelFlags log_level, const gchar *message, gpointer unused_data) { gchar level_prefix[STRING_BUFFER_SIZE], *string; GString *gstring; int fd; const gchar *domains; if ((log_level & DEFAULT_LEVELS) || (log_level >> G_LOG_LEVEL_USER_SHIFT)) goto emit; domains = g_getenv ("G_MESSAGES_DEBUG"); if (((log_level & INFO_LEVELS) == 0) || domains == NULL || (strcmp (domains, "all") != 0 && (!log_domain || !strstr (domains, log_domain)))) return; emit: /* we can be called externally with recursion for whatever reason */ if (log_level & G_LOG_FLAG_RECURSION) { _g_log_fallback_handler (log_domain, log_level, message, unused_data); return; } fd = mklevel_prefix (level_prefix, log_level); gstring = g_string_new (NULL); if (log_level & ALERT_LEVELS) g_string_append (gstring, "\n"); if (!log_domain) g_string_append (gstring, "** "); if ((g_log_msg_prefix & (log_level & G_LOG_LEVEL_MASK)) == (log_level & G_LOG_LEVEL_MASK)) { const gchar *prg_name = g_get_prgname (); if (!prg_name) g_string_append_printf (gstring, "(process:%lu): ", (gulong)getpid ()); else g_string_append_printf (gstring, "(%s:%lu): ", prg_name, (gulong)getpid ()); } if (log_domain) { g_string_append (gstring, log_domain); g_string_append_c (gstring, '-'); } g_string_append (gstring, level_prefix); g_string_append (gstring, ": "); if (!message) g_string_append (gstring, "(NULL) message"); else { GString *msg; const gchar *charset; msg = g_string_new (message); escape_string (msg); if (g_get_charset (&charset)) g_string_append (gstring, msg->str); /* charset is UTF-8 already */ else { string = strdup_convert (msg->str, charset); g_string_append (gstring, string); g_free (string); } g_string_free (msg, TRUE); } g_string_append (gstring, "\n"); string = g_string_free (gstring, FALSE); write_string (fd, string); g_free (string); } /** * g_set_print_handler: * @func: the new print handler * * Sets the print handler. * * Any messages passed to g_print() will be output via * the new handler. The default handler simply outputs * the message to stdout. By providing your own handler * you can redirect the output, to a GTK+ widget or a * log file for example. * * Returns: the old print handler */ GPrintFunc g_set_print_handler (GPrintFunc func) { GPrintFunc old_print_func; g_mutex_lock (&g_messages_lock); old_print_func = glib_print_func; glib_print_func = func; g_mutex_unlock (&g_messages_lock); return old_print_func; } /** * g_print: * @format: the message format. See the printf() documentation * @...: the parameters to insert into the format string * * Outputs a formatted message via the print handler. * The default print handler simply outputs the message to stdout. * * g_print() should not be used from within libraries for debugging * messages, since it may be redirected by applications to special * purpose message windows or even files. Instead, libraries should * use g_log(), or the convenience functions g_message(), g_warning() * and g_error(). */ void g_print (const gchar *format, ...) { va_list args; gchar *string; GPrintFunc local_glib_print_func; g_return_if_fail (format != NULL); va_start (args, format); string = g_strdup_vprintf (format, args); va_end (args); g_mutex_lock (&g_messages_lock); local_glib_print_func = glib_print_func; g_mutex_unlock (&g_messages_lock); if (local_glib_print_func) local_glib_print_func (string); else { const gchar *charset; if (g_get_charset (&charset)) fputs (string, stdout); /* charset is UTF-8 already */ else { gchar *lstring = strdup_convert (string, charset); fputs (lstring, stdout); g_free (lstring); } fflush (stdout); } g_free (string); } /** * g_set_printerr_handler: * @func: the new error message handler * * Sets the handler for printing error messages. * * Any messages passed to g_printerr() will be output via * the new handler. The default handler simply outputs the * message to stderr. By providing your own handler you can * redirect the output, to a GTK+ widget or a log file for * example. * * Returns: the old error message handler */ GPrintFunc g_set_printerr_handler (GPrintFunc func) { GPrintFunc old_printerr_func; g_mutex_lock (&g_messages_lock); old_printerr_func = glib_printerr_func; glib_printerr_func = func; g_mutex_unlock (&g_messages_lock); return old_printerr_func; } /** * g_printerr: * @format: the message format. See the printf() documentation * @...: the parameters to insert into the format string * * Outputs a formatted message via the error message handler. * The default handler simply outputs the message to stderr. * * g_printerr() should not be used from within libraries. * Instead g_log() should be used, or the convenience functions * g_message(), g_warning() and g_error(). */ void g_printerr (const gchar *format, ...) { va_list args; gchar *string; GPrintFunc local_glib_printerr_func; g_return_if_fail (format != NULL); va_start (args, format); string = g_strdup_vprintf (format, args); va_end (args); g_mutex_lock (&g_messages_lock); local_glib_printerr_func = glib_printerr_func; g_mutex_unlock (&g_messages_lock); if (local_glib_printerr_func) local_glib_printerr_func (string); else { const gchar *charset; if (g_get_charset (&charset)) fputs (string, stderr); /* charset is UTF-8 already */ else { gchar *lstring = strdup_convert (string, charset); fputs (lstring, stderr); g_free (lstring); } fflush (stderr); } g_free (string); } /** * g_printf_string_upper_bound: * @format: the format string. See the printf() documentation * @args: the parameters to be inserted into the format string * * Calculates the maximum space needed to store the output * of the sprintf() function. * * Returns: the maximum space needed to store the formatted string */ gsize g_printf_string_upper_bound (const gchar *format, va_list args) { gchar c; return _g_vsnprintf (&c, 1, format, args) + 1; } void _g_log_set_exit_on_fatal (void) { exit_on_fatal = TRUE; } pkg-config-0.29.1/glib/glib/gutils.h0000664000175000017500000003001212651243552014065 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the GLib Team and others 1997-2000. See the AUTHORS * file for a list of people on the GLib Team. See the ChangeLog * files for a list of changes. These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/. */ #ifndef __G_UTILS_H__ #define __G_UTILS_H__ #if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) #error "Only can be included directly." #endif #include #include G_BEGIN_DECLS /* Define G_VA_COPY() to do the right thing for copying va_list variables. * glibconfig.h may have already defined G_VA_COPY as va_copy or __va_copy. */ #if !defined (G_VA_COPY) # if defined (__GNUC__) && defined (__PPC__) && (defined (_CALL_SYSV) || defined (_WIN32)) # define G_VA_COPY(ap1, ap2) (*(ap1) = *(ap2)) # elif defined (G_VA_COPY_AS_ARRAY) # define G_VA_COPY(ap1, ap2) g_memmove ((ap1), (ap2), sizeof (va_list)) # else /* va_list is a pointer */ # define G_VA_COPY(ap1, ap2) ((ap1) = (ap2)) # endif /* va_list is a pointer */ #endif /* !G_VA_COPY */ /* inlining hassle. for compilers that don't allow the 'inline' keyword, * mostly because of strict ANSI C compliance or dumbness, we try to fall * back to either '__inline__' or '__inline'. * G_CAN_INLINE is defined in glibconfig.h if the compiler seems to be * actually *capable* to do function inlining, in which case inline * function bodies do make sense. we also define G_INLINE_FUNC to properly * export the function prototypes if no inlining can be performed. * inline function bodies have to be special cased with G_CAN_INLINE and a * .c file specific macro to allow one compiled instance with extern linkage * of the functions by defining G_IMPLEMENT_INLINES and the .c file macro. */ #if defined (G_HAVE_INLINE) && defined (__GNUC__) && defined (__STRICT_ANSI__) # undef inline # define inline __inline__ #elif !defined (G_HAVE_INLINE) # undef inline # if defined (G_HAVE___INLINE__) # define inline __inline__ # elif defined (G_HAVE___INLINE) # define inline __inline # else /* !inline && !__inline__ && !__inline */ # define inline /* don't inline, then */ # endif #endif #ifdef G_IMPLEMENT_INLINES # define G_INLINE_FUNC _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 _GLIB_EXTERN #endif /* !G_INLINE_FUNC */ 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); 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 #if defined (G_OS_WIN32) && defined (G_CAN_INLINE) && !defined (__cplusplus) /* This function is not part of the public GLib API either. Just call * g_get_system_data_dirs() in your code, never mind that that is * actually a macro and you will in fact call this inline function. */ static inline const gchar * const * _g_win32_get_system_data_dirs (void) { return g_win32_get_system_data_dirs_for_module ((void (*)(void)) &_g_win32_get_system_data_dirs); } #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); /** * GUserDirectory: * @G_USER_DIRECTORY_DESKTOP: the user's Desktop directory * @G_USER_DIRECTORY_DOCUMENTS: the user's Documents directory * @G_USER_DIRECTORY_DOWNLOAD: the user's Downloads directory * @G_USER_DIRECTORY_MUSIC: the user's Music directory * @G_USER_DIRECTORY_PICTURES: the user's Pictures directory * @G_USER_DIRECTORY_PUBLIC_SHARE: the user's shared directory * @G_USER_DIRECTORY_TEMPLATES: the user's Templates directory * @G_USER_DIRECTORY_VIDEOS: the user's Movies directory * @G_USER_N_DIRECTORIES: the number of enum values * * These are logical ids for special directories which are defined * depending on the platform used. You should use g_get_user_special_dir() * to retrieve the full path associated to the logical id. * * The #GUserDirectory enumeration can be extended at later date. Not * every platform has a directory for every logical id in this * enumeration. * * Since: 2.14 */ typedef enum { G_USER_DIRECTORY_DESKTOP, G_USER_DIRECTORY_DOCUMENTS, G_USER_DIRECTORY_DOWNLOAD, G_USER_DIRECTORY_MUSIC, G_USER_DIRECTORY_PICTURES, G_USER_DIRECTORY_PUBLIC_SHARE, G_USER_DIRECTORY_TEMPLATES, G_USER_DIRECTORY_VIDEOS, G_USER_N_DIRECTORIES } GUserDirectory; GLIB_AVAILABLE_IN_ALL const gchar * g_get_user_special_dir (GUserDirectory directory); /** * GDebugKey: * @key: the string * @value: the flag * * Associates a string with a bit flag. * Used in g_parse_debug_string(). */ typedef struct _GDebugKey GDebugKey; struct _GDebugKey { const gchar *key; guint value; }; /* 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) G_GNUC_PRINTF(3, 0); GLIB_AVAILABLE_IN_ALL void g_nullify_pointer (gpointer *nullify_location); typedef enum { G_FORMAT_SIZE_DEFAULT = 0, G_FORMAT_SIZE_LONG_FORMAT = 1 << 0, G_FORMAT_SIZE_IEC_UNITS = 1 << 1 } GFormatSizeFlags; GLIB_AVAILABLE_IN_2_30 gchar *g_format_size_full (guint64 size, GFormatSizeFlags flags); GLIB_AVAILABLE_IN_2_30 gchar *g_format_size (guint64 size); GLIB_DEPRECATED_FOR(g_format_size) gchar *g_format_size_for_display (goffset size); #ifndef G_DISABLE_DEPRECATED /** * GVoidFunc: * * Declares a type of function which takes no arguments * and has no return value. It is used to specify the type * function passed to g_atexit(). */ typedef void (*GVoidFunc) (void); #ifndef ATEXIT # define ATEXIT(proc) g_ATEXIT(proc) #else # define G_NATIVE_ATEXIT #endif /* ATEXIT */ /* we use a GLib function as a replacement for ATEXIT, so * the programmer is not required to check the return value * (if there is any in the implementation) and doesn't encounter * missing include files. */ GLIB_DEPRECATED void g_atexit (GVoidFunc func); #ifdef G_OS_WIN32 /* It's a bad idea to wrap atexit() on Windows. If the GLib DLL calls * atexit(), the function will be called when the GLib DLL is detached * from the program, which is not what the caller wants. The caller * wants the function to be called when it *itself* exits (or is * detached, in case the caller, too, is a DLL). */ #if (defined(__MINGW_H) && !defined(_STDLIB_H_)) || (defined(_MSC_VER) && !defined(_INC_STDLIB)) int atexit (void (*)(void)); #endif #define g_atexit(func) atexit(func) #endif #endif /* G_DISABLE_DEPRECATED */ /* Look for an executable in PATH, following execvp() rules */ GLIB_AVAILABLE_IN_ALL gchar* g_find_program_in_path (const gchar *program); /* Bit tests */ G_INLINE_FUNC gint g_bit_nth_lsf (gulong mask, gint nth_bit) G_GNUC_CONST; G_INLINE_FUNC gint g_bit_nth_msf (gulong mask, gint nth_bit) G_GNUC_CONST; G_INLINE_FUNC guint g_bit_storage (gulong number) G_GNUC_CONST; /* inline function implementations */ #if defined (G_CAN_INLINE) || defined (__G_UTILS_C__) G_INLINE_FUNC gint g_bit_nth_lsf (gulong mask, gint nth_bit) { if (G_UNLIKELY (nth_bit < -1)) nth_bit = -1; while (nth_bit < ((GLIB_SIZEOF_LONG * 8) - 1)) { nth_bit++; if (mask & (1UL << nth_bit)) return nth_bit; } return -1; } G_INLINE_FUNC gint g_bit_nth_msf (gulong mask, gint nth_bit) { if (nth_bit < 0 || G_UNLIKELY (nth_bit > GLIB_SIZEOF_LONG * 8)) nth_bit = GLIB_SIZEOF_LONG * 8; while (nth_bit > 0) { nth_bit--; if (mask & (1UL << nth_bit)) return nth_bit; } return -1; } G_INLINE_FUNC guint g_bit_storage (gulong number) { #if defined(__GNUC__) && (__GNUC__ >= 4) && defined(__OPTIMIZE__) return G_LIKELY (number) ? ((GLIB_SIZEOF_LONG * 8U - 1) ^ (guint) __builtin_clzl(number)) + 1 : 1; #else register guint n_bits = 0; do { n_bits++; number >>= 1; } while (number); return n_bits; #endif } #endif /* G_CAN_INLINE || __G_UTILS_C__ */ #ifndef G_DISABLE_DEPRECATED /* * This macro is deprecated. This DllMain() is too complex. It is * recommended to write an explicit minimal DLlMain() that just saves * the handle to the DLL and then use that handle instead, for * instance passing it to * g_win32_get_package_installation_directory_of_module(). * * On Windows, this macro defines a DllMain function that stores the * actual DLL name that the code being compiled will be included in. * STATIC should be empty or 'static'. DLL_NAME is the name of the * (pointer to the) char array where the DLL name will be stored. If * this is used, you must also include . If you need a more complex * DLL entry point function, you cannot use this. * * On non-Windows platforms, expands to nothing. */ #ifndef G_PLATFORM_WIN32 # define G_WIN32_DLLMAIN_FOR_DLL_NAME(static, dll_name) #else # define G_WIN32_DLLMAIN_FOR_DLL_NAME(static, dll_name) \ static char *dll_name; \ \ BOOL WINAPI \ DllMain (HINSTANCE hinstDLL, \ DWORD fdwReason, \ LPVOID lpvReserved) \ { \ wchar_t wcbfr[1000]; \ char *tem; \ switch (fdwReason) \ { \ case DLL_PROCESS_ATTACH: \ GetModuleFileNameW ((HMODULE) hinstDLL, wcbfr, G_N_ELEMENTS (wcbfr)); \ tem = g_utf16_to_utf8 (wcbfr, -1, NULL, NULL, NULL); \ dll_name = g_path_get_basename (tem); \ g_free (tem); \ break; \ } \ \ return TRUE; \ } #endif /* !G_DISABLE_DEPRECATED */ #endif /* G_PLATFORM_WIN32 */ G_END_DECLS #endif /* __G_UTILS_H__ */ pkg-config-0.29.1/glib/glib/gasyncqueueprivate.h0000664000175000017500000000211012275467762016515 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __G_ASYNCQUEUEPRIVATE_H__ #define __G_ASYNCQUEUEPRIVATE_H__ #include "gasyncqueue.h" G_BEGIN_DECLS GMutex *_g_async_queue_get_mutex (GAsyncQueue *queue); G_END_DECLS #endif /* __G_ASYNCQUEUEPRIVATE_H__ */ pkg-config-0.29.1/glib/glib/gmarkup.c0000664000175000017500000025406012651243552014232 00000000000000/* gmarkup.c - Simple XML-like parser * * Copyright 2000, 2003 Red Hat, Inc. * Copyright 2007, 2008 Ryan Lortie * * GLib is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * GLib is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with GLib; see the file COPYING.LIB. If not, * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "config.h" #include #include #include #include #include #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 * @Title: Simple XML Subset Parser * @Short_description: parses a subset of XML * @See_also: XML * Specification * * The "GMarkup" parser is intended to parse a simple markup format * that's a subset of XML. This is a small, efficient, easy-to-use * parser. It should not be used if you expect to interoperate with * other applications generating full-scale XML. However, it's very * useful for application data files, config files, etc. where you * know your application will be the only one writing the file. * Full-scale XML parsers should be able to parse the subset used by * GMarkup, so you can easily migrate to full-scale XML at a later * time if the need arises. * * GMarkup is not guaranteed to signal an error on all invalid XML; * the parser may accept documents that an XML parser would not. * However, XML documents which are not well-formedBeing wellformed is a weaker condition than being * valid. See the XML * specification for definitions of these terms. * are not considered valid GMarkup documents. * * Simplifications to XML include: * * Only UTF-8 encoding is allowed * No user-defined entities * Processing instructions, comments and the doctype declaration * are "passed through" but are not interpreted in any way * No DTD or validation. * * * The markup format does support: * * Elements * Attributes * 5 standard entities: * &amp; &lt; &gt; &quot; &apos; * * Character references * Sections marked as CDATA * */ G_DEFINE_QUARK (g-markup-error-quark, g_markup_error) typedef enum { STATE_START, STATE_AFTER_OPEN_ANGLE, STATE_AFTER_CLOSE_ANGLE, STATE_AFTER_ELISION_SLASH, /* the slash that obviates need for end element */ STATE_INSIDE_OPEN_TAG_NAME, STATE_INSIDE_ATTRIBUTE_NAME, STATE_AFTER_ATTRIBUTE_NAME, STATE_BETWEEN_ATTRIBUTES, STATE_AFTER_ATTRIBUTE_EQUALS_SIGN, STATE_INSIDE_ATTRIBUTE_VALUE_SQ, STATE_INSIDE_ATTRIBUTE_VALUE_DQ, STATE_INSIDE_TEXT, STATE_AFTER_CLOSE_TAG_SLASH, STATE_INSIDE_CLOSE_TAG_NAME, STATE_AFTER_CLOSE_TAG_NAME, STATE_INSIDE_PASSTHROUGH, STATE_ERROR } GMarkupParseState; typedef struct { const char *prev_element; const GMarkupParser *prev_parser; gpointer prev_user_data; } GMarkupRecursionTracker; struct _GMarkupParseContext { const GMarkupParser *parser; volatile gint ref_count; GMarkupParseFlags flags; gint line_number; gint char_number; GMarkupParseState state; gpointer user_data; GDestroyNotify dnotify; /* A piece of character data or an element that * hasn't "ended" yet so we haven't yet called * the callback for it. */ GString *partial_chunk; GSList *spare_chunks; GSList *tag_stack; GSList *tag_stack_gstr; GSList *spare_list_nodes; GString **attr_names; GString **attr_values; gint cur_attr; gint alloc_attrs; const gchar *current_text; gssize current_text_len; const gchar *current_text_end; /* used to save the start of the last interesting thingy */ const gchar *start; const gchar *iter; guint document_empty : 1; guint parsing : 1; guint awaiting_pop : 1; gint balance; /* subparser support */ GSList *subparser_stack; /* (GMarkupRecursionTracker *) */ const char *subparser_element; gpointer held_user_data; }; /* * Helpers to reduce our allocation overhead, we have * a well defined allocation lifecycle. */ static GSList * get_list_node (GMarkupParseContext *context, gpointer data) { GSList *node; if (context->spare_list_nodes != NULL) { node = context->spare_list_nodes; context->spare_list_nodes = g_slist_remove_link (context->spare_list_nodes, node); } else node = g_slist_alloc(); node->data = data; return node; } static void free_list_node (GMarkupParseContext *context, GSList *node) { node->data = NULL; context->spare_list_nodes = g_slist_concat (node, context->spare_list_nodes); } static inline void string_blank (GString *string) { string->str[0] = '\0'; string->len = 0; } /** * g_markup_parse_context_new: * @parser: a #GMarkupParser * @flags: one or more #GMarkupParseFlags * @user_data: user data to pass to #GMarkupParser functions * @user_data_dnotify: user data destroy notifier called when * the parse context is freed * * Creates a new parse context. A parse context is used to parse * marked-up documents. You can feed any number of documents into * a context, as long as no errors occur; once an error occurs, * the parse context can't continue to parse text (you have to * free it and create a new parse context). * * Return value: a new #GMarkupParseContext **/ GMarkupParseContext * g_markup_parse_context_new (const GMarkupParser *parser, GMarkupParseFlags flags, gpointer user_data, GDestroyNotify user_data_dnotify) { GMarkupParseContext *context; g_return_val_if_fail (parser != NULL, NULL); context = g_new (GMarkupParseContext, 1); context->ref_count = 1; context->parser = parser; context->flags = flags; context->user_data = user_data; context->dnotify = user_data_dnotify; context->line_number = 1; context->char_number = 1; context->partial_chunk = NULL; context->spare_chunks = NULL; context->spare_list_nodes = NULL; context->state = STATE_START; context->tag_stack = NULL; context->tag_stack_gstr = NULL; context->attr_names = NULL; context->attr_values = NULL; context->cur_attr = -1; context->alloc_attrs = 0; context->current_text = NULL; context->current_text_len = -1; context->current_text_end = NULL; context->start = NULL; context->iter = NULL; context->document_empty = TRUE; context->parsing = FALSE; context->awaiting_pop = FALSE; context->subparser_stack = NULL; context->subparser_element = NULL; /* this is only looked at if awaiting_pop = TRUE. initialise anyway. */ context->held_user_data = NULL; context->balance = 0; 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) { g_string_free (ptr, TRUE); } static void clear_attributes (GMarkupParseContext *context); /** * g_markup_parse_context_free: * @context: a #GMarkupParseContext * * Frees a #GMarkupParseContext. * * This function can't be called from inside one of the * #GMarkupParser functions or while a subparser is pushed. */ void g_markup_parse_context_free (GMarkupParseContext *context) { g_return_if_fail (context != NULL); g_return_if_fail (!context->parsing); g_return_if_fail (!context->subparser_stack); g_return_if_fail (!context->awaiting_pop); if (context->dnotify) (* context->dnotify) (context->user_data); clear_attributes (context); g_free (context->attr_names); g_free (context->attr_values); g_slist_free_full (context->tag_stack_gstr, string_full_free); g_slist_free (context->tag_stack); g_slist_free_full (context->spare_chunks, string_full_free); g_slist_free (context->spare_list_nodes); if (context->partial_chunk) g_string_free (context->partial_chunk, TRUE); g_free (context); } static void pop_subparser_stack (GMarkupParseContext *context); static void mark_error (GMarkupParseContext *context, GError *error) { context->state = STATE_ERROR; if (context->parser->error) (*context->parser->error) (context, error, context->user_data); /* report the error all the way up to free all the user-data */ while (context->subparser_stack) { pop_subparser_stack (context); context->awaiting_pop = FALSE; /* already been freed */ if (context->parser->error) (*context->parser->error) (context, error, context->user_data); } } static void set_error (GMarkupParseContext *context, GError **error, GMarkupError code, const gchar *format, ...) G_GNUC_PRINTF (4, 5); static void set_error_literal (GMarkupParseContext *context, GError **error, GMarkupError code, const gchar *message) { GError *tmp_error; tmp_error = g_error_new_literal (G_MARKUP_ERROR, code, message); g_prefix_error (&tmp_error, _("Error on line %d char %d: "), context->line_number, context->char_number); mark_error (context, tmp_error); g_propagate_error (error, tmp_error); } G_GNUC_PRINTF(4, 5) static void set_error (GMarkupParseContext *context, GError **error, GMarkupError code, const gchar *format, ...) { gchar *s; gchar *s_valid; va_list args; va_start (args, format); s = g_strdup_vprintf (format, args); va_end (args); /* Make sure that the GError message is valid UTF-8 * even if it is complaining about invalid UTF-8 in the markup */ s_valid = _g_utf8_make_valid (s); set_error_literal (context, error, code, s); g_free (s); g_free (s_valid); } static void propagate_error (GMarkupParseContext *context, GError **dest, GError *src) { if (context->flags & G_MARKUP_PREFIX_ERROR_POSITION) g_prefix_error (&src, _("Error on line %d char %d: "), context->line_number, context->char_number); mark_error (context, src); g_propagate_error (dest, src); } #define IS_COMMON_NAME_END_CHAR(c) \ ((c) == '=' || (c) == '/' || (c) == '>' || (c) == ' ') static gboolean slow_name_validate (GMarkupParseContext *context, const gchar *name, GError **error) { const gchar *p = name; if (!g_utf8_validate (name, strlen (name), NULL)) { set_error (context, error, G_MARKUP_ERROR_BAD_UTF8, _("Invalid UTF-8 encoded text in name - not valid '%s'"), name); return FALSE; } if (!(g_ascii_isalpha (*p) || (!IS_COMMON_NAME_END_CHAR (*p) && (*p == '_' || *p == ':' || g_unichar_isalpha (g_utf8_get_char (p)))))) { set_error (context, error, G_MARKUP_ERROR_PARSE, _("'%s' is not a valid name"), name); return FALSE; } for (p = g_utf8_next_char (name); *p != '\0'; p = g_utf8_next_char (p)) { /* is_name_char */ if (!(g_ascii_isalnum (*p) || (!IS_COMMON_NAME_END_CHAR (*p) && (*p == '.' || *p == '-' || *p == '_' || *p == ':' || 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); return FALSE; } } return TRUE; } /* * Use me for elements, attributes etc. */ static gboolean name_validate (GMarkupParseContext *context, const gchar *name, GError **error) { char mask; const char *p; /* name start char */ p = name; if (G_UNLIKELY (IS_COMMON_NAME_END_CHAR (*p) || !(g_ascii_isalpha (*p) || *p == '_' || *p == ':'))) goto slow_validate; for (mask = *p++; *p != '\0'; p++) { mask |= *p; /* is_name_char */ if (G_UNLIKELY (!(g_ascii_isalnum (*p) || (!IS_COMMON_NAME_END_CHAR (*p) && (*p == '.' || *p == '-' || *p == '_' || *p == ':'))))) goto slow_validate; } if (mask & 0x80) /* un-common / non-ascii */ goto slow_validate; return TRUE; slow_validate: return slow_name_validate (context, name, error); } static gboolean text_validate (GMarkupParseContext *context, const gchar *p, gint len, GError **error) { if (!g_utf8_validate (p, len, NULL)) { set_error (context, error, G_MARKUP_ERROR_BAD_UTF8, _("Invalid UTF-8 encoded text in name - not valid '%s'"), p); return FALSE; } else return TRUE; } static gchar* char_str (gunichar c, gchar *buf) { memset (buf, 0, 8); g_unichar_to_utf8 (c, buf); return buf; } static gchar* utf8_str (const gchar *utf8, gchar *buf) { char_str (g_utf8_get_char (utf8), buf); return buf; } G_GNUC_PRINTF(5, 6) static void set_unescape_error (GMarkupParseContext *context, GError **error, const gchar *remaining_text, GMarkupError code, const gchar *format, ...) { GError *tmp_error; gchar *s; va_list args; gint remaining_newlines; const gchar *p; remaining_newlines = 0; p = remaining_text; while (*p != '\0') { if (*p == '\n') ++remaining_newlines; ++p; } va_start (args, format); s = g_strdup_vprintf (format, args); va_end (args); tmp_error = g_error_new (G_MARKUP_ERROR, code, _("Error on line %d: %s"), context->line_number - remaining_newlines, s); g_free (s); mark_error (context, tmp_error); g_propagate_error (error, tmp_error); } /* * re-write the GString in-place, unescaping anything that escaped. * most XML does not contain entities, or escaping. */ static gboolean unescape_gstring_inplace (GMarkupParseContext *context, GString *string, gboolean *is_ascii, GError **error) { char mask, *to; int line_num = 1; const char *from; gboolean normalize_attribute; *is_ascii = FALSE; /* are we unescaping an attribute or not ? */ if (context->state == STATE_INSIDE_ATTRIBUTE_VALUE_SQ || context->state == STATE_INSIDE_ATTRIBUTE_VALUE_DQ) normalize_attribute = TRUE; else normalize_attribute = FALSE; /* * Meeks' theorum: unescaping can only shrink text. * for < etc. this is obvious, for ￿ more * thought is required, but this is patently so. */ mask = 0; for (from = to = string->str; *from != '\0'; from++, to++) { *to = *from; mask |= *to; if (*to == '\n') line_num++; if (normalize_attribute && (*to == '\t' || *to == '\n')) *to = ' '; if (*to == '\r') { *to = normalize_attribute ? ' ' : '\n'; if (from[1] == '\n') from++; } if (*from == '&') { from++; if (*from == '#') { gboolean is_hex = FALSE; gulong l; gchar *end = NULL; from++; if (*from == 'x') { is_hex = TRUE; from++; } /* digit is between start and p */ errno = 0; if (is_hex) l = strtoul (from, &end, 16); else l = strtoul (from, &end, 10); if (end == from || errno != 0) { set_unescape_error (context, error, from, G_MARKUP_ERROR_PARSE, _("Failed to parse '%-.*s', which " "should have been a digit " "inside a character reference " "(ê for example) - perhaps " "the digit is too large"), (int)(end - from), from); return FALSE; } else if (*end != ';') { set_unescape_error (context, error, from, G_MARKUP_ERROR_PARSE, _("Character reference did not end with a " "semicolon; " "most likely you used an ampersand " "character without intending to start " "an entity - escape ampersand as &")); return FALSE; } else { /* characters XML 1.1 permits */ if ((0 < l && l <= 0xD7FF) || (0xE000 <= l && l <= 0xFFFD) || (0x10000 <= l && l <= 0x10FFFF)) { gchar buf[8]; char_str (l, buf); strcpy (to, buf); to += strlen (buf) - 1; from = end; if (l >= 0x80) /* not ascii */ mask |= 0x80; } else { set_unescape_error (context, error, from, G_MARKUP_ERROR_PARSE, _("Character reference '%-.*s' does not " "encode a permitted character"), (int)(end - from), from); return FALSE; } } } else if (strncmp (from, "lt;", 3) == 0) { *to = '<'; from += 2; } else if (strncmp (from, "gt;", 3) == 0) { *to = '>'; from += 2; } else if (strncmp (from, "amp;", 4) == 0) { *to = '&'; from += 3; } else if (strncmp (from, "quot;", 5) == 0) { *to = '"'; from += 4; } else if (strncmp (from, "apos;", 5) == 0) { *to = '\''; from += 4; } else { if (*from == ';') set_unescape_error (context, error, from, G_MARKUP_ERROR_PARSE, _("Empty entity '&;' seen; valid " "entities are: & " < > '")); else { const char *end = strchr (from, ';'); if (end) set_unescape_error (context, error, from, G_MARKUP_ERROR_PARSE, _("Entity name '%-.*s' is not known"), (int)(end - from), from); else set_unescape_error (context, error, from, G_MARKUP_ERROR_PARSE, _("Entity did not end with a semicolon; " "most likely you used an ampersand " "character without intending to start " "an entity - escape ampersand as &")); } return FALSE; } } } g_assert (to - string->str <= string->len); if (to - string->str != string->len) g_string_truncate (string, to - string->str); *is_ascii = !(mask & 0x80); return TRUE; } static inline gboolean advance_char (GMarkupParseContext *context) { context->iter++; context->char_number++; if (G_UNLIKELY (context->iter == context->current_text_end)) return FALSE; else if (G_UNLIKELY (*context->iter == '\n')) { context->line_number++; context->char_number = 1; } return TRUE; } static inline gboolean xml_isspace (char c) { return c == ' ' || c == '\t' || c == '\n' || c == '\r'; } static void skip_spaces (GMarkupParseContext *context) { do { if (!xml_isspace (*context->iter)) return; } while (advance_char (context)); } static void advance_to_name_end (GMarkupParseContext *context) { do { if (IS_COMMON_NAME_END_CHAR (*(context->iter))) return; if (xml_isspace (*(context->iter))) return; } while (advance_char (context)); } static void release_chunk (GMarkupParseContext *context, GString *str) { GSList *node; if (!str) return; if (str->allocated_len > 256) { /* large strings are unusual and worth freeing */ g_string_free (str, TRUE); return; } string_blank (str); node = get_list_node (context, str); context->spare_chunks = g_slist_concat (node, context->spare_chunks); } static void add_to_partial (GMarkupParseContext *context, const gchar *text_start, const gchar *text_end) { if (context->partial_chunk == NULL) { /* allocate a new chunk to parse into */ if (context->spare_chunks != NULL) { GSList *node = context->spare_chunks; context->spare_chunks = g_slist_remove_link (context->spare_chunks, node); context->partial_chunk = node->data; free_list_node (context, node); } else context->partial_chunk = g_string_sized_new (MAX (28, text_end - text_start)); } if (text_start != text_end) g_string_insert_len (context->partial_chunk, -1, text_start, text_end - text_start); } static inline void truncate_partial (GMarkupParseContext *context) { if (context->partial_chunk != NULL) string_blank (context->partial_chunk); } static inline const gchar* current_element (GMarkupParseContext *context) { return context->tag_stack->data; } static void pop_subparser_stack (GMarkupParseContext *context) { GMarkupRecursionTracker *tracker; g_assert (context->subparser_stack); tracker = context->subparser_stack->data; context->awaiting_pop = TRUE; context->held_user_data = context->user_data; context->user_data = tracker->prev_user_data; context->parser = tracker->prev_parser; context->subparser_element = tracker->prev_element; g_slice_free (GMarkupRecursionTracker, tracker); context->subparser_stack = g_slist_delete_link (context->subparser_stack, context->subparser_stack); } static void push_partial_as_tag (GMarkupParseContext *context) { GString *str = context->partial_chunk; /* sadly, this is exported by gmarkup_get_element_stack as-is */ context->tag_stack = g_slist_concat (get_list_node (context, str->str), context->tag_stack); context->tag_stack_gstr = g_slist_concat (get_list_node (context, str), context->tag_stack_gstr); context->partial_chunk = NULL; } static void pop_tag (GMarkupParseContext *context) { GSList *nodea, *nodeb; nodea = context->tag_stack; nodeb = context->tag_stack_gstr; release_chunk (context, nodeb->data); context->tag_stack = g_slist_remove_link (context->tag_stack, nodea); context->tag_stack_gstr = g_slist_remove_link (context->tag_stack_gstr, nodeb); free_list_node (context, nodea); free_list_node (context, nodeb); } static void possibly_finish_subparser (GMarkupParseContext *context) { if (current_element (context) == context->subparser_element) pop_subparser_stack (context); } static void ensure_no_outstanding_subparser (GMarkupParseContext *context) { if (context->awaiting_pop) g_critical ("During the first end_element call after invoking a " "subparser you must pop the subparser stack and handle " "the freeing of the subparser user_data. This can be " "done by calling the end function of the subparser. " "Very probably, your program just leaked memory."); /* let valgrind watch the pointer disappear... */ context->held_user_data = NULL; context->awaiting_pop = FALSE; } static const gchar* current_attribute (GMarkupParseContext *context) { g_assert (context->cur_attr >= 0); return context->attr_names[context->cur_attr]->str; } static void add_attribute (GMarkupParseContext *context, GString *str) { if (context->cur_attr + 2 >= context->alloc_attrs) { context->alloc_attrs += 5; /* silly magic number */ context->attr_names = g_realloc (context->attr_names, sizeof(GString*)*context->alloc_attrs); context->attr_values = g_realloc (context->attr_values, sizeof(GString*)*context->alloc_attrs); } context->cur_attr++; context->attr_names[context->cur_attr] = str; context->attr_values[context->cur_attr] = NULL; context->attr_names[context->cur_attr+1] = NULL; context->attr_values[context->cur_attr+1] = NULL; } static void clear_attributes (GMarkupParseContext *context) { /* Go ahead and free the attributes. */ for (; context->cur_attr >= 0; context->cur_attr--) { int pos = context->cur_attr; release_chunk (context, context->attr_names[pos]); release_chunk (context, context->attr_values[pos]); context->attr_names[pos] = context->attr_values[pos] = NULL; } g_assert (context->cur_attr == -1); g_assert (context->attr_names == NULL || context->attr_names[0] == NULL); g_assert (context->attr_values == NULL || context->attr_values[0] == NULL); } /* This has to be a separate function to ensure the alloca's * are unwound on exit - otherwise we grow & blow the stack * with large documents */ static inline void emit_start_element (GMarkupParseContext *context, GError **error) { int i; const gchar *start_name; const gchar **attr_names; const gchar **attr_values; GError *tmp_error; attr_names = g_newa (const gchar *, context->cur_attr + 2); attr_values = g_newa (const gchar *, context->cur_attr + 2); for (i = 0; i < context->cur_attr + 1; i++) { attr_names[i] = context->attr_names[i]->str; attr_values[i] = context->attr_values[i]->str; } attr_names[i] = NULL; attr_values[i] = NULL; /* Call user callback for element start */ tmp_error = NULL; start_name = current_element (context); if (context->parser->start_element && name_validate (context, start_name, error)) (* context->parser->start_element) (context, start_name, (const gchar **)attr_names, (const gchar **)attr_values, context->user_data, &tmp_error); clear_attributes (context); if (tmp_error != NULL) propagate_error (context, error, tmp_error); } /** * g_markup_parse_context_parse: * @context: a #GMarkupParseContext * @text: chunk of text to parse * @text_len: length of @text in bytes * @error: return location for a #GError * * Feed some data to the #GMarkupParseContext. * * The data need not be valid UTF-8; an error will be signaled if * it's invalid. The data need not be an entire document; you can * feed a document into the parser incrementally, via multiple calls * to this function. Typically, as you receive data from a network * connection or file, you feed each received chunk of data into this * function, aborting the process if an error occurs. Once an error * is reported, no further data may be fed to the #GMarkupParseContext; * all errors are fatal. * * Return value: %FALSE if an error occurred, %TRUE on success */ gboolean g_markup_parse_context_parse (GMarkupParseContext *context, const gchar *text, gssize text_len, GError **error) { g_return_val_if_fail (context != NULL, FALSE); g_return_val_if_fail (text != NULL, FALSE); g_return_val_if_fail (context->state != STATE_ERROR, FALSE); g_return_val_if_fail (!context->parsing, FALSE); if (text_len < 0) text_len = strlen (text); if (text_len == 0) return TRUE; context->parsing = TRUE; context->current_text = text; context->current_text_len = text_len; context->current_text_end = context->current_text + text_len; context->iter = context->current_text; context->start = context->iter; while (context->iter != context->current_text_end) { switch (context->state) { case STATE_START: /* Possible next state: AFTER_OPEN_ANGLE */ g_assert (context->tag_stack == NULL); /* whitespace is ignored outside of any elements */ skip_spaces (context); if (context->iter != context->current_text_end) { if (*context->iter == '<') { /* Move after the open angle */ advance_char (context); context->state = STATE_AFTER_OPEN_ANGLE; /* this could start a passthrough */ context->start = context->iter; /* document is now non-empty */ context->document_empty = FALSE; } else { set_error_literal (context, error, G_MARKUP_ERROR_PARSE, _("Document must begin with an element (e.g. )")); } } break; case STATE_AFTER_OPEN_ANGLE: /* Possible next states: INSIDE_OPEN_TAG_NAME, * AFTER_CLOSE_TAG_SLASH, INSIDE_PASSTHROUGH */ if (*context->iter == '?' || *context->iter == '!') { /* include < in the passthrough */ const gchar *openangle = "<"; add_to_partial (context, openangle, openangle + 1); context->start = context->iter; context->balance = 1; context->state = STATE_INSIDE_PASSTHROUGH; } else if (*context->iter == '/') { /* move after it */ advance_char (context); context->state = STATE_AFTER_CLOSE_TAG_SLASH; } else if (!IS_COMMON_NAME_END_CHAR (*(context->iter))) { context->state = STATE_INSIDE_OPEN_TAG_NAME; /* start of tag name */ context->start = context->iter; } else { gchar buf[8]; set_error (context, error, G_MARKUP_ERROR_PARSE, _("'%s' is not a valid character following " "a '<' character; it may not begin an " "element name"), utf8_str (context->iter, buf)); } break; /* The AFTER_CLOSE_ANGLE state is actually sort of * broken, because it doesn't correspond to a range * of characters in the input stream as the others do, * and thus makes things harder to conceptualize */ case STATE_AFTER_CLOSE_ANGLE: /* Possible next states: INSIDE_TEXT, STATE_START */ if (context->tag_stack == NULL) { context->start = NULL; context->state = STATE_START; } else { context->start = context->iter; context->state = STATE_INSIDE_TEXT; } break; case STATE_AFTER_ELISION_SLASH: /* Possible next state: AFTER_CLOSE_ANGLE */ { /* We need to pop the tag stack and call the end_element * function, since this is the close tag */ GError *tmp_error = NULL; g_assert (context->tag_stack != NULL); possibly_finish_subparser (context); tmp_error = NULL; if (context->parser->end_element) (* context->parser->end_element) (context, current_element (context), context->user_data, &tmp_error); ensure_no_outstanding_subparser (context); if (tmp_error) { mark_error (context, tmp_error); g_propagate_error (error, tmp_error); } else { if (*context->iter == '>') { /* move after the close angle */ advance_char (context); context->state = STATE_AFTER_CLOSE_ANGLE; } else { gchar buf[8]; set_error (context, error, G_MARKUP_ERROR_PARSE, _("Odd character '%s', expected a '>' character " "to end the empty-element tag '%s'"), utf8_str (context->iter, buf), current_element (context)); } } pop_tag (context); } break; case STATE_INSIDE_OPEN_TAG_NAME: /* Possible next states: BETWEEN_ATTRIBUTES */ /* if there's a partial chunk then it's the first part of the * tag name. If there's a context->start then it's the start * of the tag name in current_text, the partial chunk goes * before that start though. */ advance_to_name_end (context); if (context->iter == context->current_text_end) { /* The name hasn't necessarily ended. Merge with * partial chunk, leave state unchanged. */ add_to_partial (context, context->start, context->iter); } else { /* The name has ended. Combine it with the partial chunk * if any; push it on the stack; enter next state. */ add_to_partial (context, context->start, context->iter); push_partial_as_tag (context); context->state = STATE_BETWEEN_ATTRIBUTES; context->start = NULL; } break; case STATE_INSIDE_ATTRIBUTE_NAME: /* Possible next states: AFTER_ATTRIBUTE_NAME */ advance_to_name_end (context); add_to_partial (context, context->start, context->iter); /* read the full name, if we enter the equals sign state * then add the attribute to the list (without the value), * otherwise store a partial chunk to be prepended later. */ if (context->iter != context->current_text_end) context->state = STATE_AFTER_ATTRIBUTE_NAME; break; case STATE_AFTER_ATTRIBUTE_NAME: /* Possible next states: AFTER_ATTRIBUTE_EQUALS_SIGN */ skip_spaces (context); if (context->iter != context->current_text_end) { /* The name has ended. Combine it with the partial chunk * if any; push it on the stack; enter next state. */ if (!name_validate (context, context->partial_chunk->str, error)) break; add_attribute (context, context->partial_chunk); context->partial_chunk = NULL; context->start = NULL; if (*context->iter == '=') { advance_char (context); context->state = STATE_AFTER_ATTRIBUTE_EQUALS_SIGN; } else { gchar buf[8]; set_error (context, error, G_MARKUP_ERROR_PARSE, _("Odd character '%s', expected a '=' after " "attribute name '%s' of element '%s'"), utf8_str (context->iter, buf), current_attribute (context), current_element (context)); } } break; case STATE_BETWEEN_ATTRIBUTES: /* Possible next states: AFTER_CLOSE_ANGLE, * AFTER_ELISION_SLASH, INSIDE_ATTRIBUTE_NAME */ skip_spaces (context); if (context->iter != context->current_text_end) { if (*context->iter == '/') { advance_char (context); context->state = STATE_AFTER_ELISION_SLASH; } else if (*context->iter == '>') { advance_char (context); context->state = STATE_AFTER_CLOSE_ANGLE; } else if (!IS_COMMON_NAME_END_CHAR (*(context->iter))) { context->state = STATE_INSIDE_ATTRIBUTE_NAME; /* start of attribute name */ context->start = context->iter; } else { gchar buf[8]; set_error (context, error, G_MARKUP_ERROR_PARSE, _("Odd character '%s', expected a '>' or '/' " "character to end the start tag of " "element '%s', or optionally an attribute; " "perhaps you used an invalid character in " "an attribute name"), utf8_str (context->iter, buf), current_element (context)); } /* If we're done with attributes, invoke * the start_element callback */ if (context->state == STATE_AFTER_ELISION_SLASH || context->state == STATE_AFTER_CLOSE_ANGLE) emit_start_element (context, error); } break; case STATE_AFTER_ATTRIBUTE_EQUALS_SIGN: /* Possible next state: INSIDE_ATTRIBUTE_VALUE_[SQ/DQ] */ skip_spaces (context); if (context->iter != context->current_text_end) { if (*context->iter == '"') { advance_char (context); context->state = STATE_INSIDE_ATTRIBUTE_VALUE_DQ; context->start = context->iter; } else if (*context->iter == '\'') { advance_char (context); context->state = STATE_INSIDE_ATTRIBUTE_VALUE_SQ; context->start = context->iter; } else { gchar buf[8]; set_error (context, error, G_MARKUP_ERROR_PARSE, _("Odd character '%s', expected an open quote mark " "after the equals sign when giving value for " "attribute '%s' of element '%s'"), utf8_str (context->iter, buf), current_attribute (context), current_element (context)); } } break; case STATE_INSIDE_ATTRIBUTE_VALUE_SQ: case STATE_INSIDE_ATTRIBUTE_VALUE_DQ: /* Possible next states: BETWEEN_ATTRIBUTES */ { gchar delim; if (context->state == STATE_INSIDE_ATTRIBUTE_VALUE_SQ) { delim = '\''; } else { delim = '"'; } do { if (*context->iter == delim) break; } while (advance_char (context)); } if (context->iter == context->current_text_end) { /* The value hasn't necessarily ended. Merge with * partial chunk, leave state unchanged. */ add_to_partial (context, context->start, context->iter); } else { gboolean is_ascii; /* The value has ended at the quote mark. Combine it * with the partial chunk if any; set it for the current * attribute. */ add_to_partial (context, context->start, context->iter); g_assert (context->cur_attr >= 0); if (unescape_gstring_inplace (context, context->partial_chunk, &is_ascii, error) && (is_ascii || text_validate (context, context->partial_chunk->str, context->partial_chunk->len, error))) { /* success, advance past quote and set state. */ context->attr_values[context->cur_attr] = context->partial_chunk; context->partial_chunk = NULL; advance_char (context); context->state = STATE_BETWEEN_ATTRIBUTES; context->start = NULL; } truncate_partial (context); } break; case STATE_INSIDE_TEXT: /* Possible next states: AFTER_OPEN_ANGLE */ do { if (*context->iter == '<') break; } while (advance_char (context)); /* The text hasn't necessarily ended. Merge with * partial chunk, leave state unchanged. */ add_to_partial (context, context->start, context->iter); if (context->iter != context->current_text_end) { gboolean is_ascii; /* The text has ended at the open angle. Call the text * callback. */ if (unescape_gstring_inplace (context, context->partial_chunk, &is_ascii, error) && (is_ascii || text_validate (context, context->partial_chunk->str, context->partial_chunk->len, error))) { GError *tmp_error = NULL; if (context->parser->text) (*context->parser->text) (context, context->partial_chunk->str, context->partial_chunk->len, context->user_data, &tmp_error); if (tmp_error == NULL) { /* advance past open angle and set state. */ advance_char (context); context->state = STATE_AFTER_OPEN_ANGLE; /* could begin a passthrough */ context->start = context->iter; } else propagate_error (context, error, tmp_error); } truncate_partial (context); } break; case STATE_AFTER_CLOSE_TAG_SLASH: /* Possible next state: INSIDE_CLOSE_TAG_NAME */ if (!IS_COMMON_NAME_END_CHAR (*(context->iter))) { context->state = STATE_INSIDE_CLOSE_TAG_NAME; /* start of tag name */ context->start = context->iter; } else { gchar buf[8]; set_error (context, error, G_MARKUP_ERROR_PARSE, _("'%s' is not a valid character following " "the characters 'iter, buf), utf8_str (context->iter, buf)); } break; case STATE_INSIDE_CLOSE_TAG_NAME: /* Possible next state: AFTER_CLOSE_TAG_NAME */ advance_to_name_end (context); add_to_partial (context, context->start, context->iter); if (context->iter != context->current_text_end) context->state = STATE_AFTER_CLOSE_TAG_NAME; break; case STATE_AFTER_CLOSE_TAG_NAME: /* Possible next state: AFTER_CLOSE_TAG_SLASH */ skip_spaces (context); if (context->iter != context->current_text_end) { GString *close_name; close_name = context->partial_chunk; context->partial_chunk = NULL; if (*context->iter != '>') { gchar buf[8]; set_error (context, error, G_MARKUP_ERROR_PARSE, _("'%s' is not a valid character following " "the close element name '%s'; the allowed " "character is '>'"), utf8_str (context->iter, buf), close_name->str); } else if (context->tag_stack == NULL) { set_error (context, error, G_MARKUP_ERROR_PARSE, _("Element '%s' was closed, no element " "is currently open"), close_name->str); } else if (strcmp (close_name->str, current_element (context)) != 0) { set_error (context, error, G_MARKUP_ERROR_PARSE, _("Element '%s' was closed, but the currently " "open element is '%s'"), close_name->str, current_element (context)); } else { GError *tmp_error; advance_char (context); context->state = STATE_AFTER_CLOSE_ANGLE; context->start = NULL; possibly_finish_subparser (context); /* call the end_element callback */ tmp_error = NULL; if (context->parser->end_element) (* context->parser->end_element) (context, close_name->str, context->user_data, &tmp_error); ensure_no_outstanding_subparser (context); pop_tag (context); if (tmp_error) propagate_error (context, error, tmp_error); } context->partial_chunk = close_name; truncate_partial (context); } break; case STATE_INSIDE_PASSTHROUGH: /* Possible next state: AFTER_CLOSE_ANGLE */ do { if (*context->iter == '<') context->balance++; if (*context->iter == '>') { gchar *str; gsize len; context->balance--; add_to_partial (context, context->start, context->iter); context->start = context->iter; str = context->partial_chunk->str; len = context->partial_chunk->len; if (str[1] == '?' && str[len - 1] == '?') break; if (strncmp (str, "B1------->B2-->B3--> * * IEEE Standard 754 Double Precision Storage Format (gdouble): * * 63 62 52 51 32 31 0 * +--------+----------------+----------------+ +---------------+ * | s 1bit | e[62:52] 11bit | f[51:32] 20bit | | f[31:0] 32bit | * +--------+----------------+----------------+ +---------------+ * B0--------------->B1---------->B2--->B3----> B4->B5->B6->B7-> */ /* subtract from biased_exponent to form base2 exponent (normal numbers) */ typedef union _GDoubleIEEE754 GDoubleIEEE754; typedef union _GFloatIEEE754 GFloatIEEE754; #define G_IEEE754_FLOAT_BIAS (127) #define G_IEEE754_DOUBLE_BIAS (1023) /* multiply with base2 exponent to get base10 exponent (normal numbers) */ #define G_LOG_2_BASE_10 (0.30102999566398119521) #if G_BYTE_ORDER == G_LITTLE_ENDIAN union _GFloatIEEE754 { gfloat v_float; struct { guint mantissa : 23; guint biased_exponent : 8; guint sign : 1; } mpn; }; union _GDoubleIEEE754 { gdouble v_double; struct { guint mantissa_low : 32; guint mantissa_high : 20; guint biased_exponent : 11; guint sign : 1; } mpn; }; #elif G_BYTE_ORDER == G_BIG_ENDIAN union _GFloatIEEE754 { gfloat v_float; struct { guint sign : 1; guint biased_exponent : 8; guint mantissa : 23; } mpn; }; union _GDoubleIEEE754 { gdouble v_double; struct { guint sign : 1; guint biased_exponent : 11; guint mantissa_high : 20; guint mantissa_low : 32; } mpn; }; #else /* !G_LITTLE_ENDIAN && !G_BIG_ENDIAN */ #error unknown ENDIAN type #endif /* !G_LITTLE_ENDIAN && !G_BIG_ENDIAN */ typedef struct _GTimeVal GTimeVal; struct _GTimeVal { glong tv_sec; glong tv_usec; }; G_END_DECLS /* We prefix variable declarations so they can * properly get exported in Windows DLLs. */ #ifndef GLIB_VAR # ifdef G_PLATFORM_WIN32 # ifdef GLIB_STATIC_COMPILATION # define GLIB_VAR extern # else /* !GLIB_STATIC_COMPILATION */ # ifdef GLIB_COMPILATION # ifdef DLL_EXPORT # define GLIB_VAR __declspec(dllexport) # else /* !DLL_EXPORT */ # define GLIB_VAR extern # endif /* !DLL_EXPORT */ # else /* !GLIB_COMPILATION */ # define GLIB_VAR extern __declspec(dllimport) # endif /* !GLIB_COMPILATION */ # endif /* !GLIB_STATIC_COMPILATION */ # else /* !G_PLATFORM_WIN32 */ # define GLIB_VAR _GLIB_EXTERN # endif /* !G_PLATFORM_WIN32 */ #endif /* GLIB_VAR */ #endif /* __G_TYPES_H__ */ pkg-config-0.29.1/glib/glib/gtestutils.c0000664000175000017500000030416112651243552014771 00000000000000/* GLib testing utilities * Copyright (C) 2007 Imendio AB * Authors: Tim Janik, Sven Herzberg * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "config.h" #include "gtestutils.h" #include "gmessages-private.h" #include "gfileutils.h" #include #ifdef G_OS_UNIX #include #include #include #include #endif #include #include #include #ifdef HAVE_UNISTD_H #include #endif #ifdef HAVE_SYS_RESOURCE_H #include #endif #ifdef G_OS_WIN32 #include #include #endif #include #include #ifdef HAVE_SYS_SELECT_H #include #endif /* HAVE_SYS_SELECT_H */ #include "gmain.h" #include "gpattern.h" #include "grand.h" #include "gstrfuncs.h" #include "gtimer.h" #include "gslice.h" #include "gspawn.h" #include "glib-private.h" #include "gmessages-private.h" /** * SECTION:testing * @title: Testing * @short_description: a test framework * @see_also: gtester, * gtester-report * * GLib provides a framework for writing and maintaining unit tests * in parallel to the code they are testing. The API is designed according * to established concepts found in the other test frameworks (JUnit, NUnit, * RUnit), which in turn is based on smalltalk unit testing concepts. * * * * Test case * Tests (test methods) are grouped together with their * fixture into test cases. * * * Fixture * A test fixture consists of fixture data and setup and * teardown methods to establish the environment for the test * functions. We use fresh fixtures, i.e. fixtures are newly set * up and torn down around each test invocation to avoid dependencies * between tests. * * * Test suite * Test cases can be grouped into test suites, to allow * subsets of the available tests to be run. Test suites can be * grouped into other test suites as well. * * * The API is designed to handle creation and registration of test suites * and test cases implicitly. A simple call like * |[ * g_test_add_func ("/misc/assertions", test_assertions); * ]| * creates a test suite called "misc" with a single test case named * "assertions", which consists of running the test_assertions function. * * In addition to the traditional g_assert(), the test framework provides * an extended set of assertions for string and numerical comparisons: * g_assert_cmpfloat(), g_assert_cmpint(), g_assert_cmpuint(), * g_assert_cmphex(), g_assert_cmpstr(). The advantage of these variants * over plain g_assert() is that the assertion messages can be more * elaborate, and include the values of the compared entities. * * GLib ships with two utilities called gtester and gtester-report to * facilitate running tests and producing nicely formatted test reports. */ /** * 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. * Exactly one of g_test_quick() and g_test_slow() is active in any run; * there is no "medium speed". * * Returns: %TRUE if in quick mode */ /** * g_test_slow: * * Returns %TRUE if tests are run in slow mode. * Exactly one of g_test_quick() and g_test_slow() is active in any run; * there is no "medium speed". * * Returns: the opposite of g_test_quick() */ /** * g_test_thorough: * * Returns %TRUE if tests are run in thorough mode, equivalent to * g_test_slow(). * * Returns: the same thing as g_test_slow() */ /** * g_test_perf: * * Returns %TRUE if tests are run in performance mode. * * Returns: %TRUE if in performance mode */ /** * g_test_undefined: * * Returns %TRUE if tests may provoke assertions and other formally-undefined * 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 */ /** * g_test_verbose: * * Returns %TRUE if tests are run in verbose mode. * The default is neither g_test_verbose() nor g_test_quiet(). * * Returns: %TRUE if in verbose mode */ /** * g_test_quiet: * * Returns %TRUE if tests are run in quiet mode. * The default is neither g_test_verbose() nor g_test_quiet(). * * Returns: %TRUE if in quiet mode */ /** * g_test_queue_unref: * @gobject: the object to unref * * Enqueue an object to be released with g_object_unref() during * the next teardown phase. This is equivalent to calling * g_test_queue_destroy() with a destroy callback of g_object_unref(). * * Since: 2.16 */ /** * GTestTrapFlags: * @G_TEST_TRAP_SILENCE_STDOUT: Redirect stdout of the test child to * /dev/null so it cannot be observed on the * console during test runs. The actual output is still captured * though to allow later tests with g_test_trap_assert_stdout(). * @G_TEST_TRAP_SILENCE_STDERR: Redirect stderr of the test child to * /dev/null so it cannot be observed on the * 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 * child process is shared with stdin of its parent process. * It is redirected to /dev/null 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 /dev/null. * @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 test subprocess passed. * See g_test_trap_subprocess(). * * Since: 2.16 */ /** * g_test_trap_assert_failed: * * 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_subprocess(), unless g_test_undefined() returns %TRUE * to indicate that undefined behaviour may be tested. * * Since: 2.16 */ /** * g_test_trap_assert_stdout: * @soutpattern: a glob-style * pattern * * Assert that the stdout output of the last test subprocess matches * @soutpattern. See g_test_trap_subprocess(). * * Since: 2.16 */ /** * g_test_trap_assert_stdout_unmatched: * @soutpattern: a glob-style * pattern * * Assert that the stdout output of the last test subprocess * does not match @soutpattern. See g_test_trap_subprocess(). * * Since: 2.16 */ /** * g_test_trap_assert_stderr: * @serrpattern: a glob-style * pattern * * 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 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 */ /** * g_test_trap_assert_stderr_unmatched: * @serrpattern: a glob-style * pattern * * Assert that the stderr output of the last test subprocess * does not match @serrpattern. See g_test_trap_subprocess(). * * Since: 2.16 */ /** * g_test_rand_bit: * * Get a reproducible random bit (0 or 1), see g_test_rand_int() * for details on test case random numbers. * * Since: 2.16 */ /** * g_assert: * @expr: the expression to check * * Debugging macro to terminate the application if the assertion * fails. If the assertion fails (i.e. the expression is not true), * an error message is logged and the application is terminated. * * The macro can be turned off in final releases of code by defining * G_DISABLE_ASSERT when compiling the application. */ /** * g_assert_not_reached: * * Debugging macro to terminate the application if it is ever * reached. If it is reached, an error message is logged and the * application is terminated. * * The macro can be turned off in final releases of code by defining * G_DISABLE_ASSERT when compiling the application. */ /** * 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 ==, !=, <, >, <=, >=. * @s2: another string (may be %NULL) * * 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 g_assert_cmpstr (s1, op, s2) is * the same as g_assert_true (g_strcmp0 (s1, s2) op 0). * The advantage of this macro is that it can produce a message that * includes the actual values of @s1 and @s2. * * |[ * g_assert_cmpstr (mystring, ==, "fubar"); * ]| * * Since: 2.16 */ /** * g_assert_cmpint: * @n1: an integer * @cmp: The comparison operator to use. * One of ==, !=, <, >, <=, >=. * @n2: another integer * * Debugging macro to compare two integers. * * The effect of g_assert_cmpint (n1, op, n2) is * the same as g_assert_true (n1 op n2). The advantage * of this macro is that it can produce a message that includes the * actual values of @n1 and @n2. * * Since: 2.16 */ /** * g_assert_cmpuint: * @n1: an unsigned integer * @cmp: The comparison operator to use. * One of ==, !=, <, >, <=, >=. * @n2: another unsigned integer * * Debugging macro to compare two unsigned integers. * * The effect of g_assert_cmpuint (n1, op, n2) is * the same as g_assert_true (n1 op n2). The advantage * of this macro is that it can produce a message that includes the * actual values of @n1 and @n2. * * Since: 2.16 */ /** * g_assert_cmphex: * @n1: an unsigned integer * @cmp: The comparison operator to use. * One of ==, !=, <, >, <=, >=. * @n2: another unsigned integer * * 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. * * Since: 2.16 */ /** * g_assert_cmpfloat: * @n1: an floating point number * @cmp: The comparison operator to use. * One of ==, !=, <, >, <=, >=. * @n2: another floating point number * * Debugging macro to compare two floating point numbers. * * The effect of g_assert_cmpfloat (n1, op, n2) is * the same as g_assert_true (n1 op n2). The advantage * of this macro is that it can produce a message that includes the * actual values of @n1 and @n2. * * Since: 2.16 */ /** * g_assert_no_error: * @err: a #GError, possibly %NULL * * Debugging macro to check that a #GError is not set. * * The effect of g_assert_no_error (err) is * the same as g_assert_true (err == NULL). The advantage * of this macro is that it can produce a message that includes * the error message and code. * * Since: 2.20 */ /** * g_assert_error: * @err: a #GError, possibly %NULL * @dom: the expected error domain (a #GQuark) * @c: the expected error code * * Debugging macro to check that a method has returned * the correct #GError. * * The effect of g_assert_error (err, dom, c) is * the same as g_assert_true (err != NULL && err->domain * == dom && err->code == c). The advantage of this * macro is that it can produce a message that includes the incorrect * error message and code. * * This can only be used to test for a specific error. If you want to * test that @err is set, but don't care what it's set to, just use * g_assert (err != NULL) * * Since: 2.20 */ /** * GTestCase: * * An opaque structure representing a test case. */ /** * GTestSuite: * * An opaque structure representing a test suite. */ /* Global variable for storing assertion messages; this is the counterpart to * glibc's (private) __abort_msg variable, and allows developers and crash * 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 { gchar *name; guint fixture_size; void (*fixture_setup) (void*, gconstpointer); void (*fixture_test) (void*, gconstpointer); void (*fixture_teardown) (void*, gconstpointer); gpointer test_data; }; struct GTestSuite { gchar *name; GSList *suites; GSList *cases; }; typedef struct DestroyEntry DestroyEntry; struct DestroyEntry { DestroyEntry *next; GDestroyNotify destroy_func; gpointer destroy_data; }; /* --- prototypes --- */ static void test_run_seed (const gchar *rseed); static void test_trap_clear (void); static guint8* g_test_log_dump (GTestLogMsg *msg, guint *len); static void gtest_default_log_handler (const gchar *log_domain, GLogLevelFlags log_level, const gchar *message, 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; static gboolean g_test_run_once = TRUE; 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 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; 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 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 */ FALSE, /* test_perf */ FALSE, /* test_verbose */ FALSE, /* test_quiet */ TRUE, /* test_undefined */ }; const GTestConfig * const g_test_config_vars = &mutable_test_config_vars; /* --- functions --- */ const char* g_test_log_type_name (GTestLogType log_type) { switch (log_type) { case G_TEST_LOG_NONE: return "none"; case G_TEST_LOG_ERROR: return "error"; case G_TEST_LOG_START_BINARY: return "binary"; case G_TEST_LOG_LIST_CASE: return "list"; case G_TEST_LOG_SKIP_CASE: return "skip"; case G_TEST_LOG_START_CASE: return "start"; case G_TEST_LOG_STOP_CASE: return "stop"; 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 "???"; } static void g_test_log_send (guint n_bytes, const guint8 *buffer) { if (test_log_fd >= 0) { int r; do r = write (test_log_fd, buffer, n_bytes); while (r < 0 && errno == EINTR); } if (test_debug_log) { GTestLogBuffer *lbuffer = g_test_log_buffer_new (); GTestLogMsg *msg; guint ui; g_test_log_buffer_push (lbuffer, n_bytes, buffer); msg = g_test_log_buffer_pop (lbuffer); g_warn_if_fail (msg != NULL); g_warn_if_fail (lbuffer->data->len == 0); g_test_log_buffer_free (lbuffer); /* print message */ g_printerr ("{*LOG(%s)", g_test_log_type_name (msg->log_type)); for (ui = 0; ui < msg->n_strings; ui++) g_printerr (":{%s}", msg->strings[ui]); if (msg->n_nums) { g_printerr (":("); for (ui = 0; ui < msg->n_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"); g_test_log_msg_free (msg); } } static void g_test_log (GTestLogType lbit, const gchar *string1, const gchar *string2, guint n_args, long double *largs) { gboolean fail; GTestLogMsg msg; gchar *astrings[3] = { NULL, NULL, NULL }; guint8 *dbuffer; guint32 dbufferlen; switch (lbit) { case G_TEST_LOG_START_BINARY: 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: 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) { if (test_tap_log) g_print ("Bail out!\n"); abort(); } break; case G_TEST_LOG_MIN_RESULT: 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 (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: 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: ; } msg.log_type = lbit; msg.n_strings = (string1 != NULL) + (string1 && string2); msg.strings = astrings; astrings[0] = (gchar*) string1; astrings[1] = astrings[0] ? (gchar*) string2 : NULL; msg.n_nums = n_args; msg.nums = largs; dbuffer = g_test_log_dump (&msg, &dbufferlen); g_test_log_send (dbufferlen, dbuffer); g_free (dbuffer); switch (lbit) { case G_TEST_LOG_START_CASE: 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); break; default: ; } } /* We intentionally parse the command line without GOptionContext * because otherwise you would never be able to test it. */ static void parse_args (gint *argc_p, gchar ***argv_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++) { if (strcmp (argv[i], "--g-fatal-warnings") == 0) { GLogLevelFlags fatal_mask = (GLogLevelFlags) g_log_set_always_fatal ((GLogLevelFlags) G_LOG_FATAL_MASK); fatal_mask = (GLogLevelFlags) (fatal_mask | G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL); g_log_set_always_fatal (fatal_mask); argv[i] = NULL; } else if (strcmp (argv[i], "--keep-going") == 0 || strcmp (argv[i], "-k") == 0) { test_mode_fatal = FALSE; argv[i] = NULL; } else if (strcmp (argv[i], "--debug-log") == 0) { 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; if (*equal == '=') test_log_fd = g_ascii_strtoull (equal + 1, NULL, 0); else if (i + 1 < argc) { argv[i++] = NULL; test_log_fd = g_ascii_strtoull (argv[i], NULL, 0); } argv[i] = NULL; } else if (strcmp ("--GTestSkipCount", argv[i]) == 0 || strncmp ("--GTestSkipCount=", argv[i], 17) == 0) { gchar *equal = argv[i] + 16; if (*equal == '=') test_skip_count = g_ascii_strtoull (equal + 1, NULL, 0); else if (i + 1 < argc) { argv[i++] = NULL; test_skip_count = g_ascii_strtoull (argv[i], NULL, 0); } 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; if (*equal == '=') test_paths = g_slist_prepend (test_paths, equal + 1); else if (i + 1 < argc) { argv[i++] = NULL; test_paths = g_slist_prepend (test_paths, argv[i]); } argv[i] = NULL; } else if (strcmp ("-s", argv[i]) == 0 || strncmp ("-s=", argv[i], 3) == 0) { gchar *equal = argv[i] + 2; if (*equal == '=') test_paths_skipped = g_slist_prepend (test_paths_skipped, equal + 1); else if (i + 1 < argc) { argv[i++] = NULL; test_paths_skipped = g_slist_prepend (test_paths_skipped, argv[i]); } argv[i] = NULL; } else if (strcmp ("-m", argv[i]) == 0 || strncmp ("-m=", argv[i], 3) == 0) { gchar *equal = argv[i] + 2; const gchar *mode = ""; if (*equal == '=') mode = equal + 1; else if (i + 1 < argc) { argv[i++] = NULL; mode = argv[i]; } if (strcmp (mode, "perf") == 0) mutable_test_config_vars.test_perf = TRUE; else if (strcmp (mode, "slow") == 0) mutable_test_config_vars.test_quick = FALSE; else if (strcmp (mode, "thorough") == 0) mutable_test_config_vars.test_quick = FALSE; else if (strcmp (mode, "quick") == 0) { mutable_test_config_vars.test_quick = TRUE; mutable_test_config_vars.test_perf = FALSE; } else if (strcmp (mode, "undefined") == 0) mutable_test_config_vars.test_undefined = TRUE; else if (strcmp (mode, "no-undefined") == 0) mutable_test_config_vars.test_undefined = FALSE; else g_error ("unknown test mode: -m %s", mode); argv[i] = NULL; } else if (strcmp ("-q", argv[i]) == 0 || strcmp ("--quiet", argv[i]) == 0) { mutable_test_config_vars.test_quiet = TRUE; mutable_test_config_vars.test_verbose = FALSE; argv[i] = NULL; } else if (strcmp ("--verbose", argv[i]) == 0) { mutable_test_config_vars.test_quiet = FALSE; mutable_test_config_vars.test_verbose = TRUE; argv[i] = NULL; } else if (strcmp ("-l", argv[i]) == 0) { test_run_list = TRUE; argv[i] = NULL; } else if (strcmp ("--seed", argv[i]) == 0 || strncmp ("--seed=", argv[i], 7) == 0) { gchar *equal = argv[i] + 6; if (*equal == '=') test_run_seedstr = equal + 1; else if (i + 1 < argc) { argv[i++] = NULL; test_run_seedstr = argv[i]; } argv[i] = NULL; } 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" " -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" " -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" " -q, --quiet Run tests quietly\n" " --verbose Run tests verbosely\n", argv[0]); exit (0); } } /* collapse argv */ e = 1; for (i = 1; i < argc; i++) if (argv[i]) { argv[e++] = argv[i]; if (i >= e) argv[i] = NULL; } *argc_p = e; } /** * g_test_init: * @argc: Address of the @argc parameter of the main() function. * Changed if any arguments were handled. * @argv: Address of the @argv parameter of main(). * Any parameters understood by g_test_init() stripped before return. * @...: Reserved for future extension. Currently, you must pass %NULL. * * Initialize the GLib testing framework, e.g. by seeding the * test random number generator, the name for g_get_prgname() * and parsing test related command line args. * So far, the following arguments are understood: * * * * * List test cases available in a test executable. * * * * * * Provide a random seed to reproduce test runs using random numbers. * * * * * Run tests verbosely. * * * , * Run tests quietly. * * * * * Execute all tests matching TESTPATH. * This can also be used to force a test to run that would otherwise * be skipped (ie, a test whose name contains "/subprocess"). * * * * * * Execute tests according to these test modes: * * * perf * * Performance tests, may take long and report results. * * * * slow, thorough * * Slow and thorough tests, may take quite long and * maximize coverage. * * * * quick * * Quick tests, should run really quickly and give good coverage. * * * * undefined * * 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 * * * * no-undefined * * Avoid tests for undefined behaviour * * * * * * * * Debug test logging output. * * * * Since: 2.16 */ void g_test_init (int *argc, char ***argv, ...) { static char seedstr[4 + 4 * 8 + 1]; va_list args; gpointer vararg1; /* make warnings and criticals fatal for all test programs */ GLogLevelFlags fatal_mask = (GLogLevelFlags) g_log_set_always_fatal ((GLogLevelFlags) G_LOG_FATAL_MASK); fatal_mask = (GLogLevelFlags) (fatal_mask | G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL); g_log_set_always_fatal (fatal_mask); /* check caller args */ g_return_if_fail (argc != NULL); g_return_if_fail (argv != NULL); g_return_if_fail (g_test_config_vars->test_initialized == FALSE); mutable_test_config_vars.test_initialized = TRUE; va_start (args, argv); vararg1 = va_arg (args, gpointer); /* reserved for future extensions */ va_end (args); g_return_if_fail (vararg1 == NULL); /* setup random seed string */ g_snprintf (seedstr, sizeof (seedstr), "R02S%08x%08x%08x%08x", g_random_int(), g_random_int(), g_random_int(), g_random_int()); test_run_seedstr = seedstr; /* parse args, sets up mode, changes seed, etc. */ parse_args (argc, argv); if (!g_get_prgname()) g_set_prgname ((*argv)[0]); /* verify GRand reliability, needed for reliable seeds */ if (1) { GRand *rg = g_rand_new_with_seed (0xc8c49fb6); guint32 t1 = g_rand_int (rg), t2 = g_rand_int (rg), t3 = g_rand_int (rg), t4 = g_rand_int (rg); /* g_print ("GRand-current: 0x%x 0x%x 0x%x 0x%x\n", t1, t2, t3, t4); */ if (t1 != 0xfab39f9b || t2 != 0xb948fb0e || t3 != 0x3d31be26 || t4 != 0x43a19d66) g_warning ("random numbers are not GRand-2.2 compatible, seeds may be broken (check $G_RANDOM_VERSION)"); g_rand_free (rg); } /* check rand seed */ test_run_seed (test_run_seedstr); /* 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 test_run_seed (const gchar *rseed) { guint seed_failed = 0; if (test_run_rand) g_rand_free (test_run_rand); test_run_rand = NULL; while (strchr (" \t\v\r\n\f", *rseed)) rseed++; if (strncmp (rseed, "R02S", 4) == 0) /* seed for random generator 02 (GRand-2.2) */ { const char *s = rseed + 4; if (strlen (s) >= 32) /* require 4 * 8 chars */ { guint32 seedarray[4]; gchar *p, hexbuf[9] = { 0, }; memcpy (hexbuf, s + 0, 8); seedarray[0] = g_ascii_strtoull (hexbuf, &p, 16); seed_failed += p != NULL && *p != 0; memcpy (hexbuf, s + 8, 8); seedarray[1] = g_ascii_strtoull (hexbuf, &p, 16); seed_failed += p != NULL && *p != 0; memcpy (hexbuf, s + 16, 8); seedarray[2] = g_ascii_strtoull (hexbuf, &p, 16); seed_failed += p != NULL && *p != 0; memcpy (hexbuf, s + 24, 8); seedarray[3] = g_ascii_strtoull (hexbuf, &p, 16); seed_failed += p != NULL && *p != 0; if (!seed_failed) { test_run_rand = g_rand_new_with_seed_array (seedarray, 4); return; } } } g_error ("Unknown or invalid random seed: %s", rseed); } /** * g_test_rand_int: * * Get a reproducible random integer number. * * The random numbers generated by the g_test_rand_*() family of functions * change with every new test program start, unless the --seed option is * given when starting test programs. * * For individual test cases however, the random number generator is * reseeded, to avoid dependencies between tests and to make --seed * effective for all test cases. * * Returns: a random number from the seeded random number generator. * * Since: 2.16 */ gint32 g_test_rand_int (void) { return g_rand_int (test_run_rand); } /** * g_test_rand_int_range: * @begin: the minimum value returned by this function * @end: the smallest value not to be returned by this function * * Get a reproducible random integer number out of a specified range, * see g_test_rand_int() for details on test case random numbers. * * Returns: a number with @begin <= number < @end. * * Since: 2.16 */ gint32 g_test_rand_int_range (gint32 begin, gint32 end) { return g_rand_int_range (test_run_rand, begin, end); } /** * g_test_rand_double: * * Get a reproducible random floating point number, * see g_test_rand_int() for details on test case random numbers. * * Returns: a random number from the seeded random number generator. * * Since: 2.16 */ double g_test_rand_double (void) { return g_rand_double (test_run_rand); } /** * g_test_rand_double_range: * @range_start: the minimum value returned by this function * @range_end: the minimum value not returned by this function * * Get a reproducible random floating pointer number out of a specified range, * see g_test_rand_int() for details on test case random numbers. * * Returns: a number with @range_start <= number < @range_end. * * Since: 2.16 */ double g_test_rand_double_range (double range_start, double range_end) { return g_rand_double_range (test_run_rand, range_start, range_end); } /** * g_test_timer_start: * * Start a timing test. Call g_test_timer_elapsed() when the task is supposed * to be done. Call this function again to restart the timer. * * Since: 2.16 */ void g_test_timer_start (void) { if (!test_user_timer) test_user_timer = g_timer_new(); test_user_stamp = 0; g_timer_start (test_user_timer); } /** * g_test_timer_elapsed: * * Get the time since the last start of the timer with g_test_timer_start(). * * Returns: the time since the last start of the timer, as a double * * Since: 2.16 */ double g_test_timer_elapsed (void) { test_user_stamp = test_user_timer ? g_timer_elapsed (test_user_timer, NULL) : 0; return test_user_stamp; } /** * g_test_timer_last: * * Report the last result of g_test_timer_elapsed(). * * Returns: the last result of g_test_timer_elapsed(), as a double * * Since: 2.16 */ double g_test_timer_last (void) { return test_user_stamp; } /** * g_test_minimized_result: * @minimized_quantity: the reported value * @format: the format string of the report message * @...: arguments to pass to the printf() function * * Report the result of a performance or measurement test. * The test should generally strive to minimize the reported * quantities (smaller values are better than larger ones), * this and @minimized_quantity can determine sorting * order for test result reports. * * Since: 2.16 */ void g_test_minimized_result (double minimized_quantity, const char *format, ...) { long double largs = minimized_quantity; gchar *buffer; va_list args; va_start (args, format); buffer = g_strdup_vprintf (format, args); va_end (args); g_test_log (G_TEST_LOG_MIN_RESULT, buffer, NULL, 1, &largs); g_free (buffer); } /** * g_test_maximized_result: * @maximized_quantity: the reported value * @format: the format string of the report message * @...: arguments to pass to the printf() function * * Report the result of a performance or measurement test. * The test should generally strive to maximize the reported * quantities (larger values are better than smaller ones), * this and @maximized_quantity can determine sorting * order for test result reports. * * Since: 2.16 */ void g_test_maximized_result (double maximized_quantity, const char *format, ...) { long double largs = maximized_quantity; gchar *buffer; va_list args; va_start (args, format); buffer = g_strdup_vprintf (format, args); va_end (args); g_test_log (G_TEST_LOG_MAX_RESULT, buffer, NULL, 1, &largs); g_free (buffer); } /** * g_test_message: * @format: the format string * @...: printf-like arguments to @format * * Add a message to the test report. * * Since: 2.16 */ void g_test_message (const char *format, ...) { gchar *buffer; va_list args; va_start (args, format); buffer = g_strdup_vprintf (format, args); va_end (args); g_test_log (G_TEST_LOG_MESSAGE, buffer, NULL, 0, NULL); g_free (buffer); } /** * g_test_bug_base: * @uri_pattern: the base pattern for bug URIs * * Specify the base URI for bug reports. * * The base URI is used to construct bug report messages for * g_test_message() when g_test_bug() is called. * Calling this function outside of a test case sets the * default base URI for all test cases. Calling it from within * a test case changes the base URI for the scope of the test * case only. * Bug URIs are constructed by appending a bug specific URI * portion to @uri_pattern, or by replacing the special string * '\%s' within @uri_pattern if that is present. * * Since: 2.16 */ void g_test_bug_base (const char *uri_pattern) { g_free (test_uri_base); test_uri_base = g_strdup (uri_pattern); } /** * g_test_bug: * @bug_uri_snippet: Bug specific bug tracker URI portion. * * This function adds a message to test reports that * associates a bug URI with a test case. * Bug URIs are constructed from a base URI set with g_test_bug_base() * and @bug_uri_snippet. * * Since: 2.16 */ void g_test_bug (const char *bug_uri_snippet) { char *c; g_return_if_fail (test_uri_base != NULL); g_return_if_fail (bug_uri_snippet != NULL); c = strstr (test_uri_base, "%s"); if (c) { char *b = g_strndup (test_uri_base, c - test_uri_base); char *s = g_strconcat (b, bug_uri_snippet, c + 2, NULL); g_free (b); g_test_message ("Bug Reference: %s", s); g_free (s); } else g_test_message ("Bug Reference: %s%s", test_uri_base, bug_uri_snippet); } /** * g_test_get_root: * * Get the toplevel test suite for the test path API. * * Returns: the toplevel #GTestSuite * * Since: 2.16 */ GTestSuite* g_test_get_root (void) { if (!test_suite_root) { test_suite_root = g_test_create_suite ("root"); g_free (test_suite_root->name); test_suite_root->name = g_strdup (""); } return test_suite_root; } /** * g_test_run: * * Runs all tests under the toplevel suite which can be retrieved * with g_test_get_root(). Similar to g_test_run_suite(), the test * cases to be run are filtered according to * test path arguments (-p testpath) as * parsed by g_test_init(). * g_test_run_suite() or g_test_run() may only be called once * in a program. * * Returns: 0 on success * * Since: 2.16 */ int g_test_run (void) { return g_test_run_suite (g_test_get_root()); } /** * g_test_create_case: * @test_name: the name for the test case * @data_size: the size of the fixture data structure * @test_data: test data argument for the test functions * @data_setup: the function to set up the fixture data * @data_test: the actual test function * @data_teardown: the function to teardown the fixture data * * Create a new #GTestCase, named @test_name, this API is fairly * low level, calling g_test_add() or g_test_add_func() is preferable. * When this test is executed, a fixture structure of size @data_size * will be allocated and filled with 0s. Then @data_setup is called * to initialize the fixture. After fixture setup, the actual test * function @data_test is called. Once the test run completed, the * fixture structure is torn down by calling @data_teardown and * after that the memory is released. * * Splitting up a test run into fixture setup, test function and * fixture teardown is most usful if the same fixture is used for * multiple tests. In this cases, g_test_create_case() will be * called with the same fixture, but varying @test_name and * @data_test arguments. * * Returns: a newly allocated #GTestCase. * * Since: 2.16 */ GTestCase* g_test_create_case (const char *test_name, gsize data_size, gconstpointer test_data, GTestFixtureFunc data_setup, GTestFixtureFunc data_test, GTestFixtureFunc data_teardown) { GTestCase *tc; g_return_val_if_fail (test_name != NULL, NULL); g_return_val_if_fail (strchr (test_name, '/') == NULL, NULL); g_return_val_if_fail (test_name[0] != 0, NULL); g_return_val_if_fail (data_test != NULL, NULL); tc = g_slice_new0 (GTestCase); tc->name = g_strdup (test_name); tc->test_data = (gpointer) test_data; tc->fixture_size = data_size; tc->fixture_setup = (void*) data_setup; tc->fixture_test = (void*) data_test; tc->fixture_teardown = (void*) data_teardown; 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 * @user_data: the data provided when registering the test * * The type used for functions that operate on test fixtures. This is * used for the fixture setup and teardown functions as well as for the * testcases themselves. * * @user_data is a pointer to the data that was given when registering * the test case. * * @fixture will be a pointer to the area of memory allocated by the * test framework, of the size requested. If the requested size was * zero then @fixture will be equal to @user_data. * * Since: 2.28 */ void g_test_add_vtable (const char *testpath, gsize data_size, gconstpointer test_data, GTestFixtureFunc data_setup, GTestFixtureFunc fixture_test_func, GTestFixtureFunc data_teardown) { gchar **segments; guint ui; GTestSuite *suite; g_return_if_fail (testpath != NULL); g_return_if_fail (g_path_is_absolute (testpath)); g_return_if_fail (fixture_test_func != NULL); if (g_slist_find_custom (test_paths_skipped, testpath, (GCompareFunc)g_strcmp0)) return; suite = g_test_get_root(); segments = g_strsplit (testpath, "/", -1); for (ui = 0; segments[ui] != NULL; ui++) { const char *seg = segments[ui]; gboolean islast = segments[ui + 1] == NULL; if (islast && !seg[0]) g_error ("invalid test case path: %s", testpath); else if (!seg[0]) continue; /* initial or duplicate slash */ else if (!islast) { 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 */ { GTestCase *tc = g_test_create_case (seg, data_size, test_data, data_setup, fixture_test_func, data_teardown); g_test_suite_add (suite, tc); } } g_strfreev (segments); } /** * g_test_fail: * * Indicates that a test failed. This function can be called * multiple times from the same test. You can use this function * if your test failed in a recoverable way. * * Do not use this function if the failure of a test could cause * other tests to malfunction. * * 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.30 **/ void g_test_fail (void) { 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; } /** * GTestFunc: * * The type used for test case functions. * * Since: 2.28 */ /** * g_test_add_func: * @testpath: /-separated test case path name for the test. * @test_func: The test function to invoke for this test. * * Create a new test case, similar to g_test_create_case(). However * the test is assumed to use no fixture, and test suites are automatically * 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 command-line option or * g_test_trap_subprocess(). * * Since: 2.16 */ void g_test_add_func (const char *testpath, GTestFunc test_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, NULL, NULL, (GTestFixtureFunc) test_func, NULL); } /** * GTestDataFunc: * @user_data: the data provided when registering the test * * The type used for test case functions that take an extra pointer * argument. * * Since: 2.28 */ /** * g_test_add_data_func: * @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. * * Create a new test case, similar to g_test_create_case(). However * the test is assumed to use no fixture, and test suites are automatically * created on the fly and added to the root fixture, based on the * 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 command-line option or * g_test_trap_subprocess(). * * Since: 2.16 */ void g_test_add_data_func (const char *testpath, gconstpointer test_data, GTestDataFunc test_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, 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 * * Create a new test suite with the name @suite_name. * * Returns: A newly allocated #GTestSuite instance. * * Since: 2.16 */ GTestSuite* g_test_create_suite (const char *suite_name) { GTestSuite *ts; g_return_val_if_fail (suite_name != NULL, NULL); g_return_val_if_fail (strchr (suite_name, '/') == NULL, NULL); g_return_val_if_fail (suite_name[0] != 0, NULL); ts = g_slice_new0 (GTestSuite); ts->name = g_strdup (suite_name); return ts; } /** * g_test_suite_add: * @suite: a #GTestSuite * @test_case: a #GTestCase * * Adds @test_case to @suite. * * Since: 2.16 */ void g_test_suite_add (GTestSuite *suite, GTestCase *test_case) { g_return_if_fail (suite != NULL); g_return_if_fail (test_case != NULL); suite->cases = g_slist_prepend (suite->cases, test_case); } /** * g_test_suite_add_suite: * @suite: a #GTestSuite * @nestedsuite: another #GTestSuite * * Adds @nestedsuite to @suite. * * Since: 2.16 */ void g_test_suite_add_suite (GTestSuite *suite, GTestSuite *nestedsuite) { g_return_if_fail (suite != NULL); g_return_if_fail (nestedsuite != NULL); suite->suites = g_slist_prepend (suite->suites, nestedsuite); } /** * g_test_queue_free: * @gfree_pointer: the pointer to be stored. * * Enqueue a pointer to be released with g_free() during the next * teardown phase. This is equivalent to calling g_test_queue_destroy() * with a destroy callback of g_free(). * * Since: 2.16 */ void g_test_queue_free (gpointer gfree_pointer) { if (gfree_pointer) g_test_queue_destroy (g_free, gfree_pointer); } /** * g_test_queue_destroy: * @destroy_func: Destroy callback for teardown phase. * @destroy_data: Destroy callback data. * * This function enqueus a callback @destroy_func to be executed * during the next test case teardown phase. This is most useful * to auto destruct allocted test resources at the end of a test run. * Resources are released in reverse queue order, that means enqueueing * callback A before callback B will cause B() to be called before * A() during teardown. * * Since: 2.16 */ void g_test_queue_destroy (GDestroyNotify destroy_func, gpointer destroy_data) { DestroyEntry *dentry; g_return_if_fail (destroy_func != NULL); dentry = g_slice_new0 (DestroyEntry); dentry->destroy_func = destroy_func; dentry->destroy_data = destroy_data; dentry->next = test_destroy_queue; test_destroy_queue = dentry; } static gboolean test_case_run (GTestCase *tc) { gchar *old_name = test_run_name, *old_base = g_strdup (test_uri_base); 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) { g_print ("%s\n", test_run_name); g_test_log (G_TEST_LOG_LIST_CASE, test_run_name, NULL, 0, NULL); } else { GTimer *test_run_timer = g_timer_new(); long double largs[3]; void *fixture; g_test_log (G_TEST_LOG_START_CASE, test_run_name, NULL, 0, NULL); test_run_forks = 0; 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; test_run_seed (test_run_seedstr); if (tc->fixture_setup) tc->fixture_setup (fixture, tc->test_data); tc->fixture_test (fixture, tc->test_data); test_trap_clear(); while (test_destroy_queue) { DestroyEntry *dentry = test_destroy_queue; test_destroy_queue = dentry->next; dentry->destroy_func (dentry->destroy_data); g_slice_free (DestroyEntry, dentry); } if (tc->fixture_teardown) tc->fixture_teardown (fixture, tc->test_data); if (tc->fixture_size) g_free (fixture); g_timer_stop (test_run_timer); success = test_run_success; 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, 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 == G_TEST_RUN_SUCCESS; } static int g_test_run_suite_internal (GTestSuite *suite, const char *path) { guint n_bad = 0, l; gchar *rest, *old_name = test_run_name; GSList *slist, *reversed; 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); rest = strchr (path, '/'); l = rest ? MIN (l, rest - path) : l; test_run_name = suite->name[0] == 0 ? g_strdup (test_run_name) : g_strconcat (old_name, "/", suite->name, NULL); reversed = g_slist_reverse (g_slist_copy (suite->cases)); for (slist = reversed; slist; slist = slist->next) { GTestCase *tc = slist->data; guint n = l ? strlen (tc->name) : 0; if (l == n && !rest && strncmp (path, tc->name, n) == 0) { if (!test_case_run (tc)) n_bad++; } } g_slist_free (reversed); reversed = g_slist_reverse (g_slist_copy (suite->suites)); for (slist = reversed; slist; slist = slist->next) { GTestSuite *ts = slist->data; guint n = l ? strlen (ts->name) : 0; if (l == n && strncmp (path, ts->name, n) == 0) n_bad += g_test_run_suite_internal (ts, rest ? rest : ""); } g_slist_free (reversed); 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; } /** * g_test_run_suite: * @suite: a #GTestSuite * * Execute the tests within @suite and all nested #GTestSuites. * The test suites to be executed are filtered according to * test path arguments (-p testpath) * as parsed by g_test_init(). * g_test_run_suite() or g_test_run() may only be called once * in a program. * * Returns: 0 on success * * Since: 2.16 */ 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); g_return_val_if_fail (g_test_run_once == TRUE, -1); g_test_run_once = FALSE; 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 = my_test_paths->data; guint l, n = strlen (suite->name); my_test_paths = g_slist_delete_link (my_test_paths, my_test_paths); while (path[0] == '/') path++; if (!n) /* root suite, run unconditionally */ { n_bad += g_test_run_suite_internal (suite, path); continue; } /* regular suite, match path */ rest = strchr (path, '/'); l = strlen (path); l = rest ? MIN (l, rest - path) : l; if ((!l || l == n) && strncmp (path, suite->name, n) == 0) n_bad += g_test_run_suite_internal (suite, rest ? rest : ""); } return n_bad; } static void gtest_default_log_handler (const gchar *log_domain, GLogLevelFlags log_level, const gchar *message, gpointer unused_data) { const gchar *strv[16]; gboolean fatal = FALSE; gchar *msg; guint i = 0; if (log_domain) { strv[i++] = log_domain; strv[i++] = "-"; } if (log_level & G_LOG_FLAG_FATAL) { strv[i++] = "FATAL-"; fatal = TRUE; } if (log_level & G_LOG_FLAG_RECURSION) strv[i++] = "RECURSIVE-"; if (log_level & G_LOG_LEVEL_ERROR) strv[i++] = "ERROR"; if (log_level & G_LOG_LEVEL_CRITICAL) strv[i++] = "CRITICAL"; if (log_level & G_LOG_LEVEL_WARNING) strv[i++] = "WARNING"; if (log_level & G_LOG_LEVEL_MESSAGE) strv[i++] = "MESSAGE"; if (log_level & G_LOG_LEVEL_INFO) strv[i++] = "INFO"; if (log_level & G_LOG_LEVEL_DEBUG) strv[i++] = "DEBUG"; strv[i++] = ": "; strv[i++] = message; strv[i++] = NULL; msg = g_strjoinv ("", (gchar**) strv); g_test_log (fatal ? G_TEST_LOG_ERROR : G_TEST_LOG_MESSAGE, msg, NULL, 0, NULL); g_log_default_handler (log_domain, log_level, message, unused_data); g_free (msg); } void g_assertion_message (const char *domain, const char *file, int line, const char *func, const char *message) { char lstr[32]; char *s; if (!message) message = "code should not be reached"; g_snprintf (lstr, 32, "%d", line); s = g_strconcat (domain ? domain : "", domain && domain[0] ? ":" : "", "ERROR:", file, ":", lstr, ":", func, func[0] ? ":" : "", " ", message, NULL); g_printerr ("**\n%s\n", s); /* store assertion message in global variable, so that it can be found in a * core dump */ if (__glib_assert_msg != NULL) /* free the old one */ free (__glib_assert_msg); __glib_assert_msg = (char*) malloc (strlen (s) + 1); strcpy (__glib_assert_msg, s); g_test_log (G_TEST_LOG_ERROR, s, NULL, 0, NULL); g_free (s); _g_log_abort (); } void g_assertion_message_expr (const char *domain, const char *file, int line, const char *func, const char *expr) { 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 g_assertion_message_cmpnum (const char *domain, const char *file, int line, const char *func, const char *expr, long double arg1, const char *cmp, long double arg2, char numtype) { char *s = NULL; switch (numtype) { 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): (%.9g %s %.9g)", expr, (double) arg1, cmp, (double) arg2); break; /* ideally use: floats=%.7g double=%.17g */ } g_assertion_message (domain, file, line, func, s); g_free (s); } void g_assertion_message_cmpstr (const char *domain, const char *file, int line, const char *func, const char *expr, const char *arg1, const char *cmp, const char *arg2) { char *a1, *a2, *s, *t1 = NULL, *t2 = NULL; a1 = arg1 ? g_strconcat ("\"", t1 = g_strescape (arg1, NULL), "\"", NULL) : g_strdup ("NULL"); a2 = arg2 ? g_strconcat ("\"", t2 = g_strescape (arg2, NULL), "\"", NULL) : g_strdup ("NULL"); g_free (t1); g_free (t2); s = g_strdup_printf ("assertion failed (%s): (%s %s %s)", expr, a1, cmp, a2); g_free (a1); g_free (a2); g_assertion_message (domain, file, line, func, s); g_free (s); } void g_assertion_message_error (const char *domain, const char *file, int line, const char *func, const char *expr, const GError *error, GQuark error_domain, int error_code) { GString *gstring; /* This is used by both g_assert_error() and g_assert_no_error(), so there * are three cases: expected an error but got the wrong error, expected * an error but got no error, and expected no error but got an error. */ gstring = g_string_new ("assertion failed "); if (error_domain) g_string_append_printf (gstring, "(%s == (%s, %d)): ", expr, g_quark_to_string (error_domain), error_code); else g_string_append_printf (gstring, "(%s == NULL): ", expr); if (error) g_string_append_printf (gstring, "%s (%s, %d)", error->message, g_quark_to_string (error->domain), error->code); else g_string_append_printf (gstring, "%s is NULL", expr); g_assertion_message (domain, file, line, func, gstring->str); g_string_free (gstring, TRUE); } /** * g_strcmp0: * @str1: (allow-none): a C string or %NULL * @str2: (allow-none): another C string or %NULL * * Compares @str1 and @str2 like strcmp(). Handles %NULL * gracefully by sorting it before non-%NULL strings. * Comparing two %NULL pointers returns 0. * * Returns: an integer less than, equal to, or greater than zero, if @str1 is <, == or > than @str2. * * Since: 2.16 */ int g_strcmp0 (const char *str1, const char *str2) { if (!str1) return -(str1 != str2); if (!str2) return str1 != str2; return strcmp (str1, str2); } static void test_trap_clear (void) { test_trap_last_status = 0; test_trap_last_pid = 0; 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 static int sane_dup2 (int fd1, int fd2) { int ret; do ret = dup2 (fd1, fd2); while (ret < 0 && errno == EINTR); return ret; } #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) { 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. * * 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. * * In the following example, the test code forks, the forked child * process produces some sample output and exits successfully. * The forking parent process then asserts successful child program * termination and validates child program outputs. * * |[ * static void * test_fork_patterns (void) * { * if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDOUT | G_TEST_TRAP_SILENCE_STDERR)) * { * g_print ("some stdout text: somagic17\n"); * g_printerr ("some stderr text: semagic43\n"); * exit (0); /* successful test run */ * } * g_test_trap_assert_passed (); * g_test_trap_assert_stdout ("*somagic17*"); * g_test_trap_assert_stderr ("*semagic43*"); * } * ]| * * 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 int stdout_pipe[2] = { -1, -1 }; int stderr_pipe[2] = { -1, -1 }; test_trap_clear(); if (pipe (stdout_pipe) < 0 || pipe (stderr_pipe) < 0) g_error ("failed to create pipes to fork test program: %s", g_strerror (errno)); test_trap_last_pid = fork (); if (test_trap_last_pid < 0) g_error ("failed to fork test program: %s", g_strerror (errno)); if (test_trap_last_pid == 0) /* child */ { int fd0 = -1; close (stdout_pipe[0]); close (stderr_pipe[0]); if (!(test_trap_flags & G_TEST_TRAP_INHERIT_STDIN)) 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) close (fd0); if (stdout_pipe[1] >= 3) close (stdout_pipe[1]); if (stderr_pipe[1] >= 3) close (stderr_pipe[1]); return TRUE; } else /* parent */ { test_run_forks++; close (stdout_pipe[1]); close (stderr_pipe[1]); 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 g_message ("Not implemented: g_test_trap_fork"); return FALSE; #endif } /** * 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 "/subprocess/" and then a name * for the specific subtest (or just ending with * "/subprocess" 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 main () 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 * my_object_new(1000000) 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); * /* Because of the '/subprocess' in the name, this test will * * not be run by the g_test_run () call below. * */ * 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_subprocess() call. * * Returns: %TRUE if the last test subprocess terminated successfully. * * Since: 2.16 */ gboolean g_test_trap_has_passed (void) { return test_trap_last_status == 0; /* exit_status == 0 && !signal && !coredump */ } /** * g_test_trap_reached_timeout: * * Check the result of the last g_test_trap_subprocess() call. * * Returns: %TRUE if the last test subprocess got killed due to a timeout. * * Since: 2.16 */ gboolean g_test_trap_reached_timeout (void) { return test_trap_last_status != G_TEST_STATUS_TIMED_OUT; } 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) { 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"; 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 (%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 (%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 (%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 (%s) %s: %s", process_id, match_error, stderr_pattern); g_assertion_message (domain, file, line, func, msg); g_free (msg); } g_free (process_id); } static void gstring_overwrite_int (GString *gstring, guint pos, guint32 vuint) { vuint = g_htonl (vuint); g_string_overwrite_len (gstring, pos, (const gchar*) &vuint, 4); } static void gstring_append_int (GString *gstring, guint32 vuint) { vuint = g_htonl (vuint); g_string_append_len (gstring, (const gchar*) &vuint, 4); } static void gstring_append_double (GString *gstring, double vdouble) { union { double vdouble; guint64 vuint64; } u; u.vdouble = vdouble; u.vuint64 = GUINT64_TO_BE (u.vuint64); g_string_append_len (gstring, (const gchar*) &u.vuint64, 8); } static guint8* g_test_log_dump (GTestLogMsg *msg, guint *len) { GString *gstring = g_string_sized_new (1024); guint ui; gstring_append_int (gstring, 0); /* message length */ gstring_append_int (gstring, msg->log_type); gstring_append_int (gstring, msg->n_strings); gstring_append_int (gstring, msg->n_nums); gstring_append_int (gstring, 0); /* reserved */ for (ui = 0; ui < msg->n_strings; ui++) { guint l = strlen (msg->strings[ui]); gstring_append_int (gstring, l); g_string_append_len (gstring, msg->strings[ui], l); } for (ui = 0; ui < msg->n_nums; ui++) gstring_append_double (gstring, msg->nums[ui]); *len = gstring->len; gstring_overwrite_int (gstring, 0, *len); /* message length */ return (guint8*) g_string_free (gstring, FALSE); } static inline long double net_double (const gchar **ipointer) { union { guint64 vuint64; double vdouble; } u; guint64 aligned_int64; memcpy (&aligned_int64, *ipointer, 8); *ipointer += 8; u.vuint64 = GUINT64_FROM_BE (aligned_int64); return u.vdouble; } static inline guint32 net_int (const gchar **ipointer) { guint32 aligned_int; memcpy (&aligned_int, *ipointer, 4); *ipointer += 4; return g_ntohl (aligned_int); } static gboolean g_test_log_extract (GTestLogBuffer *tbuffer) { const gchar *p = tbuffer->data->str; GTestLogMsg msg; guint mlength; if (tbuffer->data->len < 4 * 5) return FALSE; mlength = net_int (&p); if (tbuffer->data->len < mlength) return FALSE; msg.log_type = net_int (&p); msg.n_strings = net_int (&p); msg.n_nums = net_int (&p); if (net_int (&p) == 0) { guint ui; msg.strings = g_new0 (gchar*, msg.n_strings + 1); msg.nums = g_new0 (long double, msg.n_nums); for (ui = 0; ui < msg.n_strings; ui++) { guint sl = net_int (&p); msg.strings[ui] = g_strndup (p, sl); p += sl; } for (ui = 0; ui < msg.n_nums; ui++) msg.nums[ui] = net_double (&p); if (p <= tbuffer->data->str + mlength) { g_string_erase (tbuffer->data, 0, mlength); tbuffer->msgs = g_slist_prepend (tbuffer->msgs, g_memdup (&msg, sizeof (msg))); return TRUE; } } g_free (msg.nums); g_strfreev (msg.strings); g_error ("corrupt log stream from test program"); return FALSE; } /** * g_test_log_buffer_new: * * Internal function for gtester to decode test log messages, no ABI guarantees provided. */ GTestLogBuffer* g_test_log_buffer_new (void) { GTestLogBuffer *tb = g_new0 (GTestLogBuffer, 1); tb->data = g_string_sized_new (1024); return tb; } /** * g_test_log_buffer_free: * * Internal function for gtester to free test log messages, no ABI guarantees provided. */ void g_test_log_buffer_free (GTestLogBuffer *tbuffer) { g_return_if_fail (tbuffer != NULL); while (tbuffer->msgs) g_test_log_msg_free (g_test_log_buffer_pop (tbuffer)); g_string_free (tbuffer->data, TRUE); g_free (tbuffer); } /** * g_test_log_buffer_push: * * Internal function for gtester to decode test log messages, no ABI guarantees provided. */ void g_test_log_buffer_push (GTestLogBuffer *tbuffer, guint n_bytes, const guint8 *bytes) { g_return_if_fail (tbuffer != NULL); if (n_bytes) { gboolean more_messages; g_return_if_fail (bytes != NULL); g_string_append_len (tbuffer->data, (const gchar*) bytes, n_bytes); do more_messages = g_test_log_extract (tbuffer); while (more_messages); } } /** * g_test_log_buffer_pop: * * Internal function for gtester to retrieve test log messages, no ABI guarantees provided. */ GTestLogMsg* g_test_log_buffer_pop (GTestLogBuffer *tbuffer) { GTestLogMsg *msg = NULL; g_return_val_if_fail (tbuffer != NULL, NULL); if (tbuffer->msgs) { GSList *slist = g_slist_last (tbuffer->msgs); msg = slist->data; tbuffer->msgs = g_slist_delete_link (tbuffer->msgs, slist); } return msg; } /** * g_test_log_msg_free: * * Internal function for gtester to free test log messages, no ABI guarantees provided. */ void g_test_log_msg_free (GTestLogMsg *tmsg) { g_return_if_fail (tmsg != NULL); g_strfreev (tmsg->strings); g_free (tmsg->nums); 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 * DIST_EXTRA or dist_schema_DATA * sense, in which case they will always be in the srcdir) or built (in * the BUILT_SOURCES 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: * @testpath: The test path for a new test case. * @Fixture: The type of a fixture data structure. * @tdata: Data argument for the test functions. * @fsetup: The function to set up the fixture data. * @ftest: The actual test function. * @fteardown: The function to tear down the fixture data. * * Hook up a new test case at @testpath, similar to g_test_add_func(). * A fixture data structure with setup and teardown function may be provided * though, similar to g_test_create_case(). * g_test_add() is implemented as a macro, so that the fsetup(), ftest() and * fteardown() callbacks can expect a @Fixture pointer as first argument in * a type safe manner. * * Since: 2.16 **/ /* --- macros docs END --- */ pkg-config-0.29.1/glib/glib/glist.h0000664000175000017500000001340412651243552013706 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the GLib Team and others 1997-2000. See the AUTHORS * file for a list of people on the GLib Team. See the ChangeLog * files for a list of changes. These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/. */ #ifndef __G_LIST_H__ #define __G_LIST_H__ #if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) #error "Only can be included directly." #endif #include #include G_BEGIN_DECLS typedef struct _GList GList; struct _GList { gpointer data; GList *next; GList *prev; }; /* 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); #define g_list_previous(list) ((list) ? (((GList *)(list))->prev) : NULL) #define g_list_next(list) ((list) ? (((GList *)(list))->next) : NULL) G_END_DECLS #endif /* __G_LIST_H__ */ pkg-config-0.29.1/glib/glib/gvarianttype.h0000664000175000017500000003162412651243552015305 00000000000000/* * Copyright © 2007, 2008 Ryan Lortie * Copyright © 2009, 2010 Codethink Limited * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the licence, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * * Author: Ryan Lortie */ #ifndef __G_VARIANT_TYPE_H__ #define __G_VARIANT_TYPE_H__ #if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) #error "Only can be included directly." #endif #include #include G_BEGIN_DECLS /** * GVariantType: * * A type in the GVariant type system. * * Two types may not be compared by value; use g_variant_type_equal() or * g_variant_type_is_subtype_of(). May be copied using * g_variant_type_copy() and freed using g_variant_type_free(). **/ typedef struct _GVariantType GVariantType; /** * G_VARIANT_TYPE_BOOLEAN: * * The type of a value that can be either %TRUE or %FALSE. **/ #define G_VARIANT_TYPE_BOOLEAN ((const GVariantType *) "b") /** * G_VARIANT_TYPE_BYTE: * * The type of an integer value that can range from 0 to 255. **/ #define G_VARIANT_TYPE_BYTE ((const GVariantType *) "y") /** * G_VARIANT_TYPE_INT16: * * The type of an integer value that can range from -32768 to 32767. **/ #define G_VARIANT_TYPE_INT16 ((const GVariantType *) "n") /** * G_VARIANT_TYPE_UINT16: * * The type of an integer value that can range from 0 to 65535. * There were about this many people living in Toronto in the 1870s. **/ #define G_VARIANT_TYPE_UINT16 ((const GVariantType *) "q") /** * G_VARIANT_TYPE_INT32: * * The type of an integer value that can range from -2147483648 to * 2147483647. **/ #define G_VARIANT_TYPE_INT32 ((const GVariantType *) "i") /** * G_VARIANT_TYPE_UINT32: * * The type of an integer value that can range from 0 to 4294967295. * That's one number for everyone who was around in the late 1970s. **/ #define G_VARIANT_TYPE_UINT32 ((const GVariantType *) "u") /** * G_VARIANT_TYPE_INT64: * * The type of an integer value that can range from * -9223372036854775808 to 9223372036854775807. **/ #define G_VARIANT_TYPE_INT64 ((const GVariantType *) "x") /** * G_VARIANT_TYPE_UINT64: * * The type of an integer value that can range from 0 to * 18446744073709551616. That's a really big number, but a Rubik's * cube can have a bit more than twice as many possible positions. **/ #define G_VARIANT_TYPE_UINT64 ((const GVariantType *) "t") /** * G_VARIANT_TYPE_DOUBLE: * * The type of a double precision IEEE754 floating point number. * These guys go up to about 1.80e308 (plus and minus) but miss out on * some numbers in between. In any case, that's far greater than the * estimated number of fundamental particles in the observable * universe. **/ #define G_VARIANT_TYPE_DOUBLE ((const GVariantType *) "d") /** * G_VARIANT_TYPE_STRING: * * The type of a string. "" is a string. %NULL is not a string. **/ #define G_VARIANT_TYPE_STRING ((const GVariantType *) "s") /** * G_VARIANT_TYPE_OBJECT_PATH: * * The type of a D-Bus object reference. These are strings of a * specific format used to identify objects at a given destination on * the bus. * * If you are not interacting with D-Bus, then there is no reason to make * use of this type. If you are, then the D-Bus specification contains a * precise description of valid object paths. **/ #define G_VARIANT_TYPE_OBJECT_PATH ((const GVariantType *) "o") /** * G_VARIANT_TYPE_SIGNATURE: * * The type of a D-Bus type signature. These are strings of a specific * format used as type signatures for D-Bus methods and messages. * * If you are not interacting with D-Bus, then there is no reason to make * use of this type. If you are, then the D-Bus specification contains a * precise description of valid signature strings. **/ #define G_VARIANT_TYPE_SIGNATURE ((const GVariantType *) "g") /** * G_VARIANT_TYPE_VARIANT: * * The type of a box that contains any other value (including another * variant). **/ #define G_VARIANT_TYPE_VARIANT ((const GVariantType *) "v") /** * G_VARIANT_TYPE_HANDLE: * * The type of a 32bit signed integer value, that by convention, is used * as an index into an array of file descriptors that are sent alongside * a D-Bus message. * * If you are not interacting with D-Bus, then there is no reason to make * use of this type. **/ #define G_VARIANT_TYPE_HANDLE ((const GVariantType *) "h") /** * G_VARIANT_TYPE_UNIT: * * The empty tuple type. Has only one instance. Known also as "triv" * or "void". **/ #define G_VARIANT_TYPE_UNIT ((const GVariantType *) "()") /** * G_VARIANT_TYPE_ANY: * * An indefinite type that is a supertype of every type (including * itself). **/ #define G_VARIANT_TYPE_ANY ((const GVariantType *) "*") /** * G_VARIANT_TYPE_BASIC: * * An indefinite type that is a supertype of every basic (ie: * non-container) type. **/ #define G_VARIANT_TYPE_BASIC ((const GVariantType *) "?") /** * G_VARIANT_TYPE_MAYBE: * * An indefinite type that is a supertype of every maybe type. **/ #define G_VARIANT_TYPE_MAYBE ((const GVariantType *) "m*") /** * G_VARIANT_TYPE_ARRAY: * * An indefinite type that is a supertype of every array type. **/ #define G_VARIANT_TYPE_ARRAY ((const GVariantType *) "a*") /** * G_VARIANT_TYPE_TUPLE: * * An indefinite type that is a supertype of every tuple type, * regardless of the number of items in the tuple. **/ #define G_VARIANT_TYPE_TUPLE ((const GVariantType *) "r") /** * G_VARIANT_TYPE_DICT_ENTRY: * * An indefinite type that is a supertype of every dictionary entry * type. **/ #define G_VARIANT_TYPE_DICT_ENTRY ((const GVariantType *) "{?*}") /** * G_VARIANT_TYPE_DICTIONARY: * * An indefinite type that is a supertype of every dictionary type -- * that is, any array type that has an element type equal to any * dictionary entry type. **/ #define G_VARIANT_TYPE_DICTIONARY ((const GVariantType *) "a{?*}") /** * G_VARIANT_TYPE_STRING_ARRAY: * * The type of an array of strings. **/ #define G_VARIANT_TYPE_STRING_ARRAY ((const GVariantType *) "as") /** * G_VARIANT_TYPE_OBJECT_PATH_ARRAY: * * The type of an array of object paths. **/ #define G_VARIANT_TYPE_OBJECT_PATH_ARRAY ((const GVariantType *) "ao") /** * G_VARIANT_TYPE_BYTESTRING: * * The type of an array of bytes. This type is commonly used to pass * around strings that may not be valid utf8. In that case, the * convention is that the nul terminator character should be included as * the last character in the array. **/ #define G_VARIANT_TYPE_BYTESTRING ((const GVariantType *) "ay") /** * G_VARIANT_TYPE_BYTESTRING_ARRAY: * * The type of an array of byte strings (an array of arrays of bytes). **/ #define G_VARIANT_TYPE_BYTESTRING_ARRAY ((const GVariantType *) "aay") /** * G_VARIANT_TYPE_VARDICT: * * The type of a dictionary mapping strings to variants (the ubiquitous * "a{sv}" type). * * Since: 2.30 **/ #define G_VARIANT_TYPE_VARDICT ((const GVariantType *) "a{sv}") /** * G_VARIANT_TYPE: * @type_string: a well-formed #GVariantType type string * * Converts a string to a const #GVariantType. Depending on the * current debugging level, this function may perform a runtime check * to ensure that @string is a valid GVariant type string. * * It is always a programmer error to use this macro with an invalid * type string. If in doubt, use g_variant_type_string_is_valid() to * check if the string is valid. * * Since 2.24 **/ #ifndef G_DISABLE_CHECKS # define G_VARIANT_TYPE(type_string) (g_variant_type_checked_ ((type_string))) #else # define G_VARIANT_TYPE(type_string) ((const GVariantType *) (type_string)) #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 #endif /* __G_VARIANT_TYPE_H__ */ pkg-config-0.29.1/glib/glib/gstringchunk.h0000664000175000017500000000423012651243552015267 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the GLib Team and others 1997-2000. See the AUTHORS * file for a list of people on the GLib Team. See the ChangeLog * files for a list of changes. These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/. */ #ifndef __G_STRINGCHUNK_H__ #define __G_STRINGCHUNK_H__ #if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) #error "Only can be included directly." #endif #include 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); G_END_DECLS #endif /* __G_STRING_H__ */ pkg-config-0.29.1/glib/glib/glib-private.h0000664000175000017500000000502712651243552015153 00000000000000/* glib-private.h - GLib-internal private API, shared between glib, gobject, gio * Copyright (C) 2011 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 __GLIB_PRIVATE_H__ #define __GLIB_PRIVATE_H__ #include #include "gwakeup.h" 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) typedef struct { /* See gwakeup.c */ GWakeup * (* g_wakeup_new) (void); void (* g_wakeup_free) (GWakeup *wakeup); void (* g_wakeup_get_pollfd) (GWakeup *wakeup, GPollFD *poll_fd); void (* g_wakeup_signal) (GWakeup *wakeup); void (* g_wakeup_acknowledge) (GWakeup *wakeup); /* 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__ */ pkg-config-0.29.1/glib/glib/gstring.h0000664000175000017500000001755212651243552014251 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the GLib Team and others 1997-2000. See the AUTHORS * file for a list of people on the GLib Team. See the ChangeLog * files for a list of changes. These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/. */ #ifndef __G_STRING_H__ #define __G_STRING_H__ #if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) #error "Only can be included directly." #endif #include #include #include #include /* for G_CAN_INLINE */ G_BEGIN_DECLS typedef struct _GString GString; struct _GString { gchar *str; gsize len; 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) 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) 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, gboolean allow_utf8); /* -- optimize g_strig_append_c --- */ #ifdef G_CAN_INLINE static inline GString* g_string_append_c_inline (GString *gstring, gchar c) { if (gstring->len + 1 < gstring->allocated_len) { gstring->str[gstring->len++] = c; gstring->str[gstring->len] = 0; } else g_string_insert_c (gstring, -1, c); return gstring; } #define g_string_append_c(gstr,c) g_string_append_c_inline (gstr, c) #endif /* G_CAN_INLINE */ GLIB_DEPRECATED GString *g_string_down (GString *string); GLIB_DEPRECATED GString *g_string_up (GString *string); #ifndef G_DISABLE_DEPRECATED #define g_string_sprintf g_string_printf #define g_string_sprintfa g_string_append_printf #endif G_END_DECLS #endif /* __G_STRING_H__ */ pkg-config-0.29.1/glib/glib/gquark.h0000664000175000017500000000530612651243552014060 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the GLib Team and others 1997-2000. See the AUTHORS * file for a list of people on the GLib Team. See the ChangeLog * files for a list of changes. These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/. */ #ifndef __G_QUARK_H__ #define __G_QUARK_H__ #if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) #error "Only can be included directly." #endif #include G_BEGIN_DECLS 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 #endif /* __G_QUARK_H__ */ pkg-config-0.29.1/glib/glib/gversionmacros.h0000664000175000017500000002362712651243552015635 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the GLib Team and others 1997-2000. See the AUTHORS * file for a list of people on the GLib Team. See the ChangeLog * files for a list of changes. These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/. */ #ifndef __G_VERSION_MACROS_H__ #define __G_VERSION_MACROS_H__ #if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) #error "Only can be included directly." #endif /* Version boundaries checks */ #define G_ENCODE_VERSION(major,minor) ((major) << 16 | (minor) << 8) /* XXX: Every new stable minor release bump should add a macro here */ /** * GLIB_VERSION_2_26: * * A macro that evaluates to the 2.26 version of GLib, in a format * that can be used by the C pre-processor. * * Since: 2.32 */ #define GLIB_VERSION_2_26 (G_ENCODE_VERSION (2, 26)) /** * GLIB_VERSION_2_28: * * A macro that evaluates to the 2.28 version of GLib, in a format * that can be used by the C pre-processor. * * Since: 2.32 */ #define GLIB_VERSION_2_28 (G_ENCODE_VERSION (2, 28)) /** * GLIB_VERSION_2_30: * * A macro that evaluates to the 2.30 version of GLib, in a format * that can be used by the C pre-processor. * * Since: 2.32 */ #define GLIB_VERSION_2_30 (G_ENCODE_VERSION (2, 30)) /** * GLIB_VERSION_2_32: * * A macro that evaluates to the 2.32 version of GLib, in a format * that can be used by the C pre-processor. * * Since: 2.32 */ #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 */ #if (GLIB_MINOR_VERSION % 2) #define GLIB_VERSION_CUR_STABLE (G_ENCODE_VERSION (GLIB_MAJOR_VERSION, GLIB_MINOR_VERSION + 1)) #else #define GLIB_VERSION_CUR_STABLE (G_ENCODE_VERSION (GLIB_MAJOR_VERSION, GLIB_MINOR_VERSION)) #endif /* evaluates to the previous stable version */ #if (GLIB_MINOR_VERSION % 2) #define GLIB_VERSION_PREV_STABLE (G_ENCODE_VERSION (GLIB_MAJOR_VERSION, GLIB_MINOR_VERSION - 1)) #else #define GLIB_VERSION_PREV_STABLE (G_ENCODE_VERSION (GLIB_MAJOR_VERSION, GLIB_MINOR_VERSION - 2)) #endif /** * GLIB_VERSION_MIN_REQUIRED: * * A macro that should be defined by the user prior to including * the glib.h header. * The definition should be one of the predefined GLib version * macros: %GLIB_VERSION_2_26, %GLIB_VERSION_2_28,... * * This macro defines the earliest version of GLib that the package is * required to be able to compile against. * * 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_CUR_STABLE) #elif GLIB_VERSION_MIN_REQUIRED == 0 # undef GLIB_VERSION_MIN_REQUIRED # define GLIB_VERSION_MIN_REQUIRED (GLIB_VERSION_CUR_STABLE + 2) #endif /** * GLIB_VERSION_MAX_ALLOWED: * * A macro that should be defined by the user prior to including * the glib.h header. * The definition should be one of the predefined GLib version * macros: %GLIB_VERSION_2_26, %GLIB_VERSION_2_28,... * * 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. * * 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 */ #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 #if GLIB_VERSION_MIN_REQUIRED < GLIB_VERSION_2_26 #error "GLIB_VERSION_MIN_REQUIRED must be >= GLIB_VERSION_2_26" #endif /* These macros are used to mark deprecated functions in GLib headers, * and thus have to be exposed in installed headers. But please * 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 */ #if GLIB_VERSION_MIN_REQUIRED >= GLIB_VERSION_2_26 # 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 _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 _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 _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 _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 _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 _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 _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 _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__ */ pkg-config-0.29.1/glib/glib/gpoll.c0000664000175000017500000002607012275467762013714 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * gpoll.c: poll(2) abstraction * Copyright 1998 Owen Taylor * Copyright 2008 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. */ /* * Modified by the GLib Team and others 1997-2000. See the AUTHORS * file for a list of people on the GLib Team. See the ChangeLog * files for a list of changes. These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/. */ /* * MT safe */ #include "config.h" #include "glibconfig.h" #include "giochannel.h" /* Uncomment the next line (and the corresponding line in gmain.c) to * enable debugging printouts if the environment variable * G_MAIN_POLL_DEBUG is set to some value. */ /* #define G_MAIN_POLL_DEBUG */ #ifdef _WIN32 /* Always enable debugging printout on Windows, as it is more often * needed there... */ #define G_MAIN_POLL_DEBUG #endif #include #include #include #ifdef HAVE_SYS_TIME_H #include #endif /* HAVE_SYS_TIME_H */ #ifdef GLIB_HAVE_SYS_POLL_H # include # undef events /* AIX 4.1.5 & 4.3.2 define this for SVR3,4 compatibility */ # undef revents /* AIX 4.1.5 & 4.3.2 define this for SVR3,4 compatibility */ /* The poll() emulation on OS/X doesn't handle fds=NULL, nfds=0, * so we prefer our own poll emulation. */ #if defined(_POLL_EMUL_H_) || defined(BROKEN_POLL) #undef HAVE_POLL #endif #endif /* GLIB_HAVE_SYS_POLL_H */ #ifdef HAVE_UNISTD_H #include #endif /* HAVE_UNISTD_H */ #include #ifdef G_OS_WIN32 #define STRICT #include #endif /* G_OS_WIN32 */ #include "gpoll.h" #ifdef G_OS_WIN32 #include "gprintf.h" #endif #ifdef G_MAIN_POLL_DEBUG extern gboolean _g_main_poll_debug; #endif #ifdef HAVE_POLL /* SunOS has poll, but doesn't provide a prototype. */ # if defined (sun) && !defined (__SVR4) extern gint poll (struct pollfd *fds, guint nfsd, gint timeout); # endif /* !sun */ /** * g_poll: * @fds: file descriptors to poll * @nfds: the number of file descriptors in @fds * @timeout: amount of time to wait, in milliseconds, or -1 to wait forever * * Polls @fds, as with the poll() system call, but portably. (On * systems that don't have poll(), it is emulated using select().) * This is used internally by #GMainContext, but it can be called * directly if you need to block until a file descriptor is ready, but * don't want to run the full main loop. * * Each element of @fds is a #GPollFD describing a single file * descriptor to poll. The %fd field indicates the file descriptor, * and the %events field indicates the events to poll for. On return, * the %revents fields will be filled with the events that actually * occurred. * * On POSIX systems, the file descriptors in @fds can be any sort of * file descriptor, but the situation is much more complicated on * Windows. If you need to use g_poll() in code that has to run on * Windows, the easiest solution is to construct all of your * #GPollFDs with g_io_channel_win32_make_pollfd(). * * Return value: the number of entries in @fds whose %revents fields * were filled in, or 0 if the operation timed out, or -1 on error or * if the call was interrupted. * * Since: 2.20 **/ gint g_poll (GPollFD *fds, guint nfds, gint timeout) { return poll ((struct pollfd *)fds, nfds, timeout); } #else /* !HAVE_POLL */ #ifdef G_OS_WIN32 static int poll_rest (gboolean poll_msgs, HANDLE *handles, gint nhandles, GPollFD *fds, guint nfds, gint timeout) { DWORD ready; GPollFD *f; int recursed_result; if (poll_msgs) { /* Wait for either messages or handles * -> Use MsgWaitForMultipleObjectsEx */ if (_g_main_poll_debug) g_print (" MsgWaitForMultipleObjectsEx(%d, %d)\n", nhandles, timeout); ready = MsgWaitForMultipleObjectsEx (nhandles, handles, timeout, QS_ALLINPUT, MWMO_ALERTABLE); if (ready == WAIT_FAILED) { gchar *emsg = g_win32_error_message (GetLastError ()); g_warning ("MsgWaitForMultipleObjectsEx failed: %s", emsg); g_free (emsg); } } else if (nhandles == 0) { /* No handles to wait for, just the timeout */ if (timeout == INFINITE) ready = WAIT_FAILED; else { SleepEx (timeout, TRUE); ready = WAIT_TIMEOUT; } } else { /* Wait for just handles * -> Use WaitForMultipleObjectsEx */ if (_g_main_poll_debug) g_print (" WaitForMultipleObjectsEx(%d, %d)\n", nhandles, timeout); ready = WaitForMultipleObjectsEx (nhandles, handles, FALSE, timeout, TRUE); if (ready == WAIT_FAILED) { gchar *emsg = g_win32_error_message (GetLastError ()); g_warning ("WaitForMultipleObjectsEx failed: %s", emsg); g_free (emsg); } } if (_g_main_poll_debug) g_print (" wait returns %ld%s\n", ready, (ready == WAIT_FAILED ? " (WAIT_FAILED)" : (ready == WAIT_TIMEOUT ? " (WAIT_TIMEOUT)" : (poll_msgs && ready == WAIT_OBJECT_0 + nhandles ? " (msg)" : "")))); if (ready == WAIT_FAILED) return -1; else if (ready == WAIT_TIMEOUT || ready == WAIT_IO_COMPLETION) return 0; else if (poll_msgs && ready == WAIT_OBJECT_0 + nhandles) { for (f = fds; f < &fds[nfds]; ++f) if (f->fd == G_WIN32_MSG_HANDLE && f->events & G_IO_IN) f->revents |= G_IO_IN; /* If we have a timeout, or no handles to poll, be satisfied * with just noticing we have messages waiting. */ if (timeout != 0 || nhandles == 0) return 1; /* If no timeout and handles to poll, recurse to poll them, * too. */ recursed_result = poll_rest (FALSE, handles, nhandles, fds, nfds, 0); return (recursed_result == -1) ? -1 : 1 + recursed_result; } else if (ready >= WAIT_OBJECT_0 && ready < WAIT_OBJECT_0 + nhandles) { for (f = fds; f < &fds[nfds]; ++f) { if ((HANDLE) f->fd == handles[ready - WAIT_OBJECT_0]) { f->revents = f->events; if (_g_main_poll_debug) g_print (" got event %p\n", (HANDLE) f->fd); } } /* If no timeout and polling several handles, recurse to poll * the rest of them. */ if (timeout == 0 && nhandles > 1) { /* Remove the handle that fired */ int i; if (ready < nhandles - 1) for (i = ready - WAIT_OBJECT_0 + 1; i < nhandles; i++) handles[i-1] = handles[i]; nhandles--; recursed_result = poll_rest (FALSE, handles, nhandles, fds, nfds, 0); return (recursed_result == -1) ? -1 : 1 + recursed_result; } return 1; } return 0; } gint g_poll (GPollFD *fds, guint nfds, gint timeout) { HANDLE handles[MAXIMUM_WAIT_OBJECTS]; gboolean poll_msgs = FALSE; GPollFD *f; gint nhandles = 0; int retval; if (_g_main_poll_debug) g_print ("g_poll: waiting for"); for (f = fds; f < &fds[nfds]; ++f) if (f->fd == G_WIN32_MSG_HANDLE && (f->events & G_IO_IN)) { if (_g_main_poll_debug && !poll_msgs) g_print (" MSG"); poll_msgs = TRUE; } else if (f->fd > 0) { /* Don't add the same handle several times into the array, as * docs say that is not allowed, even if it actually does seem * to work. */ gint i; for (i = 0; i < nhandles; i++) if (handles[i] == (HANDLE) f->fd) break; if (i == nhandles) { if (nhandles == MAXIMUM_WAIT_OBJECTS) { g_warning ("Too many handles to wait for!\n"); break; } else { if (_g_main_poll_debug) g_print (" %p", (HANDLE) f->fd); handles[nhandles++] = (HANDLE) f->fd; } } } if (_g_main_poll_debug) g_print ("\n"); for (f = fds; f < &fds[nfds]; ++f) f->revents = 0; if (timeout == -1) timeout = INFINITE; /* Polling for several things? */ if (nhandles > 1 || (nhandles > 0 && poll_msgs)) { /* First check if one or several of them are immediately * available */ retval = poll_rest (poll_msgs, handles, nhandles, fds, nfds, 0); /* If not, and we have a significant timeout, poll again with * timeout then. Note that this will return indication for only * one event, or only for messages. We ignore timeouts less than * ten milliseconds as they are mostly pointless on Windows, the * MsgWaitForMultipleObjectsEx() call will timeout right away * anyway. */ if (retval == 0 && (timeout == INFINITE || timeout >= 10)) retval = poll_rest (poll_msgs, handles, nhandles, fds, nfds, timeout); } else { /* Just polling for one thing, so no need to check first if * available immediately */ retval = poll_rest (poll_msgs, handles, nhandles, fds, nfds, timeout); } if (retval == -1) for (f = fds; f < &fds[nfds]; ++f) f->revents = 0; return retval; } #else /* !G_OS_WIN32 */ /* The following implementation of poll() comes from the GNU C Library. * Copyright (C) 1994, 1996, 1997 Free Software Foundation, Inc. */ #include /* for bzero on BSD systems */ #ifdef HAVE_SYS_SELECT_H #include #endif /* HAVE_SYS_SELECT_H */ #ifdef G_OS_BEOS #undef NO_FD_SET #endif /* G_OS_BEOS */ #ifndef NO_FD_SET # define SELECT_MASK fd_set #else /* !NO_FD_SET */ # ifndef _AIX typedef long fd_mask; # endif /* _AIX */ # ifdef _IBMR2 # define SELECT_MASK void # else /* !_IBMR2 */ # define SELECT_MASK int # endif /* !_IBMR2 */ #endif /* !NO_FD_SET */ gint g_poll (GPollFD *fds, guint nfds, gint timeout) { struct timeval tv; SELECT_MASK rset, wset, xset; GPollFD *f; int ready; int maxfd = 0; FD_ZERO (&rset); FD_ZERO (&wset); FD_ZERO (&xset); for (f = fds; f < &fds[nfds]; ++f) if (f->fd >= 0) { if (f->events & G_IO_IN) FD_SET (f->fd, &rset); if (f->events & G_IO_OUT) FD_SET (f->fd, &wset); if (f->events & G_IO_PRI) FD_SET (f->fd, &xset); if (f->fd > maxfd && (f->events & (G_IO_IN|G_IO_OUT|G_IO_PRI))) maxfd = f->fd; } tv.tv_sec = timeout / 1000; tv.tv_usec = (timeout % 1000) * 1000; ready = select (maxfd + 1, &rset, &wset, &xset, timeout == -1 ? NULL : &tv); if (ready > 0) for (f = fds; f < &fds[nfds]; ++f) { f->revents = 0; if (f->fd >= 0) { if (FD_ISSET (f->fd, &rset)) f->revents |= G_IO_IN; if (FD_ISSET (f->fd, &wset)) f->revents |= G_IO_OUT; if (FD_ISSET (f->fd, &xset)) f->revents |= G_IO_PRI; } } return ready; } #endif /* !G_OS_WIN32 */ #endif /* !HAVE_POLL */ pkg-config-0.29.1/glib/glib/gdir.c0000664000175000017500000002027712651243552013512 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * gdir.c: Simplified wrapper around the DIRENT functions. * * Copyright 2001 Hans Breuer * Copyright 2004 Tor Lillqvist * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "config.h" #include #include #include #include #ifdef HAVE_DIRENT_H #include #include #endif #include "gdir.h" #include "gconvert.h" #include "gfileutils.h" #include "gstrfuncs.h" #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: * * An opaque structure representing an opened directory. */ struct _GDir { #ifdef G_OS_WIN32 _WDIR *wdirp; #else DIR *dirp; #endif #ifdef G_OS_WIN32 gchar utf8_buf[FILENAME_MAX*4]; #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 * in the on-disk encoding. On Windows in UTF-8 * @flags: Currently must be set to 0. Reserved for future use. * @error: return location for a #GError, or %NULL. * If non-%NULL, an error will be set if and only if * g_dir_open() fails. * * Opens a directory for reading. The names of the files in the * directory can then be retrieved using g_dir_read_name(). Note * that the ordering is not defined. * * Return value: a newly allocated #GDir on success, %NULL on failure. * If non-%NULL, you must free the result with g_dir_close() * when you are finished with it. **/ GDir * g_dir_open (const gchar *path, guint flags, GError **error) { gint saved_errno; GDir *dir; dir = g_dir_open_with_errno (path, flags); if (dir == NULL) { gchar *utf8_path; saved_errno = errno; utf8_path = g_filename_to_utf8 (path, -1, NULL, NULL, NULL); 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 dir; } #if defined (G_OS_WIN32) && !defined (_WIN64) /* The above function actually is called g_dir_open_utf8, and it's * that what applications compiled with this GLib version will * use. */ #undef g_dir_open /* Binary compatibility version. Not for newly compiled code. */ GDir * g_dir_open (const gchar *path, guint flags, GError **error) { gchar *utf8_path = g_locale_to_utf8 (path, -1, NULL, NULL, error); GDir *retval; if (utf8_path == NULL) return NULL; retval = g_dir_open_utf8 (utf8_path, flags, error); g_free (utf8_path); return retval; } #endif /*< 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() * * Retrieves the name of another entry in the directory, or %NULL. * The order of entries returned from this function is not defined, * and may vary by file system or other operating-system dependent * factors. * * %NULL may also be returned in case of errors. On Unix, you can * check errno to find out if %NULL was returned * because of an error. * * On Unix, the '.' and '..' entries are omitted, and the returned * name is in the on-disk encoding. * * On Windows, as is true of all GLib functions which operate on * filenames, the returned name is in UTF-8. * * Return value: The entry's name or %NULL if there are no * more entries. The return value is owned by GLib and * must not be modified or freed. **/ const gchar * g_dir_read_name (GDir *dir) { #ifdef G_OS_WIN32 gchar *utf8_name; struct _wdirent *wentry; #else struct dirent *entry; #endif g_return_val_if_fail (dir != NULL, NULL); #ifdef G_OS_WIN32 while (1) { wentry = _wreaddir (dir->wdirp); while (wentry && (0 == wcscmp (wentry->d_name, L".") || 0 == wcscmp (wentry->d_name, L".."))) wentry = _wreaddir (dir->wdirp); if (wentry == NULL) return NULL; utf8_name = g_utf16_to_utf8 (wentry->d_name, -1, NULL, NULL, NULL); if (utf8_name == NULL) continue; /* Huh, impossible? Skip it anyway */ strcpy (dir->utf8_buf, utf8_name); g_free (utf8_name); return dir->utf8_buf; } #else entry = readdir (dir->dirp); while (entry && (0 == strcmp (entry->d_name, ".") || 0 == strcmp (entry->d_name, ".."))) entry = readdir (dir->dirp); if (entry) return entry->d_name; else return NULL; #endif } #if defined (G_OS_WIN32) && !defined (_WIN64) /* Ditto for g_dir_read_name */ #undef g_dir_read_name /* Binary compatibility version. Not for newly compiled code. */ const gchar * g_dir_read_name (GDir *dir) { while (1) { const gchar *utf8_name = g_dir_read_name_utf8 (dir); gchar *retval; if (utf8_name == NULL) return NULL; retval = g_locale_from_utf8 (utf8_name, -1, NULL, NULL, NULL); if (retval != NULL) { strcpy (dir->utf8_buf, retval); g_free (retval); return dir->utf8_buf; } } } #endif /** * g_dir_rewind: * @dir: a #GDir* created by g_dir_open() * * Resets the given directory. The next call to g_dir_read_name() * will return the first entry again. **/ void g_dir_rewind (GDir *dir) { g_return_if_fail (dir != NULL); #ifdef G_OS_WIN32 _wrewinddir (dir->wdirp); #else rewinddir (dir->dirp); #endif } /** * g_dir_close: * @dir: a #GDir* created by g_dir_open() * * Closes the directory and deallocates all related resources. **/ void g_dir_close (GDir *dir) { g_return_if_fail (dir != NULL); #ifdef G_OS_WIN32 _wclosedir (dir->wdirp); #else closedir (dir->dirp); #endif g_free (dir); } pkg-config-0.29.1/glib/glib/gunicollate.c0000664000175000017500000004220312651243552015064 00000000000000/* gunicollate.c - Collation * * Copyright 2001,2005 Red Hat, Inc. * * The Gnome Library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * The Gnome Library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with the Gnome Library; see the file COPYING.LIB. If not, * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "config.h" #include #include #ifdef __STDC_ISO_10646__ #include #endif #ifdef HAVE_CARBON #include #endif #include "gmem.h" #include "gunicode.h" #include "gunicodeprivate.h" #include "gstring.h" #include "gstrfuncs.h" #include "gtestutils.h" #include "gcharset.h" #ifndef __STDC_ISO_10646__ #include "gconvert.h" #endif #ifdef _MSC_VER /* Workaround for bug in MSVCR80.DLL */ static gsize msc_strxfrm_wrapper (char *string1, const char *string2, gsize count) { if (!string1 || count <= 0) { char tmp; return strxfrm (&tmp, string2, 1); } return strxfrm (string1, string2, count); } #define strxfrm msc_strxfrm_wrapper #endif /** * g_utf8_collate: * @str1: a UTF-8 encoded string * @str2: a UTF-8 encoded string * * Compares two strings for ordering using the linguistically * correct rules for the current locale. * When sorting a large number of strings, it will be significantly * faster to obtain collation keys with g_utf8_collate_key() and * compare the keys with strcmp() when sorting instead of sorting * the original strings. * * Return value: < 0 if @str1 compares before @str2, * 0 if they compare equal, > 0 if @str1 compares after @str2. **/ gint g_utf8_collate (const gchar *str1, const gchar *str2) { gint result; #ifdef HAVE_CARBON UniChar *str1_utf16; UniChar *str2_utf16; glong len1; glong len2; SInt32 retval = 0; g_return_val_if_fail (str1 != NULL, 0); g_return_val_if_fail (str2 != NULL, 0); str1_utf16 = g_utf8_to_utf16 (str1, -1, NULL, &len1, NULL); str2_utf16 = g_utf8_to_utf16 (str2, -1, NULL, &len2, NULL); UCCompareTextDefault (kUCCollateStandardOptions, str1_utf16, len1, str2_utf16, len2, NULL, &retval); result = retval; g_free (str2_utf16); g_free (str1_utf16); #elif defined(__STDC_ISO_10646__) gunichar *str1_norm; gunichar *str2_norm; g_return_val_if_fail (str1 != NULL, 0); g_return_val_if_fail (str2 != NULL, 0); str1_norm = _g_utf8_normalize_wc (str1, -1, G_NORMALIZE_ALL_COMPOSE); str2_norm = _g_utf8_normalize_wc (str2, -1, G_NORMALIZE_ALL_COMPOSE); result = wcscoll ((wchar_t *)str1_norm, (wchar_t *)str2_norm); g_free (str1_norm); g_free (str2_norm); #else /* !__STDC_ISO_10646__ */ const gchar *charset; gchar *str1_norm; gchar *str2_norm; g_return_val_if_fail (str1 != NULL, 0); g_return_val_if_fail (str2 != NULL, 0); str1_norm = g_utf8_normalize (str1, -1, G_NORMALIZE_ALL_COMPOSE); str2_norm = g_utf8_normalize (str2, -1, G_NORMALIZE_ALL_COMPOSE); if (g_get_charset (&charset)) { result = strcoll (str1_norm, str2_norm); } else { gchar *str1_locale = g_convert (str1_norm, -1, charset, "UTF-8", NULL, NULL, NULL); gchar *str2_locale = g_convert (str2_norm, -1, charset, "UTF-8", NULL, NULL, NULL); if (str1_locale && str2_locale) result = strcoll (str1_locale, str2_locale); else if (str1_locale) result = -1; else if (str2_locale) result = 1; else result = strcmp (str1_norm, str2_norm); g_free (str1_locale); g_free (str2_locale); } g_free (str1_norm); g_free (str2_norm); #endif /* __STDC_ISO_10646__ */ return result; } #if defined(__STDC_ISO_10646__) || defined(HAVE_CARBON) /* We need UTF-8 encoding of numbers to encode the weights if * we are using wcsxfrm. However, we aren't encoding Unicode * characters, so we can't simply use g_unichar_to_utf8. * * The following routine is taken (with modification) from GNU * libc's strxfrm routine: * * Copyright (C) 1995-1999,2000,2001 Free Software Foundation, Inc. * Written by Ulrich Drepper , 1995. */ static inline int utf8_encode (char *buf, wchar_t val) { int retval; if (val < 0x80) { if (buf) *buf++ = (char) val; retval = 1; } else { int step; for (step = 2; step < 6; ++step) if ((val & (~(guint32)0 << (5 * step + 1))) == 0) break; retval = step; if (buf) { *buf = (unsigned char) (~0xff >> step); --step; do { buf[step] = 0x80 | (val & 0x3f); val >>= 6; } while (--step > 0); *buf |= val; } } return retval; } #endif /* __STDC_ISO_10646__ || HAVE_CARBON */ #ifdef HAVE_CARBON static gchar * collate_key_to_string (UCCollationValue *key, gsize key_len) { gchar *result; gsize result_len = 0; const gsize start = 2 * sizeof (void *) / sizeof (UCCollationValue); gsize i; /* 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 (""); 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 = start; i < key_len; i++) result_len += utf8_encode (result + result_len, g_htonl (key[i] + 1)); result[result_len] = '\0'; return result; } static gchar * carbon_collate_key_with_collator (const gchar *str, gssize len, CollatorRef collator) { UniChar *str_utf16 = NULL; glong len_utf16; OSStatus ret; UCCollationValue staticbuf[512]; UCCollationValue *freeme = NULL; UCCollationValue *buf; ItemCount buf_len; ItemCount key_len; ItemCount try_len; gchar *result = NULL; str_utf16 = g_utf8_to_utf16 (str, len, NULL, &len_utf16, NULL); try_len = len_utf16 * 5 + 2; if (try_len <= sizeof staticbuf) { buf = staticbuf; buf_len = sizeof staticbuf; } else { freeme = g_new (UCCollationValue, try_len); buf = freeme; buf_len = try_len; } ret = UCGetCollationKey (collator, str_utf16, len_utf16, buf_len, &key_len, buf); if (ret == kCollateBufferTooSmall) { freeme = g_renew (UCCollationValue, freeme, try_len * 2); buf = freeme; buf_len = try_len * 2; ret = UCGetCollationKey (collator, str_utf16, len_utf16, buf_len, &key_len, buf); } if (ret == 0) result = collate_key_to_string (buf, key_len); else result = g_strdup (""); g_free (freeme); g_free (str_utf16); return result; } static gchar * carbon_collate_key (const gchar *str, gssize len) { static CollatorRef collator; if (G_UNLIKELY (!collator)) { UCCreateCollator (NULL, 0, kUCCollateStandardOptions, &collator); if (!collator) { static gboolean been_here; if (!been_here) g_warning ("%s: UCCreateCollator failed", G_STRLOC); been_here = TRUE; return g_strdup (""); } } return carbon_collate_key_with_collator (str, len, collator); } static gchar * carbon_collate_key_for_filename (const gchar *str, gssize len) { static CollatorRef collator; if (G_UNLIKELY (!collator)) { /* http://developer.apple.com/qa/qa2004/qa1159.html */ UCCreateCollator (NULL, 0, kUCCollateComposeInsensitiveMask | kUCCollateWidthInsensitiveMask | kUCCollateCaseInsensitiveMask | kUCCollateDigitsOverrideMask | kUCCollateDigitsAsNumberMask | kUCCollatePunctuationSignificantMask, &collator); if (!collator) { static gboolean been_here; if (!been_here) g_warning ("%s: UCCreateCollator failed", G_STRLOC); been_here = TRUE; return g_strdup (""); } } return carbon_collate_key_with_collator (str, len, collator); } #endif /* HAVE_CARBON */ /** * g_utf8_collate_key: * @str: a UTF-8 encoded string. * @len: length of @str, in bytes, or -1 if @str is nul-terminated. * * Converts a string into a collation key that can be compared * with other collation keys produced by the same function using * strcmp(). * * The results of comparing the collation keys of two strings * with strcmp() will always be the same as comparing the two * original keys with g_utf8_collate(). * * Note that this function depends on the * current locale. * * Return value: a newly allocated string. This string should * be freed with g_free() when you are done with it. **/ gchar * g_utf8_collate_key (const gchar *str, gssize len) { gchar *result; #ifdef HAVE_CARBON g_return_val_if_fail (str != NULL, NULL); result = carbon_collate_key (str, len); #elif defined(__STDC_ISO_10646__) gsize xfrm_len; gunichar *str_norm; wchar_t *result_wc; gsize i; gsize result_len = 0; g_return_val_if_fail (str != NULL, NULL); str_norm = _g_utf8_normalize_wc (str, len, G_NORMALIZE_ALL_COMPOSE); xfrm_len = wcsxfrm (NULL, (wchar_t *)str_norm, 0); result_wc = g_new (wchar_t, xfrm_len + 1); wcsxfrm (result_wc, (wchar_t *)str_norm, xfrm_len + 1); for (i=0; i < xfrm_len; i++) result_len += utf8_encode (NULL, result_wc[i]); result = g_malloc (result_len + 1); result_len = 0; for (i=0; i < xfrm_len; i++) result_len += utf8_encode (result + result_len, result_wc[i]); result[result_len] = '\0'; g_free (result_wc); g_free (str_norm); return result; #else /* !__STDC_ISO_10646__ */ gsize xfrm_len; const gchar *charset; gchar *str_norm; g_return_val_if_fail (str != NULL, NULL); str_norm = g_utf8_normalize (str, len, G_NORMALIZE_ALL_COMPOSE); result = NULL; if (g_get_charset (&charset)) { xfrm_len = strxfrm (NULL, str_norm, 0); if (xfrm_len >= 0 && xfrm_len < G_MAXINT - 2) { result = g_malloc (xfrm_len + 1); strxfrm (result, str_norm, xfrm_len + 1); } } else { gchar *str_locale = g_convert (str_norm, -1, charset, "UTF-8", NULL, NULL, NULL); if (str_locale) { xfrm_len = strxfrm (NULL, str_locale, 0); if (xfrm_len < 0 || xfrm_len >= G_MAXINT - 2) { g_free (str_locale); str_locale = NULL; } } if (str_locale) { result = g_malloc (xfrm_len + 2); result[0] = 'A'; strxfrm (result + 1, str_locale, xfrm_len + 1); g_free (str_locale); } } if (!result) { xfrm_len = strlen (str_norm); result = g_malloc (xfrm_len + 2); result[0] = 'B'; memcpy (result + 1, str_norm, xfrm_len); result[xfrm_len+1] = '\0'; } g_free (str_norm); #endif /* __STDC_ISO_10646__ */ return result; } /* This is a collation key that is very very likely to sort before any collation key that libc strxfrm generates. We use this before any special case (dot or number) to make sure that its sorted before anything else. */ #define COLLATION_SENTINEL "\1\1\1" /** * g_utf8_collate_key_for_filename: * @str: a UTF-8 encoded string. * @len: length of @str, in bytes, or -1 if @str is nul-terminated. * * Converts a string into a collation key that can be compared * with other collation keys produced by the same function using strcmp(). * * In order to sort filenames correctly, this function treats the dot '.' * as a special case. Most dictionary orderings seem to consider it * insignificant, thus producing the ordering "event.c" "eventgenerator.c" * "event.h" instead of "event.c" "event.h" "eventgenerator.c". Also, we * would like to treat numbers intelligently so that "file1" "file10" "file5" * is sorted as "file1" "file5" "file10". * * Note that this function depends on the * current locale. * * Return value: a newly allocated string. This string should * be freed with g_free() when you are done with it. * * Since: 2.8 */ gchar* g_utf8_collate_key_for_filename (const gchar *str, gssize len) { #ifndef HAVE_CARBON GString *result; GString *append; const gchar *p; const gchar *prev; const gchar *end; gchar *collate_key; gint digits; gint leading_zeros; /* * How it works: * * Split the filename into collatable substrings which do * not contain [.0-9] and special-cased substrings. The collatable * substrings are run through the normal g_utf8_collate_key() and the * resulting keys are concatenated with keys generated from the * special-cased substrings. * * Special cases: Dots are handled by replacing them with '\1' which * implies that short dot-delimited substrings are before long ones, * e.g. * * a\1a (a.a) * a-\1a (a-.a) * aa\1a (aa.a) * * Numbers are handled by prepending to each number d-1 superdigits * where d = number of digits in the number and SUPERDIGIT is a * character with an integer value higher than any digit (for instance * ':'). This ensures that single-digit numbers are sorted before * double-digit numbers which in turn are sorted separately from * triple-digit numbers, etc. To avoid strange side-effects when * sorting strings that already contain SUPERDIGITs, a '\2' * is also prepended, like this * * file\21 (file1) * file\25 (file5) * file\2:10 (file10) * file\2:26 (file26) * file\2::100 (file100) * file:foo (file:foo) * * This has the side-effect of sorting numbers before everything else (except * dots), but this is probably OK. * * Leading digits are ignored when doing the above. To discriminate * numbers which differ only in the number of leading digits, we append * the number of leading digits as a byte at the very end of the collation * key. * * To try avoid conflict with any collation key sequence generated by libc we * start each switch to a special cased part with a sentinel that hopefully * will sort before anything libc will generate. */ if (len < 0) len = strlen (str); result = g_string_sized_new (len * 2); append = g_string_sized_new (0); end = str + len; /* No need to use utf8 functions, since we're only looking for ascii chars */ for (prev = p = str; p < end; p++) { switch (*p) { case '.': if (prev != p) { collate_key = g_utf8_collate_key (prev, p - prev); g_string_append (result, collate_key); g_free (collate_key); } g_string_append (result, COLLATION_SENTINEL "\1"); /* skip the dot */ prev = p + 1; break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': if (prev != p) { collate_key = g_utf8_collate_key (prev, p - prev); g_string_append (result, collate_key); g_free (collate_key); } g_string_append (result, COLLATION_SENTINEL "\2"); prev = p; /* write d-1 colons */ if (*p == '0') { leading_zeros = 1; digits = 0; } else { leading_zeros = 0; digits = 1; } while (++p < end) { if (*p == '0' && !digits) ++leading_zeros; else if (g_ascii_isdigit(*p)) ++digits; else { /* count an all-zero sequence as * one digit plus leading zeros */ if (!digits) { ++digits; --leading_zeros; } break; } } while (digits > 1) { g_string_append_c (result, ':'); --digits; } if (leading_zeros > 0) { g_string_append_c (append, (char)leading_zeros); prev += leading_zeros; } /* write the number itself */ g_string_append_len (result, prev, p - prev); prev = p; --p; /* go one step back to avoid disturbing outer loop */ break; default: /* other characters just accumulate */ break; } } if (prev != p) { collate_key = g_utf8_collate_key (prev, p - prev); g_string_append (result, collate_key); g_free (collate_key); } g_string_append (result, append->str); g_string_free (append, TRUE); return g_string_free (result, FALSE); #else /* HAVE_CARBON */ return carbon_collate_key_for_filename (str, len); #endif } pkg-config-0.29.1/glib/glib/gscanner.h0000664000175000017500000002104712651243552014366 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the GLib Team and others 1997-2000. See the AUTHORS * file for a list of people on the GLib Team. See the ChangeLog * files for a list of changes. These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/. */ #ifndef __G_SCANNER_H__ #define __G_SCANNER_H__ #if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) #error "Only can be included directly." #endif #include #include G_BEGIN_DECLS typedef struct _GScanner GScanner; typedef struct _GScannerConfig GScannerConfig; typedef union _GTokenValue GTokenValue; typedef void (*GScannerMsgFunc) (GScanner *scanner, gchar *message, gboolean error); /* GScanner: Flexible lexical scanner for general purpose. */ /* Character sets */ #define G_CSET_A_2_Z "ABCDEFGHIJKLMNOPQRSTUVWXYZ" #define G_CSET_a_2_z "abcdefghijklmnopqrstuvwxyz" #define G_CSET_DIGITS "0123456789" #define G_CSET_LATINC "\300\301\302\303\304\305\306"\ "\307\310\311\312\313\314\315\316\317\320"\ "\321\322\323\324\325\326"\ "\330\331\332\333\334\335\336" #define G_CSET_LATINS "\337\340\341\342\343\344\345\346"\ "\347\350\351\352\353\354\355\356\357\360"\ "\361\362\363\364\365\366"\ "\370\371\372\373\374\375\376\377" /* Error types */ typedef enum { G_ERR_UNKNOWN, G_ERR_UNEXP_EOF, G_ERR_UNEXP_EOF_IN_STRING, G_ERR_UNEXP_EOF_IN_COMMENT, G_ERR_NON_DIGIT_IN_CONST, G_ERR_DIGIT_RADIX, G_ERR_FLOAT_RADIX, G_ERR_FLOAT_MALFORMED } GErrorType; /* Token types */ typedef enum { G_TOKEN_EOF = 0, G_TOKEN_LEFT_PAREN = '(', G_TOKEN_RIGHT_PAREN = ')', G_TOKEN_LEFT_CURLY = '{', G_TOKEN_RIGHT_CURLY = '}', G_TOKEN_LEFT_BRACE = '[', G_TOKEN_RIGHT_BRACE = ']', G_TOKEN_EQUAL_SIGN = '=', G_TOKEN_COMMA = ',', G_TOKEN_NONE = 256, G_TOKEN_ERROR, G_TOKEN_CHAR, G_TOKEN_BINARY, G_TOKEN_OCTAL, G_TOKEN_INT, G_TOKEN_HEX, G_TOKEN_FLOAT, G_TOKEN_STRING, G_TOKEN_SYMBOL, G_TOKEN_IDENTIFIER, G_TOKEN_IDENTIFIER_NULL, G_TOKEN_COMMENT_SINGLE, G_TOKEN_COMMENT_MULTI, /*< private >*/ G_TOKEN_LAST } GTokenType; union _GTokenValue { gpointer v_symbol; gchar *v_identifier; gulong v_binary; gulong v_octal; gulong v_int; guint64 v_int64; gdouble v_float; gulong v_hex; gchar *v_string; gchar *v_comment; guchar v_char; guint v_error; }; struct _GScannerConfig { /* Character sets */ gchar *cset_skip_characters; /* default: " \t\n" */ gchar *cset_identifier_first; gchar *cset_identifier_nth; gchar *cpair_comment_single; /* default: "#\n" */ /* Should symbol lookup work case sensitive? */ guint case_sensitive : 1; /* Boolean values to be adjusted "on the fly" * to configure scanning behaviour. */ guint skip_comment_multi : 1; /* C like comment */ guint skip_comment_single : 1; /* single line comment */ guint scan_comment_multi : 1; /* scan multi line comments? */ guint scan_identifier : 1; guint scan_identifier_1char : 1; guint scan_identifier_NULL : 1; guint scan_symbols : 1; guint scan_binary : 1; guint scan_octal : 1; guint scan_float : 1; guint scan_hex : 1; /* '0x0ff0' */ guint scan_hex_dollar : 1; /* '$0ff0' */ guint scan_string_sq : 1; /* string: 'anything' */ guint scan_string_dq : 1; /* string: "\\-escapes!\n" */ guint numbers_2_int : 1; /* bin, octal, hex => int */ guint int_2_float : 1; /* int => G_TOKEN_FLOAT? */ guint identifier_2_string : 1; guint char_2_token : 1; /* return G_TOKEN_CHAR? */ guint symbol_2_token : 1; guint scope_0_fallback : 1; /* try scope 0 on lookups? */ guint store_int64 : 1; /* use value.v_int64 rather than v_int */ /*< private >*/ guint padding_dummy; }; struct _GScanner { /* unused fields */ gpointer user_data; guint max_parse_errors; /* g_scanner_error() increments this field */ guint parse_errors; /* name of input stream, featured by the default message handler */ const gchar *input_name; /* quarked data */ GData *qdata; /* link into the scanner configuration */ GScannerConfig *config; /* fields filled in after g_scanner_get_next_token() */ GTokenType token; GTokenValue value; guint line; guint position; /* fields filled in after g_scanner_peek_next_token() */ GTokenType next_token; GTokenValue next_value; guint next_line; guint next_position; /*< private >*/ /* to be considered private */ GHashTable *symbol_table; gint input_fd; const gchar *text; const gchar *text_end; gchar *buffer; guint scope_id; /*< public >*/ /* handler function for _warn and _error */ 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, const gchar *symbol_spec, 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); #ifndef G_DISABLE_DEPRECATED /* keep downward source compatibility */ #define g_scanner_add_symbol( scanner, symbol, value ) G_STMT_START { \ g_scanner_scope_add_symbol ((scanner), 0, (symbol), (value)); \ } G_STMT_END #define g_scanner_remove_symbol( scanner, symbol ) G_STMT_START { \ g_scanner_scope_remove_symbol ((scanner), 0, (symbol)); \ } G_STMT_END #define g_scanner_foreach_symbol( scanner, func, data ) G_STMT_START { \ g_scanner_scope_foreach_symbol ((scanner), 0, (func), (data)); \ } G_STMT_END /* The following two functions are deprecated and will be removed in * the next major release. They do no good. */ #define g_scanner_freeze_symbol_table(scanner) ((void)0) #define g_scanner_thaw_symbol_table(scanner) ((void)0) #endif /* G_DISABLE_DEPRECATED */ G_END_DECLS #endif /* __G_SCANNER_H__ */ pkg-config-0.29.1/glib/glib/glib-object.h0000664000175000017500000000274012275467762014763 00000000000000/* GObject - GLib Type, Object, Parameter and Signal Library * Copyright (C) 1998, 1999, 2000 Tim Janik and Red Hat, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __GLIB_GOBJECT_H__ #define __GLIB_GOBJECT_H__ #define __GLIB_GOBJECT_H_INSIDE__ /* topmost include file for GObject header files */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #undef __GLIB_GOBJECT_H_INSIDE__ #endif /* __GLIB_GOBJECT_H__ */ pkg-config-0.29.1/glib/glib/gdataset.c0000664000175000017500000010312112651243552014347 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * gdataset.c: Generic dataset mechanism, similar to GtkObject data. * Copyright (C) 1998 Tim Janik * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ /* * Modified by the GLib Team and others 1997-2000. See the AUTHORS * file for a list of people on the GLib Team. See the ChangeLog * files for a list of changes. These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/. */ /* * MT safe ; except for g_data*_foreach() */ #include "config.h" #include #include "gdataset.h" #include "gbitlock.h" #include "gslice.h" #include "gdatasetprivate.h" #include "ghash.h" #include "gquark.h" #include "gstrfuncs.h" #include "gtestutils.h" #include "gthread.h" #include "glib_trace.h" /** * SECTION:datasets * @title: Datasets * @short_description: associate groups of data elements with * particular memory locations * * Datasets associate groups of data elements with particular memory * locations. These are useful if you need to associate data with a * structure returned from an external library. Since you cannot modify * the structure, you use its location in memory as the key into a * dataset, where you can associate any number of data elements with it. * * There are two forms of most of the dataset functions. The first form * uses strings to identify the data elements associated with a * location. The second form uses #GQuark identifiers, which are * created with a call to g_quark_from_string() or * g_quark_from_static_string(). The second form is quicker, since it * does not require looking up the string in the hash table of #GQuark * identifiers. * * There is no function to create a dataset. It is automatically * created as soon as you add elements to it. * * To add data elements to a dataset use g_dataset_id_set_data(), * g_dataset_id_set_data_full(), g_dataset_set_data() and * g_dataset_set_data_full(). * * To get data elements from a dataset use g_dataset_id_get_data() and * g_dataset_get_data(). * * To iterate over all data elements in a dataset use * g_dataset_foreach() (not thread-safe). * * To remove data elements from a dataset use * g_dataset_id_remove_data() and g_dataset_remove_data(). * * To destroy a dataset, use g_dataset_destroy(). **/ /** * SECTION:datalist * @title: Keyed Data Lists * @short_description: lists of data elements which are accessible by a * string or GQuark identifier * * Keyed data lists provide lists of arbitrary data elements which can * be accessed either with a string or with a #GQuark corresponding to * the string. * * The #GQuark methods are quicker, since the strings have to be * converted to #GQuarks anyway. * * Data lists are used for associating arbitrary data with #GObjects, * using g_object_set_data() and related functions. * * To create a datalist, use g_datalist_init(). * * To add data elements to a datalist use g_datalist_id_set_data(), * g_datalist_id_set_data_full(), g_datalist_set_data() and * g_datalist_set_data_full(). * * To get data elements from a datalist use g_datalist_id_get_data() * and g_datalist_get_data(). * * To iterate over all data elements in a datalist use * g_datalist_foreach() (not thread-safe). * * To remove data elements from a datalist use * g_datalist_id_remove_data() and g_datalist_remove_data(). * * To remove all data elements from a datalist, use g_datalist_clear(). **/ /** * GData: * * The #GData struct is an opaque data structure to represent a Keyed Data List. It should * only be accessed via the following functions. **/ /** * GDestroyNotify: * @data: the data element. * * Specifies the type of function which is called when a data element * is destroyed. It is passed the pointer to the data element and * should free any memory and resources allocated for it. **/ /* --- defines --- */ #define G_QUARK_BLOCK_SIZE (2048) #define G_DATALIST_FLAGS_MASK_INTERNAL 0x7 /* datalist pointer accesses have to be carried out atomically */ #define G_DATALIST_GET_POINTER(datalist) \ ((GData*) ((gsize) g_atomic_pointer_get (datalist) & ~(gsize) G_DATALIST_FLAGS_MASK_INTERNAL)) #define G_DATALIST_SET_POINTER(datalist, pointer) G_STMT_START { \ gpointer _oldv, _newv; \ do { \ _oldv = g_atomic_pointer_get (datalist); \ _newv = (gpointer) (((gsize) _oldv & G_DATALIST_FLAGS_MASK_INTERNAL) | (gsize) pointer); \ } while (!g_atomic_pointer_compare_and_exchange ((void**) datalist, _oldv, _newv)); \ } G_STMT_END /* --- structures --- */ typedef struct { GQuark key; gpointer data; GDestroyNotify destroy; } GDataElt; typedef struct _GDataset GDataset; struct _GData { guint32 len; /* Number of elements */ guint32 alloc; /* Number of allocated elements */ GDataElt data[1]; /* Flexible array */ }; struct _GDataset { gconstpointer location; GData *datalist; }; /* --- prototypes --- */ static inline GDataset* g_dataset_lookup (gconstpointer dataset_location); static inline void g_datalist_clear_i (GData **datalist); static void g_dataset_destroy_internal (GDataset *dataset); static inline gpointer g_data_set_internal (GData **datalist, GQuark key_id, gpointer data, GDestroyNotify destroy_func, GDataset *dataset); static void g_data_initialize (void); /* 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. * * For GDataSet we have a global lock g_dataset_global that protects * the global dataset hash and cache, and additionally it protects the * datalist such that we can avoid to use the bit lock in a few places * where it is easy. */ /* --- variables --- */ 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? */ /* --- functions --- */ #define DATALIST_LOCK_BIT 2 static void g_datalist_lock (GData **datalist) { g_pointer_bit_lock ((void **)datalist, DATALIST_LOCK_BIT); } static void g_datalist_unlock (GData **datalist) { g_pointer_bit_unlock ((void **)datalist, DATALIST_LOCK_BIT); } /* Called with the datalist lock held, or the dataset global * lock for dataset lists */ static void g_datalist_clear_i (GData **datalist) { GData *data; gint i; data = G_DATALIST_GET_POINTER (datalist); G_DATALIST_SET_POINTER (datalist, NULL); if (data) { G_UNLOCK (g_dataset_global); for (i = 0; i < data->len; i++) { if (data->data[i].data && data->data[i].destroy) data->data[i].destroy (data->data[i].data); } G_LOCK (g_dataset_global); g_free (data); } } /** * g_datalist_clear: * @datalist: a datalist. * * Frees all the data elements of the datalist. * The data elements' destroy functions are called * if they have been set. **/ void g_datalist_clear (GData **datalist) { GData *data; gint i; g_return_if_fail (datalist != NULL); g_datalist_lock (datalist); data = G_DATALIST_GET_POINTER (datalist); G_DATALIST_SET_POINTER (datalist, NULL); g_datalist_unlock (datalist); if (data) { for (i = 0; i < data->len; i++) { if (data->data[i].data && data->data[i].destroy) data->data[i].destroy (data->data[i].data); } g_free (data); } } /* HOLDS: g_dataset_global_lock */ static inline GDataset* g_dataset_lookup (gconstpointer dataset_location) { register GDataset *dataset; if (g_dataset_cached && g_dataset_cached->location == dataset_location) return g_dataset_cached; dataset = g_hash_table_lookup (g_dataset_location_ht, dataset_location); if (dataset) g_dataset_cached = dataset; return dataset; } /* HOLDS: g_dataset_global_lock */ static void g_dataset_destroy_internal (GDataset *dataset) { register gconstpointer dataset_location; dataset_location = dataset->location; while (dataset) { if (G_DATALIST_GET_POINTER(&dataset->datalist) == NULL) { if (dataset == g_dataset_cached) g_dataset_cached = NULL; g_hash_table_remove (g_dataset_location_ht, dataset_location); g_slice_free (GDataset, dataset); break; } g_datalist_clear_i (&dataset->datalist); dataset = g_dataset_lookup (dataset_location); } } /** * g_dataset_destroy: * @dataset_location: the location identifying the dataset. * * Destroys the dataset, freeing all memory allocated, and calling any * destroy functions set for data elements. */ void g_dataset_destroy (gconstpointer dataset_location) { g_return_if_fail (dataset_location != NULL); G_LOCK (g_dataset_global); if (g_dataset_location_ht) { register GDataset *dataset; dataset = g_dataset_lookup (dataset_location); if (dataset) g_dataset_destroy_internal (dataset); } G_UNLOCK (g_dataset_global); } /* HOLDS: g_dataset_global_lock if dataset != null */ static inline gpointer g_data_set_internal (GData **datalist, GQuark key_id, gpointer new_data, GDestroyNotify new_destroy_func, GDataset *dataset) { GData *d, *old_d; GDataElt old, *data, *data_last, *data_end; g_datalist_lock (datalist); d = G_DATALIST_GET_POINTER (datalist); if (new_data == NULL) /* remove */ { if (d) { data = d->data; data_last = data + d->len - 1; while (data <= data_last) { if (data->key == key_id) { old = *data; if (data != data_last) *data = *data_last; 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); /* datalist may be situated in dataset, so must not be * unlocked after we free it */ g_datalist_unlock (datalist); /* the dataset destruction *must* be done * prior to invocation of the data destroy function */ if (dataset) g_dataset_destroy_internal (dataset); } else { g_datalist_unlock (datalist); } /* We found and removed an old value * the GData struct *must* already be unlinked * when invoking the destroy function. * we use (new_data==NULL && new_destroy_func!=NULL) as * a special hint combination to "steal" * data without destroy notification */ if (old.destroy && !new_destroy_func) { if (dataset) G_UNLOCK (g_dataset_global); old.destroy (old.data); if (dataset) G_LOCK (g_dataset_global); old.data = NULL; } return old.data; } data++; } } } else { old.data = NULL; if (d) { data = d->data; data_end = data + d->len; while (data < data_end) { if (data->key == key_id) { if (!data->destroy) { data->data = new_data; data->destroy = new_destroy_func; g_datalist_unlock (datalist); } else { old = *data; data->data = new_data; data->destroy = new_destroy_func; g_datalist_unlock (datalist); /* We found and replaced an old value * the GData struct *must* already be unlinked * when invoking the destroy function. */ if (dataset) G_UNLOCK (g_dataset_global); old.destroy (old.data); if (dataset) G_LOCK (g_dataset_global); } return NULL; } data++; } } /* The key was not found, insert it */ old_d = d; if (d == NULL) { 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); d->data[d->len].key = key_id; d->data[d->len].data = new_data; d->data[d->len].destroy = new_destroy_func; d->len++; } g_datalist_unlock (datalist); return NULL; } /** * g_dataset_id_set_data_full: * @dataset_location: the location identifying the dataset. * @key_id: the #GQuark id to identify the data element. * @data: the data element. * @destroy_func: the function to call when the data element is * removed. This function will be called with the data * element and can be used to free any memory allocated * for it. * * Sets the data element associated with the given #GQuark id, and also * the function to call when the data element is destroyed. Any * previous data with the same key is removed, and its destroy function * is called. **/ /** * g_dataset_set_data_full: * @l: the location identifying the dataset. * @k: the string to identify the data element. * @d: the data element. * @f: the function to call when the data element is removed. This * function will be called with the data element and can be used to * free any memory allocated for it. * * Sets the data corresponding to the given string identifier, and the * function to call when the data element is destroyed. **/ /** * g_dataset_id_set_data: * @l: the location identifying the dataset. * @k: the #GQuark id to identify the data element. * @d: the data element. * * Sets the data element associated with the given #GQuark id. Any * previous data with the same key is removed, and its destroy function * is called. **/ /** * g_dataset_set_data: * @l: the location identifying the dataset. * @k: the string to identify the data element. * @d: the data element. * * Sets the data corresponding to the given string identifier. **/ /** * g_dataset_id_remove_data: * @l: the location identifying the dataset. * @k: the #GQuark id identifying the data element. * * Removes a data element from a dataset. The data element's destroy * function is called if it has been set. **/ /** * g_dataset_remove_data: * @l: the location identifying the dataset. * @k: the string identifying the data element. * * Removes a data element corresponding to a string. Its destroy * function is called if it has been set. **/ void g_dataset_id_set_data_full (gconstpointer dataset_location, GQuark key_id, gpointer data, GDestroyNotify destroy_func) { register GDataset *dataset; g_return_if_fail (dataset_location != NULL); if (!data) g_return_if_fail (destroy_func == NULL); if (!key_id) { if (data) g_return_if_fail (key_id > 0); else return; } G_LOCK (g_dataset_global); if (!g_dataset_location_ht) g_data_initialize (); dataset = g_dataset_lookup (dataset_location); if (!dataset) { dataset = g_slice_new (GDataset); dataset->location = dataset_location; g_datalist_init (&dataset->datalist); g_hash_table_insert (g_dataset_location_ht, (gpointer) dataset->location, dataset); } g_data_set_internal (&dataset->datalist, key_id, data, destroy_func, dataset); G_UNLOCK (g_dataset_global); } /** * g_datalist_id_set_data_full: * @datalist: a datalist. * @key_id: the #GQuark to identify the data element. * @data: (allow-none): the data element or %NULL to remove any previous element * corresponding to @key_id. * @destroy_func: the function to call when the data element is * removed. This function will be called with the data * element and can be used to free any memory allocated * for it. If @data is %NULL, then @destroy_func must * also be %NULL. * * Sets the data corresponding to the given #GQuark id, and the * function to be called when the element is removed from the datalist. * Any previous data with the same key is removed, and its destroy * function is called. **/ /** * g_datalist_set_data_full: * @dl: a datalist. * @k: the string to identify the data element. * @d: (allow-none): the data element, or %NULL to remove any previous element * corresponding to @k. * @f: the function to call when the data element is removed. This * function will be called with the data element and can be used to * free any memory allocated for it. If @d is %NULL, then @f must * also be %NULL. * * Sets the data element corresponding to the given string identifier, * and the function to be called when the data element is removed. **/ /** * g_datalist_id_set_data: * @dl: a datalist. * @q: the #GQuark to identify the data element. * @d: (allow-none): the data element, or %NULL to remove any previous element * corresponding to @q. * * Sets the data corresponding to the given #GQuark id. Any previous * data with the same key is removed, and its destroy function is * called. **/ /** * g_datalist_set_data: * @dl: a datalist. * @k: the string to identify the data element. * @d: (allow-none): the data element, or %NULL to remove any previous element * corresponding to @k. * * Sets the data element corresponding to the given string identifier. **/ /** * g_datalist_id_remove_data: * @dl: a datalist. * @q: the #GQuark identifying the data element. * * Removes an element, using its #GQuark identifier. **/ /** * g_datalist_remove_data: * @dl: a datalist. * @k: the string identifying the data element. * * Removes an element using its string identifier. The data element's * destroy function is called if it has been set. **/ void g_datalist_id_set_data_full (GData **datalist, GQuark key_id, gpointer data, GDestroyNotify destroy_func) { g_return_if_fail (datalist != NULL); if (!data) g_return_if_fail (destroy_func == NULL); if (!key_id) { if (data) g_return_if_fail (key_id > 0); else return; } g_data_set_internal (datalist, key_id, data, destroy_func, NULL); } /** * g_dataset_id_remove_no_notify: * @dataset_location: the location identifying the dataset. * @key_id: the #GQuark ID identifying the data element. * * 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: * @l: the location identifying the dataset. * @k: the string identifying the data element. * * Removes an element, without calling its destroy notifier. **/ gpointer g_dataset_id_remove_no_notify (gconstpointer dataset_location, GQuark key_id) { gpointer ret_data = NULL; g_return_val_if_fail (dataset_location != NULL, NULL); G_LOCK (g_dataset_global); if (key_id && g_dataset_location_ht) { GDataset *dataset; dataset = g_dataset_lookup (dataset_location); if (dataset) ret_data = g_data_set_internal (&dataset->datalist, key_id, NULL, (GDestroyNotify) 42, dataset); } G_UNLOCK (g_dataset_global); return ret_data; } /** * g_datalist_id_remove_no_notify: * @datalist: a datalist. * @key_id: the #GQuark identifying a data element. * * 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: * @dl: a datalist. * @k: the string identifying the data element. * * Removes an element, without calling its destroy notifier. **/ gpointer g_datalist_id_remove_no_notify (GData **datalist, GQuark key_id) { gpointer ret_data = NULL; g_return_val_if_fail (datalist != NULL, NULL); if (key_id) ret_data = g_data_set_internal (datalist, key_id, NULL, (GDestroyNotify) 42, NULL); return ret_data; } /** * g_dataset_id_get_data: * @dataset_location: the location identifying the dataset. * @key_id: the #GQuark id to identify the data element. * * 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. * * 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, GQuark key_id) { gpointer retval = NULL; g_return_val_if_fail (dataset_location != NULL, NULL); G_LOCK (g_dataset_global); if (key_id && g_dataset_location_ht) { GDataset *dataset; dataset = g_dataset_lookup (dataset_location); if (dataset) retval = g_datalist_id_get_data (&dataset->datalist, key_id); } G_UNLOCK (g_dataset_global); return retval; } /** * g_datalist_id_get_data: * @datalist: a datalist. * @key_id: the #GQuark identifying a data element. * * 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) { 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); g_return_val_if_fail (key_id != 0, 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; break; } data++; } } if (dup_func) retval = dup_func (val, user_data); else retval = val; 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) { 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); d->data[d->len].key = key_id; d->data[d->len].data = newval; d->data[d->len].destroy = destroy; d->len++; } g_datalist_unlock (datalist); return val == oldval; } /** * g_datalist_get_data: * @datalist: a datalist. * @key: the string identifying a data element. * * 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, const gchar *key) { gpointer res = NULL; GData *d; GDataElt *data, *data_end; g_return_val_if_fail (datalist != NULL, NULL); g_datalist_lock (datalist); d = G_DATALIST_GET_POINTER (datalist); if (d) { data = d->data; data_end = data + d->len; while (data < data_end) { if (strcmp (g_quark_to_string (data->key), key) == 0) { res = data->data; break; } data++; } } g_datalist_unlock (datalist); return res; } /** * GDataForeachFunc: * @key_id: the #GQuark id to identifying the data element. * @data: the data element. * @user_data: user data passed to g_dataset_foreach(). * * Specifies the type of function passed to g_dataset_foreach(). It is * called with each #GQuark id and associated data element, together * with the @user_data parameter supplied to g_dataset_foreach(). **/ /** * g_dataset_foreach: * @dataset_location: the location identifying the dataset. * @func: the function to call for each data element. * @user_data: user data to pass to the function. * * Calls the given function for each data element which is associated * with the given location. Note that this function is NOT thread-safe. * So unless @datalist can be protected from any modifications during * invocation of this function, it should not be called. **/ void g_dataset_foreach (gconstpointer dataset_location, GDataForeachFunc func, gpointer user_data) { register GDataset *dataset; g_return_if_fail (dataset_location != NULL); g_return_if_fail (func != NULL); G_LOCK (g_dataset_global); if (g_dataset_location_ht) { dataset = g_dataset_lookup (dataset_location); G_UNLOCK (g_dataset_global); if (dataset) g_datalist_foreach (&dataset->datalist, func, user_data); } else { G_UNLOCK (g_dataset_global); } } /** * g_datalist_foreach: * @datalist: a datalist. * @func: the function to call for each data element. * @user_data: user data to pass to the function. * * Calls the given function for each data element of the datalist. The * function is called with each data element's #GQuark id and data, * together with the given @user_data parameter. Note that this * function is NOT thread-safe. So unless @datalist can be protected * from any modifications during invocation of this function, it should * not be called. **/ void g_datalist_foreach (GData **datalist, GDataForeachFunc func, gpointer user_data) { GData *d; int i, j, len; GQuark *keys; g_return_if_fail (datalist != NULL); g_return_if_fail (func != NULL); d = G_DATALIST_GET_POINTER (datalist); if (d == NULL) return; /* We make a copy of the keys so that we can handle it changing in the callback */ len = d->len; keys = g_new (GQuark, len); for (i = 0; i < len; i++) keys[i] = d->data[i].key; for (i = 0; i < len; i++) { /* A previous callback might have removed a later item, so always check that it still exists before calling */ d = G_DATALIST_GET_POINTER (datalist); if (d == NULL) break; for (j = 0; j < d->len; j++) { if (d->data[j].key == keys[i]) { func (d->data[i].key, d->data[i].data, user_data); break; } } } g_free (keys); } /** * g_datalist_init: * @datalist: a pointer to a pointer to a datalist. * * Resets the datalist to %NULL. It does not free any memory or call * any destroy functions. **/ void g_datalist_init (GData **datalist) { g_return_if_fail (datalist != NULL); g_atomic_pointer_set (datalist, NULL); } /** * g_datalist_set_flags: * @datalist: pointer to the location that holds a list * @flags: the flags to turn on. The values of the flags are * restricted by %G_DATALIST_FLAGS_MASK (currently * 3; giving two possible boolean flags). * A value for @flags that doesn't fit within the mask is * an error. * * Turns on flag values for a data list. This function is used * to keep a small number of boolean flags in an object with * a data list without using any additional space. It is * not generally useful except in circumstances where space * is very tight. (It is used in the base #GObject type, for * example.) * * Since: 2.8 **/ void g_datalist_set_flags (GData **datalist, guint flags) { g_return_if_fail (datalist != NULL); g_return_if_fail ((flags & ~G_DATALIST_FLAGS_MASK) == 0); g_atomic_pointer_or (datalist, (gsize)flags); } /** * g_datalist_unset_flags: * @datalist: pointer to the location that holds a list * @flags: the flags to turn off. The values of the flags are * restricted by %G_DATALIST_FLAGS_MASK (currently * 3: giving two possible boolean flags). * A value for @flags that doesn't fit within the mask is * an error. * * Turns off flag values for a data list. See g_datalist_unset_flags() * * Since: 2.8 **/ void g_datalist_unset_flags (GData **datalist, guint flags) { g_return_if_fail (datalist != NULL); g_return_if_fail ((flags & ~G_DATALIST_FLAGS_MASK) == 0); g_atomic_pointer_and (datalist, ~(gsize)flags); } /** * g_datalist_get_flags: * @datalist: pointer to the location that holds a list * * Gets flags values packed in together with the datalist. * See g_datalist_set_flags(). * * Return value: the flags of the datalist * * Since: 2.8 **/ guint g_datalist_get_flags (GData **datalist) { g_return_val_if_fail (datalist != NULL, 0); return G_DATALIST_GET_FLAGS (datalist); /* atomic macro */ } /* HOLDS: g_dataset_global_lock */ static void g_data_initialize (void) { g_return_if_fail (g_dataset_location_ht == NULL); g_dataset_location_ht = g_hash_table_new (g_direct_hash, NULL); g_dataset_cached = NULL; } pkg-config-0.29.1/glib/glib/gdate.h0000664000175000017500000002672012651243552013655 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the GLib Team and others 1997-2000. See the AUTHORS * file for a list of people on the GLib Team. See the ChangeLog * files for a list of changes. These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/. */ #ifndef __G_DATE_H__ #define __G_DATE_H__ #if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) #error "Only can be included directly." #endif #include #include #include G_BEGIN_DECLS /* GDate * * Date calculations (not time for now, to be resolved). These are a * mutant combination of Steffen Beyer's DateCalc routines * (http://www.perl.com/CPAN/authors/id/STBEY/) and Jon Trowbridge's * date routines (written for in-house software). Written by Havoc * Pennington */ typedef gint32 GTime; typedef guint16 GDateYear; typedef guint8 GDateDay; /* day of the month */ typedef struct _GDate GDate; /* enum used to specify order of appearance in parsed date strings */ typedef enum { G_DATE_DAY = 0, G_DATE_MONTH = 1, G_DATE_YEAR = 2 } GDateDMY; /* actual week and month values */ typedef enum { G_DATE_BAD_WEEKDAY = 0, G_DATE_MONDAY = 1, G_DATE_TUESDAY = 2, G_DATE_WEDNESDAY = 3, G_DATE_THURSDAY = 4, G_DATE_FRIDAY = 5, G_DATE_SATURDAY = 6, G_DATE_SUNDAY = 7 } GDateWeekday; typedef enum { G_DATE_BAD_MONTH = 0, G_DATE_JANUARY = 1, G_DATE_FEBRUARY = 2, G_DATE_MARCH = 3, G_DATE_APRIL = 4, G_DATE_MAY = 5, G_DATE_JUNE = 6, G_DATE_JULY = 7, G_DATE_AUGUST = 8, G_DATE_SEPTEMBER = 9, G_DATE_OCTOBER = 10, G_DATE_NOVEMBER = 11, G_DATE_DECEMBER = 12 } GDateMonth; #define G_DATE_BAD_JULIAN 0U #define G_DATE_BAD_DAY 0U #define G_DATE_BAD_YEAR 0U /* Note: directly manipulating structs is generally a bad idea, but * in this case it's an *incredibly* bad idea, because all or part * of this struct can be invalid at any given time. Use the functions, * or you will get hosed, I promise. */ struct _GDate { guint julian_days : 32; /* julian days representation - we use a * bitfield hoping that 64 bit platforms * will pack this whole struct in one big * int */ guint julian : 1; /* julian is valid */ guint dmy : 1; /* dmy is valid */ /* DMY representation */ guint day : 6; guint month : 4; guint year : 16; }; /* g_date_new() returns an invalid date, you then have to _set() stuff * to get a usable object. You can also allocate a GDate statically, * then call g_date_clear() to initialize. */ 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 * _parse. Almost all g_date operations are undefined on invalid * 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 * routine needs to be added. * 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); /* The parse routine is meant for dates typed in by a user, so it * permits many formats but tries to catch common typos. If your data * needs to be strictly validated, it is not an appropriate function. */ 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 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, const GDate *date); #ifndef G_DISABLE_DEPRECATED #define g_date_weekday g_date_get_weekday #define g_date_month g_date_get_month #define g_date_year g_date_get_year #define g_date_day g_date_get_day #define g_date_julian g_date_get_julian #define g_date_day_of_year g_date_get_day_of_year #define g_date_monday_week_of_year g_date_get_monday_week_of_year #define g_date_sunday_week_of_year g_date_get_sunday_week_of_year #define g_date_days_in_month g_date_get_days_in_month #define g_date_monday_weeks_in_year g_date_get_monday_weeks_in_year #define g_date_sunday_weeks_in_year g_date_get_sunday_weeks_in_year #endif /* G_DISABLE_DEPRECATED */ G_END_DECLS #endif /* __G_DATE_H__ */ pkg-config-0.29.1/glib/glib/gcharsetprivate.h0000664000175000017500000000174512651243552015764 00000000000000/* 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 pkg-config-0.29.1/glib/glib/gconvert.h0000664000175000017500000001544612651243552014423 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the GLib Team and others 1997-2000. See the AUTHORS * file for a list of people on the GLib Team. See the ChangeLog * files for a list of changes. These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/. */ #ifndef __G_CONVERT_H__ #define __G_CONVERT_H__ #if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) #error "Only can be included directly." #endif #include G_BEGIN_DECLS /** * GConvertError: * @G_CONVERT_ERROR_NO_CONVERSION: Conversion between the requested character * sets is not supported. * @G_CONVERT_ERROR_ILLEGAL_SEQUENCE: Invalid byte sequence in conversion input. * @G_CONVERT_ERROR_FAILED: Conversion failed for some reason. * @G_CONVERT_ERROR_PARTIAL_INPUT: Partial character sequence at end of input. * @G_CONVERT_ERROR_BAD_URI: URI is invalid. * @G_CONVERT_ERROR_NOT_ABSOLUTE_PATH: Pathname is not an absolute path. * * Error codes returned by character set conversion routines. */ typedef enum { G_CONVERT_ERROR_NO_CONVERSION, G_CONVERT_ERROR_ILLEGAL_SEQUENCE, G_CONVERT_ERROR_FAILED, G_CONVERT_ERROR_PARTIAL_INPUT, G_CONVERT_ERROR_BAD_URI, G_CONVERT_ERROR_NOT_ABSOLUTE_PATH } GConvertError; /** * G_CONVERT_ERROR: * * Error domain for character set conversions. Errors in this domain will * be from the #GConvertError enumeration. See #GError for information on * error domains. */ #define G_CONVERT_ERROR g_convert_error_quark() GLIB_AVAILABLE_IN_ALL GQuark g_convert_error_quark (void); /** * GIconv: * * The GIConv struct wraps an * iconv() conversion descriptor. It contains private data * and should only be accessed using the following functions. */ 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, const gchar *from_codeset, 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, const gchar *from_codeset, const gchar *fallback, gsize *bytes_read, gsize *bytes_written, GError **error) G_GNUC_MALLOC; /* 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, gsize *bytes_written, GError **error) G_GNUC_MALLOC; /* Convert between the operating system (or C runtime) * representation of file names and UTF-8. */ 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__ */ pkg-config-0.29.1/glib/glib/gunicode.h0000664000175000017500000010253712651243552014367 00000000000000/* gunicode.h - Unicode manipulation functions * * Copyright (C) 1999, 2000 Tom Tromey * Copyright 2000, 2005 Red Hat, Inc. * * The Gnome Library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * The Gnome Library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with the Gnome Library; see the file COPYING.LIB. If not, * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __G_UNICODE_H__ #define __G_UNICODE_H__ #if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) #error "Only can be included directly." #endif #include #include G_BEGIN_DECLS /** * gunichar: * * A type which can hold any UTF-32 or UCS-4 character code, * also known as a Unicode code point. * * If you want to produce the UTF-8 representation of a #gunichar, * use g_ucs4_to_utf8(). See also g_utf8_to_ucs4() for the reverse * process. * * To print/scan values of this type as integer, use * %G_GINT32_MODIFIER and/or %G_GUINT32_FORMAT. * * The notation to express a Unicode code point in running text is * as a hexadecimal number with four to six digits and uppercase * letters, prefixed by the string "U+". Leading zeros are omitted, * unless the code point would have fewer than four hexadecimal digits. * For example, "U+0041 LATIN CAPITAL LETTER A". To print a code point * in the U+-notation, use the format string "U+\%04"G_GINT32_FORMAT"X". * To scan, use the format string "U+\%06"G_GINT32_FORMAT"X". * * |[ * gunichar c; * sscanf ("U+0041", "U+%06"G_GINT32_FORMAT"X", &c) * g_print ("Read U+%04"G_GINT32_FORMAT"X", c); * ]| */ typedef guint32 gunichar; /** * gunichar2: * * A type which can hold any UTF-16 code * pointUTF-16 also has so called * surrogate pairs to encode characters beyond * the BMP as pairs of 16bit numbers. Surrogate pairs cannot be stored * in a single gunichar2 field, but all GLib functions accepting gunichar2 * arrays will correctly interpret surrogate pairs.. * * To print/scan values of this type to/from text you need to convert * to/from UTF-8, using g_utf16_to_utf8()/g_utf8_to_utf16(). * * To print/scan values of this type as integer, use * %G_GINT16_MODIFIER and/or %G_GUINT16_FORMAT. */ typedef guint16 gunichar2; /** * GUnicodeType: * @G_UNICODE_CONTROL: General category "Other, Control" (Cc) * @G_UNICODE_FORMAT: General category "Other, Format" (Cf) * @G_UNICODE_UNASSIGNED: General category "Other, Not Assigned" (Cn) * @G_UNICODE_PRIVATE_USE: General category "Other, Private Use" (Co) * @G_UNICODE_SURROGATE: General category "Other, Surrogate" (Cs) * @G_UNICODE_LOWERCASE_LETTER: General category "Letter, Lowercase" (Ll) * @G_UNICODE_MODIFIER_LETTER: General category "Letter, Modifier" (Lm) * @G_UNICODE_OTHER_LETTER: General category "Letter, Other" (Lo) * @G_UNICODE_TITLECASE_LETTER: General category "Letter, Titlecase" (Lt) * @G_UNICODE_UPPERCASE_LETTER: General category "Letter, Uppercase" (Lu) * @G_UNICODE_SPACING_MARK: General category "Mark, Spacing" (Mc) * @G_UNICODE_ENCLOSING_MARK: General category "Mark, Enclosing" (Me) * @G_UNICODE_NON_SPACING_MARK: General category "Mark, Nonspacing" (Mn) * @G_UNICODE_DECIMAL_NUMBER: General category "Number, Decimal Digit" (Nd) * @G_UNICODE_LETTER_NUMBER: General category "Number, Letter" (Nl) * @G_UNICODE_OTHER_NUMBER: General category "Number, Other" (No) * @G_UNICODE_CONNECT_PUNCTUATION: General category "Punctuation, Connector" (Pc) * @G_UNICODE_DASH_PUNCTUATION: General category "Punctuation, Dash" (Pd) * @G_UNICODE_CLOSE_PUNCTUATION: General category "Punctuation, Close" (Pe) * @G_UNICODE_FINAL_PUNCTUATION: General category "Punctuation, Final quote" (Pf) * @G_UNICODE_INITIAL_PUNCTUATION: General category "Punctuation, Initial quote" (Pi) * @G_UNICODE_OTHER_PUNCTUATION: General category "Punctuation, Other" (Po) * @G_UNICODE_OPEN_PUNCTUATION: General category "Punctuation, Open" (Ps) * @G_UNICODE_CURRENCY_SYMBOL: General category "Symbol, Currency" (Sc) * @G_UNICODE_MODIFIER_SYMBOL: General category "Symbol, Modifier" (Sk) * @G_UNICODE_MATH_SYMBOL: General category "Symbol, Math" (Sm) * @G_UNICODE_OTHER_SYMBOL: General category "Symbol, Other" (So) * @G_UNICODE_LINE_SEPARATOR: General category "Separator, Line" (Zl) * @G_UNICODE_PARAGRAPH_SEPARATOR: General category "Separator, Paragraph" (Zp) * @G_UNICODE_SPACE_SEPARATOR: General category "Separator, Space" (Zs) * * These are the possible character classifications from the * Unicode specification. * See http://www.unicode.org/Public/UNIDATA/UnicodeData.html. */ typedef enum { G_UNICODE_CONTROL, G_UNICODE_FORMAT, G_UNICODE_UNASSIGNED, G_UNICODE_PRIVATE_USE, G_UNICODE_SURROGATE, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_TITLECASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_SPACING_MARK, G_UNICODE_ENCLOSING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_LETTER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_CONNECT_PUNCTUATION, G_UNICODE_DASH_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_FINAL_PUNCTUATION, G_UNICODE_INITIAL_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CURRENCY_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_LINE_SEPARATOR, G_UNICODE_PARAGRAPH_SEPARATOR, G_UNICODE_SPACE_SEPARATOR } GUnicodeType; /** * G_UNICODE_COMBINING_MARK: * * Older name for %G_UNICODE_SPACING_MARK. * * Deprecated: 2.30: Use %G_UNICODE_SPACING_MARK. */ #ifndef G_DISABLE_DEPRECATED #define G_UNICODE_COMBINING_MARK G_UNICODE_SPACING_MARK #endif /** * GUnicodeBreakType: * @G_UNICODE_BREAK_MANDATORY: Mandatory Break (BK) * @G_UNICODE_BREAK_CARRIAGE_RETURN: Carriage Return (CR) * @G_UNICODE_BREAK_LINE_FEED: Line Feed (LF) * @G_UNICODE_BREAK_COMBINING_MARK: Attached Characters and Combining Marks (CM) * @G_UNICODE_BREAK_SURROGATE: Surrogates (SG) * @G_UNICODE_BREAK_ZERO_WIDTH_SPACE: Zero Width Space (ZW) * @G_UNICODE_BREAK_INSEPARABLE: Inseparable (IN) * @G_UNICODE_BREAK_NON_BREAKING_GLUE: Non-breaking ("Glue") (GL) * @G_UNICODE_BREAK_CONTINGENT: Contingent Break Opportunity (CB) * @G_UNICODE_BREAK_SPACE: Space (SP) * @G_UNICODE_BREAK_AFTER: Break Opportunity After (BA) * @G_UNICODE_BREAK_BEFORE: Break Opportunity Before (BB) * @G_UNICODE_BREAK_BEFORE_AND_AFTER: Break Opportunity Before and After (B2) * @G_UNICODE_BREAK_HYPHEN: Hyphen (HY) * @G_UNICODE_BREAK_NON_STARTER: Nonstarter (NS) * @G_UNICODE_BREAK_OPEN_PUNCTUATION: Opening Punctuation (OP) * @G_UNICODE_BREAK_CLOSE_PUNCTUATION: Closing Punctuation (CL) * @G_UNICODE_BREAK_QUOTATION: Ambiguous Quotation (QU) * @G_UNICODE_BREAK_EXCLAMATION: Exclamation/Interrogation (EX) * @G_UNICODE_BREAK_IDEOGRAPHIC: Ideographic (ID) * @G_UNICODE_BREAK_NUMERIC: Numeric (NU) * @G_UNICODE_BREAK_INFIX_SEPARATOR: Infix Separator (Numeric) (IS) * @G_UNICODE_BREAK_SYMBOL: Symbols Allowing Break After (SY) * @G_UNICODE_BREAK_ALPHABETIC: Ordinary Alphabetic and Symbol Characters (AL) * @G_UNICODE_BREAK_PREFIX: Prefix (Numeric) (PR) * @G_UNICODE_BREAK_POSTFIX: Postfix (Numeric) (PO) * @G_UNICODE_BREAK_COMPLEX_CONTEXT: Complex Content Dependent (South East Asian) (SA) * @G_UNICODE_BREAK_AMBIGUOUS: Ambiguous (Alphabetic or Ideographic) (AI) * @G_UNICODE_BREAK_UNKNOWN: Unknown (XX) * @G_UNICODE_BREAK_NEXT_LINE: Next Line (NL) * @G_UNICODE_BREAK_WORD_JOINER: Word Joiner (WJ) * @G_UNICODE_BREAK_HANGUL_L_JAMO: Hangul L Jamo (JL) * @G_UNICODE_BREAK_HANGUL_V_JAMO: Hangul V Jamo (JV) * @G_UNICODE_BREAK_HANGUL_T_JAMO: Hangul T Jamo (JT) * @G_UNICODE_BREAK_HANGUL_LV_SYLLABLE: Hangul LV Syllable (H2) * @G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE: Hangul LVT Syllable (H3) * @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. * * 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 http://www.unicode.org/unicode/reports/tr14/. */ typedef enum { G_UNICODE_BREAK_MANDATORY, G_UNICODE_BREAK_CARRIAGE_RETURN, G_UNICODE_BREAK_LINE_FEED, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_SURROGATE, G_UNICODE_BREAK_ZERO_WIDTH_SPACE, G_UNICODE_BREAK_INSEPARABLE, G_UNICODE_BREAK_NON_BREAKING_GLUE, G_UNICODE_BREAK_CONTINGENT, G_UNICODE_BREAK_SPACE, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_BEFORE, G_UNICODE_BREAK_BEFORE_AND_AFTER, G_UNICODE_BREAK_HYPHEN, G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_EXCLAMATION, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_INFIX_SEPARATOR, G_UNICODE_BREAK_SYMBOL, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_POSTFIX, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_NEXT_LINE, G_UNICODE_BREAK_WORD_JOINER, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_CLOSE_PARANTHESIS, G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_REGIONAL_INDICATOR } GUnicodeBreakType; /** * GUnicodeScript: * @G_UNICODE_SCRIPT_INVALID_CODE: * a value never returned from g_unichar_get_script() * @G_UNICODE_SCRIPT_COMMON: a character used by multiple different scripts * @G_UNICODE_SCRIPT_INHERITED: a mark glyph that takes its script from the * i base glyph to which it is attached * @G_UNICODE_SCRIPT_ARABIC: Arabic * @G_UNICODE_SCRIPT_ARMENIAN: Armenian * @G_UNICODE_SCRIPT_BENGALI: Bengali * @G_UNICODE_SCRIPT_BOPOMOFO: Bopomofo * @G_UNICODE_SCRIPT_CHEROKEE: Cherokee * @G_UNICODE_SCRIPT_COPTIC: Coptic * @G_UNICODE_SCRIPT_CYRILLIC: Cyrillic * @G_UNICODE_SCRIPT_DESERET: Deseret * @G_UNICODE_SCRIPT_DEVANAGARI: Devanagari * @G_UNICODE_SCRIPT_ETHIOPIC: Ethiopic * @G_UNICODE_SCRIPT_GEORGIAN: Georgian * @G_UNICODE_SCRIPT_GOTHIC: Gothic * @G_UNICODE_SCRIPT_GREEK: Greek * @G_UNICODE_SCRIPT_GUJARATI: Gujarati * @G_UNICODE_SCRIPT_GURMUKHI: Gurmukhi * @G_UNICODE_SCRIPT_HAN: Han * @G_UNICODE_SCRIPT_HANGUL: Hangul * @G_UNICODE_SCRIPT_HEBREW: Hebrew * @G_UNICODE_SCRIPT_HIRAGANA: Hiragana * @G_UNICODE_SCRIPT_KANNADA: Kannada * @G_UNICODE_SCRIPT_KATAKANA: Katakana * @G_UNICODE_SCRIPT_KHMER: Khmer * @G_UNICODE_SCRIPT_LAO: Lao * @G_UNICODE_SCRIPT_LATIN: Latin * @G_UNICODE_SCRIPT_MALAYALAM: Malayalam * @G_UNICODE_SCRIPT_MONGOLIAN: Mongolian * @G_UNICODE_SCRIPT_MYANMAR: Myanmar * @G_UNICODE_SCRIPT_OGHAM: Ogham * @G_UNICODE_SCRIPT_OLD_ITALIC: Old Italic * @G_UNICODE_SCRIPT_ORIYA: Oriya * @G_UNICODE_SCRIPT_RUNIC: Runic * @G_UNICODE_SCRIPT_SINHALA: Sinhala * @G_UNICODE_SCRIPT_SYRIAC: Syriac * @G_UNICODE_SCRIPT_TAMIL: Tamil * @G_UNICODE_SCRIPT_TELUGU: Telugu * @G_UNICODE_SCRIPT_THAANA: Thaana * @G_UNICODE_SCRIPT_THAI: Thai * @G_UNICODE_SCRIPT_TIBETAN: Tibetan * @G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL: * Canadian Aboriginal * @G_UNICODE_SCRIPT_YI: Yi * @G_UNICODE_SCRIPT_TAGALOG: Tagalog * @G_UNICODE_SCRIPT_HANUNOO: Hanunoo * @G_UNICODE_SCRIPT_BUHID: Buhid * @G_UNICODE_SCRIPT_TAGBANWA: Tagbanwa * @G_UNICODE_SCRIPT_BRAILLE: Braille * @G_UNICODE_SCRIPT_CYPRIOT: Cypriot * @G_UNICODE_SCRIPT_LIMBU: Limbu * @G_UNICODE_SCRIPT_OSMANYA: Osmanya * @G_UNICODE_SCRIPT_SHAVIAN: Shavian * @G_UNICODE_SCRIPT_LINEAR_B: Linear B * @G_UNICODE_SCRIPT_TAI_LE: Tai Le * @G_UNICODE_SCRIPT_UGARITIC: Ugaritic * @G_UNICODE_SCRIPT_NEW_TAI_LUE: * New Tai Lue * @G_UNICODE_SCRIPT_BUGINESE: Buginese * @G_UNICODE_SCRIPT_GLAGOLITIC: Glagolitic * @G_UNICODE_SCRIPT_TIFINAGH: Tifinagh * @G_UNICODE_SCRIPT_SYLOTI_NAGRI: * Syloti Nagri * @G_UNICODE_SCRIPT_OLD_PERSIAN: * Old Persian * @G_UNICODE_SCRIPT_KHAROSHTHI: Kharoshthi * @G_UNICODE_SCRIPT_UNKNOWN: an unassigned code point * @G_UNICODE_SCRIPT_BALINESE: Balinese * @G_UNICODE_SCRIPT_CUNEIFORM: Cuneiform * @G_UNICODE_SCRIPT_PHOENICIAN: Phoenician * @G_UNICODE_SCRIPT_PHAGS_PA: Phags-pa * @G_UNICODE_SCRIPT_NKO: N'Ko * @G_UNICODE_SCRIPT_KAYAH_LI: Kayah Li. Since 2.16.3 * @G_UNICODE_SCRIPT_LEPCHA: Lepcha. Since 2.16.3 * @G_UNICODE_SCRIPT_REJANG: Rejang. Since 2.16.3 * @G_UNICODE_SCRIPT_SUNDANESE: Sundanese. Since 2.16.3 * @G_UNICODE_SCRIPT_SAURASHTRA: Saurashtra. Since 2.16.3 * @G_UNICODE_SCRIPT_CHAM: Cham. Since 2.16.3 * @G_UNICODE_SCRIPT_OL_CHIKI: Ol Chiki. Since 2.16.3 * @G_UNICODE_SCRIPT_VAI: Vai. Since 2.16.3 * @G_UNICODE_SCRIPT_CARIAN: Carian. Since 2.16.3 * @G_UNICODE_SCRIPT_LYCIAN: Lycian. Since 2.16.3 * @G_UNICODE_SCRIPT_LYDIAN: Lydian. Since 2.16.3 * @G_UNICODE_SCRIPT_AVESTAN: Avestan. Since 2.26 * @G_UNICODE_SCRIPT_BAMUM: Bamum. Since 2.26 * @G_UNICODE_SCRIPT_EGYPTIAN_HIEROGLYPHS: * Egyptian Hieroglpyhs. Since 2.26 * @G_UNICODE_SCRIPT_IMPERIAL_ARAMAIC: * Imperial Aramaic. Since 2.26 * @G_UNICODE_SCRIPT_INSCRIPTIONAL_PAHLAVI: * Inscriptional Pahlavi. Since 2.26 * @G_UNICODE_SCRIPT_INSCRIPTIONAL_PARTHIAN: * Inscriptional Parthian. Since 2.26 * @G_UNICODE_SCRIPT_JAVANESE: Javanese. Since 2.26 * @G_UNICODE_SCRIPT_KAITHI: Kaithi. Since 2.26 * @G_UNICODE_SCRIPT_LISU: Lisu. Since 2.26 * @G_UNICODE_SCRIPT_MEETEI_MAYEK: * Meetei Mayek. Since 2.26 * @G_UNICODE_SCRIPT_OLD_SOUTH_ARABIAN: * Old South Arabian. Since 2.26 * @G_UNICODE_SCRIPT_OLD_TURKIC: Old Turkic. Since 2.28 * @G_UNICODE_SCRIPT_SAMARITAN: Samaritan. Since 2.26 * @G_UNICODE_SCRIPT_TAI_THAM: Tai Tham. Since 2.26 * @G_UNICODE_SCRIPT_TAI_VIET: Tai Viet. Since 2.26 * @G_UNICODE_SCRIPT_BATAK: Batak. Since 2.28 * @G_UNICODE_SCRIPT_BRAHMI: Brahmi. Since 2.28 * @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_MIAO: Miao. Since: 2.32 * @G_UNICODE_SCRIPT_SHARADA: Sharada. Since: 2.32 * @G_UNICODE_SCRIPT_SORA_SOMPENG: Sora Sompeng. Since: 2.32 * @G_UNICODE_SCRIPT_TAKRI: Takri. Since: 2.32 * * The #GUnicodeScript enumeration identifies different writing * systems. The values correspond to the names as defined in the * Unicode standard. The enumeration has been added in GLib 2.14, * and is interchangeable with #PangoScript. * * Note that new types may be added in the future. Applications * should be ready to handle unknown values. * See Unicode Standard Annex * #24: Script names. */ typedef enum { /* ISO 15924 code */ G_UNICODE_SCRIPT_INVALID_CODE = -1, G_UNICODE_SCRIPT_COMMON = 0, /* Zyyy */ G_UNICODE_SCRIPT_INHERITED, /* Zinh (Qaai) */ G_UNICODE_SCRIPT_ARABIC, /* Arab */ G_UNICODE_SCRIPT_ARMENIAN, /* Armn */ G_UNICODE_SCRIPT_BENGALI, /* Beng */ G_UNICODE_SCRIPT_BOPOMOFO, /* Bopo */ G_UNICODE_SCRIPT_CHEROKEE, /* Cher */ G_UNICODE_SCRIPT_COPTIC, /* Copt (Qaac) */ G_UNICODE_SCRIPT_CYRILLIC, /* Cyrl (Cyrs) */ G_UNICODE_SCRIPT_DESERET, /* Dsrt */ G_UNICODE_SCRIPT_DEVANAGARI, /* Deva */ G_UNICODE_SCRIPT_ETHIOPIC, /* Ethi */ G_UNICODE_SCRIPT_GEORGIAN, /* Geor (Geon, Geoa) */ G_UNICODE_SCRIPT_GOTHIC, /* Goth */ G_UNICODE_SCRIPT_GREEK, /* Grek */ G_UNICODE_SCRIPT_GUJARATI, /* Gujr */ G_UNICODE_SCRIPT_GURMUKHI, /* Guru */ G_UNICODE_SCRIPT_HAN, /* Hani */ G_UNICODE_SCRIPT_HANGUL, /* Hang */ G_UNICODE_SCRIPT_HEBREW, /* Hebr */ G_UNICODE_SCRIPT_HIRAGANA, /* Hira */ G_UNICODE_SCRIPT_KANNADA, /* Knda */ G_UNICODE_SCRIPT_KATAKANA, /* Kana */ G_UNICODE_SCRIPT_KHMER, /* Khmr */ G_UNICODE_SCRIPT_LAO, /* Laoo */ G_UNICODE_SCRIPT_LATIN, /* Latn (Latf, Latg) */ G_UNICODE_SCRIPT_MALAYALAM, /* Mlym */ G_UNICODE_SCRIPT_MONGOLIAN, /* Mong */ G_UNICODE_SCRIPT_MYANMAR, /* Mymr */ G_UNICODE_SCRIPT_OGHAM, /* Ogam */ G_UNICODE_SCRIPT_OLD_ITALIC, /* Ital */ G_UNICODE_SCRIPT_ORIYA, /* Orya */ G_UNICODE_SCRIPT_RUNIC, /* Runr */ G_UNICODE_SCRIPT_SINHALA, /* Sinh */ G_UNICODE_SCRIPT_SYRIAC, /* Syrc (Syrj, Syrn, Syre) */ G_UNICODE_SCRIPT_TAMIL, /* Taml */ G_UNICODE_SCRIPT_TELUGU, /* Telu */ G_UNICODE_SCRIPT_THAANA, /* Thaa */ G_UNICODE_SCRIPT_THAI, /* Thai */ G_UNICODE_SCRIPT_TIBETAN, /* Tibt */ G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, /* Cans */ G_UNICODE_SCRIPT_YI, /* Yiii */ G_UNICODE_SCRIPT_TAGALOG, /* Tglg */ G_UNICODE_SCRIPT_HANUNOO, /* Hano */ G_UNICODE_SCRIPT_BUHID, /* Buhd */ G_UNICODE_SCRIPT_TAGBANWA, /* Tagb */ /* Unicode-4.0 additions */ G_UNICODE_SCRIPT_BRAILLE, /* Brai */ G_UNICODE_SCRIPT_CYPRIOT, /* Cprt */ G_UNICODE_SCRIPT_LIMBU, /* Limb */ G_UNICODE_SCRIPT_OSMANYA, /* Osma */ G_UNICODE_SCRIPT_SHAVIAN, /* Shaw */ G_UNICODE_SCRIPT_LINEAR_B, /* Linb */ G_UNICODE_SCRIPT_TAI_LE, /* Tale */ G_UNICODE_SCRIPT_UGARITIC, /* Ugar */ /* Unicode-4.1 additions */ G_UNICODE_SCRIPT_NEW_TAI_LUE, /* Talu */ G_UNICODE_SCRIPT_BUGINESE, /* Bugi */ G_UNICODE_SCRIPT_GLAGOLITIC, /* Glag */ G_UNICODE_SCRIPT_TIFINAGH, /* Tfng */ G_UNICODE_SCRIPT_SYLOTI_NAGRI, /* Sylo */ G_UNICODE_SCRIPT_OLD_PERSIAN, /* Xpeo */ G_UNICODE_SCRIPT_KHAROSHTHI, /* Khar */ /* Unicode-5.0 additions */ G_UNICODE_SCRIPT_UNKNOWN, /* Zzzz */ G_UNICODE_SCRIPT_BALINESE, /* Bali */ G_UNICODE_SCRIPT_CUNEIFORM, /* Xsux */ G_UNICODE_SCRIPT_PHOENICIAN, /* Phnx */ G_UNICODE_SCRIPT_PHAGS_PA, /* Phag */ G_UNICODE_SCRIPT_NKO, /* Nkoo */ /* Unicode-5.1 additions */ G_UNICODE_SCRIPT_KAYAH_LI, /* Kali */ G_UNICODE_SCRIPT_LEPCHA, /* Lepc */ G_UNICODE_SCRIPT_REJANG, /* Rjng */ G_UNICODE_SCRIPT_SUNDANESE, /* Sund */ G_UNICODE_SCRIPT_SAURASHTRA, /* Saur */ G_UNICODE_SCRIPT_CHAM, /* Cham */ G_UNICODE_SCRIPT_OL_CHIKI, /* Olck */ G_UNICODE_SCRIPT_VAI, /* Vaii */ G_UNICODE_SCRIPT_CARIAN, /* Cari */ G_UNICODE_SCRIPT_LYCIAN, /* Lyci */ G_UNICODE_SCRIPT_LYDIAN, /* Lydi */ /* Unicode-5.2 additions */ G_UNICODE_SCRIPT_AVESTAN, /* Avst */ G_UNICODE_SCRIPT_BAMUM, /* Bamu */ G_UNICODE_SCRIPT_EGYPTIAN_HIEROGLYPHS, /* Egyp */ G_UNICODE_SCRIPT_IMPERIAL_ARAMAIC, /* Armi */ G_UNICODE_SCRIPT_INSCRIPTIONAL_PAHLAVI, /* Phli */ G_UNICODE_SCRIPT_INSCRIPTIONAL_PARTHIAN, /* Prti */ G_UNICODE_SCRIPT_JAVANESE, /* Java */ G_UNICODE_SCRIPT_KAITHI, /* Kthi */ G_UNICODE_SCRIPT_LISU, /* Lisu */ G_UNICODE_SCRIPT_MEETEI_MAYEK, /* Mtei */ G_UNICODE_SCRIPT_OLD_SOUTH_ARABIAN, /* Sarb */ G_UNICODE_SCRIPT_OLD_TURKIC, /* Orkh */ G_UNICODE_SCRIPT_SAMARITAN, /* Samr */ G_UNICODE_SCRIPT_TAI_THAM, /* Lana */ G_UNICODE_SCRIPT_TAI_VIET, /* Tavt */ /* Unicode-6.0 additions */ G_UNICODE_SCRIPT_BATAK, /* Batk */ G_UNICODE_SCRIPT_BRAHMI, /* Brah */ G_UNICODE_SCRIPT_MANDAIC, /* Mand */ /* Unicode-6.1 additions */ G_UNICODE_SCRIPT_CHAKMA, /* Cakm */ G_UNICODE_SCRIPT_MEROITIC_CURSIVE, /* Merc */ G_UNICODE_SCRIPT_MEROITIC_HIEROGLYPHS, /* Mero */ G_UNICODE_SCRIPT_MIAO, /* Plrd */ G_UNICODE_SCRIPT_SHARADA, /* Shrd */ G_UNICODE_SCRIPT_SORA_SOMPENG, /* Sora */ 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 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 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 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, gsize result_len); /** * G_UNICHAR_MAX_DECOMPOSITION_LENGTH: * * The maximum length (in codepoints) of a compatibility or canonical * decomposition of a single Unicode character. * * This is as defined by Unicode 6.1. * * Since: 2.32 */ #define G_UNICHAR_MAX_DECOMPOSITION_LENGTH 18 /* codepoints */ /* 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); GLIB_DEPRECATED_IN_2_30 gunichar *g_unicode_canonical_decomposition (gunichar ch, gsize *result_len) G_GNUC_MALLOC; /* Array of skip-bytes-per-initial character. */ GLIB_VAR const gchar * const g_utf8_skip; /** * g_utf8_next_char: * @p: Pointer to the start of a valid UTF-8 character * * Skips to the next character in a UTF-8 string. The string must be * valid; this macro is as fast as possible, and has no error-checking. * You would use this macro to iterate over a string character by * character. The macro returns the start of the next UTF-8 character. * Before using this macro, use g_utf8_validate() to validate strings * that may contain invalid UTF-8. */ #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; GLIB_AVAILABLE_IN_2_30 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; /** * GNormalizeMode: * @G_NORMALIZE_DEFAULT: standardize differences that do not affect the * text content, such as the above-mentioned accent representation * @G_NORMALIZE_NFD: another name for %G_NORMALIZE_DEFAULT * @G_NORMALIZE_DEFAULT_COMPOSE: like %G_NORMALIZE_DEFAULT, but with * composed forms rather than a maximally decomposed form * @G_NORMALIZE_NFC: another name for %G_NORMALIZE_DEFAULT_COMPOSE * @G_NORMALIZE_ALL: beyond %G_NORMALIZE_DEFAULT also standardize the * "compatibility" characters in Unicode, such as SUPERSCRIPT THREE * to the standard forms (in this case DIGIT THREE). Formatting * information may be lost but for most text operations such * characters should be considered the same * @G_NORMALIZE_NFKD: another name for %G_NORMALIZE_ALL * @G_NORMALIZE_ALL_COMPOSE: like %G_NORMALIZE_ALL, but with composed * forms rather than a maximally decomposed form * @G_NORMALIZE_NFKC: another name for %G_NORMALIZE_ALL_COMPOSE * * Defines how a Unicode string is transformed in a canonical * form, standardizing such issues as whether a character with * an accent is represented as a base character and combining * accent or as a single precomposed character. Unicode strings * should generally be normalized before comparing them. */ typedef enum { G_NORMALIZE_DEFAULT, G_NORMALIZE_NFD = G_NORMALIZE_DEFAULT, G_NORMALIZE_DEFAULT_COMPOSE, G_NORMALIZE_NFC = G_NORMALIZE_DEFAULT_COMPOSE, G_NORMALIZE_ALL, G_NORMALIZE_NFKD = G_NORMALIZE_ALL, G_NORMALIZE_ALL_COMPOSE, G_NORMALIZE_NFKC = G_NORMALIZE_ALL_COMPOSE } GNormalizeMode; 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 #endif /* __G_UNICODE_H__ */ pkg-config-0.29.1/glib/glib/gprimes.h0000664000175000017500000000334412651243552014234 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the GLib Team and others 1997-2000. See the AUTHORS * file for a list of people on the GLib Team. See the ChangeLog * files for a list of changes. These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/. */ #ifndef __G_PRIMES_H__ #define __G_PRIMES_H__ #if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) #error "Only can be included directly." #endif #include G_BEGIN_DECLS /* Prime numbers. */ /* This function returns prime numbers spaced by approximately 1.5-2.0 * and is for use in resizing data structures which prefer * prime-valued sizes. The closest spaced prime function returns the * next largest prime, or the highest it knows about which is about * MAXINT/4. */ GLIB_AVAILABLE_IN_ALL guint g_spaced_primes_closest (guint num) G_GNUC_CONST; G_END_DECLS #endif /* __G_PRIMES_H__ */ pkg-config-0.29.1/glib/glib/gi18n.h0000664000175000017500000000232512275467762013527 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997, 2002 Peter Mattis, Red Hat, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __G_I18N_H__ #define __G_I18N_H__ #include #include #include #define _(String) gettext (String) #define Q_(String) g_dpgettext (NULL, String, 0) #define N_(String) (String) #define C_(Context,String) g_dpgettext (NULL, Context "\004" String, strlen (Context) + 1) #define NC_(Context, String) (String) #endif /* __G_I18N_H__ */ pkg-config-0.29.1/glib/glib/gunibreak.h0000664000175000017500000502162112651243552014540 00000000000000/* This file is automatically generated. DO NOT EDIT! Instead, edit gen-unicode-tables.pl and re-run. */ #ifndef BREAKTABLES_H #define BREAKTABLES_H #include #include #define G_UNICODE_DATA_VERSION "6.2.0" #define G_UNICODE_LAST_CHAR 0x10FFFF #define G_UNICODE_MAX_TABLE_INDEX 10000 /* the last code point that should be looked up in break_property_table_part1 */ #define G_UNICODE_LAST_CHAR_PART1 0x2FAFF static const gint8 break_property_data[][256] = { { /* page 0, index 0 */ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_LINE_FEED, G_UNICODE_BREAK_MANDATORY, G_UNICODE_BREAK_MANDATORY, G_UNICODE_BREAK_CARRIAGE_RETURN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_SPACE, G_UNICODE_BREAK_EXCLAMATION, G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_POSTFIX, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PARANTHESIS, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_INFIX_SEPARATOR, G_UNICODE_BREAK_HYPHEN, G_UNICODE_BREAK_INFIX_SEPARATOR, G_UNICODE_BREAK_SYMBOL, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_INFIX_SEPARATOR, G_UNICODE_BREAK_INFIX_SEPARATOR, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_EXCLAMATION, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_CLOSE_PARANTHESIS, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_NEXT_LINE, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_NON_BREAKING_GLUE, G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_POSTFIX, G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_POSTFIX, G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_BEFORE, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC }, { /* page 2, index 1 */ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_BEFORE, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_BEFORE, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_BEFORE, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC }, { /* page 3, index 2 */ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_NON_BREAKING_GLUE, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_NON_BREAKING_GLUE, G_UNICODE_BREAK_NON_BREAKING_GLUE, G_UNICODE_BREAK_NON_BREAKING_GLUE, G_UNICODE_BREAK_NON_BREAKING_GLUE, G_UNICODE_BREAK_NON_BREAKING_GLUE, G_UNICODE_BREAK_NON_BREAKING_GLUE, G_UNICODE_BREAK_NON_BREAKING_GLUE, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_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_INFIX_SEPARATOR, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC }, { /* page 4, index 3 */ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC }, { /* page 5, index 4 */ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_INFIX_SEPARATOR, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_EXCLAMATION, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 6, index 5 */ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_POSTFIX, G_UNICODE_BREAK_POSTFIX, G_UNICODE_BREAK_POSTFIX, G_UNICODE_BREAK_INFIX_SEPARATOR, G_UNICODE_BREAK_INFIX_SEPARATOR, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_EXCLAMATION, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_EXCLAMATION, G_UNICODE_BREAK_EXCLAMATION, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_POSTFIX, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_EXCLAMATION, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC }, { /* page 7, index 6 */ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_INFIX_SEPARATOR, G_UNICODE_BREAK_EXCLAMATION, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 8, index 7 */ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_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_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN }, { /* page 9, index 8 */ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_POSTFIX, G_UNICODE_BREAK_POSTFIX, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_POSTFIX, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 10, index 9 */ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 11, index 10 */ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 12, index 11 */ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_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_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 13, index 12 */ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_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_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_POSTFIX, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 14, index 13 */ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 15, index 14 */ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_BEFORE, G_UNICODE_BREAK_BEFORE, G_UNICODE_BREAK_BEFORE, G_UNICODE_BREAK_BEFORE, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_BEFORE, G_UNICODE_BREAK_BEFORE, G_UNICODE_BREAK_NON_BREAKING_GLUE, G_UNICODE_BREAK_BEFORE, G_UNICODE_BREAK_BEFORE, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_NON_BREAKING_GLUE, G_UNICODE_BREAK_EXCLAMATION, G_UNICODE_BREAK_EXCLAMATION, G_UNICODE_BREAK_EXCLAMATION, G_UNICODE_BREAK_EXCLAMATION, G_UNICODE_BREAK_EXCLAMATION, G_UNICODE_BREAK_NON_BREAKING_GLUE, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_EXCLAMATION, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_BEFORE, G_UNICODE_BREAK_BEFORE, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_BEFORE, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_NON_BREAKING_GLUE, G_UNICODE_BREAK_NON_BREAKING_GLUE, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 16, index 15 */ G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC }, { /* page 17, index 16 */ G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO }, { /* page 18, index 17 */ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC }, { /* page 19, index 18 */ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 20, index 19 */ G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC }, { /* page 22, index 20 */ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 23, index 21 */ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 24, index 22 */ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_EXCLAMATION, G_UNICODE_BREAK_EXCLAMATION, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_BEFORE, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_EXCLAMATION, G_UNICODE_BREAK_EXCLAMATION, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_NON_BREAKING_GLUE, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 25, index 23 */ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_EXCLAMATION, G_UNICODE_BREAK_EXCLAMATION, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC }, { /* page 26, index 24 */ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 27, index 25 */ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_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 }, { /* page 28, index 26 */ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_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_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 29, index 27 */ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK }, { /* page 31, index 28 */ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_BEFORE, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN }, { /* page 32, index 29 */ G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_NON_BREAKING_GLUE, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_ZERO_WIDTH_SPACE, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_NON_BREAKING_GLUE, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_BEFORE_AND_AFTER, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_INSEPARABLE, G_UNICODE_BREAK_INSEPARABLE, G_UNICODE_BREAK_INSEPARABLE, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_MANDATORY, G_UNICODE_BREAK_MANDATORY, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_NON_BREAKING_GLUE, G_UNICODE_BREAK_POSTFIX, G_UNICODE_BREAK_POSTFIX, G_UNICODE_BREAK_POSTFIX, G_UNICODE_BREAK_POSTFIX, G_UNICODE_BREAK_POSTFIX, G_UNICODE_BREAK_POSTFIX, G_UNICODE_BREAK_POSTFIX, G_UNICODE_BREAK_POSTFIX, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_INFIX_SEPARATOR, G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_WORD_JOINER, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_POSTFIX, G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_POSTFIX, G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 33, index 30 */ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_POSTFIX, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_POSTFIX, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC }, { /* page 34, index 31 */ G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC }, { /* page 35, index 32 */ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_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_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_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, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 36, index 33 */ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC }, { /* page 37, index 34 */ G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC }, { /* page 38, index 35 */ 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, 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_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, 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_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_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, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_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, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_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, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_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_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_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_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, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_EXCLAMATION, G_UNICODE_BREAK_EXCLAMATION, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC }, { /* page 41, index 37 */ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC }, { /* page 43, index 38 */ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 44, index 39 */ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_EXCLAMATION, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_EXCLAMATION, G_UNICODE_BREAK_AFTER }, { /* page 45, index 40 */ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK }, { /* page 46, index 41 */ G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_EXCLAMATION, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_BEFORE_AND_AFTER, G_UNICODE_BREAK_BEFORE_AND_AFTER, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 47, index 42 */ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 48, index 43 */ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_IDEOGRAPHIC }, { /* page 49, index 44 */ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER }, { /* page 50, index 45 */ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_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_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_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_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_UNKNOWN }, { /* page 77, index 46 */ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_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_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC }, { /* page 160, index 47 */ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC }, { /* page 164, index 48 */ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER }, { /* page 166, index 49 */ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_EXCLAMATION, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_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_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 167, index 50 */ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_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 }, { /* page 168, index 51 */ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_POSTFIX, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_BEFORE, G_UNICODE_BREAK_BEFORE, G_UNICODE_BREAK_EXCLAMATION, G_UNICODE_BREAK_EXCLAMATION, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 169, index 52 */ G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 170, index 53 */ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_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_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 171, index 54 */ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_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_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 172, index 55 */ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 173, index 56 */ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 174, index 57 */ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 175, index 58 */ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 176, index 59 */ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 177, index 60 */ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 178, index 61 */ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 179, index 62 */ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 180, index 63 */ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 181, index 64 */ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 182, index 65 */ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 183, index 66 */ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 184, index 67 */ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 185, index 68 */ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 186, index 69 */ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 187, index 70 */ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 188, index 71 */ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 189, index 72 */ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 190, index 73 */ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 191, index 74 */ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 192, index 75 */ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 193, index 76 */ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 194, index 77 */ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 195, index 78 */ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 196, index 79 */ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 197, index 80 */ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 198, index 81 */ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 199, index 82 */ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 200, index 83 */ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 201, index 84 */ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 202, index 85 */ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 203, index 86 */ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 204, index 87 */ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 205, index 88 */ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 206, index 89 */ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 207, index 90 */ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 208, index 91 */ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 209, index 92 */ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 210, index 93 */ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 211, index 94 */ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 212, index 95 */ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 213, index 96 */ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 214, index 97 */ G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 215, index 98 */ G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 251, index 99 */ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC }, { /* page 253, index 100 */ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_POSTFIX, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 254, index 101 */ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_INFIX_SEPARATOR, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_INFIX_SEPARATOR, G_UNICODE_BREAK_INFIX_SEPARATOR, G_UNICODE_BREAK_EXCLAMATION, G_UNICODE_BREAK_EXCLAMATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_INSEPARABLE, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_EXCLAMATION, G_UNICODE_BREAK_EXCLAMATION, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_POSTFIX, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_WORD_JOINER }, { /* page 255, index 102 */ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_EXCLAMATION, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_POSTFIX, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_EXCLAMATION, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_POSTFIX, G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_CONTINGENT, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 256, index 103 */ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 257, index 104 */ G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 258, index 105 */ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_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_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_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 259, index 106 */ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 260, index 107 */ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 264, index 108 */ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 265, index 109 */ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_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_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 266, index 110 */ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 267, index 111 */ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_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_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 268, index 112 */ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 270, index 113 */ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 272, index 114 */ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 273, index 115 */ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 278, index 116 */ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_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_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 291, index 117 */ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 292, index 118 */ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 306, index 119 */ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC }, { /* page 307, index 120 */ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC }, { /* page 308, index 121 */ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 362, index 122 */ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 367, index 123 */ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 432, index 124 */ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 464, index 125 */ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 465, index 126 */ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 466, index 127 */ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 467, index 128 */ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 468, index 129 */ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC }, { /* page 469, index 130 */ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC }, { /* page 470, index 131 */ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC }, { /* page 471, index 132 */ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC }, { /* page 494, index 133 */ 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_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_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_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_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 496, index 134 */ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_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, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 497, index 135 */ G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, 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, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 499, index 137 */ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_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_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_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, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 500, index 138 */ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_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_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_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_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC }, { /* page 502, index 140 */ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 503, index 141 */ G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 767, index 142 */ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_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 }, { /* page 1023, index 143 */ G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_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 }, { /* page 3584, index 144 */ G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 3585, index 145 */ G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN } }; /* U+0000 through U+2FAFF */ static const gint16 break_property_table_part1[763] = { 0 /* page 0 */, G_UNICODE_BREAK_ALPHABETIC + G_UNICODE_MAX_TABLE_INDEX, 1 /* page 2 */, 2 /* page 3 */, 3 /* page 4 */, 4 /* page 5 */, 5 /* page 6 */, 6 /* page 7 */, 7 /* page 8 */, 8 /* page 9 */, 9 /* page 10 */, 10 /* page 11 */, 11 /* page 12 */, 12 /* page 13 */, 13 /* page 14 */, 14 /* page 15 */, 15 /* page 16 */, 16 /* page 17 */, 17 /* page 18 */, 18 /* page 19 */, 19 /* page 20 */, G_UNICODE_BREAK_ALPHABETIC + G_UNICODE_MAX_TABLE_INDEX, 20 /* page 22 */, 21 /* page 23 */, 22 /* page 24 */, 23 /* page 25 */, 24 /* page 26 */, 25 /* page 27 */, 26 /* page 28 */, 27 /* page 29 */, G_UNICODE_BREAK_ALPHABETIC + G_UNICODE_MAX_TABLE_INDEX, 28 /* page 31 */, 29 /* page 32 */, 30 /* page 33 */, 31 /* page 34 */, 32 /* page 35 */, 33 /* page 36 */, 34 /* page 37 */, 35 /* page 38 */, 36 /* page 39 */, G_UNICODE_BREAK_ALPHABETIC + G_UNICODE_MAX_TABLE_INDEX, 37 /* page 41 */, G_UNICODE_BREAK_ALPHABETIC + G_UNICODE_MAX_TABLE_INDEX, 38 /* page 43 */, 39 /* page 44 */, 40 /* page 45 */, 41 /* page 46 */, 42 /* page 47 */, 43 /* page 48 */, 44 /* page 49 */, 45 /* page 50 */, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, 46 /* page 77 */, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, 47 /* page 160 */, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, 48 /* page 164 */, G_UNICODE_BREAK_ALPHABETIC + G_UNICODE_MAX_TABLE_INDEX, 49 /* page 166 */, 50 /* page 167 */, 51 /* page 168 */, 52 /* page 169 */, 53 /* page 170 */, 54 /* page 171 */, 55 /* page 172 */, 56 /* page 173 */, 57 /* page 174 */, 58 /* page 175 */, 59 /* page 176 */, 60 /* page 177 */, 61 /* page 178 */, 62 /* page 179 */, 63 /* page 180 */, 64 /* page 181 */, 65 /* page 182 */, 66 /* page 183 */, 67 /* page 184 */, 68 /* page 185 */, 69 /* page 186 */, 70 /* page 187 */, 71 /* page 188 */, 72 /* page 189 */, 73 /* page 190 */, 74 /* page 191 */, 75 /* page 192 */, 76 /* page 193 */, 77 /* page 194 */, 78 /* page 195 */, 79 /* page 196 */, 80 /* page 197 */, 81 /* page 198 */, 82 /* page 199 */, 83 /* page 200 */, 84 /* page 201 */, 85 /* page 202 */, 86 /* page 203 */, 87 /* page 204 */, 88 /* page 205 */, 89 /* page 206 */, 90 /* page 207 */, 91 /* page 208 */, 92 /* page 209 */, 93 /* page 210 */, 94 /* page 211 */, 95 /* page 212 */, 96 /* page 213 */, 97 /* page 214 */, 98 /* page 215 */, G_UNICODE_BREAK_SURROGATE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_SURROGATE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_SURROGATE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_SURROGATE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_SURROGATE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_SURROGATE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_SURROGATE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_SURROGATE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, 99 /* page 251 */, G_UNICODE_BREAK_ALPHABETIC + G_UNICODE_MAX_TABLE_INDEX, 100 /* page 253 */, 101 /* page 254 */, 102 /* page 255 */, 103 /* page 256 */, 104 /* page 257 */, 105 /* page 258 */, 106 /* page 259 */, 107 /* page 260 */, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, 108 /* page 264 */, 109 /* page 265 */, 110 /* page 266 */, 111 /* page 267 */, 112 /* page 268 */, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, 113 /* page 270 */, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, 114 /* page 272 */, 115 /* page 273 */, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, 116 /* page 278 */, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_ALPHABETIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_ALPHABETIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_ALPHABETIC + G_UNICODE_MAX_TABLE_INDEX, 117 /* page 291 */, 118 /* page 292 */, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_ALPHABETIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_ALPHABETIC + G_UNICODE_MAX_TABLE_INDEX, 119 /* page 306 */, 120 /* page 307 */, 121 /* page 308 */, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_ALPHABETIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_ALPHABETIC + G_UNICODE_MAX_TABLE_INDEX, 122 /* page 362 */, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, 123 /* page 367 */, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, 124 /* page 432 */, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, 125 /* page 464 */, 126 /* page 465 */, 127 /* page 466 */, 128 /* page 467 */, 129 /* page 468 */, 130 /* page 469 */, 131 /* page 470 */, 132 /* page 471 */, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, 133 /* page 494 */, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, 134 /* page 496 */, 135 /* page 497 */, 136 /* page 498 */, 137 /* page 499 */, 138 /* page 500 */, 139 /* page 501 */, 140 /* page 502 */, 141 /* page 503 */, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX }; /* U+E0000 through U+10FFFF */ static const gint16 break_property_table_part2[768] = { 144 /* page 3584 */, 145 /* page 3585 */, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX }; #endif /* BREAKTABLES_H */ pkg-config-0.29.1/glib/glib/galloca.h0000664000175000017500000001062412651243552014167 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the GLib Team and others 1997-2000. See the AUTHORS * file for a list of people on the GLib Team. See the ChangeLog * files for a list of changes. These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/. */ #ifndef __G_ALLOCA_H__ #define __G_ALLOCA_H__ #if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) #error "Only can be included directly." #endif #include #if defined(__BIONIC__) && defined (GLIB_HAVE_ALLOCA_H) # include #elif defined(__GNUC__) /* GCC does the right thing */ # undef alloca # define alloca(size) __builtin_alloca (size) #elif defined (GLIB_HAVE_ALLOCA_H) /* a native and working alloca.h is there */ # include #else /* !__GNUC__ && !GLIB_HAVE_ALLOCA_H */ # if defined(_MSC_VER) || defined(__DMC__) # include # define alloca _alloca # else /* !_MSC_VER && !__DMC__ */ # ifdef _AIX # pragma alloca # else /* !_AIX */ # ifndef alloca /* predefined by HP cc +Olibcalls */ G_BEGIN_DECLS char *alloca (); G_END_DECLS # endif /* !alloca */ # endif /* !_AIX */ # endif /* !_MSC_VER && !__DMC__ */ #endif /* !__GNUC__ && !GLIB_HAVE_ALLOCA_H */ /** * g_alloca: * @size: number of bytes to allocate. * * Allocates @size bytes on the stack; these bytes will be freed when the current * stack frame is cleaned up. This macro essentially just wraps the alloca() * function present on most UNIX variants. * Thus it provides the same advantages and pitfalls as alloca(): * * * + alloca() is very fast, as on most systems it's implemented by just adjusting * the stack pointer register. * * * + It doesn't cause any memory fragmentation, within its scope, separate alloca() * blocks just build up and are released together at function end. * * * - Allocation sizes have to fit into the current stack frame. For instance in a * threaded environment on Linux, the per-thread stack size is limited to 2 Megabytes, * so be sparse with alloca() uses. * * * - Allocation failure due to insufficient stack space is not indicated with a %NULL * return like e.g. with malloc(). Instead, most systems probably handle it the same * way as out of stack space situations from infinite function recursion, i.e. * with a segmentation fault. * * * - Special care has to be taken when mixing alloca() with GNU C variable sized arrays. * Stack space allocated with alloca() in the same scope as a variable sized array * will be freed together with the variable sized array upon exit of that scope, and * not upon exit of the enclosing function scope. * * * * Returns: space for @size bytes, allocated on the stack */ #define g_alloca(size) alloca (size) /** * g_newa: * @struct_type: Type of memory chunks to be allocated * @n_structs: Number of chunks to be allocated * * Wraps g_alloca() in a more typesafe manner. * * Returns: Pointer to stack space for @n_structs chunks of type @struct_type */ #define g_newa(struct_type, n_structs) ((struct_type*) g_alloca (sizeof (struct_type) * (gsize) (n_structs))) #endif /* __G_ALLOCA_H__ */ pkg-config-0.29.1/glib/glib/gqueue.h0000664000175000017500000001607212651243552014063 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the GLib Team and others 1997-2000. See the AUTHORS * file for a list of people on the GLib Team. See the ChangeLog * files for a list of changes. These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/. */ #ifndef __G_QUEUE_H__ #define __G_QUEUE_H__ #if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) #error "Only can be included directly." #endif #include G_BEGIN_DECLS typedef struct _GQueue GQueue; /** * GQueue: * @head: a pointer to the first element of the queue * @tail: a pointer to the last element of the queue * @length: the number of elements in the queue * * Contains the public fields of a * Queue. */ struct _GQueue { GList *head; GList *tail; guint length; }; /** * G_QUEUE_INIT: * * A statically-allocated #GQueue must be initialized with this * macro before it can be used. This macro can be used to initialize * a variable, but it cannot be assigned to a variable. In that case * you have to use g_queue_init(). * * |[ * GQueue my_queue = G_QUEUE_INIT; * ]| * * Since: 2.14 */ #define G_QUEUE_INIT { NULL, NULL, 0 } /* 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_); G_END_DECLS #endif /* __G_QUEUE_H__ */ pkg-config-0.29.1/glib/glib/gtree.h0000664000175000017500000001025012651243552013666 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the GLib Team and others 1997-2000. See the AUTHORS * file for a list of people on the GLib Team. See the ChangeLog * files for a list of changes. These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/. */ #ifndef __G_TREE_H__ #define __G_TREE_H__ #if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) #error "Only can be included directly." #endif #include G_BEGIN_DECLS typedef struct _GTree GTree; typedef gboolean (*GTraverseFunc) (gpointer key, gpointer value, gpointer data); /* 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); GLIB_DEPRECATED void g_tree_traverse (GTree *tree, GTraverseFunc traverse_func, 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 #endif /* __G_TREE_H__ */ pkg-config-0.29.1/glib/glib/gprintfint.h0000664000175000017500000000344312275467762014767 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the GLib Team and others 2002. See the AUTHORS * file for a list of people on the GLib Team. See the ChangeLog * files for a list of changes. These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/. */ #ifndef __G_PRINTFINT_H__ #define __G_PRINTFINT_H__ #ifdef HAVE_GOOD_PRINTF #define _g_printf printf #define _g_fprintf fprintf #define _g_sprintf sprintf #define _g_snprintf snprintf #define _g_vprintf vprintf #define _g_vfprintf vfprintf #define _g_vsprintf vsprintf #define _g_vsnprintf vsnprintf #else #include "gnulib/printf.h" #define _g_printf _g_gnulib_printf #define _g_fprintf _g_gnulib_fprintf #define _g_sprintf _g_gnulib_sprintf #define _g_snprintf _g_gnulib_snprintf #define _g_vprintf _g_gnulib_vprintf #define _g_vfprintf _g_gnulib_vfprintf #define _g_vsprintf _g_gnulib_vsprintf #define _g_vsnprintf _g_gnulib_vsnprintf #endif #endif /* __G_PRINTF_H__ */ pkg-config-0.29.1/glib/glib/gwakeup.h0000664000175000017500000000241112651243552014223 00000000000000/* * Copyright © 2011 Canonical Limited * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the licence, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * * Author: Ryan Lortie */ #ifndef __G_WAKEUP_H__ #define __G_WAKEUP_H__ #include typedef struct _GWakeup GWakeup; GWakeup * g_wakeup_new (void); void g_wakeup_free (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 pkg-config-0.29.1/glib/glib/genviron.c0000664000175000017500000004547612651243552014424 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1998 Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the GLib Team and others 1997-2000. See the AUTHORS * file for a list of people on the GLib Team. See the ChangeLog * files for a list of changes. These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/. */ #include "config.h" #include "genviron.h" #include #include #ifdef HAVE_UNISTD_H #include #endif #ifdef HAVE_CRT_EXTERNS_H #include /* for _NSGetEnviron */ #endif #ifdef G_OS_WIN32 #include #endif #include "glib-private.h" #include "gmem.h" #include "gmessages.h" #include "gstrfuncs.h" #include "gunicode.h" #include "gconvert.h" #include "gquark.h" /* Environ array functions {{{1 */ static gint g_environ_find (gchar **envp, const gchar *variable) { gint len, i; if (envp == NULL) return -1; len = strlen (variable); for (i = 0; envp[i]; i++) { if (strncmp (envp[i], variable, len) == 0 && envp[i][len] == '=') return i; } return -1; } /** * g_environ_getenv: * @envp: (allow-none) (array zero-terminated=1) (transfer none): an environment * list (eg, as returned from g_get_environ()), or %NULL * for an empty environment list * @variable: the environment variable to get, in the GLib file name * encoding * * Returns the value of the environment variable @variable in the * provided list @envp. * * The name and value are in the GLib file name encoding. * On UNIX, this means the actual bytes which might or might not * be in some consistent character set and encoding. On Windows, * it is in UTF-8. On Windows, in case the environment variable's * value contains references to other environment variables, they * are expanded. * * Return value: the value of the environment variable, or %NULL if * the environment variable is not set in @envp. The returned * string is owned by @envp, and will be freed if @variable is * set or unset again. * * Since: 2.32 */ const gchar * g_environ_getenv (gchar **envp, const gchar *variable) { gint index; g_return_val_if_fail (variable != NULL, NULL); index = g_environ_find (envp, variable); if (index != -1) return envp[index] + strlen (variable) + 1; else return NULL; } /** * g_environ_setenv: * @envp: (allow-none) (array zero-terminated=1) (transfer full): an environment * list that can be freed using g_strfreev() (e.g., as returned from g_get_environ()), or %NULL * for an empty environment list * @variable: the environment variable to set, must not contain '=' * @value: the value for to set the variable to * @overwrite: whether to change the variable if it already exists * * Sets the environment variable @variable in the provided list * @envp to @value. * * Both the variable's name and value should be in the GLib * file name encoding. On UNIX, this means that they can be * arbitrary byte strings. On Windows, they should be in UTF-8. * * Return value: (array zero-terminated=1) (transfer full): the * updated environment list. Free it using g_strfreev(). * * Since: 2.32 */ gchar ** g_environ_setenv (gchar **envp, const gchar *variable, const gchar *value, gboolean overwrite) { gint index; g_return_val_if_fail (variable != NULL, NULL); g_return_val_if_fail (strchr (variable, '=') == NULL, NULL); index = g_environ_find (envp, variable); if (index != -1) { if (overwrite) { g_free (envp[index]); envp[index] = g_strdup_printf ("%s=%s", variable, value); } } else { gint length; length = envp ? g_strv_length (envp) : 0; envp = g_renew (gchar *, envp, length + 2); envp[length] = g_strdup_printf ("%s=%s", variable, value); envp[length + 1] = NULL; } return envp; } static gchar ** g_environ_unsetenv_internal (gchar **envp, const gchar *variable, gboolean free_value) { gint len; gchar **e, **f; len = strlen (variable); /* Note that we remove *all* environment entries for * the variable name, not just the first. */ e = f = envp; while (*e != NULL) { if (strncmp (*e, variable, len) != 0 || (*e)[len] != '=') { *f = *e; f++; } else { if (free_value) g_free (*e); } e++; } *f = NULL; return envp; } /** * g_environ_unsetenv: * @envp: (allow-none) (array zero-terminated=1) (transfer full): an environment * list that can be freed using g_strfreev() (e.g., as returned from g_get_environ()), * or %NULL for an empty environment list * @variable: the environment variable to remove, must not contain '=' * * Removes the environment variable @variable from the provided * environment @envp. * * Return value: (array zero-terminated=1) (transfer full): the * updated environment list. Free it using g_strfreev(). * * Since: 2.32 */ gchar ** g_environ_unsetenv (gchar **envp, const gchar *variable) { g_return_val_if_fail (variable != NULL, NULL); g_return_val_if_fail (strchr (variable, '=') == NULL, NULL); if (envp == NULL) return NULL; return g_environ_unsetenv_internal (envp, variable, TRUE); } /* UNIX implemention {{{1 */ #ifndef G_OS_WIN32 /** * g_getenv: * @variable: the environment variable to get, in the GLib file name * encoding * * Returns the value of an environment variable. * * The name and value are in the GLib file name encoding. On UNIX, * this means the actual bytes which might or might not be in some * consistent character set and encoding. On Windows, it is in UTF-8. * On Windows, in case the environment variable's value contains * references to other environment variables, they are expanded. * * Return value: the value of the environment variable, or %NULL if * the environment variable is not found. The returned string * may be overwritten by the next call to g_getenv(), g_setenv() * or g_unsetenv(). */ const gchar * g_getenv (const gchar *variable) { g_return_val_if_fail (variable != NULL, NULL); return getenv (variable); } /** * g_setenv: * @variable: the environment variable to set, must not contain '='. * @value: the value for to set the variable to. * @overwrite: whether to change the variable if it already exists. * * Sets an environment variable. Both the variable's name and value * should be in the GLib file name encoding. On UNIX, this means that * they can be arbitrary byte strings. On Windows, they should be in * UTF-8. * * Note that on some systems, when variables are overwritten, the memory * used for the previous variables and its value isn't reclaimed. * * * Environment variable handling in UNIX is not thread-safe, and your * program may crash if one thread calls g_setenv() while another * thread is calling getenv(). (And note that many functions, such as * gettext(), call getenv() internally.) This function is only safe to * use at the very start of your program, before creating any other * threads (or creating objects that create worker threads of their * own). * * If you need to set up the environment for a child process, you can * use g_get_environ() to get an environment array, modify that with * g_environ_setenv() and g_environ_unsetenv(), and then pass that * array directly to execvpe(), g_spawn_async(), or the like. * * * Returns: %FALSE if the environment variable couldn't be set. * * Since: 2.4 */ gboolean g_setenv (const gchar *variable, const gchar *value, gboolean overwrite) { gint result; #ifndef HAVE_SETENV gchar *string; #endif g_return_val_if_fail (variable != NULL, FALSE); g_return_val_if_fail (strchr (variable, '=') == NULL, FALSE); #ifdef HAVE_SETENV result = setenv (variable, value, overwrite); #else if (!overwrite && getenv (variable) != NULL) return TRUE; /* This results in a leak when you overwrite existing * settings. It would be fairly easy to fix this by keeping * our own parallel array or hash table. */ string = g_strconcat (variable, "=", value, NULL); result = putenv (string); #endif return result == 0; } #ifdef HAVE__NSGETENVIRON #define environ (*_NSGetEnviron()) #else /* According to the Single Unix Specification, environ is not * in any system header, although unistd.h often declares it. */ extern char **environ; #endif /** * g_unsetenv: * @variable: the environment variable to remove, must not contain '=' * * Removes an environment variable from the environment. * * Note that on some systems, when variables are overwritten, the * memory used for the previous variables and its value isn't reclaimed. * * * Environment variable handling in UNIX is not thread-safe, and your * program may crash if one thread calls g_unsetenv() while another * thread is calling getenv(). (And note that many functions, such as * gettext(), call getenv() internally.) This function is only safe * to use at the very start of your program, before creating any other * threads (or creating objects that create worker threads of their * own). * * If you need to set up the environment for a child process, you can * use g_get_environ() to get an environment array, modify that with * g_environ_setenv() and g_environ_unsetenv(), and then pass that * array directly to execvpe(), g_spawn_async(), or the like. * * * Since: 2.4 */ void g_unsetenv (const gchar *variable) { #ifdef HAVE_UNSETENV g_return_if_fail (variable != NULL); g_return_if_fail (strchr (variable, '=') == NULL); unsetenv (variable); #else /* !HAVE_UNSETENV */ g_return_if_fail (variable != NULL); g_return_if_fail (strchr (variable, '=') == NULL); /* Mess directly with the environ array. * This seems to be the only portable way to do this. */ g_environ_unsetenv_internal (environ, variable, FALSE); #endif /* !HAVE_UNSETENV */ } /** * g_listenv: * * Gets the names of all variables set in the environment. * * Programs that want to be portable to Windows should typically use * this function and g_getenv() instead of using the environ array * from the C library directly. On Windows, the strings in the environ * array are in system codepage encoding, while in most of the typical * use cases for environment variables in GLib-using programs you want * the UTF-8 encoding that this function and g_getenv() provide. * * Returns: (array zero-terminated=1) (transfer full): a %NULL-terminated * list of strings which must be freed with g_strfreev(). * * Since: 2.8 */ gchar ** g_listenv (void) { gchar **result, *eq; gint len, i, j; len = g_strv_length (environ); result = g_new0 (gchar *, len + 1); j = 0; for (i = 0; i < len; i++) { eq = strchr (environ[i], '='); if (eq) result[j++] = g_strndup (environ[i], eq - environ[i]); } result[j] = NULL; return result; } /** * g_get_environ: * * Gets the list of environment variables for the current process. * * The list is %NULL terminated and each item in the list is of the * form 'NAME=VALUE'. * * This is equivalent to direct access to the 'environ' global variable, * except portable. * * The return value is freshly allocated and it should be freed with * g_strfreev() when it is no longer needed. * * Returns: (array zero-terminated=1) (transfer full): the list of * environment variables * * Since: 2.28 */ gchar ** g_get_environ (void) { return g_strdupv (environ); } /* Win32 implementation {{{1 */ #else /* G_OS_WIN32 */ const gchar * g_getenv (const gchar *variable) { GQuark quark; gchar *value; wchar_t dummy[2], *wname, *wvalue; int len; g_return_val_if_fail (variable != NULL, NULL); g_return_val_if_fail (g_utf8_validate (variable, -1, NULL), NULL); /* On Windows NT, it is relatively typical that environment * variables contain references to other environment variables. If * so, use ExpandEnvironmentStrings(). (In an ideal world, such * environment variables would be stored in the Registry as * REG_EXPAND_SZ type values, and would then get automatically * expanded before a program sees them. But there is broken software * that stores environment variables as REG_SZ values even if they * contain references to other environment variables.) */ wname = g_utf8_to_utf16 (variable, -1, NULL, NULL, NULL); len = GetEnvironmentVariableW (wname, dummy, 2); if (len == 0) { g_free (wname); 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; wvalue = g_new (wchar_t, len); if (GetEnvironmentVariableW (wname, wvalue, len) != len - 1) { g_free (wname); g_free (wvalue); return NULL; } if (wcschr (wvalue, L'%') != NULL) { wchar_t *tem = wvalue; len = ExpandEnvironmentStringsW (wvalue, dummy, 2); if (len > 0) { wvalue = g_new (wchar_t, len); if (ExpandEnvironmentStringsW (tem, wvalue, len) != len) { g_free (wvalue); wvalue = tem; } else g_free (tem); } } value = g_utf16_to_utf8 (wvalue, -1, NULL, NULL, NULL); g_free (wname); g_free (wvalue); quark = g_quark_from_string (value); g_free (value); return g_quark_to_string (quark); } gboolean g_setenv (const gchar *variable, const gchar *value, gboolean overwrite) { gboolean retval; wchar_t *wname, *wvalue, *wassignment; gchar *tem; g_return_val_if_fail (variable != NULL, FALSE); g_return_val_if_fail (strchr (variable, '=') == NULL, FALSE); g_return_val_if_fail (g_utf8_validate (variable, -1, NULL), FALSE); g_return_val_if_fail (g_utf8_validate (value, -1, NULL), FALSE); if (!overwrite && g_getenv (variable) != NULL) return TRUE; /* We want to (if possible) set both the environment variable copy * kept by the C runtime and the one kept by the system. * * We can't use only the C runtime's putenv or _wputenv() as that * won't work for arbitrary Unicode strings in a "non-Unicode" app * (with main() and not wmain()). In a "main()" app the C runtime * initializes the C runtime's environment table by converting the * real (wide char) environment variables to system codepage, thus * breaking those that aren't representable in the system codepage. * * As the C runtime's putenv() will also set the system copy, we do * the putenv() first, then call SetEnvironmentValueW ourselves. */ wname = g_utf8_to_utf16 (variable, -1, NULL, NULL, NULL); wvalue = g_utf8_to_utf16 (value, -1, NULL, NULL, NULL); tem = g_strconcat (variable, "=", value, NULL); wassignment = g_utf8_to_utf16 (tem, -1, NULL, NULL, NULL); g_free (tem); _wputenv (wassignment); g_free (wassignment); retval = (SetEnvironmentVariableW (wname, wvalue) != 0); g_free (wname); g_free (wvalue); return retval; } void g_unsetenv (const gchar *variable) { wchar_t *wname, *wassignment; gchar *tem; g_return_if_fail (variable != NULL); g_return_if_fail (strchr (variable, '=') == NULL); g_return_if_fail (g_utf8_validate (variable, -1, NULL)); wname = g_utf8_to_utf16 (variable, -1, NULL, NULL, NULL); tem = g_strconcat (variable, "=", NULL); wassignment = g_utf8_to_utf16 (tem, -1, NULL, NULL, NULL); g_free (tem); _wputenv (wassignment); g_free (wassignment); SetEnvironmentVariableW (wname, NULL); g_free (wname); } gchar ** g_listenv (void) { gchar **result, *eq; gint len = 0, j; wchar_t *p, *q; p = (wchar_t *) GetEnvironmentStringsW (); if (p != NULL) { q = p; while (*q) { q += wcslen (q) + 1; len++; } } result = g_new0 (gchar *, len + 1); j = 0; q = p; while (*q) { result[j] = g_utf16_to_utf8 (q, -1, NULL, NULL, NULL); if (result[j] != NULL) { eq = strchr (result[j], '='); if (eq && eq > result[j]) { *eq = '\0'; j++; } else g_free (result[j]); } q += wcslen (q) + 1; } result[j] = NULL; FreeEnvironmentStringsW (p); return result; } gchar ** g_get_environ (void) { gunichar2 *strings; gchar **result; gint i, n; strings = GetEnvironmentStringsW (); 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; return result; } /* Win32 binary compatibility versions {{{1 */ #ifndef _WIN64 #undef g_getenv const gchar * g_getenv (const gchar *variable) { gchar *utf8_variable = g_locale_to_utf8 (variable, -1, NULL, NULL, NULL); const gchar *utf8_value = g_getenv_utf8 (utf8_variable); gchar *value; GQuark quark; g_free (utf8_variable); if (!utf8_value) return NULL; value = g_locale_from_utf8 (utf8_value, -1, NULL, NULL, NULL); quark = g_quark_from_string (value); g_free (value); return g_quark_to_string (quark); } #undef g_setenv gboolean g_setenv (const gchar *variable, const gchar *value, gboolean overwrite) { gchar *utf8_variable = g_locale_to_utf8 (variable, -1, NULL, NULL, NULL); gchar *utf8_value = g_locale_to_utf8 (value, -1, NULL, NULL, NULL); gboolean retval = g_setenv_utf8 (utf8_variable, utf8_value, overwrite); g_free (utf8_variable); g_free (utf8_value); return retval; } #undef g_unsetenv void g_unsetenv (const gchar *variable) { gchar *utf8_variable = g_locale_to_utf8 (variable, -1, NULL, NULL, NULL); g_unsetenv_utf8 (utf8_variable); g_free (utf8_variable); } #endif /* _WIN64 */ #endif /* G_OS_WIN32 */ /* Epilogue {{{1 */ /* vim: set foldmethod=marker: */ pkg-config-0.29.1/glib/glib/ghook.c0000664000175000017500000006072712275467762013715 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * GHook: Callback maintenance functions * Copyright (C) 1998 Tim Janik * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the GLib Team and others 1997-2000. See the AUTHORS * file for a list of people on the GLib Team. See the ChangeLog * files for a list of changes. These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/. */ /* * MT safe */ #include "config.h" #include "ghook.h" #include "gtestutils.h" #include "gslice.h" /** * SECTION:hooks * @title: Hook Functions * @short_description: support for manipulating lists of hook functions * * The #GHookList, #GHook and their related functions provide support for * lists of hook functions. Functions can be added and removed from the lists, * and the list of hook functions can be invoked. */ /** * GHookList: * @seq_id: the next free #GHook id * @hook_size: the size of the #GHookList elements, in bytes * @is_setup: 1 if the #GHookList has been initialized * @hooks: the first #GHook element in the list * @dummy3: unused * @finalize_hook: the function to call to finalize a #GHook element. * The default behaviour is to call the hooks @destroy function * @dummy: unused * * The GHookList struct represents a * list of hook functions. */ /** * GHookFinalizeFunc: * @hook_list: a #GHookList * @hook: the hook in @hook_list that gets finalized * * Defines the type of function to be called when a hook in a * list of hooks gets finalized. */ /** * GHookFlagMask: * @G_HOOK_FLAG_ACTIVE: set if the hook has not been destroyed * @G_HOOK_FLAG_IN_CALL: set if the hook is currently being run * @G_HOOK_FLAG_MASK: A mask covering all bits reserved for * hook flags; see %G_HOOK_FLAG_USER_SHIFT * * Flags used internally in the #GHook implementation. */ /** * G_HOOK_FLAGS: * @hook: a #GHook * * Gets the flags of a hook. */ /** * G_HOOK_FLAG_USER_SHIFT: * * The position of the first bit which is not reserved for internal * use be the #GHook implementation, i.e. * 1 << G_HOOK_FLAG_USER_SHIFT is the first * bit which can be used for application-defined flags. */ /** * G_HOOK: * @hook: a pointer * * Casts a pointer to a GHook*. */ /** * G_HOOK_IS_VALID: * @hook: a #GHook * * Returns %TRUE if the #GHook is valid, i.e. it is in a #GHookList, * it is active and it has not been destroyed. * * Returns: %TRUE if the #GHook is valid */ /** * G_HOOK_ACTIVE: * @hook: a #GHook * * Returns %TRUE if the #GHook is active, which is normally the case * until the #GHook is destroyed. * * Returns: %TRUE if the #GHook is active */ /** * G_HOOK_IN_CALL: * @hook: a #GHook * * Returns %TRUE if the #GHook function is currently executing. * * Returns: %TRUE if the #GHook function is currently executing */ /** * G_HOOK_IS_UNLINKED: * @hook: a #GHook * * Returns %TRUE if the #GHook is not in a #GHookList. * Returns: %TRUE if the #GHook is not in a #GHookList */ /** * GHook: * @data: data which is passed to func when this hook is invoked * @next: pointer to the next hook in the list * @prev: pointer to the previous hook in the list * @ref_count: the reference count of this hook * @hook_id: the id of this hook, which is unique within its list * @flags: flags which are set for this hook. See #GHookFlagMask for * predefined flags * @func: the function to call when this hook is invoked. The possible * signatures for this function are #GHookFunc and #GHookCheckFunc * @destroy: the default @finalize_hook function of a #GHookList calls * this member of the hook that is being finalized * * The GHook struct represents a single hook * function in a #GHookList. */ /** * GHookFunc: * @data: the data field of the #GHook is passed to the hook function here * * Defines the type of a hook function that can be invoked * by g_hook_list_invoke(). */ /** * GHookCheckFunc: * @data: the data field of the #GHook is passed to the hook function here * * Defines the type of a hook function that can be invoked * by g_hook_list_invoke_check(). * * Returns: %FALSE if the #GHook should be destroyed */ /* --- functions --- */ static void default_finalize_hook (GHookList *hook_list, GHook *hook) { GDestroyNotify destroy = hook->destroy; if (destroy) { hook->destroy = NULL; destroy (hook->data); } } /** * g_hook_list_init: * @hook_list: a #GHookList * @hook_size: the size of each element in the #GHookList, * typically sizeof (GHook) * * Initializes a #GHookList. * This must be called before the #GHookList is used. */ void g_hook_list_init (GHookList *hook_list, guint hook_size) { g_return_if_fail (hook_list != NULL); g_return_if_fail (hook_size >= sizeof (GHook)); hook_list->seq_id = 1; hook_list->hook_size = hook_size; hook_list->is_setup = TRUE; hook_list->hooks = NULL; hook_list->dummy3 = NULL; hook_list->finalize_hook = default_finalize_hook; hook_list->dummy[0] = NULL; hook_list->dummy[1] = NULL; } /** * g_hook_list_clear: * @hook_list: a #GHookList * * Removes all the #GHook elements from a #GHookList. */ void g_hook_list_clear (GHookList *hook_list) { g_return_if_fail (hook_list != NULL); if (hook_list->is_setup) { GHook *hook; hook_list->is_setup = FALSE; hook = hook_list->hooks; if (!hook) { /* destroy hook_list->hook_memchunk */ } else do { GHook *tmp; g_hook_ref (hook_list, hook); g_hook_destroy_link (hook_list, hook); tmp = hook->next; g_hook_unref (hook_list, hook); hook = tmp; } while (hook); } } /** * g_hook_alloc: * @hook_list: a #GHookList * * Allocates space for a #GHook and initializes it. * * Returns: a new #GHook */ GHook* g_hook_alloc (GHookList *hook_list) { GHook *hook; g_return_val_if_fail (hook_list != NULL, NULL); g_return_val_if_fail (hook_list->is_setup, NULL); hook = g_slice_alloc0 (hook_list->hook_size); hook->data = NULL; hook->next = NULL; hook->prev = NULL; hook->flags = G_HOOK_FLAG_ACTIVE; hook->ref_count = 0; hook->hook_id = 0; hook->func = NULL; hook->destroy = NULL; return hook; } /** * g_hook_free: * @hook_list: a #GHookList * @hook: the #GHook to free * * Calls the #GHookList @finalize_hook function if it exists, * and frees the memory allocated for the #GHook. */ void g_hook_free (GHookList *hook_list, GHook *hook) { g_return_if_fail (hook_list != NULL); g_return_if_fail (hook_list->is_setup); g_return_if_fail (hook != NULL); g_return_if_fail (G_HOOK_IS_UNLINKED (hook)); g_return_if_fail (!G_HOOK_IN_CALL (hook)); if(hook_list->finalize_hook != NULL) hook_list->finalize_hook (hook_list, hook); g_slice_free1 (hook_list->hook_size, hook); } /** * g_hook_destroy_link: * @hook_list: a #GHookList * @hook: the #GHook to remove * * Removes one #GHook from a #GHookList, marking it * inactive and calling g_hook_unref() on it. */ void g_hook_destroy_link (GHookList *hook_list, GHook *hook) { g_return_if_fail (hook_list != NULL); g_return_if_fail (hook != NULL); hook->flags &= ~G_HOOK_FLAG_ACTIVE; if (hook->hook_id) { hook->hook_id = 0; g_hook_unref (hook_list, hook); /* counterpart to g_hook_insert_before */ } } /** * g_hook_destroy: * @hook_list: a #GHookList * @hook_id: a hook ID * * Destroys a #GHook, given its ID. * * Returns: %TRUE if the #GHook was found in the #GHookList and destroyed */ gboolean g_hook_destroy (GHookList *hook_list, gulong hook_id) { GHook *hook; g_return_val_if_fail (hook_list != NULL, FALSE); g_return_val_if_fail (hook_id > 0, FALSE); hook = g_hook_get (hook_list, hook_id); if (hook) { g_hook_destroy_link (hook_list, hook); return TRUE; } return FALSE; } /** * g_hook_unref: * @hook_list: a #GHookList * @hook: the #GHook to unref * * Decrements the reference count of a #GHook. * If the reference count falls to 0, the #GHook is removed * from the #GHookList and g_hook_free() is called to free it. */ void g_hook_unref (GHookList *hook_list, GHook *hook) { g_return_if_fail (hook_list != NULL); g_return_if_fail (hook != NULL); g_return_if_fail (hook->ref_count > 0); hook->ref_count--; if (!hook->ref_count) { g_return_if_fail (hook->hook_id == 0); g_return_if_fail (!G_HOOK_IN_CALL (hook)); if (hook->prev) hook->prev->next = hook->next; else hook_list->hooks = hook->next; if (hook->next) { hook->next->prev = hook->prev; hook->next = NULL; } hook->prev = NULL; if (!hook_list->is_setup) { hook_list->is_setup = TRUE; g_hook_free (hook_list, hook); hook_list->is_setup = FALSE; if (!hook_list->hooks) { /* destroy hook_list->hook_memchunk */ } } else g_hook_free (hook_list, hook); } } /** * g_hook_ref: * @hook_list: a #GHookList * @hook: the #GHook to increment the reference count of * * Increments the reference count for a #GHook. * * Returns: the @hook that was passed in (since 2.6) */ GHook * g_hook_ref (GHookList *hook_list, GHook *hook) { g_return_val_if_fail (hook_list != NULL, NULL); g_return_val_if_fail (hook != NULL, NULL); g_return_val_if_fail (hook->ref_count > 0, NULL); hook->ref_count++; return hook; } /** * g_hook_append: * @hook_list: a #GHookList * @hook: the #GHook to add to the end of @hook_list * * Appends a #GHook onto the end of a #GHookList. */ /** * g_hook_prepend: * @hook_list: a #GHookList * @hook: the #GHook to add to the start of @hook_list * * Prepends a #GHook on the start of a #GHookList. */ void g_hook_prepend (GHookList *hook_list, GHook *hook) { g_return_if_fail (hook_list != NULL); g_hook_insert_before (hook_list, hook_list->hooks, hook); } /** * g_hook_insert_before: * @hook_list: a #GHookList * @sibling: the #GHook to insert the new #GHook before * @hook: the #GHook to insert * * Inserts a #GHook into a #GHookList, before a given #GHook. */ void g_hook_insert_before (GHookList *hook_list, GHook *sibling, GHook *hook) { g_return_if_fail (hook_list != NULL); g_return_if_fail (hook_list->is_setup); g_return_if_fail (hook != NULL); g_return_if_fail (G_HOOK_IS_UNLINKED (hook)); g_return_if_fail (hook->ref_count == 0); hook->hook_id = hook_list->seq_id++; hook->ref_count = 1; /* counterpart to g_hook_destroy_link */ if (sibling) { if (sibling->prev) { hook->prev = sibling->prev; hook->prev->next = hook; hook->next = sibling; sibling->prev = hook; } else { hook_list->hooks = hook; hook->next = sibling; sibling->prev = hook; } } else { if (hook_list->hooks) { sibling = hook_list->hooks; while (sibling->next) sibling = sibling->next; hook->prev = sibling; sibling->next = hook; } else hook_list->hooks = hook; } } /** * g_hook_list_invoke: * @hook_list: a #GHookList * @may_recurse: %TRUE if functions which are already running * (e.g. in another thread) can be called. If set to %FALSE, * these are skipped * * Calls all of the #GHook functions in a #GHookList. */ void g_hook_list_invoke (GHookList *hook_list, gboolean may_recurse) { GHook *hook; g_return_if_fail (hook_list != NULL); g_return_if_fail (hook_list->is_setup); hook = g_hook_first_valid (hook_list, may_recurse); while (hook) { GHookFunc func; gboolean was_in_call; func = (GHookFunc) hook->func; was_in_call = G_HOOK_IN_CALL (hook); hook->flags |= G_HOOK_FLAG_IN_CALL; func (hook->data); if (!was_in_call) hook->flags &= ~G_HOOK_FLAG_IN_CALL; hook = g_hook_next_valid (hook_list, hook, may_recurse); } } /** * g_hook_list_invoke_check: * @hook_list: a #GHookList * @may_recurse: %TRUE if functions which are already running * (e.g. in another thread) can be called. If set to %FALSE, * these are skipped * * Calls all of the #GHook functions in a #GHookList. * Any function which returns %FALSE is removed from the #GHookList. */ void g_hook_list_invoke_check (GHookList *hook_list, gboolean may_recurse) { GHook *hook; g_return_if_fail (hook_list != NULL); g_return_if_fail (hook_list->is_setup); hook = g_hook_first_valid (hook_list, may_recurse); while (hook) { GHookCheckFunc func; gboolean was_in_call; gboolean need_destroy; func = (GHookCheckFunc) hook->func; was_in_call = G_HOOK_IN_CALL (hook); hook->flags |= G_HOOK_FLAG_IN_CALL; need_destroy = !func (hook->data); if (!was_in_call) hook->flags &= ~G_HOOK_FLAG_IN_CALL; if (need_destroy) g_hook_destroy_link (hook_list, hook); hook = g_hook_next_valid (hook_list, hook, may_recurse); } } /** * GHookCheckMarshaller: * @hook: a #GHook * @marshal_data: user data * * Defines the type of function used by g_hook_list_marshal_check(). * * Returns: %FALSE if @hook should be destroyed */ /** * g_hook_list_marshal_check: * @hook_list: a #GHookList * @may_recurse: %TRUE if hooks which are currently running * (e.g. in another thread) are considered valid. If set to %FALSE, * these are skipped * @marshaller: the function to call for each #GHook * @marshal_data: data to pass to @marshaller * * Calls a function on each valid #GHook and destroys it if the * function returns %FALSE. */ void g_hook_list_marshal_check (GHookList *hook_list, gboolean may_recurse, GHookCheckMarshaller marshaller, gpointer data) { GHook *hook; g_return_if_fail (hook_list != NULL); g_return_if_fail (hook_list->is_setup); g_return_if_fail (marshaller != NULL); hook = g_hook_first_valid (hook_list, may_recurse); while (hook) { gboolean was_in_call; gboolean need_destroy; was_in_call = G_HOOK_IN_CALL (hook); hook->flags |= G_HOOK_FLAG_IN_CALL; need_destroy = !marshaller (hook, data); if (!was_in_call) hook->flags &= ~G_HOOK_FLAG_IN_CALL; if (need_destroy) g_hook_destroy_link (hook_list, hook); hook = g_hook_next_valid (hook_list, hook, may_recurse); } } /** * GHookMarshaller: * @hook: a #GHook * @marshal_data: user data * * Defines the type of function used by g_hook_list_marshal(). */ /** * g_hook_list_marshal: * @hook_list: a #GHookList * @may_recurse: %TRUE if hooks which are currently running * (e.g. in another thread) are considered valid. If set to %FALSE, * these are skipped * @marshaller: the function to call for each #GHook * @marshal_data: data to pass to @marshaller * * Calls a function on each valid #GHook. */ void g_hook_list_marshal (GHookList *hook_list, gboolean may_recurse, GHookMarshaller marshaller, gpointer data) { GHook *hook; g_return_if_fail (hook_list != NULL); g_return_if_fail (hook_list->is_setup); g_return_if_fail (marshaller != NULL); hook = g_hook_first_valid (hook_list, may_recurse); while (hook) { gboolean was_in_call; was_in_call = G_HOOK_IN_CALL (hook); hook->flags |= G_HOOK_FLAG_IN_CALL; marshaller (hook, data); if (!was_in_call) hook->flags &= ~G_HOOK_FLAG_IN_CALL; hook = g_hook_next_valid (hook_list, hook, may_recurse); } } /** * g_hook_first_valid: * @hook_list: a #GHookList * @may_be_in_call: %TRUE if hooks which are currently running * (e.g. in another thread) are considered valid. If set to %FALSE, * these are skipped * * Returns the first #GHook in a #GHookList which has not been destroyed. * The reference count for the #GHook is incremented, so you must call * g_hook_unref() to restore it when no longer needed. (Or call * g_hook_next_valid() if you are stepping through the #GHookList.) * * Returns: the first valid #GHook, or %NULL if none are valid */ GHook* g_hook_first_valid (GHookList *hook_list, gboolean may_be_in_call) { g_return_val_if_fail (hook_list != NULL, NULL); if (hook_list->is_setup) { GHook *hook; hook = hook_list->hooks; if (hook) { g_hook_ref (hook_list, hook); if (G_HOOK_IS_VALID (hook) && (may_be_in_call || !G_HOOK_IN_CALL (hook))) return hook; else return g_hook_next_valid (hook_list, hook, may_be_in_call); } } return NULL; } /** * g_hook_next_valid: * @hook_list: a #GHookList * @hook: the current #GHook * @may_be_in_call: %TRUE if hooks which are currently running * (e.g. in another thread) are considered valid. If set to %FALSE, * these are skipped * * Returns the next #GHook in a #GHookList which has not been destroyed. * The reference count for the #GHook is incremented, so you must call * g_hook_unref() to restore it when no longer needed. (Or continue to call * g_hook_next_valid() until %NULL is returned.) * * Returns: the next valid #GHook, or %NULL if none are valid */ GHook* g_hook_next_valid (GHookList *hook_list, GHook *hook, gboolean may_be_in_call) { GHook *ohook = hook; g_return_val_if_fail (hook_list != NULL, NULL); if (!hook) return NULL; hook = hook->next; while (hook) { if (G_HOOK_IS_VALID (hook) && (may_be_in_call || !G_HOOK_IN_CALL (hook))) { g_hook_ref (hook_list, hook); g_hook_unref (hook_list, ohook); return hook; } hook = hook->next; } g_hook_unref (hook_list, ohook); return NULL; } /** * g_hook_get: * @hook_list: a #GHookList * @hook_id: a hook id * * Returns the #GHook with the given id, or %NULL if it is not found. * * Returns: the #GHook with the given id, or %NULL if it is not found */ GHook* g_hook_get (GHookList *hook_list, gulong hook_id) { GHook *hook; g_return_val_if_fail (hook_list != NULL, NULL); g_return_val_if_fail (hook_id > 0, NULL); hook = hook_list->hooks; while (hook) { if (hook->hook_id == hook_id) return hook; hook = hook->next; } return NULL; } /** * GHookFindFunc: * @hook: a #GHook * @data: user data passed to g_hook_find_func() * * Defines the type of the function passed to g_hook_find(). * * Returns: %TRUE if the required #GHook has been found */ /** * g_hook_find: * @hook_list: a #GHookList * @need_valids: %TRUE if #GHook elements which have been destroyed * should be skipped * @func: the function to call for each #GHook, which should return * %TRUE when the #GHook has been found * @data: the data to pass to @func * * Finds a #GHook in a #GHookList using the given function to * test for a match. * * Returns: the found #GHook or %NULL if no matching #GHook is found */ GHook* g_hook_find (GHookList *hook_list, gboolean need_valids, GHookFindFunc func, gpointer data) { GHook *hook; g_return_val_if_fail (hook_list != NULL, NULL); g_return_val_if_fail (func != NULL, NULL); hook = hook_list->hooks; while (hook) { GHook *tmp; /* test only non-destroyed hooks */ if (!hook->hook_id) { hook = hook->next; continue; } g_hook_ref (hook_list, hook); if (func (hook, data) && hook->hook_id && (!need_valids || G_HOOK_ACTIVE (hook))) { g_hook_unref (hook_list, hook); return hook; } tmp = hook->next; g_hook_unref (hook_list, hook); hook = tmp; } return NULL; } /** * g_hook_find_data: * @hook_list: a #GHookList * @need_valids: %TRUE if #GHook elements which have been destroyed * should be skipped * @data: the data to find * * Finds a #GHook in a #GHookList with the given data. * * Returns: the #GHook with the given @data or %NULL if no matching * #GHook is found */ GHook* g_hook_find_data (GHookList *hook_list, gboolean need_valids, gpointer data) { GHook *hook; g_return_val_if_fail (hook_list != NULL, NULL); hook = hook_list->hooks; while (hook) { /* test only non-destroyed hooks */ if (hook->data == data && hook->hook_id && (!need_valids || G_HOOK_ACTIVE (hook))) return hook; hook = hook->next; } return NULL; } /** * g_hook_find_func: * @hook_list: a #GHookList * @need_valids: %TRUE if #GHook elements which have been destroyed * should be skipped * @func: the function to find * * Finds a #GHook in a #GHookList with the given function. * * Returns: the #GHook with the given @func or %NULL if no matching * #GHook is found */ GHook* g_hook_find_func (GHookList *hook_list, gboolean need_valids, gpointer func) { GHook *hook; g_return_val_if_fail (hook_list != NULL, NULL); g_return_val_if_fail (func != NULL, NULL); hook = hook_list->hooks; while (hook) { /* test only non-destroyed hooks */ if (hook->func == func && hook->hook_id && (!need_valids || G_HOOK_ACTIVE (hook))) return hook; hook = hook->next; } return NULL; } /** * g_hook_find_func_data: * @hook_list: a #GHookList * @need_valids: %TRUE if #GHook elements which have been destroyed * should be skipped * @func: the function to find * @data: the data to find * * Finds a #GHook in a #GHookList with the given function and data. * * Returns: the #GHook with the given @func and @data or %NULL if * no matching #GHook is found */ GHook* g_hook_find_func_data (GHookList *hook_list, gboolean need_valids, gpointer func, gpointer data) { GHook *hook; g_return_val_if_fail (hook_list != NULL, NULL); g_return_val_if_fail (func != NULL, NULL); hook = hook_list->hooks; while (hook) { /* test only non-destroyed hooks */ if (hook->data == data && hook->func == func && hook->hook_id && (!need_valids || G_HOOK_ACTIVE (hook))) return hook; hook = hook->next; } return NULL; } /** * GHookCompareFunc: * @new_hook: the #GHook being inserted * @sibling: the #GHook to compare with @new_hook * * Defines the type of function used to compare #GHook elements in * g_hook_insert_sorted(). * * Returns: a value <= 0 if @new_hook should be before @sibling */ /** * g_hook_insert_sorted: * @hook_list: a #GHookList * @hook: the #GHook to insert * @func: the comparison function used to sort the #GHook elements * * Inserts a #GHook into a #GHookList, sorted by the given function. */ void g_hook_insert_sorted (GHookList *hook_list, GHook *hook, GHookCompareFunc func) { GHook *sibling; g_return_if_fail (hook_list != NULL); g_return_if_fail (hook_list->is_setup); g_return_if_fail (hook != NULL); g_return_if_fail (G_HOOK_IS_UNLINKED (hook)); g_return_if_fail (hook->func != NULL); g_return_if_fail (func != NULL); /* first non-destroyed hook */ sibling = hook_list->hooks; while (sibling && !sibling->hook_id) sibling = sibling->next; while (sibling) { GHook *tmp; g_hook_ref (hook_list, sibling); if (func (hook, sibling) <= 0 && sibling->hook_id) { g_hook_unref (hook_list, sibling); break; } /* next non-destroyed hook */ tmp = sibling->next; while (tmp && !tmp->hook_id) tmp = tmp->next; g_hook_unref (hook_list, sibling); sibling = tmp; } g_hook_insert_before (hook_list, sibling, hook); } /** * g_hook_compare_ids: * @new_hook: a #GHook * @sibling: a #GHook to compare with @new_hook * * Compares the ids of two #GHook elements, returning a negative value * if the second id is greater than the first. * * Returns: a value <= 0 if the id of @sibling is >= the id of @new_hook */ gint g_hook_compare_ids (GHook *new_hook, GHook *sibling) { if (new_hook->hook_id < sibling->hook_id) return -1; else if (new_hook->hook_id > sibling->hook_id) return 1; return 0; } pkg-config-0.29.1/glib/glib/garray.h0000664000175000017500000002120012651243552014042 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the GLib Team and others 1997-2000. See the AUTHORS * file for a list of people on the GLib Team. See the ChangeLog * files for a list of changes. These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/. */ #ifndef __G_ARRAY_H__ #define __G_ARRAY_H__ #if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) #error "Only can be included directly." #endif #include G_BEGIN_DECLS typedef struct _GBytes GBytes; typedef struct _GArray GArray; typedef struct _GByteArray GByteArray; typedef struct _GPtrArray GPtrArray; struct _GArray { gchar *data; guint len; }; struct _GByteArray { guint8 *data; guint len; }; struct _GPtrArray { gpointer *pdata; guint len; }; /* Resizable arrays. remove fills any cleared spot and shortens the * array, while preserving the order. remove_fast will distort the * order by moving the last element to the position of the removed. */ #define g_array_append_val(a,v) g_array_append_vals (a, &(v), 1) #define g_array_prepend_val(a,v) g_array_prepend_vals (a, &(v), 1) #define g_array_insert_val(a,i,v) g_array_insert_vals (a, i, &(v), 1) #define g_array_index(a,t,i) (((t*) (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); /* Resizable pointer array. This interface is much less complicated * than the above. Add appends a pointer. Remove fills any cleared * spot and shortens the array. remove_fast will again distort order. */ #define g_ptr_array_index(array,index_) ((array)->pdata)[index_] 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); /* Byte arrays, an array of guint8. Implemented as a GArray, * 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); G_END_DECLS #endif /* __G_ARRAY_H__ */ pkg-config-0.29.1/glib/glib/gnode.h0000664000175000017500000002171312651243552013662 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the GLib Team and others 1997-2000. See the AUTHORS * file for a list of people on the GLib Team. See the ChangeLog * files for a list of changes. These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/. */ #ifndef __G_NODE_H__ #define __G_NODE_H__ #if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) #error "Only can be included directly." #endif #include G_BEGIN_DECLS typedef struct _GNode GNode; /* Tree traverse flags */ typedef enum { G_TRAVERSE_LEAVES = 1 << 0, G_TRAVERSE_NON_LEAVES = 1 << 1, G_TRAVERSE_ALL = G_TRAVERSE_LEAVES | G_TRAVERSE_NON_LEAVES, G_TRAVERSE_MASK = 0x03, G_TRAVERSE_LEAFS = G_TRAVERSE_LEAVES, G_TRAVERSE_NON_LEAFS = G_TRAVERSE_NON_LEAVES } GTraverseFlags; /* Tree traverse orders */ typedef enum { G_IN_ORDER, G_PRE_ORDER, G_POST_ORDER, G_LEVEL_ORDER } GTraverseType; typedef gboolean (*GNodeTraverseFunc) (GNode *node, gpointer data); typedef void (*GNodeForeachFunc) (GNode *node, gpointer data); /** * GCopyFunc: * @src: A pointer to the data which should be copied * @data: Additional data * * A function of this signature is used to copy the node data * when doing a deep-copy of a tree. * * Returns: A pointer to the copy * * Since: 2.4 */ typedef gpointer (*GCopyFunc) (gconstpointer src, gpointer data); /* N-way tree implementation */ struct _GNode { gpointer data; GNode *next; GNode *prev; GNode *parent; GNode *children; }; /** * G_NODE_IS_ROOT: * @node: a #GNode * * Returns %TRUE if a #GNode is the root of a tree. * * Returns: %TRUE if the #GNode is the root of a tree * (i.e. it has no parent or siblings) */ #define G_NODE_IS_ROOT(node) (((GNode*) (node))->parent == NULL && \ ((GNode*) (node))->prev == NULL && \ ((GNode*) (node))->next == NULL) /** * G_NODE_IS_LEAF: * @node: a #GNode * * Returns %TRUE if a #GNode is a leaf node. * * Returns: %TRUE if the #GNode is a leaf node * (i.e. it has no children) */ #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, gpointer data); /* convenience macros */ /** * g_node_append: * @parent: the #GNode to place the new #GNode under * @node: the #GNode to insert * * Inserts a #GNode as the last child of the given parent. * * Returns: the inserted #GNode */ #define g_node_append(parent, node) \ g_node_insert_before ((parent), NULL, (node)) /** * g_node_insert_data: * @parent: the #GNode to place the new #GNode under * @position: the position to place the new #GNode at. If position is -1, * the new #GNode is inserted as the last child of @parent * @data: the data for the new #GNode * * Inserts a new #GNode at the given position. * * Returns: the new #GNode */ #define g_node_insert_data(parent, position, data) \ g_node_insert ((parent), (position), g_node_new (data)) /** * g_node_insert_data_after: * @parent: the #GNode to place the new #GNode under * @sibling: the sibling #GNode to place the new #GNode after * @data: the data for the new #GNode * * Inserts a new #GNode after the given sibling. * * Returns: the new #GNode */ #define g_node_insert_data_after(parent, sibling, data) \ g_node_insert_after ((parent), (sibling), g_node_new (data)) /** * g_node_insert_data_before: * @parent: the #GNode to place the new #GNode under * @sibling: the sibling #GNode to place the new #GNode before * @data: the data for the new #GNode * * Inserts a new #GNode before the given sibling. * * Returns: the new #GNode */ #define g_node_insert_data_before(parent, sibling, data) \ g_node_insert_before ((parent), (sibling), g_node_new (data)) /** * g_node_prepend_data: * @parent: the #GNode to place the new #GNode under * @data: the data for the new #GNode * * Inserts a new #GNode as the first child of the given parent. * * Returns: the new #GNode */ #define g_node_prepend_data(parent, data) \ g_node_prepend ((parent), g_node_new (data)) /** * g_node_append_data: * @parent: the #GNode to place the new #GNode under * @data: the data for the new #GNode * * Inserts a new #GNode as the last child of the given parent. * * Returns: the new #GNode */ #define g_node_append_data(parent, data) \ g_node_insert_before ((parent), NULL, g_node_new (data)) /* traversal function, assumes that 'node' is root * (only traverses 'node' and its subtree). * this function is just a high level interface to * low level traversal functions, optimized for speed. */ GLIB_AVAILABLE_IN_ALL void g_node_traverse (GNode *root, GTraverseType order, GTraverseFlags flags, gint max_depth, GNodeTraverseFunc func, gpointer data); /* return the maximum tree height starting with 'node', this is an expensive * operation, since we need to visit all nodes. this could be shortened by * adding 'guint height' to struct _GNode, but then again, this is not very * often needed, and would make g_node_insert() more time consuming. */ 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); /** * g_node_prev_sibling: * @node: a #GNode * * Gets the previous sibling of a #GNode. * * Returns: the previous sibling of @node, or %NULL if @node is the first * node or %NULL */ #define g_node_prev_sibling(node) ((node) ? \ ((GNode*) (node))->prev : NULL) /** * g_node_next_sibling: * @node: a #GNode * * Gets the next sibling of a #GNode. * * Returns: the next sibling of @node, or %NULL if @node is the last node * or %NULL */ #define g_node_next_sibling(node) ((node) ? \ ((GNode*) (node))->next : NULL) /** * g_node_first_child: * @node: a #GNode * * Gets the first child of a #GNode. * * Returns: the first child of @node, or %NULL if @node is %NULL * or has no children */ #define g_node_first_child(node) ((node) ? \ ((GNode*) (node))->children : NULL) G_END_DECLS #endif /* __G_NODE_H__ */ pkg-config-0.29.1/glib/glib/gvariant-core.c0000664000175000017500000010465012651243552015324 00000000000000/* * Copyright © 2007, 2008 Ryan Lortie * Copyright © 2010 Codethink Limited * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "config.h" #include #include #include #include #include #include #include #include #include /* * This file includes the structure definition for GVariant and a small * set of functions that are allowed to access the structure directly. * * This minimises the amount of code that can possibly touch a GVariant * structure directly to a few simple fundamental operations. These few * operations are written to be completely threadsafe with respect to * all possible outside access. This means that we only need to be * concerned about thread safety issues in this one small file. * * Most GVariant API functions are in gvariant.c. */ /** * GVariant: * * #GVariant is an opaque data structure and can only be accessed * using the following functions. * * Since: 2.24 **/ struct _GVariant /* see below for field member documentation */ { GVariantTypeInfo *type_info; gsize size; union { struct { GBytes *bytes; gconstpointer data; } serialised; struct { GVariant **children; gsize n_children; } tree; } contents; gint state; gint ref_count; }; /* struct GVariant: * * There are two primary forms of GVariant instances: "serialised form" * and "tree form". * * "serialised form": A serialised GVariant instance stores its value in * the GVariant serialisation format. All * basic-typed instances (ie: non-containers) are in * serialised format, as are some containers. * * "tree form": Some containers are in "tree form". In this case, * instead of containing the serialised data for the * container, the instance contains an array of pointers to * the child values of the container (thus forming a tree). * * It is possible for an instance to transition from tree form to * serialised form. This happens, implicitly, if the serialised data is * requested (eg: via g_variant_get_data()). Serialised form instances * never transition into tree form. * * * The fields of the structure are documented here: * * type_info: this is a reference to a GVariantTypeInfo describing the * type of the instance. When the instance is freed, this * reference must be released with g_variant_type_info_unref(). * * The type_info field never changes during the life of the * instance, so it can be accessed without a lock. * * size: this is the size of the serialised form for the instance, if it * is known. If the instance is in serialised form then it is, by * definition, known. If the instance is in tree form then it may * be unknown (in which case it is -1). It is possible for the * size to be known when in tree form if, for example, the user * has called g_variant_get_size() without calling * g_variant_get_data(). Additionally, even when the user calls * g_variant_get_data() the size of the data must first be * determined so that a large enough buffer can be allocated for * the data. * * Once the size is known, it can never become unknown again. * g_variant_ensure_size() is used to ensure that the size is in * the known state -- it calculates the size if needed. After * that, the size field can be accessed without a lock. * * contents: a union containing either the information associated with * holding a value in serialised form or holding a value in * tree form. * * .serialised: Only valid when the instance is in serialised form. * * Since an instance can never transition away from * serialised form, once these fields are set, they will * never be changed. It is therefore valid to access * them without holding a lock. * * .bytes: the #GBytes that contains the memory pointed to by * .data, or %NULL if .data is %NULL. In the event that * the instance was deserialised from another instance, * then the bytes will be shared by both of them. When * the instance is freed, this reference must be released * with g_bytes_unref(). * * .data: the serialised data (of size 'size') of the instance. * This pointer should not be freed or modified in any way. * #GBytes is responsible for memory management. * * This pointer may be %NULL in two cases: * * - if the serialised size of the instance is 0 * * - if the instance is of a fixed-sized type and was * deserialised out of a corrupted container such that * the container contains too few bytes to point to the * entire proper fixed-size of this instance. In this * case, 'size' will still be equal to the proper fixed * size, but this pointer will be %NULL. This is exactly * the reason that g_variant_get_data() sometimes returns * %NULL. For all other calls, the effect should be as * if .data pointed to the appropriate number of nul * bytes. * * .tree: Only valid when the instance is in tree form. * * Note that accesses from other threads could result in * conversion of the instance from tree form to serialised form * at any time. For this reason, the instance lock must always * be held while performing any operations on 'contents.tree'. * * .children: the array of the child instances of this instance. * When the instance is freed (or converted to serialised * form) then each child must have g_variant_unref() * called on it and the array must be freed using * g_free(). * * .n_children: the number of items in the .children array. * * state: a bitfield describing the state of the instance. It is a * bitwise-or of the following STATE_* constants: * * STATE_LOCKED: the instance lock is held. This is the bit used by * g_bit_lock(). * * STATE_SERIALISED: the instance is in serialised form. If this * flag is not set then the instance is in tree * form. * * STATE_TRUSTED: for serialised form instances, this means that the * serialised data is known to be in normal form (ie: * not corrupted). * * For tree form instances, this means that all of the * child instances in the contents.tree.children array * are trusted. This means that if the container is * serialised then the resulting data will be in * normal form. * * If this flag is unset it does not imply that the * data is corrupted. It merely means that we're not * sure that it's valid. See g_variant_is_trusted(). * * STATE_FLOATING: if this flag is set then the object has a floating * reference. See g_variant_ref_sink(). * * ref_count: the reference count of the instance */ #define STATE_LOCKED 1 #define STATE_SERIALISED 2 #define STATE_TRUSTED 4 #define STATE_FLOATING 8 /* -- private -- */ /* < private > * g_variant_lock: * @value: a #GVariant * * Locks @value for performing sensitive operations. */ static void g_variant_lock (GVariant *value) { g_bit_lock (&value->state, 0); } /* < private > * g_variant_unlock: * @value: a #GVariant * * Unlocks @value after performing sensitive operations. */ static void g_variant_unlock (GVariant *value) { g_bit_unlock (&value->state, 0); } /* < private > * g_variant_release_children: * @value: a #GVariant * * Releases the reference held on each child in the 'children' array of * @value and frees the array itself. @value must be in tree form. * * This is done when freeing a tree-form instance or converting it to * serialised form. * * The current thread must hold the lock on @value. */ static void g_variant_release_children (GVariant *value) { gsize i; g_assert (value->state & STATE_LOCKED); g_assert (~value->state & STATE_SERIALISED); for (i = 0; i < value->contents.tree.n_children; i++) g_variant_unref (value->contents.tree.children[i]); g_free (value->contents.tree.children); } /* This begins the main body of the recursive serialiser. * * There are 3 functions here that work as a team with the serialiser to * get things done. g_variant_store() has a trivial role, but as a * public API function, it has its definition elsewhere. * * Note that "serialisation" of an instance does not mean that the * instance is converted to serialised form -- it means that the * serialised form of an instance is written to an external buffer. * g_variant_ensure_serialised() (which is not part of this set of * functions) is the function that is responsible for converting an * instance to serialised form. * * We are only concerned here with container types since non-container * instances are always in serialised form. For these instances, * storing their serialised form merely involves a memcpy(). * * Serialisation is a two-step process. First, the size of the * serialised data must be calculated so that an appropriately-sized * buffer can be allocated. Second, the data is written into the * buffer. * * Determining the size: * The process of determining the size is triggered by a call to * g_variant_ensure_size() on a container. This invokes the * serialiser code to determine the size. The serialiser is passed * g_variant_fill_gvs() as a callback. * * g_variant_fill_gvs() is called by the serialiser on each child of * the container which, in turn, calls g_variant_ensure_size() on * itself and fills in the result of its own size calculation. * * The serialiser uses the size information from the children to * calculate the size needed for the entire container. * * Writing the data: * After the buffer has been allocated, g_variant_serialise() is * called on the container. This invokes the serialiser code to write * the bytes to the container. The serialiser is, again, passed * g_variant_fill_gvs() as a callback. * * This time, when g_variant_fill_gvs() is called for each child, the * child is given a pointer to a sub-region of the allocated buffer * where it should write its data. This is done by calling * g_variant_store(). In the event that the instance is in serialised * form this means a memcpy() of the serialised data into the * allocated buffer. In the event that the instance is in tree form * this means a recursive call back into g_variant_serialise(). * * * The forward declaration here allows corecursion via callback: */ static void g_variant_fill_gvs (GVariantSerialised *, gpointer); /* < private > * g_variant_ensure_size: * @value: a #GVariant * * Ensures that the ->size field of @value is filled in properly. This * must be done as a precursor to any serialisation of the value in * order to know how large of a buffer is needed to store the data. * * The current thread must hold the lock on @value. */ static void g_variant_ensure_size (GVariant *value) { g_assert (value->state & STATE_LOCKED); if (value->size == (gssize) -1) { gpointer *children; gsize n_children; children = (gpointer *) value->contents.tree.children; n_children = value->contents.tree.n_children; value->size = g_variant_serialiser_needed_size (value->type_info, g_variant_fill_gvs, children, n_children); } } /* < private > * g_variant_serialise: * @value: a #GVariant * @data: an appropriately-sized buffer * * Serialises @value into @data. @value must be in tree form. * * No change is made to @value. * * The current thread must hold the lock on @value. */ static void g_variant_serialise (GVariant *value, gpointer data) { GVariantSerialised serialised = { 0, }; gpointer *children; gsize n_children; g_assert (~value->state & STATE_SERIALISED); g_assert (value->state & STATE_LOCKED); serialised.type_info = value->type_info; serialised.size = value->size; serialised.data = data; children = (gpointer *) value->contents.tree.children; n_children = value->contents.tree.n_children; g_variant_serialiser_serialise (serialised, g_variant_fill_gvs, children, n_children); } /* < private > * g_variant_fill_gvs: * @serialised: a pointer to a #GVariantSerialised * @data: a #GVariant instance * * This is the callback that is passed by a tree-form container instance * to the serialiser. This callback gets called on each child of the * container. Each child is responsible for performing the following * actions: * * - reporting its type * * - reporting its serialised size (requires knowing the size first) * * - possibly storing its serialised form into the provided buffer */ static void g_variant_fill_gvs (GVariantSerialised *serialised, gpointer data) { GVariant *value = data; g_variant_lock (value); g_variant_ensure_size (value); g_variant_unlock (value); if (serialised->type_info == NULL) serialised->type_info = value->type_info; g_assert (serialised->type_info == value->type_info); if (serialised->size == 0) serialised->size = value->size; g_assert (serialised->size == value->size); if (serialised->data) /* g_variant_store() is a public API, so it * it will reacquire the lock if it needs to. */ g_variant_store (value, serialised->data); } /* this ends the main body of the recursive serialiser */ /* < private > * g_variant_ensure_serialised: * @value: a #GVariant * * Ensures that @value is in serialised form. * * If @value is in tree form then this function ensures that the * serialised size is known and then allocates a buffer of that size and * serialises the instance into the buffer. The 'children' array is * then released and the instance is set to serialised form based on the * contents of the buffer. * * The current thread must hold the lock on @value. */ static void g_variant_ensure_serialised (GVariant *value) { g_assert (value->state & STATE_LOCKED); if (~value->state & STATE_SERIALISED) { GBytes *bytes; gpointer data; g_variant_ensure_size (value); data = g_malloc (value->size); g_variant_serialise (value, data); g_variant_release_children (value); bytes = g_bytes_new_take (data, value->size); value->contents.serialised.data = g_bytes_get_data (bytes, NULL); value->contents.serialised.bytes = bytes; value->state |= STATE_SERIALISED; } } /* < private > * g_variant_alloc: * @type: the type of the new instance * @serialised: if the instance will be in serialised form * @trusted: if the instance will be trusted * * Allocates a #GVariant instance and does some common work (such as * looking up and filling in the type info), setting the state field, * and setting the ref_count to 1. * * Returns: a new #GVariant with a floating reference */ static GVariant * g_variant_alloc (const GVariantType *type, gboolean serialised, gboolean trusted) { GVariant *value; value = g_slice_new (GVariant); value->type_info = g_variant_type_info_get (type); value->state = (serialised ? STATE_SERIALISED : 0) | (trusted ? STATE_TRUSTED : 0) | STATE_FLOATING; value->size = (gssize) -1; value->ref_count = 1; return value; } /** * g_variant_new_from_bytes: * @type: a #GVariantType * @bytes: a #GBytes * @trusted: if the contents of @bytes are trusted * * Constructs a new serialised-mode #GVariant instance. This is the * inner interface for creation of new serialised values that gets * called from various functions in gvariant.c. * * A reference is taken on @bytes. * * Returns: (transfer none): a new #GVariant with a floating reference * * Since: 2.36 */ GVariant * g_variant_new_from_bytes (const GVariantType *type, GBytes *bytes, gboolean trusted) { GVariant *value; guint alignment; gsize size; value = g_variant_alloc (type, TRUE, trusted); value->contents.serialised.bytes = g_bytes_ref (bytes); g_variant_type_info_query (value->type_info, &alignment, &size); if (size && g_bytes_get_size (bytes) != size) { /* Creating a fixed-sized GVariant with a bytes of the wrong * size. * * We should do the equivalent of pulling a fixed-sized child out * of a brozen container (ie: data is NULL size is equal to the correct * fixed size). */ value->contents.serialised.data = NULL; value->size = size; } else { value->contents.serialised.data = g_bytes_get_data (bytes, &value->size); } return value; } /* -- internal -- */ /* < internal > * g_variant_new_from_children: * @type: a #GVariantType * @children: an array of #GVariant pointers. Consumed. * @n_children: the length of @children * @trusted: %TRUE if every child in @children in trusted * * Constructs a new tree-mode #GVariant instance. This is the inner * interface for creation of new serialised values that gets called from * various functions in gvariant.c. * * @children is consumed by this function. g_free() will be called on * it some time later. * * Returns: a new #GVariant with a floating reference */ GVariant * g_variant_new_from_children (const GVariantType *type, GVariant **children, gsize n_children, gboolean trusted) { GVariant *value; value = g_variant_alloc (type, FALSE, trusted); value->contents.tree.children = children; value->contents.tree.n_children = n_children; return value; } /* < internal > * g_variant_get_type_info: * @value: a #GVariant * * Returns the #GVariantTypeInfo corresponding to the type of @value. A * reference is not added, so the return value is only good for the * duration of the life of @value. * * Returns: the #GVariantTypeInfo for @value */ GVariantTypeInfo * g_variant_get_type_info (GVariant *value) { return value->type_info; } /* < internal > * g_variant_is_trusted: * @value: a #GVariant * * Determines if @value is trusted by #GVariant to contain only * fully-valid data. All values constructed solely via #GVariant APIs * are trusted, but values containing data read in from other sources * are usually not trusted. * * The main advantage of trusted data is that certain checks can be * skipped. For example, we don't need to check that a string is * properly nul-terminated or that an object path is actually a * properly-formatted object path. * * Returns: if @value is trusted */ gboolean g_variant_is_trusted (GVariant *value) { return (value->state & STATE_TRUSTED) != 0; } /* -- public -- */ /** * g_variant_unref: * @value: a #GVariant * * Decreases the reference count of @value. When its reference count * drops to 0, the memory used by the variant is freed. * * Since: 2.24 **/ void g_variant_unref (GVariant *value) { g_return_if_fail (value != NULL); g_return_if_fail (value->ref_count > 0); if (g_atomic_int_dec_and_test (&value->ref_count)) { if G_UNLIKELY (value->state & STATE_LOCKED) g_critical ("attempting to free a locked GVariant instance. " "This should never happen."); value->state |= STATE_LOCKED; g_variant_type_info_unref (value->type_info); if (value->state & STATE_SERIALISED) g_bytes_unref (value->contents.serialised.bytes); else g_variant_release_children (value); memset (value, 0, sizeof (GVariant)); g_slice_free (GVariant, value); } } /** * g_variant_ref: * @value: a #GVariant * * Increases the reference count of @value. * * Returns: the same @value * * Since: 2.24 **/ GVariant * g_variant_ref (GVariant *value) { g_return_val_if_fail (value != NULL, NULL); g_return_val_if_fail (value->ref_count > 0, NULL); g_atomic_int_inc (&value->ref_count); return value; } /** * g_variant_ref_sink: * @value: a #GVariant * * #GVariant uses a floating reference count system. All functions with * names starting with g_variant_new_ return floating * references. * * Calling g_variant_ref_sink() on a #GVariant with a floating reference * will convert the floating reference into a full reference. Calling * g_variant_ref_sink() on a non-floating #GVariant results in an * additional normal reference being added. * * In other words, if the @value is floating, then this call "assumes * ownership" of the floating reference, converting it to a normal * reference. If the @value is not floating, then this call adds a * new normal reference increasing the reference count by one. * * All calls that result in a #GVariant instance being inserted into a * container will call g_variant_ref_sink() on the instance. This means * that if the value was just created (and has only its floating * reference) then the container will assume sole ownership of the value * at that point and the caller will not need to unreference it. This * makes certain common styles of programming much easier while still * maintaining normal refcounting semantics in situations where values * are not floating. * * Returns: the same @value * * Since: 2.24 **/ GVariant * g_variant_ref_sink (GVariant *value) { g_return_val_if_fail (value != NULL, NULL); g_return_val_if_fail (value->ref_count > 0, NULL); g_variant_lock (value); if (~value->state & STATE_FLOATING) g_variant_ref (value); else value->state &= ~STATE_FLOATING; g_variant_unlock (value); return value; } /** * g_variant_take_ref: * @value: a #GVariant * * If @value is floating, sink it. Otherwise, do nothing. * * Typically you want to use g_variant_ref_sink() in order to * automatically do the correct thing with respect to floating or * non-floating references, but there is one specific scenario where * this function is helpful. * * The situation where this function is helpful is when creating an API * that allows the user to provide a callback function that returns a * #GVariant. We certainly want to allow the user the flexibility to * return a non-floating reference from this callback (for the case * where the value that is being returned already exists). * * At the same time, the style of the #GVariant API makes it likely that * for newly-created #GVariant instances, the user can be saved some * typing if they are allowed to return a #GVariant with a floating * reference. * * Using this function on the return value of the user's callback allows * the user to do whichever is more convenient for them. The caller * will alway receives exactly one full reference to the value: either * the one that was returned in the first place, or a floating reference * that has been converted to a full reference. * * This function has an odd interaction when combined with * g_variant_ref_sink() running at the same time in another thread on * the same #GVariant instance. If g_variant_ref_sink() runs first then * the result will be that the floating reference is converted to a hard * reference. If g_variant_take_ref() runs first then the result will * be that the floating reference is converted to a hard reference and * an additional reference on top of that one is added. It is best to * avoid this situation. * * Returns: the same @value **/ GVariant * g_variant_take_ref (GVariant *value) { g_return_val_if_fail (value != NULL, NULL); g_return_val_if_fail (value->ref_count > 0, NULL); g_atomic_int_and (&value->state, ~STATE_FLOATING); return value; } /** * g_variant_is_floating: * @value: a #GVariant * * Checks whether @value has a floating reference count. * * This function should only ever be used to assert that a given variant * is or is not floating, or for debug purposes. To acquire a reference * to a variant that might be floating, always use g_variant_ref_sink() * or g_variant_take_ref(). * * See g_variant_ref_sink() for more information about floating reference * counts. * * Returns: whether @value is floating * * Since: 2.26 **/ gboolean g_variant_is_floating (GVariant *value) { g_return_val_if_fail (value != NULL, FALSE); return (value->state & STATE_FLOATING) != 0; } /** * g_variant_get_size: * @value: a #GVariant instance * * Determines the number of bytes that would be required to store @value * with g_variant_store(). * * If @value has a fixed-sized type then this function always returned * that fixed size. * * In the case that @value is already in serialised form or the size has * already been calculated (ie: this function has been called before) * then this function is O(1). Otherwise, the size is calculated, an * operation which is approximately O(n) in the number of values * involved. * * Returns: the serialised size of @value * * Since: 2.24 **/ gsize g_variant_get_size (GVariant *value) { g_variant_lock (value); g_variant_ensure_size (value); g_variant_unlock (value); return value->size; } /** * g_variant_get_data: * @value: a #GVariant instance * * Returns a pointer to the serialised form of a #GVariant instance. * The returned data may not be in fully-normalised form if read from an * untrusted source. The returned data must not be freed; it remains * valid for as long as @value exists. * * If @value is a fixed-sized value that was deserialised from a * corrupted serialised container then %NULL may be returned. In this * case, the proper thing to do is typically to use the appropriate * number of nul bytes in place of @value. If @value is not fixed-sized * then %NULL is never returned. * * In the case that @value is already in serialised form, this function * is O(1). If the value is not already in serialised form, * serialisation occurs implicitly and is approximately O(n) in the size * of the result. * * To deserialise the data returned by this function, in addition to the * serialised data, you must know the type of the #GVariant, and (if the * machine might be different) the endianness of the machine that stored * it. As a result, file formats or network messages that incorporate * serialised #GVariants must include this information either * implicitly (for instance "the file always contains a * %G_VARIANT_TYPE_VARIANT and it is always in little-endian order") or * explicitly (by storing the type and/or endianness in addition to the * serialised data). * * Returns: (transfer none): the serialised form of @value, or %NULL * * Since: 2.24 **/ gconstpointer g_variant_get_data (GVariant *value) { g_variant_lock (value); g_variant_ensure_serialised (value); g_variant_unlock (value); return value->contents.serialised.data; } /** * 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 * * Determines the number of children in a container #GVariant instance. * This includes variants, maybes, arrays, tuples and dictionary * entries. It is an error to call this function on any other type of * #GVariant. * * For variants, the return value is always 1. For values with maybe * types, it is always zero or one. For arrays, it is the length of the * array. For tuples it is the number of tuple items (which depends * only on the type). For dictionary entries, it is always 2 * * This function is O(1). * * Returns: the number of children in the container * * Since: 2.24 **/ gsize g_variant_n_children (GVariant *value) { gsize n_children; g_variant_lock (value); if (value->state & STATE_SERIALISED) { GVariantSerialised serialised = { value->type_info, (gpointer) value->contents.serialised.data, value->size }; n_children = g_variant_serialised_n_children (serialised); } else n_children = value->contents.tree.n_children; g_variant_unlock (value); return n_children; } /** * g_variant_get_child_value: * @value: a container #GVariant * @index_: the index of the child to fetch * * Reads a child item out of a container #GVariant instance. This * includes variants, maybes, arrays, tuples and dictionary * entries. It is an error to call this function on any other type of * #GVariant. * * It is an error if @index_ is greater than the number of child items * in the container. See g_variant_n_children(). * * The returned value is never floating. You should free it with * g_variant_unref() when you're done with it. * * This function is O(1). * * Returns: (transfer full): the child at the specified index * * Since: 2.24 **/ GVariant * g_variant_get_child_value (GVariant *value, gsize index_) { g_return_val_if_fail (index_ < g_variant_n_children (value), NULL); if (~g_atomic_int_get (&value->state) & STATE_SERIALISED) { g_variant_lock (value); if (~value->state & STATE_SERIALISED) { GVariant *child; child = g_variant_ref (value->contents.tree.children[index_]); g_variant_unlock (value); return child; } g_variant_unlock (value); } { GVariantSerialised serialised = { value->type_info, (gpointer) value->contents.serialised.data, value->size }; GVariantSerialised s_child; GVariant *child; /* get the serialiser to extract the serialised data for the child * from the serialised data for the container */ s_child = g_variant_serialised_get_child (serialised, index_); /* create a new serialised instance out of it */ child = g_slice_new (GVariant); child->type_info = s_child.type_info; child->state = (value->state & STATE_TRUSTED) | STATE_SERIALISED; child->size = s_child.size; child->ref_count = 1; child->contents.serialised.bytes = g_bytes_ref (value->contents.serialised.bytes); child->contents.serialised.data = s_child.data; return child; } } /** * g_variant_store: * @value: the #GVariant to store * @data: the location to store the serialised data at * * Stores the serialised form of @value at @data. @data should be * large enough. See g_variant_get_size(). * * The stored data is in machine native byte order but may not be in * fully-normalised form if read from an untrusted source. See * g_variant_get_normal_form() for a solution. * * As with g_variant_get_data(), to be able to deserialise the * serialised variant successfully, its type and (if the destination * machine might be different) its endianness must also be available. * * This function is approximately O(n) in the size of @data. * * Since: 2.24 **/ void g_variant_store (GVariant *value, gpointer data) { g_variant_lock (value); if (value->state & STATE_SERIALISED) { if (value->contents.serialised.data != NULL) memcpy (data, value->contents.serialised.data, value->size); else memset (data, 0, value->size); } else g_variant_serialise (value, data); g_variant_unlock (value); } /** * g_variant_is_normal_form: * @value: a #GVariant instance * * Checks if @value is in normal form. * * The main reason to do this is to detect if a given chunk of * serialised data is in normal form: load the data into a #GVariant * using g_variant_new_from_data() and then use this function to * check. * * If @value is found to be in normal form then it will be marked as * being trusted. If the value was already marked as being trusted then * this function will immediately return %TRUE. * * Returns: %TRUE if @value is in normal form * * Since: 2.24 **/ gboolean g_variant_is_normal_form (GVariant *value) { if (value->state & STATE_TRUSTED) return TRUE; g_variant_lock (value); if (value->state & STATE_SERIALISED) { GVariantSerialised serialised = { value->type_info, (gpointer) value->contents.serialised.data, value->size }; if (g_variant_serialised_is_normal (serialised)) value->state |= STATE_TRUSTED; } else { gboolean normal = TRUE; gsize i; for (i = 0; i < value->contents.tree.n_children; i++) normal &= g_variant_is_normal_form (value->contents.tree.children[i]); if (normal) value->state |= STATE_TRUSTED; } g_variant_unlock (value); return (value->state & STATE_TRUSTED) != 0; } pkg-config-0.29.1/glib/glib/gerror.c0000664000175000017500000005371012651243552014063 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the GLib Team and others 1997-2000. See the AUTHORS * file for a list of people on the GLib Team. See the ChangeLog * files for a list of changes. These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/. */ /** * SECTION:error_reporting * @Title: Error Reporting * @Short_description: a system for reporting errors * * GLib provides a standard method of reporting errors from a called * function to the calling code. (This is the same problem solved by * exceptions in other languages.) It's important to understand that * this method is both a data type (the #GError * object) and a set of rules. If you use #GError * incorrectly, then your code will not properly interoperate with other * code that uses #GError, and users of your API will probably get confused. * * First and foremost: #GError should only be used to report * recoverable runtime errors, never to report programming * errors. If the programmer has screwed up, then you should * use g_warning(), g_return_if_fail(), g_assert(), g_error(), or some * similar facility. (Incidentally, remember that the g_error() function * should only be used for programming errors, it * should not be used to print any error reportable via #GError.) * * Examples of recoverable runtime errors are "file not found" or * "failed to parse input." Examples of programming errors are "NULL * passed to strcmp()" or "attempted to free the same pointer twice." * These two kinds of errors are fundamentally different: runtime errors * should be handled or reported to the user, programming errors should * be eliminated by fixing the bug in the program. This is why most * functions in GLib and GTK+ do not use the #GError facility. * * Functions that can fail take a return location for a #GError as their * last argument. For example: * |[ * gboolean g_file_get_contents (const gchar *filename, * gchar **contents, * gsize *length, * GError **error); * ]| * If you pass a non-%NULL value for the error * argument, it should point to a location where an error can be placed. * For example: * |[ * gchar *contents; * GError *err = NULL; * g_file_get_contents ("foo.txt", &contents, NULL, &err); * g_assert ((contents == NULL && err != NULL) || (contents != NULL && err == NULL)); * if (err != NULL) * { * /* Report error to user, and free error */ * g_assert (contents == NULL); * fprintf (stderr, "Unable to read file: %s\n", err->message); * g_error_free (err); * } * else * { * /* Use file contents */ * g_assert (contents != NULL); * } * ]| * Note that err != NULL in this example is a * reliable indicator of whether * g_file_get_contents() failed. Additionally, g_file_get_contents() * returns a boolean which indicates whether it was successful. * * Because g_file_get_contents() returns %FALSE on failure, if you * are only interested in whether it failed and don't need to display * an error message, you can pass %NULL for the error * argument: * |[ * if (g_file_get_contents ("foo.txt", &contents, NULL, NULL)) /* ignore errors */ * /* no error occurred */ ; * else * /* error */ ; * ]| * * The #GError object contains three fields: domain * indicates the module the error-reporting function is located in, * code indicates the specific error that occurred, * and message is a user-readable error message with * as many details as possible. Several functions are provided to deal * with an error received from a called function: g_error_matches() * returns %TRUE if the error matches a given domain and code, * g_propagate_error() copies an error into an error location (so the * calling function will receive it), and g_clear_error() clears an * error location by freeing the error and resetting the location to * %NULL. To display an error to the user, simply display * error->message, perhaps along with additional * context known only to the calling function (the file being opened, * or whatever -- though in the g_file_get_contents() case, * error->message already contains a filename). * * When implementing a function that can report errors, the basic * tool is g_set_error(). Typically, if a fatal error occurs you * want to g_set_error(), then return immediately. g_set_error() * does nothing if the error location passed to it is %NULL. * Here's an example: * |[ * gint * foo_open_file (GError **error) * { * gint fd; * * fd = open ("file.txt", O_RDONLY); * * if (fd < 0) * { * g_set_error (error, * FOO_ERROR, /* error domain */ * FOO_ERROR_BLAH, /* error code */ * "Failed to open file: %s", /* error message format string */ * g_strerror (errno)); * return -1; * } * else * return fd; * } * ]| * * Things are somewhat more complicated if you yourself call another * function that can report a #GError. If the sub-function indicates * fatal errors in some way other than reporting a #GError, such as * by returning %TRUE on success, you can simply do the following: * |[ * gboolean * my_function_that_can_fail (GError **err) * { * g_return_val_if_fail (err == NULL || *err == NULL, FALSE); * * if (!sub_function_that_can_fail (err)) * { * /* assert that error was set by the sub-function */ * g_assert (err == NULL || *err != NULL); * return FALSE; * } * * /* otherwise continue, no error occurred */ * g_assert (err == NULL || *err == NULL); * } * ]| * * If the sub-function does not indicate errors other than by * reporting a #GError, you need to create a temporary #GError * since the passed-in one may be %NULL. g_propagate_error() is * intended for use in this case. * |[ * gboolean * my_function_that_can_fail (GError **err) * { * GError *tmp_error; * * g_return_val_if_fail (err == NULL || *err == NULL, FALSE); * * tmp_error = NULL; * sub_function_that_can_fail (&tmp_error); * * if (tmp_error != NULL) * { * /* store tmp_error in err, if err != NULL, * * otherwise call g_error_free() on tmp_error * */ * g_propagate_error (err, tmp_error); * return FALSE; * } * * /* otherwise continue, no error occurred */ * } * ]| * * Error pileups are always a bug. For example, this code is incorrect: * |[ * gboolean * my_function_that_can_fail (GError **err) * { * GError *tmp_error; * * g_return_val_if_fail (err == NULL || *err == NULL, FALSE); * * tmp_error = NULL; * sub_function_that_can_fail (&tmp_error); * other_function_that_can_fail (&tmp_error); * * if (tmp_error != NULL) * { * g_propagate_error (err, tmp_error); * return FALSE; * } * } * ]| * tmp_error should be checked immediately after * sub_function_that_can_fail(), and either cleared or propagated * upward. The rule is: after each error, you must either * handle the error, or return it to the calling function. * Note that passing %NULL for the error location is the equivalent * of handling an error by always doing nothing about it. So the * following code is fine, assuming errors in sub_function_that_can_fail() * are not fatal to my_function_that_can_fail(): * |[ * gboolean * my_function_that_can_fail (GError **err) * { * GError *tmp_error; * * g_return_val_if_fail (err == NULL || *err == NULL, FALSE); * * sub_function_that_can_fail (NULL); /* ignore errors */ * * tmp_error = NULL; * other_function_that_can_fail (&tmp_error); * * if (tmp_error != NULL) * { * g_propagate_error (err, tmp_error); * return FALSE; * } * } * ]| * * Note that passing %NULL for the error location * ignores errors; it's equivalent to * try { sub_function_that_can_fail (); } catch (...) {} * in C++. It does not mean to leave errors * unhandled; it means to handle them by doing nothing. * * Error domains and codes are conventionally named as follows: * * * The error domain is called * <NAMESPACE>_<MODULE>_ERROR, * for example %G_SPAWN_ERROR or %G_THREAD_ERROR: * |[ * #define G_SPAWN_ERROR g_spawn_error_quark () * * GQuark * g_spawn_error_quark (void) * { * return g_quark_from_static_string ("g-spawn-error-quark"); * } * ]| * * * The quark function for the error domain is called * <namespace>_<module>_error_quark, * for example g_spawn_error_quark() or g_thread_error_quark(). * * * The error codes are in an enumeration called * <Namespace><Module>Error; * for example,#GThreadError or #GSpawnError. * * * Members of the error code enumeration are called * <NAMESPACE>_<MODULE>_ERROR_<CODE>, * for example %G_SPAWN_ERROR_FORK or %G_THREAD_ERROR_AGAIN. * * * If there's a "generic" or "unknown" error code for unrecoverable * errors it doesn't make sense to distinguish with specific codes, * it should be called <NAMESPACE>_<MODULE>_ERROR_FAILED, * for example %G_SPAWN_ERROR_FAILED. * * * * Summary of rules for use of #GError: * * * Do not report programming errors via #GError. * * * The last argument of a function that returns an error should * be a location where a #GError can be placed (i.e. "#GError** error"). * If #GError is used with varargs, the #GError** should be the last * argument before the "...". * * * The caller may pass %NULL for the #GError** if they are not interested * in details of the exact error that occurred. * * * If %NULL is passed for the #GError** argument, then errors should * not be returned to the caller, but your function should still * abort and return if an error occurs. That is, control flow should * not be affected by whether the caller wants to get a #GError. * * * If a #GError is reported, then your function by definition * had a fatal failure and did not complete whatever * it was supposed to do. If the failure was not fatal, * then you handled it and you should not report it. If it was fatal, * then you must report it and discontinue whatever you were doing * immediately. * * * If a #GError is reported, out parameters are not guaranteed to * be set to any defined value. * * * A #GError* must be initialized to %NULL before passing its address * to a function that can report errors. * * * "Piling up" errors is always a bug. That is, if you assign a * new #GError to a #GError* that is non-%NULL, thus overwriting * the previous error, it indicates that you should have aborted * the operation instead of continuing. If you were able to continue, * you should have cleared the previous error with g_clear_error(). * g_set_error() will complain if you pile up errors. * * * By convention, if you return a boolean value indicating success * then %TRUE means success and %FALSE means failure. If %FALSE is * returned, the error must be set to a non-%NULL * value. * * * A %NULL return value is also frequently used to mean that an error * occurred. You should make clear in your documentation whether %NULL * is a valid return value in non-error cases; if %NULL is a valid value, * then users must check whether an error was returned to see if the * function succeeded. * * * When implementing a function that can report errors, you may want * to add a check at the top of your function that the error return * location is either %NULL or contains a %NULL error (e.g. * g_return_if_fail (error == NULL || *error == NULL);). * * */ #include "config.h" #include "gerror.h" #include "gslice.h" #include "gstrfuncs.h" #include "gtestutils.h" /** * g_error_new_valist: * @domain: error domain * @code: error code * @format: printf()-style format for error message * @args: #va_list of parameters for the message format * * Creates a new #GError with the given @domain and @code, * and a message formatted with @format. * * Returns: a new #GError * * Since: 2.22 */ GError* g_error_new_valist (GQuark domain, gint code, const gchar *format, va_list args) { GError *error; /* Historically, GError allowed this (although it was never meant to work), * and it has significant use in the wild, which g_return_val_if_fail * would break. It should maybe g_return_val_if_fail in GLib 4. * (GNOME#660371, GNOME#560482) */ g_warn_if_fail (domain != 0); g_warn_if_fail (format != NULL); error = g_slice_new (GError); error->domain = domain; error->code = code; error->message = g_strdup_vprintf (format, args); return error; } /** * g_error_new: * @domain: error domain * @code: error code * @format: printf()-style format for error message * @...: parameters for message format * * Creates a new #GError with the given @domain and @code, * and a message formatted with @format. * * Return value: a new #GError */ GError* g_error_new (GQuark domain, gint code, const gchar *format, ...) { GError* error; va_list args; g_return_val_if_fail (format != NULL, NULL); g_return_val_if_fail (domain != 0, NULL); va_start (args, format); error = g_error_new_valist (domain, code, format, args); va_end (args); return error; } /** * g_error_new_literal: * @domain: error domain * @code: error code * @message: error message * * Creates a new #GError; unlike g_error_new(), @message is * not a printf()-style format string. Use this function if * @message contains text you don't have control over, * that could include printf() escape sequences. * * Return value: a new #GError **/ GError* g_error_new_literal (GQuark domain, gint code, const gchar *message) { GError* err; g_return_val_if_fail (message != NULL, NULL); g_return_val_if_fail (domain != 0, NULL); err = g_slice_new (GError); err->domain = domain; err->code = code; err->message = g_strdup (message); return err; } /** * g_error_free: * @error: a #GError * * Frees a #GError and associated resources. */ void g_error_free (GError *error) { g_return_if_fail (error != NULL); g_free (error->message); g_slice_free (GError, error); } /** * g_error_copy: * @error: a #GError * * Makes a copy of @error. * * Return value: a new #GError */ GError* g_error_copy (const GError *error) { GError *copy; g_return_val_if_fail (error != NULL, NULL); /* See g_error_new_valist for why these don't return */ g_warn_if_fail (error->domain != 0); g_warn_if_fail (error->message != NULL); copy = g_slice_new (GError); *copy = *error; copy->message = g_strdup (error->message); return copy; } /** * g_error_matches: * @error: (allow-none): a #GError or %NULL * @domain: an error domain * @code: an error code * * Returns %TRUE if @error matches @domain and @code, %FALSE * otherwise. In particular, when @error is %NULL, %FALSE will * be returned. * * Return value: whether @error has @domain and @code */ gboolean g_error_matches (const GError *error, GQuark domain, gint code) { return error && error->domain == domain && error->code == code; } #define ERROR_OVERWRITTEN_WARNING "GError set over the top of a previous GError or uninitialized memory.\n" \ "This indicates a bug in someone's code. You must ensure an error is NULL before it's set.\n" \ "The overwriting error message was: %s" /** * g_set_error: * @err: (allow-none): a return location for a #GError, or %NULL * @domain: error domain * @code: error code * @format: printf()-style format * @...: args for @format * * Does nothing if @err is %NULL; if @err is non-%NULL, then *@err * must be %NULL. A new #GError is created and assigned to *@err. */ void g_set_error (GError **err, GQuark domain, gint code, const gchar *format, ...) { GError *new; va_list args; if (err == NULL) return; va_start (args, format); new = g_error_new_valist (domain, code, format, args); va_end (args); if (*err == NULL) *err = new; else g_warning (ERROR_OVERWRITTEN_WARNING, new->message); } /** * g_set_error_literal: * @err: (allow-none): a return location for a #GError, or %NULL * @domain: error domain * @code: error code * @message: error message * * Does nothing if @err is %NULL; if @err is non-%NULL, then *@err * must be %NULL. A new #GError is created and assigned to *@err. * Unlike g_set_error(), @message is not a printf()-style format string. * Use this function if @message contains text you don't have control over, * that could include printf() escape sequences. * * Since: 2.18 */ void g_set_error_literal (GError **err, GQuark domain, gint code, const gchar *message) { GError *new; if (err == NULL) return; new = g_error_new_literal (domain, code, message); if (*err == NULL) *err = new; else g_warning (ERROR_OVERWRITTEN_WARNING, new->message); } /** * g_propagate_error: * @dest: error return location * @src: error to move into the return location * * If @dest is %NULL, free @src; otherwise, moves @src into *@dest. * The error variable @dest points to must be %NULL. */ void g_propagate_error (GError **dest, GError *src) { g_return_if_fail (src != NULL); if (dest == NULL) { if (src) g_error_free (src); return; } else { if (*dest != NULL) g_warning (ERROR_OVERWRITTEN_WARNING, src->message); else *dest = src; } } /** * g_clear_error: * @err: a #GError return location * * If @err is %NULL, does nothing. If @err is non-%NULL, * calls g_error_free() on *@err and sets *@err to %NULL. */ void g_clear_error (GError **err) { if (err && *err) { g_error_free (*err); *err = NULL; } } G_GNUC_PRINTF(2, 0) static void g_error_add_prefix (gchar **string, const gchar *format, va_list ap) { gchar *oldstring; gchar *prefix; prefix = g_strdup_vprintf (format, ap); oldstring = *string; *string = g_strconcat (prefix, oldstring, NULL); g_free (oldstring); g_free (prefix); } /** * g_prefix_error: * @err: (allow-none): a return location for a #GError, or %NULL * @format: printf()-style format string * @...: arguments to @format * * Formats a string according to @format and * prefix it to an existing error message. If * @err is %NULL (ie: no error variable) then do * nothing. * * If *@err is %NULL (ie: an error variable is * present but there is no error condition) then * also do nothing. Whether or not it makes * sense to take advantage of this feature is up * to you. * * Since: 2.16 */ void g_prefix_error (GError **err, const gchar *format, ...) { if (err && *err) { va_list ap; va_start (ap, format); g_error_add_prefix (&(*err)->message, format, ap); va_end (ap); } } /** * g_propagate_prefixed_error: * @dest: error return location * @src: error to move into the return location * @format: printf()-style format string * @...: arguments to @format * * If @dest is %NULL, free @src; otherwise, * moves @src into *@dest. *@dest must be %NULL. * After the move, add a prefix as with * g_prefix_error(). * * Since: 2.16 **/ void g_propagate_prefixed_error (GError **dest, GError *src, const gchar *format, ...) { g_propagate_error (dest, src); if (dest && *dest) { va_list ap; va_start (ap, format); g_error_add_prefix (&(*dest)->message, format, ap); va_end (ap); } } pkg-config-0.29.1/glib/glib/gslist.h0000664000175000017500000001303312651243552014067 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the GLib Team and others 1997-2000. See the AUTHORS * file for a list of people on the GLib Team. See the ChangeLog * files for a list of changes. These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/. */ #ifndef __G_SLIST_H__ #define __G_SLIST_H__ #if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) #error "Only can be included directly." #endif #include #include G_BEGIN_DECLS typedef struct _GSList GSList; struct _GSList { gpointer data; GSList *next; }; /* 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); #define g_slist_next(slist) ((slist) ? (((GSList *)(slist))->next) : NULL) G_END_DECLS #endif /* __G_SLIST_H__ */ pkg-config-0.29.1/glib/glib/gvariant-parser.c0000664000175000017500000017445712651243552015704 00000000000000/* * Copyright © 2009, 2010 Codethink Limited * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the licence, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * * Author: Ryan Lortie */ #include "config.h" #include #include #include #include "gerror.h" #include "gquark.h" #include "gstring.h" #include "gstrfuncs.h" #include "gtestutils.h" #include "gvariant.h" #include "gvarianttype.h" #include "gslice.h" #include "gthread.h" /* * two-pass algorithm * designed by ryan lortie and william hua * designed in itb-229 and at ghazi's, 2009. */ /** * G_VARIANT_PARSE_ERROR: * * Error domain for GVariant text format parsing. Specific error codes * are not currently defined for this domain. See #GError for * information on error domains. **/ /** * GVariantParseError: * @G_VARIANT_PARSE_ERROR_FAILED: generic error (unused) * @G_VARIANT_PARSE_ERROR_BASIC_TYPE_EXPECTED: a non-basic #GVariantType was given where a basic type was expected * @G_VARIANT_PARSE_ERROR_CANNOT_INFER_TYPE: cannot infer the #GVariantType * @G_VARIANT_PARSE_ERROR_DEFINITE_TYPE_EXPECTED: an indefinite #GVariantType was given where a definite type was expected * @G_VARIANT_PARSE_ERROR_INPUT_NOT_AT_END: extra data after parsing finished * @G_VARIANT_PARSE_ERROR_INVALID_CHARACTER: invalid character in number or unicode escape * @G_VARIANT_PARSE_ERROR_INVALID_FORMAT_STRING: not a valid #GVariant format string * @G_VARIANT_PARSE_ERROR_INVALID_OBJECT_PATH: not a valid object path * @G_VARIANT_PARSE_ERROR_INVALID_SIGNATURE: not a valid type signature * @G_VARIANT_PARSE_ERROR_INVALID_TYPE_STRING: not a valid #GVariant type string * @G_VARIANT_PARSE_ERROR_NO_COMMON_TYPE: could not find a common type for array entries * @G_VARIANT_PARSE_ERROR_NUMBER_OUT_OF_RANGE: the numerical value is out of range of the given type * @G_VARIANT_PARSE_ERROR_NUMBER_TOO_BIG: the numerical value is out of range for any type * @G_VARIANT_PARSE_ERROR_TYPE_ERROR: cannot parse as variant of the specified type * @G_VARIANT_PARSE_ERROR_UNEXPECTED_TOKEN: an unexpected token was encountered * @G_VARIANT_PARSE_ERROR_UNKNOWN_KEYWORD: an unknown keyword was encountered * @G_VARIANT_PARSE_ERROR_UNTERMINATED_STRING_CONSTANT: unterminated string constant * @G_VARIANT_PARSE_ERROR_VALUE_EXPECTED: no value given * * Error codes returned by parsing text-format GVariants. **/ 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, SourceRef *other, gint code, const gchar *format, va_list ap) { GString *msg = g_string_new (NULL); if (location->start == location->end) g_string_append_printf (msg, "%d", location->start); else g_string_append_printf (msg, "%d-%d", location->start, location->end); if (other != NULL) { g_assert (other->start != other->end); g_string_append_printf (msg, ",%d-%d", other->start, other->end); } g_string_append_c (msg, ':'); g_string_append_vprintf (msg, format, ap); g_set_error_literal (error, G_VARIANT_PARSE_ERROR, code, msg->str); g_string_free (msg, TRUE); } G_GNUC_PRINTF(5, 6) static void parser_set_error (GError **error, SourceRef *location, SourceRef *other, gint code, const gchar *format, ...) { va_list ap; va_start (ap, format); parser_set_error_va (error, location, other, code, format, ap); va_end (ap); } typedef struct { const gchar *start; const gchar *stream; const gchar *end; const gchar *this; } TokenStream; G_GNUC_PRINTF(5, 6) static void token_stream_set_error (TokenStream *stream, GError **error, gboolean this_token, gint code, const gchar *format, ...) { SourceRef ref; va_list ap; ref.start = stream->this - stream->start; if (this_token) ref.end = stream->stream - stream->start; else ref.end = ref.start; va_start (ap, format); parser_set_error_va (error, &ref, NULL, code, format, ap); va_end (ap); } static gboolean token_stream_prepare (TokenStream *stream) { gint brackets = 0; const gchar *end; if (stream->this != NULL) return TRUE; while (stream->stream != stream->end && g_ascii_isspace (*stream->stream)) stream->stream++; if (stream->stream == stream->end || *stream->stream == '\0') { stream->this = stream->stream; return FALSE; } switch (stream->stream[0]) { case '-': case '+': case '.': case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': for (end = stream->stream; end != stream->end; end++) if (!g_ascii_isalnum (*end) && *end != '-' && *end != '+' && *end != '.') break; break; case 'b': if (stream->stream[1] == '\'' || stream->stream[1] == '"') { for (end = stream->stream + 2; end != stream->end; end++) if (*end == stream->stream[1] || *end == '\0' || (*end == '\\' && (++end == stream->end || *end == '\0'))) break; if (end != stream->end && *end) end++; break; } else /* ↓↓↓ */; case 'a': /* 'b' */ case 'c': case 'd': case 'e': case 'f': case 'g': case 'h': case 'i': case 'j': case 'k': case 'l': case 'm': case 'n': case 'o': case 'p': case 'q': case 'r': case 's': case 't': case 'u': case 'v': case 'w': case 'x': case 'y': case 'z': for (end = stream->stream; end != stream->end; end++) if (!g_ascii_isalnum (*end)) break; break; case '\'': case '"': for (end = stream->stream + 1; end != stream->end; end++) if (*end == stream->stream[0] || *end == '\0' || (*end == '\\' && (++end == stream->end || *end == '\0'))) break; if (end != stream->end && *end) end++; break; 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 != '>' && *end != ']' && !g_ascii_isspace (*end); end++) if (*end == '(' || *end == '{') brackets++; else if ((*end == ')' || *end == '}') && !brackets--) break; break; default: end = stream->stream + 1; break; } stream->this = stream->stream; stream->stream = end; return TRUE; } static void token_stream_next (TokenStream *stream) { stream->this = NULL; } static gboolean token_stream_peek (TokenStream *stream, gchar first_char) { if (!token_stream_prepare (stream)) return FALSE; return stream->this[0] == first_char; } static gboolean token_stream_peek2 (TokenStream *stream, gchar first_char, gchar second_char) { if (!token_stream_prepare (stream)) return FALSE; return stream->this[0] == first_char && stream->this[1] == second_char; } static gboolean token_stream_is_keyword (TokenStream *stream) { if (!token_stream_prepare (stream)) return FALSE; return g_ascii_isalpha (stream->this[0]) && g_ascii_isalpha (stream->this[1]); } static gboolean token_stream_is_numeric (TokenStream *stream) { if (!token_stream_prepare (stream)) return FALSE; return (g_ascii_isdigit (stream->this[0]) || stream->this[0] == '-' || stream->this[0] == '+' || stream->this[0] == '.'); } static gboolean token_stream_peek_string (TokenStream *stream, const gchar *token) { gint length = strlen (token); return token_stream_prepare (stream) && stream->stream - stream->this == length && memcmp (stream->this, token, length) == 0; } static gboolean token_stream_consume (TokenStream *stream, const gchar *token) { if (!token_stream_peek_string (stream, token)) return FALSE; token_stream_next (stream); return TRUE; } static gboolean token_stream_require (TokenStream *stream, const gchar *token, const gchar *purpose, GError **error) { if (!token_stream_consume (stream, token)) { token_stream_set_error (stream, error, FALSE, G_VARIANT_PARSE_ERROR_UNEXPECTED_TOKEN, "expected '%s'%s", token, purpose); return FALSE; } return TRUE; } static void token_stream_assert (TokenStream *stream, const gchar *token) { gboolean correct_token; correct_token = token_stream_consume (stream, token); g_assert (correct_token); } static gchar * token_stream_get (TokenStream *stream) { gchar *result; if (!token_stream_prepare (stream)) return NULL; result = g_strndup (stream->this, stream->stream - stream->this); return result; } static void token_stream_start_ref (TokenStream *stream, SourceRef *ref) { token_stream_prepare (stream); ref->start = stream->this - stream->start; } static void token_stream_end_ref (TokenStream *stream, SourceRef *ref) { ref->end = stream->stream - stream->start; } static void pattern_copy (gchar **out, const gchar **in) { gint brackets = 0; while (**in == 'a' || **in == 'm' || **in == 'M') *(*out)++ = *(*in)++; do { if (**in == '(' || **in == '{') brackets++; else if (**in == ')' || **in == '}') brackets--; *(*out)++ = *(*in)++; } while (brackets); } static gchar * pattern_coalesce (const gchar *left, const gchar *right) { gchar *result; gchar *out; /* the length of the output is loosely bound by the sum of the input * lengths, not simply the greater of the two lengths. * * (*(iii)) + ((iii)*) ((iii)(iii)) * * 8 + 8 = 12 */ out = result = g_malloc (strlen (left) + strlen (right)); while (*left && *right) { if (*left == *right) { *out++ = *left++; right++; } else { const gchar **one = &left, **the_other = &right; again: if (**one == '*' && **the_other != ')') { pattern_copy (&out, the_other); (*one)++; } else if (**one == 'M' && **the_other == 'm') { *out++ = *(*the_other)++; } else if (**one == 'M' && **the_other != 'm') { (*one)++; } else if (**one == 'N' && strchr ("ynqiuxthd", **the_other)) { *out++ = *(*the_other)++; (*one)++; } else if (**one == 'S' && strchr ("sog", **the_other)) { *out++ = *(*the_other)++; (*one)++; } else if (one == &left) { one = &right, the_other = &left; goto again; } else break; } } if (*left || *right) { g_free (result); result = NULL; } else *out++ = '\0'; return result; } typedef struct _AST AST; typedef gchar * (*get_pattern_func) (AST *ast, GError **error); typedef GVariant * (*get_value_func) (AST *ast, const GVariantType *type, GError **error); typedef GVariant * (*get_base_value_func) (AST *ast, const GVariantType *type, GError **error); typedef void (*free_func) (AST *ast); typedef struct { gchar * (* get_pattern) (AST *ast, GError **error); GVariant * (* get_value) (AST *ast, const GVariantType *type, GError **error); GVariant * (* get_base_value) (AST *ast, const GVariantType *type, GError **error); void (* free) (AST *ast); } ASTClass; struct _AST { const ASTClass *class; SourceRef source_ref; }; static gchar * ast_get_pattern (AST *ast, GError **error) { return ast->class->get_pattern (ast, error); } static GVariant * ast_get_value (AST *ast, const GVariantType *type, GError **error) { return ast->class->get_value (ast, type, error); } static void ast_free (AST *ast) { ast->class->free (ast); } G_GNUC_PRINTF(5, 6) static void ast_set_error (AST *ast, GError **error, AST *other_ast, gint code, const gchar *format, ...) { va_list ap; va_start (ap, format); parser_set_error_va (error, &ast->source_ref, other_ast ? & other_ast->source_ref : NULL, code, format, ap); va_end (ap); } static GVariant * ast_type_error (AST *ast, const GVariantType *type, GError **error) { gchar *typestr; 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'", typestr); g_free (typestr); return NULL; } static GVariant * ast_resolve (AST *ast, GError **error) { GVariant *value; gchar *pattern; gint i, j = 0; pattern = ast_get_pattern (ast, error); if (pattern == NULL) return NULL; /* choose reasonable defaults * * 1) favour non-maybe values where possible * 2) default type for strings is 's' * 3) default type for integers is 'i' */ for (i = 0; pattern[i]; i++) switch (pattern[i]) { case '*': ast_set_error (ast, error, NULL, G_VARIANT_PARSE_ERROR_CANNOT_INFER_TYPE, "unable to infer type"); g_free (pattern); return NULL; case 'M': break; case 'S': pattern[j++] = 's'; break; case 'N': pattern[j++] = 'i'; break; default: pattern[j++] = pattern[i]; break; } pattern[j++] = '\0'; value = ast_get_value (ast, G_VARIANT_TYPE (pattern), error); g_free (pattern); return value; } static AST *parse (TokenStream *stream, va_list *app, GError **error); static void ast_array_append (AST ***array, gint *n_items, AST *ast) { if ((*n_items & (*n_items - 1)) == 0) *array = g_renew (AST *, *array, *n_items ? 2 ** n_items : 1); (*array)[(*n_items)++] = ast; } static void ast_array_free (AST **array, gint n_items) { gint i; for (i = 0; i < n_items; i++) ast_free (array[i]); g_free (array); } static gchar * ast_array_get_pattern (AST **array, gint n_items, GError **error) { gchar *pattern; gint i; pattern = ast_get_pattern (array[0], error); if (pattern == NULL) return NULL; for (i = 1; i < n_items; i++) { gchar *tmp, *merged; tmp = ast_get_pattern (array[i], error); if (tmp == NULL) { g_free (pattern); return NULL; } merged = pattern_coalesce (pattern, tmp); g_free (pattern); pattern = merged; if (merged == NULL) /* set coalescence implies pairwise coalescence (i think). * we should therefore be able to trace the failure to a single * pair of values. */ { int j = 0; while (TRUE) { gchar *tmp2; gchar *m; /* if 'j' reaches 'i' then we failed to find the pair */ g_assert (j < i); tmp2 = ast_get_pattern (array[j], NULL); g_assert (tmp2 != NULL); m = pattern_coalesce (tmp, tmp2); g_free (tmp2); g_free (m); if (m == NULL) { /* we found a conflict between 'i' and 'j'. * * report the error. note: 'j' is first. */ ast_set_error (array[j], error, array[i], G_VARIANT_PARSE_ERROR_NO_COMMON_TYPE, "unable to find a common type"); g_free (tmp); return NULL; } j++; } } g_free (tmp); } return pattern; } typedef struct { AST ast; AST *child; } Maybe; static gchar * maybe_get_pattern (AST *ast, GError **error) { Maybe *maybe = (Maybe *) ast; if (maybe->child != NULL) { gchar *child_pattern; gchar *pattern; child_pattern = ast_get_pattern (maybe->child, error); if (child_pattern == NULL) return NULL; pattern = g_strdup_printf ("m%s", child_pattern); g_free (child_pattern); return pattern; } return g_strdup ("m*"); } static GVariant * maybe_get_value (AST *ast, const GVariantType *type, GError **error) { Maybe *maybe = (Maybe *) ast; GVariant *value; if (!g_variant_type_is_maybe (type)) return ast_type_error (ast, type, error); type = g_variant_type_element (type); if (maybe->child) { value = ast_get_value (maybe->child, type, error); if (value == NULL) return NULL; } else value = NULL; return g_variant_new_maybe (type, value); } static void maybe_free (AST *ast) { Maybe *maybe = (Maybe *) ast; if (maybe->child != NULL) ast_free (maybe->child); g_slice_free (Maybe, maybe); } static AST * maybe_parse (TokenStream *stream, va_list *app, GError **error) { static const ASTClass maybe_class = { maybe_get_pattern, maybe_get_value, NULL, maybe_free }; AST *child = NULL; Maybe *maybe; if (token_stream_consume (stream, "just")) { child = parse (stream, app, error); if (child == NULL) return NULL; } else if (!token_stream_consume (stream, "nothing")) { token_stream_set_error (stream, error, TRUE, G_VARIANT_PARSE_ERROR_UNKNOWN_KEYWORD, "unknown keyword"); return NULL; } maybe = g_slice_new (Maybe); maybe->ast.class = &maybe_class; maybe->child = child; return (AST *) maybe; } static GVariant * maybe_wrapper (AST *ast, const GVariantType *type, GError **error) { const GVariantType *t; GVariant *value; int depth; for (depth = 0, t = type; g_variant_type_is_maybe (t); depth++, t = g_variant_type_element (t)); value = ast->class->get_base_value (ast, t, error); if (value == NULL) return NULL; while (depth--) value = g_variant_new_maybe (NULL, value); return value; } typedef struct { AST ast; AST **children; gint n_children; } Array; static gchar * array_get_pattern (AST *ast, GError **error) { Array *array = (Array *) ast; gchar *pattern; gchar *result; if (array->n_children == 0) return g_strdup ("Ma*"); pattern = ast_array_get_pattern (array->children, array->n_children, error); if (pattern == NULL) return NULL; result = g_strdup_printf ("Ma%s", pattern); g_free (pattern); return result; } static GVariant * array_get_value (AST *ast, const GVariantType *type, GError **error) { Array *array = (Array *) ast; const GVariantType *childtype; GVariantBuilder builder; gint i; if (!g_variant_type_is_array (type)) return ast_type_error (ast, type, error); g_variant_builder_init (&builder, type); childtype = g_variant_type_element (type); for (i = 0; i < array->n_children; i++) { GVariant *child; if (!(child = ast_get_value (array->children[i], childtype, error))) { g_variant_builder_clear (&builder); return NULL; } g_variant_builder_add_value (&builder, child); } return g_variant_builder_end (&builder); } static void array_free (AST *ast) { Array *array = (Array *) ast; ast_array_free (array->children, array->n_children); g_slice_free (Array, array); } static AST * array_parse (TokenStream *stream, va_list *app, GError **error) { static const ASTClass array_class = { array_get_pattern, maybe_wrapper, array_get_value, array_free }; gboolean need_comma = FALSE; Array *array; array = g_slice_new (Array); array->ast.class = &array_class; array->children = NULL; array->n_children = 0; token_stream_assert (stream, "["); while (!token_stream_consume (stream, "]")) { AST *child; if (need_comma && !token_stream_require (stream, ",", " or ']' to follow array element", error)) goto error; child = parse (stream, app, error); if (!child) goto error; ast_array_append (&array->children, &array->n_children, child); need_comma = TRUE; } return (AST *) array; error: ast_array_free (array->children, array->n_children); g_slice_free (Array, array); return NULL; } typedef struct { AST ast; AST **children; gint n_children; } Tuple; static gchar * tuple_get_pattern (AST *ast, GError **error) { Tuple *tuple = (Tuple *) ast; gchar *result = NULL; gchar **parts; gint i; parts = g_new (gchar *, tuple->n_children + 4); parts[tuple->n_children + 1] = (gchar *) ")"; parts[tuple->n_children + 2] = NULL; parts[0] = (gchar *) "M("; for (i = 0; i < tuple->n_children; i++) if (!(parts[i + 1] = ast_get_pattern (tuple->children[i], error))) break; if (i == tuple->n_children) result = g_strjoinv ("", parts); /* parts[0] should not be freed */ while (i) g_free (parts[i--]); g_free (parts); return result; } static GVariant * tuple_get_value (AST *ast, const GVariantType *type, GError **error) { Tuple *tuple = (Tuple *) ast; const GVariantType *childtype; GVariantBuilder builder; gint i; if (!g_variant_type_is_tuple (type)) return ast_type_error (ast, type, error); g_variant_builder_init (&builder, type); childtype = g_variant_type_first (type); for (i = 0; i < tuple->n_children; i++) { GVariant *child; if (childtype == NULL) { g_variant_builder_clear (&builder); return ast_type_error (ast, type, error); } if (!(child = ast_get_value (tuple->children[i], childtype, error))) { g_variant_builder_clear (&builder); return FALSE; } g_variant_builder_add_value (&builder, child); childtype = g_variant_type_next (childtype); } if (childtype != NULL) { g_variant_builder_clear (&builder); return ast_type_error (ast, type, error); } return g_variant_builder_end (&builder); } static void tuple_free (AST *ast) { Tuple *tuple = (Tuple *) ast; ast_array_free (tuple->children, tuple->n_children); g_slice_free (Tuple, tuple); } static AST * tuple_parse (TokenStream *stream, va_list *app, GError **error) { static const ASTClass tuple_class = { tuple_get_pattern, maybe_wrapper, tuple_get_value, tuple_free }; gboolean need_comma = FALSE; gboolean first = TRUE; Tuple *tuple; tuple = g_slice_new (Tuple); tuple->ast.class = &tuple_class; tuple->children = NULL; tuple->n_children = 0; token_stream_assert (stream, "("); while (!token_stream_consume (stream, ")")) { AST *child; if (need_comma && !token_stream_require (stream, ",", " or ')' to follow tuple element", error)) goto error; child = parse (stream, app, error); if (!child) goto error; ast_array_append (&tuple->children, &tuple->n_children, child); /* the first time, we absolutely require a comma, so grab it here * and leave need_comma = FALSE so that the code above doesn't * require a second comma. * * the second and remaining times, we set need_comma = TRUE. */ if (first) { if (!token_stream_require (stream, ",", " after first tuple element", error)) goto error; first = FALSE; } else need_comma = TRUE; } return (AST *) tuple; error: ast_array_free (tuple->children, tuple->n_children); g_slice_free (Tuple, tuple); return NULL; } typedef struct { AST ast; AST *value; } Variant; static gchar * variant_get_pattern (AST *ast, GError **error) { return g_strdup ("Mv"); } static GVariant * variant_get_value (AST *ast, const GVariantType *type, GError **error) { Variant *variant = (Variant *) ast; GVariant *child; 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) return NULL; return g_variant_new_variant (child); } static void variant_free (AST *ast) { Variant *variant = (Variant *) ast; ast_free (variant->value); g_slice_free (Variant, variant); } static AST * variant_parse (TokenStream *stream, va_list *app, GError **error) { static const ASTClass variant_class = { variant_get_pattern, maybe_wrapper, variant_get_value, variant_free }; Variant *variant; AST *value; token_stream_assert (stream, "<"); value = parse (stream, app, error); if (!value) return NULL; if (!token_stream_require (stream, ">", " to follow variant value", error)) { ast_free (value); return NULL; } variant = g_slice_new (Variant); variant->ast.class = &variant_class; variant->value = value; return (AST *) variant; } typedef struct { AST ast; AST **keys; AST **values; gint n_children; } Dictionary; static gchar * dictionary_get_pattern (AST *ast, GError **error) { Dictionary *dict = (Dictionary *) ast; gchar *value_pattern; gchar *key_pattern; gchar key_char; gchar *result; if (dict->n_children == 0) return g_strdup ("Ma{**}"); key_pattern = ast_array_get_pattern (dict->keys, abs (dict->n_children), error); if (key_pattern == NULL) return NULL; /* we can not have maybe keys */ if (key_pattern[0] == 'M') key_char = key_pattern[1]; else key_char = key_pattern[0]; g_free (key_pattern); /* the basic types, * plus undetermined number type and undetermined string type. */ if (!strchr ("bynqiuxthdsogNS", key_char)) { ast_set_error (ast, error, NULL, G_VARIANT_PARSE_ERROR_BASIC_TYPE_EXPECTED, "dictionary keys must have basic types"); return NULL; } value_pattern = ast_get_pattern (dict->values[0], error); if (value_pattern == NULL) return NULL; result = g_strdup_printf ("M%s{%c%s}", dict->n_children > 0 ? "a" : "", key_char, value_pattern); g_free (value_pattern); return result; } static GVariant * dictionary_get_value (AST *ast, const GVariantType *type, GError **error) { Dictionary *dict = (Dictionary *) ast; if (dict->n_children == -1) { const GVariantType *subtype; GVariantBuilder builder; GVariant *subvalue; if (!g_variant_type_is_dict_entry (type)) return ast_type_error (ast, type, error); g_variant_builder_init (&builder, type); subtype = g_variant_type_key (type); if (!(subvalue = ast_get_value (dict->keys[0], subtype, error))) { g_variant_builder_clear (&builder); return NULL; } g_variant_builder_add_value (&builder, subvalue); subtype = g_variant_type_value (type); if (!(subvalue = ast_get_value (dict->values[0], subtype, error))) { g_variant_builder_clear (&builder); return NULL; } g_variant_builder_add_value (&builder, subvalue); return g_variant_builder_end (&builder); } else { const GVariantType *entry, *key, *val; GVariantBuilder builder; gint i; if (!g_variant_type_is_subtype_of (type, G_VARIANT_TYPE_DICTIONARY)) return ast_type_error (ast, type, error); entry = g_variant_type_element (type); key = g_variant_type_key (entry); val = g_variant_type_value (entry); g_variant_builder_init (&builder, type); for (i = 0; i < dict->n_children; i++) { GVariant *subvalue; g_variant_builder_open (&builder, entry); if (!(subvalue = ast_get_value (dict->keys[i], key, error))) { g_variant_builder_clear (&builder); return NULL; } g_variant_builder_add_value (&builder, subvalue); if (!(subvalue = ast_get_value (dict->values[i], val, error))) { g_variant_builder_clear (&builder); return NULL; } g_variant_builder_add_value (&builder, subvalue); g_variant_builder_close (&builder); } return g_variant_builder_end (&builder); } } static void dictionary_free (AST *ast) { Dictionary *dict = (Dictionary *) ast; gint n_children; if (dict->n_children > -1) n_children = dict->n_children; else n_children = 1; ast_array_free (dict->keys, n_children); ast_array_free (dict->values, n_children); g_slice_free (Dictionary, dict); } static AST * dictionary_parse (TokenStream *stream, va_list *app, GError **error) { static const ASTClass dictionary_class = { dictionary_get_pattern, maybe_wrapper, dictionary_get_value, dictionary_free }; gint n_keys, n_values; gboolean only_one; Dictionary *dict; AST *first; dict = g_slice_new (Dictionary); dict->ast.class = &dictionary_class; dict->keys = NULL; dict->values = NULL; n_keys = n_values = 0; token_stream_assert (stream, "{"); if (token_stream_consume (stream, "}")) { dict->n_children = 0; return (AST *) dict; } if ((first = parse (stream, app, error)) == NULL) goto error; ast_array_append (&dict->keys, &n_keys, first); only_one = token_stream_consume (stream, ","); if (!only_one && !token_stream_require (stream, ":", " or ',' to follow dictionary entry key", error)) goto error; if ((first = parse (stream, app, error)) == NULL) goto error; ast_array_append (&dict->values, &n_values, first); if (only_one) { if (!token_stream_require (stream, "}", " at end of dictionary entry", error)) goto error; g_assert (n_keys == 1 && n_values == 1); dict->n_children = -1; return (AST *) dict; } while (!token_stream_consume (stream, "}")) { AST *child; if (!token_stream_require (stream, ",", " or '}' to follow dictionary entry", error)) goto error; child = parse (stream, app, error); if (!child) goto error; ast_array_append (&dict->keys, &n_keys, child); if (!token_stream_require (stream, ":", " to follow dictionary entry key", error)) goto error; child = parse (stream, app, error); if (!child) goto error; ast_array_append (&dict->values, &n_values, child); } g_assert (n_keys == n_values); dict->n_children = n_keys; return (AST *) dict; error: ast_array_free (dict->keys, n_keys); ast_array_free (dict->values, n_values); g_slice_free (Dictionary, dict); return NULL; } typedef struct { AST ast; gchar *string; } String; static gchar * string_get_pattern (AST *ast, GError **error) { return g_strdup ("MS"); } static GVariant * string_get_value (AST *ast, const GVariantType *type, GError **error) { String *string = (String *) ast; if (g_variant_type_equal (type, G_VARIANT_TYPE_STRING)) return g_variant_new_string (string->string); else if (g_variant_type_equal (type, G_VARIANT_TYPE_OBJECT_PATH)) { if (!g_variant_is_object_path (string->string)) { ast_set_error (ast, error, NULL, G_VARIANT_PARSE_ERROR_INVALID_OBJECT_PATH, "not a valid object path"); return NULL; } return g_variant_new_object_path (string->string); } else if (g_variant_type_equal (type, G_VARIANT_TYPE_SIGNATURE)) { if (!g_variant_is_signature (string->string)) { ast_set_error (ast, error, NULL, G_VARIANT_PARSE_ERROR_INVALID_SIGNATURE, "not a valid signature"); return NULL; } return g_variant_new_signature (string->string); } else return ast_type_error (ast, type, error); } static void string_free (AST *ast) { String *string = (String *) ast; g_free (string->string); g_slice_free (String, string); } static gboolean unicode_unescape (const gchar *src, gint *src_ofs, gchar *dest, gint *dest_ofs, gint length, SourceRef *ref, GError **error) { gchar buffer[9]; guint64 value; gchar *end; (*src_ofs)++; g_assert (length < sizeof (buffer)); strncpy (buffer, src + *src_ofs, length); buffer[length] = '\0'; value = g_ascii_strtoull (buffer, &end, 0x10); if (value == 0 || end != buffer + length) { parser_set_error (error, ref, NULL, G_VARIANT_PARSE_ERROR_INVALID_CHARACTER, "invalid %d-character unicode escape", length); return FALSE; } g_assert (value <= G_MAXUINT32); *dest_ofs += g_unichar_to_utf8 (value, dest + *dest_ofs); *src_ofs += length; return TRUE; } static AST * string_parse (TokenStream *stream, va_list *app, GError **error) { static const ASTClass string_class = { string_get_pattern, maybe_wrapper, string_get_value, string_free }; String *string; SourceRef ref; gchar *token; gsize length; gchar quote; gchar *str; gint i, j; token_stream_start_ref (stream, &ref); token = token_stream_get (stream); token_stream_end_ref (stream, &ref); length = strlen (token); quote = token[0]; str = g_malloc (length); g_assert (quote == '"' || quote == '\''); j = 0; i = 1; while (token[i] != quote) switch (token[i]) { case '\0': parser_set_error (error, &ref, NULL, G_VARIANT_PARSE_ERROR_UNTERMINATED_STRING_CONSTANT, "unterminated string constant"); g_free (token); g_free (str); return NULL; case '\\': switch (token[++i]) { case '\0': parser_set_error (error, &ref, NULL, G_VARIANT_PARSE_ERROR_UNTERMINATED_STRING_CONSTANT, "unterminated string constant"); g_free (token); g_free (str); return NULL; case 'u': if (!unicode_unescape (token, &i, str, &j, 4, &ref, error)) { g_free (token); g_free (str); return NULL; } continue; case 'U': if (!unicode_unescape (token, &i, str, &j, 8, &ref, error)) { g_free (token); g_free (str); return NULL; } continue; case 'a': str[j++] = '\a'; i++; continue; case 'b': str[j++] = '\b'; i++; continue; case 'f': str[j++] = '\f'; i++; continue; case 'n': str[j++] = '\n'; i++; continue; case 'r': str[j++] = '\r'; i++; continue; case 't': str[j++] = '\t'; i++; continue; case 'v': str[j++] = '\v'; i++; continue; case '\n': i++; continue; } default: str[j++] = token[i++]; } str[j++] = '\0'; g_free (token); string = g_slice_new (String); string->ast.class = &string_class; string->string = str; token_stream_next (stream); return (AST *) string; } typedef struct { AST ast; gchar *string; } ByteString; static gchar * bytestring_get_pattern (AST *ast, GError **error) { return g_strdup ("May"); } static GVariant * bytestring_get_value (AST *ast, const GVariantType *type, GError **error) { ByteString *string = (ByteString *) ast; if (!g_variant_type_equal (type, G_VARIANT_TYPE_BYTESTRING)) return ast_type_error (ast, type, error); return g_variant_new_bytestring (string->string); } static void bytestring_free (AST *ast) { ByteString *string = (ByteString *) ast; g_free (string->string); g_slice_free (ByteString, string); } static AST * bytestring_parse (TokenStream *stream, va_list *app, GError **error) { static const ASTClass bytestring_class = { bytestring_get_pattern, maybe_wrapper, bytestring_get_value, bytestring_free }; ByteString *string; SourceRef ref; gchar *token; gsize length; gchar quote; gchar *str; gint i, j; token_stream_start_ref (stream, &ref); token = token_stream_get (stream); token_stream_end_ref (stream, &ref); g_assert (token[0] == 'b'); length = strlen (token); quote = token[1]; str = g_malloc (length); g_assert (quote == '"' || quote == '\''); j = 0; i = 2; while (token[i] != quote) switch (token[i]) { case '\0': parser_set_error (error, &ref, NULL, G_VARIANT_PARSE_ERROR_UNTERMINATED_STRING_CONSTANT, "unterminated string constant"); g_free (token); return NULL; case '\\': switch (token[++i]) { case '\0': parser_set_error (error, &ref, NULL, G_VARIANT_PARSE_ERROR_UNTERMINATED_STRING_CONSTANT, "unterminated string constant"); g_free (token); return NULL; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': { /* up to 3 characters */ guchar val = token[i++] - '0'; if ('0' <= token[i] && token[i] < '8') val = (val << 3) | (token[i++] - '0'); if ('0' <= token[i] && token[i] < '8') val = (val << 3) | (token[i++] - '0'); str[j++] = val; } continue; case 'a': str[j++] = '\a'; i++; continue; case 'b': str[j++] = '\b'; i++; continue; case 'f': str[j++] = '\f'; i++; continue; case 'n': str[j++] = '\n'; i++; continue; case 'r': str[j++] = '\r'; i++; continue; case 't': str[j++] = '\t'; i++; continue; case 'v': str[j++] = '\v'; i++; continue; case '\n': i++; continue; } default: str[j++] = token[i++]; } str[j++] = '\0'; g_free (token); string = g_slice_new (ByteString); string->ast.class = &bytestring_class; string->string = str; token_stream_next (stream); return (AST *) string; } typedef struct { AST ast; gchar *token; } Number; static gchar * number_get_pattern (AST *ast, GError **error) { Number *number = (Number *) ast; if (strchr (number->token, '.') || (!g_str_has_prefix (number->token, "0x") && strchr (number->token, 'e')) || strstr (number->token, "inf") || strstr (number->token, "nan")) return g_strdup ("Md"); return g_strdup ("MN"); } static GVariant * number_overflow (AST *ast, const GVariantType *type, GError **error) { ast_set_error (ast, error, NULL, G_VARIANT_PARSE_ERROR_NUMBER_OUT_OF_RANGE, "number out of range for type '%c'", g_variant_type_peek_string (type)[0]); return NULL; } static GVariant * number_get_value (AST *ast, const GVariantType *type, GError **error) { Number *number = (Number *) ast; const gchar *token; gboolean negative; gboolean floating; guint64 abs_val; gdouble dbl_val; gchar *end; token = number->token; if (g_variant_type_equal (type, G_VARIANT_TYPE_DOUBLE)) { floating = TRUE; errno = 0; dbl_val = g_ascii_strtod (token, &end); if (dbl_val != 0.0 && errno == ERANGE) { ast_set_error (ast, error, NULL, G_VARIANT_PARSE_ERROR_NUMBER_TOO_BIG, "number too big for any type"); return NULL; } /* silence uninitialised warnings... */ negative = FALSE; abs_val = 0; } else { floating = FALSE; negative = token[0] == '-'; if (token[0] == '-') token++; errno = 0; abs_val = g_ascii_strtoull (token, &end, 0); if (abs_val == G_MAXUINT64 && errno == ERANGE) { ast_set_error (ast, error, NULL, G_VARIANT_PARSE_ERROR_NUMBER_TOO_BIG, "integer too big for any type"); return NULL; } if (abs_val == 0) negative = FALSE; /* silence uninitialised warning... */ dbl_val = 0.0; } if (*end != '\0') { SourceRef ref; ref = ast->source_ref; ref.start += end - number->token; ref.end = ref.start + 1; parser_set_error (error, &ref, NULL, G_VARIANT_PARSE_ERROR_INVALID_CHARACTER, "invalid character in number"); return NULL; } if (floating) return g_variant_new_double (dbl_val); switch (*g_variant_type_peek_string (type)) { case 'y': if (negative || abs_val > G_MAXUINT8) return number_overflow (ast, type, error); return g_variant_new_byte (abs_val); case 'n': if (abs_val - negative > G_MAXINT16) return number_overflow (ast, type, error); return g_variant_new_int16 (negative ? -abs_val : abs_val); case 'q': if (negative || abs_val > G_MAXUINT16) return number_overflow (ast, type, error); return g_variant_new_uint16 (abs_val); case 'i': if (abs_val - negative > G_MAXINT32) return number_overflow (ast, type, error); return g_variant_new_int32 (negative ? -abs_val : abs_val); case 'u': if (negative || abs_val > G_MAXUINT32) return number_overflow (ast, type, error); return g_variant_new_uint32 (abs_val); case 'x': if (abs_val - negative > G_MAXINT64) return number_overflow (ast, type, error); return g_variant_new_int64 (negative ? -abs_val : abs_val); case 't': if (negative) return number_overflow (ast, type, error); return g_variant_new_uint64 (abs_val); case 'h': if (abs_val - negative > G_MAXINT32) return number_overflow (ast, type, error); return g_variant_new_handle (negative ? -abs_val : abs_val); default: return ast_type_error (ast, type, error); } } static void number_free (AST *ast) { Number *number = (Number *) ast; g_free (number->token); g_slice_free (Number, number); } static AST * number_parse (TokenStream *stream, va_list *app, GError **error) { static const ASTClass number_class = { number_get_pattern, maybe_wrapper, number_get_value, number_free }; Number *number; number = g_slice_new (Number); number->ast.class = &number_class; number->token = token_stream_get (stream); token_stream_next (stream); return (AST *) number; } typedef struct { AST ast; gboolean value; } Boolean; static gchar * boolean_get_pattern (AST *ast, GError **error) { return g_strdup ("Mb"); } static GVariant * boolean_get_value (AST *ast, const GVariantType *type, GError **error) { Boolean *boolean = (Boolean *) ast; if (!g_variant_type_equal (type, G_VARIANT_TYPE_BOOLEAN)) return ast_type_error (ast, type, error); return g_variant_new_boolean (boolean->value); } static void boolean_free (AST *ast) { Boolean *boolean = (Boolean *) ast; g_slice_free (Boolean, boolean); } static AST * boolean_new (gboolean value) { static const ASTClass boolean_class = { boolean_get_pattern, maybe_wrapper, boolean_get_value, boolean_free }; Boolean *boolean; boolean = g_slice_new (Boolean); boolean->ast.class = &boolean_class; boolean->value = value; return (AST *) boolean; } typedef struct { AST ast; GVariant *value; } Positional; static gchar * positional_get_pattern (AST *ast, GError **error) { Positional *positional = (Positional *) ast; return g_strdup (g_variant_get_type_string (positional->value)); } static GVariant * positional_get_value (AST *ast, const GVariantType *type, GError **error) { Positional *positional = (Positional *) ast; GVariant *value; g_assert (positional->value != NULL); if G_UNLIKELY (!g_variant_is_of_type (positional->value, type)) return ast_type_error (ast, type, error); /* NOTE: if _get is called more than once then * things get messed up with respect to floating refs. * * fortunately, this function should only ever get called once. */ g_assert (positional->value != NULL); value = positional->value; positional->value = NULL; return value; } static void positional_free (AST *ast) { Positional *positional = (Positional *) ast; /* if positional->value is set, just leave it. * memory management doesn't matter in case of programmer error. */ g_slice_free (Positional, positional); } static AST * positional_parse (TokenStream *stream, va_list *app, GError **error) { static const ASTClass positional_class = { positional_get_pattern, positional_get_value, NULL, positional_free }; Positional *positional; const gchar *endptr; gchar *token; token = token_stream_get (stream); g_assert (token[0] == '%'); positional = g_slice_new (Positional); positional->ast.class = &positional_class; positional->value = g_variant_new_va (token + 1, &endptr, app); if (*endptr || positional->value == NULL) { token_stream_set_error (stream, error, TRUE, G_VARIANT_PARSE_ERROR_INVALID_FORMAT_STRING, "invalid GVariant format string"); /* memory management doesn't matter in case of programmer error. */ return NULL; } token_stream_next (stream); g_free (token); return (AST *) positional; } typedef struct { AST ast; GVariantType *type; AST *child; } TypeDecl; static gchar * typedecl_get_pattern (AST *ast, GError **error) { TypeDecl *decl = (TypeDecl *) ast; return g_variant_type_dup_string (decl->type); } static GVariant * typedecl_get_value (AST *ast, const GVariantType *type, GError **error) { TypeDecl *decl = (TypeDecl *) ast; return ast_get_value (decl->child, type, error); } static void typedecl_free (AST *ast) { TypeDecl *decl = (TypeDecl *) ast; ast_free (decl->child); g_variant_type_free (decl->type); g_slice_free (TypeDecl, decl); } static AST * typedecl_parse (TokenStream *stream, va_list *app, GError **error) { static const ASTClass typedecl_class = { typedecl_get_pattern, typedecl_get_value, NULL, typedecl_free }; GVariantType *type; TypeDecl *decl; AST *child; if (token_stream_peek (stream, '@')) { gchar *token; token = token_stream_get (stream); if (!g_variant_type_string_is_valid (token + 1)) { token_stream_set_error (stream, error, TRUE, G_VARIANT_PARSE_ERROR_INVALID_TYPE_STRING, "invalid type declaration"); g_free (token); return NULL; } type = g_variant_type_new (token + 1); if (!g_variant_type_is_definite (type)) { token_stream_set_error (stream, error, TRUE, G_VARIANT_PARSE_ERROR_DEFINITE_TYPE_EXPECTED, "type declarations must be definite"); g_variant_type_free (type); g_free (token); return NULL; } token_stream_next (stream); g_free (token); } else { if (token_stream_consume (stream, "boolean")) type = g_variant_type_copy (G_VARIANT_TYPE_BOOLEAN); else if (token_stream_consume (stream, "byte")) type = g_variant_type_copy (G_VARIANT_TYPE_BYTE); else if (token_stream_consume (stream, "int16")) type = g_variant_type_copy (G_VARIANT_TYPE_INT16); else if (token_stream_consume (stream, "uint16")) type = g_variant_type_copy (G_VARIANT_TYPE_UINT16); else if (token_stream_consume (stream, "int32")) type = g_variant_type_copy (G_VARIANT_TYPE_INT32); else if (token_stream_consume (stream, "handle")) type = g_variant_type_copy (G_VARIANT_TYPE_HANDLE); else if (token_stream_consume (stream, "uint32")) type = g_variant_type_copy (G_VARIANT_TYPE_UINT32); else if (token_stream_consume (stream, "int64")) type = g_variant_type_copy (G_VARIANT_TYPE_INT64); else if (token_stream_consume (stream, "uint64")) type = g_variant_type_copy (G_VARIANT_TYPE_UINT64); else if (token_stream_consume (stream, "double")) type = g_variant_type_copy (G_VARIANT_TYPE_DOUBLE); else if (token_stream_consume (stream, "string")) type = g_variant_type_copy (G_VARIANT_TYPE_STRING); else if (token_stream_consume (stream, "objectpath")) type = g_variant_type_copy (G_VARIANT_TYPE_OBJECT_PATH); else if (token_stream_consume (stream, "signature")) type = g_variant_type_copy (G_VARIANT_TYPE_SIGNATURE); else { token_stream_set_error (stream, error, TRUE, G_VARIANT_PARSE_ERROR_UNKNOWN_KEYWORD, "unknown keyword"); return NULL; } } if ((child = parse (stream, app, error)) == NULL) { g_variant_type_free (type); return NULL; } decl = g_slice_new (TypeDecl); decl->ast.class = &typedecl_class; decl->type = type; decl->child = child; return (AST *) decl; } static AST * parse (TokenStream *stream, va_list *app, GError **error) { SourceRef source_ref; AST *result; token_stream_prepare (stream); token_stream_start_ref (stream, &source_ref); if (token_stream_peek (stream, '[')) result = array_parse (stream, app, error); else if (token_stream_peek (stream, '(')) result = tuple_parse (stream, app, error); else if (token_stream_peek (stream, '<')) result = variant_parse (stream, app, error); else if (token_stream_peek (stream, '{')) result = dictionary_parse (stream, app, error); else if (app && token_stream_peek (stream, '%')) result = positional_parse (stream, app, error); else if (token_stream_consume (stream, "true")) result = boolean_new (TRUE); else if (token_stream_consume (stream, "false")) result = boolean_new (FALSE); else if (token_stream_is_numeric (stream) || token_stream_peek_string (stream, "inf") || token_stream_peek_string (stream, "nan")) result = number_parse (stream, app, error); else if (token_stream_peek (stream, 'n') || token_stream_peek (stream, 'j')) result = maybe_parse (stream, app, error); else if (token_stream_peek (stream, '@') || token_stream_is_keyword (stream)) result = typedecl_parse (stream, app, error); else if (token_stream_peek (stream, '\'') || token_stream_peek (stream, '"')) result = string_parse (stream, app, error); else if (token_stream_peek2 (stream, 'b', '\'') || token_stream_peek2 (stream, 'b', '"')) result = bytestring_parse (stream, app, error); else { token_stream_set_error (stream, error, FALSE, G_VARIANT_PARSE_ERROR_VALUE_EXPECTED, "expected value"); return NULL; } if (result != NULL) { token_stream_end_ref (stream, &source_ref); result->source_ref = source_ref; } return result; } /** * g_variant_parse: * @type: (allow-none): a #GVariantType, or %NULL * @text: a string containing a GVariant in text form * @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 * * Parses a #GVariant from a text representation. * * A single #GVariant is parsed from the content of @text. * * The format is described here. * * The memory at @limit will never be accessed and the parser behaves as * if the character at @limit is the nul terminator. This has the * effect of bounding @text. * * If @endptr is non-%NULL then @text is permitted to contain data * following the value that this function parses and @endptr will be * updated to point to the first character past the end of the text * parsed by this function. If @endptr is %NULL and there is extra data * then an error is returned. * * If @type is non-%NULL then the value will be parsed to have that * type. This may result in additional parse errors (in the case that * the parsed value doesn't fit the type) but may also result in fewer * errors (in the case that the type would have been ambiguous, such as * with empty arrays). * * In the event that the parsing is successful, the resulting #GVariant * is returned. * * In case of any error, %NULL will be returned. If @error is non-%NULL * then it will be set to reflect the error that occurred. * * 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, const gchar *text, const gchar *limit, const gchar **endptr, GError **error) { TokenStream stream = { 0, }; GVariant *result = NULL; AST *ast; g_return_val_if_fail (text != NULL, NULL); g_return_val_if_fail (text == limit || text != NULL, NULL); stream.start = text; stream.stream = text; stream.end = limit; if ((ast = parse (&stream, NULL, error))) { if (type == NULL) result = ast_resolve (ast, error); else result = ast_get_value (ast, type, error); if (result != NULL) { g_variant_ref_sink (result); if (endptr == NULL) { while (stream.stream != limit && g_ascii_isspace (*stream.stream)) stream.stream++; if (stream.stream != limit && *stream.stream != '\0') { SourceRef ref = { stream.stream - text, stream.stream - text }; parser_set_error (error, &ref, NULL, G_VARIANT_PARSE_ERROR_INPUT_NOT_AT_END, "expected end of input"); g_variant_unref (result); result = NULL; } } else *endptr = stream.stream; } ast_free (ast); } return result; } /** * g_variant_new_parsed_va: * @format: a text format #GVariant * @app: a pointer to a #va_list * * Parses @format and returns the result. * * This is the version of g_variant_new_parsed() intended to be used * from libraries. * * The return value will be floating if it was a newly created GVariant * instance. In the case that @format simply specified the collection * of a #GVariant pointer (eg: @format was "%*") then the collected * #GVariant pointer will be returned unmodified, without adding any * additional references. * * In order to behave correctly in all cases it is necessary for the * calling function to g_variant_ref_sink() the return result before * returning control to the user that originally provided the pointer. * At this point, the caller will have their own full reference to the * result. This can also be done by adding the result to a container, * or by passing it to another g_variant_new() call. * * Returns: a new, usually floating, #GVariant **/ GVariant * g_variant_new_parsed_va (const gchar *format, va_list *app) { TokenStream stream = { 0, }; GVariant *result = NULL; GError *error = NULL; AST *ast; g_return_val_if_fail (format != NULL, NULL); g_return_val_if_fail (app != NULL, NULL); stream.start = format; stream.stream = format; stream.end = NULL; if ((ast = parse (&stream, app, &error))) { result = ast_resolve (ast, &error); ast_free (ast); } if (result == NULL) g_error ("g_variant_new_parsed: %s", error->message); if (*stream.stream) g_error ("g_variant_new_parsed: trailing text after value"); return result; } /** * g_variant_new_parsed: * @format: a text format #GVariant * @...: arguments as per @format * * Parses @format and returns the result. * * @format must be a text format #GVariant with one extension: at any * point that a value may appear in the text, a '%' character followed * by a GVariant format string (as per g_variant_new()) may appear. In * that case, the same arguments are collected from the argument list as * g_variant_new() would have collected. * * Consider this simple example: * * * g_variant_new_parsed ("[('one', 1), ('two', %i), (%s, 3)]", 2, "three"); * * * In the example, the variable argument parameters are collected and * filled in as if they were part of the original string to produce the * result of [('one', 1), ('two', 2), ('three', 3)]. * * This function is intended only to be used with @format as a string * literal. Any parse error is fatal to the calling process. If you * want to parse data from untrusted sources, use g_variant_parse(). * * You may not use this function to return, unmodified, a single * #GVariant pointer from the argument list. ie: @format may not solely * be anything along the lines of "%*", "%?", "\%r", or anything starting * with "%@". * * Returns: a new floating #GVariant instance **/ GVariant * g_variant_new_parsed (const gchar *format, ...) { GVariant *result; va_list ap; va_start (ap, format); result = g_variant_new_parsed_va (format, &ap); va_end (ap); return result; } /** * g_variant_builder_add_parsed: * @builder: a #GVariantBuilder * @format: a text format #GVariant * @...: arguments as per @format * * Adds to a #GVariantBuilder. * * This call is a convenience wrapper that is exactly equivalent to * calling g_variant_new_parsed() followed by * g_variant_builder_add_value(). * * This function might be used as follows: * * * GVariant * * make_pointless_dictionary (void) * { * GVariantBuilder *builder; * int i; * * builder = g_variant_builder_new (G_VARIANT_TYPE_ARRAY); * g_variant_builder_add_parsed (builder, "{'width', <%i>}", 600); * g_variant_builder_add_parsed (builder, "{'title', <%s>}", "foo"); * g_variant_builder_add_parsed (builder, "{'transparency', <0.5>}"); * return g_variant_builder_end (builder); * } * * * Since: 2.26 **/ void g_variant_builder_add_parsed (GVariantBuilder *builder, const gchar *format, ...) { va_list ap; va_start (ap, format); g_variant_builder_add_value (builder, g_variant_new_parsed_va (format, &ap)); va_end (ap); } pkg-config-0.29.1/glib/glib/gen-script-table.pl0000775000175000017500000000410512275467762016126 00000000000000#!/usr/bin/perl -w # # Script to convert http://www.unicode.org/Public/UNIDATA/Scripts.txt # into a machine-readable table. # ###################################################################### if (@ARGV != 1) { die "Usage: gen-script-table.pl Scripts.txt > gscripttable.h\n"; } open IN, $ARGV[0] || die "Cannot open $ARGV[0]: $!\n"; my @ranges; my $file; my $easy_range; my $i; my $start; my $end; my $script; while () { if (/^\#\s+(Scripts-.*.txt)/) { $file = $1; } s/#.*//; next if /^\s*$/; if (!/^([0-9A-F]+)(?:\.\.([0-9A-F]+))?\s*;\s*([A-Za-z_]+)\s*$/) { die "Cannot parse line: '$_'\n"; } if (defined $2) { push @ranges, [ hex $1, hex $2, uc $3 ]; } else { push @ranges, [ hex $1, hex $1, uc $3 ]; } } @ranges = sort { $a->[0] <=> $b->[0] } @ranges; $date = gmtime; print <<"EOT"; /* gscripttable.h: Generated by gen-script-table.pl * * Date: $date * Source: $file * * Do not edit. */ EOT $easy_range = 0x2000; print <<"EOT"; #define G_EASY_SCRIPTS_RANGE $easy_range static const guchar g_script_easy_table[$easy_range] = { EOT $i = 0; $end = -1; for (my $c = 0; $c < $easy_range; $c++) { if ($c % 3 == 0) { printf "\n "; } if ($c > $end) { $start = $ranges[$i]->[0]; $end = $ranges[$i]->[1]; $script = $ranges[$i]->[2]; $i++; } if ($c < $start) { printf " G_UNICODE_SCRIPT_UNKNOWN,"; } else { printf " G_UNICODE_SCRIPT_%s,", $script; } } if ($end >= $easy_range) { $i--; $ranges[$i]->[0] = $easy_range; } print <<"EOT"; }; static const struct { gunichar start; guint16 chars; guint16 script; } g_script_table[] = { EOT for (; $i <= $#ranges; $i++) { $start = $ranges[$i]->[0]; $end = $ranges[$i]->[1]; $script = $ranges[$i]->[2]; while ($i <= $#ranges - 1 && $ranges[$i + 1]->[0] == $end + 1 && $ranges[$i + 1]->[2] eq $script) { $i++; $end = $ranges[$i]->[1]; } printf " { %#06x, %5d, G_UNICODE_SCRIPT_%s },\n", $start, $end - $start + 1, $script; } printf "};\n"; pkg-config-0.29.1/glib/glib/glib.rc.in0000664000175000017500000000164212275467762014301 00000000000000#include VS_VERSION_INFO VERSIONINFO FILEVERSION @GLIB_MAJOR_VERSION@,@GLIB_MINOR_VERSION@,@GLIB_MICRO_VERSION@,0 PRODUCTVERSION @GLIB_MAJOR_VERSION@,@GLIB_MINOR_VERSION@,@GLIB_MICRO_VERSION@,0 FILEFLAGSMASK 0 FILEFLAGS 0 FILEOS VOS__WINDOWS32 FILETYPE VFT_DLL FILESUBTYPE VFT2_UNKNOWN BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "040904B0" BEGIN VALUE "CompanyName", "The GLib developer community" VALUE "FileDescription", "GLib" VALUE "FileVersion", "@GLIB_VERSION@.0" VALUE "InternalName", "libglib-2.0-@LT_CURRENT_MINUS_AGE@" VALUE "LegalCopyright", "Copyright © 1995-2011 Peter Mattis, Spencer Kimball, Josh MacDonald and others." VALUE "OriginalFilename", "libglib-2.0-@LT_CURRENT_MINUS_AGE@.dll" VALUE "ProductName", "GLib" VALUE "ProductVersion", "@GLIB_VERSION@" END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", 0x409, 1200 END END pkg-config-0.29.1/glib/glib/win_iconv.c0000664000175000017500000016443612651243552014566 00000000000000/* * iconv library implemented with Win32 API. * * This file is placed in the public domain. * * Maintainer: Yukihiro Nakadaira * * If $WINICONV_LIBICONV_DLL environment variable was defined, win_iconv * loads the specified DLL dynamically and uses it. If loading the DLL * or iconv_open() failed, falls back to internal conversion. * $WINICONV_LIBICONV_DLL is a comma separated list. The first loadable * DLL is used. The specified DLL should have iconv_open(), * iconv_close() and iconv() functions. Or these functions can be * libiconv_open(), libiconv_close() and libiconv(). * * Win32 API does not support strict encoding conversion for some * codepage. And MLang function drop or replace invalid bytes and does * not return useful error status as iconv. This implementation cannot * be used for encoding validation purpose. */ /* for WC_NO_BEST_FIT_CHARS */ #ifndef WINVER # define WINVER 0x0500 #endif #define STRICT #include #include #include #include #if 0 # define MAKE_EXE # define MAKE_DLL # define USE_LIBICONV_DLL #endif #if !defined(DEFAULT_LIBICONV_DLL) # define DEFAULT_LIBICONV_DLL "" #endif #define MB_CHAR_MAX 16 #define UNICODE_MODE_BOM_DONE 1 #define UNICODE_MODE_SWAPPED 2 #define FLAG_USE_BOM_ENDIAN 1 #define FLAG_TRANSLIT 2 /* //TRANSLIT */ #define FLAG_IGNORE 4 /* //IGNORE (not implemented) */ #define return_error(code) \ do { \ errno = code; \ return -1; \ } while (0) #define xstrlcpy(dst, src, size) \ do { \ strncpy(dst, src, size); \ dst[size - 1] = 0; \ } while (0) #define xstrlcpyn(dst, src, srclen, size) \ xstrlcpy(dst, src, xmin((srclen) + 1, size)) #define xmin(a, b) ((a) < (b) ? (a) : (b)) #define xmax(a, b) ((a) > (b) ? (a) : (b)) #define STATIC_STRLEN(arr) (sizeof(arr) - 1) typedef unsigned char uchar; typedef unsigned short ushort; typedef unsigned int uint; 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); /* libiconv interface for vim */ #if defined(MAKE_DLL) int iconvctl (iconv_t cd, int request, void* argument) { /* not supported */ return 0; } #endif typedef struct compat_t compat_t; typedef struct csconv_t csconv_t; 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 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); typedef int (*f_mblen)(csconv_t *cv, const uchar *buf, int bufsize); typedef int (*f_flush)(csconv_t *cv, uchar *buf, int bufsize); #define COMPAT_IN 1 #define COMPAT_OUT 2 /* unicode mapping for compatibility with other conversion table. */ struct compat_t { uint in; uint out; uint flag; }; struct csconv_t { int codepage; int flags; f_mbtowc mbtowc; f_wctomb wctomb; f_mblen mblen; f_flush flush; DWORD mode; compat_t *compat; }; struct rec_iconv_t { iconv_t cd; f_iconv_close iconv_close; f_iconv iconv; f_errno _errno; csconv_t from; csconv_t to; #if defined(USE_LIBICONV_DLL) HMODULE hlibiconv; #endif }; 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 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); static void ucs4_to_utf16(uint wc, ushort *wbuf, int *wbufsize); static int is_unicode(int codepage); static int mbtowc_flags(int codepage); static int must_use_null_useddefaultchar(int codepage); static void check_utf_bom(rec_iconv_t *cd, ushort *wbuf, int *wbufsize); static char *strrstr(const char *str, const char *token); #if defined(USE_LIBICONV_DLL) static int libiconv_iconv_open(rec_iconv_t *cd, const char *tocode, const char *fromcode); static PVOID MyImageDirectoryEntryToData(LPVOID Base, BOOLEAN MappedAsImage, USHORT DirectoryEntry, PULONG Size); static HMODULE find_imported_module_by_funcname(HMODULE hModule, const char *funcname); static HMODULE hwiniconv; static HMODULE hlastdll; /* keep dll loaded for efficiency (unnecessary?) */ #endif static int sbcs_mblen(csconv_t *cv, const uchar *buf, int bufsize); static int dbcs_mblen(csconv_t *cv, const uchar *buf, int bufsize); static int mbcs_mblen(csconv_t *cv, const uchar *buf, int bufsize); static int utf8_mblen(csconv_t *cv, const uchar *buf, int bufsize); static int eucjp_mblen(csconv_t *cv, const uchar *buf, int bufsize); static int kernel_mbtowc(csconv_t *cv, const uchar *buf, int bufsize, ushort *wbuf, int *wbufsize); static int kernel_wctomb(csconv_t *cv, ushort *wbuf, int wbufsize, uchar *buf, int bufsize); static int mlang_mbtowc(csconv_t *cv, const uchar *buf, int bufsize, ushort *wbuf, int *wbufsize); static int mlang_wctomb(csconv_t *cv, ushort *wbuf, int wbufsize, uchar *buf, int bufsize); static int utf16_mbtowc(csconv_t *cv, const uchar *buf, int bufsize, ushort *wbuf, int *wbufsize); static int utf16_wctomb(csconv_t *cv, ushort *wbuf, int wbufsize, uchar *buf, int bufsize); static int utf32_mbtowc(csconv_t *cv, const uchar *buf, int bufsize, ushort *wbuf, int *wbufsize); static int utf32_wctomb(csconv_t *cv, ushort *wbuf, int wbufsize, uchar *buf, int bufsize); static int iso2022jp_mbtowc(csconv_t *cv, const uchar *buf, int bufsize, ushort *wbuf, int *wbufsize); static int iso2022jp_wctomb(csconv_t *cv, ushort *wbuf, int wbufsize, uchar *buf, int bufsize); static int iso2022jp_flush(csconv_t *cv, uchar *buf, int bufsize); static struct { int codepage; const char *name; } codepage_alias[] = { {65001, "CP65001"}, {65001, "UTF8"}, {65001, "UTF-8"}, {1200, "CP1200"}, {1200, "UTF16LE"}, {1200, "UTF-16LE"}, {1200, "UCS2LE"}, {1200, "UCS-2LE"}, {1201, "CP1201"}, {1201, "UTF16BE"}, {1201, "UTF-16BE"}, {1201, "UCS2BE"}, {1201, "UCS-2BE"}, {1201, "unicodeFFFE"}, {12000, "CP12000"}, {12000, "UTF32LE"}, {12000, "UTF-32LE"}, {12000, "UCS4LE"}, {12000, "UCS-4LE"}, {12001, "CP12001"}, {12001, "UTF32BE"}, {12001, "UTF-32BE"}, {12001, "UCS4BE"}, {12001, "UCS-4BE"}, #ifndef GLIB_COMPILATION /* * Default is big endian. * See rfc2781 4.3 Interpreting text labelled as UTF-16. */ {1201, "UTF16"}, {1201, "UTF-16"}, {12001, "UTF32"}, {12001, "UTF-32"}, {12001, "UCS-4"}, {12001, "UCS4"}, #else /* Default is little endian, because the platform is */ {1200, "UTF16"}, {1200, "UTF-16"}, {1200, "UCS2"}, {1200, "UCS-2"}, {12000, "UTF32"}, {12000, "UTF-32"}, {12000, "UCS4"}, {12000, "UCS-4"}, #endif /* copy from libiconv `iconv -l` */ /* !IsValidCodePage(367) */ {20127, "ANSI_X3.4-1968"}, {20127, "ANSI_X3.4-1986"}, {20127, "ASCII"}, {20127, "CP367"}, {20127, "IBM367"}, {20127, "ISO-IR-6"}, {20127, "ISO646-US"}, {20127, "ISO_646.IRV:1991"}, {20127, "US"}, {20127, "US-ASCII"}, {20127, "CSASCII"}, /* !IsValidCodePage(819) */ {1252, "CP819"}, {1252, "IBM819"}, {28591, "ISO-8859-1"}, {28591, "ISO-IR-100"}, {28591, "ISO8859-1"}, {28591, "ISO_8859-1"}, {28591, "ISO_8859-1:1987"}, {28591, "L1"}, {28591, "LATIN1"}, {28591, "CSISOLATIN1"}, {1250, "CP1250"}, {1250, "MS-EE"}, {1250, "WINDOWS-1250"}, {1251, "CP1251"}, {1251, "MS-CYRL"}, {1251, "WINDOWS-1251"}, {1252, "CP1252"}, {1252, "MS-ANSI"}, {1252, "WINDOWS-1252"}, {1253, "CP1253"}, {1253, "MS-GREEK"}, {1253, "WINDOWS-1253"}, {1254, "CP1254"}, {1254, "MS-TURK"}, {1254, "WINDOWS-1254"}, {1255, "CP1255"}, {1255, "MS-HEBR"}, {1255, "WINDOWS-1255"}, {1256, "CP1256"}, {1256, "MS-ARAB"}, {1256, "WINDOWS-1256"}, {1257, "CP1257"}, {1257, "WINBALTRIM"}, {1257, "WINDOWS-1257"}, {1258, "CP1258"}, {1258, "WINDOWS-1258"}, {850, "850"}, {850, "CP850"}, {850, "IBM850"}, {850, "CSPC850MULTILINGUAL"}, /* !IsValidCodePage(862) */ {862, "862"}, {862, "CP862"}, {862, "IBM862"}, {862, "CSPC862LATINHEBREW"}, {866, "866"}, {866, "CP866"}, {866, "IBM866"}, {866, "CSIBM866"}, /* !IsValidCodePage(154) */ {154, "CP154"}, {154, "CYRILLIC-ASIAN"}, {154, "PT154"}, {154, "PTCP154"}, {154, "CSPTCP154"}, /* !IsValidCodePage(1133) */ {1133, "CP1133"}, {1133, "IBM-CP1133"}, {874, "CP874"}, {874, "WINDOWS-874"}, /* !IsValidCodePage(51932) */ {51932, "CP51932"}, {51932, "MS51932"}, {51932, "WINDOWS-51932"}, {51932, "EUC-JP"}, {932, "CP932"}, {932, "MS932"}, {932, "SHIFFT_JIS"}, {932, "SHIFFT_JIS-MS"}, {932, "SJIS"}, {932, "SJIS-MS"}, {932, "SJIS-OPEN"}, {932, "SJIS-WIN"}, {932, "WINDOWS-31J"}, {932, "WINDOWS-932"}, {932, "CSWINDOWS31J"}, {50221, "CP50221"}, {50221, "ISO-2022-JP"}, {50221, "ISO-2022-JP-MS"}, {50221, "ISO2022-JP"}, {50221, "ISO2022-JP-MS"}, {50221, "MS50221"}, {50221, "WINDOWS-50221"}, {936, "CP936"}, {936, "GBK"}, {936, "MS936"}, {936, "WINDOWS-936"}, {950, "CP950"}, {950, "BIG5"}, {949, "CP949"}, {949, "UHC"}, {949, "EUC-KR"}, {1361, "CP1361"}, {1361, "JOHAB"}, {437, "437"}, {437, "CP437"}, {437, "IBM437"}, {437, "CSPC8CODEPAGE437"}, {737, "CP737"}, {775, "CP775"}, {775, "IBM775"}, {775, "CSPC775BALTIC"}, {852, "852"}, {852, "CP852"}, {852, "IBM852"}, {852, "CSPCP852"}, /* !IsValidCodePage(853) */ {853, "CP853"}, {855, "855"}, {855, "CP855"}, {855, "IBM855"}, {855, "CSIBM855"}, {857, "857"}, {857, "CP857"}, {857, "IBM857"}, {857, "CSIBM857"}, /* !IsValidCodePage(858) */ {858, "CP858"}, {860, "860"}, {860, "CP860"}, {860, "IBM860"}, {860, "CSIBM860"}, {861, "861"}, {861, "CP-IS"}, {861, "CP861"}, {861, "IBM861"}, {861, "CSIBM861"}, {863, "863"}, {863, "CP863"}, {863, "IBM863"}, {863, "CSIBM863"}, {864, "CP864"}, {864, "IBM864"}, {864, "CSIBM864"}, {865, "865"}, {865, "CP865"}, {865, "IBM865"}, {865, "CSIBM865"}, {869, "869"}, {869, "CP-GR"}, {869, "CP869"}, {869, "IBM869"}, {869, "CSIBM869"}, /* !IsValidCodePage(1152) */ {1125, "CP1125"}, /* * Code Page Identifiers * http://msdn2.microsoft.com/en-us/library/ms776446.aspx */ {37, "IBM037"}, /* IBM EBCDIC US-Canada */ {437, "IBM437"}, /* OEM United States */ {500, "IBM500"}, /* IBM EBCDIC International */ {708, "ASMO-708"}, /* Arabic (ASMO 708) */ /* 709 Arabic (ASMO-449+, BCON V4) */ /* 710 Arabic - Transparent Arabic */ {720, "DOS-720"}, /* Arabic (Transparent ASMO); Arabic (DOS) */ {737, "ibm737"}, /* OEM Greek (formerly 437G); Greek (DOS) */ {775, "ibm775"}, /* OEM Baltic; Baltic (DOS) */ {850, "ibm850"}, /* OEM Multilingual Latin 1; Western European (DOS) */ {852, "ibm852"}, /* OEM Latin 2; Central European (DOS) */ {855, "IBM855"}, /* OEM Cyrillic (primarily Russian) */ {857, "ibm857"}, /* OEM Turkish; Turkish (DOS) */ {858, "IBM00858"}, /* OEM Multilingual Latin 1 + Euro symbol */ {860, "IBM860"}, /* OEM Portuguese; Portuguese (DOS) */ {861, "ibm861"}, /* OEM Icelandic; Icelandic (DOS) */ {862, "DOS-862"}, /* OEM Hebrew; Hebrew (DOS) */ {863, "IBM863"}, /* OEM French Canadian; French Canadian (DOS) */ {864, "IBM864"}, /* OEM Arabic; Arabic (864) */ {865, "IBM865"}, /* OEM Nordic; Nordic (DOS) */ {866, "cp866"}, /* OEM Russian; Cyrillic (DOS) */ {869, "ibm869"}, /* OEM Modern Greek; Greek, Modern (DOS) */ {870, "IBM870"}, /* IBM EBCDIC Multilingual/ROECE (Latin 2); IBM EBCDIC Multilingual Latin 2 */ {874, "windows-874"}, /* ANSI/OEM Thai (same as 28605, ISO 8859-15); Thai (Windows) */ {875, "cp875"}, /* IBM EBCDIC Greek Modern */ {932, "shift_jis"}, /* ANSI/OEM Japanese; Japanese (Shift-JIS) */ {932, "shift-jis"}, /* alternative name for it */ {936, "gb2312"}, /* ANSI/OEM Simplified Chinese (PRC, Singapore); Chinese Simplified (GB2312) */ {949, "ks_c_5601-1987"}, /* ANSI/OEM Korean (Unified Hangul Code) */ {950, "big5"}, /* ANSI/OEM Traditional Chinese (Taiwan; Hong Kong SAR, PRC); Chinese Traditional (Big5) */ {1026, "IBM1026"}, /* IBM EBCDIC Turkish (Latin 5) */ {1047, "IBM01047"}, /* IBM EBCDIC Latin 1/Open System */ {1140, "IBM01140"}, /* IBM EBCDIC US-Canada (037 + Euro symbol); IBM EBCDIC (US-Canada-Euro) */ {1141, "IBM01141"}, /* IBM EBCDIC Germany (20273 + Euro symbol); IBM EBCDIC (Germany-Euro) */ {1142, "IBM01142"}, /* IBM EBCDIC Denmark-Norway (20277 + Euro symbol); IBM EBCDIC (Denmark-Norway-Euro) */ {1143, "IBM01143"}, /* IBM EBCDIC Finland-Sweden (20278 + Euro symbol); IBM EBCDIC (Finland-Sweden-Euro) */ {1144, "IBM01144"}, /* IBM EBCDIC Italy (20280 + Euro symbol); IBM EBCDIC (Italy-Euro) */ {1145, "IBM01145"}, /* IBM EBCDIC Latin America-Spain (20284 + Euro symbol); IBM EBCDIC (Spain-Euro) */ {1146, "IBM01146"}, /* IBM EBCDIC United Kingdom (20285 + Euro symbol); IBM EBCDIC (UK-Euro) */ {1147, "IBM01147"}, /* IBM EBCDIC France (20297 + Euro symbol); IBM EBCDIC (France-Euro) */ {1148, "IBM01148"}, /* IBM EBCDIC International (500 + Euro symbol); IBM EBCDIC (International-Euro) */ {1149, "IBM01149"}, /* IBM EBCDIC Icelandic (20871 + Euro symbol); IBM EBCDIC (Icelandic-Euro) */ {1250, "windows-1250"}, /* ANSI Central European; Central European (Windows) */ {1251, "windows-1251"}, /* ANSI Cyrillic; Cyrillic (Windows) */ {1252, "windows-1252"}, /* ANSI Latin 1; Western European (Windows) */ {1253, "windows-1253"}, /* ANSI Greek; Greek (Windows) */ {1254, "windows-1254"}, /* ANSI Turkish; Turkish (Windows) */ {1255, "windows-1255"}, /* ANSI Hebrew; Hebrew (Windows) */ {1256, "windows-1256"}, /* ANSI Arabic; Arabic (Windows) */ {1257, "windows-1257"}, /* ANSI Baltic; Baltic (Windows) */ {1258, "windows-1258"}, /* ANSI/OEM Vietnamese; Vietnamese (Windows) */ {1361, "Johab"}, /* Korean (Johab) */ {10000, "macintosh"}, /* MAC Roman; Western European (Mac) */ {10001, "x-mac-japanese"}, /* Japanese (Mac) */ {10002, "x-mac-chinesetrad"}, /* MAC Traditional Chinese (Big5); Chinese Traditional (Mac) */ {10003, "x-mac-korean"}, /* Korean (Mac) */ {10004, "x-mac-arabic"}, /* Arabic (Mac) */ {10005, "x-mac-hebrew"}, /* Hebrew (Mac) */ {10006, "x-mac-greek"}, /* Greek (Mac) */ {10007, "x-mac-cyrillic"}, /* Cyrillic (Mac) */ {10008, "x-mac-chinesesimp"}, /* MAC Simplified Chinese (GB 2312); Chinese Simplified (Mac) */ {10010, "x-mac-romanian"}, /* Romanian (Mac) */ {10017, "x-mac-ukrainian"}, /* Ukrainian (Mac) */ {10021, "x-mac-thai"}, /* Thai (Mac) */ {10029, "x-mac-ce"}, /* MAC Latin 2; Central European (Mac) */ {10079, "x-mac-icelandic"}, /* Icelandic (Mac) */ {10081, "x-mac-turkish"}, /* Turkish (Mac) */ {10082, "x-mac-croatian"}, /* Croatian (Mac) */ {20000, "x-Chinese_CNS"}, /* CNS Taiwan; Chinese Traditional (CNS) */ {20001, "x-cp20001"}, /* TCA Taiwan */ {20002, "x_Chinese-Eten"}, /* Eten Taiwan; Chinese Traditional (Eten) */ {20003, "x-cp20003"}, /* IBM5550 Taiwan */ {20004, "x-cp20004"}, /* TeleText Taiwan */ {20005, "x-cp20005"}, /* Wang Taiwan */ {20105, "x-IA5"}, /* IA5 (IRV International Alphabet No. 5, 7-bit); Western European (IA5) */ {20106, "x-IA5-German"}, /* IA5 German (7-bit) */ {20107, "x-IA5-Swedish"}, /* IA5 Swedish (7-bit) */ {20108, "x-IA5-Norwegian"}, /* IA5 Norwegian (7-bit) */ {20127, "us-ascii"}, /* US-ASCII (7-bit) */ {20261, "x-cp20261"}, /* T.61 */ {20269, "x-cp20269"}, /* ISO 6937 Non-Spacing Accent */ {20273, "IBM273"}, /* IBM EBCDIC Germany */ {20277, "IBM277"}, /* IBM EBCDIC Denmark-Norway */ {20278, "IBM278"}, /* IBM EBCDIC Finland-Sweden */ {20280, "IBM280"}, /* IBM EBCDIC Italy */ {20284, "IBM284"}, /* IBM EBCDIC Latin America-Spain */ {20285, "IBM285"}, /* IBM EBCDIC United Kingdom */ {20290, "IBM290"}, /* IBM EBCDIC Japanese Katakana Extended */ {20297, "IBM297"}, /* IBM EBCDIC France */ {20420, "IBM420"}, /* IBM EBCDIC Arabic */ {20423, "IBM423"}, /* IBM EBCDIC Greek */ {20424, "IBM424"}, /* IBM EBCDIC Hebrew */ {20833, "x-EBCDIC-KoreanExtended"}, /* IBM EBCDIC Korean Extended */ {20838, "IBM-Thai"}, /* IBM EBCDIC Thai */ {20866, "koi8-r"}, /* Russian (KOI8-R); Cyrillic (KOI8-R) */ {20871, "IBM871"}, /* IBM EBCDIC Icelandic */ {20880, "IBM880"}, /* IBM EBCDIC Cyrillic Russian */ {20905, "IBM905"}, /* IBM EBCDIC Turkish */ {20924, "IBM00924"}, /* IBM EBCDIC Latin 1/Open System (1047 + Euro symbol) */ {20932, "EUC-JP"}, /* Japanese (JIS 0208-1990 and 0121-1990) */ {20936, "x-cp20936"}, /* Simplified Chinese (GB2312); Chinese Simplified (GB2312-80) */ {20949, "x-cp20949"}, /* Korean Wansung */ {21025, "cp1025"}, /* IBM EBCDIC Cyrillic Serbian-Bulgarian */ /* 21027 (deprecated) */ {21866, "koi8-u"}, /* Ukrainian (KOI8-U); Cyrillic (KOI8-U) */ {28591, "iso-8859-1"}, /* ISO 8859-1 Latin 1; Western European (ISO) */ {28591, "iso8859-1"}, /* ISO 8859-1 Latin 1; Western European (ISO) */ {28592, "iso-8859-2"}, /* ISO 8859-2 Central European; Central European (ISO) */ {28592, "iso8859-2"}, /* ISO 8859-2 Central European; Central European (ISO) */ {28593, "iso-8859-3"}, /* ISO 8859-3 Latin 3 */ {28593, "iso8859-3"}, /* ISO 8859-3 Latin 3 */ {28594, "iso-8859-4"}, /* ISO 8859-4 Baltic */ {28594, "iso8859-4"}, /* ISO 8859-4 Baltic */ {28595, "iso-8859-5"}, /* ISO 8859-5 Cyrillic */ {28595, "iso8859-5"}, /* ISO 8859-5 Cyrillic */ {28596, "iso-8859-6"}, /* ISO 8859-6 Arabic */ {28596, "iso8859-6"}, /* ISO 8859-6 Arabic */ {28597, "iso-8859-7"}, /* ISO 8859-7 Greek */ {28597, "iso8859-7"}, /* ISO 8859-7 Greek */ {28598, "iso-8859-8"}, /* ISO 8859-8 Hebrew; Hebrew (ISO-Visual) */ {28598, "iso8859-8"}, /* ISO 8859-8 Hebrew; Hebrew (ISO-Visual) */ {28599, "iso-8859-9"}, /* ISO 8859-9 Turkish */ {28599, "iso8859-9"}, /* ISO 8859-9 Turkish */ {28603, "iso-8859-13"}, /* ISO 8859-13 Estonian */ {28603, "iso8859-13"}, /* ISO 8859-13 Estonian */ {28605, "iso-8859-15"}, /* ISO 8859-15 Latin 9 */ {28605, "iso8859-15"}, /* ISO 8859-15 Latin 9 */ {29001, "x-Europa"}, /* Europa 3 */ {38598, "iso-8859-8-i"}, /* ISO 8859-8 Hebrew; Hebrew (ISO-Logical) */ {38598, "iso8859-8-i"}, /* ISO 8859-8 Hebrew; Hebrew (ISO-Logical) */ {50220, "iso-2022-jp"}, /* ISO 2022 Japanese with no halfwidth Katakana; Japanese (JIS) */ {50221, "csISO2022JP"}, /* ISO 2022 Japanese with halfwidth Katakana; Japanese (JIS-Allow 1 byte Kana) */ {50222, "iso-2022-jp"}, /* ISO 2022 Japanese JIS X 0201-1989; Japanese (JIS-Allow 1 byte Kana - SO/SI) */ {50225, "iso-2022-kr"}, /* ISO 2022 Korean */ {50225, "iso2022-kr"}, /* ISO 2022 Korean */ {50227, "x-cp50227"}, /* ISO 2022 Simplified Chinese; Chinese Simplified (ISO 2022) */ /* 50229 ISO 2022 Traditional Chinese */ /* 50930 EBCDIC Japanese (Katakana) Extended */ /* 50931 EBCDIC US-Canada and Japanese */ /* 50933 EBCDIC Korean Extended and Korean */ /* 50935 EBCDIC Simplified Chinese Extended and Simplified Chinese */ /* 50936 EBCDIC Simplified Chinese */ /* 50937 EBCDIC US-Canada and Traditional Chinese */ /* 50939 EBCDIC Japanese (Latin) Extended and Japanese */ {51932, "euc-jp"}, /* EUC Japanese */ {51936, "EUC-CN"}, /* EUC Simplified Chinese; Chinese Simplified (EUC) */ {51949, "euc-kr"}, /* EUC Korean */ /* 51950 EUC Traditional Chinese */ {52936, "hz-gb-2312"}, /* HZ-GB2312 Simplified Chinese; Chinese Simplified (HZ) */ {54936, "GB18030"}, /* Windows XP and later: GB18030 Simplified Chinese (4 byte); Chinese Simplified (GB18030) */ {57002, "x-iscii-de"}, /* ISCII Devanagari */ {57003, "x-iscii-be"}, /* ISCII Bengali */ {57004, "x-iscii-ta"}, /* ISCII Tamil */ {57005, "x-iscii-te"}, /* ISCII Telugu */ {57006, "x-iscii-as"}, /* ISCII Assamese */ {57007, "x-iscii-or"}, /* ISCII Oriya */ {57008, "x-iscii-ka"}, /* ISCII Kannada */ {57009, "x-iscii-ma"}, /* ISCII Malayalam */ {57010, "x-iscii-gu"}, /* ISCII Gujarati */ {57011, "x-iscii-pa"}, /* ISCII Punjabi */ {0, NULL} }; /* * SJIS SHIFTJIS table CP932 table * ---- --------------------------- -------------------------------- * 5C U+00A5 YEN SIGN U+005C REVERSE SOLIDUS * 7E U+203E OVERLINE U+007E TILDE * 815C U+2014 EM DASH U+2015 HORIZONTAL BAR * 815F U+005C REVERSE SOLIDUS U+FF3C FULLWIDTH REVERSE SOLIDUS * 8160 U+301C WAVE DASH U+FF5E FULLWIDTH TILDE * 8161 U+2016 DOUBLE VERTICAL LINE U+2225 PARALLEL TO * 817C U+2212 MINUS SIGN U+FF0D FULLWIDTH HYPHEN-MINUS * 8191 U+00A2 CENT SIGN U+FFE0 FULLWIDTH CENT SIGN * 8192 U+00A3 POUND SIGN U+FFE1 FULLWIDTH POUND SIGN * 81CA U+00AC NOT SIGN U+FFE2 FULLWIDTH NOT SIGN * * EUC-JP and ISO-2022-JP should be compatible with CP932. * * Kernel and MLang have different Unicode mapping table. Make sure * which API is used. */ static compat_t cp932_compat[] = { {0x00A5, 0x005C, COMPAT_OUT}, {0x203E, 0x007E, COMPAT_OUT}, {0x2014, 0x2015, COMPAT_OUT}, {0x301C, 0xFF5E, COMPAT_OUT}, {0x2016, 0x2225, COMPAT_OUT}, {0x2212, 0xFF0D, COMPAT_OUT}, {0x00A2, 0xFFE0, COMPAT_OUT}, {0x00A3, 0xFFE1, COMPAT_OUT}, {0x00AC, 0xFFE2, COMPAT_OUT}, {0, 0, 0} }; static compat_t cp20932_compat[] = { {0x00A5, 0x005C, COMPAT_OUT}, {0x203E, 0x007E, COMPAT_OUT}, {0x2014, 0x2015, COMPAT_OUT}, {0xFF5E, 0x301C, COMPAT_OUT|COMPAT_IN}, {0x2225, 0x2016, COMPAT_OUT|COMPAT_IN}, {0xFF0D, 0x2212, COMPAT_OUT|COMPAT_IN}, {0xFFE0, 0x00A2, COMPAT_OUT|COMPAT_IN}, {0xFFE1, 0x00A3, COMPAT_OUT|COMPAT_IN}, {0xFFE2, 0x00AC, COMPAT_OUT|COMPAT_IN}, {0, 0, 0} }; static compat_t *cp51932_compat = cp932_compat; /* cp20932_compat for kernel. cp932_compat for mlang. */ static compat_t *cp5022x_compat = cp932_compat; typedef HRESULT (WINAPI *CONVERTINETSTRING)( LPDWORD lpdwMode, DWORD dwSrcEncoding, DWORD dwDstEncoding, LPCSTR lpSrcStr, LPINT lpnSrcSize, LPBYTE lpDstStr, LPINT lpnDstSize ); typedef HRESULT (WINAPI *CONVERTINETMULTIBYTETOUNICODE)( LPDWORD lpdwMode, DWORD dwSrcEncoding, LPCSTR lpSrcStr, LPINT lpnMultiCharCount, LPWSTR lpDstStr, LPINT lpnWideCharCount ); typedef HRESULT (WINAPI *CONVERTINETUNICODETOMULTIBYTE)( LPDWORD lpdwMode, DWORD dwEncoding, LPCWSTR lpSrcStr, LPINT lpnWideCharCount, LPSTR lpDstStr, LPINT lpnMultiCharCount ); typedef HRESULT (WINAPI *ISCONVERTINETSTRINGAVAILABLE)( DWORD dwSrcEncoding, DWORD dwDstEncoding ); typedef HRESULT (WINAPI *LCIDTORFC1766A)( LCID Locale, LPSTR pszRfc1766, int nChar ); typedef HRESULT (WINAPI *LCIDTORFC1766W)( LCID Locale, LPWSTR pszRfc1766, int nChar ); typedef HRESULT (WINAPI *RFC1766TOLCIDA)( LCID *pLocale, LPSTR pszRfc1766 ); typedef HRESULT (WINAPI *RFC1766TOLCIDW)( LCID *pLocale, LPWSTR pszRfc1766 ); static CONVERTINETSTRING ConvertINetString; static CONVERTINETMULTIBYTETOUNICODE ConvertINetMultiByteToUnicode; static CONVERTINETUNICODETOMULTIBYTE ConvertINetUnicodeToMultiByte; static ISCONVERTINETSTRINGAVAILABLE IsConvertINetStringAvailable; static LCIDTORFC1766A LcidToRfc1766A; static RFC1766TOLCIDA Rfc1766ToLcidA; static int load_mlang(void) { HMODULE h = NULL; char mlang_dll[MAX_PATH + 100]; int n; if (ConvertINetString != NULL) return TRUE; n = GetSystemDirectory(mlang_dll, MAX_PATH); if (n > 0 && n < MAX_PATH) { if (mlang_dll[n-1] != '\\' && mlang_dll[n-1] != '/') strcat(mlang_dll, "\\"); strcat(mlang_dll, "mlang.dll"); h = LoadLibrary(mlang_dll); } if (!h) return FALSE; ConvertINetString = (CONVERTINETSTRING)GetProcAddress(h, "ConvertINetString"); ConvertINetMultiByteToUnicode = (CONVERTINETMULTIBYTETOUNICODE)GetProcAddress(h, "ConvertINetMultiByteToUnicode"); ConvertINetUnicodeToMultiByte = (CONVERTINETUNICODETOMULTIBYTE)GetProcAddress(h, "ConvertINetUnicodeToMultiByte"); IsConvertINetStringAvailable = (ISCONVERTINETSTRINGAVAILABLE)GetProcAddress(h, "IsConvertINetStringAvailable"); LcidToRfc1766A = (LCIDTORFC1766A)GetProcAddress(h, "LcidToRfc1766A"); Rfc1766ToLcidA = (RFC1766TOLCIDA)GetProcAddress(h, "Rfc1766ToLcidA"); return TRUE; } iconv_t iconv_open(const char *tocode, const char *fromcode) { rec_iconv_t *cd; cd = (rec_iconv_t *)calloc(1, sizeof(rec_iconv_t)); if (cd == NULL) { errno = ENOMEM; return (iconv_t)(-1); } #if defined(USE_LIBICONV_DLL) if (libiconv_iconv_open(cd, tocode, fromcode)) return (iconv_t)cd; #endif if (win_iconv_open(cd, tocode, fromcode)) return (iconv_t)cd; free(cd); errno = EINVAL; return (iconv_t)(-1); } int iconv_close(iconv_t _cd) { rec_iconv_t *cd = (rec_iconv_t *)_cd; int r = cd->iconv_close(cd->cd); int e = *(cd->_errno()); #if defined(USE_LIBICONV_DLL) if (cd->hlibiconv != NULL) FreeLibrary(cd->hlibiconv); #endif free(cd); errno = e; return r; } size_t 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); errno = *(cd->_errno()); return r; } static int win_iconv_open(rec_iconv_t *cd, const char *tocode, const char *fromcode) { cd->from = make_csconv(fromcode); cd->to = make_csconv(tocode); if (cd->from.codepage == -1 || cd->to.codepage == -1) return FALSE; cd->iconv_close = win_iconv_close; cd->iconv = win_iconv; cd->_errno = _errno; cd->cd = (iconv_t)cd; return TRUE; } static int win_iconv_close(iconv_t cd) { return 0; } static size_t 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 */ int insize; int outsize; int wsize; DWORD mode; uint wc; compat_t *cp; int i; if (inbuf == NULL || *inbuf == NULL) { if (outbuf != NULL && *outbuf != NULL && cd->to.flush != NULL) { outsize = cd->to.flush(&cd->to, (uchar *)*outbuf, *outbytesleft); if (outsize == -1) return (size_t)(-1); *outbuf += outsize; *outbytesleft -= outsize; } if (is_unicode(cd->from.codepage) && (cd->from.mode & UNICODE_MODE_SWAPPED)) cd->from.codepage ^= 1; cd->from.mode = 0; cd->to.mode = 0; return 0; } while (*inbytesleft != 0) { mode = cd->from.mode; wsize = MB_CHAR_MAX; insize = cd->from.mbtowc(&cd->from, (const uchar *)*inbuf, *inbytesleft, wbuf, &wsize); if (insize == -1) return (size_t)(-1); if (is_unicode(cd->from.codepage) && !(cd->from.mode & UNICODE_MODE_BOM_DONE)) { check_utf_bom(cd, wbuf, &wsize); cd->from.mode |= UNICODE_MODE_BOM_DONE; } if (wsize == 0) { *inbuf += insize; *inbytesleft -= insize; continue; } if (cd->from.compat != NULL) { wc = utf16_to_ucs4(wbuf); cp = cd->from.compat; for (i = 0; cp[i].in != 0; ++i) { if ((cp[i].flag & COMPAT_IN) && cp[i].out == wc) { ucs4_to_utf16(cp[i].in, wbuf, &wsize); break; } } } if (cd->to.compat != NULL) { wc = utf16_to_ucs4(wbuf); cp = cd->to.compat; for (i = 0; cp[i].in != 0; ++i) { if ((cp[i].flag & COMPAT_OUT) && cp[i].in == wc) { ucs4_to_utf16(cp[i].out, wbuf, &wsize); break; } } } outsize = cd->to.wctomb(&cd->to, wbuf, wsize, (uchar *)*outbuf, *outbytesleft); if (outsize == -1) { cd->from.mode = mode; return (size_t)(-1); } *inbuf += insize; *outbuf += outsize; *inbytesleft -= insize; *outbytesleft -= outsize; } return 0; } static csconv_t make_csconv(const char *_name) { CPINFOEX cpinfoex; csconv_t cv; int use_compat = TRUE; int flag = 0; char name[128]; char *p; xstrlcpy(name, _name, sizeof(name)); /* check for option "enc_name//opt1//opt2" */ while ((p = strrstr(name, "//")) != NULL) { if (_stricmp(p + 2, "nocompat") == 0) use_compat = FALSE; else if (_stricmp(p + 2, "translit") == 0) flag |= FLAG_TRANSLIT; else if (_stricmp(p + 2, "ignore") == 0) flag |= FLAG_IGNORE; *p = 0; } cv.mode = 0; cv.flags = flag; cv.mblen = NULL; cv.flush = NULL; cv.compat = NULL; cv.codepage = name_to_codepage(name); if (cv.codepage == 1200 || cv.codepage == 1201) { cv.mbtowc = utf16_mbtowc; cv.wctomb = utf16_wctomb; if (_stricmp(name, "UTF-16") == 0 || _stricmp(name, "UTF16") == 0 || _stricmp(name, "UCS-2") == 0 || _stricmp(name, "UCS2") == 0) cv.flags |= FLAG_USE_BOM_ENDIAN; } else if (cv.codepage == 12000 || cv.codepage == 12001) { cv.mbtowc = utf32_mbtowc; cv.wctomb = utf32_wctomb; if (_stricmp(name, "UTF-32") == 0 || _stricmp(name, "UTF32") == 0 || _stricmp(name, "UCS-4") == 0 || _stricmp(name, "UCS4") == 0) cv.flags |= FLAG_USE_BOM_ENDIAN; } else if (cv.codepage == 65001) { cv.mbtowc = kernel_mbtowc; cv.wctomb = kernel_wctomb; cv.mblen = utf8_mblen; } else if ((cv.codepage == 50220 || cv.codepage == 50221 || cv.codepage == 50222) && load_mlang()) { cv.mbtowc = iso2022jp_mbtowc; cv.wctomb = iso2022jp_wctomb; cv.flush = iso2022jp_flush; } else if (cv.codepage == 51932 && load_mlang()) { cv.mbtowc = mlang_mbtowc; cv.wctomb = mlang_wctomb; cv.mblen = eucjp_mblen; } else if (IsValidCodePage(cv.codepage) && GetCPInfoEx(cv.codepage, 0, &cpinfoex) != 0) { cv.mbtowc = kernel_mbtowc; cv.wctomb = kernel_wctomb; if (cpinfoex.MaxCharSize == 1) cv.mblen = sbcs_mblen; else if (cpinfoex.MaxCharSize == 2) cv.mblen = dbcs_mblen; else cv.mblen = mbcs_mblen; } else { /* not supported */ cv.codepage = -1; } if (use_compat) { switch (cv.codepage) { case 932: cv.compat = cp932_compat; break; case 20932: cv.compat = cp20932_compat; break; case 51932: cv.compat = cp51932_compat; break; case 50220: case 50221: case 50222: cv.compat = cp5022x_compat; break; } } return cv; } static int name_to_codepage(const char *name) { int i; if (*name == '\0' || strcmp(name, "char") == 0) return GetACP(); else if (strcmp(name, "wchar_t") == 0) return 1200; else if (_strnicmp(name, "cp", 2) == 0) return atoi(name + 2); /* CP123 */ else if ('0' <= name[0] && name[0] <= '9') return atoi(name); /* 123 */ else if (_strnicmp(name, "xx", 2) == 0) return atoi(name + 2); /* XX123 for debug */ for (i = 0; codepage_alias[i].name != NULL; ++i) if (_stricmp(name, codepage_alias[i].name) == 0) return codepage_alias[i].codepage; return -1; } /* * http://www.faqs.org/rfcs/rfc2781.html */ static uint utf16_to_ucs4(const ushort *wbuf) { uint wc = wbuf[0]; if (0xD800 <= wbuf[0] && wbuf[0] <= 0xDBFF) wc = ((wbuf[0] & 0x3FF) << 10) + (wbuf[1] & 0x3FF) + 0x10000; return wc; } static void ucs4_to_utf16(uint wc, ushort *wbuf, int *wbufsize) { if (wc < 0x10000) { wbuf[0] = wc; *wbufsize = 1; } else { wc -= 0x10000; wbuf[0] = 0xD800 | ((wc >> 10) & 0x3FF); wbuf[1] = 0xDC00 | (wc & 0x3FF); *wbufsize = 2; } } static int is_unicode(int codepage) { return (codepage == 1200 || codepage == 1201 || codepage == 12000 || codepage == 12001 || codepage == 65000 || codepage == 65001); } /* * Check if codepage is one of those for which the dwFlags parameter * to MultiByteToWideChar() must be zero. Return zero or * MB_ERR_INVALID_CHARS. The docs in Platform SDK for for Windows * Server 2003 R2 claims that also codepage 65001 is one of these, but * that doesn't seem to be the case. The MSDN docs for MSVS2008 leave * out 65001 (UTF-8), and that indeed seems to be the case on XP, it * works fine to pass MB_ERR_INVALID_CHARS in dwFlags when converting * from UTF-8. */ static int mbtowc_flags(int codepage) { return (codepage == 50220 || codepage == 50221 || codepage == 50222 || codepage == 50225 || codepage == 50227 || codepage == 50229 || codepage == 52936 || codepage == 54936 || (codepage >= 57002 && codepage <= 57011) || codepage == 65000 || codepage == 42) ? 0 : MB_ERR_INVALID_CHARS; } /* * Check if codepage is one those for which the lpUsedDefaultChar * parameter to WideCharToMultiByte() must be NULL. The docs in * Platform SDK for for Windows Server 2003 R2 claims that this is the * list below, while the MSDN docs for MSVS2008 claim that it is only * for 65000 (UTF-7) and 65001 (UTF-8). This time the earlier Platform * SDK seems to be correct, at least for XP. */ static int must_use_null_useddefaultchar(int codepage) { return (codepage == 65000 || codepage == 65001 || codepage == 50220 || codepage == 50221 || codepage == 50222 || codepage == 50225 || codepage == 50227 || codepage == 50229 || codepage == 52936 || codepage == 54936 || (codepage >= 57002 && codepage <= 57011) || codepage == 42); } static void check_utf_bom(rec_iconv_t *cd, ushort *wbuf, int *wbufsize) { /* If we have a BOM, trust it, despite what the caller said */ if (wbuf[0] == 0xFFFE && (cd->from.flags & FLAG_USE_BOM_ENDIAN)) { /* swap endian: 1200 <-> 1201 or 12000 <-> 12001 */ cd->from.codepage ^= 1; cd->from.mode |= UNICODE_MODE_SWAPPED; wbuf[0] = 0xFEFF; } /* * Remove BOM. * Don't do this if "to" is Unicode, * except if "to" is UTF-8. */ if (wbuf[0] == 0xFEFF && (!is_unicode(cd->to.codepage) || cd->to.codepage == 65001)) *wbufsize = 0; } static char * strrstr(const char *str, const char *token) { int len = strlen(token); const char *p = str + strlen(str); while (str <= --p) if (p[0] == token[0] && strncmp(p, token, len) == 0) return (char *)p; return NULL; } #if defined(USE_LIBICONV_DLL) static int libiconv_iconv_open(rec_iconv_t *cd, const char *fromcode, const char *tocode) { HMODULE hlibiconv = NULL; HMODULE hmsvcrt = NULL; char dllname[_MAX_PATH]; const char *p; const char *e; f_iconv_open _iconv_open; /* * always try to load dll, so that we can switch dll in runtime. */ /* XXX: getenv() can't get variable set by SetEnvironmentVariable() */ p = getenv("WINICONV_LIBICONV_DLL"); if (p == NULL) p = DEFAULT_LIBICONV_DLL; /* parse comma separated value */ for ( ; *p != 0; p = (*e == ',') ? e + 1 : e) { e = strchr(p, ','); if (p == e) continue; else if (e == NULL) e = p + strlen(p); xstrlcpyn(dllname, p, e - p, sizeof(dllname)); hlibiconv = LoadLibrary(dllname); if (hlibiconv != NULL) { if (hlibiconv == hwiniconv) { FreeLibrary(hlibiconv); hlibiconv = NULL; continue; } break; } } if (hlastdll != NULL) { /* decrement reference count */ FreeLibrary(hlastdll); hlastdll = NULL; } if (hlibiconv == NULL) goto failed; hmsvcrt = find_imported_module_by_funcname(hlibiconv, "_errno"); if (hmsvcrt == NULL) goto failed; _iconv_open = (f_iconv_open)GetProcAddress(hlibiconv, "libiconv_open"); if (_iconv_open == NULL) _iconv_open = (f_iconv_open)GetProcAddress(hlibiconv, "iconv_open"); cd->iconv_close = (f_iconv_close)GetProcAddress(hlibiconv, "libiconv_close"); if (cd->iconv_close == NULL) cd->iconv_close = (f_iconv_close)GetProcAddress(hlibiconv, "iconv_close"); cd->iconv = (f_iconv)GetProcAddress(hlibiconv, "libiconv"); if (cd->iconv == NULL) cd->iconv = (f_iconv)GetProcAddress(hlibiconv, "iconv"); cd->_errno = (f_errno)GetProcAddress(hmsvcrt, "_errno"); if (_iconv_open == NULL || cd->iconv_close == NULL || cd->iconv == NULL || cd->_errno == NULL) goto failed; /* increment reference count */ hlastdll = LoadLibrary(dllname); cd->cd = _iconv_open(tocode, fromcode); if (cd->cd == (iconv_t)(-1)) goto failed; cd->hlibiconv = hlibiconv; return TRUE; failed: if (hlibiconv != NULL) FreeLibrary(hlibiconv); /* do not free hmsvcrt which is obtained by GetModuleHandle() */ return FALSE; } /* * Reference: * http://forums.belution.com/ja/vc/000/234/78s.shtml * http://nienie.com/~masapico/api_ImageDirectoryEntryToData.html * * The formal way is * imagehlp.h or dbghelp.h * imagehlp.lib or dbghelp.lib * ImageDirectoryEntryToData() */ #define TO_DOS_HEADER(base) ((PIMAGE_DOS_HEADER)(base)) #define TO_NT_HEADERS(base) ((PIMAGE_NT_HEADERS)((LPBYTE)(base) + TO_DOS_HEADER(base)->e_lfanew)) static PVOID MyImageDirectoryEntryToData(LPVOID Base, BOOLEAN MappedAsImage, USHORT DirectoryEntry, PULONG Size) { /* TODO: MappedAsImage? */ PIMAGE_DATA_DIRECTORY p; p = TO_NT_HEADERS(Base)->OptionalHeader.DataDirectory + DirectoryEntry; if (p->VirtualAddress == 0) { *Size = 0; return NULL; } *Size = p->Size; return (PVOID)((LPBYTE)Base + p->VirtualAddress); } static HMODULE find_imported_module_by_funcname(HMODULE hModule, const char *funcname) { DWORD Base; ULONG Size; PIMAGE_IMPORT_DESCRIPTOR Imp; PIMAGE_THUNK_DATA Name; /* Import Name Table */ PIMAGE_IMPORT_BY_NAME ImpName; Base = (DWORD)hModule; Imp = MyImageDirectoryEntryToData( (LPVOID)Base, TRUE, IMAGE_DIRECTORY_ENTRY_IMPORT, &Size); if (Imp == NULL) return NULL; for ( ; Imp->OriginalFirstThunk != 0; ++Imp) { Name = (PIMAGE_THUNK_DATA)(Base + Imp->OriginalFirstThunk); for ( ; Name->u1.Ordinal != 0; ++Name) { if (!IMAGE_SNAP_BY_ORDINAL(Name->u1.Ordinal)) { ImpName = (PIMAGE_IMPORT_BY_NAME) (Base + (DWORD)Name->u1.AddressOfData); if (strcmp((char *)ImpName->Name, funcname) == 0) return GetModuleHandle((char *)(Base + Imp->Name)); } } } return NULL; } #endif static int sbcs_mblen(csconv_t *cv, const uchar *buf, int bufsize) { return 1; } static int dbcs_mblen(csconv_t *cv, const uchar *buf, int bufsize) { int len = IsDBCSLeadByteEx(cv->codepage, buf[0]) ? 2 : 1; if (bufsize < len) return_error(EINVAL); return len; } static int mbcs_mblen(csconv_t *cv, const uchar *buf, int bufsize) { int len = 0; if (cv->codepage == 54936) { if (buf[0] <= 0x7F) len = 1; else if (buf[0] >= 0x81 && buf[0] <= 0xFE && bufsize >= 2 && ((buf[1] >= 0x40 && buf[1] <= 0x7E) || (buf[1] >= 0x80 && buf[1] <= 0xFE))) len = 2; else if (buf[0] >= 0x81 && buf[0] <= 0xFE && bufsize >= 4 && buf[1] >= 0x30 && buf[1] <= 0x39) len = 4; else return_error(EINVAL); return len; } else return_error(EINVAL); } static int utf8_mblen(csconv_t *cv, const uchar *buf, int bufsize) { int len = 0; if (buf[0] < 0x80) len = 1; else if ((buf[0] & 0xE0) == 0xC0) len = 2; else if ((buf[0] & 0xF0) == 0xE0) len = 3; else if ((buf[0] & 0xF8) == 0xF0) len = 4; else if ((buf[0] & 0xFC) == 0xF8) len = 5; else if ((buf[0] & 0xFE) == 0xFC) len = 6; if (len == 0) return_error(EILSEQ); else if (bufsize < len) return_error(EINVAL); return len; } static int eucjp_mblen(csconv_t *cv, const uchar *buf, int bufsize) { if (buf[0] < 0x80) /* ASCII */ return 1; else if (buf[0] == 0x8E) /* JIS X 0201 */ { if (bufsize < 2) return_error(EINVAL); else if (!(0xA1 <= buf[1] && buf[1] <= 0xDF)) return_error(EILSEQ); return 2; } else if (buf[0] == 0x8F) /* JIS X 0212 */ { if (bufsize < 3) return_error(EINVAL); else if (!(0xA1 <= buf[1] && buf[1] <= 0xFE) || !(0xA1 <= buf[2] && buf[2] <= 0xFE)) return_error(EILSEQ); return 3; } else /* JIS X 0208 */ { if (bufsize < 2) return_error(EINVAL); else if (!(0xA1 <= buf[0] && buf[0] <= 0xFE) || !(0xA1 <= buf[1] && buf[1] <= 0xFE)) return_error(EILSEQ); return 2; } } static int kernel_mbtowc(csconv_t *cv, const uchar *buf, int bufsize, ushort *wbuf, int *wbufsize) { int len; len = cv->mblen(cv, buf, bufsize); if (len == -1) return -1; /* If converting from ASCII, reject 8bit * chars. MultiByteToWideChar() doesn't. Note that for ASCII we * know that the mblen function is sbcs_mblen() so len is 1. */ if (cv->codepage == 20127 && buf[0] >= 0x80) return_error(EILSEQ); *wbufsize = MultiByteToWideChar(cv->codepage, mbtowc_flags (cv->codepage), (const char *)buf, len, (wchar_t *)wbuf, *wbufsize); if (*wbufsize == 0) return_error(EILSEQ); return len; } static int kernel_wctomb(csconv_t *cv, ushort *wbuf, int wbufsize, uchar *buf, int bufsize) { BOOL usedDefaultChar = 0; BOOL *p = NULL; int flags = 0; int len; if (bufsize == 0) return_error(E2BIG); if (!must_use_null_useddefaultchar(cv->codepage)) { p = &usedDefaultChar; #ifdef WC_NO_BEST_FIT_CHARS if (!(cv->flags & FLAG_TRANSLIT)) flags |= WC_NO_BEST_FIT_CHARS; #endif } len = WideCharToMultiByte(cv->codepage, flags, (const wchar_t *)wbuf, wbufsize, (char *)buf, bufsize, NULL, p); if (len == 0) { if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) return_error(E2BIG); return_error(EILSEQ); } else if (usedDefaultChar) return_error(EILSEQ); else if (cv->mblen(cv, buf, len) != len) /* validate result */ return_error(EILSEQ); return len; } /* * It seems that the mode (cv->mode) is fixnum. * For example, when converting iso-2022-jp(cp50221) to unicode: * in ascii sequence: mode=0xC42C0000 * in jisx0208 sequence: mode=0xC42C0001 * "C42C" is same for each convert session. * It should be: ((codepage-1)<<16)|state */ static int mlang_mbtowc(csconv_t *cv, const uchar *buf, int bufsize, ushort *wbuf, int *wbufsize) { int len; int insize; HRESULT hr; len = cv->mblen(cv, buf, bufsize); if (len == -1) return -1; insize = len; hr = ConvertINetMultiByteToUnicode(&cv->mode, cv->codepage, (const char *)buf, &insize, (wchar_t *)wbuf, wbufsize); if (hr != S_OK || insize != len) return_error(EILSEQ); return len; } static int mlang_wctomb(csconv_t *cv, ushort *wbuf, int wbufsize, uchar *buf, int bufsize) { char tmpbuf[MB_CHAR_MAX]; /* enough room for one character */ int tmpsize = MB_CHAR_MAX; int insize = wbufsize; HRESULT hr; hr = ConvertINetUnicodeToMultiByte(&cv->mode, cv->codepage, (const wchar_t *)wbuf, &wbufsize, tmpbuf, &tmpsize); if (hr != S_OK || insize != wbufsize) return_error(EILSEQ); else if (bufsize < tmpsize) return_error(E2BIG); else if (cv->mblen(cv, (uchar *)tmpbuf, tmpsize) != tmpsize) return_error(EILSEQ); memcpy(buf, tmpbuf, tmpsize); return tmpsize; } static int utf16_mbtowc(csconv_t *cv, const uchar *buf, int bufsize, ushort *wbuf, int *wbufsize) { if (bufsize < 2) return_error(EINVAL); if (cv->codepage == 1200) /* little endian */ wbuf[0] = (buf[1] << 8) | buf[0]; else if (cv->codepage == 1201) /* big endian */ wbuf[0] = (buf[0] << 8) | buf[1]; if (0xDC00 <= wbuf[0] && wbuf[0] <= 0xDFFF) return_error(EILSEQ); if (0xD800 <= wbuf[0] && wbuf[0] <= 0xDBFF) { if (bufsize < 4) return_error(EINVAL); if (cv->codepage == 1200) /* little endian */ wbuf[1] = (buf[3] << 8) | buf[2]; else if (cv->codepage == 1201) /* big endian */ wbuf[1] = (buf[2] << 8) | buf[3]; if (!(0xDC00 <= wbuf[1] && wbuf[1] <= 0xDFFF)) return_error(EILSEQ); *wbufsize = 2; return 4; } *wbufsize = 1; return 2; } static int utf16_wctomb(csconv_t *cv, ushort *wbuf, int wbufsize, uchar *buf, int bufsize) { if (bufsize < 2) return_error(E2BIG); if (cv->codepage == 1200) /* little endian */ { buf[0] = (wbuf[0] & 0x00FF); buf[1] = (wbuf[0] & 0xFF00) >> 8; } else if (cv->codepage == 1201) /* big endian */ { buf[0] = (wbuf[0] & 0xFF00) >> 8; buf[1] = (wbuf[0] & 0x00FF); } if (0xD800 <= wbuf[0] && wbuf[0] <= 0xDBFF) { if (bufsize < 4) return_error(E2BIG); if (cv->codepage == 1200) /* little endian */ { buf[2] = (wbuf[1] & 0x00FF); buf[3] = (wbuf[1] & 0xFF00) >> 8; } else if (cv->codepage == 1201) /* big endian */ { buf[2] = (wbuf[1] & 0xFF00) >> 8; buf[3] = (wbuf[1] & 0x00FF); } return 4; } return 2; } static int utf32_mbtowc(csconv_t *cv, const uchar *buf, int bufsize, ushort *wbuf, int *wbufsize) { uint wc; if (bufsize < 4) return_error(EINVAL); if (cv->codepage == 12000) /* little endian */ wc = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0]; else if (cv->codepage == 12001) /* big endian */ wc = (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3]; if ((0xD800 <= wc && wc <= 0xDFFF) || 0x10FFFF < wc) return_error(EILSEQ); ucs4_to_utf16(wc, wbuf, wbufsize); return 4; } static int utf32_wctomb(csconv_t *cv, ushort *wbuf, int wbufsize, uchar *buf, int bufsize) { uint wc; if (bufsize < 4) return_error(E2BIG); wc = utf16_to_ucs4(wbuf); if (cv->codepage == 12000) /* little endian */ { buf[0] = wc & 0x000000FF; buf[1] = (wc & 0x0000FF00) >> 8; buf[2] = (wc & 0x00FF0000) >> 16; buf[3] = (wc & 0xFF000000) >> 24; } else if (cv->codepage == 12001) /* big endian */ { buf[0] = (wc & 0xFF000000) >> 24; buf[1] = (wc & 0x00FF0000) >> 16; buf[2] = (wc & 0x0000FF00) >> 8; buf[3] = wc & 0x000000FF; } return 4; } /* * 50220: ISO 2022 Japanese with no halfwidth Katakana; Japanese (JIS) * 50221: ISO 2022 Japanese with halfwidth Katakana; Japanese (JIS-Allow * 1 byte Kana) * 50222: ISO 2022 Japanese JIS X 0201-1989; Japanese (JIS-Allow 1 byte * Kana - SO/SI) * * MultiByteToWideChar() and WideCharToMultiByte() behave differently * depending on Windows version. On XP, WideCharToMultiByte() doesn't * terminate result sequence with ascii escape. But Vista does. * Use MLang instead. */ #define ISO2022_MODE(cs, shift) (((cs) << 8) | (shift)) #define ISO2022_MODE_CS(mode) (((mode) >> 8) & 0xFF) #define ISO2022_MODE_SHIFT(mode) ((mode) & 0xFF) #define ISO2022_SI 0 #define ISO2022_SO 1 /* shift in */ static const char iso2022_SI_seq[] = "\x0F"; /* shift out */ static const char iso2022_SO_seq[] = "\x0E"; typedef struct iso2022_esc_t iso2022_esc_t; struct iso2022_esc_t { const char *esc; int esc_len; int len; int cs; }; #define ISO2022JP_CS_ASCII 0 #define ISO2022JP_CS_JISX0201_ROMAN 1 #define ISO2022JP_CS_JISX0201_KANA 2 #define ISO2022JP_CS_JISX0208_1978 3 #define ISO2022JP_CS_JISX0208_1983 4 #define ISO2022JP_CS_JISX0212 5 static iso2022_esc_t iso2022jp_esc[] = { {"\x1B\x28\x42", 3, 1, ISO2022JP_CS_ASCII}, {"\x1B\x28\x4A", 3, 1, ISO2022JP_CS_JISX0201_ROMAN}, {"\x1B\x28\x49", 3, 1, ISO2022JP_CS_JISX0201_KANA}, {"\x1B\x24\x40", 3, 2, ISO2022JP_CS_JISX0208_1983}, /* unify 1978 with 1983 */ {"\x1B\x24\x42", 3, 2, ISO2022JP_CS_JISX0208_1983}, {"\x1B\x24\x28\x44", 4, 2, ISO2022JP_CS_JISX0212}, {NULL, 0, 0, 0} }; static int iso2022jp_mbtowc(csconv_t *cv, const uchar *buf, int bufsize, ushort *wbuf, int *wbufsize) { iso2022_esc_t *iesc = iso2022jp_esc; char tmp[MB_CHAR_MAX]; int insize; HRESULT hr; DWORD dummy = 0; int len; int esc_len; int cs; int shift; int i; if (buf[0] == 0x1B) { for (i = 0; iesc[i].esc != NULL; ++i) { esc_len = iesc[i].esc_len; if (bufsize < esc_len) { if (strncmp((char *)buf, iesc[i].esc, bufsize) == 0) return_error(EINVAL); } else { if (strncmp((char *)buf, iesc[i].esc, esc_len) == 0) { cv->mode = ISO2022_MODE(iesc[i].cs, ISO2022_SI); *wbufsize = 0; return esc_len; } } } /* not supported escape sequence */ return_error(EILSEQ); } else if (buf[0] == iso2022_SO_seq[0]) { cv->mode = ISO2022_MODE(ISO2022_MODE_CS(cv->mode), ISO2022_SO); *wbufsize = 0; return 1; } else if (buf[0] == iso2022_SI_seq[0]) { cv->mode = ISO2022_MODE(ISO2022_MODE_CS(cv->mode), ISO2022_SI); *wbufsize = 0; return 1; } cs = ISO2022_MODE_CS(cv->mode); shift = ISO2022_MODE_SHIFT(cv->mode); /* reset the mode for informal sequence */ if (buf[0] < 0x20) { cs = ISO2022JP_CS_ASCII; shift = ISO2022_SI; } len = iesc[cs].len; if (bufsize < len) return_error(EINVAL); for (i = 0; i < len; ++i) if (!(buf[i] < 0x80)) return_error(EILSEQ); esc_len = iesc[cs].esc_len; memcpy(tmp, iesc[cs].esc, esc_len); if (shift == ISO2022_SO) { memcpy(tmp + esc_len, iso2022_SO_seq, 1); esc_len += 1; } memcpy(tmp + esc_len, buf, len); if ((cv->codepage == 50220 || cv->codepage == 50221 || cv->codepage == 50222) && shift == ISO2022_SO) { /* XXX: shift-out cannot be used for mbtowc (both kernel and * mlang) */ esc_len = iesc[ISO2022JP_CS_JISX0201_KANA].esc_len; memcpy(tmp, iesc[ISO2022JP_CS_JISX0201_KANA].esc, esc_len); memcpy(tmp + esc_len, buf, len); } insize = len + esc_len; hr = ConvertINetMultiByteToUnicode(&dummy, cv->codepage, (const char *)tmp, &insize, (wchar_t *)wbuf, wbufsize); if (hr != S_OK || insize != len + esc_len) return_error(EILSEQ); /* Check for conversion error. Assuming defaultChar is 0x3F. */ /* ascii should be converted from ascii */ if (wbuf[0] == buf[0] && cv->mode != ISO2022_MODE(ISO2022JP_CS_ASCII, ISO2022_SI)) return_error(EILSEQ); /* reset the mode for informal sequence */ if (cv->mode != ISO2022_MODE(cs, shift)) cv->mode = ISO2022_MODE(cs, shift); return len; } static int iso2022jp_wctomb(csconv_t *cv, ushort *wbuf, int wbufsize, uchar *buf, int bufsize) { iso2022_esc_t *iesc = iso2022jp_esc; char tmp[MB_CHAR_MAX]; int tmpsize = MB_CHAR_MAX; int insize = wbufsize; HRESULT hr; DWORD dummy = 0; int len; int esc_len; int cs; int shift; int i; /* * MultiByte = [escape sequence] + character + [escape sequence] * * Whether trailing escape sequence is added depends on which API is * used (kernel or MLang, and its version). */ hr = ConvertINetUnicodeToMultiByte(&dummy, cv->codepage, (const wchar_t *)wbuf, &wbufsize, tmp, &tmpsize); if (hr != S_OK || insize != wbufsize) return_error(EILSEQ); else if (bufsize < tmpsize) return_error(E2BIG); if (tmpsize == 1) { cs = ISO2022JP_CS_ASCII; esc_len = 0; } else { for (i = 1; iesc[i].esc != NULL; ++i) { esc_len = iesc[i].esc_len; if (strncmp(tmp, iesc[i].esc, esc_len) == 0) { cs = iesc[i].cs; break; } } if (iesc[i].esc == NULL) /* not supported escape sequence */ return_error(EILSEQ); } shift = ISO2022_SI; if (tmp[esc_len] == iso2022_SO_seq[0]) { shift = ISO2022_SO; esc_len += 1; } len = iesc[cs].len; /* Check for converting error. Assuming defaultChar is 0x3F. */ /* ascii should be converted from ascii */ if (cs == ISO2022JP_CS_ASCII && !(wbuf[0] < 0x80)) return_error(EILSEQ); else if (tmpsize < esc_len + len) return_error(EILSEQ); if (cv->mode == ISO2022_MODE(cs, shift)) { /* remove escape sequence */ if (esc_len != 0) memmove(tmp, tmp + esc_len, len); esc_len = 0; } else { if (cs == ISO2022JP_CS_ASCII) { esc_len = iesc[ISO2022JP_CS_ASCII].esc_len; memmove(tmp + esc_len, tmp, len); memcpy(tmp, iesc[ISO2022JP_CS_ASCII].esc, esc_len); } if (ISO2022_MODE_SHIFT(cv->mode) == ISO2022_SO) { /* shift-in before changing to other mode */ memmove(tmp + 1, tmp, len + esc_len); memcpy(tmp, iso2022_SI_seq, 1); esc_len += 1; } } if (bufsize < len + esc_len) return_error(E2BIG); memcpy(buf, tmp, len + esc_len); cv->mode = ISO2022_MODE(cs, shift); return len + esc_len; } static int iso2022jp_flush(csconv_t *cv, uchar *buf, int bufsize) { iso2022_esc_t *iesc = iso2022jp_esc; int esc_len; if (cv->mode != ISO2022_MODE(ISO2022JP_CS_ASCII, ISO2022_SI)) { esc_len = 0; if (ISO2022_MODE_SHIFT(cv->mode) != ISO2022_SI) esc_len += 1; if (ISO2022_MODE_CS(cv->mode) != ISO2022JP_CS_ASCII) esc_len += iesc[ISO2022JP_CS_ASCII].esc_len; if (bufsize < esc_len) return_error(E2BIG); esc_len = 0; if (ISO2022_MODE_SHIFT(cv->mode) != ISO2022_SI) { memcpy(buf, iso2022_SI_seq, 1); esc_len += 1; } if (ISO2022_MODE_CS(cv->mode) != ISO2022JP_CS_ASCII) { memcpy(buf + esc_len, iesc[ISO2022JP_CS_ASCII].esc, iesc[ISO2022JP_CS_ASCII].esc_len); esc_len += iesc[ISO2022JP_CS_ASCII].esc_len; } return esc_len; } return 0; } #if defined(MAKE_DLL) && defined(USE_LIBICONV_DLL) BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved) { switch( fdwReason ) { case DLL_PROCESS_ATTACH: hwiniconv = (HMODULE)hinstDLL; break; case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; } #endif #if defined(MAKE_EXE) #include #include #include int main(int argc, char **argv) { char *fromcode = NULL; char *tocode = NULL; int i; char inbuf[BUFSIZ]; char outbuf[BUFSIZ]; const char *pin; char *pout; size_t inbytesleft; size_t outbytesleft; size_t rest = 0; iconv_t cd; size_t r; FILE *in = stdin; _setmode(_fileno(stdin), _O_BINARY); _setmode(_fileno(stdout), _O_BINARY); for (i = 1; i < argc; ++i) { if (strcmp(argv[i], "-l") == 0) { for (i = 0; codepage_alias[i].name != NULL; ++i) printf("%s\n", codepage_alias[i].name); return 0; } if (strcmp(argv[i], "-f") == 0) fromcode = argv[++i]; else if (strcmp(argv[i], "-t") == 0) tocode = argv[++i]; else { in = fopen(argv[i], "rb"); if (in == NULL) { fprintf(stderr, "cannot open %s\n", argv[i]); return 1; } break; } } if (fromcode == NULL || tocode == NULL) { printf("usage: %s -f from-enc -t to-enc [file]\n", argv[0]); return 0; } cd = iconv_open(tocode, fromcode); if (cd == (iconv_t)(-1)) { perror("iconv_open error"); return 1; } while ((inbytesleft = fread(inbuf + rest, 1, sizeof(inbuf) - rest, in)) != 0 || rest != 0) { inbytesleft += rest; pin = inbuf; pout = outbuf; outbytesleft = sizeof(outbuf); r = iconv(cd, &pin, &inbytesleft, &pout, &outbytesleft); fwrite(outbuf, 1, sizeof(outbuf) - outbytesleft, stdout); if (r == (size_t)(-1) && errno != EINVAL && errno != E2BIG) { perror("conversion error"); return 1; } memmove(inbuf, pin, inbytesleft); rest = inbytesleft; } pout = outbuf; outbytesleft = sizeof(outbuf); r = iconv(cd, NULL, NULL, &pout, &outbytesleft); fwrite(outbuf, 1, sizeof(outbuf) - outbytesleft, stdout); if (r == (size_t)(-1)) { perror("conversion error"); return 1; } iconv_close(cd); return 0; } #endif pkg-config-0.29.1/glib/glib/gmirroringtable.h0000664000175000017500000006716212275467762016002 00000000000000/* gmirroringtable.h * generated by gen-mirroring-tab * from the file BidiMirroring.txt of */ #define PACKTAB_UINT8 guint8 #define PACKTAB_UINT16 guint16 #define PACKTAB_UINT32 guint32 /* generated by packtab.c version 3 use GLIB_GET_MIRRORING_DELTA(key) to access your table assumed sizeof(gint16): 2 required memory: 1008 lookups: 4 partition shape: Mir[256][16][4][4] different table entries: 1 14 56 38 */ /* *INDENT-OFF* */ static const gint16 MirLev3[4*38] = { #define MirLev3_0000 0x0 0,0,0,0, #define MirLev3_0028 0x4 1,-1,0,0, #define MirLev3_003C 0x8 2,0,-2,0, #define MirLev3_0058 0xC 0,0,0,2, #define MirLev3_005C 0x10 0,-2,0,0, #define MirLev3_00A8 0x14 0,0,0,16, #define MirLev3_00B8 0x18 0,0,0,-16, #define MirLev3_0F38 0x1C 0,0,1,-1, #define MirLev3_1698 0x20 0,0,0,1, #define MirLev3_169C 0x24 -1,0,0,0, #define MirLev3_2038 0x28 0,1,-1,0, #define MirLev3_2208 0x2C 3,3,3,-3, #define MirLev3_220C 0x30 -3,-3,0,0, #define MirLev3_2214 0x34 0,2016,0,0, #define MirLev3_2240 0x38 0,0,0,138, #define MirLev3_2264 0x3C 1,-1,1,-1, #define MirLev3_2290 0x40 -1,1,-1,0, #define MirLev3_2298 0x44 1824,0,0,0, #define MirLev3_22A4 0x48 0,0,2104,0, #define MirLev3_22A8 0x4C 2108,2106,0,2106, #define MirLev3_22C8 0x50 0,1,-1,1, #define MirLev3_22CC 0x54 -1,-138,0,0, #define MirLev3_22F0 0x58 1,-1,8,8, #define MirLev3_22F4 0x5C 8,0,7,7, #define MirLev3_22F8 0x60 0,0,-8,-8, #define MirLev3_22FC 0x64 -8,-7,-7,0, #define MirLev3_2984 0x68 -1,1,-1,1, #define MirLev3_298C 0x6C -1,3,1,-1, #define MirLev3_2990 0x70 -3,1,-1,1, #define MirLev3_29B8 0x74 -1824,0,0,0, #define MirLev3_29F4 0x78 0,-2016,0,0, #define MirLev3_2AAC 0x7C 1,-1,0,1, #define MirLev3_2AB0 0x80 -1,0,0,1, #define MirLev3_2ADC 0x84 0,0,-2104,0, #define MirLev3_2AE0 0x88 0,0,0,-2106, #define MirLev3_2AE4 0x8C -2108,-2106,0,0, #define MirLev3_FF5C 0x90 0,-2,0,1, #define MirLev3_FF60 0x94 -1,0,1,-1, }; static const PACKTAB_UINT8 MirLev2[4*56] = { #define MirLev2_0000 0x0 MirLev3_0000, /* 0000..0003 */ MirLev3_0000, /* 0004..0007 */ MirLev3_0000, /* 0008..000B */ MirLev3_0000, /* 000C..000F */ #define MirLev2_0020 0x4 MirLev3_0000, /* 0020..0023 */ MirLev3_0000, /* 0024..0027 */ MirLev3_0028, /* 0028..002B */ MirLev3_0000, /* 002C..002F */ #define MirLev2_0030 0x8 MirLev3_0000, /* 0030..0033 */ MirLev3_0000, /* 0034..0037 */ MirLev3_0000, /* 0038..003B */ MirLev3_003C, /* 003C..003F */ #define MirLev2_0050 0xC MirLev3_0000, /* 0050..0053 */ MirLev3_0000, /* 0054..0057 */ MirLev3_0058, /* 0058..005B */ MirLev3_005C, /* 005C..005F */ #define MirLev2_00A0 0x10 MirLev3_0000, /* 00A0..00A3 */ MirLev3_0000, /* 00A4..00A7 */ MirLev3_00A8, /* 00A8..00AB */ MirLev3_0000, /* 00AC..00AF */ #define MirLev2_00B0 0x14 MirLev3_0000, /* 00B0..00B3 */ MirLev3_0000, /* 00B4..00B7 */ MirLev3_00B8, /* 00B8..00BB */ MirLev3_0000, /* 00BC..00BF */ #define MirLev2_0F30 0x18 MirLev3_0000, /* 0F30..0F33 */ MirLev3_0000, /* 0F34..0F37 */ MirLev3_0F38, /* 0F38..0F3B */ MirLev3_0028, /* 0F3C..0F3F */ #define MirLev2_1690 0x1C MirLev3_0000, /* 1690..1693 */ MirLev3_0000, /* 1694..1697 */ MirLev3_1698, /* 1698..169B */ MirLev3_169C, /* 169C..169F */ #define MirLev2_2030 0x20 MirLev3_0000, /* 2030..2033 */ MirLev3_0000, /* 2034..2037 */ MirLev3_2038, /* 2038..203B */ MirLev3_0000, /* 203C..203F */ #define MirLev2_2040 0x24 MirLev3_0000, /* 2040..2043 */ MirLev3_2038, /* 2044..2047 */ MirLev3_0000, /* 2048..204B */ MirLev3_0000, /* 204C..204F */ #define MirLev2_2070 0x28 MirLev3_0000, /* 2070..2073 */ MirLev3_0000, /* 2074..2077 */ MirLev3_0000, /* 2078..207B */ MirLev3_2038, /* 207C..207F */ #define MirLev2_2200 0x2C MirLev3_0000, /* 2200..2203 */ MirLev3_0000, /* 2204..2207 */ MirLev3_2208, /* 2208..220B */ MirLev3_220C, /* 220C..220F */ #define MirLev2_2210 0x30 MirLev3_0000, /* 2210..2213 */ MirLev3_2214, /* 2214..2217 */ MirLev3_0000, /* 2218..221B */ MirLev3_0000, /* 221C..221F */ #define MirLev2_2230 0x34 MirLev3_0000, /* 2230..2233 */ MirLev3_0000, /* 2234..2237 */ MirLev3_0000, /* 2238..223B */ MirLev3_0028, /* 223C..223F */ #define MirLev2_2240 0x38 MirLev3_2240, /* 2240..2243 */ MirLev3_0000, /* 2244..2247 */ MirLev3_0000, /* 2248..224B */ MirLev3_0000, /* 224C..224F */ #define MirLev2_2250 0x3C MirLev3_0F38, /* 2250..2253 */ MirLev3_0028, /* 2254..2257 */ MirLev3_0000, /* 2258..225B */ MirLev3_0000, /* 225C..225F */ #define MirLev2_2260 0x40 MirLev3_0000, /* 2260..2263 */ MirLev3_2264, /* 2264..2267 */ MirLev3_2264, /* 2268..226B */ MirLev3_0F38, /* 226C..226F */ #define MirLev2_2270 0x44 MirLev3_2264, /* 2270..2273 */ MirLev3_2264, /* 2274..2277 */ MirLev3_2264, /* 2278..227B */ MirLev3_2264, /* 227C..227F */ #define MirLev2_2280 0x48 MirLev3_2264, /* 2280..2283 */ MirLev3_2264, /* 2284..2287 */ MirLev3_2264, /* 2288..228B */ MirLev3_1698, /* 228C..228F */ #define MirLev2_2290 0x4C MirLev3_2290, /* 2290..2293 */ MirLev3_0000, /* 2294..2297 */ MirLev3_2298, /* 2298..229B */ MirLev3_0000, /* 229C..229F */ #define MirLev2_22A0 0x50 MirLev3_0F38, /* 22A0..22A3 */ MirLev3_22A4, /* 22A4..22A7 */ MirLev3_22A8, /* 22A8..22AB */ MirLev3_0000, /* 22AC..22AF */ #define MirLev2_22B0 0x54 MirLev3_2264, /* 22B0..22B3 */ MirLev3_2264, /* 22B4..22B7 */ MirLev3_0000, /* 22B8..22BB */ MirLev3_0000, /* 22BC..22BF */ #define MirLev2_22C0 0x58 MirLev3_0000, /* 22C0..22C3 */ MirLev3_0000, /* 22C4..22C7 */ MirLev3_22C8, /* 22C8..22CB */ MirLev3_22CC, /* 22CC..22CF */ #define MirLev2_22D0 0x5C MirLev3_0028, /* 22D0..22D3 */ MirLev3_0F38, /* 22D4..22D7 */ MirLev3_2264, /* 22D8..22DB */ MirLev3_2264, /* 22DC..22DF */ #define MirLev2_22E0 0x60 MirLev3_2264, /* 22E0..22E3 */ MirLev3_2264, /* 22E4..22E7 */ MirLev3_2264, /* 22E8..22EB */ MirLev3_0028, /* 22EC..22EF */ #define MirLev2_22F0 0x64 MirLev3_22F0, /* 22F0..22F3 */ MirLev3_22F4, /* 22F4..22F7 */ MirLev3_22F8, /* 22F8..22FB */ MirLev3_22FC, /* 22FC..22FF */ #define MirLev2_2300 0x68 MirLev3_0000, /* 2300..2303 */ MirLev3_0000, /* 2304..2307 */ MirLev3_2264, /* 2308..230B */ MirLev3_0000, /* 230C..230F */ #define MirLev2_2760 0x6C MirLev3_0000, /* 2760..2763 */ MirLev3_0000, /* 2764..2767 */ MirLev3_2264, /* 2768..276B */ MirLev3_2264, /* 276C..276F */ #define MirLev2_2770 0x70 MirLev3_2264, /* 2770..2773 */ MirLev3_0028, /* 2774..2777 */ MirLev3_0000, /* 2778..277B */ MirLev3_0000, /* 277C..277F */ #define MirLev2_27C0 0x74 MirLev3_1698, /* 27C0..27C3 */ MirLev3_2290, /* 27C4..27C7 */ MirLev3_0028, /* 27C8..27CB */ MirLev3_0000, /* 27CC..27CF */ #define MirLev2_27D0 0x78 MirLev3_0000, /* 27D0..27D3 */ MirLev3_2038, /* 27D4..27D7 */ MirLev3_0000, /* 27D8..27DB */ MirLev3_2038, /* 27DC..27DF */ #define MirLev2_27E0 0x7C MirLev3_0F38, /* 27E0..27E3 */ MirLev3_2264, /* 27E4..27E7 */ MirLev3_2264, /* 27E8..27EB */ MirLev3_2264, /* 27EC..27EF */ #define MirLev2_2980 0x80 MirLev3_1698, /* 2980..2983 */ MirLev3_2984, /* 2984..2987 */ MirLev3_2984, /* 2988..298B */ MirLev3_298C, /* 298C..298F */ #define MirLev2_2990 0x84 MirLev3_2990, /* 2990..2993 */ MirLev3_2984, /* 2994..2997 */ MirLev3_169C, /* 2998..299B */ MirLev3_0000, /* 299C..299F */ #define MirLev2_29B0 0x88 MirLev3_0000, /* 29B0..29B3 */ MirLev3_0000, /* 29B4..29B7 */ MirLev3_29B8, /* 29B8..29BB */ MirLev3_0000, /* 29BC..29BF */ #define MirLev2_29C0 0x8C MirLev3_0028, /* 29C0..29C3 */ MirLev3_0028, /* 29C4..29C7 */ MirLev3_0000, /* 29C8..29CB */ MirLev3_1698, /* 29CC..29CF */ #define MirLev2_29D0 0x90 MirLev3_2290, /* 29D0..29D3 */ MirLev3_0028, /* 29D4..29D7 */ MirLev3_2264, /* 29D8..29DB */ MirLev3_0000, /* 29DC..29DF */ #define MirLev2_29F0 0x94 MirLev3_0000, /* 29F0..29F3 */ MirLev3_29F4, /* 29F4..29F7 */ MirLev3_0028, /* 29F8..29FB */ MirLev3_0028, /* 29FC..29FF */ #define MirLev2_2A20 0x98 MirLev3_0000, /* 2A20..2A23 */ MirLev3_0000, /* 2A24..2A27 */ MirLev3_1698, /* 2A28..2A2B */ MirLev3_2290, /* 2A2C..2A2F */ #define MirLev2_2A30 0x9C MirLev3_0000, /* 2A30..2A33 */ MirLev3_0028, /* 2A34..2A37 */ MirLev3_0000, /* 2A38..2A3B */ MirLev3_0028, /* 2A3C..2A3F */ #define MirLev2_2A60 0xA0 MirLev3_0000, /* 2A60..2A63 */ MirLev3_0028, /* 2A64..2A67 */ MirLev3_0000, /* 2A68..2A6B */ MirLev3_0000, /* 2A6C..2A6F */ #define MirLev2_2A70 0xA4 MirLev3_0000, /* 2A70..2A73 */ MirLev3_0000, /* 2A74..2A77 */ MirLev3_2038, /* 2A78..2A7B */ MirLev3_22C8, /* 2A7C..2A7F */ #define MirLev2_2A80 0xA8 MirLev3_2984, /* 2A80..2A83 */ MirLev3_169C, /* 2A84..2A87 */ MirLev3_1698, /* 2A88..2A8B */ MirLev3_169C, /* 2A8C..2A8F */ #define MirLev2_2A90 0xAC MirLev3_22C8, /* 2A90..2A93 */ MirLev3_2984, /* 2A94..2A97 */ MirLev3_2984, /* 2A98..2A9B */ MirLev3_169C, /* 2A9C..2A9F */ #define MirLev2_2AA0 0xB0 MirLev3_2038, /* 2AA0..2AA3 */ MirLev3_0F38, /* 2AA4..2AA7 */ MirLev3_2264, /* 2AA8..2AAB */ MirLev3_2AAC, /* 2AAC..2AAF */ #define MirLev2_2AB0 0xB4 MirLev3_2AB0, /* 2AB0..2AB3 */ MirLev3_169C, /* 2AB4..2AB7 */ MirLev3_1698, /* 2AB8..2ABB */ MirLev3_2984, /* 2ABC..2ABF */ #define MirLev2_2AC0 0xB8 MirLev3_2984, /* 2AC0..2AC3 */ MirLev3_2290, /* 2AC4..2AC7 */ MirLev3_0000, /* 2AC8..2ACB */ MirLev3_22C8, /* 2ACC..2ACF */ #define MirLev2_2AD0 0xBC MirLev3_2984, /* 2AD0..2AD3 */ MirLev3_2290, /* 2AD4..2AD7 */ MirLev3_0000, /* 2AD8..2ADB */ MirLev3_2ADC, /* 2ADC..2ADF */ #define MirLev2_2AE0 0xC0 MirLev3_2AE0, /* 2AE0..2AE3 */ MirLev3_2AE4, /* 2AE4..2AE7 */ MirLev3_0000, /* 2AE8..2AEB */ MirLev3_0028, /* 2AEC..2AEF */ #define MirLev2_2AF0 0xC4 MirLev3_0000, /* 2AF0..2AF3 */ MirLev3_1698, /* 2AF4..2AF7 */ MirLev3_2290, /* 2AF8..2AFB */ MirLev3_0000, /* 2AFC..2AFF */ #define MirLev2_2E00 0xC8 MirLev3_0F38, /* 2E00..2E03 */ MirLev3_0028, /* 2E04..2E07 */ MirLev3_2038, /* 2E08..2E0B */ MirLev3_0028, /* 2E0C..2E0F */ #define MirLev2_2E20 0xCC MirLev3_2264, /* 2E20..2E23 */ MirLev3_2264, /* 2E24..2E27 */ MirLev3_0028, /* 2E28..2E2B */ MirLev3_0000, /* 2E2C..2E2F */ #define MirLev2_3010 0xD0 MirLev3_0028, /* 3010..3013 */ MirLev3_2264, /* 3014..3017 */ MirLev3_2264, /* 3018..301B */ MirLev3_0000, /* 301C..301F */ #define MirLev2_FE50 0xD4 MirLev3_0000, /* FE50..FE53 */ MirLev3_0000, /* FE54..FE57 */ MirLev3_22C8, /* FE58..FE5B */ MirLev3_2290, /* FE5C..FE5F */ #define MirLev2_FF50 0xD8 MirLev3_0000, /* FF50..FF53 */ MirLev3_0000, /* FF54..FF57 */ MirLev3_0058, /* FF58..FF5B */ MirLev3_FF5C, /* FF5C..FF5F */ #define MirLev2_FF60 0xDC MirLev3_FF60, /* FF60..FF63 */ MirLev3_0000, /* FF64..FF67 */ MirLev3_0000, /* FF68..FF6B */ MirLev3_0000, /* FF6C..FF6F */ }; static const PACKTAB_UINT8 MirLev1[16*14] = { #define MirLev1_0000 0x0 MirLev2_0000, /* 0000..000F */ MirLev2_0000, /* 0010..001F */ MirLev2_0020, /* 0020..002F */ MirLev2_0030, /* 0030..003F */ MirLev2_0000, /* 0040..004F */ MirLev2_0050, /* 0050..005F */ MirLev2_0000, /* 0060..006F */ MirLev2_0050, /* 0070..007F */ MirLev2_0000, /* 0080..008F */ MirLev2_0000, /* 0090..009F */ MirLev2_00A0, /* 00A0..00AF */ MirLev2_00B0, /* 00B0..00BF */ MirLev2_0000, /* 00C0..00CF */ MirLev2_0000, /* 00D0..00DF */ MirLev2_0000, /* 00E0..00EF */ MirLev2_0000, /* 00F0..00FF */ #define MirLev1_0100 0x10 MirLev2_0000, /* 0100..010F */ MirLev2_0000, /* 0110..011F */ MirLev2_0000, /* 0120..012F */ MirLev2_0000, /* 0130..013F */ MirLev2_0000, /* 0140..014F */ MirLev2_0000, /* 0150..015F */ MirLev2_0000, /* 0160..016F */ MirLev2_0000, /* 0170..017F */ MirLev2_0000, /* 0180..018F */ MirLev2_0000, /* 0190..019F */ MirLev2_0000, /* 01A0..01AF */ MirLev2_0000, /* 01B0..01BF */ MirLev2_0000, /* 01C0..01CF */ MirLev2_0000, /* 01D0..01DF */ MirLev2_0000, /* 01E0..01EF */ MirLev2_0000, /* 01F0..01FF */ #define MirLev1_0F00 0x20 MirLev2_0000, /* 0F00..0F0F */ MirLev2_0000, /* 0F10..0F1F */ MirLev2_0000, /* 0F20..0F2F */ MirLev2_0F30, /* 0F30..0F3F */ MirLev2_0000, /* 0F40..0F4F */ MirLev2_0000, /* 0F50..0F5F */ MirLev2_0000, /* 0F60..0F6F */ MirLev2_0000, /* 0F70..0F7F */ MirLev2_0000, /* 0F80..0F8F */ MirLev2_0000, /* 0F90..0F9F */ MirLev2_0000, /* 0FA0..0FAF */ MirLev2_0000, /* 0FB0..0FBF */ MirLev2_0000, /* 0FC0..0FCF */ MirLev2_0000, /* 0FD0..0FDF */ MirLev2_0000, /* 0FE0..0FEF */ MirLev2_0000, /* 0FF0..0FFF */ #define MirLev1_1600 0x30 MirLev2_0000, /* 1600..160F */ MirLev2_0000, /* 1610..161F */ MirLev2_0000, /* 1620..162F */ MirLev2_0000, /* 1630..163F */ MirLev2_0000, /* 1640..164F */ MirLev2_0000, /* 1650..165F */ MirLev2_0000, /* 1660..166F */ MirLev2_0000, /* 1670..167F */ MirLev2_0000, /* 1680..168F */ MirLev2_1690, /* 1690..169F */ MirLev2_0000, /* 16A0..16AF */ MirLev2_0000, /* 16B0..16BF */ MirLev2_0000, /* 16C0..16CF */ MirLev2_0000, /* 16D0..16DF */ MirLev2_0000, /* 16E0..16EF */ MirLev2_0000, /* 16F0..16FF */ #define MirLev1_2000 0x40 MirLev2_0000, /* 2000..200F */ MirLev2_0000, /* 2010..201F */ MirLev2_0000, /* 2020..202F */ MirLev2_2030, /* 2030..203F */ MirLev2_2040, /* 2040..204F */ MirLev2_0000, /* 2050..205F */ MirLev2_0000, /* 2060..206F */ MirLev2_2070, /* 2070..207F */ MirLev2_2070, /* 2080..208F */ MirLev2_0000, /* 2090..209F */ MirLev2_0000, /* 20A0..20AF */ MirLev2_0000, /* 20B0..20BF */ MirLev2_0000, /* 20C0..20CF */ MirLev2_0000, /* 20D0..20DF */ MirLev2_0000, /* 20E0..20EF */ MirLev2_0000, /* 20F0..20FF */ #define MirLev1_2200 0x50 MirLev2_2200, /* 2200..220F */ MirLev2_2210, /* 2210..221F */ MirLev2_0000, /* 2220..222F */ MirLev2_2230, /* 2230..223F */ MirLev2_2240, /* 2240..224F */ MirLev2_2250, /* 2250..225F */ MirLev2_2260, /* 2260..226F */ MirLev2_2270, /* 2270..227F */ MirLev2_2280, /* 2280..228F */ MirLev2_2290, /* 2290..229F */ MirLev2_22A0, /* 22A0..22AF */ MirLev2_22B0, /* 22B0..22BF */ MirLev2_22C0, /* 22C0..22CF */ MirLev2_22D0, /* 22D0..22DF */ MirLev2_22E0, /* 22E0..22EF */ MirLev2_22F0, /* 22F0..22FF */ #define MirLev1_2300 0x60 MirLev2_2300, /* 2300..230F */ MirLev2_0000, /* 2310..231F */ MirLev2_2030, /* 2320..232F */ MirLev2_0000, /* 2330..233F */ MirLev2_0000, /* 2340..234F */ MirLev2_0000, /* 2350..235F */ MirLev2_0000, /* 2360..236F */ MirLev2_0000, /* 2370..237F */ MirLev2_0000, /* 2380..238F */ MirLev2_0000, /* 2390..239F */ MirLev2_0000, /* 23A0..23AF */ MirLev2_0000, /* 23B0..23BF */ MirLev2_0000, /* 23C0..23CF */ MirLev2_0000, /* 23D0..23DF */ MirLev2_0000, /* 23E0..23EF */ MirLev2_0000, /* 23F0..23FF */ #define MirLev1_2700 0x70 MirLev2_0000, /* 2700..270F */ MirLev2_0000, /* 2710..271F */ MirLev2_0000, /* 2720..272F */ MirLev2_0000, /* 2730..273F */ MirLev2_0000, /* 2740..274F */ MirLev2_0000, /* 2750..275F */ MirLev2_2760, /* 2760..276F */ MirLev2_2770, /* 2770..277F */ MirLev2_0000, /* 2780..278F */ MirLev2_0000, /* 2790..279F */ MirLev2_0000, /* 27A0..27AF */ MirLev2_0000, /* 27B0..27BF */ MirLev2_27C0, /* 27C0..27CF */ MirLev2_27D0, /* 27D0..27DF */ MirLev2_27E0, /* 27E0..27EF */ MirLev2_0000, /* 27F0..27FF */ #define MirLev1_2900 0x80 MirLev2_0000, /* 2900..290F */ MirLev2_0000, /* 2910..291F */ MirLev2_0000, /* 2920..292F */ MirLev2_0000, /* 2930..293F */ MirLev2_0000, /* 2940..294F */ MirLev2_0000, /* 2950..295F */ MirLev2_0000, /* 2960..296F */ MirLev2_0000, /* 2970..297F */ MirLev2_2980, /* 2980..298F */ MirLev2_2990, /* 2990..299F */ MirLev2_0000, /* 29A0..29AF */ MirLev2_29B0, /* 29B0..29BF */ MirLev2_29C0, /* 29C0..29CF */ MirLev2_29D0, /* 29D0..29DF */ MirLev2_0000, /* 29E0..29EF */ MirLev2_29F0, /* 29F0..29FF */ #define MirLev1_2A00 0x90 MirLev2_0000, /* 2A00..2A0F */ MirLev2_0000, /* 2A10..2A1F */ MirLev2_2A20, /* 2A20..2A2F */ MirLev2_2A30, /* 2A30..2A3F */ MirLev2_0000, /* 2A40..2A4F */ MirLev2_0000, /* 2A50..2A5F */ MirLev2_2A60, /* 2A60..2A6F */ MirLev2_2A70, /* 2A70..2A7F */ MirLev2_2A80, /* 2A80..2A8F */ MirLev2_2A90, /* 2A90..2A9F */ MirLev2_2AA0, /* 2AA0..2AAF */ MirLev2_2AB0, /* 2AB0..2ABF */ MirLev2_2AC0, /* 2AC0..2ACF */ MirLev2_2AD0, /* 2AD0..2ADF */ MirLev2_2AE0, /* 2AE0..2AEF */ MirLev2_2AF0, /* 2AF0..2AFF */ #define MirLev1_2E00 0xA0 MirLev2_2E00, /* 2E00..2E0F */ MirLev2_2230, /* 2E10..2E1F */ MirLev2_2E20, /* 2E20..2E2F */ MirLev2_0000, /* 2E30..2E3F */ MirLev2_0000, /* 2E40..2E4F */ MirLev2_0000, /* 2E50..2E5F */ MirLev2_0000, /* 2E60..2E6F */ MirLev2_0000, /* 2E70..2E7F */ MirLev2_0000, /* 2E80..2E8F */ MirLev2_0000, /* 2E90..2E9F */ MirLev2_0000, /* 2EA0..2EAF */ MirLev2_0000, /* 2EB0..2EBF */ MirLev2_0000, /* 2EC0..2ECF */ MirLev2_0000, /* 2ED0..2EDF */ MirLev2_0000, /* 2EE0..2EEF */ MirLev2_0000, /* 2EF0..2EFF */ #define MirLev1_3000 0xB0 MirLev2_2760, /* 3000..300F */ MirLev2_3010, /* 3010..301F */ MirLev2_0000, /* 3020..302F */ MirLev2_0000, /* 3030..303F */ MirLev2_0000, /* 3040..304F */ MirLev2_0000, /* 3050..305F */ MirLev2_0000, /* 3060..306F */ MirLev2_0000, /* 3070..307F */ MirLev2_0000, /* 3080..308F */ MirLev2_0000, /* 3090..309F */ MirLev2_0000, /* 30A0..30AF */ MirLev2_0000, /* 30B0..30BF */ MirLev2_0000, /* 30C0..30CF */ MirLev2_0000, /* 30D0..30DF */ MirLev2_0000, /* 30E0..30EF */ MirLev2_0000, /* 30F0..30FF */ #define MirLev1_FE00 0xC0 MirLev2_0000, /* FE00..FE0F */ MirLev2_0000, /* FE10..FE1F */ MirLev2_0000, /* FE20..FE2F */ MirLev2_0000, /* FE30..FE3F */ MirLev2_0000, /* FE40..FE4F */ MirLev2_FE50, /* FE50..FE5F */ MirLev2_2A60, /* FE60..FE6F */ MirLev2_0000, /* FE70..FE7F */ MirLev2_0000, /* FE80..FE8F */ MirLev2_0000, /* FE90..FE9F */ MirLev2_0000, /* FEA0..FEAF */ MirLev2_0000, /* FEB0..FEBF */ MirLev2_0000, /* FEC0..FECF */ MirLev2_0000, /* FED0..FEDF */ MirLev2_0000, /* FEE0..FEEF */ MirLev2_0000, /* FEF0..FEFF */ #define MirLev1_FF00 0xD0 MirLev2_0020, /* FF00..FF0F */ MirLev2_0030, /* FF10..FF1F */ MirLev2_0000, /* FF20..FF2F */ MirLev2_0050, /* FF30..FF3F */ MirLev2_0000, /* FF40..FF4F */ MirLev2_FF50, /* FF50..FF5F */ MirLev2_FF60, /* FF60..FF6F */ MirLev2_0000, /* FF70..FF7F */ MirLev2_0000, /* FF80..FF8F */ MirLev2_0000, /* FF90..FF9F */ MirLev2_0000, /* FFA0..FFAF */ MirLev2_0000, /* FFB0..FFBF */ MirLev2_0000, /* FFC0..FFCF */ MirLev2_0000, /* FFD0..FFDF */ MirLev2_0000, /* FFE0..FFEF */ MirLev2_0000, /* FFF0..FFFF */ }; static const PACKTAB_UINT8 MirLev0[256*1] = { #define MirLev0_0000 0x0 MirLev1_0000, /* 0000..00FF */ MirLev1_0100, /* 0100..01FF */ MirLev1_0100, /* 0200..02FF */ MirLev1_0100, /* 0300..03FF */ MirLev1_0100, /* 0400..04FF */ MirLev1_0100, /* 0500..05FF */ MirLev1_0100, /* 0600..06FF */ MirLev1_0100, /* 0700..07FF */ MirLev1_0100, /* 0800..08FF */ MirLev1_0100, /* 0900..09FF */ MirLev1_0100, /* 0A00..0AFF */ MirLev1_0100, /* 0B00..0BFF */ MirLev1_0100, /* 0C00..0CFF */ MirLev1_0100, /* 0D00..0DFF */ MirLev1_0100, /* 0E00..0EFF */ MirLev1_0F00, /* 0F00..0FFF */ MirLev1_0100, /* 1000..10FF */ MirLev1_0100, /* 1100..11FF */ MirLev1_0100, /* 1200..12FF */ MirLev1_0100, /* 1300..13FF */ MirLev1_0100, /* 1400..14FF */ MirLev1_0100, /* 1500..15FF */ MirLev1_1600, /* 1600..16FF */ MirLev1_0100, /* 1700..17FF */ MirLev1_0100, /* 1800..18FF */ MirLev1_0100, /* 1900..19FF */ MirLev1_0100, /* 1A00..1AFF */ MirLev1_0100, /* 1B00..1BFF */ MirLev1_0100, /* 1C00..1CFF */ MirLev1_0100, /* 1D00..1DFF */ MirLev1_0100, /* 1E00..1EFF */ MirLev1_0100, /* 1F00..1FFF */ MirLev1_2000, /* 2000..20FF */ MirLev1_0100, /* 2100..21FF */ MirLev1_2200, /* 2200..22FF */ MirLev1_2300, /* 2300..23FF */ MirLev1_0100, /* 2400..24FF */ MirLev1_0100, /* 2500..25FF */ MirLev1_0100, /* 2600..26FF */ MirLev1_2700, /* 2700..27FF */ MirLev1_0100, /* 2800..28FF */ MirLev1_2900, /* 2900..29FF */ MirLev1_2A00, /* 2A00..2AFF */ MirLev1_0100, /* 2B00..2BFF */ MirLev1_0100, /* 2C00..2CFF */ MirLev1_0100, /* 2D00..2DFF */ MirLev1_2E00, /* 2E00..2EFF */ MirLev1_0100, /* 2F00..2FFF */ MirLev1_3000, /* 3000..30FF */ MirLev1_0100, /* 3100..31FF */ MirLev1_0100, /* 3200..32FF */ MirLev1_0100, /* 3300..33FF */ MirLev1_0100, /* 3400..34FF */ MirLev1_0100, /* 3500..35FF */ MirLev1_0100, /* 3600..36FF */ MirLev1_0100, /* 3700..37FF */ MirLev1_0100, /* 3800..38FF */ MirLev1_0100, /* 3900..39FF */ MirLev1_0100, /* 3A00..3AFF */ MirLev1_0100, /* 3B00..3BFF */ MirLev1_0100, /* 3C00..3CFF */ MirLev1_0100, /* 3D00..3DFF */ MirLev1_0100, /* 3E00..3EFF */ MirLev1_0100, /* 3F00..3FFF */ MirLev1_0100, /* 4000..40FF */ MirLev1_0100, /* 4100..41FF */ MirLev1_0100, /* 4200..42FF */ MirLev1_0100, /* 4300..43FF */ MirLev1_0100, /* 4400..44FF */ MirLev1_0100, /* 4500..45FF */ MirLev1_0100, /* 4600..46FF */ MirLev1_0100, /* 4700..47FF */ MirLev1_0100, /* 4800..48FF */ MirLev1_0100, /* 4900..49FF */ MirLev1_0100, /* 4A00..4AFF */ MirLev1_0100, /* 4B00..4BFF */ MirLev1_0100, /* 4C00..4CFF */ MirLev1_0100, /* 4D00..4DFF */ MirLev1_0100, /* 4E00..4EFF */ MirLev1_0100, /* 4F00..4FFF */ MirLev1_0100, /* 5000..50FF */ MirLev1_0100, /* 5100..51FF */ MirLev1_0100, /* 5200..52FF */ MirLev1_0100, /* 5300..53FF */ MirLev1_0100, /* 5400..54FF */ MirLev1_0100, /* 5500..55FF */ MirLev1_0100, /* 5600..56FF */ MirLev1_0100, /* 5700..57FF */ MirLev1_0100, /* 5800..58FF */ MirLev1_0100, /* 5900..59FF */ MirLev1_0100, /* 5A00..5AFF */ MirLev1_0100, /* 5B00..5BFF */ MirLev1_0100, /* 5C00..5CFF */ MirLev1_0100, /* 5D00..5DFF */ MirLev1_0100, /* 5E00..5EFF */ MirLev1_0100, /* 5F00..5FFF */ MirLev1_0100, /* 6000..60FF */ MirLev1_0100, /* 6100..61FF */ MirLev1_0100, /* 6200..62FF */ MirLev1_0100, /* 6300..63FF */ MirLev1_0100, /* 6400..64FF */ MirLev1_0100, /* 6500..65FF */ MirLev1_0100, /* 6600..66FF */ MirLev1_0100, /* 6700..67FF */ MirLev1_0100, /* 6800..68FF */ MirLev1_0100, /* 6900..69FF */ MirLev1_0100, /* 6A00..6AFF */ MirLev1_0100, /* 6B00..6BFF */ MirLev1_0100, /* 6C00..6CFF */ MirLev1_0100, /* 6D00..6DFF */ MirLev1_0100, /* 6E00..6EFF */ MirLev1_0100, /* 6F00..6FFF */ MirLev1_0100, /* 7000..70FF */ MirLev1_0100, /* 7100..71FF */ MirLev1_0100, /* 7200..72FF */ MirLev1_0100, /* 7300..73FF */ MirLev1_0100, /* 7400..74FF */ MirLev1_0100, /* 7500..75FF */ MirLev1_0100, /* 7600..76FF */ MirLev1_0100, /* 7700..77FF */ MirLev1_0100, /* 7800..78FF */ MirLev1_0100, /* 7900..79FF */ MirLev1_0100, /* 7A00..7AFF */ MirLev1_0100, /* 7B00..7BFF */ MirLev1_0100, /* 7C00..7CFF */ MirLev1_0100, /* 7D00..7DFF */ MirLev1_0100, /* 7E00..7EFF */ MirLev1_0100, /* 7F00..7FFF */ MirLev1_0100, /* 8000..80FF */ MirLev1_0100, /* 8100..81FF */ MirLev1_0100, /* 8200..82FF */ MirLev1_0100, /* 8300..83FF */ MirLev1_0100, /* 8400..84FF */ MirLev1_0100, /* 8500..85FF */ MirLev1_0100, /* 8600..86FF */ MirLev1_0100, /* 8700..87FF */ MirLev1_0100, /* 8800..88FF */ MirLev1_0100, /* 8900..89FF */ MirLev1_0100, /* 8A00..8AFF */ MirLev1_0100, /* 8B00..8BFF */ MirLev1_0100, /* 8C00..8CFF */ MirLev1_0100, /* 8D00..8DFF */ MirLev1_0100, /* 8E00..8EFF */ MirLev1_0100, /* 8F00..8FFF */ MirLev1_0100, /* 9000..90FF */ MirLev1_0100, /* 9100..91FF */ MirLev1_0100, /* 9200..92FF */ MirLev1_0100, /* 9300..93FF */ MirLev1_0100, /* 9400..94FF */ MirLev1_0100, /* 9500..95FF */ MirLev1_0100, /* 9600..96FF */ MirLev1_0100, /* 9700..97FF */ MirLev1_0100, /* 9800..98FF */ MirLev1_0100, /* 9900..99FF */ MirLev1_0100, /* 9A00..9AFF */ MirLev1_0100, /* 9B00..9BFF */ MirLev1_0100, /* 9C00..9CFF */ MirLev1_0100, /* 9D00..9DFF */ MirLev1_0100, /* 9E00..9EFF */ MirLev1_0100, /* 9F00..9FFF */ MirLev1_0100, /* A000..A0FF */ MirLev1_0100, /* A100..A1FF */ MirLev1_0100, /* A200..A2FF */ MirLev1_0100, /* A300..A3FF */ MirLev1_0100, /* A400..A4FF */ MirLev1_0100, /* A500..A5FF */ MirLev1_0100, /* A600..A6FF */ MirLev1_0100, /* A700..A7FF */ MirLev1_0100, /* A800..A8FF */ MirLev1_0100, /* A900..A9FF */ MirLev1_0100, /* AA00..AAFF */ MirLev1_0100, /* AB00..ABFF */ MirLev1_0100, /* AC00..ACFF */ MirLev1_0100, /* AD00..ADFF */ MirLev1_0100, /* AE00..AEFF */ MirLev1_0100, /* AF00..AFFF */ MirLev1_0100, /* B000..B0FF */ MirLev1_0100, /* B100..B1FF */ MirLev1_0100, /* B200..B2FF */ MirLev1_0100, /* B300..B3FF */ MirLev1_0100, /* B400..B4FF */ MirLev1_0100, /* B500..B5FF */ MirLev1_0100, /* B600..B6FF */ MirLev1_0100, /* B700..B7FF */ MirLev1_0100, /* B800..B8FF */ MirLev1_0100, /* B900..B9FF */ MirLev1_0100, /* BA00..BAFF */ MirLev1_0100, /* BB00..BBFF */ MirLev1_0100, /* BC00..BCFF */ MirLev1_0100, /* BD00..BDFF */ MirLev1_0100, /* BE00..BEFF */ MirLev1_0100, /* BF00..BFFF */ MirLev1_0100, /* C000..C0FF */ MirLev1_0100, /* C100..C1FF */ MirLev1_0100, /* C200..C2FF */ MirLev1_0100, /* C300..C3FF */ MirLev1_0100, /* C400..C4FF */ MirLev1_0100, /* C500..C5FF */ MirLev1_0100, /* C600..C6FF */ MirLev1_0100, /* C700..C7FF */ MirLev1_0100, /* C800..C8FF */ MirLev1_0100, /* C900..C9FF */ MirLev1_0100, /* CA00..CAFF */ MirLev1_0100, /* CB00..CBFF */ MirLev1_0100, /* CC00..CCFF */ MirLev1_0100, /* CD00..CDFF */ MirLev1_0100, /* CE00..CEFF */ MirLev1_0100, /* CF00..CFFF */ MirLev1_0100, /* D000..D0FF */ MirLev1_0100, /* D100..D1FF */ MirLev1_0100, /* D200..D2FF */ MirLev1_0100, /* D300..D3FF */ MirLev1_0100, /* D400..D4FF */ MirLev1_0100, /* D500..D5FF */ MirLev1_0100, /* D600..D6FF */ MirLev1_0100, /* D700..D7FF */ MirLev1_0100, /* D800..D8FF */ MirLev1_0100, /* D900..D9FF */ MirLev1_0100, /* DA00..DAFF */ MirLev1_0100, /* DB00..DBFF */ MirLev1_0100, /* DC00..DCFF */ MirLev1_0100, /* DD00..DDFF */ MirLev1_0100, /* DE00..DEFF */ MirLev1_0100, /* DF00..DFFF */ MirLev1_0100, /* E000..E0FF */ MirLev1_0100, /* E100..E1FF */ MirLev1_0100, /* E200..E2FF */ MirLev1_0100, /* E300..E3FF */ MirLev1_0100, /* E400..E4FF */ MirLev1_0100, /* E500..E5FF */ MirLev1_0100, /* E600..E6FF */ MirLev1_0100, /* E700..E7FF */ MirLev1_0100, /* E800..E8FF */ MirLev1_0100, /* E900..E9FF */ MirLev1_0100, /* EA00..EAFF */ MirLev1_0100, /* EB00..EBFF */ MirLev1_0100, /* EC00..ECFF */ MirLev1_0100, /* ED00..EDFF */ MirLev1_0100, /* EE00..EEFF */ MirLev1_0100, /* EF00..EFFF */ MirLev1_0100, /* F000..F0FF */ MirLev1_0100, /* F100..F1FF */ MirLev1_0100, /* F200..F2FF */ MirLev1_0100, /* F300..F3FF */ MirLev1_0100, /* F400..F4FF */ MirLev1_0100, /* F500..F5FF */ MirLev1_0100, /* F600..F6FF */ MirLev1_0100, /* F700..F7FF */ MirLev1_0100, /* F800..F8FF */ MirLev1_0100, /* F900..F9FF */ MirLev1_0100, /* FA00..FAFF */ MirLev1_0100, /* FB00..FBFF */ MirLev1_0100, /* FC00..FCFF */ MirLev1_0100, /* FD00..FDFF */ MirLev1_FE00, /* FE00..FEFF */ MirLev1_FF00, /* FF00..FFFF */ }; /* *INDENT-ON* */ #define GLIB_GET_MIRRORING_DELTA(x) \ ((x) >= 0x10000 ? 0 : \ MirLev3[((x) & 0x03) + \ MirLev2[((x) >> 2 & 0x03) + \ MirLev1[((x) >> 4 & 0x0f) + \ MirLev0[((x) >> 8)]]]]) #undef PACKTAB_UINT8 #undef PACKTAB_UINT16 #undef PACKTAB_UINT32 #define GLIB_GET_MIRRORING(x) ((x) + GLIB_GET_MIRRORING_DELTA(x)) /* End of generated gmirroringtable.h */ pkg-config-0.29.1/glib/glib/gwin32.c0000664000175000017500000004233712275467762013714 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1998 Peter Mattis, Spencer Kimball and Josh MacDonald * Copyright (C) 1998-1999 Tor Lillqvist * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the GLib Team and others 1997-2000. See the AUTHORS * file for a list of people on the GLib Team. See the ChangeLog * files for a list of changes. These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/. */ /* * MT safe for the unix part, FIXME: make the win32 part MT safe as well. */ #include "config.h" #include "glibconfig.h" #include #include #include #include #include #define STRICT /* Strict typing, please */ #include #undef STRICT #ifndef G_WITH_CYGWIN #include #endif #include #include #if defined(_MSC_VER) || defined(__DMC__) # include #endif /* _MSC_VER || __DMC__ */ #include "glib.h" #include "gthreadprivate.h" #ifdef G_WITH_CYGWIN #include #endif #ifndef G_WITH_CYGWIN gint g_win32_ftruncate (gint fd, guint size) { return _chsize (fd, size); } #endif /** * g_win32_getlocale: * * The setlocale() function in the Microsoft C library uses locale * names of the form "English_United States.1252" etc. We want the * UNIXish standard form "en_US", "zh_TW" etc. This function gets the * current thread locale from Windows - without any encoding info - * and returns it as a string of the above form for use in forming * file names etc. The returned string should be deallocated with * g_free(). * * Returns: newly-allocated locale name. **/ #ifndef SUBLANG_SERBIAN_LATIN_BA #define SUBLANG_SERBIAN_LATIN_BA 0x06 #endif gchar * g_win32_getlocale (void) { LCID lcid; LANGID langid; gchar *ev; gint primary, sub; char iso639[10]; char iso3166[10]; const gchar *script = NULL; /* Let the user override the system settings through environment * variables, as on POSIX systems. Note that in GTK+ applications * since GTK+ 2.10.7 setting either LC_ALL or LANG also sets the * Win32 locale and C library locale through code in gtkmain.c. */ if (((ev = getenv ("LC_ALL")) != NULL && ev[0] != '\0') || ((ev = getenv ("LC_MESSAGES")) != NULL && ev[0] != '\0') || ((ev = getenv ("LANG")) != NULL && ev[0] != '\0')) return g_strdup (ev); lcid = GetThreadLocale (); if (!GetLocaleInfo (lcid, LOCALE_SISO639LANGNAME, iso639, sizeof (iso639)) || !GetLocaleInfo (lcid, LOCALE_SISO3166CTRYNAME, iso3166, sizeof (iso3166))) return g_strdup ("C"); /* Strip off the sorting rules, keep only the language part. */ langid = LANGIDFROMLCID (lcid); /* Split into language and territory part. */ primary = PRIMARYLANGID (langid); sub = SUBLANGID (langid); /* Handle special cases */ switch (primary) { case LANG_AZERI: switch (sub) { case SUBLANG_AZERI_LATIN: script = "@Latn"; break; case SUBLANG_AZERI_CYRILLIC: script = "@Cyrl"; break; } break; case LANG_SERBIAN: /* LANG_CROATIAN == LANG_SERBIAN */ switch (sub) { case SUBLANG_SERBIAN_LATIN: case 0x06: /* Serbian (Latin) - Bosnia and Herzegovina */ script = "@Latn"; break; } break; case LANG_UZBEK: switch (sub) { case SUBLANG_UZBEK_LATIN: script = "@Latn"; break; case SUBLANG_UZBEK_CYRILLIC: script = "@Cyrl"; break; } break; } return g_strconcat (iso639, "_", iso3166, script, NULL); } /** * g_win32_error_message: * @error: error code. * * Translate a Win32 error code (as returned by GetLastError()) into * the corresponding message. The message is either language neutral, * or in the thread's language, or the user's language, the system's * language, or US English (see docs for FormatMessage()). The * returned string is in UTF-8. It should be deallocated with * g_free(). * * Returns: newly-allocated error message **/ gchar * g_win32_error_message (gint error) { gchar *retval; wchar_t *msg = NULL; int nchars; FormatMessageW (FORMAT_MESSAGE_ALLOCATE_BUFFER |FORMAT_MESSAGE_IGNORE_INSERTS |FORMAT_MESSAGE_FROM_SYSTEM, NULL, error, 0, (LPWSTR) &msg, 0, NULL); if (msg != NULL) { nchars = wcslen (msg); if (nchars > 2 && msg[nchars-1] == '\n' && msg[nchars-2] == '\r') msg[nchars-2] = '\0'; retval = g_utf16_to_utf8 (msg, -1, NULL, NULL, NULL); LocalFree (msg); } else retval = g_strdup (""); return retval; } /** * g_win32_get_package_installation_directory_of_module: * @hmodule: (allow-none): The Win32 handle for a DLL loaded into the current process, or %NULL * * This function tries to determine the installation directory of a * software package based on the location of a DLL of the software * package. * * @hmodule should be the handle of a loaded DLL or %NULL. The * function looks up the directory that DLL was loaded from. If * @hmodule is NULL, the directory the main executable of the current * process is looked up. If that directory's last component is "bin" * or "lib", its parent directory is returned, otherwise the directory * itself. * * It thus makes sense to pass only the handle to a "public" DLL of a * software package to this function, as such DLLs typically are known * to be installed in a "bin" or occasionally "lib" subfolder of the * installation folder. DLLs that are of the dynamically loaded module * or plugin variety are often located in more private locations * deeper down in the tree, from which it is impossible for GLib to * deduce the root of the package installation. * * The typical use case for this function is to have a DllMain() that * saves the handle for the DLL. Then when code in the DLL needs to * construct names of files in the installation tree it calls this * function passing the DLL handle. * * Returns: a string containing the guessed installation directory for * the software package @hmodule is from. The string is in the GLib * file name encoding, i.e. UTF-8. The return value should be freed * with g_free() when not needed any longer. If the function fails * %NULL is returned. * * Since: 2.16 */ gchar * g_win32_get_package_installation_directory_of_module (gpointer hmodule) { gchar *retval; gchar *p; wchar_t wc_fn[MAX_PATH]; if (!GetModuleFileNameW (hmodule, wc_fn, MAX_PATH)) return NULL; retval = g_utf16_to_utf8 (wc_fn, -1, NULL, NULL, NULL); if ((p = strrchr (retval, G_DIR_SEPARATOR)) != NULL) *p = '\0'; p = strrchr (retval, G_DIR_SEPARATOR); if (p && (g_ascii_strcasecmp (p + 1, "bin") == 0 || g_ascii_strcasecmp (p + 1, "lib") == 0)) *p = '\0'; #ifdef G_WITH_CYGWIN /* In Cygwin we need to have POSIX paths */ { gchar tmp[MAX_PATH]; cygwin_conv_to_posix_path (retval, tmp); g_free (retval); retval = g_strdup (tmp); } #endif return retval; } static gchar * get_package_directory_from_module (const gchar *module_name) { static GHashTable *module_dirs = NULL; G_LOCK_DEFINE_STATIC (module_dirs); HMODULE hmodule = NULL; gchar *fn; G_LOCK (module_dirs); if (module_dirs == NULL) module_dirs = g_hash_table_new (g_str_hash, g_str_equal); fn = g_hash_table_lookup (module_dirs, module_name ? module_name : ""); if (fn) { G_UNLOCK (module_dirs); return g_strdup (fn); } if (module_name) { wchar_t *wc_module_name = g_utf8_to_utf16 (module_name, -1, NULL, NULL, NULL); hmodule = GetModuleHandleW (wc_module_name); g_free (wc_module_name); if (!hmodule) { G_UNLOCK (module_dirs); return NULL; } } fn = g_win32_get_package_installation_directory_of_module (hmodule); if (fn == NULL) { G_UNLOCK (module_dirs); return NULL; } g_hash_table_insert (module_dirs, module_name ? g_strdup (module_name) : "", fn); G_UNLOCK (module_dirs); return g_strdup (fn); } /** * g_win32_get_package_installation_directory: * @package: (allow-none): You should pass %NULL for this. * @dll_name: (allow-none): The name of a DLL that a package provides in UTF-8, or %NULL. * * Try to determine the installation directory for a software package. * * This function is deprecated. Use * g_win32_get_package_installation_directory_of_module() instead. * * The use of @package is deprecated. You should always pass %NULL. A * warning is printed if non-NULL is passed as @package. * * The original intended use of @package was for a short identifier of * the package, typically the same identifier as used for * GETTEXT_PACKAGE in software configured using GNU * autotools. The function first looks in the Windows Registry for the * value #InstallationDirectory in the key * #HKLM\Software\@package, and if that value * exists and is a string, returns that. * * It is strongly recommended that packagers of GLib-using libraries * for Windows do not store installation paths in the Registry to be * used by this function as that interfers with having several * parallel installations of the library. Enabling multiple * installations of different versions of some GLib-using library, or * GLib itself, is desirable for various reasons. * * For this reason it is recommeded to always pass %NULL as * @package to this function, to avoid the temptation to use the * Registry. In version 2.20 of GLib the @package parameter * will be ignored and this function won't look in the Registry at all. * * If @package is %NULL, or the above value isn't found in the * Registry, but @dll_name is non-%NULL, it should name a DLL loaded * into the current process. Typically that would be the name of the * DLL calling this function, looking for its installation * directory. The function then asks Windows what directory that DLL * was loaded from. If that directory's last component is "bin" or * "lib", the parent directory is returned, otherwise the directory * itself. If that DLL isn't loaded, the function proceeds as if * @dll_name was %NULL. * * If both @package and @dll_name are %NULL, the directory from where * the main executable of the process was loaded is used instead in * the same way as above. * * Returns: a string containing the installation directory for * @package. The string is in the GLib file name encoding, * i.e. UTF-8. The return value should be freed with g_free() when not * needed any longer. If the function fails %NULL is returned. * * Deprecated: 2.18: Pass the HMODULE of a DLL or EXE to * g_win32_get_package_installation_directory_of_module() instead. **/ gchar * g_win32_get_package_installation_directory_utf8 (const gchar *package, const gchar *dll_name) { gchar *result = NULL; if (package != NULL) g_warning ("Passing a non-NULL package to g_win32_get_package_installation_directory() is deprecated and it is ignored."); if (dll_name != NULL) result = get_package_directory_from_module (dll_name); if (result == NULL) result = get_package_directory_from_module (NULL); return result; } #if !defined (_WIN64) /* DLL ABI binary compatibility version that uses system codepage file names */ gchar * g_win32_get_package_installation_directory (const gchar *package, const gchar *dll_name) { gchar *utf8_package = NULL, *utf8_dll_name = NULL; gchar *utf8_retval, *retval; if (package != NULL) utf8_package = g_locale_to_utf8 (package, -1, NULL, NULL, NULL); if (dll_name != NULL) utf8_dll_name = g_locale_to_utf8 (dll_name, -1, NULL, NULL, NULL); utf8_retval = g_win32_get_package_installation_directory_utf8 (utf8_package, utf8_dll_name); retval = g_locale_from_utf8 (utf8_retval, -1, NULL, NULL, NULL); g_free (utf8_package); g_free (utf8_dll_name); g_free (utf8_retval); return retval; } #endif /** * g_win32_get_package_installation_subdirectory: * @package: (allow-none): You should pass %NULL for this. * @dll_name: (allow-none): The name of a DLL that a package provides, in UTF-8, or %NULL. * @subdir: A subdirectory of the package installation directory, also in UTF-8 * * This function is deprecated. Use * g_win32_get_package_installation_directory_of_module() and * g_build_filename() instead. * * Returns a newly-allocated string containing the path of the * subdirectory @subdir in the return value from calling * g_win32_get_package_installation_directory() with the @package and * @dll_name parameters. See the documentation for * g_win32_get_package_installation_directory() for more details. In * particular, note that it is deprecated to pass anything except NULL * as @package. * * Returns: a string containing the complete path to @subdir inside * the installation directory of @package. The returned string is in * the GLib file name encoding, i.e. UTF-8. The return value should be * freed with g_free() when no longer needed. If something goes wrong, * %NULL is returned. * * Deprecated: 2.18: Pass the HMODULE of a DLL or EXE to * g_win32_get_package_installation_directory_of_module() instead, and * then construct a subdirectory pathname with g_build_filename(). **/ gchar * g_win32_get_package_installation_subdirectory_utf8 (const gchar *package, const gchar *dll_name, const gchar *subdir) { gchar *prefix; gchar *dirname; prefix = g_win32_get_package_installation_directory_utf8 (package, dll_name); dirname = g_build_filename (prefix, subdir, NULL); g_free (prefix); return dirname; } #if !defined (_WIN64) /* DLL ABI binary compatibility version that uses system codepage file names */ gchar * g_win32_get_package_installation_subdirectory (const gchar *package, const gchar *dll_name, const gchar *subdir) { gchar *prefix; gchar *dirname; prefix = g_win32_get_package_installation_directory (package, dll_name); dirname = g_build_filename (prefix, subdir, NULL); g_free (prefix); return dirname; } #endif /** * g_win32_get_windows_version: * * Returns version information for the Windows operating system the * code is running on. See MSDN documentation for the GetVersion() * function. To summarize, the most significant bit is one on Win9x, * and zero on NT-based systems. Since version 2.14, GLib works only * on NT-based systems, so checking whether your are running on Win9x * in your own software is moot. The least significant byte is 4 on * Windows NT 4, and 5 on Windows XP. Software that needs really * detailed version and feature information should use Win32 API like * GetVersionEx() and VerifyVersionInfo(). * * Returns: The version information. * * Since: 2.6 **/ guint g_win32_get_windows_version (void) { static gsize windows_version; if (g_once_init_enter (&windows_version)) g_once_init_leave (&windows_version, GetVersion ()); return windows_version; } /** * g_win32_locale_filename_from_utf8: * @utf8filename: a UTF-8 encoded filename. * * Converts a filename from UTF-8 to the system codepage. * * On NT-based Windows, on NTFS file systems, file names are in * Unicode. It is quite possible that Unicode file names contain * characters not representable in the system codepage. (For instance, * Greek or Cyrillic characters on Western European or US Windows * installations, or various less common CJK characters on CJK Windows * installations.) * * In such a case, and if the filename refers to an existing file, and * the file system stores alternate short (8.3) names for directory * entries, the short form of the filename is returned. Note that the * "short" name might in fact be longer than the Unicode name if the * Unicode name has very short pathname components containing * non-ASCII characters. If no system codepage name for the file is * possible, %NULL is returned. * * The return value is dynamically allocated and should be freed with * g_free() when no longer needed. * * Return value: The converted filename, or %NULL on conversion * failure and lack of short names. * * Since: 2.8 */ gchar * g_win32_locale_filename_from_utf8 (const gchar *utf8filename) { gchar *retval = g_locale_from_utf8 (utf8filename, -1, NULL, NULL, NULL); if (retval == NULL) { /* Conversion failed, so convert to wide chars, check if there * is a 8.3 version, and use that. */ wchar_t *wname = g_utf8_to_utf16 (utf8filename, -1, NULL, NULL, NULL); if (wname != NULL) { wchar_t wshortname[MAX_PATH + 1]; if (GetShortPathNameW (wname, wshortname, G_N_ELEMENTS (wshortname))) { gchar *tem = g_utf16_to_utf8 (wshortname, -1, NULL, NULL, NULL); retval = g_locale_from_utf8 (tem, -1, NULL, NULL, NULL); g_free (tem); } g_free (wname); } } return retval; } pkg-config-0.29.1/glib/glib/gnode.c0000664000175000017500000006642112651243552013662 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * GNode: N-way tree implementation. * Copyright (C) 1998 Tim Janik * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the GLib Team and others 1997-2000. See the AUTHORS * file for a list of people on the GLib Team. See the ChangeLog * files for a list of changes. These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/. */ /* * MT safe */ #include "config.h" #include "gnode.h" #include "gslice.h" #include "gtestutils.h" /** * SECTION:trees-nary * @title: N-ary Trees * @short_description: trees of data with any number of branches * * The #GNode struct and its associated functions provide a N-ary tree * data structure, where nodes in the tree can contain arbitrary data. * * To create a new tree use g_node_new(). * * To insert a node into a tree use g_node_insert(), * g_node_insert_before(), g_node_append() and g_node_prepend(). * * To create a new node and insert it into a tree use * g_node_insert_data(), g_node_insert_data_after(), * g_node_insert_data_before(), g_node_append_data() * and g_node_prepend_data(). * * To reverse the children of a node use g_node_reverse_children(). * * To find a node use g_node_get_root(), g_node_find(), * g_node_find_child(), g_node_child_index(), g_node_child_position(), * g_node_first_child(), g_node_last_child(), g_node_nth_child(), * g_node_first_sibling(), g_node_prev_sibling(), g_node_next_sibling() * or g_node_last_sibling(). * * To get information about a node or tree use G_NODE_IS_LEAF(), * G_NODE_IS_ROOT(), g_node_depth(), g_node_n_nodes(), * g_node_n_children(), g_node_is_ancestor() or g_node_max_height(). * * To traverse a tree, calling a function for each node visited in the * traversal, use g_node_traverse() or g_node_children_foreach(). * * To remove a node or subtree from a tree use g_node_unlink() or * g_node_destroy(). **/ /** * GNode: * @data: contains the actual data of the node. * @next: points to the node's next sibling (a sibling is another * #GNode with the same parent). * @prev: points to the node's previous sibling. * @parent: points to the parent of the #GNode, or is %NULL if the * #GNode is the root of the tree. * @children: points to the first child of the #GNode. The other * children are accessed by using the @next pointer of each * child. * * The #GNode struct represents one node in a * N-ary Tree. fields **/ #define g_node_alloc0() g_slice_new0 (GNode) #define g_node_free(node) g_slice_free (GNode, node) /* --- functions --- */ /** * g_node_new: * @data: the data of the new node * * Creates a new #GNode containing the given data. * Used to create the first node in a tree. * * Returns: a new #GNode */ GNode* g_node_new (gpointer data) { GNode *node = g_node_alloc0 (); node->data = data; return node; } static void g_nodes_free (GNode *node) { while (node) { GNode *next = node->next; if (node->children) g_nodes_free (node->children); g_node_free (node); node = next; } } /** * g_node_destroy: * @root: the root of the tree/subtree to destroy * * Removes @root and its children from the tree, freeing any memory * allocated. */ void g_node_destroy (GNode *root) { g_return_if_fail (root != NULL); if (!G_NODE_IS_ROOT (root)) g_node_unlink (root); g_nodes_free (root); } /** * g_node_unlink: * @node: the #GNode to unlink, which becomes the root of a new tree * * Unlinks a #GNode from a tree, resulting in two separate trees. */ void g_node_unlink (GNode *node) { g_return_if_fail (node != NULL); if (node->prev) node->prev->next = node->next; else if (node->parent) node->parent->children = node->next; node->parent = NULL; if (node->next) { node->next->prev = node->prev; node->next = NULL; } node->prev = NULL; } /** * g_node_copy_deep: * @node: a #GNode * @copy_func: the function which is called to copy the data inside each node, * or %NULL to use the original data. * @data: data to pass to @copy_func * * Recursively copies a #GNode and its data. * * Return value: a new #GNode containing copies of the data in @node. * * Since: 2.4 **/ GNode* g_node_copy_deep (GNode *node, GCopyFunc copy_func, gpointer data) { GNode *new_node = NULL; if (copy_func == NULL) return g_node_copy (node); if (node) { GNode *child, *new_child; new_node = g_node_new (copy_func (node->data, data)); for (child = g_node_last_child (node); child; child = child->prev) { new_child = g_node_copy_deep (child, copy_func, data); g_node_prepend (new_node, new_child); } } return new_node; } /** * g_node_copy: * @node: a #GNode * * Recursively copies a #GNode (but does not deep-copy the data inside the * nodes, see g_node_copy_deep() if you need that). * * Returns: a new #GNode containing the same data pointers */ GNode* g_node_copy (GNode *node) { GNode *new_node = NULL; if (node) { GNode *child; new_node = g_node_new (node->data); for (child = g_node_last_child (node); child; child = child->prev) g_node_prepend (new_node, g_node_copy (child)); } return new_node; } /** * g_node_insert: * @parent: the #GNode to place @node under * @position: the position to place @node at, with respect to its siblings * If position is -1, @node is inserted as the last child of @parent * @node: the #GNode to insert * * Inserts a #GNode beneath the parent at the given position. * * Returns: the inserted #GNode */ GNode* g_node_insert (GNode *parent, gint position, GNode *node) { g_return_val_if_fail (parent != NULL, node); g_return_val_if_fail (node != NULL, node); g_return_val_if_fail (G_NODE_IS_ROOT (node), node); if (position > 0) return g_node_insert_before (parent, g_node_nth_child (parent, position), node); else if (position == 0) return g_node_prepend (parent, node); else /* if (position < 0) */ return g_node_append (parent, node); } /** * g_node_insert_before: * @parent: the #GNode to place @node under * @sibling: the sibling #GNode to place @node before. * If sibling is %NULL, the node is inserted as the last child of @parent. * @node: the #GNode to insert * * Inserts a #GNode beneath the parent before the given sibling. * * Returns: the inserted #GNode */ GNode* g_node_insert_before (GNode *parent, GNode *sibling, GNode *node) { g_return_val_if_fail (parent != NULL, node); g_return_val_if_fail (node != NULL, node); g_return_val_if_fail (G_NODE_IS_ROOT (node), node); if (sibling) g_return_val_if_fail (sibling->parent == parent, node); node->parent = parent; if (sibling) { if (sibling->prev) { node->prev = sibling->prev; node->prev->next = node; node->next = sibling; sibling->prev = node; } else { node->parent->children = node; node->next = sibling; sibling->prev = node; } } else { if (parent->children) { sibling = parent->children; while (sibling->next) sibling = sibling->next; node->prev = sibling; sibling->next = node; } else node->parent->children = node; } return node; } /** * g_node_insert_after: * @parent: the #GNode to place @node under * @sibling: the sibling #GNode to place @node after. * If sibling is %NULL, the node is inserted as the first child of @parent. * @node: the #GNode to insert * * Inserts a #GNode beneath the parent after the given sibling. * * Returns: the inserted #GNode */ GNode* g_node_insert_after (GNode *parent, GNode *sibling, GNode *node) { g_return_val_if_fail (parent != NULL, node); g_return_val_if_fail (node != NULL, node); g_return_val_if_fail (G_NODE_IS_ROOT (node), node); if (sibling) g_return_val_if_fail (sibling->parent == parent, node); node->parent = parent; if (sibling) { if (sibling->next) { sibling->next->prev = node; } node->next = sibling->next; node->prev = sibling; sibling->next = node; } else { if (parent->children) { node->next = parent->children; parent->children->prev = node; } parent->children = node; } return node; } /** * g_node_prepend: * @parent: the #GNode to place the new #GNode under * @node: the #GNode to insert * * Inserts a #GNode as the first child of the given parent. * * Returns: the inserted #GNode */ GNode* g_node_prepend (GNode *parent, GNode *node) { g_return_val_if_fail (parent != NULL, node); return g_node_insert_before (parent, parent->children, node); } /** * g_node_get_root: * @node: a #GNode * * Gets the root of a tree. * * Returns: the root of the tree */ GNode* g_node_get_root (GNode *node) { g_return_val_if_fail (node != NULL, NULL); while (node->parent) node = node->parent; return node; } /** * g_node_is_ancestor: * @node: a #GNode * @descendant: a #GNode * * Returns %TRUE if @node is an ancestor of @descendant. * This is true if node is the parent of @descendant, * or if node is the grandparent of @descendant etc. * * Returns: %TRUE if @node is an ancestor of @descendant */ gboolean g_node_is_ancestor (GNode *node, GNode *descendant) { g_return_val_if_fail (node != NULL, FALSE); g_return_val_if_fail (descendant != NULL, FALSE); while (descendant) { if (descendant->parent == node) return TRUE; descendant = descendant->parent; } return FALSE; } /** * g_node_depth: * @node: a #GNode * * Gets the depth of a #GNode. * * If @node is %NULL the depth is 0. The root node has a depth of 1. * For the children of the root node the depth is 2. And so on. * * Returns: the depth of the #GNode */ guint g_node_depth (GNode *node) { guint depth = 0; while (node) { depth++; node = node->parent; } return depth; } /** * g_node_reverse_children: * @node: a #GNode. * * Reverses the order of the children of a #GNode. * (It doesn't change the order of the grandchildren.) */ void g_node_reverse_children (GNode *node) { GNode *child; GNode *last; g_return_if_fail (node != NULL); child = node->children; last = NULL; while (child) { last = child; child = last->next; last->next = last->prev; last->prev = child; } node->children = last; } /** * g_node_max_height: * @root: a #GNode * * Gets the maximum height of all branches beneath a #GNode. * This is the maximum distance from the #GNode to all leaf nodes. * * If @root is %NULL, 0 is returned. If @root has no children, * 1 is returned. If @root has children, 2 is returned. And so on. * * Returns: the maximum height of the tree beneath @root */ guint g_node_max_height (GNode *root) { GNode *child; guint max_height = 0; if (!root) return 0; child = root->children; while (child) { guint tmp_height; tmp_height = g_node_max_height (child); if (tmp_height > max_height) max_height = tmp_height; child = child->next; } return max_height + 1; } static gboolean g_node_traverse_pre_order (GNode *node, GTraverseFlags flags, GNodeTraverseFunc func, gpointer data) { if (node->children) { GNode *child; if ((flags & G_TRAVERSE_NON_LEAFS) && func (node, data)) return TRUE; child = node->children; while (child) { GNode *current; current = child; child = current->next; if (g_node_traverse_pre_order (current, flags, func, data)) return TRUE; } } else if ((flags & G_TRAVERSE_LEAFS) && func (node, data)) return TRUE; return FALSE; } static gboolean g_node_depth_traverse_pre_order (GNode *node, GTraverseFlags flags, guint depth, GNodeTraverseFunc func, gpointer data) { if (node->children) { GNode *child; if ((flags & G_TRAVERSE_NON_LEAFS) && func (node, data)) return TRUE; depth--; if (!depth) return FALSE; child = node->children; while (child) { GNode *current; current = child; child = current->next; if (g_node_depth_traverse_pre_order (current, flags, depth, func, data)) return TRUE; } } else if ((flags & G_TRAVERSE_LEAFS) && func (node, data)) return TRUE; return FALSE; } static gboolean g_node_traverse_post_order (GNode *node, GTraverseFlags flags, GNodeTraverseFunc func, gpointer data) { if (node->children) { GNode *child; child = node->children; while (child) { GNode *current; current = child; child = current->next; if (g_node_traverse_post_order (current, flags, func, data)) return TRUE; } if ((flags & G_TRAVERSE_NON_LEAFS) && func (node, data)) return TRUE; } else if ((flags & G_TRAVERSE_LEAFS) && func (node, data)) return TRUE; return FALSE; } static gboolean g_node_depth_traverse_post_order (GNode *node, GTraverseFlags flags, guint depth, GNodeTraverseFunc func, gpointer data) { if (node->children) { depth--; if (depth) { GNode *child; child = node->children; while (child) { GNode *current; current = child; child = current->next; if (g_node_depth_traverse_post_order (current, flags, depth, func, data)) return TRUE; } } if ((flags & G_TRAVERSE_NON_LEAFS) && func (node, data)) return TRUE; } else if ((flags & G_TRAVERSE_LEAFS) && func (node, data)) return TRUE; return FALSE; } static gboolean g_node_traverse_in_order (GNode *node, GTraverseFlags flags, GNodeTraverseFunc func, gpointer data) { if (node->children) { GNode *child; GNode *current; child = node->children; current = child; child = current->next; if (g_node_traverse_in_order (current, flags, func, data)) return TRUE; if ((flags & G_TRAVERSE_NON_LEAFS) && func (node, data)) return TRUE; while (child) { current = child; child = current->next; if (g_node_traverse_in_order (current, flags, func, data)) return TRUE; } } else if ((flags & G_TRAVERSE_LEAFS) && func (node, data)) return TRUE; return FALSE; } static gboolean g_node_depth_traverse_in_order (GNode *node, GTraverseFlags flags, guint depth, GNodeTraverseFunc func, gpointer data) { if (node->children) { depth--; if (depth) { GNode *child; GNode *current; child = node->children; current = child; child = current->next; if (g_node_depth_traverse_in_order (current, flags, depth, func, data)) return TRUE; if ((flags & G_TRAVERSE_NON_LEAFS) && func (node, data)) return TRUE; while (child) { current = child; child = current->next; if (g_node_depth_traverse_in_order (current, flags, depth, func, data)) return TRUE; } } else if ((flags & G_TRAVERSE_NON_LEAFS) && func (node, data)) return TRUE; } else if ((flags & G_TRAVERSE_LEAFS) && func (node, data)) return TRUE; return FALSE; } static gboolean g_node_traverse_level (GNode *node, GTraverseFlags flags, guint level, GNodeTraverseFunc func, gpointer data, gboolean *more_levels) { if (level == 0) { if (node->children) { *more_levels = TRUE; return (flags & G_TRAVERSE_NON_LEAFS) && func (node, data); } else { return (flags & G_TRAVERSE_LEAFS) && func (node, data); } } else { node = node->children; while (node) { if (g_node_traverse_level (node, flags, level - 1, func, data, more_levels)) return TRUE; node = node->next; } } return FALSE; } static gboolean g_node_depth_traverse_level (GNode *node, GTraverseFlags flags, guint depth, GNodeTraverseFunc func, gpointer data) { guint level; gboolean more_levels; level = 0; while (level != depth) { more_levels = FALSE; if (g_node_traverse_level (node, flags, level, func, data, &more_levels)) return TRUE; if (!more_levels) break; level++; } return FALSE; } /** * g_node_traverse: * @root: the root #GNode of the tree to traverse * @order: the order in which nodes are visited - %G_IN_ORDER, * %G_PRE_ORDER, %G_POST_ORDER, or %G_LEVEL_ORDER. * @flags: which types of children are to be visited, one of * %G_TRAVERSE_ALL, %G_TRAVERSE_LEAVES and %G_TRAVERSE_NON_LEAVES * @max_depth: the maximum depth of the traversal. Nodes below this * depth will not be visited. If max_depth is -1 all nodes in * the tree are visited. If depth is 1, only the root is visited. * If depth is 2, the root and its children are visited. And so on. * @func: the function to call for each visited #GNode * @data: user data to pass to the function * * Traverses a tree starting at the given root #GNode. * It calls the given function for each node visited. * The traversal can be halted at any point by returning %TRUE from @func. */ /** * GTraverseFlags: * @G_TRAVERSE_LEAVES: only leaf nodes should be visited. This name has * been introduced in 2.6, for older version use * %G_TRAVERSE_LEAFS. * @G_TRAVERSE_NON_LEAVES: only non-leaf nodes should be visited. This * name has been introduced in 2.6, for older * version use %G_TRAVERSE_NON_LEAFS. * @G_TRAVERSE_ALL: all nodes should be visited. * @G_TRAVERSE_MASK: a mask of all traverse flags. * @G_TRAVERSE_LEAFS: identical to %G_TRAVERSE_LEAVES. * @G_TRAVERSE_NON_LEAFS: identical to %G_TRAVERSE_NON_LEAVES. * * Specifies which nodes are visited during several of the tree * functions, including g_node_traverse() and g_node_find(). **/ /** * GNodeTraverseFunc: * @node: a #GNode. * @data: user data passed to g_node_traverse(). * * 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, GTraverseType order, GTraverseFlags flags, gint depth, GNodeTraverseFunc func, gpointer data) { g_return_if_fail (root != NULL); g_return_if_fail (func != NULL); g_return_if_fail (order <= G_LEVEL_ORDER); g_return_if_fail (flags <= G_TRAVERSE_MASK); g_return_if_fail (depth == -1 || depth > 0); switch (order) { case G_PRE_ORDER: if (depth < 0) g_node_traverse_pre_order (root, flags, func, data); else g_node_depth_traverse_pre_order (root, flags, depth, func, data); break; case G_POST_ORDER: if (depth < 0) g_node_traverse_post_order (root, flags, func, data); else g_node_depth_traverse_post_order (root, flags, depth, func, data); break; case G_IN_ORDER: if (depth < 0) g_node_traverse_in_order (root, flags, func, data); else g_node_depth_traverse_in_order (root, flags, depth, func, data); break; case G_LEVEL_ORDER: g_node_depth_traverse_level (root, flags, depth, func, data); break; } } static gboolean g_node_find_func (GNode *node, gpointer data) { gpointer *d = data; if (*d != node->data) return FALSE; *(++d) = node; return TRUE; } /** * g_node_find: * @root: the root #GNode of the tree to search * @order: the order in which nodes are visited - %G_IN_ORDER, * %G_PRE_ORDER, %G_POST_ORDER, or %G_LEVEL_ORDER * @flags: which types of children are to be searched, one of * %G_TRAVERSE_ALL, %G_TRAVERSE_LEAVES and %G_TRAVERSE_NON_LEAVES * @data: the data to find * * Finds a #GNode in a tree. * * Returns: the found #GNode, or %NULL if the data is not found */ GNode* g_node_find (GNode *root, GTraverseType order, GTraverseFlags flags, gpointer data) { gpointer d[2]; g_return_val_if_fail (root != NULL, NULL); g_return_val_if_fail (order <= G_LEVEL_ORDER, NULL); g_return_val_if_fail (flags <= G_TRAVERSE_MASK, NULL); d[0] = data; d[1] = NULL; g_node_traverse (root, order, flags, -1, g_node_find_func, d); return d[1]; } static void g_node_count_func (GNode *node, GTraverseFlags flags, guint *n) { if (node->children) { GNode *child; if (flags & G_TRAVERSE_NON_LEAFS) (*n)++; child = node->children; while (child) { g_node_count_func (child, flags, n); child = child->next; } } else if (flags & G_TRAVERSE_LEAFS) (*n)++; } /** * g_node_n_nodes: * @root: a #GNode * @flags: which types of children are to be counted, one of * %G_TRAVERSE_ALL, %G_TRAVERSE_LEAVES and %G_TRAVERSE_NON_LEAVES * * Gets the number of nodes in a tree. * * Returns: the number of nodes in the tree */ guint g_node_n_nodes (GNode *root, GTraverseFlags flags) { guint n = 0; g_return_val_if_fail (root != NULL, 0); g_return_val_if_fail (flags <= G_TRAVERSE_MASK, 0); g_node_count_func (root, flags, &n); return n; } /** * g_node_last_child: * @node: a #GNode (must not be %NULL) * * Gets the last child of a #GNode. * * Returns: the last child of @node, or %NULL if @node has no children */ GNode* g_node_last_child (GNode *node) { g_return_val_if_fail (node != NULL, NULL); node = node->children; if (node) while (node->next) node = node->next; return node; } /** * g_node_nth_child: * @node: a #GNode * @n: the index of the desired child * * Gets a child of a #GNode, using the given index. * The first child is at index 0. If the index is * too big, %NULL is returned. * * Returns: the child of @node at index @n */ GNode* g_node_nth_child (GNode *node, guint n) { g_return_val_if_fail (node != NULL, NULL); node = node->children; if (node) while ((n-- > 0) && node) node = node->next; return node; } /** * g_node_n_children: * @node: a #GNode * * Gets the number of children of a #GNode. * * Returns: the number of children of @node */ guint g_node_n_children (GNode *node) { guint n = 0; g_return_val_if_fail (node != NULL, 0); node = node->children; while (node) { n++; node = node->next; } return n; } /** * g_node_find_child: * @node: a #GNode * @flags: which types of children are to be searched, one of * %G_TRAVERSE_ALL, %G_TRAVERSE_LEAVES and %G_TRAVERSE_NON_LEAVES * @data: the data to find * * Finds the first child of a #GNode with the given data. * * Returns: the found child #GNode, or %NULL if the data is not found */ GNode* g_node_find_child (GNode *node, GTraverseFlags flags, gpointer data) { g_return_val_if_fail (node != NULL, NULL); g_return_val_if_fail (flags <= G_TRAVERSE_MASK, NULL); node = node->children; while (node) { if (node->data == data) { if (G_NODE_IS_LEAF (node)) { if (flags & G_TRAVERSE_LEAFS) return node; } else { if (flags & G_TRAVERSE_NON_LEAFS) return node; } } node = node->next; } return NULL; } /** * g_node_child_position: * @node: a #GNode * @child: a child of @node * * Gets the position of a #GNode with respect to its siblings. * @child must be a child of @node. The first child is numbered 0, * the second 1, and so on. * * Returns: the position of @child with respect to its siblings */ gint g_node_child_position (GNode *node, GNode *child) { guint n = 0; g_return_val_if_fail (node != NULL, -1); g_return_val_if_fail (child != NULL, -1); g_return_val_if_fail (child->parent == node, -1); node = node->children; while (node) { if (node == child) return n; n++; node = node->next; } return -1; } /** * g_node_child_index: * @node: a #GNode * @data: the data to find * * Gets the position of the first child of a #GNode * which contains the given data. * * Returns: the index of the child of @node which contains * @data, or -1 if the data is not found */ gint g_node_child_index (GNode *node, gpointer data) { guint n = 0; g_return_val_if_fail (node != NULL, -1); node = node->children; while (node) { if (node->data == data) return n; n++; node = node->next; } return -1; } /** * g_node_first_sibling: * @node: a #GNode * * Gets the first sibling of a #GNode. * This could possibly be the node itself. * * Returns: the first sibling of @node */ GNode* g_node_first_sibling (GNode *node) { g_return_val_if_fail (node != NULL, NULL); if (node->parent) return node->parent->children; while (node->prev) node = node->prev; return node; } /** * g_node_last_sibling: * @node: a #GNode * * Gets the last sibling of a #GNode. * This could possibly be the node itself. * * Returns: the last sibling of @node */ GNode* g_node_last_sibling (GNode *node) { g_return_val_if_fail (node != NULL, NULL); while (node->next) node = node->next; return node; } /** * g_node_children_foreach: * @node: a #GNode * @flags: which types of children are to be visited, one of * %G_TRAVERSE_ALL, %G_TRAVERSE_LEAVES and %G_TRAVERSE_NON_LEAVES * @func: the function to call for each visited node * @data: user data to pass to the function * * Calls a function for each of the children of a #GNode. * Note that it doesn't descend beneath the child nodes. */ /** * GNodeForeachFunc: * @node: a #GNode. * @data: user data passed to g_node_children_foreach(). * * Specifies the type of function passed to g_node_children_foreach(). * The function is called with each child node, together with the user * data passed to g_node_children_foreach(). **/ void g_node_children_foreach (GNode *node, GTraverseFlags flags, GNodeForeachFunc func, gpointer data) { g_return_if_fail (node != NULL); g_return_if_fail (flags <= G_TRAVERSE_MASK); g_return_if_fail (func != NULL); node = node->children; while (node) { GNode *current; current = node; node = current->next; if (G_NODE_IS_LEAF (current)) { if (flags & G_TRAVERSE_LEAFS) func (current, data); } else { if (flags & G_TRAVERSE_NON_LEAFS) func (current, data); } } } pkg-config-0.29.1/glib/glib/gtimer.h0000664000175000017500000000461012651243552014052 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the GLib Team and others 1997-2000. See the AUTHORS * file for a list of people on the GLib Team. See the ChangeLog * files for a list of changes. These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/. */ #ifndef __G_TIMER_H__ #define __G_TIMER_H__ #if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) #error "Only can be included directly." #endif #include G_BEGIN_DECLS /* Timer */ /* microseconds per second */ 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 #endif /* __G_TIMER_H__ */ pkg-config-0.29.1/glib/glib/gsequence.h0000664000175000017500000002111412651243552014540 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007 * Soeren Sandmann (sandmann@daimi.au.dk) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __G_SEQUENCE_H__ #define __G_SEQUENCE_H__ #if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) #error "Only can be included directly." #endif #include G_BEGIN_DECLS typedef struct _GSequence GSequence; typedef struct _GSequenceNode GSequenceIter; typedef gint (* GSequenceIterCompareFunc) (GSequenceIter *a, GSequenceIter *b, gpointer data); /* 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, gpointer cmp_data); /* 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); G_END_DECLS #endif /* __G_SEQUENCE_H__ */ pkg-config-0.29.1/glib/glib/gbitlock.h0000664000175000017500000000563412651243552014370 00000000000000/* * Copyright © 2008 Ryan Lortie * Copyright © 2010 Codethink Limited * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the licence, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * * Author: Ryan Lortie */ #ifndef __G_BITLOCK_H__ #define __G_BITLOCK_H__ #include #if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) #error "Only can be included directly." #endif 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); #ifdef __GNUC__ #define g_pointer_bit_lock(address, lock_bit) \ (G_GNUC_EXTENSION ({ \ G_STATIC_ASSERT (sizeof *(address) == sizeof (gpointer)); \ g_pointer_bit_lock ((address), (lock_bit)); \ })) #define g_pointer_bit_trylock(address, lock_bit) \ (G_GNUC_EXTENSION ({ \ G_STATIC_ASSERT (sizeof *(address) == sizeof (gpointer)); \ g_pointer_bit_trylock ((address), (lock_bit)); \ })) #define g_pointer_bit_unlock(address, lock_bit) \ (G_GNUC_EXTENSION ({ \ G_STATIC_ASSERT (sizeof *(address) == sizeof (gpointer)); \ g_pointer_bit_unlock ((address), (lock_bit)); \ })) #endif G_END_DECLS #endif /* __G_BITLOCK_H_ */ pkg-config-0.29.1/glib/glib/ghook.h0000664000175000017500000001443412651243552013677 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the GLib Team and others 1997-2000. See the AUTHORS * file for a list of people on the GLib Team. See the ChangeLog * files for a list of changes. These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/. */ #ifndef __G_HOOK_H__ #define __G_HOOK_H__ #if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) #error "Only can be included directly." #endif #include G_BEGIN_DECLS /* --- typedefs --- */ typedef struct _GHook GHook; typedef struct _GHookList GHookList; typedef gint (*GHookCompareFunc) (GHook *new_hook, GHook *sibling); typedef gboolean (*GHookFindFunc) (GHook *hook, gpointer data); typedef void (*GHookMarshaller) (GHook *hook, gpointer marshal_data); typedef gboolean (*GHookCheckMarshaller) (GHook *hook, gpointer marshal_data); typedef void (*GHookFunc) (gpointer data); typedef gboolean (*GHookCheckFunc) (gpointer data); typedef void (*GHookFinalizeFunc) (GHookList *hook_list, GHook *hook); typedef enum { G_HOOK_FLAG_ACTIVE = 1 << 0, G_HOOK_FLAG_IN_CALL = 1 << 1, G_HOOK_FLAG_MASK = 0x0f } GHookFlagMask; #define G_HOOK_FLAG_USER_SHIFT (4) /* --- structures --- */ struct _GHookList { gulong seq_id; guint hook_size : 16; guint is_setup : 1; GHook *hooks; gpointer dummy3; GHookFinalizeFunc finalize_hook; gpointer dummy[2]; }; struct _GHook { gpointer data; GHook *next; GHook *prev; guint ref_count; gulong hook_id; guint flags; gpointer func; GDestroyNotify destroy; }; /* --- macros --- */ #define G_HOOK(hook) ((GHook*) (hook)) #define G_HOOK_FLAGS(hook) (G_HOOK (hook)->flags) #define G_HOOK_ACTIVE(hook) ((G_HOOK_FLAGS (hook) & \ G_HOOK_FLAG_ACTIVE) != 0) #define G_HOOK_IN_CALL(hook) ((G_HOOK_FLAGS (hook) & \ G_HOOK_FLAG_IN_CALL) != 0) #define G_HOOK_IS_VALID(hook) (G_HOOK (hook)->hook_id != 0 && \ (G_HOOK_FLAGS (hook) & \ G_HOOK_FLAG_ACTIVE)) #define G_HOOK_IS_UNLINKED(hook) (G_HOOK (hook)->next == NULL && \ G_HOOK (hook)->prev == NULL && \ G_HOOK (hook)->hook_id == 0 && \ G_HOOK (hook)->ref_count == 0) /* --- prototypes --- */ /* callback maintenance functions */ 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 */ #define g_hook_append( hook_list, 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, gpointer marshal_data); G_END_DECLS #endif /* __G_HOOK_H__ */ pkg-config-0.29.1/glib/glib/gi18n-lib.h0000664000175000017500000000264012275467762014273 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997, 2002 Peter Mattis, Red Hat, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __G_I18N_LIB_H__ #define __G_I18N_LIB_H__ #include #include #include #ifndef GETTEXT_PACKAGE #error You must define GETTEXT_PACKAGE before including gi18n-lib.h. Did you forget to include config.h? #endif #define _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String)) #define Q_(String) g_dpgettext (GETTEXT_PACKAGE, String, 0) #define N_(String) (String) #define C_(Context,String) g_dpgettext (GETTEXT_PACKAGE, Context "\004" String, strlen (Context) + 1) #define NC_(Context, String) (String) #endif /* __G_I18N_LIB_H__ */ pkg-config-0.29.1/glib/glib/Makefile.am0000664000175000017500000002032012651243552014442 00000000000000## Process this file with automake to produce Makefile.in include $(top_srcdir)/glib.mk # # Generate glibconfig.h # # The timestamp of the stamp file is used to indicate if glibconfig.h is # up to date with respect to config.status. In the usual case, changes # to config.status will not result in changes to glibconfig.h so we # avoid touching its timestamp (in order not to rebuild the whole tree). # DISTCLEANFILES += glibconfig-stamp glibconfig.h BUILT_SOURCES += glibconfig-stamp configexecincludedir = $(libdir)/glib-2.0/include nodist_noinst_HEADERS = glibconfig.h glibconfig-stamp: ../config.status $(AM_V_GEN) cd $(top_builddir) && \ $(SHELL) ./config.status glib/glibconfig.h @touch glibconfig-stamp if HAVE_GOOD_PRINTF else PRINTF_SUBDIR = gnulib printf_la = gnulib/libgnulib.la endif SUBDIRS = libcharset $(PRINTF_SUBDIR) . DIST_SUBDIRS = libcharset gnulib AM_CPPFLAGS = \ $(glib_INCLUDES) \ $(pcre_inc) \ -DG_LOG_DOMAIN=\"GLib\" \ $(GLIB_DEBUG_FLAGS) \ -DGLIB_COMPILATION \ -DPCRE_STATIC AM_CFLAGS = $(GLIB_WARN_CFLAGS) MIRRORING_TAB_SOURCE = \ glib-mirroring-tab/Makefile \ glib-mirroring-tab/gen-mirroring-tab.c \ glib-mirroring-tab/packtab.h \ glib-mirroring-tab/packtab.c EXTRA_DIST += \ glib.rc.in \ gen-iswide-table.py \ gen-unicode-tables.pl \ gen-script-table.pl \ win_iconv.c \ docs.c \ gconstructor.h \ $(MIRRORING_TAB_SOURCE) # These may be in the builddir too 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 install_ms_lib_cmd = $(INSTALL) glib-2.0.lib $(DESTDIR)$(libdir) uninstall_ms_lib_cmd = -rm $(DESTDIR)$(libdir)/glib-2.0.lib endif endif install-ms-lib: $(install_ms_lib_cmd) uninstall-ms-lib: $(uninstall_ms_lib_cmd) deprecated_sources = \ deprecated/gallocator.c \ deprecated/gcache.c \ deprecated/gcompletion.c \ deprecated/grel.c \ deprecated/gthread-deprecated.c libglib_2_0_la_SOURCES = \ $(deprecated_sources) \ garray.c \ gasyncqueue.c \ gasyncqueueprivate.h \ gatomic.c \ gbacktrace.c \ gbase64.c \ gbitlock.c \ gbookmarkfile.c \ gbsearcharray.h \ gbytes.c \ gbytes.h \ gcharset.c \ gcharsetprivate.h \ gchecksum.c \ gconvert.c \ gdataset.c \ gdatasetprivate.h \ gdate.c \ gdatetime.c \ gdir.c \ genviron.c \ gerror.c \ gfileutils.c \ ggettext.c \ ghash.c \ ghmac.c \ ghook.c \ ghostutils.c \ giochannel.c \ gkeyfile.c \ glibintl.h \ glib_trace.h \ glib-init.h \ glib-init.c \ glib-private.h \ glib-private.c \ glist.c \ gmain-internal.h \ gmain.c \ gmappedfile.c \ gmarkup.c \ gmem.c \ gmessages.c \ gmessages-private.h \ gmirroringtable.h \ gnode.c \ goption.c \ gpattern.c \ gpoll.c \ gprimes.c \ gqsort.c \ gquark.c \ gqueue.c \ grand.c \ gscanner.c \ gscripttable.h \ gsequence.c \ gshell.c \ gslice.c \ gslist.c \ gstdio.c \ gstrfuncs.c \ gstring.c \ gstringchunk.c \ gtestutils.c \ gthread.c \ gthreadprivate.h \ gthreadpool.c \ gtimer.c \ gtimezone.c \ gtrashstack.c \ gtree.c \ guniprop.c \ gutf8.c \ gunibreak.h \ gunibreak.c \ gunichartables.h \ gunicollate.c \ gunicomp.h \ gunidecomp.h \ gunidecomp.c \ gunicodeprivate.h \ gurifuncs.c \ gutils.c \ gvariant.h \ gvariant.c \ gvariant-core.h \ gvariant-core.c \ gvariant-internal.h \ gvariant-parser.c \ gvariant-serialiser.h \ gvariant-serialiser.c \ gvarianttypeinfo.h \ gvarianttypeinfo.c \ gvarianttype.c \ gversion.c \ gwakeup.h \ gwakeup.c \ gprintf.c \ gprintfint.h \ valgrind.h if OS_UNIX libglib_2_0_la_SOURCES += glib-unix.c endif 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 \ giowin32.c \ gspawn.c \ gspawn-win32.c \ gwin32.c glibincludedir=$(includedir)/glib-2.0 noinst_HEADERS = \ glib-unix.h \ glib-object.h \ glib.h deprecatedincludedir=$(includedir)/glib-2.0/glib/deprecated noinst_HEADERS += \ deprecated/gallocator.h \ deprecated/gcache.h \ deprecated/gcompletion.h \ deprecated/gmain.h \ deprecated/grel.h \ deprecated/gthread.h glibsubincludedir=$(includedir)/glib-2.0/glib noinst_HEADERS += \ galloca.h \ garray.h \ gasyncqueue.h \ gatomic.h \ gbacktrace.h \ gbase64.h \ gbitlock.h \ gbookmarkfile.h \ gbytes.h \ gcharset.h \ gchecksum.h \ gconvert.h \ gdataset.h \ gdate.h \ gdatetime.h \ gdir.h \ genviron.h \ gerror.h \ gfileutils.h \ ggettext.h \ ghash.h \ ghmac.h \ ghook.h \ ghostutils.h \ gi18n.h \ gi18n-lib.h \ giochannel.h \ gkeyfile.h \ glist.h \ gmacros.h \ gmain.h \ gmappedfile.h \ gmarkup.h \ gmem.h \ gmessages.h \ gnode.h \ goption.h \ gpattern.h \ gpoll.h \ gprimes.h \ gqsort.h \ gquark.h \ gqueue.h \ grand.h \ gscanner.h \ gsequence.h \ gshell.h \ gslice.h \ gslist.h \ gspawn.h \ gstdio.h \ gstrfuncs.h \ gtestutils.h \ gstring.h \ gstringchunk.h \ gthread.h \ gthreadpool.h \ gtimer.h \ gtimezone.h \ gtrashstack.h \ gtree.h \ gtypes.h \ gunicode.h \ gurifuncs.h \ gutils.h \ gvarianttype.h \ gvariant.h \ gversion.h \ gversionmacros.h \ gwin32.h \ gprintf.h # This is read by gobject-introspection/misc/ and gtk-doc glib-public-headers.txt: Makefile echo $(glibinclude_HEADERS) $(glibsubinclude_HEADERS) > $@.tmp && mv $@.tmp $@ CLEANFILES += glib-public-headers.txt all-local: glib-public-headers.txt if PLATFORM_WIN32 no_undefined = -no-undefined endif if OS_WIN32_AND_DLL_COMPILATION glib_win32_res = glib-win32-res.o glib_win32_res_ldflag = -Wl,$(glib_win32_res) 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) gspawn-win32-helper-console.c: echo '#define HELPER_CONSOLE' >$@ echo '#include "gspawn-win32-helper.c"' >>$@ gspawn-win64-helper.c: echo '#include "gspawn-win32-helper.c"' >$@ gspawn-win64-helper-console.c: echo '#define HELPER_CONSOLE' >$@ echo '#include "gspawn-win32-helper.c"' >>$@ glib-win32-res.o: glib.rc $(WINDRES) glib.rc $@ if OS_UNIX auto_config_binscripts = gtester-report EXTRA_DIST += ${auto_config_binscripts} CONFIGVARS = \ "bindir" : "${bindir}", \ "glib-version" : "${GLIB_VERSION}" endif glib-2.0.lib: libglib-2.0.la glib.def lib -machine:@LIB_EXE_MACHINE_FLAG@ -name:libglib-2.0-$(LT_CURRENT_MINUS_AGE).dll -def:$(builddir)/glib.def -out:$@ dist-hook: $(BUILT_EXTRA_DIST) files='$(BUILT_EXTRA_DIST)'; \ for f in $$files; do \ if test -f $$f; then d=.; else d=$(srcdir); fi; \ cp $$d/$$f $(distdir) || exit 1; done ../build/win32/vs9/glib.vcproj: $(top_srcdir)/build/win32/vs9/glib.vcprojin for F in `echo $(libglib_2_0_la_SOURCES) | tr '/' '\\'`; do \ case $$F in \ *-unix.c|gthread-*.c) \ ;; \ *.c) echo ' ' \ ;; \ esac; \ done >libglib.sourcefiles $(CPP) -P - <$(top_srcdir)/build/win32/vs9/glib.vcprojin >$@ rm libglib.sourcefiles ../build/win32/vs10/glib.vcxproj: $(top_srcdir)/build/win32/vs10/glib.vcxprojin for F in `echo $(libglib_2_0_la_SOURCES) | tr '/' '\\'`; do \ case $$F in \ *-unix.c|gthread-*.c) \ ;; \ *.c) echo ' ' \ ;; \ esac; \ done >libglib.vs10.sourcefiles $(CPP) -P - <$(top_srcdir)/build/win32/vs10/glib.vcxprojin >$@ rm libglib.vs10.sourcefiles ../build/win32/vs10/glib.vcxproj.filters: $(top_srcdir)/build/win32/vs10/glib.vcxproj.filtersin for F in `echo $(libglib_2_0_la_SOURCES) | tr '/' '\\'`; do \ case $$F in \ *-unix.c|gthread-*.c) \ ;; \ *.c) echo ' Source Files' \ ;; \ esac; \ done >libglib.vs10.sourcefiles.filters $(CPP) -P - <$(top_srcdir)/build/win32/vs10/glib.vcxproj.filtersin >$@ rm libglib.vs10.sourcefiles.filters pkg-config-0.29.1/glib/glib/gslice.h0000664000175000017500000000734212651243552014036 00000000000000/* GLIB sliced memory - fast threaded memory chunk allocator * Copyright (C) 2005 Tim Janik * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __G_SLICE_H__ #define __G_SLICE_H__ #if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) #error "Only can be included directly." #endif #include 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); #define g_slice_new(type) ((type*) g_slice_alloc (sizeof (type))) #define g_slice_new0(type) ((type*) g_slice_alloc0 (sizeof (type))) /* MemoryBlockType * * g_slice_dup (MemoryBlockType, * MemoryBlockType *mem_block); * g_slice_free (MemoryBlockType, * MemoryBlockType *mem_block); * g_slice_free_chain (MemoryBlockType, * MemoryBlockType *first_chain_block, * memory_block_next_field); * pseudo prototypes for the macro * definitions following below. */ /* we go through extra hoops to ensure type safety */ #define g_slice_dup(type, mem) \ (1 ? (type*) g_slice_copy (sizeof (type), (mem)) \ : ((void) ((type*) 0 == (mem)), (type*) 0)) #define g_slice_free(type, mem) do { \ if (1) g_slice_free1 (sizeof (type), (mem)); \ else (void) ((type*) 0 == (mem)); \ } while (0) #define g_slice_free_chain(type, mem_chain, next) do { \ if (1) g_slice_free_chain_with_offset (sizeof (type), \ (mem_chain), G_STRUCT_OFFSET (type, next)); \ else (void) ((type*) 0 == (mem_chain)); \ } while (0) /* --- internal debugging API --- */ typedef enum { G_SLICE_CONFIG_ALWAYS_MALLOC = 1, G_SLICE_CONFIG_BYPASS_MAGAZINES, G_SLICE_CONFIG_WORKING_SET_MSECS, G_SLICE_CONFIG_COLOR_INCREMENT, G_SLICE_CONFIG_CHUNK_SIZES, G_SLICE_CONFIG_CONTENTION_COUNTER } GSliceConfig; 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__ */ pkg-config-0.29.1/glib/glib/gdate.c0000664000175000017500000020256612651243552013654 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the GLib Team and others 1997-2000. See the AUTHORS * file for a list of people on the GLib Team. See the ChangeLog * files for a list of changes. These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/. */ /* * MT safe */ #include "config.h" #include "glibconfig.h" #define DEBUG_MSG(x) /* */ #ifdef G_ENABLE_DEBUG /* #define DEBUG_MSG(args) g_message args ; */ #endif #include #include #include #include #ifdef G_OS_WIN32 #include #endif #include "gdate.h" #include "gconvert.h" #include "gmem.h" #include "gstrfuncs.h" #include "gtestutils.h" #include "gthread.h" #include "gunicode.h" #ifdef G_OS_WIN32 #include "garray.h" #endif /** * SECTION:date * @title: Date and Time Functions * @short_description: calendrical calculations and miscellaneous time stuff * * The #GDate data structure represents a day between January 1, Year 1, * and sometime a few thousand years in the future (right now it will go * to the year 65535 or so, but g_date_set_parse() only parses up to the * year 8000 or so - just count on "a few thousand"). #GDate is meant to * represent everyday dates, not astronomical dates or historical dates * or ISO timestamps or the like. It extrapolates the current Gregorian * calendar forward and backward in time; there is no attempt to change * the calendar to match time periods or locations. #GDate does not store * time information; it represents a day. * * The #GDate implementation has several nice features; it is only a * 64-bit struct, so storing large numbers of dates is very efficient. It * can keep both a Julian and day-month-year representation of the date, * since some calculations are much easier with one representation or the * other. A Julian representation is simply a count of days since some * fixed day in the past; for #GDate the fixed day is January 1, 1 AD. * ("Julian" dates in the #GDate API aren't really Julian dates in the * technical sense; technically, Julian dates count from the start of the * Julian period, Jan 1, 4713 BC). * * #GDate is simple to use. First you need a "blank" date; you can get a * dynamically allocated date from g_date_new(), or you can declare an * automatic variable or array and initialize it to a sane state by * calling g_date_clear(). A cleared date is sane; it's safe to call * g_date_set_dmy() and the other mutator functions to initialize the * value of a cleared date. However, a cleared date is initially * invalid, meaning that it doesn't represent a day * that exists. It is undefined to call any of the date calculation * routines on an invalid date. If you obtain a date from a user or other * unpredictable source, you should check its validity with the * g_date_valid() predicate. g_date_valid() is also used to check for * errors with g_date_set_parse() and other functions that can * fail. Dates can be invalidated by calling g_date_clear() again. * * It is very important to use the API to access the #GDate * struct. Often only the day-month-year or only the Julian * representation is valid. Sometimes neither is valid. Use the API. * * GLib also features #GDateTime which represents a precise time. */ /** * G_USEC_PER_SEC: * * Number of microseconds in one second (1 million). * This macro is provided for code readability. */ /** * GTimeVal: * @tv_sec: seconds * @tv_usec: microseconds * * Represents a precise time, with seconds and microseconds. * Similar to the struct timeval returned by * the gettimeofday() UNIX system call. * * GLib is attempting to unify around the use of 64bit integers to * represent microsecond-precision time. As such, this type will be * removed from a future version of GLib. */ /** * GDate: * @julian_days: the Julian representation of the date * @julian: this bit is set if @julian_days is valid * @dmy: this is set if @day, @month and @year are valid * @day: the day of the day-month-year representation of the date, * as a number between 1 and 31 * @month: the day of the day-month-year representation of the date, * as a number between 1 and 12 * @year: the day of the day-month-year representation of the date * * Represents a day between January 1, Year 1 and a few thousand years in * the future. None of its members should be accessed directly. If the * GDate is obtained from g_date_new(), it will * be safe to mutate but invalid and thus not safe for calendrical * computations. If it's declared on the stack, it will contain garbage * so must be initialized with g_date_clear(). g_date_clear() makes the * date invalid but sane. An invalid date doesn't represent a day, it's * "empty." A date becomes valid after you set it to a Julian day or you * set a day, month, and year. */ /** * GTime: * * Simply a replacement for time_t. It has been deprecated * since it is not equivalent to time_t * on 64-bit platforms with a 64-bit time_t. * Unrelated to #GTimer. * * Note that GTime is defined to always be a 32bit integer, * unlike time_t which may be 64bit on some systems. * Therefore, GTime will overflow in the year 2038, and * you cannot use the address of a GTime variable as argument * to the UNIX time() function. Instead, do the following: * |[ * time_t ttime; * GTime gtime; * * time (&ttime); * gtime = (GTime)ttime; * ]| */ /** * GDateDMY: * @G_DATE_DAY: a day * @G_DATE_MONTH: a month * @G_DATE_YEAR: a year * * This enumeration isn't used in the API, but may be useful if you need * to mark a number as a day, month, or year. */ /** * GDateDay: * * Integer representing a day of the month; between 1 and * 31. #G_DATE_BAD_DAY represents an invalid day of the month. */ /** * GDateMonth: * @G_DATE_BAD_MONTH: invalid value * @G_DATE_JANUARY: January * @G_DATE_FEBRUARY: February * @G_DATE_MARCH: March * @G_DATE_APRIL: April * @G_DATE_MAY: May * @G_DATE_JUNE: June * @G_DATE_JULY: July * @G_DATE_AUGUST: August * @G_DATE_SEPTEMBER: September * @G_DATE_OCTOBER: October * @G_DATE_NOVEMBER: November * @G_DATE_DECEMBER: December * * Enumeration representing a month; values are #G_DATE_JANUARY, * #G_DATE_FEBRUARY, etc. #G_DATE_BAD_MONTH is the invalid value. */ /** * GDateYear: * * Integer representing a year; #G_DATE_BAD_YEAR is the invalid * value. The year must be 1 or higher; negative (BC) years are not * allowed. The year is represented with four digits. */ /** * GDateWeekday: * @G_DATE_BAD_WEEKDAY: invalid value * @G_DATE_MONDAY: Monday * @G_DATE_TUESDAY: Tuesday * @G_DATE_WEDNESDAY: Wednesday * @G_DATE_THURSDAY: Thursday * @G_DATE_FRIDAY: Friday * @G_DATE_SATURDAY: Saturday * @G_DATE_SUNDAY: Sunday * * Enumeration representing a day of the week; #G_DATE_MONDAY, * #G_DATE_TUESDAY, etc. #G_DATE_BAD_WEEKDAY is an invalid weekday. */ /** * G_DATE_BAD_DAY: * * Represents an invalid #GDateDay. */ /** * G_DATE_BAD_JULIAN: * * Represents an invalid Julian day number. */ /** * G_DATE_BAD_YEAR: * * Represents an invalid year. */ /** * g_date_new: * * Allocates a #GDate and initializes * it to a sane state. The new date will * be cleared (as if you'd called g_date_clear()) but invalid (it won't * represent an existing day). Free the return value with g_date_free(). * * Returns: a newly-allocated #GDate */ GDate* g_date_new (void) { GDate *d = g_new0 (GDate, 1); /* happily, 0 is the invalid flag for everything. */ return d; } /** * g_date_new_dmy: * @day: day of the month * @month: month of the year * @year: year * * Like g_date_new(), but also sets the value of the date. Assuming the * day-month-year triplet you pass in represents an existing day, the * returned date will be valid. * * Returns: a newly-allocated #GDate initialized with @day, @month, and @year */ GDate* g_date_new_dmy (GDateDay day, GDateMonth m, GDateYear y) { GDate *d; g_return_val_if_fail (g_date_valid_dmy (day, m, y), NULL); d = g_new (GDate, 1); d->julian = FALSE; d->dmy = TRUE; d->month = m; d->day = day; d->year = y; g_assert (g_date_valid (d)); return d; } /** * g_date_new_julian: * @julian_day: days since January 1, Year 1 * * Like g_date_new(), but also sets the value of the date. Assuming the * Julian day number you pass in is valid (greater than 0, less than an * unreasonably large number), the returned date will be valid. * * Returns: a newly-allocated #GDate initialized with @julian_day */ GDate* g_date_new_julian (guint32 julian_day) { GDate *d; g_return_val_if_fail (g_date_valid_julian (julian_day), NULL); d = g_new (GDate, 1); d->julian = TRUE; d->dmy = FALSE; d->julian_days = julian_day; g_assert (g_date_valid (d)); return d; } /** * g_date_free: * @date: a #GDate to free * * Frees a #GDate returned from g_date_new(). */ void g_date_free (GDate *date) { g_return_if_fail (date != NULL); g_free (date); } /** * g_date_valid: * @date: a #GDate to check * * Returns %TRUE if the #GDate represents an existing day. The date must not * contain garbage; it should have been initialized with g_date_clear() * if it wasn't allocated by one of the g_date_new() variants. * * Returns: Whether the date is valid */ gboolean g_date_valid (const GDate *d) { g_return_val_if_fail (d != NULL, FALSE); return (d->julian || d->dmy); } static const guint8 days_in_months[2][13] = { /* error, jan feb mar apr may jun jul aug sep oct nov dec */ { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }, { 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 } /* leap year */ }; static const guint16 days_in_year[2][14] = { /* 0, jan feb mar apr may jun jul aug sep oct nov dec */ { 0, 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 }, { 0, 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366 } }; /** * g_date_valid_month: * @month: month * * Returns %TRUE if the month value is valid. The 12 #GDateMonth * enumeration values are the only valid months. * * Returns: %TRUE if the month is valid */ gboolean g_date_valid_month (GDateMonth m) { return ( (m > G_DATE_BAD_MONTH) && (m < 13) ); } /** * g_date_valid_year: * @year: year * * Returns %TRUE if the year is valid. Any year greater than 0 is valid, * though there is a 16-bit limit to what #GDate will understand. * * Returns: %TRUE if the year is valid */ gboolean g_date_valid_year (GDateYear y) { return ( y > G_DATE_BAD_YEAR ); } /** * g_date_valid_day: * @day: day to check * * Returns %TRUE if the day of the month is valid (a day is valid if it's * between 1 and 31 inclusive). * * Returns: %TRUE if the day is valid */ gboolean g_date_valid_day (GDateDay d) { return ( (d > G_DATE_BAD_DAY) && (d < 32) ); } /** * g_date_valid_weekday: * @weekday: weekday * * Returns %TRUE if the weekday is valid. The seven #GDateWeekday enumeration * values are the only valid weekdays. * * Returns: %TRUE if the weekday is valid */ gboolean g_date_valid_weekday (GDateWeekday w) { return ( (w > G_DATE_BAD_WEEKDAY) && (w < 8) ); } /** * g_date_valid_julian: * @julian_date: Julian day to check * * Returns %TRUE if the Julian day is valid. Anything greater than zero * is basically a valid Julian, though there is a 32-bit limit. * * Returns: %TRUE if the Julian day is valid */ gboolean g_date_valid_julian (guint32 j) { return (j > G_DATE_BAD_JULIAN); } /** * g_date_valid_dmy: * @day: day * @month: month * @year: year * * Returns %TRUE if the day-month-year triplet forms a valid, existing day * in the range of days #GDate understands (Year 1 or later, no more than * a few thousand years in the future). * * Returns: %TRUE if the date is a valid one */ gboolean g_date_valid_dmy (GDateDay d, GDateMonth m, GDateYear y) { return ( (m > G_DATE_BAD_MONTH) && (m < 13) && (d > G_DATE_BAD_DAY) && (y > G_DATE_BAD_YEAR) && /* must check before using g_date_is_leap_year */ (d <= (g_date_is_leap_year (y) ? days_in_months[1][m] : days_in_months[0][m])) ); } /* "Julian days" just means an absolute number of days, where Day 1 == * Jan 1, Year 1 */ static void g_date_update_julian (const GDate *const_d) { GDate *d = (GDate *) const_d; GDateYear year; gint idx; g_return_if_fail (d != NULL); g_return_if_fail (d->dmy); g_return_if_fail (!d->julian); g_return_if_fail (g_date_valid_dmy (d->day, d->month, d->year)); /* What we actually do is: multiply years * 365 days in the year, * add the number of years divided by 4, subtract the number of * years divided by 100 and add the number of years divided by 400, * which accounts for leap year stuff. Code from Steffen Beyer's * DateCalc. */ year = d->year - 1; /* we know d->year > 0 since it's valid */ d->julian_days = year * 365U; d->julian_days += (year >>= 2); /* divide by 4 and add */ d->julian_days -= (year /= 25); /* divides original # years by 100 */ d->julian_days += year >> 2; /* divides by 4, which divides original by 400 */ idx = g_date_is_leap_year (d->year) ? 1 : 0; d->julian_days += days_in_year[idx][d->month] + d->day; g_return_if_fail (g_date_valid_julian (d->julian_days)); d->julian = TRUE; } static void g_date_update_dmy (const GDate *const_d) { GDate *d = (GDate *) const_d; GDateYear y; GDateMonth m; GDateDay day; guint32 A, B, C, D, E, M; g_return_if_fail (d != NULL); g_return_if_fail (d->julian); g_return_if_fail (!d->dmy); g_return_if_fail (g_date_valid_julian (d->julian_days)); /* Formula taken from the Calendar FAQ; the formula was for the * Julian Period which starts on 1 January 4713 BC, so we add * 1,721,425 to the number of days before doing the formula. * * I'm sure this can be simplified for our 1 January 1 AD period * start, but I can't figure out how to unpack the formula. */ A = d->julian_days + 1721425 + 32045; B = ( 4 *(A + 36524) )/ 146097 - 1; C = A - (146097 * B)/4; D = ( 4 * (C + 365) ) / 1461 - 1; E = C - ((1461*D) / 4); M = (5 * (E - 1) + 2)/153; m = M + 3 - (12*(M/10)); day = E - (153*M + 2)/5; y = 100 * B + D - 4800 + (M/10); #ifdef G_ENABLE_DEBUG if (!g_date_valid_dmy (day, m, y)) g_warning ("\nOOPS julian: %u computed dmy: %u %u %u\n", d->julian_days, day, m, y); #endif d->month = m; d->day = day; d->year = y; d->dmy = TRUE; } /** * g_date_get_weekday: * @date: a #GDate * * Returns the day of the week for a #GDate. The date must be valid. * * Returns: day of the week as a #GDateWeekday. */ GDateWeekday g_date_get_weekday (const GDate *d) { g_return_val_if_fail (g_date_valid (d), G_DATE_BAD_WEEKDAY); if (!d->julian) g_date_update_julian (d); g_return_val_if_fail (d->julian, G_DATE_BAD_WEEKDAY); return ((d->julian_days - 1) % 7) + 1; } /** * g_date_get_month: * @date: a #GDate to get the month from * * Returns the month of the year. The date must be valid. * * Returns: month of the year as a #GDateMonth */ GDateMonth g_date_get_month (const GDate *d) { g_return_val_if_fail (g_date_valid (d), G_DATE_BAD_MONTH); if (!d->dmy) g_date_update_dmy (d); g_return_val_if_fail (d->dmy, G_DATE_BAD_MONTH); return d->month; } /** * g_date_get_year: * @date: a #GDate * * Returns the year of a #GDate. The date must be valid. * * Returns: year in which the date falls */ GDateYear g_date_get_year (const GDate *d) { g_return_val_if_fail (g_date_valid (d), G_DATE_BAD_YEAR); if (!d->dmy) g_date_update_dmy (d); g_return_val_if_fail (d->dmy, G_DATE_BAD_YEAR); return d->year; } /** * g_date_get_day: * @date: a #GDate to extract the day of the month from * * Returns the day of the month. The date must be valid. * * Returns: day of the month */ GDateDay g_date_get_day (const GDate *d) { g_return_val_if_fail (g_date_valid (d), G_DATE_BAD_DAY); if (!d->dmy) g_date_update_dmy (d); g_return_val_if_fail (d->dmy, G_DATE_BAD_DAY); return d->day; } /** * g_date_get_julian: * @date: a #GDate to extract the Julian day from * * Returns the Julian day or "serial number" of the #GDate. The * Julian day is simply the number of days since January 1, Year 1; i.e., * January 1, Year 1 is Julian day 1; January 2, Year 1 is Julian day 2, * etc. The date must be valid. * * Returns: Julian day */ guint32 g_date_get_julian (const GDate *d) { g_return_val_if_fail (g_date_valid (d), G_DATE_BAD_JULIAN); if (!d->julian) g_date_update_julian (d); g_return_val_if_fail (d->julian, G_DATE_BAD_JULIAN); return d->julian_days; } /** * g_date_get_day_of_year: * @date: a #GDate to extract day of year from * * Returns the day of the year, where Jan 1 is the first day of the * year. The date must be valid. * * Returns: day of the year */ guint g_date_get_day_of_year (const GDate *d) { gint idx; g_return_val_if_fail (g_date_valid (d), 0); if (!d->dmy) g_date_update_dmy (d); g_return_val_if_fail (d->dmy, 0); idx = g_date_is_leap_year (d->year) ? 1 : 0; return (days_in_year[idx][d->month] + d->day); } /** * g_date_get_monday_week_of_year: * @date: a #GDate * * Returns the week of the year, where weeks are understood to start on * Monday. If the date is before the first Monday of the year, return * 0. The date must be valid. * * Returns: week of the year */ guint g_date_get_monday_week_of_year (const GDate *d) { GDateWeekday wd; guint day; GDate first; g_return_val_if_fail (g_date_valid (d), 0); if (!d->dmy) g_date_update_dmy (d); g_return_val_if_fail (d->dmy, 0); g_date_clear (&first, 1); g_date_set_dmy (&first, 1, 1, d->year); wd = g_date_get_weekday (&first) - 1; /* make Monday day 0 */ day = g_date_get_day_of_year (d) - 1; return ((day + wd)/7U + (wd == 0 ? 1 : 0)); } /** * g_date_get_sunday_week_of_year: * @date: a #GDate * * Returns the week of the year during which this date falls, if weeks * are understood to being on Sunday. The date must be valid. Can return * 0 if the day is before the first Sunday of the year. * * Returns: week number */ guint g_date_get_sunday_week_of_year (const GDate *d) { GDateWeekday wd; guint day; GDate first; g_return_val_if_fail (g_date_valid (d), 0); if (!d->dmy) g_date_update_dmy (d); g_return_val_if_fail (d->dmy, 0); g_date_clear (&first, 1); g_date_set_dmy (&first, 1, 1, d->year); wd = g_date_get_weekday (&first); if (wd == 7) wd = 0; /* make Sunday day 0 */ day = g_date_get_day_of_year (d) - 1; return ((day + wd)/7U + (wd == 0 ? 1 : 0)); } /** * g_date_get_iso8601_week_of_year: * @date: a valid #GDate * * Returns the week of the year, where weeks are interpreted according * to ISO 8601. * * Returns: ISO 8601 week number of the year. * * Since: 2.6 **/ guint g_date_get_iso8601_week_of_year (const GDate *d) { guint j, d4, L, d1, w; g_return_val_if_fail (g_date_valid (d), 0); if (!d->julian) g_date_update_julian (d); g_return_val_if_fail (d->julian, 0); /* Formula taken from the Calendar FAQ; the formula was for the * Julian Period which starts on 1 January 4713 BC, so we add * 1,721,425 to the number of days before doing the formula. */ j = d->julian_days + 1721425; d4 = (j + 31741 - (j % 7)) % 146097 % 36524 % 1461; L = d4 / 1460; d1 = ((d4 - L) % 365) + L; w = d1 / 7 + 1; return w; } /** * g_date_days_between: * @date1: the first date * @date2: the second date * * Computes the number of days between two dates. * If @date2 is prior to @date1, the returned value is negative. * Both dates must be valid. * * Returns: the number of days between @date1 and @date2 */ gint g_date_days_between (const GDate *d1, const GDate *d2) { g_return_val_if_fail (g_date_valid (d1), 0); g_return_val_if_fail (g_date_valid (d2), 0); return (gint)g_date_get_julian (d2) - (gint)g_date_get_julian (d1); } /** * g_date_clear: * @date: pointer to one or more dates to clear * @n_dates: number of dates to clear * * Initializes one or more #GDate structs to a sane but invalid * state. The cleared dates will not represent an existing date, but will * not contain garbage. Useful to init a date declared on the stack. * Validity can be tested with g_date_valid(). */ void g_date_clear (GDate *d, guint ndates) { g_return_if_fail (d != NULL); g_return_if_fail (ndates != 0); memset (d, 0x0, ndates*sizeof (GDate)); } G_LOCK_DEFINE_STATIC (g_date_global); /* These are for the parser, output to the user should use * * g_date_strftime () - this creates more never-freed memory to annoy * all those memory debugger users. :-) */ static gchar *long_month_names[13] = { NULL, }; static gchar *short_month_names[13] = { NULL, }; /* This tells us if we need to update the parse info */ static gchar *current_locale = NULL; /* order of these in the current locale */ static GDateDMY dmy_order[3] = { G_DATE_DAY, G_DATE_MONTH, G_DATE_YEAR }; /* Where to chop two-digit years: i.e., for the 1930 default, numbers * 29 and below are counted as in the year 2000, numbers 30 and above * are counted as in the year 1900. */ static const GDateYear twodigit_start_year = 1930; /* It is impossible to enter a year between 1 AD and 99 AD with this * in effect. */ static gboolean using_twodigit_years = FALSE; /* Adjustment of locale era to AD, non-zero means using locale era */ static gint locale_era_adjust = 0; struct _GDateParseTokens { gint num_ints; gint n[3]; guint month; }; typedef struct _GDateParseTokens GDateParseTokens; #define NUM_LEN 10 /* HOLDS: g_date_global_lock */ static void g_date_fill_parse_tokens (const gchar *str, GDateParseTokens *pt) { gchar num[4][NUM_LEN+1]; gint i; const guchar *s; /* We count 4, but store 3; so we can give an error * if there are 4. */ num[0][0] = num[1][0] = num[2][0] = num[3][0] = '\0'; s = (const guchar *) str; pt->num_ints = 0; while (*s && pt->num_ints < 4) { i = 0; while (*s && g_ascii_isdigit (*s) && i < NUM_LEN) { num[pt->num_ints][i] = *s; ++s; ++i; } if (i > 0) { num[pt->num_ints][i] = '\0'; ++(pt->num_ints); } if (*s == '\0') break; ++s; } pt->n[0] = pt->num_ints > 0 ? atoi (num[0]) : 0; pt->n[1] = pt->num_ints > 1 ? atoi (num[1]) : 0; pt->n[2] = pt->num_ints > 2 ? atoi (num[2]) : 0; pt->month = G_DATE_BAD_MONTH; if (pt->num_ints < 3) { gchar *casefold; gchar *normalized; casefold = g_utf8_casefold (str, -1); normalized = g_utf8_normalize (casefold, -1, G_NORMALIZE_ALL); g_free (casefold); i = 1; while (i < 13) { if (long_month_names[i] != NULL) { const gchar *found = strstr (normalized, long_month_names[i]); if (found != NULL) { pt->month = i; break; } } if (short_month_names[i] != NULL) { const gchar *found = strstr (normalized, short_month_names[i]); if (found != NULL) { pt->month = i; break; } } ++i; } g_free (normalized); } } /* HOLDS: g_date_global_lock */ static void g_date_prepare_to_parse (const gchar *str, GDateParseTokens *pt) { const gchar *locale = setlocale (LC_TIME, NULL); gboolean recompute_localeinfo = FALSE; GDate d; g_return_if_fail (locale != NULL); /* should not happen */ g_date_clear (&d, 1); /* clear for scratch use */ if ( (current_locale == NULL) || (strcmp (locale, current_locale) != 0) ) recompute_localeinfo = TRUE; /* Uh, there used to be a reason for the temporary */ if (recompute_localeinfo) { int i = 1; GDateParseTokens testpt; gchar buf[128]; g_free (current_locale); /* still works if current_locale == NULL */ current_locale = g_strdup (locale); short_month_names[0] = "Error"; long_month_names[0] = "Error"; while (i < 13) { gchar *casefold; g_date_set_dmy (&d, 1, i, 1); g_return_if_fail (g_date_valid (&d)); g_date_strftime (buf, 127, "%b", &d); casefold = g_utf8_casefold (buf, -1); g_free (short_month_names[i]); short_month_names[i] = g_utf8_normalize (casefold, -1, G_NORMALIZE_ALL); g_free (casefold); g_date_strftime (buf, 127, "%B", &d); casefold = g_utf8_casefold (buf, -1); g_free (long_month_names[i]); long_month_names[i] = g_utf8_normalize (casefold, -1, G_NORMALIZE_ALL); g_free (casefold); ++i; } /* Determine DMY order */ /* had to pick a random day - don't change this, some strftimes * are broken on some days, and this one is good so far. */ g_date_set_dmy (&d, 4, 7, 1976); g_date_strftime (buf, 127, "%x", &d); g_date_fill_parse_tokens (buf, &testpt); i = 0; while (i < testpt.num_ints) { switch (testpt.n[i]) { case 7: dmy_order[i] = G_DATE_MONTH; break; case 4: dmy_order[i] = G_DATE_DAY; break; case 76: using_twodigit_years = TRUE; /* FALL THRU */ case 1976: dmy_order[i] = G_DATE_YEAR; break; default: /* assume locale era */ locale_era_adjust = 1976 - testpt.n[i]; dmy_order[i] = G_DATE_YEAR; break; } ++i; } #if defined(G_ENABLE_DEBUG) && 0 DEBUG_MSG (("**GDate prepared a new set of locale-specific parse rules.")); i = 1; while (i < 13) { DEBUG_MSG ((" %s %s", long_month_names[i], short_month_names[i])); ++i; } if (using_twodigit_years) { DEBUG_MSG (("**Using twodigit years with cutoff year: %u", twodigit_start_year)); } { gchar *strings[3]; i = 0; while (i < 3) { switch (dmy_order[i]) { case G_DATE_MONTH: strings[i] = "Month"; break; case G_DATE_YEAR: strings[i] = "Year"; break; case G_DATE_DAY: strings[i] = "Day"; break; default: strings[i] = NULL; break; } ++i; } DEBUG_MSG (("**Order: %s, %s, %s", strings[0], strings[1], strings[2])); DEBUG_MSG (("**Sample date in this locale: '%s'", buf)); } #endif } g_date_fill_parse_tokens (str, pt); } /** * g_date_set_parse: * @date: a #GDate to fill in * @str: string to parse * * Parses a user-inputted string @str, and try to figure out what date it * represents, taking the current locale * into account. If the string is successfully parsed, the date will be * valid after the call. Otherwise, it will be invalid. You should check * using g_date_valid() to see whether the parsing succeeded. * * This function is not appropriate for file formats and the like; it * isn't very precise, and its exact behavior varies with the locale. * It's intended to be a heuristic routine that guesses what the user * means by a given string (and it does work pretty well in that * capacity). */ void g_date_set_parse (GDate *d, const gchar *str) { GDateParseTokens pt; guint m = G_DATE_BAD_MONTH, day = G_DATE_BAD_DAY, y = G_DATE_BAD_YEAR; g_return_if_fail (d != NULL); /* set invalid */ g_date_clear (d, 1); G_LOCK (g_date_global); g_date_prepare_to_parse (str, &pt); DEBUG_MSG (("Found %d ints, '%d' '%d' '%d' and written out month %d", pt.num_ints, pt.n[0], pt.n[1], pt.n[2], pt.month)); if (pt.num_ints == 4) { G_UNLOCK (g_date_global); return; /* presumably a typo; bail out. */ } if (pt.num_ints > 1) { int i = 0; int j = 0; g_assert (pt.num_ints < 4); /* i.e., it is 2 or 3 */ while (i < pt.num_ints && j < 3) { switch (dmy_order[j]) { case G_DATE_MONTH: { if (pt.num_ints == 2 && pt.month != G_DATE_BAD_MONTH) { m = pt.month; ++j; /* skip months, but don't skip this number */ continue; } else m = pt.n[i]; } break; case G_DATE_DAY: { if (pt.num_ints == 2 && pt.month == G_DATE_BAD_MONTH) { day = 1; ++j; /* skip days, since we may have month/year */ continue; } day = pt.n[i]; } break; case G_DATE_YEAR: { y = pt.n[i]; if (locale_era_adjust != 0) { y += locale_era_adjust; } else if (using_twodigit_years && y < 100) { guint two = twodigit_start_year % 100; guint century = (twodigit_start_year / 100) * 100; if (y < two) century += 100; y += century; } } break; default: break; } ++i; ++j; } if (pt.num_ints == 3 && !g_date_valid_dmy (day, m, y)) { /* Try YYYY MM DD */ y = pt.n[0]; m = pt.n[1]; day = pt.n[2]; if (using_twodigit_years && y < 100) y = G_DATE_BAD_YEAR; /* avoids ambiguity */ } else if (pt.num_ints == 2) { if (m == G_DATE_BAD_MONTH && pt.month != G_DATE_BAD_MONTH) m = pt.month; } } else if (pt.num_ints == 1) { if (pt.month != G_DATE_BAD_MONTH) { /* Month name and year? */ m = pt.month; day = 1; y = pt.n[0]; } else { /* Try yyyymmdd and yymmdd */ m = (pt.n[0]/100) % 100; day = pt.n[0] % 100; y = pt.n[0]/10000; /* FIXME move this into a separate function */ if (using_twodigit_years && y < 100) { guint two = twodigit_start_year % 100; guint century = (twodigit_start_year / 100) * 100; if (y < two) century += 100; y += century; } } } /* See if we got anything valid out of all this. */ /* y < 8000 is to catch 19998 style typos; the library is OK up to 65535 or so */ if (y < 8000 && g_date_valid_dmy (day, m, y)) { d->month = m; d->day = day; d->year = y; d->dmy = TRUE; } #ifdef G_ENABLE_DEBUG else { DEBUG_MSG (("Rejected DMY %u %u %u", day, m, y)); } #endif G_UNLOCK (g_date_global); } /** * g_date_set_time_t: * @date: a #GDate * @timet: time_t value to set * * Sets the value of a date to the date corresponding to a time * specified as a time_t. The time to date conversion is done using * the user's current timezone. * * To set the value of a date to the current day, you could write: * |[ * g_date_set_time_t (date, time (NULL)); * ]| * * Since: 2.10 */ void g_date_set_time_t (GDate *date, time_t timet) { struct tm tm; g_return_if_fail (date != NULL); #ifdef HAVE_LOCALTIME_R localtime_r (&timet, &tm); #else { struct tm *ptm = localtime (&timet); if (ptm == NULL) { /* Happens at least in Microsoft's C library if you pass a * negative time_t. Use 2000-01-01 as default date. */ #ifndef G_DISABLE_CHECKS g_return_if_fail_warning (G_LOG_DOMAIN, "g_date_set_time", "ptm != NULL"); #endif tm.tm_mon = 0; tm.tm_mday = 1; tm.tm_year = 100; } else memcpy ((void *) &tm, (void *) ptm, sizeof(struct tm)); } #endif date->julian = FALSE; date->month = tm.tm_mon + 1; date->day = tm.tm_mday; date->year = tm.tm_year + 1900; g_return_if_fail (g_date_valid_dmy (date->day, date->month, date->year)); date->dmy = TRUE; } /** * g_date_set_time: * @date: a #GDate. * @time_: #GTime value to set. * * Sets the value of a date from a #GTime value. * The time to date conversion is done using the user's current timezone. * * Deprecated: 2.10: Use g_date_set_time_t() instead. */ void g_date_set_time (GDate *date, GTime time_) { g_date_set_time_t (date, (time_t) time_); } /** * g_date_set_time_val: * @date: a #GDate * @timeval: #GTimeVal value to set * * Sets the value of a date from a #GTimeVal value. Note that the * @tv_usec member is ignored, because #GDate can't make use of the * additional precision. * * The time to date conversion is done using the user's current timezone. * * Since: 2.10 */ void g_date_set_time_val (GDate *date, GTimeVal *timeval) { g_date_set_time_t (date, (time_t) timeval->tv_sec); } /** * g_date_set_month: * @date: a #GDate * @month: month to set * * Sets the month of the year for a #GDate. If the resulting * day-month-year triplet is invalid, the date will be invalid. */ void g_date_set_month (GDate *d, GDateMonth m) { g_return_if_fail (d != NULL); g_return_if_fail (g_date_valid_month (m)); if (d->julian && !d->dmy) g_date_update_dmy(d); d->julian = FALSE; d->month = m; if (g_date_valid_dmy (d->day, d->month, d->year)) d->dmy = TRUE; else d->dmy = FALSE; } /** * g_date_set_day: * @date: a #GDate * @day: day to set * * Sets the day of the month for a #GDate. If the resulting * day-month-year triplet is invalid, the date will be invalid. */ void g_date_set_day (GDate *d, GDateDay day) { g_return_if_fail (d != NULL); g_return_if_fail (g_date_valid_day (day)); if (d->julian && !d->dmy) g_date_update_dmy(d); d->julian = FALSE; d->day = day; if (g_date_valid_dmy (d->day, d->month, d->year)) d->dmy = TRUE; else d->dmy = FALSE; } /** * g_date_set_year: * @date: a #GDate * @year: year to set * * Sets the year for a #GDate. If the resulting day-month-year * triplet is invalid, the date will be invalid. */ void g_date_set_year (GDate *d, GDateYear y) { g_return_if_fail (d != NULL); g_return_if_fail (g_date_valid_year (y)); if (d->julian && !d->dmy) g_date_update_dmy(d); d->julian = FALSE; d->year = y; if (g_date_valid_dmy (d->day, d->month, d->year)) d->dmy = TRUE; else d->dmy = FALSE; } /** * g_date_set_dmy: * @date: a #GDate * @day: day * @month: month * @y: year * * Sets the value of a #GDate from a day, month, and year. * The day-month-year triplet must be valid; if you aren't * sure it is, call g_date_valid_dmy() to check before you * set it. */ void g_date_set_dmy (GDate *d, GDateDay day, GDateMonth m, GDateYear y) { g_return_if_fail (d != NULL); g_return_if_fail (g_date_valid_dmy (day, m, y)); d->julian = FALSE; d->month = m; d->day = day; d->year = y; d->dmy = TRUE; } /** * g_date_set_julian: * @date: a #GDate * @julian_date: Julian day number (days since January 1, Year 1) * * Sets the value of a #GDate from a Julian day number. */ void g_date_set_julian (GDate *d, guint32 j) { g_return_if_fail (d != NULL); g_return_if_fail (g_date_valid_julian (j)); d->julian_days = j; d->julian = TRUE; d->dmy = FALSE; } /** * g_date_is_first_of_month: * @date: a #GDate to check * * Returns %TRUE if the date is on the first of a month. * The date must be valid. * * Returns: %TRUE if the date is the first of the month */ gboolean g_date_is_first_of_month (const GDate *d) { g_return_val_if_fail (g_date_valid (d), FALSE); if (!d->dmy) g_date_update_dmy (d); g_return_val_if_fail (d->dmy, FALSE); if (d->day == 1) return TRUE; else return FALSE; } /** * g_date_is_last_of_month: * @date: a #GDate to check * * Returns %TRUE if the date is the last day of the month. * The date must be valid. * * Returns: %TRUE if the date is the last day of the month */ gboolean g_date_is_last_of_month (const GDate *d) { gint idx; g_return_val_if_fail (g_date_valid (d), FALSE); if (!d->dmy) g_date_update_dmy (d); g_return_val_if_fail (d->dmy, FALSE); idx = g_date_is_leap_year (d->year) ? 1 : 0; if (d->day == days_in_months[idx][d->month]) return TRUE; else return FALSE; } /** * g_date_add_days: * @date: a #GDate to increment * @n_days: number of days to move the date forward * * Increments a date some number of days. * To move forward by weeks, add weeks*7 days. * The date must be valid. */ void g_date_add_days (GDate *d, guint ndays) { g_return_if_fail (g_date_valid (d)); if (!d->julian) g_date_update_julian (d); g_return_if_fail (d->julian); d->julian_days += ndays; d->dmy = FALSE; } /** * g_date_subtract_days: * @date: a #GDate to decrement * @n_days: number of days to move * * Moves a date some number of days into the past. * To move by weeks, just move by weeks*7 days. * The date must be valid. */ void g_date_subtract_days (GDate *d, guint ndays) { g_return_if_fail (g_date_valid (d)); if (!d->julian) g_date_update_julian (d); g_return_if_fail (d->julian); g_return_if_fail (d->julian_days > ndays); d->julian_days -= ndays; d->dmy = FALSE; } /** * g_date_add_months: * @date: a #GDate to increment * @n_months: number of months to move forward * * Increments a date by some number of months. * If the day of the month is greater than 28, * this routine may change the day of the month * (because the destination month may not have * the current day in it). The date must be valid. */ void g_date_add_months (GDate *d, guint nmonths) { guint years, months; gint idx; g_return_if_fail (g_date_valid (d)); if (!d->dmy) g_date_update_dmy (d); g_return_if_fail (d->dmy); nmonths += d->month - 1; years = nmonths/12; months = nmonths%12; d->month = months + 1; d->year += years; idx = g_date_is_leap_year (d->year) ? 1 : 0; if (d->day > days_in_months[idx][d->month]) d->day = days_in_months[idx][d->month]; d->julian = FALSE; g_return_if_fail (g_date_valid (d)); } /** * g_date_subtract_months: * @date: a #GDate to decrement * @n_months: number of months to move * * Moves a date some number of months into the past. * If the current day of the month doesn't exist in * the destination month, the day of the month * may change. The date must be valid. */ void g_date_subtract_months (GDate *d, guint nmonths) { guint years, months; gint idx; g_return_if_fail (g_date_valid (d)); if (!d->dmy) g_date_update_dmy (d); g_return_if_fail (d->dmy); years = nmonths/12; months = nmonths%12; g_return_if_fail (d->year > years); d->year -= years; if (d->month > months) d->month -= months; else { months -= d->month; d->month = 12 - months; d->year -= 1; } idx = g_date_is_leap_year (d->year) ? 1 : 0; if (d->day > days_in_months[idx][d->month]) d->day = days_in_months[idx][d->month]; d->julian = FALSE; g_return_if_fail (g_date_valid (d)); } /** * g_date_add_years: * @date: a #GDate to increment * @n_years: number of years to move forward * * Increments a date by some number of years. * If the date is February 29, and the destination * year is not a leap year, the date will be changed * to February 28. The date must be valid. */ void g_date_add_years (GDate *d, guint nyears) { g_return_if_fail (g_date_valid (d)); if (!d->dmy) g_date_update_dmy (d); g_return_if_fail (d->dmy); d->year += nyears; if (d->month == 2 && d->day == 29) { if (!g_date_is_leap_year (d->year)) d->day = 28; } d->julian = FALSE; } /** * g_date_subtract_years: * @date: a #GDate to decrement * @n_years: number of years to move * * Moves a date some number of years into the past. * If the current day doesn't exist in the destination * year (i.e. it's February 29 and you move to a non-leap-year) * then the day is changed to February 29. The date * must be valid. */ void g_date_subtract_years (GDate *d, guint nyears) { g_return_if_fail (g_date_valid (d)); if (!d->dmy) g_date_update_dmy (d); g_return_if_fail (d->dmy); g_return_if_fail (d->year > nyears); d->year -= nyears; if (d->month == 2 && d->day == 29) { if (!g_date_is_leap_year (d->year)) d->day = 28; } d->julian = FALSE; } /** * g_date_is_leap_year: * @year: year to check * * Returns %TRUE if the year is a leap year. * For the purposes of this function, * leap year is every year divisible by 4 unless that year * is divisible by 100. If it is divisible by 100 it would * be a leap year only if that year is also divisible * by 400. * * Returns: %TRUE if the year is a leap year */ gboolean g_date_is_leap_year (GDateYear year) { g_return_val_if_fail (g_date_valid_year (year), FALSE); return ( (((year % 4) == 0) && ((year % 100) != 0)) || (year % 400) == 0 ); } /** * g_date_get_days_in_month: * @month: month * @year: year * * Returns the number of days in a month, taking leap * years into account. * * Returns: number of days in @month during the @year */ guint8 g_date_get_days_in_month (GDateMonth month, GDateYear year) { gint idx; g_return_val_if_fail (g_date_valid_year (year), 0); g_return_val_if_fail (g_date_valid_month (month), 0); idx = g_date_is_leap_year (year) ? 1 : 0; return days_in_months[idx][month]; } /** * g_date_get_monday_weeks_in_year: * @year: a year * * Returns the number of weeks in the year, where weeks * are taken to start on Monday. Will be 52 or 53. The * date must be valid. (Years always have 52 7-day periods, * plus 1 or 2 extra days depending on whether it's a leap * year. This function is basically telling you how many * Mondays are in the year, i.e. there are 53 Mondays if * one of the extra days happens to be a Monday.) * * Returns: number of Mondays in the year */ guint8 g_date_get_monday_weeks_in_year (GDateYear year) { GDate d; g_return_val_if_fail (g_date_valid_year (year), 0); g_date_clear (&d, 1); g_date_set_dmy (&d, 1, 1, year); if (g_date_get_weekday (&d) == G_DATE_MONDAY) return 53; g_date_set_dmy (&d, 31, 12, year); if (g_date_get_weekday (&d) == G_DATE_MONDAY) return 53; if (g_date_is_leap_year (year)) { g_date_set_dmy (&d, 2, 1, year); if (g_date_get_weekday (&d) == G_DATE_MONDAY) return 53; g_date_set_dmy (&d, 30, 12, year); if (g_date_get_weekday (&d) == G_DATE_MONDAY) return 53; } return 52; } /** * g_date_get_sunday_weeks_in_year: * @year: year to count weeks in * * Returns the number of weeks in the year, where weeks * are taken to start on Sunday. Will be 52 or 53. The * date must be valid. (Years always have 52 7-day periods, * plus 1 or 2 extra days depending on whether it's a leap * year. This function is basically telling you how many * Sundays are in the year, i.e. there are 53 Sundays if * one of the extra days happens to be a Sunday.) * * Returns: the number of weeks in @year */ guint8 g_date_get_sunday_weeks_in_year (GDateYear year) { GDate d; g_return_val_if_fail (g_date_valid_year (year), 0); g_date_clear (&d, 1); g_date_set_dmy (&d, 1, 1, year); if (g_date_get_weekday (&d) == G_DATE_SUNDAY) return 53; g_date_set_dmy (&d, 31, 12, year); if (g_date_get_weekday (&d) == G_DATE_SUNDAY) return 53; if (g_date_is_leap_year (year)) { g_date_set_dmy (&d, 2, 1, year); if (g_date_get_weekday (&d) == G_DATE_SUNDAY) return 53; g_date_set_dmy (&d, 30, 12, year); if (g_date_get_weekday (&d) == G_DATE_SUNDAY) return 53; } return 52; } /** * g_date_compare: * @lhs: first date to compare * @rhs: second date to compare * * qsort()-style comparison function for dates. * Both dates must be valid. * * Returns: 0 for equal, less than zero if @lhs is less than @rhs, * greater than zero if @lhs is greater than @rhs */ gint g_date_compare (const GDate *lhs, const GDate *rhs) { g_return_val_if_fail (lhs != NULL, 0); g_return_val_if_fail (rhs != NULL, 0); g_return_val_if_fail (g_date_valid (lhs), 0); g_return_val_if_fail (g_date_valid (rhs), 0); /* Remember the self-comparison case! I think it works right now. */ while (TRUE) { if (lhs->julian && rhs->julian) { if (lhs->julian_days < rhs->julian_days) return -1; else if (lhs->julian_days > rhs->julian_days) return 1; else return 0; } else if (lhs->dmy && rhs->dmy) { if (lhs->year < rhs->year) return -1; else if (lhs->year > rhs->year) return 1; else { if (lhs->month < rhs->month) return -1; else if (lhs->month > rhs->month) return 1; else { if (lhs->day < rhs->day) return -1; else if (lhs->day > rhs->day) return 1; else return 0; } } } else { if (!lhs->julian) g_date_update_julian (lhs); if (!rhs->julian) g_date_update_julian (rhs); g_return_val_if_fail (lhs->julian, 0); g_return_val_if_fail (rhs->julian, 0); } } return 0; /* warnings */ } /** * g_date_to_struct_tm: * @date: a #GDate to set the struct tm from * @tm: struct tm to fill * * Fills in the date-related bits of a struct tm * using the @date value. Initializes the non-date parts with something * sane but meaningless. */ void g_date_to_struct_tm (const GDate *d, struct tm *tm) { GDateWeekday day; g_return_if_fail (g_date_valid (d)); g_return_if_fail (tm != NULL); if (!d->dmy) g_date_update_dmy (d); g_return_if_fail (d->dmy); /* zero all the irrelevant fields to be sure they're valid */ /* On Linux and maybe other systems, there are weird non-POSIX * fields on the end of struct tm that choke strftime if they * contain garbage. So we need to 0 the entire struct, not just the * fields we know to exist. */ memset (tm, 0x0, sizeof (struct tm)); tm->tm_mday = d->day; tm->tm_mon = d->month - 1; /* 0-11 goes in tm */ tm->tm_year = ((int)d->year) - 1900; /* X/Open says tm_year can be negative */ day = g_date_get_weekday (d); if (day == 7) day = 0; /* struct tm wants days since Sunday, so Sunday is 0 */ tm->tm_wday = (int)day; tm->tm_yday = g_date_get_day_of_year (d) - 1; /* 0 to 365 */ tm->tm_isdst = -1; /* -1 means "information not available" */ } /** * g_date_clamp: * @date: a #GDate to clamp * @min_date: minimum accepted value for @date * @max_date: maximum accepted value for @date * * If @date is prior to @min_date, sets @date equal to @min_date. * If @date falls after @max_date, sets @date equal to @max_date. * Otherwise, @date is unchanged. * Either of @min_date and @max_date may be %NULL. * All non-%NULL dates must be valid. */ void g_date_clamp (GDate *date, const GDate *min_date, const GDate *max_date) { g_return_if_fail (g_date_valid (date)); if (min_date != NULL) g_return_if_fail (g_date_valid (min_date)); if (max_date != NULL) g_return_if_fail (g_date_valid (max_date)); if (min_date != NULL && max_date != NULL) g_return_if_fail (g_date_compare (min_date, max_date) <= 0); if (min_date && g_date_compare (date, min_date) < 0) *date = *min_date; if (max_date && g_date_compare (max_date, date) < 0) *date = *max_date; } /** * g_date_order: * @date1: the first date * @date2: the second date * * Checks if @date1 is less than or equal to @date2, * and swap the values if this is not the case. */ void g_date_order (GDate *date1, GDate *date2) { g_return_if_fail (g_date_valid (date1)); g_return_if_fail (g_date_valid (date2)); if (g_date_compare (date1, date2) > 0) { GDate tmp = *date1; *date1 = *date2; *date2 = tmp; } } #ifdef G_OS_WIN32 static gsize win32_strftime_helper (const GDate *d, const gchar *format, const struct tm *tm, gchar *s, gsize slen) { SYSTEMTIME systemtime; TIME_ZONE_INFORMATION tzinfo; LCID lcid; int n, k; GArray *result; const gchar *p; gunichar c; const wchar_t digits[] = L"0123456789"; gchar *convbuf; glong convlen = 0; gsize retval; systemtime.wYear = tm->tm_year + 1900; systemtime.wMonth = tm->tm_mon + 1; systemtime.wDayOfWeek = tm->tm_wday; systemtime.wDay = tm->tm_mday; systemtime.wHour = tm->tm_hour; systemtime.wMinute = tm->tm_min; systemtime.wSecond = tm->tm_sec; systemtime.wMilliseconds = 0; lcid = GetThreadLocale (); result = g_array_sized_new (FALSE, FALSE, sizeof (wchar_t), MAX (128, strlen (format) * 2)); p = format; while (*p) { c = g_utf8_get_char (p); if (c == '%') { p = g_utf8_next_char (p); if (!*p) { s[0] = '\0'; g_array_free (result, TRUE); return 0; } c = g_utf8_get_char (p); if (c == 'E' || c == 'O') { /* Ignore modified conversion specifiers for now. */ p = g_utf8_next_char (p); if (!*p) { s[0] = '\0'; g_array_free (result, TRUE); return 0; } c = g_utf8_get_char (p); } switch (c) { case 'a': if (systemtime.wDayOfWeek == 0) k = 6; else k = systemtime.wDayOfWeek - 1; n = GetLocaleInfoW (lcid, LOCALE_SABBREVDAYNAME1+k, NULL, 0); g_array_set_size (result, result->len + n); GetLocaleInfoW (lcid, LOCALE_SABBREVDAYNAME1+k, ((wchar_t *) result->data) + result->len - n, n); g_array_set_size (result, result->len - 1); break; case 'A': if (systemtime.wDayOfWeek == 0) k = 6; else k = systemtime.wDayOfWeek - 1; n = GetLocaleInfoW (lcid, LOCALE_SDAYNAME1+k, NULL, 0); g_array_set_size (result, result->len + n); GetLocaleInfoW (lcid, LOCALE_SDAYNAME1+k, ((wchar_t *) result->data) + result->len - n, n); g_array_set_size (result, result->len - 1); break; case 'b': case 'h': n = GetLocaleInfoW (lcid, LOCALE_SABBREVMONTHNAME1+systemtime.wMonth-1, NULL, 0); g_array_set_size (result, result->len + n); GetLocaleInfoW (lcid, LOCALE_SABBREVMONTHNAME1+systemtime.wMonth-1, ((wchar_t *) result->data) + result->len - n, n); g_array_set_size (result, result->len - 1); break; case 'B': n = GetLocaleInfoW (lcid, LOCALE_SMONTHNAME1+systemtime.wMonth-1, NULL, 0); g_array_set_size (result, result->len + n); GetLocaleInfoW (lcid, LOCALE_SMONTHNAME1+systemtime.wMonth-1, ((wchar_t *) result->data) + result->len - n, n); g_array_set_size (result, result->len - 1); break; case 'c': n = GetDateFormatW (lcid, 0, &systemtime, NULL, NULL, 0); if (n > 0) { g_array_set_size (result, result->len + n); GetDateFormatW (lcid, 0, &systemtime, NULL, ((wchar_t *) result->data) + result->len - n, n); g_array_set_size (result, result->len - 1); } g_array_append_vals (result, L" ", 1); n = GetTimeFormatW (lcid, 0, &systemtime, NULL, NULL, 0); if (n > 0) { g_array_set_size (result, result->len + n); GetTimeFormatW (lcid, 0, &systemtime, NULL, ((wchar_t *) result->data) + result->len - n, n); g_array_set_size (result, result->len - 1); } break; case 'C': g_array_append_vals (result, digits + systemtime.wYear/1000, 1); g_array_append_vals (result, digits + (systemtime.wYear/1000)%10, 1); break; case 'd': g_array_append_vals (result, digits + systemtime.wDay/10, 1); g_array_append_vals (result, digits + systemtime.wDay%10, 1); break; case 'D': g_array_append_vals (result, digits + systemtime.wMonth/10, 1); g_array_append_vals (result, digits + systemtime.wMonth%10, 1); g_array_append_vals (result, L"/", 1); g_array_append_vals (result, digits + systemtime.wDay/10, 1); g_array_append_vals (result, digits + systemtime.wDay%10, 1); g_array_append_vals (result, L"/", 1); g_array_append_vals (result, digits + (systemtime.wYear/10)%10, 1); g_array_append_vals (result, digits + systemtime.wYear%10, 1); break; case 'e': if (systemtime.wDay >= 10) g_array_append_vals (result, digits + systemtime.wDay/10, 1); else g_array_append_vals (result, L" ", 1); g_array_append_vals (result, digits + systemtime.wDay%10, 1); break; /* A GDate has no time fields, so for now we can * hardcode all time conversions into zeros (or 12 for * %I). The alternative code snippets in the #else * branches are here ready to be taken into use when * needed by a g_strftime() or g_date_and_time_format() * or whatever. */ case 'H': #if 1 g_array_append_vals (result, L"00", 2); #else g_array_append_vals (result, digits + systemtime.wHour/10, 1); g_array_append_vals (result, digits + systemtime.wHour%10, 1); #endif break; case 'I': #if 1 g_array_append_vals (result, L"12", 2); #else if (systemtime.wHour == 0) g_array_append_vals (result, L"12", 2); else { g_array_append_vals (result, digits + (systemtime.wHour%12)/10, 1); g_array_append_vals (result, digits + (systemtime.wHour%12)%10, 1); } #endif break; case 'j': g_array_append_vals (result, digits + (tm->tm_yday+1)/100, 1); g_array_append_vals (result, digits + ((tm->tm_yday+1)/10)%10, 1); g_array_append_vals (result, digits + (tm->tm_yday+1)%10, 1); break; case 'm': g_array_append_vals (result, digits + systemtime.wMonth/10, 1); g_array_append_vals (result, digits + systemtime.wMonth%10, 1); break; case 'M': #if 1 g_array_append_vals (result, L"00", 2); #else g_array_append_vals (result, digits + systemtime.wMinute/10, 1); g_array_append_vals (result, digits + systemtime.wMinute%10, 1); #endif break; case 'n': g_array_append_vals (result, L"\n", 1); break; case 'p': n = GetTimeFormatW (lcid, 0, &systemtime, L"tt", NULL, 0); if (n > 0) { g_array_set_size (result, result->len + n); GetTimeFormatW (lcid, 0, &systemtime, L"tt", ((wchar_t *) result->data) + result->len - n, n); g_array_set_size (result, result->len - 1); } break; case 'r': /* This is a rather odd format. Hard to say what to do. * Let's always use the POSIX %I:%M:%S %p */ #if 1 g_array_append_vals (result, L"12:00:00", 8); #else if (systemtime.wHour == 0) g_array_append_vals (result, L"12", 2); else { g_array_append_vals (result, digits + (systemtime.wHour%12)/10, 1); g_array_append_vals (result, digits + (systemtime.wHour%12)%10, 1); } g_array_append_vals (result, L":", 1); g_array_append_vals (result, digits + systemtime.wMinute/10, 1); g_array_append_vals (result, digits + systemtime.wMinute%10, 1); g_array_append_vals (result, L":", 1); g_array_append_vals (result, digits + systemtime.wSecond/10, 1); g_array_append_vals (result, digits + systemtime.wSecond%10, 1); g_array_append_vals (result, L" ", 1); #endif n = GetTimeFormatW (lcid, 0, &systemtime, L"tt", NULL, 0); if (n > 0) { g_array_set_size (result, result->len + n); GetTimeFormatW (lcid, 0, &systemtime, L"tt", ((wchar_t *) result->data) + result->len - n, n); g_array_set_size (result, result->len - 1); } break; case 'R': #if 1 g_array_append_vals (result, L"00:00", 5); #else g_array_append_vals (result, digits + systemtime.wHour/10, 1); g_array_append_vals (result, digits + systemtime.wHour%10, 1); g_array_append_vals (result, L":", 1); g_array_append_vals (result, digits + systemtime.wMinute/10, 1); g_array_append_vals (result, digits + systemtime.wMinute%10, 1); #endif break; case 'S': #if 1 g_array_append_vals (result, L"00", 2); #else g_array_append_vals (result, digits + systemtime.wSecond/10, 1); g_array_append_vals (result, digits + systemtime.wSecond%10, 1); #endif break; case 't': g_array_append_vals (result, L"\t", 1); break; case 'T': #if 1 g_array_append_vals (result, L"00:00:00", 8); #else g_array_append_vals (result, digits + systemtime.wHour/10, 1); g_array_append_vals (result, digits + systemtime.wHour%10, 1); g_array_append_vals (result, L":", 1); g_array_append_vals (result, digits + systemtime.wMinute/10, 1); g_array_append_vals (result, digits + systemtime.wMinute%10, 1); g_array_append_vals (result, L":", 1); g_array_append_vals (result, digits + systemtime.wSecond/10, 1); g_array_append_vals (result, digits + systemtime.wSecond%10, 1); #endif break; case 'u': if (systemtime.wDayOfWeek == 0) g_array_append_vals (result, L"7", 1); else g_array_append_vals (result, digits + systemtime.wDayOfWeek, 1); break; case 'U': n = g_date_get_sunday_week_of_year (d); g_array_append_vals (result, digits + n/10, 1); g_array_append_vals (result, digits + n%10, 1); break; case 'V': n = g_date_get_iso8601_week_of_year (d); g_array_append_vals (result, digits + n/10, 1); g_array_append_vals (result, digits + n%10, 1); break; case 'w': g_array_append_vals (result, digits + systemtime.wDayOfWeek, 1); break; case 'W': n = g_date_get_monday_week_of_year (d); g_array_append_vals (result, digits + n/10, 1); g_array_append_vals (result, digits + n%10, 1); break; case 'x': n = GetDateFormatW (lcid, 0, &systemtime, NULL, NULL, 0); if (n > 0) { g_array_set_size (result, result->len + n); GetDateFormatW (lcid, 0, &systemtime, NULL, ((wchar_t *) result->data) + result->len - n, n); g_array_set_size (result, result->len - 1); } break; case 'X': n = GetTimeFormatW (lcid, 0, &systemtime, NULL, NULL, 0); if (n > 0) { g_array_set_size (result, result->len + n); GetTimeFormatW (lcid, 0, &systemtime, NULL, ((wchar_t *) result->data) + result->len - n, n); g_array_set_size (result, result->len - 1); } break; case 'y': g_array_append_vals (result, digits + (systemtime.wYear/10)%10, 1); g_array_append_vals (result, digits + systemtime.wYear%10, 1); break; case 'Y': g_array_append_vals (result, digits + systemtime.wYear/1000, 1); g_array_append_vals (result, digits + (systemtime.wYear/100)%10, 1); g_array_append_vals (result, digits + (systemtime.wYear/10)%10, 1); g_array_append_vals (result, digits + systemtime.wYear%10, 1); break; case 'Z': n = GetTimeZoneInformation (&tzinfo); if (n == TIME_ZONE_ID_UNKNOWN) ; else if (n == TIME_ZONE_ID_STANDARD) g_array_append_vals (result, tzinfo.StandardName, wcslen (tzinfo.StandardName)); else if (n == TIME_ZONE_ID_DAYLIGHT) g_array_append_vals (result, tzinfo.DaylightName, wcslen (tzinfo.DaylightName)); break; case '%': g_array_append_vals (result, L"%", 1); break; } } else if (c <= 0xFFFF) { wchar_t wc = c; g_array_append_vals (result, &wc, 1); } else { glong nwc; wchar_t *ws; ws = g_ucs4_to_utf16 (&c, 1, NULL, &nwc, NULL); g_array_append_vals (result, ws, nwc); g_free (ws); } p = g_utf8_next_char (p); } convbuf = g_utf16_to_utf8 ((wchar_t *) result->data, result->len, NULL, &convlen, NULL); g_array_free (result, TRUE); if (!convbuf) { s[0] = '\0'; return 0; } if (slen <= convlen) { /* Ensure only whole characters are copied into the buffer. */ gchar *end = g_utf8_find_prev_char (convbuf, convbuf + slen); g_assert (end != NULL); convlen = end - convbuf; /* Return 0 because the buffer isn't large enough. */ retval = 0; } else retval = convlen; memcpy (s, convbuf, convlen); s[convlen] = '\0'; g_free (convbuf); return retval; } #endif /** * g_date_strftime: * @s: destination buffer * @slen: buffer size * @format: format string * @date: valid #GDate * * Generates a printed representation of the date, in a * locale-specific way. * Works just like the platform's C library strftime() function, * but only accepts date-related formats; time-related formats * give undefined results. Date must be valid. Unlike strftime() * (which uses the locale encoding), works on a UTF-8 format * string and stores a UTF-8 result. * * This function does not provide any conversion specifiers in * addition to those implemented by the platform's C library. * For example, don't expect that using g_date_strftime() would * make the \%F provided by the C99 strftime() work on Windows * where the C library only complies to C89. * * Returns: number of characters written to the buffer, or 0 the buffer was too small */ gsize g_date_strftime (gchar *s, gsize slen, const gchar *format, const GDate *d) { struct tm tm; #ifndef G_OS_WIN32 gsize locale_format_len = 0; gchar *locale_format; gsize tmplen; gchar *tmpbuf; gsize tmpbufsize; gsize convlen = 0; gchar *convbuf; GError *error = NULL; gsize retval; #endif g_return_val_if_fail (g_date_valid (d), 0); g_return_val_if_fail (slen > 0, 0); g_return_val_if_fail (format != NULL, 0); g_return_val_if_fail (s != NULL, 0); g_date_to_struct_tm (d, &tm); #ifdef G_OS_WIN32 if (!g_utf8_validate (format, -1, NULL)) { s[0] = '\0'; return 0; } return win32_strftime_helper (d, format, &tm, s, slen); #else locale_format = g_locale_from_utf8 (format, -1, NULL, &locale_format_len, &error); if (error) { g_warning (G_STRLOC "Error converting format to locale encoding: %s\n", error->message); g_error_free (error); s[0] = '\0'; return 0; } tmpbufsize = MAX (128, locale_format_len * 2); while (TRUE) { tmpbuf = g_malloc (tmpbufsize); /* Set the first byte to something other than '\0', to be able to * recognize whether strftime actually failed or just returned "". */ tmpbuf[0] = '\1'; tmplen = strftime (tmpbuf, tmpbufsize, locale_format, &tm); if (tmplen == 0 && tmpbuf[0] != '\0') { g_free (tmpbuf); tmpbufsize *= 2; if (tmpbufsize > 65536) { g_warning (G_STRLOC "Maximum buffer size for g_date_strftime exceeded: giving up\n"); g_free (locale_format); s[0] = '\0'; return 0; } } else break; } g_free (locale_format); convbuf = g_locale_to_utf8 (tmpbuf, tmplen, NULL, &convlen, &error); g_free (tmpbuf); if (error) { g_warning (G_STRLOC "Error converting results of strftime to UTF-8: %s\n", error->message); g_error_free (error); s[0] = '\0'; return 0; } if (slen <= convlen) { /* Ensure only whole characters are copied into the buffer. */ gchar *end = g_utf8_find_prev_char (convbuf, convbuf + slen); g_assert (end != NULL); convlen = end - convbuf; /* Return 0 because the buffer isn't large enough. */ retval = 0; } else retval = convlen; memcpy (s, convbuf, convlen); s[convlen] = '\0'; g_free (convbuf); return retval; #endif } pkg-config-0.29.1/glib/glib/gfileutils.h0000664000175000017500000001523512651243552014737 00000000000000/* gfileutils.h - File utility functions * * Copyright 2000 Red Hat, Inc. * * GLib is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * GLib is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with GLib; see the file COPYING.LIB. If not, * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __G_FILEUTILS_H__ #define __G_FILEUTILS_H__ #if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) #error "Only can be included directly." #endif #include G_BEGIN_DECLS #define G_FILE_ERROR g_file_error_quark () typedef enum { G_FILE_ERROR_EXIST, G_FILE_ERROR_ISDIR, G_FILE_ERROR_ACCES, G_FILE_ERROR_NAMETOOLONG, G_FILE_ERROR_NOENT, G_FILE_ERROR_NOTDIR, G_FILE_ERROR_NXIO, G_FILE_ERROR_NODEV, G_FILE_ERROR_ROFS, G_FILE_ERROR_TXTBSY, G_FILE_ERROR_FAULT, G_FILE_ERROR_LOOP, G_FILE_ERROR_NOSPC, G_FILE_ERROR_NOMEM, G_FILE_ERROR_MFILE, G_FILE_ERROR_NFILE, G_FILE_ERROR_BADF, G_FILE_ERROR_INVAL, G_FILE_ERROR_PIPE, G_FILE_ERROR_AGAIN, G_FILE_ERROR_INTR, G_FILE_ERROR_IO, G_FILE_ERROR_PERM, G_FILE_ERROR_NOSYS, G_FILE_ERROR_FAILED } GFileError; /* For backward-compat reasons, these are synced to an old * anonymous enum in libgnome. But don't use that enum * in new code. */ typedef enum { G_FILE_TEST_IS_REGULAR = 1 << 0, G_FILE_TEST_IS_SYMLINK = 1 << 1, G_FILE_TEST_IS_DIR = 1 << 2, G_FILE_TEST_IS_EXECUTABLE = 1 << 3, G_FILE_TEST_EXISTS = 1 << 4 } GFileTest; 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); 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); /* Wrapper / workalike for mkdtemp() */ GLIB_AVAILABLE_IN_2_30 gchar *g_mkdtemp (gchar *tmpl); GLIB_AVAILABLE_IN_2_30 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); 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); #ifdef G_OS_WIN32 /* On Win32, the canonical directory separator is the backslash, and * the search path separator is the semicolon. Note that also the * (forward) slash works as directory separator. */ #define G_DIR_SEPARATOR '\\' #define G_DIR_SEPARATOR_S "\\" #define G_IS_DIR_SEPARATOR(c) ((c) == G_DIR_SEPARATOR || (c) == '/') #define G_SEARCHPATH_SEPARATOR ';' #define G_SEARCHPATH_SEPARATOR_S ";" #else /* !G_OS_WIN32 */ #define G_DIR_SEPARATOR '/' #define G_DIR_SEPARATOR_S "/" #define G_IS_DIR_SEPARATOR(c) ((c) == G_DIR_SEPARATOR) #define G_SEARCHPATH_SEPARATOR ':' #define G_SEARCHPATH_SEPARATOR_S ":" #endif /* !G_OS_WIN32 */ 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) const gchar *g_basename (const gchar *file_name); #ifndef G_DISABLE_DEPRECATED #define g_dirname g_path_get_dirname #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__ */ pkg-config-0.29.1/glib/glib/gstrfuncs.c0000664000175000017500000022206112651243552014576 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the GLib Team and others 1997-2000. See the AUTHORS * file for a list of people on the GLib Team. See the ChangeLog * files for a list of changes. These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/. */ /* * MT safe */ #include "config.h" #include #include #include #include #include #include #include #include /* For tolower() */ #ifdef HAVE_XLOCALE_H /* Needed on BSD/OS X for e.g. strtod_l */ #include #endif #ifdef G_OS_WIN32 #include #endif /* do not include here, it may interfere with g_strsignal() */ #include "gstrfuncs.h" #include "gprintf.h" #include "gprintfint.h" #include "glibintl.h" /** * SECTION:string_utils * @title: String Utility Functions * @short_description: various string-related functions * * This section describes a number of utility functions for creating, * duplicating, and manipulating strings. * * Note that the functions g_printf(), g_fprintf(), g_sprintf(), * g_snprintf(), g_vprintf(), g_vfprintf(), g_vsprintf() and g_vsnprintf() * are declared in the header gprintf.h which is * not included in glib.h * (otherwise using glib.h would drag in * stdio.h), so you'll have to explicitly include * <glib/gprintf.h> in order to use the GLib * printf() functions. * * While you may use the printf() functions * to format UTF-8 strings, notice that the precision of a * %Ns parameter is interpreted as the * number of bytes, not characters * to print. On top of that, the GNU libc implementation of the printf() * functions has the "feature" that it checks that the string given for * the %Ns parameter consists of a whole number * of characters in the current encoding. So, unless you are sure you are * always going to be in an UTF-8 locale or your know your text is restricted * to ASCII, avoid using %Ns. If your intention is * to format strings for a certain number of columns, then * %Ns is not a correct solution anyway, since it * fails to take wide characters (see g_unichar_iswide()) into account. * */ /** * g_ascii_isalnum: * @c: any character * * Determines whether a character is alphanumeric. * * Unlike the standard C library isalnum() function, this only * recognizes standard ASCII letters and ignores the locale, * returning %FALSE for all non-ASCII characters. Also, unlike * the standard library function, this takes a char, * not an int, so don't call it on EOF, but no need to * cast to #guchar before passing a possibly non-ASCII character in. * * Returns: %TRUE if @c is an ASCII alphanumeric character */ /** * g_ascii_isalpha: * @c: any character * * Determines whether a character is alphabetic (i.e. a letter). * * Unlike the standard C library isalpha() function, this only * recognizes standard ASCII letters and ignores the locale, * returning %FALSE for all non-ASCII characters. Also, unlike * the standard library function, this takes a char, * not an int, so don't call it on EOF, but no need to * cast to #guchar before passing a possibly non-ASCII character in. * * Returns: %TRUE if @c is an ASCII alphabetic character */ /** * g_ascii_iscntrl: * @c: any character * * Determines whether a character is a control character. * * Unlike the standard C library iscntrl() function, this only * recognizes standard ASCII control characters and ignores the * locale, returning %FALSE for all non-ASCII characters. Also, * unlike the standard library function, this takes a char, * not an int, so don't call it on EOF, but no need to * cast to #guchar before passing a possibly non-ASCII character in. * * Returns: %TRUE if @c is an ASCII control character. */ /** * g_ascii_isdigit: * @c: any character * * Determines whether a character is digit (0-9). * * Unlike the standard C library isdigit() function, this takes * a char, not an int, so don't call it * on EOF, but no need to cast to #guchar before passing a possibly * non-ASCII character in. * * Returns: %TRUE if @c is an ASCII digit. */ /** * g_ascii_isgraph: * @c: any character * * Determines whether a character is a printing character and not a space. * * Unlike the standard C library isgraph() function, this only * recognizes standard ASCII characters and ignores the locale, * returning %FALSE for all non-ASCII characters. Also, unlike * the standard library function, this takes a char, * not an int, so don't call it on EOF, but no need * to cast to #guchar before passing a possibly non-ASCII character in. * * Returns: %TRUE if @c is an ASCII printing character other than space. */ /** * g_ascii_islower: * @c: any character * * Determines whether a character is an ASCII lower case letter. * * Unlike the standard C library islower() function, this only * recognizes standard ASCII letters and ignores the locale, * returning %FALSE for all non-ASCII characters. Also, unlike * the standard library function, this takes a char, * not an int, so don't call it on EOF, but no need * to worry about casting to #guchar before passing a possibly * non-ASCII character in. * * Returns: %TRUE if @c is an ASCII lower case letter */ /** * g_ascii_isprint: * @c: any character * * Determines whether a character is a printing character. * * Unlike the standard C library isprint() function, this only * recognizes standard ASCII characters and ignores the locale, * returning %FALSE for all non-ASCII characters. Also, unlike * the standard library function, this takes a char, * not an int, so don't call it on EOF, but no need * to cast to #guchar before passing a possibly non-ASCII character in. * * Returns: %TRUE if @c is an ASCII printing character. */ /** * g_ascii_ispunct: * @c: any character * * Determines whether a character is a punctuation character. * * Unlike the standard C library ispunct() function, this only * recognizes standard ASCII letters and ignores the locale, * returning %FALSE for all non-ASCII characters. Also, unlike * the standard library function, this takes a char, * not an int, so don't call it on EOF, but no need to * cast to #guchar before passing a possibly non-ASCII character in. * * Returns: %TRUE if @c is an ASCII punctuation character. */ /** * g_ascii_isspace: * @c: any character * * Determines whether a character is a white-space character. * * Unlike the standard C library isspace() function, this only * recognizes standard ASCII white-space and ignores the locale, * returning %FALSE for all non-ASCII characters. Also, unlike * the standard library function, this takes a char, * not an int, so don't call it on EOF, but no need to * cast to #guchar before passing a possibly non-ASCII character in. * * Returns: %TRUE if @c is an ASCII white-space character */ /** * g_ascii_isupper: * @c: any character * * Determines whether a character is an ASCII upper case letter. * * Unlike the standard C library isupper() function, this only * recognizes standard ASCII letters and ignores the locale, * returning %FALSE for all non-ASCII characters. Also, unlike * the standard library function, this takes a char, * not an int, so don't call it on EOF, but no need to * worry about casting to #guchar before passing a possibly non-ASCII * character in. * * Returns: %TRUE if @c is an ASCII upper case letter */ /** * g_ascii_isxdigit: * @c: any character * * Determines whether a character is a hexadecimal-digit character. * * Unlike the standard C library isxdigit() function, this takes * a char, not an int, so don't call it * on EOF, but no need to cast to #guchar before passing a * possibly non-ASCII character in. * * Returns: %TRUE if @c is an ASCII hexadecimal-digit character. */ /** * G_ASCII_DTOSTR_BUF_SIZE: * * A good size for a buffer to be passed into g_ascii_dtostr(). * It is guaranteed to be enough for all output of that function * on systems with 64bit IEEE-compatible doubles. * * The typical usage would be something like: * |[ * char buf[G_ASCII_DTOSTR_BUF_SIZE]; * * fprintf (out, "value=%s\n", g_ascii_dtostr (buf, sizeof (buf), value)); * ]| */ /** * g_strstrip: * @string: a string to remove the leading and trailing whitespace from * * Removes leading and trailing whitespace from a string. * See g_strchomp() and g_strchug(). * * Returns: @string */ /** * G_STR_DELIMITERS: * * The standard delimiters, used in g_strdelimit(). */ static const guint16 ascii_table_data[256] = { 0x004, 0x004, 0x004, 0x004, 0x004, 0x004, 0x004, 0x004, 0x004, 0x104, 0x104, 0x004, 0x104, 0x104, 0x004, 0x004, 0x004, 0x004, 0x004, 0x004, 0x004, 0x004, 0x004, 0x004, 0x004, 0x004, 0x004, 0x004, 0x004, 0x004, 0x004, 0x004, 0x140, 0x0d0, 0x0d0, 0x0d0, 0x0d0, 0x0d0, 0x0d0, 0x0d0, 0x0d0, 0x0d0, 0x0d0, 0x0d0, 0x0d0, 0x0d0, 0x0d0, 0x0d0, 0x459, 0x459, 0x459, 0x459, 0x459, 0x459, 0x459, 0x459, 0x459, 0x459, 0x0d0, 0x0d0, 0x0d0, 0x0d0, 0x0d0, 0x0d0, 0x0d0, 0x653, 0x653, 0x653, 0x653, 0x653, 0x653, 0x253, 0x253, 0x253, 0x253, 0x253, 0x253, 0x253, 0x253, 0x253, 0x253, 0x253, 0x253, 0x253, 0x253, 0x253, 0x253, 0x253, 0x253, 0x253, 0x253, 0x0d0, 0x0d0, 0x0d0, 0x0d0, 0x0d0, 0x0d0, 0x473, 0x473, 0x473, 0x473, 0x473, 0x473, 0x073, 0x073, 0x073, 0x073, 0x073, 0x073, 0x073, 0x073, 0x073, 0x073, 0x073, 0x073, 0x073, 0x073, 0x073, 0x073, 0x073, 0x073, 0x073, 0x073, 0x0d0, 0x0d0, 0x0d0, 0x0d0, 0x004 /* the upper 128 are all zeroes */ }; const guint16 * const g_ascii_table = ascii_table_data; #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) { static gsize initialized = FALSE; static locale_t C_locale = NULL; if (g_once_init_enter (&initialized)) { C_locale = newlocale (LC_ALL_MASK, "C", NULL); g_once_init_leave (&initialized, TRUE); } return C_locale; } #endif /** * g_strdup: * @str: the string to duplicate * * Duplicates a string. If @str is %NULL it returns %NULL. * The returned string should be freed with g_free() * when no longer needed. * * Returns: a newly-allocated copy of @str */ gchar* g_strdup (const gchar *str) { gchar *new_str; gsize length; if (str) { length = strlen (str) + 1; new_str = g_new (char, length); memcpy (new_str, str, length); } else new_str = NULL; return new_str; } /** * g_memdup: * @mem: the memory to copy. * @byte_size: the number of bytes to copy. * * Allocates @byte_size bytes of memory, and copies @byte_size bytes into it * from @mem. If @mem is %NULL it returns %NULL. * * Returns: a pointer to the newly-allocated copy of the memory, or %NULL if @mem * is %NULL. */ gpointer g_memdup (gconstpointer mem, guint byte_size) { gpointer new_mem; if (mem) { new_mem = g_malloc (byte_size); memcpy (new_mem, mem, byte_size); } else new_mem = NULL; return new_mem; } /** * g_strndup: * @str: the string to duplicate * @n: the maximum number of bytes to copy from @str * * Duplicates the first @n bytes of a string, returning a newly-allocated * buffer @n + 1 bytes long which will always be nul-terminated. * If @str is less than @n bytes long the buffer is padded with nuls. * If @str is %NULL it returns %NULL. * The returned value should be freed when no longer needed. * * * To copy a number of characters from a UTF-8 encoded string, use * g_utf8_strncpy() instead. * * * Returns: a newly-allocated buffer containing the first @n bytes * of @str, nul-terminated */ gchar* g_strndup (const gchar *str, gsize n) { gchar *new_str; if (str) { new_str = g_new (gchar, n + 1); strncpy (new_str, str, n); new_str[n] = '\0'; } else new_str = NULL; return new_str; } /** * g_strnfill: * @length: the length of the new string * @fill_char: the byte to fill the string with * * Creates a new string @length bytes long filled with @fill_char. * The returned string should be freed when no longer needed. * * Returns: a newly-allocated string filled the @fill_char */ gchar* g_strnfill (gsize length, gchar fill_char) { gchar *str; str = g_new (gchar, length + 1); memset (str, (guchar)fill_char, length); str[length] = '\0'; return str; } /** * g_stpcpy: * @dest: destination buffer. * @src: source string. * * Copies a nul-terminated string into the dest buffer, include the * trailing nul, and return a pointer to the trailing nul byte. * This is useful for concatenating multiple strings together * without having to repeatedly scan for the end. * * Return value: a pointer to trailing nul byte. **/ gchar * g_stpcpy (gchar *dest, const gchar *src) { #ifdef HAVE_STPCPY g_return_val_if_fail (dest != NULL, NULL); g_return_val_if_fail (src != NULL, NULL); return stpcpy (dest, src); #else register gchar *d = dest; register const gchar *s = src; g_return_val_if_fail (dest != NULL, NULL); g_return_val_if_fail (src != NULL, NULL); do *d++ = *s; while (*s++ != '\0'); return d - 1; #endif } /** * g_strdup_vprintf: * @format: a standard printf() format string, but notice * string precision pitfalls * @args: the list of parameters to insert into the format string * * Similar to the standard C vsprintf() function but safer, since it * calculates the maximum space required and allocates memory to hold * the result. The returned string should be freed with g_free() when * no longer needed. * * See also g_vasprintf(), which offers the same functionality, but * additionally returns the length of the allocated string. * * Returns: a newly-allocated string holding the result */ gchar* g_strdup_vprintf (const gchar *format, va_list args) { gchar *string = NULL; g_vasprintf (&string, format, args); return string; } /** * g_strdup_printf: * @format: a standard printf() format string, but notice * string precision pitfalls * @...: the parameters to insert into the format string * * Similar to the standard C sprintf() function but safer, since it * calculates the maximum space required and allocates memory to hold * the result. The returned string should be freed with g_free() when no * longer needed. * * Returns: a newly-allocated string holding the result */ gchar* g_strdup_printf (const gchar *format, ...) { gchar *buffer; va_list args; va_start (args, format); buffer = g_strdup_vprintf (format, args); va_end (args); return buffer; } /** * g_strconcat: * @string1: the first string to add, which must not be %NULL * @...: a %NULL-terminated list of strings to append to the string * * Concatenates all of the given strings into one long string. * The returned string should be freed with g_free() when no longer needed. * * Note that this function is usually not the right function to use to * assemble a translated message from pieces, since proper translation * often requires the pieces to be reordered. * * The variable argument list must end * with %NULL. If you forget the %NULL, g_strconcat() will start appending * random memory junk to your string. * * Returns: a newly-allocated string containing all the string arguments */ gchar* g_strconcat (const gchar *string1, ...) { gsize l; va_list args; gchar *s; gchar *concat; gchar *ptr; if (!string1) return NULL; l = 1 + strlen (string1); va_start (args, string1); s = va_arg (args, gchar*); while (s) { l += strlen (s); s = va_arg (args, gchar*); } va_end (args); concat = g_new (gchar, l); ptr = concat; ptr = g_stpcpy (ptr, string1); va_start (args, string1); s = va_arg (args, gchar*); while (s) { ptr = g_stpcpy (ptr, s); s = va_arg (args, gchar*); } va_end (args); return concat; } /** * g_strtod: * @nptr: the string to convert to a numeric value. * @endptr: if non-%NULL, it returns the character after * the last character used in the conversion. * * Converts a string to a #gdouble value. * It calls the standard strtod() function to handle the conversion, but * if the string is not completely converted it attempts the conversion * again with g_ascii_strtod(), and returns the best match. * * This function should seldom be used. The normal situation when reading * numbers not for human consumption is to use g_ascii_strtod(). Only when * you know that you must expect both locale formatted and C formatted numbers * should you use this. Make sure that you don't pass strings such as comma * separated lists of values, since the commas may be interpreted as a decimal * point in some locales, causing unexpected results. * * Return value: the #gdouble value. **/ gdouble g_strtod (const gchar *nptr, gchar **endptr) { gchar *fail_pos_1; gchar *fail_pos_2; gdouble val_1; gdouble val_2 = 0; g_return_val_if_fail (nptr != NULL, 0); fail_pos_1 = NULL; fail_pos_2 = NULL; val_1 = strtod (nptr, &fail_pos_1); if (fail_pos_1 && fail_pos_1[0] != 0) val_2 = g_ascii_strtod (nptr, &fail_pos_2); if (!fail_pos_1 || fail_pos_1[0] == 0 || fail_pos_1 >= fail_pos_2) { if (endptr) *endptr = fail_pos_1; return val_1; } else { if (endptr) *endptr = fail_pos_2; return val_2; } } /** * g_ascii_strtod: * @nptr: the string to convert to a numeric value. * @endptr: if non-%NULL, it returns the character after * the last character used in the conversion. * * Converts a string to a #gdouble value. * * This function behaves like the standard strtod() function * does in the C locale. It does this without actually changing * the current locale, since that would not be thread-safe. * A limitation of the implementation is that this function * will still accept localized versions of infinities and NANs. * * This function is typically used when reading configuration * files or other non-user input that should be locale independent. * To handle input from the user you should normally use the * locale-sensitive system strtod() function. * * To convert from a #gdouble to a string in a locale-insensitive * way, use g_ascii_dtostr(). * * If the correct value would cause overflow, plus or minus HUGE_VAL * is returned (according to the sign of the value), and ERANGE is * stored in errno. If the correct value would cause underflow, * zero is returned and ERANGE is stored in errno. * * This function resets errno before calling strtod() so that * you can reliably detect overflow and underflow. * * Return value: the #gdouble value. */ gdouble g_ascii_strtod (const gchar *nptr, gchar **endptr) { #ifdef USE_XLOCALE g_return_val_if_fail (nptr != NULL, 0); errno = 0; return strtod_l (nptr, endptr, get_C_locale ()); #else 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; const char *end = NULL; /* Silence gcc */ int strtod_errno; g_return_val_if_fail (nptr != NULL, 0); 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); decimal_point_pos = NULL; end = NULL; if (decimal_point[0] != '.' || decimal_point[1] != 0) { p = nptr; /* Skip leading space */ while (g_ascii_isspace (*p)) p++; /* Skip leading optional sign */ if (*p == '+' || *p == '-') p++; if (p[0] == '0' && (p[1] == 'x' || p[1] == 'X')) { p += 2; /* HEX - find the (optional) decimal point */ while (g_ascii_isxdigit (*p)) p++; if (*p == '.') decimal_point_pos = p++; while (g_ascii_isxdigit (*p)) p++; if (*p == 'p' || *p == 'P') p++; if (*p == '+' || *p == '-') p++; while (g_ascii_isdigit (*p)) p++; end = p; } else if (g_ascii_isdigit (*p) || *p == '.') { while (g_ascii_isdigit (*p)) p++; if (*p == '.') decimal_point_pos = p++; while (g_ascii_isdigit (*p)) p++; if (*p == 'e' || *p == 'E') p++; if (*p == '+' || *p == '-') p++; while (g_ascii_isdigit (*p)) p++; end = p; } /* For the other cases, we need not convert the decimal point */ } if (decimal_point_pos) { char *copy, *c; /* We need to convert the '.' to the locale specific decimal point */ copy = g_malloc (end - nptr + 1 + decimal_point_len); c = copy; memcpy (c, nptr, decimal_point_pos - nptr); c += decimal_point_pos - nptr; memcpy (c, decimal_point, decimal_point_len); c += decimal_point_len; memcpy (c, decimal_point_pos + 1, end - (decimal_point_pos + 1)); c += end - (decimal_point_pos + 1); *c = 0; errno = 0; val = strtod (copy, &fail_pos); strtod_errno = errno; if (fail_pos) { if (fail_pos - copy > decimal_point_pos - nptr) fail_pos = (char *)nptr + (fail_pos - copy) - (decimal_point_len - 1); else fail_pos = (char *)nptr + (fail_pos - copy); } g_free (copy); } else if (end) { char *copy; copy = g_malloc (end - (char *)nptr + 1); memcpy (copy, nptr, end - nptr); *(copy + (end - (char *)nptr)) = 0; errno = 0; val = strtod (copy, &fail_pos); strtod_errno = errno; if (fail_pos) { fail_pos = (char *)nptr + (fail_pos - copy); } g_free (copy); } else { errno = 0; val = strtod (nptr, &fail_pos); strtod_errno = errno; } if (endptr) *endptr = fail_pos; errno = strtod_errno; return val; #endif } /** * g_ascii_dtostr: * @buffer: A buffer to place the resulting string in * @buf_len: The length of the buffer. * @d: The #gdouble to convert * * Converts a #gdouble to a string, using the '.' as * decimal point. * * This functions generates enough precision that converting * the string back using g_ascii_strtod() gives the same machine-number * (on machines with IEEE compatible 64bit doubles). It is * guaranteed that the size of the resulting string will never * be larger than @G_ASCII_DTOSTR_BUF_SIZE bytes. * * Return value: The pointer to the buffer with the converted string. **/ gchar * g_ascii_dtostr (gchar *buffer, gint buf_len, gdouble d) { return g_ascii_formatd (buffer, buf_len, "%.17g", d); } #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wformat-nonliteral" /** * g_ascii_formatd: * @buffer: A buffer to place the resulting string in * @buf_len: The length of the buffer. * @format: The printf()-style format to use for the * code to use for converting. * @d: The #gdouble to convert * * Converts a #gdouble to a string, using the '.' as * decimal point. To format the number you pass in * a printf()-style format string. Allowed conversion * specifiers are 'e', 'E', 'f', 'F', 'g' and 'G'. * * If you just want to want to serialize the value into a * string, use g_ascii_dtostr(). * * Return value: The pointer to the buffer with the converted string. */ gchar * g_ascii_formatd (gchar *buffer, gint buf_len, const gchar *format, gdouble d) { #ifdef USE_XLOCALE locale_t old_locale; old_locale = uselocale (get_C_locale ()); _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; int rest_len; gchar format_char; g_return_val_if_fail (buffer != NULL, NULL); g_return_val_if_fail (format[0] == '%', NULL); g_return_val_if_fail (strpbrk (format + 1, "'l%") == NULL, NULL); format_char = format[strlen (format) - 1]; g_return_val_if_fail (format_char == 'e' || format_char == 'E' || format_char == 'f' || format_char == 'F' || format_char == 'g' || format_char == 'G', NULL); if (format[0] != '%') return NULL; if (strpbrk (format + 1, "'l%")) return NULL; if (!(format_char == 'e' || format_char == 'E' || format_char == 'f' || format_char == 'F' || format_char == 'g' || format_char == 'G')) return NULL; _g_snprintf (buffer, buf_len, format, d); #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); if (decimal_point[0] != '.' || decimal_point[1] != 0) { p = buffer; while (g_ascii_isspace (*p)) p++; if (*p == '+' || *p == '-') p++; while (isdigit ((guchar)*p)) p++; if (strncmp (p, decimal_point, decimal_point_len) == 0) { *p = '.'; p++; if (decimal_point_len > 1) { rest_len = strlen (p + (decimal_point_len-1)); memmove (p, p + (decimal_point_len-1), rest_len); p[rest_len] = 0; } } } return buffer; #endif } #pragma GCC diagnostic pop #define ISSPACE(c) ((c) == ' ' || (c) == '\f' || (c) == '\n' || \ (c) == '\r' || (c) == '\t' || (c) == '\v') #define ISUPPER(c) ((c) >= 'A' && (c) <= 'Z') #define ISLOWER(c) ((c) >= 'a' && (c) <= 'z') #define ISALPHA(c) (ISUPPER (c) || ISLOWER (c)) #define TOUPPER(c) (ISLOWER (c) ? (c) - 'a' + 'A' : (c)) #define TOLOWER(c) (ISUPPER (c) ? (c) - 'A' + 'a' : (c)) #ifndef USE_XLOCALE static guint64 g_parse_long_long (const gchar *nptr, const gchar **endptr, guint base, gboolean *negative) { /* this code is based on on the strtol(3) code from GNU libc released under * the GNU Lesser General Public License. * * Copyright (C) 1991,92,94,95,96,97,98,99,2000,01,02 * Free Software Foundation, Inc. */ gboolean overflow; guint64 cutoff; guint64 cutlim; guint64 ui64; const gchar *s, *save; guchar c; g_return_val_if_fail (nptr != NULL, 0); *negative = FALSE; if (base == 1 || base > 36) { errno = EINVAL; if (endptr) *endptr = nptr; return 0; } save = s = nptr; /* Skip white space. */ while (ISSPACE (*s)) ++s; if (G_UNLIKELY (!*s)) goto noconv; /* Check for a sign. */ if (*s == '-') { *negative = TRUE; ++s; } else if (*s == '+') ++s; /* Recognize number prefix and if BASE is zero, figure it out ourselves. */ if (*s == '0') { if ((base == 0 || base == 16) && TOUPPER (s[1]) == 'X') { s += 2; base = 16; } else if (base == 0) base = 8; } else if (base == 0) base = 10; /* Save the pointer so we can check later if anything happened. */ save = s; cutoff = G_MAXUINT64 / base; cutlim = G_MAXUINT64 % base; overflow = FALSE; ui64 = 0; c = *s; for (; c; c = *++s) { if (c >= '0' && c <= '9') c -= '0'; else if (ISALPHA (c)) c = TOUPPER (c) - 'A' + 10; else break; if (c >= base) break; /* Check for overflow. */ if (ui64 > cutoff || (ui64 == cutoff && c > cutlim)) overflow = TRUE; else { ui64 *= base; ui64 += c; } } /* Check if anything actually happened. */ if (s == save) goto noconv; /* Store in ENDPTR the address of one character past the last character we converted. */ if (endptr) *endptr = s; if (G_UNLIKELY (overflow)) { errno = ERANGE; return G_MAXUINT64; } return ui64; noconv: /* We must handle a special case here: the base is 0 or 16 and the first two characters are '0' and 'x', but the rest are no hexadecimal digits. This is no error case. We return 0 and ENDPTR points to the `x`. */ if (endptr) { if (save - nptr >= 2 && TOUPPER (save[-1]) == 'X' && save[-2] == '0') *endptr = &save[-1]; else /* There was no number to convert. */ *endptr = nptr; } return 0; } #endif /* !USE_XLOCALE */ /** * g_ascii_strtoull: * @nptr: the string to convert to a numeric value. * @endptr: if non-%NULL, it returns the character after * the last character used in the conversion. * @base: to be used for the conversion, 2..36 or 0 * * Converts a string to a #guint64 value. * This function behaves like the standard strtoull() function * does in the C locale. It does this without actually * changing the current locale, since that would not be * thread-safe. * * This function is typically used when reading configuration * files or other non-user input that should be locale independent. * To handle input from the user you should normally use the * locale-sensitive system strtoull() function. * * If the correct value would cause overflow, %G_MAXUINT64 * is returned, and ERANGE is stored in errno. * If the base is outside the valid range, zero is returned, and * EINVAL is stored in errno. * If the string conversion fails, zero is returned, and @endptr returns * @nptr (if @endptr is non-%NULL). * * Return value: the #guint64 value or zero on error. * * Since: 2.2 */ guint64 g_ascii_strtoull (const gchar *nptr, gchar **endptr, guint base) { #ifdef USE_XLOCALE return strtoull_l (nptr, endptr, base, get_C_locale ()); #else gboolean negative; guint64 result; result = g_parse_long_long (nptr, (const gchar **) endptr, base, &negative); /* Return the result of the appropriate sign. */ return negative ? -result : result; #endif } /** * g_ascii_strtoll: * @nptr: the string to convert to a numeric value. * @endptr: if non-%NULL, it returns the character after * the last character used in the conversion. * @base: to be used for the conversion, 2..36 or 0 * * Converts a string to a #gint64 value. * This function behaves like the standard strtoll() function * does in the C locale. It does this without actually * changing the current locale, since that would not be * thread-safe. * * This function is typically used when reading configuration * files or other non-user input that should be locale independent. * To handle input from the user you should normally use the * locale-sensitive system strtoll() function. * * If the correct value would cause overflow, %G_MAXINT64 or %G_MININT64 * is returned, and ERANGE is stored in errno. * If the base is outside the valid range, zero is returned, and * EINVAL is stored in errno. If the * string conversion fails, zero is returned, and @endptr returns @nptr * (if @endptr is non-%NULL). * * Return value: the #gint64 value or zero on error. * * Since: 2.12 */ gint64 g_ascii_strtoll (const gchar *nptr, gchar **endptr, guint base) { #ifdef USE_XLOCALE return strtoll_l (nptr, endptr, base, get_C_locale ()); #else gboolean negative; guint64 result; result = g_parse_long_long (nptr, (const gchar **) endptr, base, &negative); if (negative && result > (guint64) G_MININT64) { errno = ERANGE; return G_MININT64; } else if (!negative && result > (guint64) G_MAXINT64) { errno = ERANGE; return G_MAXINT64; } else if (negative) return - (gint64) result; else return (gint64) result; #endif } /** * g_strerror: * @errnum: the system error number. See the standard C %errno * documentation * * Returns a string corresponding to the given error code, e.g. * "no such process". You should use this function in preference to * strerror(), because it returns a string in UTF-8 encoding, and since * not all platforms support the strerror() function. * * Returns: a UTF-8 string describing the error code. If the error code * is unknown, it returns "unknown error (<code>)". */ const gchar * g_strerror (gint errnum) { gchar buf[64]; gchar *msg; gchar *tofree; const gchar *ret; gint saved_errno = errno; msg = tofree = NULL; #ifdef HAVE_STRERROR msg = strerror (errnum); if (!g_get_charset (NULL)) msg = tofree = g_locale_to_utf8 (msg, -1, NULL, NULL, NULL); #endif if (!msg) { msg = buf; _g_sprintf (msg, "unknown error (%d)", errnum); } ret = g_intern_string (msg); g_free (tofree); errno = saved_errno; return ret; } /** * g_strsignal: * @signum: the signal number. See the signal * documentation * * Returns a string describing the given signal, e.g. "Segmentation fault". * You should use this function in preference to strsignal(), because it * returns a string in UTF-8 encoding, and since not all platforms support * the strsignal() function. * * Returns: a UTF-8 string describing the signal. If the signal is unknown, * it returns "unknown signal (<signum>)". */ const gchar * g_strsignal (gint signum) { gchar *msg; gchar *tofree; const gchar *ret; msg = tofree = NULL; #ifdef HAVE_STRSIGNAL msg = strsignal (signum); if (!g_get_charset (NULL)) msg = tofree = g_locale_to_utf8 (msg, -1, NULL, NULL, NULL); #endif if (!msg) msg = tofree = g_strdup_printf ("unknown signal (%d)", signum); ret = g_intern_string (msg); g_free (tofree); return ret; } /* Functions g_strlcpy and g_strlcat were originally developed by * Todd C. Miller to simplify writing secure code. * See http://www.openbsd.org/cgi-bin/man.cgi?query=strlcpy * for more information. */ #ifdef HAVE_STRLCPY /* Use the native ones, if available; they might be implemented in assembly */ gsize g_strlcpy (gchar *dest, const gchar *src, gsize dest_size) { g_return_val_if_fail (dest != NULL, 0); g_return_val_if_fail (src != NULL, 0); return strlcpy (dest, src, dest_size); } gsize g_strlcat (gchar *dest, const gchar *src, gsize dest_size) { g_return_val_if_fail (dest != NULL, 0); g_return_val_if_fail (src != NULL, 0); return strlcat (dest, src, dest_size); } #else /* ! HAVE_STRLCPY */ /** * g_strlcpy: * @dest: destination buffer * @src: source buffer * @dest_size: length of @dest in bytes * * Portability wrapper that calls strlcpy() on systems which have it, * and emulates strlcpy() otherwise. Copies @src to @dest; @dest is * guaranteed to be nul-terminated; @src must be nul-terminated; * @dest_size is the buffer size, not the number of chars to copy. * * At most dest_size - 1 characters will be copied. Always nul-terminates * (unless dest_size == 0). This function does not * allocate memory. Unlike strncpy(), this function doesn't pad dest (so * it's often faster). It returns the size of the attempted result, * strlen (src), so if @retval >= @dest_size, truncation occurred. * * Caveat: strlcpy() is supposedly more secure than * strcpy() or strncpy(), but if you really want to avoid screwups, * g_strdup() is an even better idea. * * Returns: length of @src */ gsize g_strlcpy (gchar *dest, const gchar *src, gsize dest_size) { register gchar *d = dest; register const gchar *s = src; register gsize n = dest_size; g_return_val_if_fail (dest != NULL, 0); g_return_val_if_fail (src != NULL, 0); /* Copy as many bytes as will fit */ if (n != 0 && --n != 0) do { register gchar c = *s++; *d++ = c; if (c == 0) break; } while (--n != 0); /* If not enough room in dest, add NUL and traverse rest of src */ if (n == 0) { if (dest_size != 0) *d = 0; while (*s++) ; } return s - src - 1; /* count does not include NUL */ } /** * g_strlcat: * @dest: destination buffer, already containing one nul-terminated string * @src: source buffer * @dest_size: length of @dest buffer in bytes (not length of existing string * inside @dest) * * Portability wrapper that calls strlcat() on systems which have it, * and emulates it otherwise. Appends nul-terminated @src string to @dest, * guaranteeing nul-termination for @dest. The total size of @dest won't * exceed @dest_size. * * At most dest_size - 1 characters will be copied. * Unlike strncat, dest_size is the full size of dest, not the space left over. * This function does NOT allocate memory. * This always NUL terminates (unless siz == 0 or there were no NUL characters * in the dest_size characters of dest to start with). * * Caveat: this is supposedly a more secure alternative to * strcat() or strncat(), but for real security g_strconcat() is harder * to mess up. * * Returns: size of attempted result, which is MIN (dest_size, strlen * (original dest)) + strlen (src), so if retval >= dest_size, * truncation occurred. **/ gsize g_strlcat (gchar *dest, const gchar *src, gsize dest_size) { register gchar *d = dest; register const gchar *s = src; register gsize bytes_left = dest_size; gsize dlength; /* Logically, MIN (strlen (d), dest_size) */ g_return_val_if_fail (dest != NULL, 0); g_return_val_if_fail (src != NULL, 0); /* Find the end of dst and adjust bytes left but don't go past end */ while (*d != 0 && bytes_left-- != 0) d++; dlength = d - dest; bytes_left = dest_size - dlength; if (bytes_left == 0) return dlength + strlen (s); while (*s != 0) { if (bytes_left != 1) { *d++ = *s; bytes_left--; } s++; } *d = 0; return dlength + (s - src); /* count does not include NUL */ } #endif /* ! HAVE_STRLCPY */ /** * g_ascii_strdown: * @str: a string. * @len: length of @str in bytes, or -1 if @str is nul-terminated. * * Converts all upper case ASCII letters to lower case ASCII letters. * * Return value: a newly-allocated string, with all the upper case * characters in @str converted to lower case, with * semantics that exactly match g_ascii_tolower(). (Note * that this is unlike the old g_strdown(), which modified * the string in place.) **/ gchar* g_ascii_strdown (const gchar *str, gssize len) { gchar *result, *s; g_return_val_if_fail (str != NULL, NULL); if (len < 0) len = strlen (str); result = g_strndup (str, len); for (s = result; *s; s++) *s = g_ascii_tolower (*s); return result; } /** * g_ascii_strup: * @str: a string. * @len: length of @str in bytes, or -1 if @str is nul-terminated. * * Converts all lower case ASCII letters to upper case ASCII letters. * * Return value: a newly allocated string, with all the lower case * characters in @str converted to upper case, with * semantics that exactly match g_ascii_toupper(). (Note * that this is unlike the old g_strup(), which modified * the string in place.) **/ gchar* g_ascii_strup (const gchar *str, gssize len) { gchar *result, *s; g_return_val_if_fail (str != NULL, NULL); if (len < 0) len = strlen (str); result = g_strndup (str, len); for (s = result; *s; s++) *s = g_ascii_toupper (*s); return result; } /** * g_strdown: * @string: the string to convert. * * Converts a string to lower case. * * Return value: the string * * Deprecated:2.2: This function is totally broken for the reasons discussed * in the g_strncasecmp() docs - use g_ascii_strdown() or g_utf8_strdown() * instead. **/ gchar* g_strdown (gchar *string) { register guchar *s; g_return_val_if_fail (string != NULL, NULL); s = (guchar *) string; while (*s) { if (isupper (*s)) *s = tolower (*s); s++; } return (gchar *) string; } /** * g_strup: * @string: the string to convert. * * Converts a string to upper case. * * Return value: the string * * Deprecated:2.2: This function is totally broken for the reasons discussed * in the g_strncasecmp() docs - use g_ascii_strup() or g_utf8_strup() instead. **/ gchar* g_strup (gchar *string) { register guchar *s; g_return_val_if_fail (string != NULL, NULL); s = (guchar *) string; while (*s) { if (islower (*s)) *s = toupper (*s); s++; } return (gchar *) string; } /** * g_strreverse: * @string: the string to reverse * * Reverses all of the bytes in a string. For example, * g_strreverse ("abcdef") will result * in "fedcba". * * Note that g_strreverse() doesn't work on UTF-8 strings * containing multibyte characters. For that purpose, use * g_utf8_strreverse(). * * Returns: the same pointer passed in as @string */ gchar* g_strreverse (gchar *string) { g_return_val_if_fail (string != NULL, NULL); if (*string) { register gchar *h, *t; h = string; t = string + strlen (string) - 1; while (h < t) { register gchar c; c = *h; *h = *t; h++; *t = c; t--; } } return string; } /** * g_ascii_tolower: * @c: any character. * * Convert a character to ASCII lower case. * * Unlike the standard C library tolower() function, this only * recognizes standard ASCII letters and ignores the locale, returning * all non-ASCII characters unchanged, even if they are lower case * letters in a particular character set. Also unlike the standard * library function, this takes and returns a char, not an int, so * don't call it on EOF but no need to worry about casting to #guchar * before passing a possibly non-ASCII character in. * * Return value: the result of converting @c to lower case. * If @c is not an ASCII upper case letter, * @c is returned unchanged. **/ gchar g_ascii_tolower (gchar c) { return g_ascii_isupper (c) ? c - 'A' + 'a' : c; } /** * g_ascii_toupper: * @c: any character. * * Convert a character to ASCII upper case. * * Unlike the standard C library toupper() function, this only * recognizes standard ASCII letters and ignores the locale, returning * all non-ASCII characters unchanged, even if they are upper case * letters in a particular character set. Also unlike the standard * library function, this takes and returns a char, not an int, so * don't call it on EOF but no need to worry about casting to #guchar * before passing a possibly non-ASCII character in. * * Return value: the result of converting @c to upper case. * If @c is not an ASCII lower case letter, * @c is returned unchanged. **/ gchar g_ascii_toupper (gchar c) { return g_ascii_islower (c) ? c - 'a' + 'A' : c; } /** * g_ascii_digit_value: * @c: an ASCII character. * * Determines the numeric value of a character as a decimal * digit. Differs from g_unichar_digit_value() because it takes * a char, so there's no worry about sign extension if characters * are signed. * * Return value: If @c is a decimal digit (according to * g_ascii_isdigit()), its numeric value. Otherwise, -1. **/ int g_ascii_digit_value (gchar c) { if (g_ascii_isdigit (c)) return c - '0'; return -1; } /** * g_ascii_xdigit_value: * @c: an ASCII character. * * Determines the numeric value of a character as a hexidecimal * digit. Differs from g_unichar_xdigit_value() because it takes * a char, so there's no worry about sign extension if characters * are signed. * * Return value: If @c is a hex digit (according to * g_ascii_isxdigit()), its numeric value. Otherwise, -1. **/ int g_ascii_xdigit_value (gchar c) { if (c >= 'A' && c <= 'F') return c - 'A' + 10; if (c >= 'a' && c <= 'f') return c - 'a' + 10; return g_ascii_digit_value (c); } /** * g_ascii_strcasecmp: * @s1: string to compare with @s2. * @s2: string to compare with @s1. * * Compare two strings, ignoring the case of ASCII characters. * * Unlike the BSD strcasecmp() function, this only recognizes standard * ASCII letters and ignores the locale, treating all non-ASCII * bytes as if they are not letters. * * This function should be used only on strings that are known to be * in encodings where the bytes corresponding to ASCII letters always * represent themselves. This includes UTF-8 and the ISO-8859-* * charsets, but not for instance double-byte encodings like the * Windows Codepage 932, where the trailing bytes of double-byte * characters include all ASCII letters. If you compare two CP932 * strings using this function, you will get false matches. * * Return value: 0 if the strings match, a negative value if @s1 < @s2, * or a positive value if @s1 > @s2. **/ gint g_ascii_strcasecmp (const gchar *s1, const gchar *s2) { gint c1, c2; g_return_val_if_fail (s1 != NULL, 0); g_return_val_if_fail (s2 != NULL, 0); while (*s1 && *s2) { c1 = (gint)(guchar) TOLOWER (*s1); c2 = (gint)(guchar) TOLOWER (*s2); if (c1 != c2) return (c1 - c2); s1++; s2++; } return (((gint)(guchar) *s1) - ((gint)(guchar) *s2)); } /** * g_ascii_strncasecmp: * @s1: string to compare with @s2. * @s2: string to compare with @s1. * @n: number of characters to compare. * * Compare @s1 and @s2, ignoring the case of ASCII characters and any * characters after the first @n in each string. * * Unlike the BSD strcasecmp() function, this only recognizes standard * ASCII letters and ignores the locale, treating all non-ASCII * characters as if they are not letters. * * The same warning as in g_ascii_strcasecmp() applies: Use this * function only on strings known to be in encodings where bytes * corresponding to ASCII letters always represent themselves. * * Return value: 0 if the strings match, a negative value if @s1 < @s2, * or a positive value if @s1 > @s2. **/ gint g_ascii_strncasecmp (const gchar *s1, const gchar *s2, gsize n) { gint c1, c2; g_return_val_if_fail (s1 != NULL, 0); g_return_val_if_fail (s2 != NULL, 0); while (n && *s1 && *s2) { n -= 1; c1 = (gint)(guchar) TOLOWER (*s1); c2 = (gint)(guchar) TOLOWER (*s2); if (c1 != c2) return (c1 - c2); s1++; s2++; } if (n) return (((gint) (guchar) *s1) - ((gint) (guchar) *s2)); else return 0; } /** * g_strcasecmp: * @s1: a string. * @s2: a string to compare with @s1. * * A case-insensitive string comparison, corresponding to the standard * strcasecmp() function on platforms which support it. * * Return value: 0 if the strings match, a negative value if @s1 < @s2, * or a positive value if @s1 > @s2. * * Deprecated:2.2: See g_strncasecmp() for a discussion of why this function * is deprecated and how to replace it. **/ gint g_strcasecmp (const gchar *s1, const gchar *s2) { #ifdef HAVE_STRCASECMP g_return_val_if_fail (s1 != NULL, 0); g_return_val_if_fail (s2 != NULL, 0); return strcasecmp (s1, s2); #else gint c1, c2; g_return_val_if_fail (s1 != NULL, 0); g_return_val_if_fail (s2 != NULL, 0); while (*s1 && *s2) { /* According to A. Cox, some platforms have islower's that * don't work right on non-uppercase */ c1 = isupper ((guchar)*s1) ? tolower ((guchar)*s1) : *s1; c2 = isupper ((guchar)*s2) ? tolower ((guchar)*s2) : *s2; if (c1 != c2) return (c1 - c2); s1++; s2++; } return (((gint)(guchar) *s1) - ((gint)(guchar) *s2)); #endif } /** * g_strncasecmp: * @s1: a string. * @s2: a string to compare with @s1. * @n: the maximum number of characters to compare. * * A case-insensitive string comparison, corresponding to the standard * strncasecmp() function on platforms which support it. * It is similar to g_strcasecmp() except it only compares the first @n * characters of the strings. * * Return value: 0 if the strings match, a negative value if @s1 < @s2, * or a positive value if @s1 > @s2. * * Deprecated:2.2: The problem with g_strncasecmp() is that it does the * comparison by calling toupper()/tolower(). These functions are * locale-specific and operate on single bytes. However, it is impossible * to handle things correctly from an I18N standpoint by operating on * bytes, since characters may be multibyte. Thus g_strncasecmp() is * broken if your string is guaranteed to be ASCII, since it's * locale-sensitive, and it's broken if your string is localized, since * it doesn't work on many encodings at all, including UTF-8, EUC-JP, * etc. * * There are therefore two replacement techniques: g_ascii_strncasecmp(), * which only works on ASCII and is not locale-sensitive, and * 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, const gchar *s2, guint n) { #ifdef HAVE_STRNCASECMP return strncasecmp (s1, s2, n); #else gint c1, c2; g_return_val_if_fail (s1 != NULL, 0); g_return_val_if_fail (s2 != NULL, 0); while (n && *s1 && *s2) { n -= 1; /* According to A. Cox, some platforms have islower's that * don't work right on non-uppercase */ c1 = isupper ((guchar)*s1) ? tolower ((guchar)*s1) : *s1; c2 = isupper ((guchar)*s2) ? tolower ((guchar)*s2) : *s2; if (c1 != c2) return (c1 - c2); s1++; s2++; } if (n) return (((gint) (guchar) *s1) - ((gint) (guchar) *s2)); else return 0; #endif } /** * g_strdelimit: * @string: the string to convert * @delimiters: (allow-none): a string containing the current delimiters, or %NULL * to use the standard delimiters defined in #G_STR_DELIMITERS * @new_delimiter: the new delimiter character * * Converts any delimiter characters in @string to @new_delimiter. * Any characters in @string which are found in @delimiters are * changed to the @new_delimiter character. Modifies @string in place, * and returns @string itself, not a copy. The return value is to * allow nesting such as * |[ * g_ascii_strup (g_strdelimit (str, "abc", '?')) * ]| * * Returns: @string */ gchar * g_strdelimit (gchar *string, const gchar *delimiters, gchar new_delim) { register gchar *c; g_return_val_if_fail (string != NULL, NULL); if (!delimiters) delimiters = G_STR_DELIMITERS; for (c = string; *c; c++) { if (strchr (delimiters, *c)) *c = new_delim; } return string; } /** * g_strcanon: * @string: a nul-terminated array of bytes * @valid_chars: bytes permitted in @string * @substitutor: replacement character for disallowed bytes * * For each character in @string, if the character is not in * @valid_chars, replaces the character with @substitutor. * Modifies @string in place, and return @string itself, not * a copy. The return value is to allow nesting such as * |[ * g_ascii_strup (g_strcanon (str, "abc", '?')) * ]| * * Returns: @string */ gchar * g_strcanon (gchar *string, const gchar *valid_chars, gchar substitutor) { register gchar *c; g_return_val_if_fail (string != NULL, NULL); g_return_val_if_fail (valid_chars != NULL, NULL); for (c = string; *c; c++) { if (!strchr (valid_chars, *c)) *c = substitutor; } return string; } /** * g_strcompress: * @source: a string to compress * * Replaces all escaped characters with their one byte equivalent. * * This function does the reverse conversion of g_strescape(). * * Returns: a newly-allocated copy of @source with all escaped * character compressed */ gchar * g_strcompress (const gchar *source) { const gchar *p = source, *octal; gchar *dest; gchar *q; g_return_val_if_fail (source != NULL, NULL); dest = g_malloc (strlen (source) + 1); q = dest; while (*p) { if (*p == '\\') { p++; switch (*p) { case '\0': g_warning ("g_strcompress: trailing \\"); goto out; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': *q = 0; octal = p; while ((p < octal + 3) && (*p >= '0') && (*p <= '7')) { *q = (*q * 8) + (*p - '0'); p++; } q++; p--; break; case 'b': *q++ = '\b'; break; case 'f': *q++ = '\f'; break; case 'n': *q++ = '\n'; break; case 'r': *q++ = '\r'; break; case 't': *q++ = '\t'; break; case 'v': *q++ = '\v'; break; default: /* Also handles \" and \\ */ *q++ = *p; break; } } else *q++ = *p; p++; } out: *q = 0; return dest; } /** * g_strescape: * @source: a string to escape * @exceptions: a string of characters not to escape in @source * * Escapes the special characters '\b', '\f', '\n', '\r', '\t', '\v', '\' * and '"' in the string @source by inserting a '\' before * them. Additionally all characters in the range 0x01-0x1F (everything * below SPACE) and in the range 0x7F-0xFF (all non-ASCII chars) are * replaced with a '\' followed by their octal representation. * Characters supplied in @exceptions are not escaped. * * g_strcompress() does the reverse conversion. * * Returns: a newly-allocated copy of @source with certain * characters escaped. See above. */ gchar * g_strescape (const gchar *source, const gchar *exceptions) { const guchar *p; gchar *dest; gchar *q; guchar excmap[256]; g_return_val_if_fail (source != NULL, NULL); p = (guchar *) source; /* Each source byte needs maximally four destination chars (\777) */ q = dest = g_malloc (strlen (source) * 4 + 1); memset (excmap, 0, 256); if (exceptions) { guchar *e = (guchar *) exceptions; while (*e) { excmap[*e] = 1; e++; } } while (*p) { if (excmap[*p]) *q++ = *p; else { switch (*p) { case '\b': *q++ = '\\'; *q++ = 'b'; break; case '\f': *q++ = '\\'; *q++ = 'f'; break; case '\n': *q++ = '\\'; *q++ = 'n'; break; case '\r': *q++ = '\\'; *q++ = 'r'; break; case '\t': *q++ = '\\'; *q++ = 't'; break; case '\v': *q++ = '\\'; *q++ = 'v'; break; case '\\': *q++ = '\\'; *q++ = '\\'; break; case '"': *q++ = '\\'; *q++ = '"'; break; default: if ((*p < ' ') || (*p >= 0177)) { *q++ = '\\'; *q++ = '0' + (((*p) >> 6) & 07); *q++ = '0' + (((*p) >> 3) & 07); *q++ = '0' + ((*p) & 07); } else *q++ = *p; break; } } p++; } *q = 0; return dest; } /** * g_strchug: * @string: a string to remove the leading whitespace from * * Removes leading whitespace from a string, by moving the rest * of the characters forward. * * This function doesn't allocate or reallocate any memory; * it modifies @string in place. The pointer to @string is * returned to allow the nesting of functions. * * Also see g_strchomp() and g_strstrip(). * * Returns: @string */ gchar * g_strchug (gchar *string) { guchar *start; g_return_val_if_fail (string != NULL, NULL); for (start = (guchar*) string; *start && g_ascii_isspace (*start); start++) ; g_memmove (string, start, strlen ((gchar *) start) + 1); return string; } /** * g_strchomp: * @string: a string to remove the trailing whitespace from * * Removes trailing whitespace from a string. * * This function doesn't allocate or reallocate any memory; * it modifies @string in place. The pointer to @string is * returned to allow the nesting of functions. * * Also see g_strchug() and g_strstrip(). * * Returns: @string. */ gchar * g_strchomp (gchar *string) { gsize len; g_return_val_if_fail (string != NULL, NULL); len = strlen (string); while (len--) { if (g_ascii_isspace ((guchar) string[len])) string[len] = '\0'; else break; } return string; } /** * g_strsplit: * @string: a string to split * @delimiter: a string which specifies the places at which to split * the string. The delimiter is not included in any of the resulting * strings, unless @max_tokens is reached. * @max_tokens: the maximum number of pieces to split @string into. * If this is less than 1, the string is split completely. * * Splits a string into a maximum of @max_tokens pieces, using the given * @delimiter. If @max_tokens is reached, the remainder of @string is * appended to the last token. * * As a special case, the result of splitting the empty string "" is an empty * vector, not a vector containing a single string. The reason for this * special case is that being able to represent a empty vector is typically * more useful than consistent handling of empty elements. If you do need * to represent empty elements, you'll need to check for the empty string * before calling g_strsplit(). * * Return value: a newly-allocated %NULL-terminated array of strings. Use * g_strfreev() to free it. */ gchar** g_strsplit (const gchar *string, const gchar *delimiter, gint max_tokens) { GSList *string_list = NULL, *slist; gchar **str_array, *s; guint n = 0; const gchar *remainder; g_return_val_if_fail (string != NULL, NULL); g_return_val_if_fail (delimiter != NULL, NULL); g_return_val_if_fail (delimiter[0] != '\0', NULL); if (max_tokens < 1) max_tokens = G_MAXINT; remainder = string; s = strstr (remainder, delimiter); if (s) { gsize delimiter_len = strlen (delimiter); while (--max_tokens && s) { gsize len; len = s - remainder; string_list = g_slist_prepend (string_list, g_strndup (remainder, len)); n++; remainder = s + delimiter_len; s = strstr (remainder, delimiter); } } if (*string) { n++; string_list = g_slist_prepend (string_list, g_strdup (remainder)); } str_array = g_new (gchar*, n + 1); str_array[n--] = NULL; for (slist = string_list; slist; slist = slist->next) str_array[n--] = slist->data; g_slist_free (string_list); return str_array; } /** * g_strsplit_set: * @string: The string to be tokenized * @delimiters: A nul-terminated string containing bytes that are used * to split the string. * @max_tokens: The maximum number of tokens to split @string into. * If this is less than 1, the string is split completely * * Splits @string into a number of tokens not containing any of the characters * in @delimiter. A token is the (possibly empty) longest string that does not * contain any of the characters in @delimiters. If @max_tokens is reached, the * remainder is appended to the last token. * * For example the result of g_strsplit_set ("abc:def/ghi", ":/", -1) is a * %NULL-terminated vector containing the three strings "abc", "def", * and "ghi". * * The result if g_strsplit_set (":def/ghi:", ":/", -1) is a %NULL-terminated * vector containing the four strings "", "def", "ghi", and "". * * As a special case, the result of splitting the empty string "" is an empty * vector, not a vector containing a single string. The reason for this * special case is that being able to represent a empty vector is typically * more useful than consistent handling of empty elements. If you do need * to represent empty elements, you'll need to check for the empty string * before calling g_strsplit_set(). * * Note that this function works on bytes not characters, so it can't be used * to delimit UTF-8 strings for anything but ASCII characters. * * Return value: a newly-allocated %NULL-terminated array of strings. Use * g_strfreev() to free it. * * Since: 2.4 **/ gchar ** g_strsplit_set (const gchar *string, const gchar *delimiters, gint max_tokens) { gboolean delim_table[256]; GSList *tokens, *list; gint n_tokens; const gchar *s; const gchar *current; gchar *token; gchar **result; g_return_val_if_fail (string != NULL, NULL); g_return_val_if_fail (delimiters != NULL, NULL); if (max_tokens < 1) max_tokens = G_MAXINT; if (*string == '\0') { result = g_new (char *, 1); result[0] = NULL; return result; } memset (delim_table, FALSE, sizeof (delim_table)); for (s = delimiters; *s != '\0'; ++s) delim_table[*(guchar *)s] = TRUE; tokens = NULL; n_tokens = 0; s = current = string; while (*s != '\0') { if (delim_table[*(guchar *)s] && n_tokens + 1 < max_tokens) { token = g_strndup (current, s - current); tokens = g_slist_prepend (tokens, token); ++n_tokens; current = s + 1; } ++s; } token = g_strndup (current, s - current); tokens = g_slist_prepend (tokens, token); ++n_tokens; result = g_new (gchar *, n_tokens + 1); result[n_tokens] = NULL; for (list = tokens; list != NULL; list = list->next) result[--n_tokens] = list->data; g_slist_free (tokens); return result; } /** * g_strfreev: * @str_array: a %NULL-terminated array of strings to free * Frees a %NULL-terminated array of strings, and the array itself. * If called on a %NULL value, g_strfreev() simply returns. **/ void g_strfreev (gchar **str_array) { if (str_array) { int i; for (i = 0; str_array[i] != NULL; i++) g_free (str_array[i]); g_free (str_array); } } /** * g_strdupv: * @str_array: a %NULL-terminated array of strings * * Copies %NULL-terminated array of strings. The copy is a deep copy; * the new array should be freed by first freeing each string, then * the array itself. g_strfreev() does this for you. If called * on a %NULL value, g_strdupv() simply returns %NULL. * * Return value: a new %NULL-terminated array of strings. */ gchar** g_strdupv (gchar **str_array) { if (str_array) { gint i; gchar **retval; i = 0; while (str_array[i]) ++i; retval = g_new (gchar*, i + 1); i = 0; while (str_array[i]) { retval[i] = g_strdup (str_array[i]); ++i; } retval[i] = NULL; return retval; } else return NULL; } /** * g_strjoinv: * @separator: (allow-none): a string to insert between each of the strings, or %NULL * @str_array: a %NULL-terminated array of strings to join * * Joins a number of strings together to form one long string, with the * optional @separator inserted between each of them. The returned string * should be freed with g_free(). * * Returns: a newly-allocated string containing all of the strings joined * together, with @separator between them */ gchar* g_strjoinv (const gchar *separator, gchar **str_array) { gchar *string; gchar *ptr; g_return_val_if_fail (str_array != NULL, NULL); if (separator == NULL) separator = ""; if (*str_array) { gint i; gsize len; gsize separator_len; separator_len = strlen (separator); /* First part, getting length */ len = 1 + strlen (str_array[0]); for (i = 1; str_array[i] != NULL; i++) len += strlen (str_array[i]); len += separator_len * (i - 1); /* Second part, building string */ string = g_new (gchar, len); ptr = g_stpcpy (string, *str_array); for (i = 1; str_array[i] != NULL; i++) { ptr = g_stpcpy (ptr, separator); ptr = g_stpcpy (ptr, str_array[i]); } } else string = g_strdup (""); return string; } /** * g_strjoin: * @separator: (allow-none): a string to insert between each of the strings, or %NULL * @...: a %NULL-terminated list of strings to join * * Joins a number of strings together to form one long string, with the * optional @separator inserted between each of them. The returned string * should be freed with g_free(). * * Returns: a newly-allocated string containing all of the strings joined * together, with @separator between them */ gchar* g_strjoin (const gchar *separator, ...) { gchar *string, *s; va_list args; gsize len; gsize separator_len; gchar *ptr; if (separator == NULL) separator = ""; separator_len = strlen (separator); va_start (args, separator); s = va_arg (args, gchar*); if (s) { /* First part, getting length */ len = 1 + strlen (s); s = va_arg (args, gchar*); while (s) { len += separator_len + strlen (s); s = va_arg (args, gchar*); } va_end (args); /* Second part, building string */ string = g_new (gchar, len); va_start (args, separator); s = va_arg (args, gchar*); ptr = g_stpcpy (string, s); s = va_arg (args, gchar*); while (s) { ptr = g_stpcpy (ptr, separator); ptr = g_stpcpy (ptr, s); s = va_arg (args, gchar*); } } else string = g_strdup (""); va_end (args); return string; } /** * g_strstr_len: * @haystack: a string * @haystack_len: the maximum length of @haystack. Note that -1 is * a valid length, if @haystack is nul-terminated, meaning it will * search through the whole string. * @needle: the string to search for * * Searches the string @haystack for the first occurrence * of the string @needle, limiting the length of the search * to @haystack_len. * * Return value: a pointer to the found occurrence, or * %NULL if not found. */ gchar * g_strstr_len (const gchar *haystack, gssize haystack_len, const gchar *needle) { g_return_val_if_fail (haystack != NULL, NULL); g_return_val_if_fail (needle != NULL, NULL); if (haystack_len < 0) return strstr (haystack, needle); else { const gchar *p = haystack; gsize needle_len = strlen (needle); const gchar *end; gsize i; if (needle_len == 0) return (gchar *)haystack; if (haystack_len < needle_len) return NULL; end = haystack + haystack_len - needle_len; while (p <= end && *p) { for (i = 0; i < needle_len; i++) if (p[i] != needle[i]) goto next; return (gchar *)p; next: p++; } return NULL; } } /** * g_strrstr: * @haystack: a nul-terminated string * @needle: the nul-terminated string to search for * * Searches the string @haystack for the last occurrence * of the string @needle. * * Return value: a pointer to the found occurrence, or * %NULL if not found. */ gchar * g_strrstr (const gchar *haystack, const gchar *needle) { gsize i; gsize needle_len; gsize haystack_len; const gchar *p; g_return_val_if_fail (haystack != NULL, NULL); g_return_val_if_fail (needle != NULL, NULL); needle_len = strlen (needle); haystack_len = strlen (haystack); if (needle_len == 0) return (gchar *)haystack; if (haystack_len < needle_len) return NULL; p = haystack + haystack_len - needle_len; while (p >= haystack) { for (i = 0; i < needle_len; i++) if (p[i] != needle[i]) goto next; return (gchar *)p; next: p--; } return NULL; } /** * g_strrstr_len: * @haystack: a nul-terminated string * @haystack_len: the maximum length of @haystack * @needle: the nul-terminated string to search for * * Searches the string @haystack for the last occurrence * of the string @needle, limiting the length of the search * to @haystack_len. * * Return value: a pointer to the found occurrence, or * %NULL if not found. */ gchar * g_strrstr_len (const gchar *haystack, gssize haystack_len, const gchar *needle) { g_return_val_if_fail (haystack != NULL, NULL); g_return_val_if_fail (needle != NULL, NULL); if (haystack_len < 0) return g_strrstr (haystack, needle); else { gsize needle_len = strlen (needle); const gchar *haystack_max = haystack + haystack_len; const gchar *p = haystack; gsize i; while (p < haystack_max && *p) p++; if (p < haystack + needle_len) return NULL; p -= needle_len; while (p >= haystack) { for (i = 0; i < needle_len; i++) if (p[i] != needle[i]) goto next; return (gchar *)p; next: p--; } return NULL; } } /** * g_str_has_suffix: * @str: a nul-terminated string * @suffix: the nul-terminated suffix to look for * * Looks whether the string @str ends with @suffix. * * Return value: %TRUE if @str end with @suffix, %FALSE otherwise. * * Since: 2.2 */ gboolean g_str_has_suffix (const gchar *str, const gchar *suffix) { int str_len; int suffix_len; g_return_val_if_fail (str != NULL, FALSE); g_return_val_if_fail (suffix != NULL, FALSE); str_len = strlen (str); suffix_len = strlen (suffix); if (str_len < suffix_len) return FALSE; return strcmp (str + str_len - suffix_len, suffix) == 0; } /** * g_str_has_prefix: * @str: a nul-terminated string * @prefix: the nul-terminated prefix to look for * * Looks whether the string @str begins with @prefix. * * Return value: %TRUE if @str begins with @prefix, %FALSE otherwise. * * Since: 2.2 */ gboolean g_str_has_prefix (const gchar *str, const gchar *prefix) { int str_len; int prefix_len; g_return_val_if_fail (str != NULL, FALSE); g_return_val_if_fail (prefix != NULL, FALSE); str_len = strlen (str); prefix_len = strlen (prefix); if (str_len < prefix_len) return FALSE; return strncmp (str, prefix, prefix_len) == 0; } /** * g_strv_length: * @str_array: a %NULL-terminated array of strings * * Returns the length of the given %NULL-terminated * string array @str_array. * * Return value: length of @str_array. * * Since: 2.6 */ guint g_strv_length (gchar **str_array) { guint i = 0; g_return_val_if_fail (str_array != NULL, 0); while (str_array[i]) ++i; return i; } pkg-config-0.29.1/glib/glib/gbytes.h0000664000175000017500000000651412651243552014065 00000000000000/* * Copyright © 2009, 2010 Codethink Limited * Copyright © 2011 Collabora Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the licence, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * * Author: Ryan Lortie * Stef Walter */ #ifndef __G_BYTES_H__ #define __G_BYTES_H__ #if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) #error "Only can be included directly." #endif #include #include 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); G_END_DECLS #endif /* __G_BYTES_H__ */ pkg-config-0.29.1/glib/glib/ghmac.c0000664000175000017500000002512512275467762013656 00000000000000/* ghmac.h - data hashing functions * * Copyright (C) 2011 Collabora Ltd. * * 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. * * Author: Stef Walter */ #include "config.h" #include #include "ghmac.h" #include "glib/galloca.h" #include "gatomic.h" #include "gslice.h" #include "gmem.h" #include "gstrfuncs.h" #include "gtestutils.h" #include "gtypes.h" #include "glibintl.h" /** * SECTION:hmac * @title: Secure HMAC Digests * @short_description: computes the HMAC for data * * HMACs should be used when producing a cookie or hash based on data * and a key. Simple mechanisms for using SHA1 and other algorithms to * digest a key and data together are vulnerable to various security * issues. HMAC * uses algorithms like SHA1 in a secure way to produce a digest of a * key and data. * * Both the key and data are arbitrary byte arrays of bytes or characters. * * Support for HMAC Digests has been added in GLib 2.30. */ struct _GHmac { int ref_count; GChecksumType digest_type; GChecksum *digesti; GChecksum *digesto; }; /** * g_hmac_new: * @digest_type: the desired type of digest * @key: (array length=key_len): the key for the HMAC * @key_len: the length of the keys * * Creates a new #GHmac, using the digest algorithm @digest_type. * If the @digest_type is not known, %NULL is returned. * A #GHmac can be used to compute the HMAC of a key and an * arbitrary binary blob, using different hashing algorithms. * * A #GHmac works by feeding a binary blob through g_hmac_update() * until the data is complete; the digest can then be extracted * using g_hmac_get_string(), which will return the checksum as a * hexadecimal string; or g_hmac_get_digest(), which will return a * array of raw bytes. Once either g_hmac_get_string() or * g_hmac_get_digest() have been called on a #GHmac, the HMAC * will be closed and it won't be possible to call g_hmac_update() * on it anymore. * * Return value: the newly created #GHmac, or %NULL. * Use g_hmac_unref() to free the memory allocated by it. * * Since: 2.30 */ GHmac * g_hmac_new (GChecksumType digest_type, const guchar *key, gsize key_len) { GChecksum *checksum; GHmac *hmac; guchar *buffer; guchar *pad; gsize i, len; gsize block_size; checksum = g_checksum_new (digest_type); g_return_val_if_fail (checksum != NULL, NULL); switch (digest_type) { case G_CHECKSUM_MD5: case G_CHECKSUM_SHA1: block_size = 64; /* RFC 2104 */ break; case G_CHECKSUM_SHA256: block_size = 64; /* RFC draft-kelly-ipsec-ciph-sha2-01 */ break; default: g_return_val_if_reached (NULL); } hmac = g_slice_new0 (GHmac); hmac->ref_count = 1; hmac->digest_type = digest_type; hmac->digesti = checksum; hmac->digesto = g_checksum_new (digest_type); buffer = g_alloca (block_size); pad = g_alloca (block_size); memset (buffer, 0, block_size); /* If the key is too long, hash it */ if (key_len > block_size) { len = block_size; g_checksum_update (hmac->digesti, key, key_len); g_checksum_get_digest (hmac->digesti, buffer, &len); g_checksum_reset (hmac->digesti); } /* Otherwise pad it with zeros */ else { memcpy (buffer, key, key_len); } /* First pad */ for (i = 0; i < block_size; i++) pad[i] = 0x36 ^ buffer[i]; /* ipad value */ g_checksum_update (hmac->digesti, pad, block_size); /* Second pad */ for (i = 0; i < block_size; i++) pad[i] = 0x5c ^ buffer[i]; /* opad value */ g_checksum_update (hmac->digesto, pad, block_size); return hmac; } /** * g_hmac_copy: * @hmac: the #GHmac to copy * * Copies a #GHmac. If @hmac has been closed, by calling * g_hmac_get_string() or g_hmac_get_digest(), the copied * HMAC will be closed as well. * * Return value: the copy of the passed #GHmac. Use g_hmac_unref() * when finished using it. * * Since: 2.30 */ GHmac * g_hmac_copy (const GHmac *hmac) { GHmac *copy; g_return_val_if_fail (hmac != NULL, NULL); copy = g_slice_new (GHmac); copy->ref_count = 1; copy->digest_type = hmac->digest_type; copy->digesti = g_checksum_copy (hmac->digesti); copy->digesto = g_checksum_copy (hmac->digesto); return copy; } /** * g_hmac_ref: * @hmac: a valid #GHmac * * Atomically increments the reference count of @hmac by one. * * This function is MT-safe and may be called from any thread. * * Return value: the passed in #GHmac. * * Since: 2.30 **/ GHmac * g_hmac_ref (GHmac *hmac) { g_return_val_if_fail (hmac != NULL, NULL); g_atomic_int_inc (&hmac->ref_count); return hmac; } /** * g_hmac_unref: * @hmac: a #GHmac * * Atomically decrements the reference count of @hmac by one. * * If the reference count drops to 0, all keys and values will be * destroyed, and all memory allocated by the hash table is released. * This function is MT-safe and may be called from any thread. * Frees the memory allocated for @hmac. * * Since: 2.30 */ void g_hmac_unref (GHmac *hmac) { g_return_if_fail (hmac != NULL); if (g_atomic_int_dec_and_test (&hmac->ref_count)) { g_checksum_free (hmac->digesti); g_checksum_free (hmac->digesto); g_slice_free (GHmac, hmac); } } /** * g_hmac_update: * @hmac: a #GHmac * @data: (array length=length): buffer used to compute the checksum * @length: size of the buffer, or -1 if it is a nul-terminated string * * Feeds @data into an existing #GHmac. * * The HMAC must still be open, that is g_hmac_get_string() or * g_hmac_get_digest() must not have been called on @hmac. * * Since: 2.30 */ void g_hmac_update (GHmac *hmac, const guchar *data, gssize length) { g_return_if_fail (hmac != NULL); g_return_if_fail (length == 0 || data != NULL); g_checksum_update (hmac->digesti, data, length); } /** * g_hmac_get_string: * @hmac: a #GHmac * * Gets the HMAC as an hexadecimal string. * * Once this function has been called the #GHmac can no longer be * updated with g_hmac_update(). * * The hexadecimal characters will be lower case. * * Return value: the hexadecimal representation of the HMAC. The * returned string is owned by the HMAC and should not be modified * or freed. * * Since: 2.30 */ const gchar * g_hmac_get_string (GHmac *hmac) { guint8 *buffer; gsize digest_len; g_return_val_if_fail (hmac != NULL, NULL); digest_len = g_checksum_type_get_length (hmac->digest_type); buffer = g_alloca (digest_len); /* This is only called for its side-effect of updating hmac->digesto... */ g_hmac_get_digest (hmac, buffer, &digest_len); /* ... because we get the string from the checksum rather than * stringifying buffer ourselves */ return g_checksum_get_string (hmac->digesto); } /** * g_hmac_get_digest: * @hmac: a #GHmac * @buffer: output buffer * @digest_len: an inout parameter. The caller initializes it to the * size of @buffer. After the call it contains the length of the digest * * Gets the digest from @checksum as a raw binary array and places it * into @buffer. The size of the digest depends on the type of checksum. * * Once this function has been called, the #GHmac is closed and can * no longer be updated with g_checksum_update(). * * Since: 2.30 */ void g_hmac_get_digest (GHmac *hmac, guint8 *buffer, gsize *digest_len) { gsize len; g_return_if_fail (hmac != NULL); len = g_checksum_type_get_length (hmac->digest_type); g_return_if_fail (*digest_len >= len); /* Use the same buffer, because we can :) */ g_checksum_get_digest (hmac->digesti, buffer, &len); g_checksum_update (hmac->digesto, buffer, len); g_checksum_get_digest (hmac->digesto, buffer, digest_len); } /** * g_compute_hmac_for_data: * @digest_type: a #GChecksumType to use for the HMAC * @key: (array length=key_len): the key to use in the HMAC * @key_len: the length of the key * @data: binary blob to compute the HMAC of * @length: length of @data * * Computes the HMAC for a binary @data of @length. This is a * convenience wrapper for g_hmac_new(), g_hmac_get_string() * and g_hmac_unref(). * * The hexadecimal string returned will be in lower case. * * Return value: the HMAC of the binary data as a string in hexadecimal. * The returned string should be freed with g_free() when done using it. * * Since: 2.30 */ gchar * g_compute_hmac_for_data (GChecksumType digest_type, const guchar *key, gsize key_len, const guchar *data, gsize length) { GHmac *hmac; gchar *retval; g_return_val_if_fail (length == 0 || data != NULL, NULL); hmac = g_hmac_new (digest_type, key, key_len); if (!hmac) return NULL; g_hmac_update (hmac, data, length); retval = g_strdup (g_hmac_get_string (hmac)); g_hmac_unref (hmac); return retval; } /** * g_compute_hmac_for_string: * @digest_type: a #GChecksumType to use for the HMAC * @key: (array length=key_len): the key to use in the HMAC * @key_len: the length of the key * @str: the string to compute the HMAC for * @length: the length of the string, or -1 if the string is nul-terminated * * Computes the HMAC for a string. * * The hexadecimal string returned will be in lower case. * * Return value: the HMAC as a hexadecimal string. * The returned string should be freed with g_free() * when done using it. * * Since: 2.30 */ gchar * g_compute_hmac_for_string (GChecksumType digest_type, const guchar *key, gsize key_len, const gchar *str, gssize length) { g_return_val_if_fail (length == 0 || str != NULL, NULL); if (length < 0) length = strlen (str); return g_compute_hmac_for_data (digest_type, key, key_len, (const guchar *) str, length); } pkg-config-0.29.1/glib/glib/gmem.c0000664000175000017500000005347012651243552013513 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the GLib Team and others 1997-2000. See the AUTHORS * file for a list of people on the GLib Team. See the ChangeLog * files for a list of changes. These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/. */ /* * MT safe */ #include "config.h" #include "gmem.h" #include #include #include #include "glib-init.h" #include "gslice.h" #include "gbacktrace.h" #include "gtestutils.h" #include "gthread.h" #include "glib_trace.h" #define MEM_PROFILE_TABLE_SIZE 4096 /* notes on macros: * having G_DISABLE_CHECKS defined disables use of glib_mem_profiler_table and * g_mem_profile(). * If g_mem_gc_friendly is TRUE, freed memory should be 0-wiped. */ /* --- variables --- */ static GMemVTable glib_mem_vtable = { malloc, realloc, free, calloc, malloc, realloc, }; /** * SECTION:memory * @Short_Description: general memory-handling * @Title: Memory Allocation * * These functions provide support for allocating and freeing memory. * * * If any call to allocate memory fails, the application is terminated. * This also means that there is no need to check if the call succeeded. * * * * It's important to match g_malloc() with g_free(), plain malloc() with free(), * and (if you're using C++) new with delete and new[] with delete[]. Otherwise * bad things can happen, since these allocators may use different memory * pools (and new/delete call constructors and destructors). See also * g_mem_set_vtable(). * */ /* --- functions --- */ /** * g_malloc: * @n_bytes: the number of bytes to allocate * * Allocates @n_bytes bytes of memory. * If @n_bytes is 0 it returns %NULL. * * Returns: a pointer to the allocated memory */ gpointer g_malloc (gsize n_bytes) { if (G_LIKELY (n_bytes)) { gpointer mem; mem = glib_mem_vtable.malloc (n_bytes); TRACE (GLIB_MEM_ALLOC((void*) mem, (unsigned int) n_bytes, 0, 0)); if (mem) return mem; g_error ("%s: failed to allocate %"G_GSIZE_FORMAT" bytes", G_STRLOC, n_bytes); } TRACE(GLIB_MEM_ALLOC((void*) NULL, (int) n_bytes, 0, 0)); return NULL; } /** * g_malloc0: * @n_bytes: the number of bytes to allocate * * Allocates @n_bytes bytes of memory, initialized to 0's. * If @n_bytes is 0 it returns %NULL. * * Returns: a pointer to the allocated memory */ gpointer g_malloc0 (gsize n_bytes) { if (G_LIKELY (n_bytes)) { gpointer mem; mem = glib_mem_vtable.calloc (1, n_bytes); TRACE (GLIB_MEM_ALLOC((void*) mem, (unsigned int) n_bytes, 1, 0)); if (mem) return mem; g_error ("%s: failed to allocate %"G_GSIZE_FORMAT" bytes", G_STRLOC, n_bytes); } TRACE(GLIB_MEM_ALLOC((void*) NULL, (int) n_bytes, 1, 0)); return NULL; } /** * g_realloc: * @mem: the memory to reallocate * @n_bytes: new size of the memory in bytes * * Reallocates the memory pointed to by @mem, so that it now has space for * @n_bytes bytes of memory. It returns the new address of the memory, which may * have been moved. @mem may be %NULL, in which case it's considered to * have zero-length. @n_bytes may be 0, in which case %NULL will be returned * and @mem will be freed unless it is %NULL. * * Returns: the new address of the allocated memory */ gpointer g_realloc (gpointer mem, gsize n_bytes) { gpointer newmem; if (G_LIKELY (n_bytes)) { newmem = glib_mem_vtable.realloc (mem, n_bytes); TRACE (GLIB_MEM_REALLOC((void*) newmem, (void*)mem, (unsigned int) n_bytes, 0)); if (newmem) return newmem; g_error ("%s: failed to allocate %"G_GSIZE_FORMAT" bytes", G_STRLOC, n_bytes); } if (mem) glib_mem_vtable.free (mem); TRACE (GLIB_MEM_REALLOC((void*) NULL, (void*)mem, 0, 0)); return NULL; } /** * g_free: * @mem: the memory to free * * Frees the memory pointed to by @mem. * If @mem is %NULL it simply returns. */ void g_free (gpointer mem) { if (G_LIKELY (mem)) glib_mem_vtable.free (mem); TRACE(GLIB_MEM_FREE((void*) 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. * * Attempts to allocate @n_bytes, and returns %NULL on failure. * Contrast with g_malloc(), which aborts the program on failure. * * Returns: the allocated memory, or %NULL. */ gpointer g_try_malloc (gsize n_bytes) { gpointer mem; if (G_LIKELY (n_bytes)) mem = glib_mem_vtable.try_malloc (n_bytes); else mem = NULL; TRACE (GLIB_MEM_ALLOC((void*) mem, (unsigned int) n_bytes, 0, 1)); return mem; } /** * g_try_malloc0: * @n_bytes: number of bytes to allocate * * Attempts to allocate @n_bytes, initialized to 0's, and returns %NULL on * failure. Contrast with g_malloc0(), which aborts the program on failure. * * Since: 2.8 * Returns: the allocated memory, or %NULL */ gpointer g_try_malloc0 (gsize n_bytes) { gpointer mem; if (G_LIKELY (n_bytes)) mem = glib_mem_vtable.try_malloc (n_bytes); else mem = NULL; if (mem) memset (mem, 0, n_bytes); return mem; } /** * g_try_realloc: * @mem: (allow-none): previously-allocated memory, or %NULL. * @n_bytes: number of bytes to allocate. * * Attempts to realloc @mem to a new size, @n_bytes, and returns %NULL * on failure. Contrast with g_realloc(), which aborts the program * on failure. If @mem is %NULL, behaves the same as g_try_malloc(). * * Returns: the allocated memory, or %NULL. */ gpointer g_try_realloc (gpointer mem, gsize n_bytes) { gpointer newmem; if (G_LIKELY (n_bytes)) newmem = glib_mem_vtable.try_realloc (mem, n_bytes); else { newmem = NULL; if (mem) glib_mem_vtable.free (mem); } TRACE (GLIB_MEM_REALLOC((void*) newmem, (void*)mem, (unsigned int) n_bytes, 1)); return newmem; } #define SIZE_OVERFLOWS(a,b) (G_UNLIKELY ((b) > 0 && (a) > G_MAXSIZE / (b))) /** * g_malloc_n: * @n_blocks: the number of blocks to allocate * @n_block_bytes: the size of each block in bytes * * This function is similar to g_malloc(), allocating (@n_blocks * @n_block_bytes) bytes, * but care is taken to detect possible overflow during multiplication. * * Since: 2.24 * Returns: a pointer to the allocated memory */ gpointer g_malloc_n (gsize n_blocks, gsize n_block_bytes) { if (SIZE_OVERFLOWS (n_blocks, n_block_bytes)) { g_error ("%s: overflow allocating %"G_GSIZE_FORMAT"*%"G_GSIZE_FORMAT" bytes", G_STRLOC, n_blocks, n_block_bytes); } return g_malloc (n_blocks * n_block_bytes); } /** * g_malloc0_n: * @n_blocks: the number of blocks to allocate * @n_block_bytes: the size of each block in bytes * * This function is similar to g_malloc0(), allocating (@n_blocks * @n_block_bytes) bytes, * but care is taken to detect possible overflow during multiplication. * * Since: 2.24 * Returns: a pointer to the allocated memory */ gpointer g_malloc0_n (gsize n_blocks, gsize n_block_bytes) { if (SIZE_OVERFLOWS (n_blocks, n_block_bytes)) { g_error ("%s: overflow allocating %"G_GSIZE_FORMAT"*%"G_GSIZE_FORMAT" bytes", G_STRLOC, n_blocks, n_block_bytes); } return g_malloc0 (n_blocks * n_block_bytes); } /** * g_realloc_n: * @mem: the memory to reallocate * @n_blocks: the number of blocks to allocate * @n_block_bytes: the size of each block in bytes * * This function is similar to g_realloc(), allocating (@n_blocks * @n_block_bytes) bytes, * but care is taken to detect possible overflow during multiplication. * * Since: 2.24 * Returns: the new address of the allocated memory */ gpointer g_realloc_n (gpointer mem, gsize n_blocks, gsize n_block_bytes) { if (SIZE_OVERFLOWS (n_blocks, n_block_bytes)) { g_error ("%s: overflow allocating %"G_GSIZE_FORMAT"*%"G_GSIZE_FORMAT" bytes", G_STRLOC, n_blocks, n_block_bytes); } return g_realloc (mem, n_blocks * n_block_bytes); } /** * g_try_malloc_n: * @n_blocks: the number of blocks to allocate * @n_block_bytes: the size of each block in bytes * * This function is similar to g_try_malloc(), allocating (@n_blocks * @n_block_bytes) bytes, * but care is taken to detect possible overflow during multiplication. * * Since: 2.24 * Returns: the allocated memory, or %NULL. */ gpointer g_try_malloc_n (gsize n_blocks, gsize n_block_bytes) { if (SIZE_OVERFLOWS (n_blocks, n_block_bytes)) return NULL; return g_try_malloc (n_blocks * n_block_bytes); } /** * g_try_malloc0_n: * @n_blocks: the number of blocks to allocate * @n_block_bytes: the size of each block in bytes * * This function is similar to g_try_malloc0(), allocating (@n_blocks * @n_block_bytes) bytes, * but care is taken to detect possible overflow during multiplication. * * Since: 2.24 * Returns: the allocated memory, or %NULL */ gpointer g_try_malloc0_n (gsize n_blocks, gsize n_block_bytes) { if (SIZE_OVERFLOWS (n_blocks, n_block_bytes)) return NULL; return g_try_malloc0 (n_blocks * n_block_bytes); } /** * g_try_realloc_n: * @mem: (allow-none): previously-allocated memory, or %NULL. * @n_blocks: the number of blocks to allocate * @n_block_bytes: the size of each block in bytes * * This function is similar to g_try_realloc(), allocating (@n_blocks * @n_block_bytes) bytes, * but care is taken to detect possible overflow during multiplication. * * Since: 2.24 * Returns: the allocated memory, or %NULL. */ gpointer g_try_realloc_n (gpointer mem, gsize n_blocks, gsize n_block_bytes) { if (SIZE_OVERFLOWS (n_blocks, n_block_bytes)) return NULL; return g_try_realloc (mem, n_blocks * n_block_bytes); } static gpointer fallback_calloc (gsize n_blocks, gsize n_block_bytes) { gsize l = n_blocks * n_block_bytes; gpointer mem = glib_mem_vtable.malloc (l); if (mem) memset (mem, 0, l); return mem; } static gboolean vtable_set = FALSE; /** * g_mem_is_system_malloc: * * Checks whether the allocator used by g_malloc() is the system's * malloc implementation. If it returns %TRUE memory allocated with * malloc() can be used interchangeable with memory allocated using g_malloc(). * This function is useful for avoiding an extra copy of allocated memory returned * by a non-GLib-based API. * * A different allocator can be set using g_mem_set_vtable(). * * Return value: if %TRUE, malloc() and g_malloc() can be mixed. **/ gboolean g_mem_is_system_malloc (void) { return !vtable_set; } /** * g_mem_set_vtable: * @vtable: table of memory allocation routines. * * Sets the #GMemVTable to use for memory allocation. You can use this to provide * custom memory allocation routines. This function must be called * before using any other GLib functions. The @vtable only needs to * provide malloc(), realloc(), and free() functions; GLib can provide default * implementations of the others. The malloc() and realloc() implementations * should return %NULL on failure, GLib will handle error-checking for you. * @vtable is copied, so need not persist after this function has been called. */ void g_mem_set_vtable (GMemVTable *vtable) { if (!vtable_set) { if (vtable->malloc && vtable->realloc && vtable->free) { glib_mem_vtable.malloc = vtable->malloc; glib_mem_vtable.realloc = vtable->realloc; glib_mem_vtable.free = vtable->free; glib_mem_vtable.calloc = vtable->calloc ? vtable->calloc : fallback_calloc; glib_mem_vtable.try_malloc = vtable->try_malloc ? vtable->try_malloc : glib_mem_vtable.malloc; glib_mem_vtable.try_realloc = vtable->try_realloc ? vtable->try_realloc : glib_mem_vtable.realloc; vtable_set = TRUE; } else g_warning (G_STRLOC ": memory allocation vtable lacks one of malloc(), realloc() or free()"); } else g_warning (G_STRLOC ": memory allocation vtable can only be set once at startup"); } /* --- memory profiling and checking --- */ #ifdef G_DISABLE_CHECKS /** * glib_mem_profiler_table: * * A #GMemVTable containing profiling variants of the memory * allocation functions. Use them together with g_mem_profile() * in order to get information about the memory allocation pattern * of your program. */ GMemVTable *glib_mem_profiler_table = &glib_mem_vtable; void g_mem_profile (void) { } #else /* !G_DISABLE_CHECKS */ typedef enum { PROFILER_FREE = 0, PROFILER_ALLOC = 1, PROFILER_RELOC = 2, PROFILER_ZINIT = 4 } ProfilerJob; static guint *profile_data = NULL; static gsize profile_allocs = 0; static gsize profile_zinit = 0; static gsize profile_frees = 0; static GMutex gmem_profile_mutex; #ifdef G_ENABLE_DEBUG static volatile gsize g_trap_free_size = 0; static volatile gsize g_trap_realloc_size = 0; static volatile gsize g_trap_malloc_size = 0; #endif /* G_ENABLE_DEBUG */ #define PROFILE_TABLE(f1,f2,f3) ( ( ((f3) << 2) | ((f2) << 1) | (f1) ) * (MEM_PROFILE_TABLE_SIZE + 1)) static void profiler_log (ProfilerJob job, gsize n_bytes, gboolean success) { g_mutex_lock (&gmem_profile_mutex); if (!profile_data) { 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); return; } } if (n_bytes < MEM_PROFILE_TABLE_SIZE) profile_data[n_bytes + PROFILE_TABLE ((job & PROFILER_ALLOC) != 0, (job & PROFILER_RELOC) != 0, success != 0)] += 1; else profile_data[MEM_PROFILE_TABLE_SIZE + PROFILE_TABLE ((job & PROFILER_ALLOC) != 0, (job & PROFILER_RELOC) != 0, success != 0)] += 1; if (success) { if (job & PROFILER_ALLOC) { profile_allocs += n_bytes; if (job & PROFILER_ZINIT) profile_zinit += n_bytes; } else profile_frees += n_bytes; } g_mutex_unlock (&gmem_profile_mutex); } static void profile_print_locked (guint *local_data, gboolean success) { gboolean need_header = TRUE; guint i; for (i = 0; i <= MEM_PROFILE_TABLE_SIZE; i++) { glong t_malloc = local_data[i + PROFILE_TABLE (1, 0, success)]; glong t_realloc = local_data[i + PROFILE_TABLE (1, 1, success)]; glong t_free = local_data[i + PROFILE_TABLE (0, 0, success)]; glong t_refree = local_data[i + PROFILE_TABLE (0, 1, success)]; if (!t_malloc && !t_realloc && !t_free && !t_refree) continue; else if (need_header) { need_header = FALSE; g_print (" blocks of | allocated | freed | allocated | freed | n_bytes \n"); g_print (" n_bytes | n_times by | n_times by | n_times by | n_times by | remaining \n"); g_print (" | malloc() | free() | realloc() | realloc() | \n"); g_print ("===========|============|============|============|============|===========\n"); } if (i < MEM_PROFILE_TABLE_SIZE) g_print ("%10u | %10ld | %10ld | %10ld | %10ld |%+11ld\n", i, t_malloc, t_free, t_realloc, t_refree, (t_malloc - t_free + t_realloc - t_refree) * i); else if (i >= MEM_PROFILE_TABLE_SIZE) g_print (" >%6u | %10ld | %10ld | %10ld | %10ld | ***\n", i, t_malloc, t_free, t_realloc, t_refree); } if (need_header) g_print (" --- none ---\n"); } /** * g_mem_profile: * * Outputs a summary of memory usage. * * It outputs the frequency of allocations of different sizes, * the total number of bytes which have been allocated, * the total number of bytes which have been freed, * and the difference between the previous two values, i.e. the number of bytes * still in use. * * Note that this function will not output anything unless you have * previously installed the #glib_mem_profiler_table with g_mem_set_vtable(). */ void g_mem_profile (void) { guint local_data[(MEM_PROFILE_TABLE_SIZE + 1) * 8]; gsize local_allocs; gsize local_zinit; gsize local_frees; g_mutex_lock (&gmem_profile_mutex); local_allocs = profile_allocs; local_zinit = profile_zinit; local_frees = profile_frees; if (!profile_data) { g_mutex_unlock (&gmem_profile_mutex); return; } memcpy (local_data, profile_data, (MEM_PROFILE_TABLE_SIZE + 1) * 8 * sizeof (profile_data[0])); g_mutex_unlock (&gmem_profile_mutex); g_print ("GLib Memory statistics (successful operations):\n"); profile_print_locked (local_data, TRUE); g_print ("GLib Memory statistics (failing operations):\n"); profile_print_locked (local_data, FALSE); g_print ("Total bytes: allocated=%"G_GSIZE_FORMAT", " "zero-initialized=%"G_GSIZE_FORMAT" (%.2f%%), " "freed=%"G_GSIZE_FORMAT" (%.2f%%), " "remaining=%"G_GSIZE_FORMAT"\n", local_allocs, local_zinit, ((gdouble) local_zinit) / local_allocs * 100.0, local_frees, ((gdouble) local_frees) / local_allocs * 100.0, local_allocs - local_frees); } static gpointer profiler_try_malloc (gsize n_bytes) { gsize *p; #ifdef G_ENABLE_DEBUG if (g_trap_malloc_size == n_bytes) G_BREAKPOINT (); #endif /* G_ENABLE_DEBUG */ p = malloc (sizeof (gsize) * 2 + n_bytes); if (p) { p[0] = 0; /* free count */ p[1] = n_bytes; /* length */ profiler_log (PROFILER_ALLOC, n_bytes, TRUE); p += 2; } else profiler_log (PROFILER_ALLOC, n_bytes, FALSE); return p; } static gpointer profiler_malloc (gsize n_bytes) { gpointer mem = profiler_try_malloc (n_bytes); if (!mem) g_mem_profile (); return mem; } static gpointer profiler_calloc (gsize n_blocks, gsize n_block_bytes) { gsize l = n_blocks * n_block_bytes; gsize *p; #ifdef G_ENABLE_DEBUG if (g_trap_malloc_size == l) G_BREAKPOINT (); #endif /* G_ENABLE_DEBUG */ p = calloc (1, sizeof (gsize) * 2 + l); if (p) { p[0] = 0; /* free count */ p[1] = l; /* length */ profiler_log (PROFILER_ALLOC | PROFILER_ZINIT, l, TRUE); p += 2; } else { profiler_log (PROFILER_ALLOC | PROFILER_ZINIT, l, FALSE); g_mem_profile (); } return p; } static void profiler_free (gpointer mem) { gsize *p = mem; p -= 2; if (p[0]) /* free count */ { g_warning ("free(%p): memory has been freed %"G_GSIZE_FORMAT" times already", p + 2, p[0]); profiler_log (PROFILER_FREE, p[1], /* length */ FALSE); } else { #ifdef G_ENABLE_DEBUG if (g_trap_free_size == p[1]) G_BREAKPOINT (); #endif /* G_ENABLE_DEBUG */ profiler_log (PROFILER_FREE, p[1], /* length */ TRUE); memset (p + 2, 0xaa, p[1]); /* for all those that miss free (p); in this place, yes, * we do leak all memory when profiling, and that is intentional * to catch double frees. patch submissions are futile. */ } p[0] += 1; } static gpointer profiler_try_realloc (gpointer mem, gsize n_bytes) { gsize *p = mem; p -= 2; #ifdef G_ENABLE_DEBUG if (g_trap_realloc_size == n_bytes) G_BREAKPOINT (); #endif /* G_ENABLE_DEBUG */ if (mem && p[0]) /* free count */ { g_warning ("realloc(%p, %"G_GSIZE_FORMAT"): " "memory has been freed %"G_GSIZE_FORMAT" times already", p + 2, (gsize) n_bytes, p[0]); profiler_log (PROFILER_ALLOC | PROFILER_RELOC, n_bytes, FALSE); return NULL; } else { p = realloc (mem ? p : NULL, sizeof (gsize) * 2 + n_bytes); if (p) { if (mem) profiler_log (PROFILER_FREE | PROFILER_RELOC, p[1], TRUE); p[0] = 0; p[1] = n_bytes; profiler_log (PROFILER_ALLOC | PROFILER_RELOC, p[1], TRUE); p += 2; } else profiler_log (PROFILER_ALLOC | PROFILER_RELOC, n_bytes, FALSE); return p; } } static gpointer profiler_realloc (gpointer mem, gsize n_bytes) { mem = profiler_try_realloc (mem, n_bytes); if (!mem) g_mem_profile (); return mem; } static GMemVTable profiler_table = { profiler_malloc, profiler_realloc, profiler_free, profiler_calloc, profiler_try_malloc, profiler_try_realloc, }; GMemVTable *glib_mem_profiler_table = &profiler_table; #endif /* !G_DISABLE_CHECKS */ pkg-config-0.29.1/glib/glib/gbitlock.c0000664000175000017500000003414212651243552014357 00000000000000/* * Copyright © 2008 Ryan Lortie * Copyright © 2010 Codethink Limited * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the licence, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * * Author: Ryan Lortie */ #include "config.h" #include "gbitlock.h" #include #include #include #include #include #include "gthreadprivate.h" #ifdef G_BIT_LOCK_FORCE_FUTEX_EMULATION #undef HAVE_FUTEX #endif #ifndef HAVE_FUTEX static GMutex g_futex_mutex; static GSList *g_futex_address_list = NULL; #endif #ifdef HAVE_FUTEX /* * We have headers for futex(2) on the build machine. This does not * imply that every system that ever runs the resulting glib will have * kernel support for futex, but you'd have to have a pretty old * kernel in order for that not to be the case. * * If anyone actually gets bit by this, please file a bug. :) */ #include #include #include /* < private > * g_futex_wait: * @address: a pointer to an integer * @value: the value that should be at @address * * Atomically checks that the value stored at @address is equal to * @value and then blocks. If the value stored at @address is not * equal to @value then this function returns immediately. * * To unblock, call g_futex_wake() on @address. * * This call may spuriously unblock (for example, in response to the * process receiving a signal) but this is not guaranteed. Unlike the * Linux system call of a similar name, there is no guarantee that a * waiting process will unblock due to a g_futex_wake() call in a * separate process. */ static void g_futex_wait (const volatile gint *address, gint value) { syscall (__NR_futex, address, (gsize) FUTEX_WAIT, (gsize) value, NULL); } /* < private > * g_futex_wake: * @address: a pointer to an integer * * Nominally, wakes one thread that is blocked in g_futex_wait() on * @address (if any thread is currently waiting). * * As mentioned in the documention for g_futex_wait(), spurious * wakeups may occur. As such, this call may result in more than one * thread being woken up. */ static void g_futex_wake (const volatile gint *address) { syscall (__NR_futex, address, (gsize) FUTEX_WAKE, (gsize) 1, NULL); } #else /* emulate futex(2) */ typedef struct { const volatile gint *address; gint ref_count; GCond wait_queue; } WaitAddress; static WaitAddress * g_futex_find_address (const volatile gint *address) { GSList *node; for (node = g_futex_address_list; node; node = node->next) { WaitAddress *waiter = node->data; if (waiter->address == address) return waiter; } return NULL; } static void g_futex_wait (const volatile gint *address, gint value) { g_mutex_lock (&g_futex_mutex); if G_LIKELY (g_atomic_int_get (address) == value) { WaitAddress *waiter; if ((waiter = g_futex_find_address (address)) == NULL) { waiter = g_slice_new (WaitAddress); waiter->address = address; g_cond_init (&waiter->wait_queue); waiter->ref_count = 0; g_futex_address_list = g_slist_prepend (g_futex_address_list, waiter); } waiter->ref_count++; g_cond_wait (&waiter->wait_queue, &g_futex_mutex); if (!--waiter->ref_count) { g_futex_address_list = g_slist_remove (g_futex_address_list, waiter); g_cond_clear (&waiter->wait_queue); g_slice_free (WaitAddress, waiter); } } g_mutex_unlock (&g_futex_mutex); } static void g_futex_wake (const volatile gint *address) { WaitAddress *waiter; /* need to lock here for two reasons: * 1) need to acquire/release lock to ensure waiter is not in * the process of registering a wait * 2) need to -stay- locked until the end to ensure a wake() * in another thread doesn't cause 'waiter' to stop existing */ g_mutex_lock (&g_futex_mutex); if ((waiter = g_futex_find_address (address))) g_cond_signal (&waiter->wait_queue); g_mutex_unlock (&g_futex_mutex); } #endif #define CONTENTION_CLASSES 11 static volatile gint g_bit_lock_contended[CONTENTION_CLASSES]; #if (defined (i386) || defined (__amd64__)) #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5) #define USE_ASM_GOTO 1 #endif #endif /** * g_bit_lock: * @address: a pointer to an integer * @lock_bit: a bit value between 0 and 31 * * Sets the indicated @lock_bit in @address. If the bit is already * set, this call will block until g_bit_unlock() unsets the * corresponding bit. * * Attempting to lock on two different bits within the same integer is * not supported and will very probably cause deadlocks. * * The value of the bit that is set is (1u << @bit). If @bit is not * between 0 and 31 then the result is undefined. * * This function accesses @address atomically. All other accesses to * @address must be atomic in order for this function to work * reliably. * * Since: 2.24 **/ void g_bit_lock (volatile gint *address, gint lock_bit) { #ifdef USE_ASM_GOTO retry: asm volatile goto ("lock bts %1, (%0)\n" "jc %l[contended]" : /* no output */ : "r" (address), "r" (lock_bit) : "cc", "memory" : contended); return; contended: { guint mask = 1u << lock_bit; guint v; v = g_atomic_int_get (address); if (v & mask) { guint class = ((gsize) address) % G_N_ELEMENTS (g_bit_lock_contended); g_atomic_int_add (&g_bit_lock_contended[class], +1); g_futex_wait (address, v); g_atomic_int_add (&g_bit_lock_contended[class], -1); } } goto retry; #else guint mask = 1u << lock_bit; guint v; retry: v = g_atomic_int_or (address, mask); if (v & mask) /* already locked */ { guint class = ((gsize) address) % G_N_ELEMENTS (g_bit_lock_contended); g_atomic_int_add (&g_bit_lock_contended[class], +1); g_futex_wait (address, v); g_atomic_int_add (&g_bit_lock_contended[class], -1); goto retry; } #endif } /** * g_bit_trylock: * @address: a pointer to an integer * @lock_bit: a bit value between 0 and 31 * * Sets the indicated @lock_bit in @address, returning %TRUE if * successful. If the bit is already set, returns %FALSE immediately. * * Attempting to lock on two different bits within the same integer is * not supported. * * The value of the bit that is set is (1u << @bit). If @bit is not * between 0 and 31 then the result is undefined. * * This function accesses @address atomically. All other accesses to * @address must be atomic in order for this function to work * reliably. * * Returns: %TRUE if the lock was acquired * * Since: 2.24 **/ gboolean g_bit_trylock (volatile gint *address, gint lock_bit) { #ifdef USE_ASM_GOTO gboolean result; asm volatile ("lock bts %2, (%1)\n" "setnc %%al\n" "movzx %%al, %0" : "=r" (result) : "r" (address), "r" (lock_bit) : "cc", "memory"); return result; #else guint mask = 1u << lock_bit; guint v; v = g_atomic_int_or (address, mask); return ~v & mask; #endif } /** * g_bit_unlock: * @address: a pointer to an integer * @lock_bit: a bit value between 0 and 31 * * Clears the indicated @lock_bit in @address. If another thread is * currently blocked in g_bit_lock() on this same bit then it will be * woken up. * * This function accesses @address atomically. All other accesses to * @address must be atomic in order for this function to work * reliably. * * Since: 2.24 **/ void g_bit_unlock (volatile gint *address, gint lock_bit) { #ifdef USE_ASM_GOTO asm volatile ("lock btr %1, (%0)" : /* no output */ : "r" (address), "r" (lock_bit) : "cc", "memory"); #else guint mask = 1u << lock_bit; g_atomic_int_and (address, ~mask); #endif { guint class = ((gsize) address) % G_N_ELEMENTS (g_bit_lock_contended); if (g_atomic_int_get (&g_bit_lock_contended[class])) g_futex_wake (address); } } /* We emulate pointer-sized futex(2) because the kernel API only * supports integers. * * We assume that the 'interesting' part is always the lower order bits. * This assumption holds because pointer bitlocks are restricted to * using the low order bits of the pointer as the lock. * * On 32 bits, there is nothing to do since the pointer size is equal to * the integer size. On little endian the lower-order bits don't move, * so do nothing. Only on 64bit big endian do we need to do a bit of * pointer arithmetic: the low order bits are shifted by 4 bytes. We * have a helper function that always does the right thing here. * * Since we always consider the low-order bits of the integer value, a * simple cast from (gsize) to (guint) always takes care of that. * * After that, pointer-sized futex becomes as simple as: * * g_futex_wait (g_futex_int_address (address), (guint) value); * * and * * g_futex_wake (g_futex_int_address (int_address)); */ static const volatile gint * g_futex_int_address (const volatile void *address) { const volatile gint *int_address = address; /* this implementation makes these (reasonable) assumptions: */ G_STATIC_ASSERT (G_BYTE_ORDER == G_LITTLE_ENDIAN || (G_BYTE_ORDER == G_BIG_ENDIAN && sizeof (int) == 4 && (sizeof (gpointer) == 4 || sizeof (gpointer) == 8))); #if G_BYTE_ORDER == G_BIG_ENDIAN && GLIB_SIZEOF_VOID_P == 8 int_address++; #endif return int_address; } /** * g_pointer_bit_lock: * @address: a pointer to a #gpointer-sized value * @lock_bit: a bit value between 0 and 31 * * This is equivalent to g_bit_lock, but working on pointers (or other * pointer-sized values). * * For portability reasons, you may only lock on the bottom 32 bits of * the pointer. * * Since: 2.30 **/ void (g_pointer_bit_lock) (volatile void *address, gint lock_bit) { g_return_if_fail (lock_bit < 32); { #ifdef USE_ASM_GOTO retry: asm volatile goto ("lock bts %1, (%0)\n" "jc %l[contended]" : /* no output */ : "r" (address), "r" ((gsize) lock_bit) : "cc", "memory" : contended); return; contended: { volatile gsize *pointer_address = address; gsize mask = 1u << lock_bit; gsize v; v = (gsize) g_atomic_pointer_get (pointer_address); if (v & mask) { guint class = ((gsize) address) % G_N_ELEMENTS (g_bit_lock_contended); g_atomic_int_add (&g_bit_lock_contended[class], +1); g_futex_wait (g_futex_int_address (address), v); g_atomic_int_add (&g_bit_lock_contended[class], -1); } } goto retry; #else volatile gsize *pointer_address = address; gsize mask = 1u << lock_bit; gsize v; retry: v = g_atomic_pointer_or (pointer_address, mask); if (v & mask) /* already locked */ { guint class = ((gsize) address) % G_N_ELEMENTS (g_bit_lock_contended); g_atomic_int_add (&g_bit_lock_contended[class], +1); g_futex_wait (g_futex_int_address (address), (guint) v); g_atomic_int_add (&g_bit_lock_contended[class], -1); goto retry; } #endif } } /** * g_pointer_bit_trylock: * @address: a pointer to a #gpointer-sized value * @lock_bit: a bit value between 0 and 31 * * This is equivalent to g_bit_trylock, but working on pointers (or * other pointer-sized values). * * For portability reasons, you may only lock on the bottom 32 bits of * the pointer. * * Returns: %TRUE if the lock was acquired * * Since: 2.30 **/ gboolean (g_pointer_bit_trylock) (volatile void *address, gint lock_bit) { g_return_val_if_fail (lock_bit < 32, FALSE); { #ifdef USE_ASM_GOTO gboolean result; asm volatile ("lock bts %2, (%1)\n" "setnc %%al\n" "movzx %%al, %0" : "=r" (result) : "r" (address), "r" ((gsize) lock_bit) : "cc", "memory"); return result; #else volatile gsize *pointer_address = address; gsize mask = 1u << lock_bit; gsize v; g_return_val_if_fail (lock_bit < 32, FALSE); v = g_atomic_pointer_or (pointer_address, mask); return ~v & mask; #endif } } /** * g_pointer_bit_unlock: * @address: a pointer to a #gpointer-sized value * @lock_bit: a bit value between 0 and 31 * * This is equivalent to g_bit_unlock, but working on pointers (or other * pointer-sized values). * * For portability reasons, you may only lock on the bottom 32 bits of * the pointer. * * Since: 2.30 **/ void (g_pointer_bit_unlock) (volatile void *address, gint lock_bit) { g_return_if_fail (lock_bit < 32); { #ifdef USE_ASM_GOTO asm volatile ("lock btr %1, (%0)" : /* no output */ : "r" (address), "r" ((gsize) lock_bit) : "cc", "memory"); #else volatile gsize *pointer_address = address; gsize mask = 1u << lock_bit; g_atomic_pointer_and (pointer_address, ~mask); #endif { guint class = ((gsize) address) % G_N_ELEMENTS (g_bit_lock_contended); if (g_atomic_int_get (&g_bit_lock_contended[class])) g_futex_wake (g_futex_int_address (address)); } } } pkg-config-0.29.1/glib/glib/gutils.c0000664000175000017500000021251012651243552014065 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1998 Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the GLib Team and others 1997-2000. See the AUTHORS * file for a list of people on the GLib Team. See the ChangeLog * files for a list of changes. These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/. */ /* * MT safe for the unix part, FIXME: make the win32 part MT safe as well. */ #include "config.h" #ifdef HAVE_UNISTD_H #include #endif #include #include #include #include #include #include /* For tolower() */ #include #include #include #ifdef HAVE_PWD_H #include #endif #include #ifdef HAVE_SYS_PARAM_H #include #endif #ifdef HAVE_CRT_EXTERNS_H #include /* for _NSGetEnviron */ #endif /* implement gutils's inline functions */ #define G_IMPLEMENT_INLINES 1 #define __G_UTILS_C__ #include "gutils.h" #include "glib-init.h" #include "glib-private.h" #include "genviron.h" #include "gfileutils.h" #include "ggettext.h" #include "ghash.h" #include "gthread.h" #include "gtestutils.h" #include "gunicode.h" #include "gstrfuncs.h" #include "garray.h" #include "glibintl.h" #ifdef G_PLATFORM_WIN32 #include "gconvert.h" #include "gwin32.h" #endif /** * SECTION:misc_utils * @title: Miscellaneous Utility Functions * @short_description: a selection of portable utility functions * * These are portable utility functions. */ #ifdef G_PLATFORM_WIN32 # include # ifndef GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS # define GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT 2 # define GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS 4 # endif # include /* For UNLEN */ #endif /* G_PLATFORM_WIN32 */ #ifdef G_OS_WIN32 # include # include /* older SDK (e.g. msvc 5.0) does not have these*/ # ifndef CSIDL_MYMUSIC # define CSIDL_MYMUSIC 13 # endif # ifndef CSIDL_MYVIDEO # define CSIDL_MYVIDEO 14 # endif # ifndef CSIDL_INTERNET_CACHE # define CSIDL_INTERNET_CACHE 32 # endif # ifndef CSIDL_COMMON_APPDATA # define CSIDL_COMMON_APPDATA 35 # endif # ifndef CSIDL_MYPICTURES # define CSIDL_MYPICTURES 0x27 # endif # ifndef CSIDL_COMMON_DOCUMENTS # define CSIDL_COMMON_DOCUMENTS 46 # endif # ifndef CSIDL_PROFILE # define CSIDL_PROFILE 40 # endif # include #endif #ifdef HAVE_CARBON #include #endif #ifdef HAVE_CODESET #include #endif #ifdef G_PLATFORM_WIN32 gchar * _glib_get_dll_directory (void) { gchar *retval; gchar *p; wchar_t wc_fn[MAX_PATH]; #ifdef DLL_EXPORT if (glib_dll == NULL) return NULL; #endif /* This code is different from that in * g_win32_get_package_installation_directory_of_module() in that * here we return the actual folder where the GLib DLL is. We don't * do the check for it being in a "bin" or "lib" subfolder and then * returning the parent of that. * * In a statically built GLib, glib_dll will be NULL and we will * thus look up the application's .exe file's location. */ if (!GetModuleFileNameW (glib_dll, wc_fn, MAX_PATH)) return NULL; retval = g_utf16_to_utf8 (wc_fn, -1, NULL, NULL, NULL); p = strrchr (retval, G_DIR_SEPARATOR); if (p == NULL) { /* Wtf? */ return NULL; } *p = '\0'; return retval; } #endif #if !defined (HAVE_MEMMOVE) && !defined (HAVE_WORKING_BCOPY) /** * g_memmove: * @dest: the destination address to copy the bytes to. * @src: the source address to copy the bytes from. * @len: the number of bytes to copy. * * Copies a block of memory @len bytes long, from @src to @dest. * The source and destination areas may overlap. * * In order to use this function, you must include * string.h yourself, because this macro will * typically simply resolve to memmove() and GLib does not include * string.h for you. */ void g_memmove (gpointer dest, gconstpointer src, gulong len) { gchar* destptr = dest; const gchar* srcptr = src; if (src + len < dest || dest + len < src) { bcopy (src, dest, len); return; } else if (dest <= src) { while (len--) *(destptr++) = *(srcptr++); } else { destptr += len; srcptr += len; while (len--) *(--destptr) = *(--srcptr); } } #endif /* !HAVE_MEMMOVE && !HAVE_WORKING_BCOPY */ #ifdef G_OS_WIN32 #undef g_atexit #endif /** * g_atexit: * @func: (scope async): the function to call on normal program termination. * * Specifies a function to be called at normal program termination. * * Since GLib 2.8.2, on Windows g_atexit() actually is a preprocessor * macro that maps to a call to the atexit() function in the C * library. This means that in case the code that calls g_atexit(), * i.e. atexit(), is in a DLL, the function will be called when the * DLL is detached from the program. This typically makes more sense * than that the function is called when the GLib DLL is detached, * which happened earlier when g_atexit() was a function in the GLib * DLL. * * The behaviour of atexit() in the context of dynamically loaded * modules is not formally specified and varies wildly. * * On POSIX systems, calling g_atexit() (or atexit()) in a dynamically * loaded module which is unloaded before the program terminates might * well cause a crash at program exit. * * Some POSIX systems implement atexit() like Windows, and have each * dynamically loaded module maintain an own atexit chain that is * called when the module is unloaded. * * On other POSIX systems, before a dynamically loaded module is * unloaded, the registered atexit functions (if any) residing in that * module are called, regardless where the code that registered them * resided. This is presumably the most robust approach. * * As can be seen from the above, for portability it's best to avoid * calling g_atexit() (or atexit()) except in the main executable of a * program. * * Deprecated:2.32: It is best to avoid g_atexit(). */ void g_atexit (GVoidFunc func) { gint result; const gchar *error = NULL; /* keep this in sync with glib.h */ #ifdef G_NATIVE_ATEXIT result = ATEXIT (func); if (result) error = g_strerror (errno); #elif defined (HAVE_ATEXIT) # ifdef NeXT /* @#%@! NeXTStep */ result = !atexit ((void (*)(void)) func); if (result) error = g_strerror (errno); # else result = atexit ((void (*)(void)) func); if (result) error = g_strerror (errno); # endif /* NeXT */ #elif defined (HAVE_ON_EXIT) result = on_exit ((void (*)(int, void *)) func, NULL); if (result) error = g_strerror (errno); #else result = 0; error = "no implementation"; #endif /* G_NATIVE_ATEXIT */ if (error) g_error ("Could not register atexit() function: %s", error); } /* Based on execvp() from GNU Libc. * Some of this code is cut-and-pasted into gspawn.c */ static gchar* my_strchrnul (const gchar *str, gchar c) { gchar *p = (gchar*)str; while (*p && (*p != c)) ++p; return p; } #ifdef G_OS_WIN32 static gchar *inner_find_program_in_path (const gchar *program); gchar* g_find_program_in_path (const gchar *program) { const gchar *last_dot = strrchr (program, '.'); if (last_dot == NULL || strchr (last_dot, '\\') != NULL || strchr (last_dot, '/') != NULL) { const gint program_length = strlen (program); gchar *pathext = g_build_path (";", ".exe;.cmd;.bat;.com", g_getenv ("PATHEXT"), NULL); gchar *p; gchar *decorated_program; gchar *retval; p = pathext; do { gchar *q = my_strchrnul (p, ';'); decorated_program = g_malloc (program_length + (q-p) + 1); memcpy (decorated_program, program, program_length); memcpy (decorated_program+program_length, p, q-p); decorated_program [program_length + (q-p)] = '\0'; retval = inner_find_program_in_path (decorated_program); g_free (decorated_program); if (retval != NULL) { g_free (pathext); return retval; } p = q; } while (*p++ != '\0'); g_free (pathext); return NULL; } else return inner_find_program_in_path (program); } #endif /** * g_find_program_in_path: * @program: a program name in the GLib file name encoding * * Locates the first executable named @program in the user's path, in the * same way that execvp() would locate it. Returns an allocated string * with the absolute path name, or %NULL if the program is not found in * the path. If @program is already an absolute path, returns a copy of * @program if @program exists and is executable, and %NULL otherwise. * * On Windows, if @program does not have a file type suffix, tries * with the suffixes .exe, .cmd, .bat and .com, and the suffixes in * the PATHEXT environment variable. * * On Windows, it looks for the file in the same way as CreateProcess() * would. This means first in the directory where the executing * program was loaded from, then in the current directory, then in the * Windows 32-bit system directory, then in the Windows directory, and * finally in the directories in the PATH environment * variable. If the program is found, the return value contains the * full name including the type suffix. * * Return value: a newly-allocated string with the absolute path, or %NULL **/ #ifdef G_OS_WIN32 static gchar * inner_find_program_in_path (const gchar *program) #else gchar* g_find_program_in_path (const gchar *program) #endif { const gchar *path, *p; gchar *name, *freeme; #ifdef G_OS_WIN32 const gchar *path_copy; gchar *filename = NULL, *appdir = NULL; gchar *sysdir = NULL, *windir = NULL; int n; wchar_t wfilename[MAXPATHLEN], wsysdir[MAXPATHLEN], wwindir[MAXPATHLEN]; #endif gsize len; gsize pathlen; g_return_val_if_fail (program != NULL, NULL); /* If it is an absolute path, or a relative path including subdirectories, * don't look in PATH. */ if (g_path_is_absolute (program) || strchr (program, G_DIR_SEPARATOR) != NULL #ifdef G_OS_WIN32 || strchr (program, '/') != NULL #endif ) { if (g_file_test (program, G_FILE_TEST_IS_EXECUTABLE) && !g_file_test (program, G_FILE_TEST_IS_DIR)) return g_strdup (program); else return NULL; } path = g_getenv ("PATH"); #if defined(G_OS_UNIX) || defined(G_OS_BEOS) if (path == NULL) { /* There is no 'PATH' in the environment. The default * search path in GNU libc is the current directory followed by * the path 'confstr' returns for '_CS_PATH'. */ /* In GLib we put . last, for security, and don't use the * unportable confstr(); UNIX98 does not actually specify * what to search if PATH is unset. POSIX may, dunno. */ path = "/bin:/usr/bin:."; } #else n = GetModuleFileNameW (NULL, wfilename, MAXPATHLEN); if (n > 0 && n < MAXPATHLEN) filename = g_utf16_to_utf8 (wfilename, -1, NULL, NULL, NULL); n = GetSystemDirectoryW (wsysdir, MAXPATHLEN); if (n > 0 && n < MAXPATHLEN) sysdir = g_utf16_to_utf8 (wsysdir, -1, NULL, NULL, NULL); n = GetWindowsDirectoryW (wwindir, MAXPATHLEN); if (n > 0 && n < MAXPATHLEN) windir = g_utf16_to_utf8 (wwindir, -1, NULL, NULL, NULL); if (filename) { appdir = g_path_get_dirname (filename); g_free (filename); } path = g_strdup (path); if (windir) { const gchar *tem = path; path = g_strconcat (windir, ";", path, NULL); g_free ((gchar *) tem); g_free (windir); } if (sysdir) { const gchar *tem = path; path = g_strconcat (sysdir, ";", path, NULL); g_free ((gchar *) tem); g_free (sysdir); } { const gchar *tem = path; path = g_strconcat (".;", path, NULL); g_free ((gchar *) tem); } if (appdir) { const gchar *tem = path; path = g_strconcat (appdir, ";", path, NULL); g_free ((gchar *) tem); g_free (appdir); } path_copy = path; #endif len = strlen (program) + 1; pathlen = strlen (path); freeme = name = g_malloc (pathlen + len + 1); /* Copy the file name at the top, including '\0' */ memcpy (name + pathlen + 1, program, len); name = name + pathlen; /* And add the slash before the filename */ *name = G_DIR_SEPARATOR; p = path; do { char *startp; path = p; p = my_strchrnul (path, G_SEARCHPATH_SEPARATOR); if (p == path) /* Two adjacent colons, or a colon at the beginning or the end * of 'PATH' means to search the current directory. */ startp = name + 1; else startp = memcpy (name - (p - path), path, p - path); if (g_file_test (startp, G_FILE_TEST_IS_EXECUTABLE) && !g_file_test (startp, G_FILE_TEST_IS_DIR)) { gchar *ret; ret = g_strdup (startp); g_free (freeme); #ifdef G_OS_WIN32 g_free ((gchar *) path_copy); #endif return ret; } } while (*p++ != '\0'); g_free (freeme); #ifdef G_OS_WIN32 g_free ((gchar *) path_copy); #endif return NULL; } /** * g_bit_nth_lsf: * @mask: a #gulong containing flags * @nth_bit: the index of the bit to start the search from * * Find the position of the first bit set in @mask, searching * from (but not including) @nth_bit upwards. Bits are numbered * from 0 (least significant) to sizeof(#gulong) * 8 - 1 (31 or 63, * usually). To start searching from the 0th bit, set @nth_bit to -1. * * Returns: the index of the first bit set which is higher than @nth_bit */ /** * g_bit_nth_msf: * @mask: a #gulong containing flags * @nth_bit: the index of the bit to start the search from * * Find the position of the first bit set in @mask, searching * from (but not including) @nth_bit downwards. Bits are numbered * from 0 (least significant) to sizeof(#gulong) * 8 - 1 (31 or 63, * usually). To start searching from the last bit, set @nth_bit to * -1 or GLIB_SIZEOF_LONG * 8. * * Returns: the index of the first bit set which is lower than @nth_bit */ /** * g_bit_storage: * @number: a #guint * * Gets the number of bits used to hold @number, * e.g. if @number is 4, 3 bits are needed. * * Returns: the number of bits used to hold @number */ G_LOCK_DEFINE_STATIC (g_utils_global); 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; static gchar *g_user_cache_dir = NULL; static gchar *g_user_config_dir = NULL; static gchar **g_system_config_dirs = NULL; static gchar **g_user_special_dirs = NULL; /* fifteen minutes of fame for everybody */ #define G_USER_DIRS_EXPIRE 15 * 60 #ifdef G_OS_WIN32 static gchar * get_special_folder (int csidl) { wchar_t path[MAX_PATH+1]; HRESULT hr; LPITEMIDLIST pidl = NULL; BOOL b; gchar *retval = NULL; hr = SHGetSpecialFolderLocation (NULL, csidl, &pidl); if (hr == S_OK) { b = SHGetPathFromIDListW (pidl, path); if (b) retval = g_utf16_to_utf8 (path, -1, NULL, NULL, NULL); CoTaskMemFree (pidl); } return retval; } static char * get_windows_directory_root (void) { wchar_t wwindowsdir[MAX_PATH]; if (GetWindowsDirectoryW (wwindowsdir, G_N_ELEMENTS (wwindowsdir))) { /* Usually X:\Windows, but in terminal server environments * might be an UNC path, AFAIK. */ char *windowsdir = g_utf16_to_utf8 (wwindowsdir, -1, NULL, NULL, NULL); char *p; if (windowsdir == NULL) return g_strdup ("C:\\"); p = (char *) g_path_skip_root (windowsdir); if (G_IS_DIR_SEPARATOR (p[-1]) && p[-2] != ':') p--; *p = '\0'; return windowsdir; } else return g_strdup ("C:\\"); } #endif /* HOLDS: g_utils_global_lock */ static UserDatabaseEntry * g_get_user_database_entry (void) { static UserDatabaseEntry *entry; if (g_once_init_enter (&entry)) { static UserDatabaseEntry e; #ifdef HAVE_PWD_H { struct passwd *pw = NULL; gpointer buffer = NULL; gint error; gchar *logname; # if defined (HAVE_POSIX_GETPWUID_R) || defined (HAVE_NONPOSIX_GETPWUID_R) struct passwd pwd; # ifdef _SC_GETPW_R_SIZE_MAX /* This reurns the maximum length */ glong bufsize = sysconf (_SC_GETPW_R_SIZE_MAX); if (bufsize < 0) bufsize = 64; # else /* _SC_GETPW_R_SIZE_MAX */ glong bufsize = 64; # endif /* _SC_GETPW_R_SIZE_MAX */ logname = (gchar *) g_getenv ("LOGNAME"); do { g_free (buffer); /* we allocate 6 extra bytes to work around a bug in * Mac OS < 10.3. See #156446 */ buffer = g_malloc (bufsize + 6); errno = 0; # ifdef HAVE_POSIX_GETPWUID_R if (logname) { error = getpwnam_r (logname, &pwd, buffer, bufsize, &pw); if (!pw || (pw->pw_uid != getuid ())) { /* LOGNAME is lying, fall back to looking up the uid */ error = getpwuid_r (getuid (), &pwd, buffer, bufsize, &pw); } } else { error = getpwuid_r (getuid (), &pwd, buffer, bufsize, &pw); } error = error < 0 ? errno : error; # else /* HAVE_NONPOSIX_GETPWUID_R */ /* HPUX 11 falls into the HAVE_POSIX_GETPWUID_R case */ # if defined(_AIX) || defined(__hpux) error = getpwuid_r (getuid (), &pwd, buffer, bufsize); pw = error == 0 ? &pwd : NULL; # else /* !_AIX */ if (logname) { pw = getpwnam_r (logname, &pwd, buffer, bufsize); if (!pw || (pw->pw_uid != getuid ())) { /* LOGNAME is lying, fall back to looking up the uid */ pw = getpwuid_r (getuid (), &pwd, buffer, bufsize); } } else { pw = getpwuid_r (getuid (), &pwd, buffer, bufsize); } error = pw ? 0 : errno; # endif /* !_AIX */ # endif /* HAVE_NONPOSIX_GETPWUID_R */ if (!pw) { /* we bail out prematurely if the user id can't be found * (should be pretty rare case actually), or if the buffer * should be sufficiently big and lookups are still not * 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) { 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); } #else /* !HAVE_PWD_H */ #ifdef G_OS_WIN32 { 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 */ #ifdef __EMX__ /* change '\\' in %HOME% to '/' */ g_strdelimit (e.home_dir, "\\",'/'); #endif if (!e.user_name) e.user_name = g_strdup ("somebody"); if (!e.real_name) e.real_name = g_strdup ("Unknown"); g_once_init_leave (&entry, &e); } return entry; } /** * g_get_user_name: * * Gets the user name of the current user. The encoding of the returned * string is system-defined. On UNIX, it might be the preferred file name * encoding, or something else, and there is no guarantee that it is even * consistent on a machine. On Windows, it is always UTF-8. * * Returns: the user name of the current user. */ const gchar * g_get_user_name (void) { UserDatabaseEntry *entry; entry = g_get_user_database_entry (); return entry->user_name; } /** * g_get_real_name: * * Gets the real name of the user. This usually comes from the user's entry * in the passwd file. The encoding of the returned * string is system-defined. (On Windows, it is, however, always UTF-8.) * If the real user name cannot be determined, the string "Unknown" is * returned. * * Returns: the user's real name. */ const gchar * g_get_real_name (void) { UserDatabaseEntry *entry; entry = g_get_user_database_entry (); return entry->real_name; } /** * g_get_home_dir: * * Gets the current user's home directory. * * As with most UNIX tools, this function will return the value of the * HOME environment variable if it is set to an existing * absolute path name, falling back to the passwd * file in the case that it is unset. * * If the path given in HOME is non-absolute, does not * exist, or is not a directory, the result is undefined. * * * Before version 2.36 this function would ignore the * HOME environment variable, taking the value from the * passwd 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). * * 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 HOME environment * variable yourself or unset it before calling any functions in GLib. * * * Returns: the current user's home directory */ const gchar * g_get_home_dir (void) { 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. * * On UNIX, this is taken from the TMPDIR environment * variable. If the variable is not set, P_tmpdir is * used, as defined by the system C library. Failing that, a hard-coded * default of "/tmp" is returned. * * On Windows, the TEMP 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) { 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; } /** * g_get_host_name: * * Return a name for the machine. * * The returned name is not necessarily a fully-qualified domain name, * or even present in DNS or some other name service at all. It need * not even be unique on your local network or site, but usually it * is. Callers should not rely on the return value having any specific * properties like uniqueness for security purposes. Even if the name * of the machine is changed while an application is running, the * return value from this function does not change. The returned * string is owned by GLib and should not be modified or freed. If no * name can be determined, a default fixed string "localhost" is * returned. * * Returns: the host name of the machine. * * Since: 2.8 */ const gchar * g_get_host_name (void) { 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); static gchar *g_prgname = NULL; /** * g_get_prgname: * * Gets the name of the program. This name should not * be localized, contrast with g_get_application_name(). * (If you are using GDK or GTK+ the program name is set in gdk_init(), * which is called by gtk_init(). The program name is found by taking * the last component of argv[0].) * * Returns: the name of the program. The returned string belongs * to GLib and must not be modified or freed. */ const gchar* g_get_prgname (void) { gchar* retval; G_LOCK (g_prgname); #ifdef G_OS_WIN32 if (g_prgname == NULL) { static gboolean beenhere = FALSE; if (!beenhere) { gchar *utf8_buf = NULL; wchar_t buf[MAX_PATH+1]; beenhere = TRUE; if (GetModuleFileNameW (GetModuleHandle (NULL), buf, G_N_ELEMENTS (buf)) > 0) utf8_buf = g_utf16_to_utf8 (buf, -1, NULL, NULL, NULL); if (utf8_buf) { g_prgname = g_path_get_basename (utf8_buf); g_free (utf8_buf); } } } #endif retval = g_prgname; G_UNLOCK (g_prgname); return retval; } /** * g_set_prgname: * @prgname: the name of the program. * * Sets the name of the program. This name should not * be localized, contrast with g_set_application_name(). Note that for * thread-safety reasons this function can only be called once. */ void g_set_prgname (const gchar *prgname) { G_LOCK (g_prgname); g_free (g_prgname); g_prgname = g_strdup (prgname); G_UNLOCK (g_prgname); } G_LOCK_DEFINE_STATIC (g_application_name); static gchar *g_application_name = NULL; /** * g_get_application_name: * * Gets a human-readable name for the application, as set by * g_set_application_name(). This name should be localized if * possible, and is intended for display to the user. Contrast with * g_get_prgname(), which gets a non-localized name. If * g_set_application_name() has not been called, returns the result of * g_get_prgname() (which may be %NULL if g_set_prgname() has also not * been called). * * Return value: human-readable application name. may return %NULL * * Since: 2.2 **/ const gchar * g_get_application_name (void) { gchar* retval; G_LOCK (g_application_name); retval = g_application_name; G_UNLOCK (g_application_name); if (retval == NULL) return g_get_prgname (); return retval; } /** * g_set_application_name: * @application_name: localized name of the application * * Sets a human-readable name for the application. This name should be * localized if possible, and is intended for display to the user. * Contrast with g_set_prgname(), which sets a non-localized name. * g_set_prgname() will be called automatically by gtk_init(), * but g_set_application_name() will not. * * Note that for thread safety reasons, this function can only * be called once. * * The application name will be used in contexts such as error messages, * or when displaying an application's name in the task list. * * Since: 2.2 **/ void g_set_application_name (const gchar *application_name) { gboolean already_set = FALSE; G_LOCK (g_application_name); if (g_application_name) already_set = TRUE; else g_application_name = g_strdup (application_name); G_UNLOCK (g_application_name); if (already_set) g_warning ("g_set_application_name() called multiple times"); } /** * g_get_user_data_dir: * * Returns a base directory in which to access application data such * as icons that is customized for a particular user. * * On UNIX platforms this is determined using the mechanisms described in * the * XDG Base Directory Specification. * In this case the directory retrieved will be XDG_DATA_HOME. * * On Windows this is the folder to use for local (as opposed to * roaming) application data. See documentation for * CSIDL_LOCAL_APPDATA. Note that on Windows it thus is the same as * what g_get_user_config_dir() returns. * * Return value: a string owned by GLib that must not be modified * or freed. * Since: 2.6 **/ const gchar * g_get_user_data_dir (void) { gchar *data_dir; G_LOCK (g_utils_global); if (!g_user_data_dir) { #ifdef G_OS_WIN32 data_dir = get_special_folder (CSIDL_LOCAL_APPDATA); #else data_dir = (gchar *) g_getenv ("XDG_DATA_HOME"); if (data_dir && data_dir[0]) data_dir = g_strdup (data_dir); #endif if (!data_dir || !data_dir[0]) { const gchar *home_dir = g_get_home_dir (); if (home_dir) data_dir = g_build_filename (home_dir, ".local", "share", NULL); else data_dir = g_build_filename (g_get_tmp_dir (), g_get_user_name (), ".local", "share", NULL); } g_user_data_dir = data_dir; } else data_dir = g_user_data_dir; G_UNLOCK (g_utils_global); return data_dir; } static void g_init_user_config_dir (void) { gchar *config_dir; if (!g_user_config_dir) { #ifdef G_OS_WIN32 config_dir = get_special_folder (CSIDL_LOCAL_APPDATA); #else config_dir = (gchar *) g_getenv ("XDG_CONFIG_HOME"); if (config_dir && config_dir[0]) config_dir = g_strdup (config_dir); #endif if (!config_dir || !config_dir[0]) { const gchar *home_dir = g_get_home_dir (); if (home_dir) config_dir = g_build_filename (home_dir, ".config", NULL); else config_dir = g_build_filename (g_get_tmp_dir (), g_get_user_name (), ".config", NULL); } g_user_config_dir = config_dir; } } /** * g_get_user_config_dir: * * Returns a base directory in which to store user-specific application * configuration information such as user preferences and settings. * * On UNIX platforms this is determined using the mechanisms described in * the * XDG Base Directory Specification. * In this case the directory retrieved will be XDG_CONFIG_HOME. * * On Windows this is the folder to use for local (as opposed to * roaming) application data. See documentation for * CSIDL_LOCAL_APPDATA. Note that on Windows it thus is the same as * what g_get_user_data_dir() returns. * * Return value: a string owned by GLib that must not be modified * or freed. * Since: 2.6 **/ const gchar * g_get_user_config_dir (void) { G_LOCK (g_utils_global); g_init_user_config_dir (); G_UNLOCK (g_utils_global); return g_user_config_dir; } /** * g_get_user_cache_dir: * * Returns a base directory in which to store non-essential, cached * data specific to particular user. * * On UNIX platforms this is determined using the mechanisms described in * the * XDG Base Directory Specification. * In this case the directory retrieved will be XDG_CACHE_HOME. * * On Windows is the directory that serves as a common repository for * temporary Internet files. A typical path is * C:\Documents and Settings\username\Local Settings\Temporary Internet Files. * See documentation for CSIDL_INTERNET_CACHE. * * Return value: a string owned by GLib that must not be modified * or freed. * Since: 2.6 **/ const gchar * g_get_user_cache_dir (void) { gchar *cache_dir; G_LOCK (g_utils_global); if (!g_user_cache_dir) { #ifdef G_OS_WIN32 cache_dir = get_special_folder (CSIDL_INTERNET_CACHE); /* XXX correct? */ #else cache_dir = (gchar *) g_getenv ("XDG_CACHE_HOME"); if (cache_dir && cache_dir[0]) cache_dir = g_strdup (cache_dir); #endif if (!cache_dir || !cache_dir[0]) { 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_get_tmp_dir (), g_get_user_name (), ".cache", NULL); } g_user_cache_dir = cache_dir; } else cache_dir = g_user_cache_dir; G_UNLOCK (g_utils_global); return cache_dir; } /** * g_get_user_runtime_dir: * * Returns a directory that is unique to the current user on the local * system. * * On UNIX platforms this is determined using the mechanisms described in * the * XDG Base Directory Specification. This is the directory * specified in the XDG_RUNTIME_DIR environment variable. * In the case that this variable is not set, GLib will issue a warning * message to stderr and return the value of g_get_user_cache_dir(). * * On Windows this is the folder to use for local (as opposed to * roaming) application data. See documentation for * CSIDL_LOCAL_APPDATA. Note that on Windows it thus is the same as * what g_get_user_config_dir() returns. * * Returns: a string owned by GLib that must not be modified or freed. * * Since: 2.28 **/ const gchar * g_get_user_runtime_dir (void) { #ifndef G_OS_WIN32 static const gchar *runtime_dir; static gsize initialised; if (g_once_init_enter (&initialised)) { runtime_dir = g_strdup (getenv ("XDG_RUNTIME_DIR")); g_once_init_leave (&initialised, 1); } if (runtime_dir) return runtime_dir; /* Both fallback for UNIX and the default * in Windows: use the user cache directory. */ #endif return g_get_user_cache_dir (); } #ifdef HAVE_CARBON static gchar * find_folder (OSType type) { gchar *filename = NULL; FSRef found; if (FSFindFolder (kUserDomain, type, kDontCreateFolder, &found) == noErr) { CFURLRef url = CFURLCreateFromFSRef (kCFAllocatorSystemDefault, &found); if (url) { CFStringRef path = CFURLCopyFileSystemPath (url, kCFURLPOSIXPathStyle); if (path) { filename = g_strdup (CFStringGetCStringPtr (path, kCFStringEncodingUTF8)); if (! filename) { filename = g_new0 (gchar, CFStringGetLength (path) * 3 + 1); CFStringGetCString (path, filename, CFStringGetLength (path) * 3 + 1, kCFStringEncodingUTF8); } CFRelease (path); } CFRelease (url); } } return filename; } static void load_user_special_dirs (void) { g_user_special_dirs[G_USER_DIRECTORY_DESKTOP] = find_folder (kDesktopFolderType); g_user_special_dirs[G_USER_DIRECTORY_DOCUMENTS] = find_folder (kDocumentsFolderType); g_user_special_dirs[G_USER_DIRECTORY_DOWNLOAD] = find_folder (kDesktopFolderType); /* XXX correct ? */ g_user_special_dirs[G_USER_DIRECTORY_MUSIC] = find_folder (kMusicDocumentsFolderType); g_user_special_dirs[G_USER_DIRECTORY_PICTURES] = find_folder (kPictureDocumentsFolderType); g_user_special_dirs[G_USER_DIRECTORY_PUBLIC_SHARE] = NULL; g_user_special_dirs[G_USER_DIRECTORY_TEMPLATES] = NULL; g_user_special_dirs[G_USER_DIRECTORY_VIDEOS] = find_folder (kMovieDocumentsFolderType); } #endif /* HAVE_CARBON */ #if defined(G_OS_WIN32) static void load_user_special_dirs (void) { typedef HRESULT (WINAPI *t_SHGetKnownFolderPath) (const GUID *rfid, DWORD dwFlags, HANDLE hToken, PWSTR *ppszPath); t_SHGetKnownFolderPath p_SHGetKnownFolderPath; static const GUID FOLDERID_Downloads = { 0x374de290, 0x123f, 0x4565, { 0x91, 0x64, 0x39, 0xc4, 0x92, 0x5e, 0x46, 0x7b } }; static const GUID FOLDERID_Public = { 0xDFDF76A2, 0xC82A, 0x4D63, { 0x90, 0x6A, 0x56, 0x44, 0xAC, 0x45, 0x73, 0x85 } }; wchar_t *wcp; p_SHGetKnownFolderPath = (t_SHGetKnownFolderPath) GetProcAddress (GetModuleHandle ("shell32.dll"), "SHGetKnownFolderPath"); g_user_special_dirs[G_USER_DIRECTORY_DESKTOP] = get_special_folder (CSIDL_DESKTOPDIRECTORY); g_user_special_dirs[G_USER_DIRECTORY_DOCUMENTS] = get_special_folder (CSIDL_PERSONAL); if (p_SHGetKnownFolderPath == NULL) { g_user_special_dirs[G_USER_DIRECTORY_DOWNLOAD] = get_special_folder (CSIDL_DESKTOPDIRECTORY); } else { wcp = NULL; (*p_SHGetKnownFolderPath) (&FOLDERID_Downloads, 0, NULL, &wcp); if (wcp) { g_user_special_dirs[G_USER_DIRECTORY_DOWNLOAD] = g_utf16_to_utf8 (wcp, -1, NULL, NULL, NULL); if (g_user_special_dirs[G_USER_DIRECTORY_DOWNLOAD] == NULL) g_user_special_dirs[G_USER_DIRECTORY_DOWNLOAD] = get_special_folder (CSIDL_DESKTOPDIRECTORY); CoTaskMemFree (wcp); } else g_user_special_dirs[G_USER_DIRECTORY_DOWNLOAD] = get_special_folder (CSIDL_DESKTOPDIRECTORY); } g_user_special_dirs[G_USER_DIRECTORY_MUSIC] = get_special_folder (CSIDL_MYMUSIC); g_user_special_dirs[G_USER_DIRECTORY_PICTURES] = get_special_folder (CSIDL_MYPICTURES); if (p_SHGetKnownFolderPath == NULL) { /* XXX */ g_user_special_dirs[G_USER_DIRECTORY_PUBLIC_SHARE] = get_special_folder (CSIDL_COMMON_DOCUMENTS); } else { wcp = NULL; (*p_SHGetKnownFolderPath) (&FOLDERID_Public, 0, NULL, &wcp); if (wcp) { g_user_special_dirs[G_USER_DIRECTORY_PUBLIC_SHARE] = g_utf16_to_utf8 (wcp, -1, NULL, NULL, NULL); if (g_user_special_dirs[G_USER_DIRECTORY_PUBLIC_SHARE] == NULL) g_user_special_dirs[G_USER_DIRECTORY_PUBLIC_SHARE] = get_special_folder (CSIDL_COMMON_DOCUMENTS); CoTaskMemFree (wcp); } else g_user_special_dirs[G_USER_DIRECTORY_PUBLIC_SHARE] = get_special_folder (CSIDL_COMMON_DOCUMENTS); } g_user_special_dirs[G_USER_DIRECTORY_TEMPLATES] = get_special_folder (CSIDL_TEMPLATES); g_user_special_dirs[G_USER_DIRECTORY_VIDEOS] = get_special_folder (CSIDL_MYVIDEO); } #endif /* G_OS_WIN32 */ static void g_init_user_config_dir (void); #if defined(G_OS_UNIX) && !defined(HAVE_CARBON) /* adapted from xdg-user-dir-lookup.c * * Copyright (C) 2007 Red Hat Inc. * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation files * (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, * publish, distribute, sublicense, and/or sell copies of the Software, * and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ static void load_user_special_dirs (void) { gchar *config_file; gchar *data; gchar **lines; gint n_lines, i; g_init_user_config_dir (); config_file = g_build_filename (g_user_config_dir, "user-dirs.dirs", NULL); if (!g_file_get_contents (config_file, &data, NULL, NULL)) { g_free (config_file); return; } lines = g_strsplit (data, "\n", -1); n_lines = g_strv_length (lines); g_free (data); for (i = 0; i < n_lines; i++) { gchar *buffer = lines[i]; gchar *d, *p; gint len; gboolean is_relative = FALSE; GUserDirectory directory; /* Remove newline at end */ len = strlen (buffer); if (len > 0 && buffer[len - 1] == '\n') buffer[len - 1] = 0; p = buffer; while (*p == ' ' || *p == '\t') p++; if (strncmp (p, "XDG_DESKTOP_DIR", strlen ("XDG_DESKTOP_DIR")) == 0) { directory = G_USER_DIRECTORY_DESKTOP; p += strlen ("XDG_DESKTOP_DIR"); } else if (strncmp (p, "XDG_DOCUMENTS_DIR", strlen ("XDG_DOCUMENTS_DIR")) == 0) { directory = G_USER_DIRECTORY_DOCUMENTS; p += strlen ("XDG_DOCUMENTS_DIR"); } else if (strncmp (p, "XDG_DOWNLOAD_DIR", strlen ("XDG_DOWNLOAD_DIR")) == 0) { directory = G_USER_DIRECTORY_DOWNLOAD; p += strlen ("XDG_DOWNLOAD_DIR"); } else if (strncmp (p, "XDG_MUSIC_DIR", strlen ("XDG_MUSIC_DIR")) == 0) { directory = G_USER_DIRECTORY_MUSIC; p += strlen ("XDG_MUSIC_DIR"); } else if (strncmp (p, "XDG_PICTURES_DIR", strlen ("XDG_PICTURES_DIR")) == 0) { directory = G_USER_DIRECTORY_PICTURES; p += strlen ("XDG_PICTURES_DIR"); } else if (strncmp (p, "XDG_PUBLICSHARE_DIR", strlen ("XDG_PUBLICSHARE_DIR")) == 0) { directory = G_USER_DIRECTORY_PUBLIC_SHARE; p += strlen ("XDG_PUBLICSHARE_DIR"); } else if (strncmp (p, "XDG_TEMPLATES_DIR", strlen ("XDG_TEMPLATES_DIR")) == 0) { directory = G_USER_DIRECTORY_TEMPLATES; p += strlen ("XDG_TEMPLATES_DIR"); } else if (strncmp (p, "XDG_VIDEOS_DIR", strlen ("XDG_VIDEOS_DIR")) == 0) { directory = G_USER_DIRECTORY_VIDEOS; p += strlen ("XDG_VIDEOS_DIR"); } else continue; while (*p == ' ' || *p == '\t') p++; if (*p != '=') continue; p++; while (*p == ' ' || *p == '\t') p++; if (*p != '"') continue; p++; if (strncmp (p, "$HOME", 5) == 0) { p += 5; is_relative = TRUE; } else if (*p != '/') continue; d = strrchr (p, '"'); if (!d) continue; *d = 0; d = p; /* remove trailing slashes */ len = strlen (d); if (d[len - 1] == '/') d[len - 1] = 0; if (is_relative) { g_user_special_dirs[directory] = g_build_filename (g_get_home_dir (), d, NULL); } else g_user_special_dirs[directory] = g_strdup (d); } g_strfreev (lines); g_free (config_file); } #endif /* G_OS_UNIX && !HAVE_CARBON */ /** * g_reload_user_special_dirs_cache: * * Resets the cache used for g_get_user_special_dir(), so * that the latest on-disk version is used. Call this only * if you just changed the data on disk yourself. * * Due to threadsafety issues this may cause leaking of strings * that were previously returned from g_get_user_special_dir() * that can't be freed. We ensure to only leak the data for * the directories that actually changed value though. * * Since: 2.22 */ void g_reload_user_special_dirs_cache (void) { int i; G_LOCK (g_utils_global); if (g_user_special_dirs != NULL) { /* save a copy of the pointer, to check if some memory can be preserved */ char **old_g_user_special_dirs = g_user_special_dirs; char *old_val; /* recreate and reload our cache */ g_user_special_dirs = g_new0 (gchar *, G_USER_N_DIRECTORIES); load_user_special_dirs (); /* only leak changed directories */ for (i = 0; i < G_USER_N_DIRECTORIES; i++) { old_val = old_g_user_special_dirs[i]; if (g_user_special_dirs[i] == NULL) { g_user_special_dirs[i] = old_val; } else if (g_strcmp0 (old_val, g_user_special_dirs[i]) == 0) { /* don't leak */ g_free (g_user_special_dirs[i]); g_user_special_dirs[i] = old_val; } else g_free (old_val); } /* free the old array */ g_free (old_g_user_special_dirs); } G_UNLOCK (g_utils_global); } /** * g_get_user_special_dir: * @directory: the logical id of special directory * * Returns the full path of a special directory using its logical id. * * On Unix this is done using the XDG special user directories. * For compatibility with existing practise, %G_USER_DIRECTORY_DESKTOP * falls back to $HOME/Desktop when XDG special * user directories have not been set up. * * Depending on the platform, the user might be able to change the path * of the special directory without requiring the session to restart; GLib * will not reflect any change once the special directories are loaded. * * Return value: the path to the specified special directory, or %NULL * if the logical id was not found. The returned string is owned by * GLib and should not be modified or freed. * * Since: 2.14 */ const gchar * g_get_user_special_dir (GUserDirectory directory) { g_return_val_if_fail (directory >= G_USER_DIRECTORY_DESKTOP && directory < G_USER_N_DIRECTORIES, NULL); G_LOCK (g_utils_global); if (G_UNLIKELY (g_user_special_dirs == NULL)) { g_user_special_dirs = g_new0 (gchar *, G_USER_N_DIRECTORIES); load_user_special_dirs (); /* Special-case desktop for historical compatibility */ if (g_user_special_dirs[G_USER_DIRECTORY_DESKTOP] == NULL) g_user_special_dirs[G_USER_DIRECTORY_DESKTOP] = g_build_filename (g_get_home_dir (), "Desktop", NULL); } G_UNLOCK (g_utils_global); return g_user_special_dirs[directory]; } #ifdef G_OS_WIN32 #undef g_get_system_data_dirs static HMODULE get_module_for_address (gconstpointer address) { /* Holds the g_utils_global lock */ static gboolean beenhere = FALSE; typedef BOOL (WINAPI *t_GetModuleHandleExA) (DWORD, LPCTSTR, HMODULE *); static t_GetModuleHandleExA p_GetModuleHandleExA = NULL; HMODULE hmodule = NULL; if (!address) return NULL; if (!beenhere) { p_GetModuleHandleExA = (t_GetModuleHandleExA) GetProcAddress (GetModuleHandle ("kernel32.dll"), "GetModuleHandleExA"); beenhere = TRUE; } if (p_GetModuleHandleExA == NULL || !(*p_GetModuleHandleExA) (GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT | GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, address, &hmodule)) { MEMORY_BASIC_INFORMATION mbi; VirtualQuery (address, &mbi, sizeof (mbi)); hmodule = (HMODULE) mbi.AllocationBase; } return hmodule; } static gchar * get_module_share_dir (gconstpointer address) { HMODULE hmodule; gchar *filename; gchar *retval; hmodule = get_module_for_address (address); if (hmodule == NULL) return NULL; filename = g_win32_get_package_installation_directory_of_module (hmodule); retval = g_build_filename (filename, "share", NULL); g_free (filename); return retval; } const gchar * const * g_win32_get_system_data_dirs_for_module (void (*address_of_function)(void)) { GArray *data_dirs; HMODULE hmodule; static GHashTable *per_module_data_dirs = NULL; gchar **retval; gchar *p; gchar *exe_root; if (address_of_function) { G_LOCK (g_utils_global); hmodule = get_module_for_address (address_of_function); if (hmodule != NULL) { if (per_module_data_dirs == NULL) per_module_data_dirs = g_hash_table_new (NULL, NULL); else { retval = g_hash_table_lookup (per_module_data_dirs, hmodule); if (retval != NULL) { G_UNLOCK (g_utils_global); return (const gchar * const *) retval; } } } } data_dirs = g_array_new (TRUE, TRUE, sizeof (char *)); /* Documents and Settings\All Users\Application Data */ p = get_special_folder (CSIDL_COMMON_APPDATA); if (p) g_array_append_val (data_dirs, p); /* Documents and Settings\All Users\Documents */ p = get_special_folder (CSIDL_COMMON_DOCUMENTS); if (p) g_array_append_val (data_dirs, p); /* Using the above subfolders of Documents and Settings perhaps * makes sense from a Windows perspective. * * But looking at the actual use cases of this function in GTK+ * and GNOME software, what we really want is the "share" * subdirectory of the installation directory for the package * our caller is a part of. * * The address_of_function parameter, if non-NULL, points to a * function in the calling module. Use that to determine that * module's installation folder, and use its "share" subfolder. * * Additionally, also use the "share" subfolder of the installation * locations of GLib and the .exe file being run. * * To guard against none of the above being what is really wanted, * callers of this function should have Win32-specific code to look * up their installation folder themselves, and handle a subfolder * "share" of it in the same way as the folders returned from this * function. */ p = get_module_share_dir (address_of_function); if (p) g_array_append_val (data_dirs, p); if (glib_dll != NULL) { gchar *glib_root = g_win32_get_package_installation_directory_of_module (glib_dll); p = g_build_filename (glib_root, "share", NULL); if (p) g_array_append_val (data_dirs, p); g_free (glib_root); } exe_root = g_win32_get_package_installation_directory_of_module (NULL); p = g_build_filename (exe_root, "share", NULL); if (p) g_array_append_val (data_dirs, p); g_free (exe_root); retval = (gchar **) g_array_free (data_dirs, FALSE); if (address_of_function) { if (hmodule != NULL) g_hash_table_insert (per_module_data_dirs, hmodule, retval); G_UNLOCK (g_utils_global); } return (const gchar * const *) retval; } #endif /** * g_get_system_data_dirs: * * Returns an ordered list of base directories in which to access * system-wide application data. * * On UNIX platforms this is determined using the mechanisms described in * the * XDG Base Directory Specification * In this case the list of directories retrieved will be XDG_DATA_DIRS. * * On Windows the first elements in the list are the Application Data * and Documents folders for All Users. (These can be determined only * on Windows 2000 or later and are not present in the list on other * Windows versions.) See documentation for CSIDL_COMMON_APPDATA and * CSIDL_COMMON_DOCUMENTS. * * Then follows the "share" subfolder in the installation folder for * the package containing the DLL that calls this function, if it can * be determined. * * Finally the list contains the "share" subfolder in the installation * folder for GLib, and in the installation folder for the package the * application's .exe file belongs to. * * The installation folders above are determined by looking up the * folder where the module (DLL or EXE) in question is located. If the * folder's name is "bin", its parent is used, otherwise the folder * itself. * * Note that on Windows the returned list can vary depending on where * this function is called. * * Return value: (array zero-terminated=1) (transfer none): a %NULL-terminated array of strings owned by GLib that must * not be modified or freed. * Since: 2.6 **/ const gchar * const * g_get_system_data_dirs (void) { gchar **data_dir_vector; G_LOCK (g_utils_global); if (!g_system_data_dirs) { #ifdef G_OS_WIN32 data_dir_vector = (gchar **) g_win32_get_system_data_dirs_for_module (NULL); #else gchar *data_dirs = (gchar *) g_getenv ("XDG_DATA_DIRS"); if (!data_dirs || !data_dirs[0]) data_dirs = "/usr/local/share/:/usr/share/"; data_dir_vector = g_strsplit (data_dirs, G_SEARCHPATH_SEPARATOR_S, 0); #endif g_system_data_dirs = data_dir_vector; } else data_dir_vector = g_system_data_dirs; G_UNLOCK (g_utils_global); return (const gchar * const *) data_dir_vector; } /** * g_get_system_config_dirs: * * Returns an ordered list of base directories in which to access * system-wide configuration information. * * On UNIX platforms this is determined using the mechanisms described in * the * XDG Base Directory Specification. * In this case the list of directories retrieved will be XDG_CONFIG_DIRS. * * On Windows is the directory that contains application data for all users. * A typical path is C:\Documents and Settings\All Users\Application Data. * This folder is used for application data that is not user specific. * For example, an application can store a spell-check dictionary, a database * of clip art, or a log file in the CSIDL_COMMON_APPDATA folder. * This information will not roam and is available to anyone using the computer. * * Return value: (array zero-terminated=1) (transfer none): a %NULL-terminated array of strings owned by GLib that must * not be modified or freed. * Since: 2.6 **/ const gchar * const * g_get_system_config_dirs (void) { gchar *conf_dirs, **conf_dir_vector; G_LOCK (g_utils_global); if (!g_system_config_dirs) { #ifdef G_OS_WIN32 conf_dirs = get_special_folder (CSIDL_COMMON_APPDATA); if (conf_dirs) { conf_dir_vector = g_strsplit (conf_dirs, G_SEARCHPATH_SEPARATOR_S, 0); g_free (conf_dirs); } else { /* Return empty list */ conf_dir_vector = g_strsplit ("", G_SEARCHPATH_SEPARATOR_S, 0); } #else conf_dirs = (gchar *) g_getenv ("XDG_CONFIG_DIRS"); if (!conf_dirs || !conf_dirs[0]) conf_dirs = "/etc/xdg"; conf_dir_vector = g_strsplit (conf_dirs, G_SEARCHPATH_SEPARATOR_S, 0); #endif g_system_config_dirs = conf_dir_vector; } else conf_dir_vector = g_system_config_dirs; G_UNLOCK (g_utils_global); return (const gchar * const *) conf_dir_vector; } /** * g_nullify_pointer: * @nullify_location: the memory address of the pointer. * * Set the pointer at the specified location to %NULL. **/ void g_nullify_pointer (gpointer *nullify_location) { g_return_if_fail (nullify_location != NULL); *nullify_location = NULL; } #define KILOBYTE_FACTOR (G_GOFFSET_CONSTANT (1000)) #define MEGABYTE_FACTOR (KILOBYTE_FACTOR * KILOBYTE_FACTOR) #define GIGABYTE_FACTOR (MEGABYTE_FACTOR * KILOBYTE_FACTOR) #define TERABYTE_FACTOR (GIGABYTE_FACTOR * KILOBYTE_FACTOR) #define PETABYTE_FACTOR (TERABYTE_FACTOR * KILOBYTE_FACTOR) #define EXABYTE_FACTOR (PETABYTE_FACTOR * KILOBYTE_FACTOR) #define KIBIBYTE_FACTOR (G_GOFFSET_CONSTANT (1024)) #define MEBIBYTE_FACTOR (KIBIBYTE_FACTOR * KIBIBYTE_FACTOR) #define GIBIBYTE_FACTOR (MEBIBYTE_FACTOR * KIBIBYTE_FACTOR) #define TEBIBYTE_FACTOR (GIBIBYTE_FACTOR * KIBIBYTE_FACTOR) #define PEBIBYTE_FACTOR (TEBIBYTE_FACTOR * KIBIBYTE_FACTOR) #define EXBIBYTE_FACTOR (PEBIBYTE_FACTOR * KIBIBYTE_FACTOR) /** * g_format_size: * @size: a size in bytes * * Formats a size (for example the size of a file) into a human readable * string. Sizes are rounded to the nearest size prefix (kB, MB, GB) * and are displayed rounded to the nearest tenth. E.g. the file size * 3292528 bytes will be converted into the string "3.2 MB". * * The prefix units base is 1000 (i.e. 1 kB is 1000 bytes). * * This string should be freed with g_free() when not needed any longer. * * See g_format_size_full() for more options about how the size might be * formatted. * * Returns: a newly-allocated formatted string containing a human readable * file size * * Since: 2.30 */ gchar * g_format_size (guint64 size) { return g_format_size_full (size, G_FORMAT_SIZE_DEFAULT); } /** * GFormatSizeFlags: * @G_FORMAT_SIZE_DEFAULT: behave the same as g_format_size() * @G_FORMAT_SIZE_LONG_FORMAT: include the exact number of bytes as part * of the returned string. For example, "45.6 kB (45,612 bytes)". * @G_FORMAT_SIZE_IEC_UNITS: use IEC (base 1024) units with "KiB"-style * suffixes. IEC units should only be used for reporting things with * a strong "power of 2" basis, like RAM sizes or RAID stripe sizes. * Network and storage sizes should be reported in the normal SI units. * * 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 * @flags: #GFormatSizeFlags to modify the output * * Formats a size. * * This function is similar to g_format_size() but allows for flags * that modify the output. See #GFormatSizeFlags. * * Returns: a newly-allocated formatted string containing a human * readable file size * * Since: 2.30 */ gchar * g_format_size_full (guint64 size, GFormatSizeFlags flags) { GString *string; string = g_string_new (NULL); if (flags & G_FORMAT_SIZE_IEC_UNITS) { if (size < KIBIBYTE_FACTOR) { g_string_printf (string, g_dngettext(GETTEXT_PACKAGE, "%u byte", "%u bytes", (guint) size), (guint) size); flags &= ~G_FORMAT_SIZE_LONG_FORMAT; } else if (size < MEBIBYTE_FACTOR) g_string_printf (string, _("%.1f KiB"), (gdouble) size / (gdouble) KIBIBYTE_FACTOR); else if (size < GIBIBYTE_FACTOR) g_string_printf (string, _("%.1f MiB"), (gdouble) size / (gdouble) MEBIBYTE_FACTOR); else if (size < TEBIBYTE_FACTOR) g_string_printf (string, _("%.1f GiB"), (gdouble) size / (gdouble) GIBIBYTE_FACTOR); else if (size < PEBIBYTE_FACTOR) g_string_printf (string, _("%.1f TiB"), (gdouble) size / (gdouble) TEBIBYTE_FACTOR); else if (size < EXBIBYTE_FACTOR) g_string_printf (string, _("%.1f PiB"), (gdouble) size / (gdouble) PEBIBYTE_FACTOR); else g_string_printf (string, _("%.1f EiB"), (gdouble) size / (gdouble) EXBIBYTE_FACTOR); } else { if (size < KILOBYTE_FACTOR) { g_string_printf (string, g_dngettext(GETTEXT_PACKAGE, "%u byte", "%u bytes", (guint) size), (guint) size); flags &= ~G_FORMAT_SIZE_LONG_FORMAT; } else if (size < MEGABYTE_FACTOR) g_string_printf (string, _("%.1f kB"), (gdouble) size / (gdouble) KILOBYTE_FACTOR); else if (size < GIGABYTE_FACTOR) g_string_printf (string, _("%.1f MB"), (gdouble) size / (gdouble) MEGABYTE_FACTOR); else if (size < TERABYTE_FACTOR) g_string_printf (string, _("%.1f GB"), (gdouble) size / (gdouble) GIGABYTE_FACTOR); else if (size < PETABYTE_FACTOR) g_string_printf (string, _("%.1f TB"), (gdouble) size / (gdouble) TERABYTE_FACTOR); else if (size < EXABYTE_FACTOR) g_string_printf (string, _("%.1f PB"), (gdouble) size / (gdouble) PETABYTE_FACTOR); else g_string_printf (string, _("%.1f EB"), (gdouble) size / (gdouble) EXABYTE_FACTOR); } if (flags & G_FORMAT_SIZE_LONG_FORMAT) { /* First problem: we need to use the number of bytes to decide on * the plural form that is used for display, but the number of * bytes potentially exceeds the size of a guint (which is what * ngettext() takes). * * From a pragmatic standpoint, it seems that all known languages * base plural forms on one or both of the following: * * - the lowest digits of the number * * - if the number if greater than some small value * * Here's how we fake it: Draw an arbitrary line at one thousand. * If the number is below that, then fine. If it is above it, * then we take the modulus of the number by one thousand (in * order to keep the lowest digits) and add one thousand to that * (in order to ensure that 1001 is not treated the same as 1). */ guint plural_form = size < 1000 ? size : size % 1000 + 1000; /* Second problem: we need to translate the string "%u byte" and * "%u bytes" for pluralisation, but the correct number format to * use for a gsize is different depending on which architecture * we're on. * * Solution: format the number separately and use "%s bytes" on * all platforms. */ const gchar *translated_format; gchar *formatted_number; /* Translators: the %s in "%s bytes" will always be replaced by a number. */ translated_format = g_dngettext(GETTEXT_PACKAGE, "%s byte", "%s bytes", plural_form); /* XXX: Windows doesn't support the "'" format modifier, so we * must not use it there. Instead, just display the number * without separation. Bug #655336 is open until a solution is * found. */ #ifndef G_OS_WIN32 formatted_number = g_strdup_printf ("%'"G_GUINT64_FORMAT, size); #else formatted_number = g_strdup_printf ("%"G_GUINT64_FORMAT, size); #endif g_string_append (string, " ("); g_string_append_printf (string, translated_format, formatted_number); g_free (formatted_number); g_string_append (string, ")"); } return g_string_free (string, FALSE); } #pragma GCC diagnostic pop /** * g_format_size_for_display: * @size: a size in bytes * * Formats a size (for example the size of a file) into a human * readable string. Sizes are rounded to the nearest size prefix * (KB, MB, GB) and are displayed rounded to the nearest tenth. * E.g. the file size 3292528 bytes will be converted into the * string "3.1 MB". * * The prefix units base is 1024 (i.e. 1 KB is 1024 bytes). * * This string should be freed with g_free() when not needed any longer. * * Returns: a newly-allocated formatted string containing a human * readable file size * * Since: 2.16 * * Deprecated:2.30: This function is broken due to its use of SI * suffixes to denote IEC units. Use g_format_size() instead. */ gchar * g_format_size_for_display (goffset size) { if (size < (goffset) KIBIBYTE_FACTOR) return g_strdup_printf (g_dngettext(GETTEXT_PACKAGE, "%u byte", "%u bytes",(guint) size), (guint) size); else { gdouble displayed_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) { displayed_size = (gdouble) size / (gdouble) MEBIBYTE_FACTOR; return g_strdup_printf (_("%.1f MB"), displayed_size); } else if (size < (goffset) TEBIBYTE_FACTOR) { displayed_size = (gdouble) size / (gdouble) GIBIBYTE_FACTOR; return g_strdup_printf (_("%.1f GB"), displayed_size); } else if (size < (goffset) PEBIBYTE_FACTOR) { displayed_size = (gdouble) size / (gdouble) TEBIBYTE_FACTOR; return g_strdup_printf (_("%.1f TB"), displayed_size); } else if (size < (goffset) EXBIBYTE_FACTOR) { displayed_size = (gdouble) size / (gdouble) PEBIBYTE_FACTOR; return g_strdup_printf (_("%.1f PB"), displayed_size); } else { displayed_size = (gdouble) size / (gdouble) EXBIBYTE_FACTOR; return g_strdup_printf (_("%.1f EB"), displayed_size); } } } #if defined (G_OS_WIN32) && !defined (_WIN64) /* Binary compatibility versions. Not for newly compiled code. */ _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_utf8 (const gchar *program) { return g_find_program_in_path (program); } 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 (); } #endif /* 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) { /* 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 */ static gsize check_setuid_initialised; static gboolean is_setuid; 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 (); } 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 } pkg-config-0.29.1/glib/glib/gpoll.h0000664000175000017500000001006612651243552013702 00000000000000/* gpoll.h - poll(2) support * Copyright (C) 2008 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_POLL_H__ #define __G_POLL_H__ #if !defined (__GLIB_H_INSIDE__) && !defined (__G_MAIN_H__) && !defined (GLIB_COMPILATION) #error "Only can be included directly." #endif #include G_BEGIN_DECLS /* Any definitions using GPollFD or GPollFunc are primarily * for Unix and not guaranteed to be the compatible on all * operating systems on which GLib runs. Right now, the * GLib does use these functions on Win32 as well, but interprets * them in a fairly different way than on Unix. If you use * these definitions, you are should be prepared to recode * for different operating systems. * * Note that on systems with a working poll(2), that function is used * in place of g_poll(). Thus g_poll() must have the same signature as * poll(), meaning GPollFD must have the same layout as struct pollfd. * * * On Win32, the fd in a GPollFD should be Win32 HANDLE (*not* a file * descriptor as provided by the C runtime) that can be used by * MsgWaitForMultipleObjects. This does *not* include file handles * from CreateFile, SOCKETs, nor pipe handles. (But you can use * WSAEventSelect to signal events when a SOCKET is readable). * * On Win32, fd can also be the special value G_WIN32_MSG_HANDLE to * indicate polling for messages. * * But note that G_WIN32_MSG_HANDLE GPollFDs should not be used by GDK * (GTK) programs, as GDK itself wants to read messages and convert them * to GDK events. * * So, unless you really know what you are doing, it's best not to try * to use the main loop polling stuff for your own needs on * Windows. */ typedef struct _GPollFD GPollFD; /** * GPollFunc: * @ufds: an array of #GPollFD elements * @nfsd: the number of elements in @ufds * @timeout_: the maximum time to wait for an event of the file descriptors. * A negative value indicates an infinite timeout. * * Specifies the type of function passed to g_main_context_set_poll_func(). * The semantics of the function should match those of the poll() system call. * * Returns: the number of #GPollFD elements which have events or errors * reported, or -1 if an error occurred. */ typedef gint (*GPollFunc) (GPollFD *ufds, guint nfsd, gint timeout_); /** * GPollFD: * @fd: the file descriptor to poll (or a HANDLE on Win32) * @events: a bitwise combination from #GIOCondition, specifying which * events should be polled for. Typically for reading from a file * descriptor you would use %G_IO_IN | %G_IO_HUP | %G_IO_ERR, and * for writing you would use %G_IO_OUT | %G_IO_ERR. * @revents: a bitwise combination of flags from #GIOCondition, returned * from the poll() function to indicate which events occurred. * * Represents a file descriptor, which events to poll for, and which events * occurred. */ struct _GPollFD { #if defined (G_OS_WIN32) && GLIB_SIZEOF_VOID_P == 8 gint64 fd; #else gint fd; #endif gushort events; gushort revents; }; #ifdef G_OS_WIN32 #if GLIB_SIZEOF_VOID_P == 8 #define G_POLLFD_FORMAT "%#I64x" #else #define G_POLLFD_FORMAT "%#x" #endif #else #define G_POLLFD_FORMAT "%d" #endif GLIB_AVAILABLE_IN_ALL gint g_poll (GPollFD *fds, guint nfds, gint timeout); G_END_DECLS #endif /* __G_POLL_H__ */ pkg-config-0.29.1/glib/glib/gstdio.c0000664000175000017500000005417412651243552014061 00000000000000/* gstdio.c - wrappers for C library functions * * Copyright 2004 Tor Lillqvist * * GLib is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * GLib is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with GLib; see the file COPYING.LIB. If not, * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "config.h" #include "glibconfig.h" #define G_STDIO_NO_WRAP_ON_UNIX #include #include #include #ifdef HAVE_UNISTD_H #include #endif #ifdef G_OS_WIN32 #include #include #include #include #include #include #else #include #include #endif #include "gstdio.h" #if !defined (G_OS_UNIX) && !defined (G_OS_WIN32) && !defined (G_OS_BEOS) #error Please port this to your operating system #endif #if defined (_MSC_VER) && !defined(_WIN64) #undef _wstat #define _wstat _wstat32 #endif /** * g_access: * @filename: a pathname in the GLib file name encoding (UTF-8 on Windows) * @mode: as in access() * * A wrapper for the POSIX access() function. This function is used to * test a pathname for one or several of read, write or execute * permissions, or just existence. * * On Windows, the file protection mechanism is not at all POSIX-like, * and the underlying function in the C library only checks the * FAT-style READONLY attribute, and does not look at the ACL of a * file at all. This function is this in practise almost useless on * Windows. Software that needs to handle file permissions on Windows * more exactly should use the Win32 API. * * See your C library manual for more details about access(). * * Returns: zero if the pathname refers to an existing file system * object that has all the tested permissions, or -1 otherwise or on * error. * * Since: 2.8 */ int g_access (const gchar *filename, int mode) { #ifdef G_OS_WIN32 wchar_t *wfilename = g_utf8_to_utf16 (filename, -1, NULL, NULL, NULL); int retval; int save_errno; if (wfilename == NULL) { errno = EINVAL; return -1; } #ifndef X_OK #define X_OK 1 #endif retval = _waccess (wfilename, mode & ~X_OK); save_errno = errno; g_free (wfilename); errno = save_errno; return retval; #else return access (filename, mode); #endif } /** * g_chmod: * @filename: a pathname in the GLib file name encoding (UTF-8 on Windows) * @mode: as in chmod() * * A wrapper for the POSIX chmod() function. The chmod() function is * used to set the permissions of a file system object. * * On Windows the file protection mechanism is not at all POSIX-like, * and the underlying chmod() function in the C library just sets or * clears the FAT-style READONLY attribute. It does not touch any * ACL. Software that needs to manage file permissions on Windows * exactly should use the Win32 API. * * See your C library manual for more details about chmod(). * * Returns: zero if the operation succeeded, -1 on error. * * Since: 2.8 */ int g_chmod (const gchar *filename, int mode) { #ifdef G_OS_WIN32 wchar_t *wfilename = g_utf8_to_utf16 (filename, -1, NULL, NULL, NULL); int retval; int save_errno; if (wfilename == NULL) { errno = EINVAL; return -1; } retval = _wchmod (wfilename, mode); save_errno = errno; g_free (wfilename); errno = save_errno; return retval; #else return chmod (filename, mode); #endif } /** * g_open: * @filename: a pathname in the GLib file name encoding (UTF-8 on Windows) * @flags: as in open() * @mode: as in open() * * A wrapper for the POSIX open() function. The open() function is * used to convert a pathname into a file descriptor. * * On POSIX systems file descriptors are implemented by the operating * system. On Windows, it's the C library that implements open() and * file descriptors. The actual Win32 API for opening files is quite * different, see MSDN documentation for CreateFile(). The Win32 API * uses file handles, which are more randomish integers, not small * integers like file descriptors. * * Because file descriptors are specific to the C library on Windows, * the file descriptor returned by this function makes sense only to * functions in the same C library. Thus if the GLib-using code uses a * different C library than GLib does, the file descriptor returned by * this function cannot be passed to C library functions like write() * or read(). * * See your C library manual for more details about open(). * * Returns: a new file descriptor, or -1 if an error occurred. The * return value can be used exactly like the return value from open(). * * Since: 2.6 */ int g_open (const gchar *filename, int flags, int mode) { #ifdef G_OS_WIN32 wchar_t *wfilename = g_utf8_to_utf16 (filename, -1, NULL, NULL, NULL); int retval; int save_errno; if (wfilename == NULL) { errno = EINVAL; return -1; } retval = _wopen (wfilename, flags, mode); save_errno = errno; g_free (wfilename); errno = save_errno; return retval; #else int fd; do fd = open (filename, flags, mode); while (G_UNLIKELY (fd == -1 && errno == EINTR)); return fd; #endif } /** * g_creat: * @filename: a pathname in the GLib file name encoding (UTF-8 on Windows) * @mode: as in creat() * * A wrapper for the POSIX creat() function. The creat() function is * used to convert a pathname into a file descriptor, creating a file * if necessary. * On POSIX systems file descriptors are implemented by the operating * system. On Windows, it's the C library that implements creat() and * file descriptors. The actual Windows API for opening files is * different, see MSDN documentation for CreateFile(). The Win32 API * uses file handles, which are more randomish integers, not small * integers like file descriptors. * * Because file descriptors are specific to the C library on Windows, * the file descriptor returned by this function makes sense only to * functions in the same C library. Thus if the GLib-using code uses a * different C library than GLib does, the file descriptor returned by * this function cannot be passed to C library functions like write() * or read(). * * See your C library manual for more details about creat(). * * Returns: a new file descriptor, or -1 if an error occurred. The * return value can be used exactly like the return value from creat(). * * Since: 2.8 */ int g_creat (const gchar *filename, int mode) { #ifdef G_OS_WIN32 wchar_t *wfilename = g_utf8_to_utf16 (filename, -1, NULL, NULL, NULL); int retval; int save_errno; if (wfilename == NULL) { errno = EINVAL; return -1; } retval = _wcreat (wfilename, mode); save_errno = errno; g_free (wfilename); errno = save_errno; return retval; #else return creat (filename, mode); #endif } /** * g_rename: * @oldfilename: a pathname in the GLib file name encoding (UTF-8 on Windows) * @newfilename: a pathname in the GLib file name encoding * * A wrapper for the POSIX rename() function. The rename() function * renames a file, moving it between directories if required. * * See your C library manual for more details about how rename() works * on your system. It is not possible in general on Windows to rename * a file that is open to some process. * * Returns: 0 if the renaming succeeded, -1 if an error occurred * * Since: 2.6 */ int g_rename (const gchar *oldfilename, const gchar *newfilename) { #ifdef G_OS_WIN32 wchar_t *woldfilename = g_utf8_to_utf16 (oldfilename, -1, NULL, NULL, NULL); wchar_t *wnewfilename; int retval; int save_errno = 0; if (woldfilename == NULL) { errno = EINVAL; return -1; } wnewfilename = g_utf8_to_utf16 (newfilename, -1, NULL, NULL, NULL); if (wnewfilename == NULL) { g_free (woldfilename); errno = EINVAL; return -1; } if (MoveFileExW (woldfilename, wnewfilename, MOVEFILE_REPLACE_EXISTING)) retval = 0; else { retval = -1; switch (GetLastError ()) { #define CASE(a,b) case ERROR_##a: save_errno = b; break CASE (FILE_NOT_FOUND, ENOENT); CASE (PATH_NOT_FOUND, ENOENT); CASE (ACCESS_DENIED, EACCES); CASE (NOT_SAME_DEVICE, EXDEV); CASE (LOCK_VIOLATION, EACCES); CASE (SHARING_VIOLATION, EACCES); CASE (FILE_EXISTS, EEXIST); CASE (ALREADY_EXISTS, EEXIST); #undef CASE default: save_errno = EIO; } } g_free (woldfilename); g_free (wnewfilename); errno = save_errno; return retval; #else return rename (oldfilename, newfilename); #endif } /** * g_mkdir: * @filename: a pathname in the GLib file name encoding (UTF-8 on Windows) * @mode: permissions to use for the newly created directory * * A wrapper for the POSIX mkdir() function. The mkdir() function * attempts to create a directory with the given name and permissions. * The mode argument is ignored on Windows. * * See your C library manual for more details about mkdir(). * * Returns: 0 if the directory was successfully created, -1 if an error * occurred * * Since: 2.6 */ int g_mkdir (const gchar *filename, int mode) { #ifdef G_OS_WIN32 wchar_t *wfilename = g_utf8_to_utf16 (filename, -1, NULL, NULL, NULL); int retval; int save_errno; if (wfilename == NULL) { errno = EINVAL; return -1; } retval = _wmkdir (wfilename); save_errno = errno; g_free (wfilename); errno = save_errno; return retval; #else return mkdir (filename, mode); #endif } /** * g_chdir: * @path: a pathname in the GLib file name encoding (UTF-8 on Windows) * * A wrapper for the POSIX chdir() function. The function changes the * current directory of the process to @path. * * See your C library manual for more details about chdir(). * * Returns: 0 on success, -1 if an error occurred. * * Since: 2.8 */ int g_chdir (const gchar *path) { #ifdef G_OS_WIN32 wchar_t *wpath = g_utf8_to_utf16 (path, -1, NULL, NULL, NULL); int retval; int save_errno; if (wpath == NULL) { errno = EINVAL; return -1; } retval = _wchdir (wpath); save_errno = errno; g_free (wpath); errno = save_errno; return retval; #else return chdir (path); #endif } /** * GStatBuf: * * A type corresponding to the appropriate struct type for the stat * system call, depending on the platform and/or compiler being used. * * See g_stat() for more information. **/ /** * g_stat: * @filename: a pathname in the GLib file name encoding (UTF-8 on Windows) * @buf: a pointer to a stat struct, which * will be filled with the file information * * A wrapper for the POSIX stat() function. The stat() function * returns information about a file. On Windows the stat() function in * the C library checks only the FAT-style READONLY attribute and does * not look at the ACL at all. Thus on Windows the protection bits in * the st_mode field are a fabrication of little use. * * On Windows the Microsoft C libraries have several variants of the * stat struct and stat() function with names * like "_stat", "_stat32", "_stat32i64" and "_stat64i32". The one * used here is for 32-bit code the one with 32-bit size and time * fields, specifically called "_stat32". * * In Microsoft's compiler, by default "struct stat" means one with * 64-bit time fields while in MinGW "struct stat" is the legacy one * with 32-bit fields. To hopefully clear up this messs, the gstdio.h * header defines a type GStatBuf which is the appropriate struct type * depending on the platform and/or compiler being used. On POSIX it * is just "struct stat", but note that even on POSIX platforms, * "stat" might be a macro. * * See your C library manual for more details about stat(). * * Returns: 0 if the information was successfully retrieved, -1 if an error * occurred * * Since: 2.6 */ int g_stat (const gchar *filename, GStatBuf *buf) { #ifdef G_OS_WIN32 wchar_t *wfilename = g_utf8_to_utf16 (filename, -1, NULL, NULL, NULL); int retval; int save_errno; int len; if (wfilename == NULL) { errno = EINVAL; return -1; } len = wcslen (wfilename); while (len > 0 && G_IS_DIR_SEPARATOR (wfilename[len-1])) len--; if (len > 0 && (!g_path_is_absolute (filename) || len > g_path_skip_root (filename) - filename)) wfilename[len] = '\0'; retval = _wstat (wfilename, buf); save_errno = errno; g_free (wfilename); errno = save_errno; return retval; #else return stat (filename, buf); #endif } /** * g_lstat: * @filename: a pathname in the GLib file name encoding (UTF-8 on Windows) * @buf: a pointer to a stat struct, which * will be filled with the file information * * A wrapper for the POSIX lstat() function. The lstat() function is * like stat() except that in the case of symbolic links, it returns * information about the symbolic link itself and not the file that it * refers to. If the system does not support symbolic links g_lstat() * is identical to g_stat(). * * See your C library manual for more details about lstat(). * * Returns: 0 if the information was successfully retrieved, -1 if an error * occurred * * Since: 2.6 */ int g_lstat (const gchar *filename, GStatBuf *buf) { #ifdef HAVE_LSTAT /* This can't be Win32, so don't do the widechar dance. */ return lstat (filename, buf); #else return g_stat (filename, buf); #endif } /** * g_unlink: * @filename: a pathname in the GLib file name encoding (UTF-8 on Windows) * * A wrapper for the POSIX unlink() function. The unlink() function * deletes a name from the filesystem. If this was the last link to the * file and no processes have it opened, the diskspace occupied by the * file is freed. * * See your C library manual for more details about unlink(). Note * that on Windows, it is in general not possible to delete files that * are open to some process, or mapped into memory. * * Returns: 0 if the name was successfully deleted, -1 if an error * occurred * * Since: 2.6 */ int g_unlink (const gchar *filename) { #ifdef G_OS_WIN32 wchar_t *wfilename = g_utf8_to_utf16 (filename, -1, NULL, NULL, NULL); int retval; int save_errno; if (wfilename == NULL) { errno = EINVAL; return -1; } retval = _wunlink (wfilename); save_errno = errno; g_free (wfilename); errno = save_errno; return retval; #else return unlink (filename); #endif } /** * g_remove: * @filename: a pathname in the GLib file name encoding (UTF-8 on Windows) * * A wrapper for the POSIX remove() function. The remove() function * deletes a name from the filesystem. * * See your C library manual for more details about how remove() works * on your system. On Unix, remove() removes also directories, as it * calls unlink() for files and rmdir() for directories. On Windows, * although remove() in the C library only works for files, this * function tries first remove() and then if that fails rmdir(), and * thus works for both files and directories. Note however, that on * Windows, it is in general not possible to remove a file that is * open to some process, or mapped into memory. * * If this function fails on Windows you can't infer too much from the * errno value. rmdir() is tried regardless of what caused remove() to * fail. Any errno value set by remove() will be overwritten by that * set by rmdir(). * * Returns: 0 if the file was successfully removed, -1 if an error * occurred * * Since: 2.6 */ int g_remove (const gchar *filename) { #ifdef G_OS_WIN32 wchar_t *wfilename = g_utf8_to_utf16 (filename, -1, NULL, NULL, NULL); int retval; int save_errno; if (wfilename == NULL) { errno = EINVAL; return -1; } retval = _wremove (wfilename); if (retval == -1) retval = _wrmdir (wfilename); save_errno = errno; g_free (wfilename); errno = save_errno; return retval; #else return remove (filename); #endif } /** * g_rmdir: * @filename: a pathname in the GLib file name encoding (UTF-8 on Windows) * * A wrapper for the POSIX rmdir() function. The rmdir() function * deletes a directory from the filesystem. * * See your C library manual for more details about how rmdir() works * on your system. * * Returns: 0 if the directory was successfully removed, -1 if an error * occurred * * Since: 2.6 */ int g_rmdir (const gchar *filename) { #ifdef G_OS_WIN32 wchar_t *wfilename = g_utf8_to_utf16 (filename, -1, NULL, NULL, NULL); int retval; int save_errno; if (wfilename == NULL) { errno = EINVAL; return -1; } retval = _wrmdir (wfilename); save_errno = errno; g_free (wfilename); errno = save_errno; return retval; #else return rmdir (filename); #endif } /** * g_fopen: * @filename: a pathname in the GLib file name encoding (UTF-8 on Windows) * @mode: a string describing the mode in which the file should be * opened * * A wrapper for the stdio fopen() function. The fopen() function * opens a file and associates a new stream with it. * * Because file descriptors are specific to the C library on Windows, * and a file descriptor is partof the FILE struct, the * FILE pointer returned by this function makes sense * only to functions in the same C library. Thus if the GLib-using * code uses a different C library than GLib does, the * FILE pointer returned by this function cannot be * passed to C library functions like fprintf() or fread(). * * See your C library manual for more details about fopen(). * * Returns: A FILE pointer if the file was successfully * opened, or %NULL if an error occurred * * Since: 2.6 */ FILE * g_fopen (const gchar *filename, const gchar *mode) { #ifdef G_OS_WIN32 wchar_t *wfilename = g_utf8_to_utf16 (filename, -1, NULL, NULL, NULL); wchar_t *wmode; FILE *retval; int save_errno; if (wfilename == NULL) { errno = EINVAL; return NULL; } wmode = g_utf8_to_utf16 (mode, -1, NULL, NULL, NULL); if (wmode == NULL) { g_free (wfilename); errno = EINVAL; return NULL; } retval = _wfopen (wfilename, wmode); save_errno = errno; g_free (wfilename); g_free (wmode); errno = save_errno; return retval; #else return fopen (filename, mode); #endif } /** * g_freopen: * @filename: a pathname in the GLib file name encoding (UTF-8 on Windows) * @mode: a string describing the mode in which the file should be * opened * @stream: (allow-none): an existing stream which will be reused, or %NULL * * A wrapper for the POSIX freopen() function. The freopen() function * opens a file and associates it with an existing stream. * * See your C library manual for more details about freopen(). * * Returns: A FILE pointer if the file was successfully * opened, or %NULL if an error occurred. * * Since: 2.6 */ FILE * g_freopen (const gchar *filename, const gchar *mode, FILE *stream) { #ifdef G_OS_WIN32 wchar_t *wfilename = g_utf8_to_utf16 (filename, -1, NULL, NULL, NULL); wchar_t *wmode; FILE *retval; int save_errno; if (wfilename == NULL) { errno = EINVAL; return NULL; } wmode = g_utf8_to_utf16 (mode, -1, NULL, NULL, NULL); if (wmode == NULL) { g_free (wfilename); errno = EINVAL; return NULL; } retval = _wfreopen (wfilename, wmode, stream); save_errno = errno; g_free (wfilename); g_free (wmode); errno = save_errno; return retval; #else return freopen (filename, mode, stream); #endif } /** * g_utime: * @filename: a pathname in the GLib file name encoding (UTF-8 on Windows) * @utb: a pointer to a struct utimbuf. * * A wrapper for the POSIX utime() function. The utime() function * sets the access and modification timestamps of a file. * * See your C library manual for more details about how utime() works * on your system. * * Returns: 0 if the operation was successful, -1 if an error * occurred * * Since: 2.18 */ int g_utime (const gchar *filename, struct utimbuf *utb) { #ifdef G_OS_WIN32 wchar_t *wfilename = g_utf8_to_utf16 (filename, -1, NULL, NULL, NULL); int retval; int save_errno; if (wfilename == NULL) { errno = EINVAL; return -1; } retval = _wutime (wfilename, (struct _utimbuf*) utb); save_errno = errno; g_free (wfilename); errno = save_errno; return retval; #else 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; } pkg-config-0.29.1/glib/glib/libcharset/0000775000175000017500000000000012665370347014621 500000000000000pkg-config-0.29.1/glib/glib/libcharset/make-patch.sh0000775000175000017500000000137212275467762017122 00000000000000#!/bin/sh if test $# = 1 ; then ORIGINAL=$1 else echo "Usage: make-patch.sh /path/to/libcharset" 1>&2 exit 1 fi if test -f $ORIGINAL/lib/localcharset.c ; then : ; else echo "Usage: make-patch.sh /path/to/libcharset" 1>&2 exit 1 fi VERSION=`grep VERSION= $ORIGINAL/configure.ac | sed s/VERSION=//` echo "# Patch against libcharset version $VERSION" > libcharset-glib.patch for i in localcharset.c ref-add.sin ref-del.sin ; do diff -u $ORIGINAL/lib/$i $i >> libcharset-glib.patch done for i in glibc21.m4 codeset.m4 ; do diff -u $ORIGINAL/m4/$i $i >> libcharset-glib.patch done diff -u $ORIGINAL/include/libcharset.h.in libcharset.h >> libcharset-glib.patch diff -u $ORIGINAL/include/localcharset.h.in localcharset.h >> libcharset-glib.patch pkg-config-0.29.1/glib/glib/libcharset/libcharset.h0000664000175000017500000000301612275467762017037 00000000000000/* Copyright (C) 2003 Free Software Foundation, Inc. This file is part of the GNU CHARSET Library. The GNU CHARSET Library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. The GNU CHARSET Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with the GNU CHARSET Library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef _LIBCHARSET_H #define _LIBCHARSET_H #include "localcharset.h" #ifdef __cplusplus extern "C" { #endif /* Support for relocatable packages. */ /* Sets the original and the current installation prefix of the package. Relocation simply replaces a pathname starting with the original prefix by the corresponding pathname with the current prefix instead. Both prefixes should be directory names without trailing slash (i.e. use "" instead of "/"). */ extern void libcharset_set_relocation_prefix (const char *orig_prefix, const char *curr_prefix); #ifdef __cplusplus } #endif #endif /* _LIBCHARSET_H */ pkg-config-0.29.1/glib/glib/libcharset/update.sh0000775000175000017500000000120612275467762016366 00000000000000#!/bin/sh if test $# = 1 ; then ORIGINAL=$1 else echo "Usage: update.sh /path/to/libcharset" 1>&2 exit 1 fi if test -f $ORIGINAL/lib/localcharset.c ; then : ; else echo "Usage: update.sh /path/to/libcharset" 1>&2 exit 1 fi VERSION=`grep VERSION= $ORIGINAL/configure.ac | sed s/VERSION=//` for i in localcharset.c ref-add.sin ref-del.sin config.charset ; do cp $ORIGINAL/lib/$i . done for i in libcharset.h localcharset.h ; do cp $ORIGINAL/include/$i.in ./$i done for i in codeset.m4 glibc21.m4 ; do cp $ORIGINAL/m4/$i . done patch -p0 < libcharset-glib.patch echo "dnl From libcharset $VERSION" > ../../aclibcharset.m4 pkg-config-0.29.1/glib/glib/libcharset/glibc21.m40000664000175000017500000000144512275467762016237 00000000000000# glibc21.m4 serial 3 dnl Copyright (C) 2000-2002, 2004 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. # Test for the GNU C Library, version 2.1 or newer. # From Bruno Haible. AC_DEFUN([gl_GLIBC21], [ AC_CACHE_CHECK(whether we are using the GNU C Library 2.1 or newer, ac_cv_gnu_library_2_1, [AC_EGREP_CPP([Lucky GNU user], [ #include #ifdef __GNU_LIBRARY__ #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1) || (__GLIBC__ > 2) Lucky GNU user #endif #endif ], ac_cv_gnu_library_2_1=yes, ac_cv_gnu_library_2_1=no) ] ) AC_SUBST(GLIBC21) GLIBC21="$ac_cv_gnu_library_2_1" ] ) pkg-config-0.29.1/glib/glib/libcharset/localcharset.h0000664000175000017500000000277012275467762017371 00000000000000/* Determine a canonical name for the current locale's character encoding. Copyright (C) 2000-2003 Free Software Foundation, Inc. This file is part of the GNU CHARSET Library. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef _LOCALCHARSET_H #define _LOCALCHARSET_H #ifdef __cplusplus extern "C" { #endif /* Determine the current locale's character encoding, and canonicalize it into one of the canonical names listed in config.charset. The result must not be freed; it is statically allocated. If the canonical name cannot be determined, the result is a non-canonical name. */ extern const char * _g_locale_charset_raw (void); extern const char * _g_locale_charset_unalias (const char *codeset); extern const char * _g_locale_get_charset_aliases (void); #ifdef __cplusplus } #endif #endif /* _LOCALCHARSET_H */ pkg-config-0.29.1/glib/glib/libcharset/codeset.m40000664000175000017500000000135112275467762016436 00000000000000# codeset.m4 serial AM1 (gettext-0.10.40) dnl Copyright (C) 2000-2002 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. AC_DEFUN([AM_LANGINFO_CODESET], [ AC_CACHE_CHECK([for nl_langinfo and CODESET], am_cv_langinfo_codeset, [AC_TRY_LINK([#include ], [char* cs = nl_langinfo(CODESET);], am_cv_langinfo_codeset=yes, am_cv_langinfo_codeset=no) ]) if test $am_cv_langinfo_codeset = yes; then AC_DEFINE(HAVE_LANGINFO_CODESET, 1, [Define if you have and nl_langinfo(CODESET).]) fi ]) pkg-config-0.29.1/glib/glib/libcharset/localcharset.c0000664000175000017500000003043112275467762017357 00000000000000/* Determine a canonical name for the current locale's character encoding. Copyright (C) 2000-2006 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* Written by Bruno Haible . */ #include "config.h" /* Specification. */ #include "localcharset.h" #include #include #include #include #if defined _WIN32 || defined __WIN32__ # define WIN32_NATIVE #endif #if defined __EMX__ /* Assume EMX program runs on OS/2, even if compiled under DOS. */ # define OS2 #endif #if !defined WIN32_NATIVE # if HAVE_LANGINFO_CODESET # include # else # if 0 /* see comment below */ # include # endif # endif # ifdef __CYGWIN__ # define WIN32_LEAN_AND_MEAN # include # endif #elif defined WIN32_NATIVE # define WIN32_LEAN_AND_MEAN # include #endif #if defined OS2 # define INCL_DOS # include #endif #if ENABLE_RELOCATABLE # include "relocatable.h" #else # define relocate(pathname) (pathname) #endif /* Get LIBDIR. */ #ifndef LIBDIR # include "configmake.h" #endif #if defined _WIN32 || defined __WIN32__ || defined __CYGWIN__ || defined __EMX__ || defined __DJGPP__ /* Win32, Cygwin, OS/2, DOS */ # define ISSLASH(C) ((C) == '/' || (C) == '\\') #endif #ifndef DIRECTORY_SEPARATOR # define DIRECTORY_SEPARATOR '/' #endif #ifndef ISSLASH # define ISSLASH(C) ((C) == DIRECTORY_SEPARATOR) #endif #if HAVE_DECL_GETC_UNLOCKED # undef getc # define getc getc_unlocked #endif /* The following static variable is declared 'volatile' to avoid a possible multithread problem in the function get_charset_aliases. If we are running in a threaded environment, and if two threads initialize 'charset_aliases' simultaneously, both will produce the same value, and everything will be ok if the two assignments to 'charset_aliases' are atomic. But I don't know what will happen if the two assignments mix. */ #if __STDC__ != 1 # define volatile /* empty */ #endif /* Pointer to the contents of the charset.alias file, if it has already been read, else NULL. Its format is: ALIAS_1 '\0' CANONICAL_1 '\0' ... ALIAS_n '\0' CANONICAL_n '\0' '\0' */ static const char * volatile charset_aliases; /* Return a pointer to the contents of the charset.alias file. */ const char * _g_locale_get_charset_aliases (void) { const char *cp; cp = charset_aliases; if (cp == NULL) { #if !(defined VMS || defined WIN32_NATIVE || defined __CYGWIN__) FILE *fp; const char *dir; const char *base = "charset.alias"; char *file_name; /* Make it possible to override the charset.alias location. This is necessary for running the testsuite before "make install". */ dir = getenv ("CHARSETALIASDIR"); if (dir == NULL || dir[0] == '\0') dir = relocate (LIBDIR); /* Concatenate dir and base into freshly allocated file_name. */ { size_t dir_len = strlen (dir); size_t base_len = strlen (base); int add_slash = (dir_len > 0 && !ISSLASH (dir[dir_len - 1])); file_name = (char *) malloc (dir_len + add_slash + base_len + 1); if (file_name != NULL) { memcpy (file_name, dir, dir_len); if (add_slash) file_name[dir_len] = DIRECTORY_SEPARATOR; memcpy (file_name + dir_len + add_slash, base, base_len + 1); } } if (file_name == NULL || (fp = fopen (file_name, "r")) == NULL) /* Out of memory or file not found, treat it as empty. */ cp = ""; else { /* Parse the file's contents. */ char *res_ptr = NULL; size_t res_size = 0; for (;;) { int c; char buf1[50+1]; char buf2[50+1]; size_t l1, l2; char *old_res_ptr; c = getc (fp); if (c == EOF) break; if (c == '\n' || c == ' ' || c == '\t') continue; if (c == '#') { /* Skip comment, to end of line. */ do c = getc (fp); while (!(c == EOF || c == '\n')); if (c == EOF) break; continue; } ungetc (c, fp); if (fscanf (fp, "%50s %50s", buf1, buf2) < 2) break; l1 = strlen (buf1); l2 = strlen (buf2); old_res_ptr = res_ptr; if (res_size == 0) { res_size = l1 + 1 + l2 + 1; res_ptr = (char *) malloc (res_size + 1); } else { res_size += l1 + 1 + l2 + 1; res_ptr = (char *) realloc (res_ptr, res_size + 1); } if (res_ptr == NULL) { /* Out of memory. */ res_size = 0; if (old_res_ptr != NULL) free (old_res_ptr); break; } strcpy (res_ptr + res_size - (l2 + 1) - (l1 + 1), buf1); strcpy (res_ptr + res_size - (l2 + 1), buf2); } fclose (fp); if (res_size == 0) cp = ""; else { *(res_ptr + res_size) = '\0'; cp = res_ptr; } } if (file_name != NULL) free (file_name); #else # if defined VMS /* To avoid the troubles of an extra file charset.alias_vms in the sources of many GNU packages, simply inline the aliases here. */ /* The list of encodings is taken from the OpenVMS 7.3-1 documentation "Compaq C Run-Time Library Reference Manual for OpenVMS systems" section 10.7 "Handling Different Character Sets". */ cp = "ISO8859-1" "\0" "ISO-8859-1" "\0" "ISO8859-2" "\0" "ISO-8859-2" "\0" "ISO8859-5" "\0" "ISO-8859-5" "\0" "ISO8859-7" "\0" "ISO-8859-7" "\0" "ISO8859-8" "\0" "ISO-8859-8" "\0" "ISO8859-9" "\0" "ISO-8859-9" "\0" /* Japanese */ "eucJP" "\0" "EUC-JP" "\0" "SJIS" "\0" "SHIFT_JIS" "\0" "DECKANJI" "\0" "DEC-KANJI" "\0" "SDECKANJI" "\0" "EUC-JP" "\0" /* Chinese */ "eucTW" "\0" "EUC-TW" "\0" "DECHANYU" "\0" "DEC-HANYU" "\0" "DECHANZI" "\0" "GB2312" "\0" /* Korean */ "DECKOREAN" "\0" "EUC-KR" "\0"; # endif # if defined WIN32_NATIVE || defined __CYGWIN__ /* To avoid the troubles of installing a separate file in the same directory as the DLL and of retrieving the DLL's directory at runtime, simply inline the aliases here. */ cp = "CP936" "\0" "GBK" "\0" "CP1361" "\0" "JOHAB" "\0" "CP20127" "\0" "ASCII" "\0" "CP20866" "\0" "KOI8-R" "\0" "CP20936" "\0" "GB2312" "\0" "CP21866" "\0" "KOI8-RU" "\0" "CP28591" "\0" "ISO-8859-1" "\0" "CP28592" "\0" "ISO-8859-2" "\0" "CP28593" "\0" "ISO-8859-3" "\0" "CP28594" "\0" "ISO-8859-4" "\0" "CP28595" "\0" "ISO-8859-5" "\0" "CP28596" "\0" "ISO-8859-6" "\0" "CP28597" "\0" "ISO-8859-7" "\0" "CP28598" "\0" "ISO-8859-8" "\0" "CP28599" "\0" "ISO-8859-9" "\0" "CP28605" "\0" "ISO-8859-15" "\0" "CP38598" "\0" "ISO-8859-8" "\0" "CP51932" "\0" "EUC-JP" "\0" "CP51936" "\0" "GB2312" "\0" "CP51949" "\0" "EUC-KR" "\0" "CP51950" "\0" "EUC-TW" "\0" "CP54936" "\0" "GB18030" "\0" "CP65001" "\0" "UTF-8" "\0"; # endif #endif charset_aliases = cp; } return cp; } /* Determine the current locale's character encoding, and canonicalize it into one of the canonical names listed in config.charset. The result must not be freed; it is statically allocated. If the canonical name cannot be determined, the result is a non-canonical name. */ const char * _g_locale_charset_raw (void) { const char *codeset; #if !(defined WIN32_NATIVE || defined OS2) # if HAVE_LANGINFO_CODESET /* Most systems support nl_langinfo (CODESET) nowadays. */ codeset = nl_langinfo (CODESET); # ifdef __CYGWIN__ /* Cygwin 2006 does not have locales. nl_langinfo (CODESET) always returns "US-ASCII". As long as this is not fixed, return the suffix of the locale name from the environment variables (if present) or the codepage as a number. */ if (codeset != NULL && strcmp (codeset, "US-ASCII") == 0) { const char *locale; static char buf[2 + 10 + 1]; locale = getenv ("LC_ALL"); if (locale == NULL || locale[0] == '\0') { locale = getenv ("LC_CTYPE"); if (locale == NULL || locale[0] == '\0') locale = getenv ("LANG"); } if (locale != NULL && locale[0] != '\0') { /* If the locale name contains an encoding after the dot, return it. */ const char *dot = strchr (locale, '.'); if (dot != NULL) { const char *modifier; dot++; /* Look for the possible @... trailer and remove it, if any. */ modifier = strchr (dot, '@'); if (modifier == NULL) return dot; if (modifier - dot < sizeof (buf)) { memcpy (buf, dot, modifier - dot); buf [modifier - dot] = '\0'; return buf; } } } /* Woe32 has a function returning the locale's codepage as a number. */ sprintf (buf, "CP%u", GetACP ()); codeset = buf; } # endif # else /* On old systems which lack it, use setlocale or getenv. */ const char *locale = NULL; /* But most old systems don't have a complete set of locales. Some (like SunOS 4 or DJGPP) have only the C locale. Therefore we don't use setlocale here; it would return "C" when it doesn't support the locale name the user has set. */ # if 0 locale = setlocale (LC_CTYPE, NULL); # endif if (locale == NULL || locale[0] == '\0') { locale = getenv ("LC_ALL"); if (locale == NULL || locale[0] == '\0') { locale = getenv ("LC_CTYPE"); if (locale == NULL || locale[0] == '\0') locale = getenv ("LANG"); } } /* On some old systems, one used to set locale = "iso8859_1". On others, you set it to "language_COUNTRY.charset". In any case, we resolve it through the charset.alias file. */ codeset = locale; # endif #elif defined WIN32_NATIVE static char buf[2 + 10 + 1]; /* Woe32 has a function returning the locale's codepage as a number. */ sprintf (buf, "CP%u", GetACP ()); codeset = buf; #elif defined OS2 const char *locale; static char buf[2 + 10 + 1]; ULONG cp[3]; ULONG cplen; /* Allow user to override the codeset, as set in the operating system, with standard language environment variables. */ locale = getenv ("LC_ALL"); if (locale == NULL || locale[0] == '\0') { locale = getenv ("LC_CTYPE"); if (locale == NULL || locale[0] == '\0') locale = getenv ("LANG"); } if (locale != NULL && locale[0] != '\0') { /* If the locale name contains an encoding after the dot, return it. */ const char *dot = strchr (locale, '.'); if (dot != NULL) { const char *modifier; dot++; /* Look for the possible @... trailer and remove it, if any. */ modifier = strchr (dot, '@'); if (modifier == NULL) return dot; if (modifier - dot < sizeof (buf)) { memcpy (buf, dot, modifier - dot); buf [modifier - dot] = '\0'; return buf; } } /* Resolve through the charset.alias file. */ codeset = locale; } else { /* OS/2 has a function returning the locale's codepage as a number. */ if (DosQueryCp (sizeof (cp), cp, &cplen)) codeset = ""; else { sprintf (buf, "CP%u", cp[0]); codeset = buf; } } #endif return codeset; } const char * _g_locale_charset_unalias (const char *codeset) { const char *aliases; if (codeset == NULL) /* The canonical name cannot be determined. */ codeset = ""; /* Resolve alias. */ for (aliases = _g_locale_get_charset_aliases (); *aliases != '\0'; aliases += strlen (aliases) + 1, aliases += strlen (aliases) + 1) if (strcmp (codeset, aliases) == 0 || (aliases[0] == '*' && aliases[1] == '\0')) { codeset = aliases + strlen (aliases) + 1; break; } /* Don't return an empty string. GNU libc and GNU libiconv interpret the empty string as denoting "the locale's character encoding", thus GNU libiconv would call this function a second time. */ if (codeset[0] == '\0') codeset = "ASCII"; return codeset; } pkg-config-0.29.1/glib/glib/libcharset/libcharset-glib.patch0000664000175000017500000000410512275467762020622 00000000000000# Patch against libcharset version 1.4 --- libiconv-1.12/libcharset//lib/localcharset.c 2006-10-18 07:55:49.000000000 -0400 +++ localcharset.c 2008-05-20 18:36:24.000000000 -0400 @@ -103,8 +103,8 @@ static const char * volatile charset_aliases; /* Return a pointer to the contents of the charset.alias file. */ -static const char * -get_charset_aliases (void) +const char * +_g_locale_get_charset_aliases (void) { const char *cp; @@ -280,14 +280,10 @@ If the canonical name cannot be determined, the result is a non-canonical name. */ -#ifdef STATIC -STATIC -#endif const char * -locale_charset (void) +_g_locale_charset_raw (void) { const char *codeset; - const char *aliases; #if !(defined WIN32_NATIVE || defined OS2) @@ -436,12 +432,20 @@ #endif + return codeset; +} + +const char * +_g_locale_charset_unalias (const char *codeset) +{ + const char *aliases; + if (codeset == NULL) /* The canonical name cannot be determined. */ codeset = ""; /* Resolve alias. */ - for (aliases = get_charset_aliases (); + for (aliases = _g_locale_get_charset_aliases (); *aliases != '\0'; aliases += strlen (aliases) + 1, aliases += strlen (aliases) + 1) if (strcmp (codeset, aliases) == 0 --- libiconv-1.12/libcharset//include/libcharset.h.in 2005-05-19 13:14:56.000000000 -0400 +++ libcharset.h 2008-05-20 18:39:44.000000000 -0400 @@ -19,7 +19,7 @@ #ifndef _LIBCHARSET_H #define _LIBCHARSET_H -#include +#include "localcharset.h" #ifdef __cplusplus --- libiconv-1.12/libcharset//include/localcharset.h.in 2005-05-19 13:14:57.000000000 -0400 +++ localcharset.h 2008-05-20 18:36:24.000000000 -0400 @@ -31,8 +31,9 @@ The result must not be freed; it is statically allocated. If the canonical name cannot be determined, the result is a non-canonical name. */ -extern const char * locale_charset (void); - +extern const char * _g_locale_charset_raw (void); +extern const char * _g_locale_charset_unalias (const char *codeset); +extern const char * _g_locale_get_charset_aliases (void); #ifdef __cplusplus } pkg-config-0.29.1/glib/glib/libcharset/ref-del.sin0000664000175000017500000000202212275467762016573 00000000000000# Remove this package from a list of references stored in a text file. # # Copyright (C) 2000 Free Software Foundation, Inc. # # This program is free software; you can redistribute it and/or modify it # under the terms of the GNU Library General Public License as published # by the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Library General Public License for more details. # # You should have received a copy of the GNU Library General Public # License along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, # USA. # # Written by Bruno Haible . # /^# Packages using this file: / { s/# Packages using this file:// s/ @PACKAGE@ / / s/^/# Packages using this file:/ } pkg-config-0.29.1/glib/glib/libcharset/Makefile.am0000664000175000017500000000164112651243552016567 00000000000000## Process this file with automake to produce Makefile.in include $(top_srcdir)/glib.mk AM_CPPFLAGS = \ -DLIBDIR=\"$(libdir)\" \ $(config_h_INCLUDES) noinst_LTLIBRARIES += libcharset.la libcharset_la_CFLAGS = $(GLIB_HIDDEN_VISIBILITY_CFLAGS) libcharset_la_SOURCES = \ libcharset.h \ localcharset.h \ localcharset.c EXTRA_DIST += \ README \ config.charset \ ref-add.sin \ ref-del.sin \ glibc21.m4 \ codeset.m4 \ update.sh \ make-patch.sh \ libcharset-glib.patch charset_alias = $(DESTDIR)$(libdir)/charset.alias charset_tmp = $(DESTDIR)$(libdir)/charset.tmp charset.alias: config.charset $(AM_V_GEN) $(SHELL) $(srcdir)/config.charset '@host@' > t-$@ @mv t-$@ $@ all-local: ref-add.sed ref-del.sed charset.alias SUFFIXES = .sed .sin .sin.sed: $(AM_V_GEN) $(SED) -e '/^#/d' -e 's/@''PACKAGE''@/@PACKAGE@/g' $< > t-$@ @mv t-$@ $@ CLEANFILES += charset.alias ref-add.sed ref-del.sed pkg-config-0.29.1/glib/glib/libcharset/ref-add.sin0000664000175000017500000000207712275467762016571 00000000000000# Add this package to a list of references stored in a text file. # # Copyright (C) 2000 Free Software Foundation, Inc. # # This program is free software; you can redistribute it and/or modify it # under the terms of the GNU Library General Public License as published # by the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Library General Public License for more details. # # You should have received a copy of the GNU Library General Public # License along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, # USA. # # Written by Bruno Haible . # /^# Packages using this file: / { s/# Packages using this file:// ta :a s/ @PACKAGE@ / @PACKAGE@ / tb s/ $/ @PACKAGE@ / :b s/^/# Packages using this file:/ } pkg-config-0.29.1/glib/glib/libcharset/config.charset0000775000175000017500000005062212651243552017361 00000000000000#! /bin/sh # Output a system dependent table of character encoding aliases. # # Copyright (C) 2000-2004, 2006 Free Software Foundation, Inc. # # This program is free software; you can redistribute it and/or modify it # under the terms of the GNU Library General Public License as published # by the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Library General Public License for more details. # # You should have received a copy of the GNU Library General Public # License along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, # USA. # # The table consists of lines of the form # ALIAS CANONICAL # # ALIAS is the (system dependent) result of "nl_langinfo (CODESET)". # ALIAS is compared in a case sensitive way. # # CANONICAL is the GNU canonical name for this character encoding. # It must be an encoding supported by libiconv. Support by GNU libc is # also desirable. CANONICAL is case insensitive. Usually an upper case # MIME charset name is preferred. # The current list of GNU canonical charset names is as follows. # # name MIME? used by which systems # ASCII, ANSI_X3.4-1968 glibc solaris freebsd netbsd darwin # ISO-8859-1 Y glibc aix hpux irix osf solaris freebsd netbsd darwin # ISO-8859-2 Y glibc aix hpux irix osf solaris freebsd netbsd darwin # ISO-8859-3 Y glibc solaris # ISO-8859-4 Y osf solaris freebsd netbsd darwin # ISO-8859-5 Y glibc aix hpux irix osf solaris freebsd netbsd darwin # ISO-8859-6 Y glibc aix hpux solaris # ISO-8859-7 Y glibc aix hpux irix osf solaris netbsd darwin # ISO-8859-8 Y glibc aix hpux osf solaris # ISO-8859-9 Y glibc aix hpux irix osf solaris darwin # ISO-8859-13 glibc netbsd darwin # ISO-8859-14 glibc # ISO-8859-15 glibc aix osf solaris freebsd darwin # KOI8-R Y glibc solaris freebsd netbsd darwin # KOI8-U Y glibc freebsd netbsd darwin # KOI8-T glibc # CP437 dos # CP775 dos # CP850 aix osf dos # CP852 dos # CP855 dos # CP856 aix # CP857 dos # CP861 dos # CP862 dos # CP864 dos # CP865 dos # CP866 freebsd netbsd darwin dos # CP869 dos # CP874 woe32 dos # CP922 aix # CP932 aix woe32 dos # CP943 aix # CP949 osf woe32 dos # CP950 woe32 dos # CP1046 aix # CP1124 aix # CP1125 dos # CP1129 aix # CP1250 woe32 # CP1251 glibc solaris netbsd darwin woe32 # CP1252 aix woe32 # CP1253 woe32 # CP1254 woe32 # CP1255 glibc woe32 # CP1256 woe32 # CP1257 woe32 # GB2312 Y glibc aix hpux irix solaris freebsd netbsd darwin # EUC-JP Y glibc aix hpux irix osf solaris freebsd netbsd darwin # EUC-KR Y glibc aix hpux irix osf solaris freebsd netbsd darwin # EUC-TW glibc aix hpux irix osf solaris netbsd # BIG5 Y glibc aix hpux osf solaris freebsd netbsd darwin # BIG5-HKSCS glibc solaris # GBK glibc aix osf solaris woe32 dos # GB18030 glibc solaris netbsd # SHIFT_JIS Y hpux osf solaris freebsd netbsd darwin # JOHAB glibc solaris woe32 # TIS-620 glibc aix hpux osf solaris # VISCII Y glibc # TCVN5712-1 glibc # GEORGIAN-PS glibc # HP-ROMAN8 hpux # HP-ARABIC8 hpux # HP-GREEK8 hpux # HP-HEBREW8 hpux # HP-TURKISH8 hpux # HP-KANA8 hpux # DEC-KANJI osf # DEC-HANYU osf # UTF-8 Y glibc aix hpux osf solaris netbsd darwin # # Note: Names which are not marked as being a MIME name should not be used in # Internet protocols for information interchange (mail, news, etc.). # # Note: ASCII and ANSI_X3.4-1968 are synonymous canonical names. Applications # must understand both names and treat them as equivalent. # # The first argument passed to this file is the canonical host specification, # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM host="$1" os=`echo "$host" | sed -e 's/^[^-]*-[^-]*-\(.*\)$/\1/'` echo "# This file contains a table of character encoding aliases," echo "# suitable for operating system '${os}'." echo "# It was automatically generated from config.charset." # List of references, updated during installation: echo "# Packages using this file: " case "$os" in linux-gnulibc1*) # Linux libc5 doesn't have nl_langinfo(CODESET); therefore # localcharset.c falls back to using the full locale name # from the environment variables. echo "C ASCII" echo "POSIX ASCII" for l in af af_ZA ca ca_ES da da_DK de de_AT de_BE de_CH de_DE de_LU \ en en_AU en_BW en_CA en_DK en_GB en_IE en_NZ en_US en_ZA \ en_ZW es es_AR es_BO es_CL es_CO es_DO es_EC es_ES es_GT \ es_HN es_MX es_PA es_PE es_PY es_SV es_US es_UY es_VE et \ et_EE eu eu_ES fi fi_FI fo fo_FO fr fr_BE fr_CA fr_CH fr_FR \ fr_LU ga ga_IE gl gl_ES id id_ID in in_ID is is_IS it it_CH \ it_IT kl kl_GL nl nl_BE nl_NL no no_NO pt pt_BR pt_PT sv \ sv_FI sv_SE; do echo "$l ISO-8859-1" echo "$l.iso-8859-1 ISO-8859-1" echo "$l.iso-8859-15 ISO-8859-15" echo "$l.iso-8859-15@euro ISO-8859-15" echo "$l@euro ISO-8859-15" echo "$l.cp-437 CP437" echo "$l.cp-850 CP850" echo "$l.cp-1252 CP1252" echo "$l.cp-1252@euro CP1252" #echo "$l.atari-st ATARI-ST" # not a commonly used encoding echo "$l.utf-8 UTF-8" echo "$l.utf-8@euro UTF-8" done for l in cs cs_CZ hr hr_HR hu hu_HU pl pl_PL ro ro_RO sk sk_SK sl \ sl_SI sr sr_CS sr_YU; do echo "$l ISO-8859-2" echo "$l.iso-8859-2 ISO-8859-2" echo "$l.cp-852 CP852" echo "$l.cp-1250 CP1250" echo "$l.utf-8 UTF-8" done for l in mk mk_MK ru ru_RU; do echo "$l ISO-8859-5" echo "$l.iso-8859-5 ISO-8859-5" echo "$l.koi8-r KOI8-R" echo "$l.cp-866 CP866" echo "$l.cp-1251 CP1251" echo "$l.utf-8 UTF-8" done for l in ar ar_SA; do echo "$l ISO-8859-6" echo "$l.iso-8859-6 ISO-8859-6" echo "$l.cp-864 CP864" #echo "$l.cp-868 CP868" # not a commonly used encoding echo "$l.cp-1256 CP1256" echo "$l.utf-8 UTF-8" done for l in el el_GR gr gr_GR; do echo "$l ISO-8859-7" echo "$l.iso-8859-7 ISO-8859-7" echo "$l.cp-869 CP869" echo "$l.cp-1253 CP1253" echo "$l.cp-1253@euro CP1253" echo "$l.utf-8 UTF-8" echo "$l.utf-8@euro UTF-8" done for l in he he_IL iw iw_IL; do echo "$l ISO-8859-8" echo "$l.iso-8859-8 ISO-8859-8" echo "$l.cp-862 CP862" echo "$l.cp-1255 CP1255" echo "$l.utf-8 UTF-8" done for l in tr tr_TR; do echo "$l ISO-8859-9" echo "$l.iso-8859-9 ISO-8859-9" echo "$l.cp-857 CP857" echo "$l.cp-1254 CP1254" echo "$l.utf-8 UTF-8" done for l in lt lt_LT lv lv_LV; do #echo "$l BALTIC" # not a commonly used encoding, wrong encoding name echo "$l ISO-8859-13" done for l in ru_UA uk uk_UA; do echo "$l KOI8-U" done for l in zh zh_CN; do #echo "$l GB_2312-80" # not a commonly used encoding, wrong encoding name echo "$l GB2312" done for l in ja ja_JP ja_JP.EUC; do echo "$l EUC-JP" done for l in ko ko_KR; do echo "$l EUC-KR" done for l in th th_TH; do echo "$l TIS-620" done for l in fa fa_IR; do #echo "$l ISIRI-3342" # a broken encoding echo "$l.utf-8 UTF-8" done ;; linux* | *-gnu*) # With glibc-2.1 or newer, we don't need any canonicalization, # because glibc has iconv and both glibc and libiconv support all # GNU canonical names directly. Therefore, the Makefile does not # need to install the alias file at all. # The following applies only to glibc-2.0.x and older libcs. echo "ISO_646.IRV:1983 ASCII" ;; aix*) echo "ISO8859-1 ISO-8859-1" echo "ISO8859-2 ISO-8859-2" echo "ISO8859-5 ISO-8859-5" echo "ISO8859-6 ISO-8859-6" echo "ISO8859-7 ISO-8859-7" echo "ISO8859-8 ISO-8859-8" echo "ISO8859-9 ISO-8859-9" echo "ISO8859-15 ISO-8859-15" echo "IBM-850 CP850" echo "IBM-856 CP856" echo "IBM-921 ISO-8859-13" echo "IBM-922 CP922" echo "IBM-932 CP932" echo "IBM-943 CP943" echo "IBM-1046 CP1046" echo "IBM-1124 CP1124" echo "IBM-1129 CP1129" echo "IBM-1252 CP1252" echo "IBM-eucCN GB2312" echo "IBM-eucJP EUC-JP" echo "IBM-eucKR EUC-KR" echo "IBM-eucTW EUC-TW" echo "big5 BIG5" echo "GBK GBK" echo "TIS-620 TIS-620" echo "UTF-8 UTF-8" ;; hpux*) echo "iso88591 ISO-8859-1" echo "iso88592 ISO-8859-2" echo "iso88595 ISO-8859-5" echo "iso88596 ISO-8859-6" echo "iso88597 ISO-8859-7" echo "iso88598 ISO-8859-8" echo "iso88599 ISO-8859-9" echo "iso885915 ISO-8859-15" echo "roman8 HP-ROMAN8" echo "arabic8 HP-ARABIC8" echo "greek8 HP-GREEK8" echo "hebrew8 HP-HEBREW8" echo "turkish8 HP-TURKISH8" echo "kana8 HP-KANA8" echo "tis620 TIS-620" echo "big5 BIG5" echo "eucJP EUC-JP" echo "eucKR EUC-KR" echo "eucTW EUC-TW" echo "hp15CN GB2312" #echo "ccdc ?" # what is this? echo "SJIS SHIFT_JIS" echo "utf8 UTF-8" ;; irix*) echo "ISO8859-1 ISO-8859-1" echo "ISO8859-2 ISO-8859-2" echo "ISO8859-5 ISO-8859-5" echo "ISO8859-7 ISO-8859-7" echo "ISO8859-9 ISO-8859-9" echo "eucCN GB2312" echo "eucJP EUC-JP" echo "eucKR EUC-KR" echo "eucTW EUC-TW" ;; osf*) echo "ISO8859-1 ISO-8859-1" echo "ISO8859-2 ISO-8859-2" echo "ISO8859-4 ISO-8859-4" echo "ISO8859-5 ISO-8859-5" echo "ISO8859-7 ISO-8859-7" echo "ISO8859-8 ISO-8859-8" echo "ISO8859-9 ISO-8859-9" echo "ISO8859-15 ISO-8859-15" echo "cp850 CP850" echo "big5 BIG5" echo "dechanyu DEC-HANYU" echo "dechanzi GB2312" echo "deckanji DEC-KANJI" echo "deckorean EUC-KR" echo "eucJP EUC-JP" echo "eucKR EUC-KR" echo "eucTW EUC-TW" echo "GBK GBK" echo "KSC5601 CP949" echo "sdeckanji EUC-JP" echo "SJIS SHIFT_JIS" echo "TACTIS TIS-620" echo "UTF-8 UTF-8" ;; solaris*) echo "646 ASCII" echo "ISO8859-1 ISO-8859-1" echo "ISO8859-2 ISO-8859-2" echo "ISO8859-3 ISO-8859-3" echo "ISO8859-4 ISO-8859-4" echo "ISO8859-5 ISO-8859-5" echo "ISO8859-6 ISO-8859-6" echo "ISO8859-7 ISO-8859-7" echo "ISO8859-8 ISO-8859-8" echo "ISO8859-9 ISO-8859-9" echo "ISO8859-15 ISO-8859-15" echo "koi8-r KOI8-R" echo "ansi-1251 CP1251" echo "BIG5 BIG5" echo "Big5-HKSCS BIG5-HKSCS" echo "gb2312 GB2312" echo "GBK GBK" echo "GB18030 GB18030" echo "cns11643 EUC-TW" echo "5601 EUC-KR" echo "ko_KR.johap92 JOHAB" echo "eucJP EUC-JP" echo "PCK SHIFT_JIS" echo "TIS620.2533 TIS-620" #echo "sun_eu_greek ?" # what is this? echo "UTF-8 UTF-8" ;; freebsd* | os2*) # FreeBSD 4.2 doesn't have nl_langinfo(CODESET); therefore # localcharset.c falls back to using the full locale name # from the environment variables. # Likewise for OS/2. OS/2 has XFree86 just like FreeBSD. Just # reuse FreeBSD's locale data for OS/2. echo "C ASCII" echo "US-ASCII ASCII" for l in la_LN lt_LN; do echo "$l.ASCII ASCII" done for l in da_DK de_AT de_CH de_DE en_AU en_CA en_GB en_US es_ES \ fi_FI fr_BE fr_CA fr_CH fr_FR is_IS it_CH it_IT la_LN \ lt_LN nl_BE nl_NL no_NO pt_PT sv_SE; do echo "$l.ISO_8859-1 ISO-8859-1" echo "$l.DIS_8859-15 ISO-8859-15" done for l in cs_CZ hr_HR hu_HU la_LN lt_LN pl_PL sl_SI; do echo "$l.ISO_8859-2 ISO-8859-2" done for l in la_LN lt_LT; do echo "$l.ISO_8859-4 ISO-8859-4" done for l in ru_RU ru_SU; do echo "$l.KOI8-R KOI8-R" echo "$l.ISO_8859-5 ISO-8859-5" echo "$l.CP866 CP866" done echo "uk_UA.KOI8-U KOI8-U" echo "zh_TW.BIG5 BIG5" echo "zh_TW.Big5 BIG5" echo "zh_CN.EUC GB2312" echo "ja_JP.EUC EUC-JP" echo "ja_JP.SJIS SHIFT_JIS" echo "ja_JP.Shift_JIS SHIFT_JIS" echo "ko_KR.EUC EUC-KR" ;; netbsd*) echo "646 ASCII" echo "ISO8859-1 ISO-8859-1" echo "ISO8859-2 ISO-8859-2" echo "ISO8859-4 ISO-8859-4" echo "ISO8859-5 ISO-8859-5" echo "ISO8859-7 ISO-8859-7" echo "ISO8859-13 ISO-8859-13" echo "ISO8859-15 ISO-8859-15" echo "eucCN GB2312" echo "eucJP EUC-JP" echo "eucKR EUC-KR" echo "eucTW EUC-TW" echo "BIG5 BIG5" echo "SJIS SHIFT_JIS" ;; darwin[56]*) # Darwin 6.8 doesn't have nl_langinfo(CODESET); therefore # localcharset.c falls back to using the full locale name # from the environment variables. echo "C ASCII" for l in en_AU en_CA en_GB en_US la_LN; do echo "$l.US-ASCII ASCII" done for l in da_DK de_AT de_CH de_DE en_AU en_CA en_GB en_US es_ES \ fi_FI fr_BE fr_CA fr_CH fr_FR is_IS it_CH it_IT nl_BE \ nl_NL no_NO pt_PT sv_SE; do echo "$l ISO-8859-1" echo "$l.ISO8859-1 ISO-8859-1" echo "$l.ISO8859-15 ISO-8859-15" done for l in la_LN; do echo "$l.ISO8859-1 ISO-8859-1" echo "$l.ISO8859-15 ISO-8859-15" done for l in cs_CZ hr_HR hu_HU la_LN pl_PL sl_SI; do echo "$l.ISO8859-2 ISO-8859-2" done for l in la_LN lt_LT; do echo "$l.ISO8859-4 ISO-8859-4" done for l in ru_RU; do echo "$l.KOI8-R KOI8-R" echo "$l.ISO8859-5 ISO-8859-5" echo "$l.CP866 CP866" done for l in bg_BG; do echo "$l.CP1251 CP1251" done echo "uk_UA.KOI8-U KOI8-U" echo "zh_TW.BIG5 BIG5" echo "zh_TW.Big5 BIG5" echo "zh_CN.EUC GB2312" echo "ja_JP.EUC EUC-JP" echo "ja_JP.SJIS SHIFT_JIS" echo "ko_KR.EUC EUC-KR" ;; darwin*) # Darwin 7.5 has nl_langinfo(CODESET), but it is useless: # - It returns the empty string when LANG is set to a locale of the # form ll_CC, although ll_CC/LC_CTYPE is a symlink to an UTF-8 # LC_CTYPE file. # - The environment variables LANG, LC_CTYPE, LC_ALL are not set by # the system; nl_langinfo(CODESET) returns "US-ASCII" in this case. # - The documentation says: # "... all code that calls BSD system routines should ensure # that the const *char parameters of these routines are in UTF-8 # encoding. All BSD system functions expect their string # parameters to be in UTF-8 encoding and nothing else." # It also says # "An additional caveat is that string parameters for files, # paths, and other file-system entities must be in canonical # UTF-8. In a canonical UTF-8 Unicode string, all decomposable # characters are decomposed ..." # but this is not true: You can pass non-decomposed UTF-8 strings # to file system functions, and it is the OS which will convert # them to decomposed UTF-8 before accessing the file system. # - The Apple Terminal application displays UTF-8 by default. # - However, other applications are free to use different encodings: # - xterm uses ISO-8859-1 by default. # - TextEdit uses MacRoman by default. # We prefer UTF-8 over decomposed UTF-8-MAC because one should # 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*) # BeOS has a single locale, and it has UTF-8 encoding. echo "* UTF-8" ;; msdosdjgpp*) # DJGPP 2.03 doesn't have nl_langinfo(CODESET); therefore # localcharset.c falls back to using the full locale name # from the environment variables. echo "#" echo "# The encodings given here may not all be correct." echo "# If you find that the encoding given for your language and" echo "# country is not the one your DOS machine actually uses, just" echo "# correct it in this file, and send a mail to" echo "# Juan Manuel Guerrero " echo "# and Bruno Haible ." echo "#" echo "C ASCII" # ISO-8859-1 languages echo "ca CP850" echo "ca_ES CP850" echo "da CP865" # not CP850 ?? echo "da_DK CP865" # not CP850 ?? echo "de CP850" echo "de_AT CP850" echo "de_CH CP850" echo "de_DE CP850" echo "en CP850" echo "en_AU CP850" # not CP437 ?? echo "en_CA CP850" echo "en_GB CP850" echo "en_NZ CP437" echo "en_US CP437" echo "en_ZA CP850" # not CP437 ?? echo "es CP850" echo "es_AR CP850" echo "es_BO CP850" echo "es_CL CP850" echo "es_CO CP850" echo "es_CR CP850" echo "es_CU CP850" echo "es_DO CP850" echo "es_EC CP850" echo "es_ES CP850" echo "es_GT CP850" echo "es_HN CP850" echo "es_MX CP850" echo "es_NI CP850" echo "es_PA CP850" echo "es_PY CP850" echo "es_PE CP850" echo "es_SV CP850" echo "es_UY CP850" echo "es_VE CP850" echo "et CP850" echo "et_EE CP850" echo "eu CP850" echo "eu_ES CP850" echo "fi CP850" echo "fi_FI CP850" echo "fr CP850" echo "fr_BE CP850" echo "fr_CA CP850" echo "fr_CH CP850" echo "fr_FR CP850" echo "ga CP850" echo "ga_IE CP850" echo "gd CP850" echo "gd_GB CP850" echo "gl CP850" echo "gl_ES CP850" echo "id CP850" # not CP437 ?? echo "id_ID CP850" # not CP437 ?? echo "is CP861" # not CP850 ?? echo "is_IS CP861" # not CP850 ?? echo "it CP850" echo "it_CH CP850" echo "it_IT CP850" echo "lt CP775" echo "lt_LT CP775" echo "lv CP775" echo "lv_LV CP775" echo "nb CP865" # not CP850 ?? echo "nb_NO CP865" # not CP850 ?? echo "nl CP850" echo "nl_BE CP850" echo "nl_NL CP850" echo "nn CP865" # not CP850 ?? echo "nn_NO CP865" # not CP850 ?? echo "no CP865" # not CP850 ?? echo "no_NO CP865" # not CP850 ?? echo "pt CP850" echo "pt_BR CP850" echo "pt_PT CP850" echo "sv CP850" echo "sv_SE CP850" # ISO-8859-2 languages echo "cs CP852" echo "cs_CZ CP852" echo "hr CP852" echo "hr_HR CP852" echo "hu CP852" echo "hu_HU CP852" echo "pl CP852" echo "pl_PL CP852" echo "ro CP852" echo "ro_RO CP852" echo "sk CP852" echo "sk_SK CP852" echo "sl CP852" echo "sl_SI CP852" echo "sq CP852" echo "sq_AL CP852" echo "sr CP852" # CP852 or CP866 or CP855 ?? echo "sr_CS CP852" # CP852 or CP866 or CP855 ?? echo "sr_YU CP852" # CP852 or CP866 or CP855 ?? # ISO-8859-3 languages echo "mt CP850" echo "mt_MT CP850" # ISO-8859-5 languages echo "be CP866" echo "be_BE CP866" echo "bg CP866" # not CP855 ?? echo "bg_BG CP866" # not CP855 ?? echo "mk CP866" # not CP855 ?? echo "mk_MK CP866" # not CP855 ?? echo "ru CP866" echo "ru_RU CP866" echo "uk CP1125" echo "uk_UA CP1125" # ISO-8859-6 languages echo "ar CP864" echo "ar_AE CP864" echo "ar_DZ CP864" echo "ar_EG CP864" echo "ar_IQ CP864" echo "ar_IR CP864" echo "ar_JO CP864" echo "ar_KW CP864" echo "ar_MA CP864" echo "ar_OM CP864" echo "ar_QA CP864" echo "ar_SA CP864" echo "ar_SY CP864" # ISO-8859-7 languages echo "el CP869" echo "el_GR CP869" # ISO-8859-8 languages echo "he CP862" echo "he_IL CP862" # ISO-8859-9 languages echo "tr CP857" echo "tr_TR CP857" # Japanese echo "ja CP932" echo "ja_JP CP932" # Chinese echo "zh_CN GBK" echo "zh_TW CP950" # not CP938 ?? # Korean echo "kr CP949" # not CP934 ?? echo "kr_KR CP949" # not CP934 ?? # Thai echo "th CP874" echo "th_TH CP874" # Other echo "eo CP850" echo "eo_EO CP850" ;; esac pkg-config-0.29.1/glib/glib/libcharset/README0000664000175000017500000000302412275467762015425 00000000000000The sources are derived from Bruno Haible's libcharset library included with libiconv: http//www.gnu.org/software/libiconv The 'update.sh' script in this directory, when pointed at the original sources updates the files in this directory (and elsewhere in the GLib distribution) to the new version The 'make-patch.sh' script in this directory regenerates the patch files included in this directory from a copy of the pristine sources and the files in this directory. The license on the portions from libiconv portions is reproduced below. Owen Taylor 26 September 2001 Updated to libiconv-1.12. Behdad Esfahbod 20 May 2008 ==== /* Determine a canonical name for the current locale's character encoding. Copyright (C) 2000-2001 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* Written by Bruno Haible . */ pkg-config-0.29.1/glib/glib/libcharset/Makefile.in0000664000175000017500000016071412665370333016612 00000000000000# Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # GLIB - Library of useful C routines VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ installed_test_PROGRAMS = $(am__EXEEXT_1) noinst_PROGRAMS = $(am__EXEEXT_3) check_PROGRAMS = $(am__EXEEXT_2) TESTS = $(am__EXEEXT_1) @OS_WIN32_TRUE@am__append_1 = $(test_programs) $(test_scripts) $(uninstalled_test_programs) $(uninstalled_test_scripts) \ @OS_WIN32_TRUE@ $(dist_test_scripts) $(dist_uninstalled_test_scripts) @ENABLE_ALWAYS_BUILD_TESTS_TRUE@am__append_2 = $(all_test_ltlibs) @ENABLE_ALWAYS_BUILD_TESTS_TRUE@am__append_3 = $(all_test_programs) @ENABLE_ALWAYS_BUILD_TESTS_TRUE@am__append_4 = $(all_test_scripts) @ENABLE_ALWAYS_BUILD_TESTS_TRUE@am__append_5 = $(all_test_data) @ENABLE_ALWAYS_BUILD_TESTS_FALSE@am__append_6 = $(all_test_ltlibs) @ENABLE_ALWAYS_BUILD_TESTS_FALSE@am__append_7 = $(all_test_programs) @ENABLE_ALWAYS_BUILD_TESTS_FALSE@am__append_8 = $(all_test_scripts) @ENABLE_ALWAYS_BUILD_TESTS_FALSE@am__append_9 = $(all_test_data) @ENABLE_INSTALLED_TESTS_TRUE@am__append_10 = $(test_programs) $(installed_test_programs) \ @ENABLE_INSTALLED_TESTS_TRUE@ $(test_extra_programs) $(installed_test_extra_programs) @ENABLE_INSTALLED_TESTS_TRUE@am__append_11 = $(test_scripts) \ @ENABLE_INSTALLED_TESTS_TRUE@ $(installed_test_scripts) \ @ENABLE_INSTALLED_TESTS_TRUE@ $(test_extra_scripts) \ @ENABLE_INSTALLED_TESTS_TRUE@ $(test_installed_extra_scripts) \ @ENABLE_INSTALLED_TESTS_TRUE@ $(dist_test_scripts) \ @ENABLE_INSTALLED_TESTS_TRUE@ $(dist_test_extra_scripts) \ @ENABLE_INSTALLED_TESTS_TRUE@ $(dist_installed_test_scripts) \ @ENABLE_INSTALLED_TESTS_TRUE@ $(dist_installed_test_extra_scripts) @ENABLE_INSTALLED_TESTS_TRUE@am__append_12 = $(test_data) \ @ENABLE_INSTALLED_TESTS_TRUE@ $(installed_test_data) \ @ENABLE_INSTALLED_TESTS_TRUE@ $(dist_test_data) \ @ENABLE_INSTALLED_TESTS_TRUE@ $(dist_installed_test_data) @ENABLE_INSTALLED_TESTS_TRUE@am__append_13 = $(test_ltlibraries) $(installed_test_ltlibraries) @ENABLE_INSTALLED_TESTS_TRUE@am__append_14 = $(installed_test_meta_DATA) subdir = glib/libcharset ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4macros/attributes.m4 \ $(top_srcdir)/m4macros/glibtests.m4 \ $(top_srcdir)/m4macros/libtool.m4 \ $(top_srcdir)/m4macros/ltoptions.m4 \ $(top_srcdir)/m4macros/ltsugar.m4 \ $(top_srcdir)/m4macros/ltversion.m4 \ $(top_srcdir)/m4macros/lt~obsolete.m4 \ $(top_srcdir)/acinclude.m4 $(top_srcdir)/acglib.m4 \ $(top_srcdir)/glib/libcharset/codeset.m4 \ $(top_srcdir)/glib/libcharset/glibc21.m4 \ $(top_srcdir)/m4macros/glib-gettext.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(installed_testdir)" \ "$(DESTDIR)$(installed_testdir)" \ "$(DESTDIR)$(installed_testdir)" \ "$(DESTDIR)$(installed_test_metadir)" \ "$(DESTDIR)$(installed_testdir)" LTLIBRARIES = $(installed_test_LTLIBRARIES) $(noinst_LTLIBRARIES) libcharset_la_LIBADD = am_libcharset_la_OBJECTS = libcharset_la-localcharset.lo libcharset_la_OBJECTS = $(am_libcharset_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = libcharset_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(libcharset_la_CFLAGS) \ $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ am__EXEEXT_1 = @ENABLE_ALWAYS_BUILD_TESTS_FALSE@am__EXEEXT_2 = $(am__EXEEXT_1) @ENABLE_ALWAYS_BUILD_TESTS_TRUE@am__EXEEXT_3 = $(am__EXEEXT_1) PROGRAMS = $(installed_test_PROGRAMS) $(noinst_PROGRAMS) SCRIPTS = $(installed_test_SCRIPTS) $(noinst_SCRIPTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libcharset_la_SOURCES) DIST_SOURCES = $(libcharset_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(installed_test_meta_DATA) $(nobase_installed_test_DATA) \ $(noinst_DATA) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ $(top_srcdir)/glib.mk $(top_srcdir)/test-driver README DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ABS_GLIB_RUNTIME_LIBDIR = @ABS_GLIB_RUNTIME_LIBDIR@ ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO = @GIO@ GIO_MODULE_DIR = @GIO_MODULE_DIR@ GLIBC21 = @GLIBC21@ GLIB_BINARY_AGE = @GLIB_BINARY_AGE@ GLIB_DEBUG_FLAGS = @GLIB_DEBUG_FLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_HIDDEN_VISIBILITY_CFLAGS = @GLIB_HIDDEN_VISIBILITY_CFLAGS@ GLIB_INTERFACE_AGE = @GLIB_INTERFACE_AGE@ GLIB_LINK_FLAGS = @GLIB_LINK_FLAGS@ GLIB_MAJOR_VERSION = @GLIB_MAJOR_VERSION@ GLIB_MICRO_VERSION = @GLIB_MICRO_VERSION@ GLIB_MINOR_VERSION = @GLIB_MINOR_VERSION@ GLIB_RUNTIME_LIBDIR = @GLIB_RUNTIME_LIBDIR@ GLIB_VERSION = @GLIB_VERSION@ GLIB_WARN_CFLAGS = @GLIB_WARN_CFLAGS@ GLIB_WIN32_STATIC_COMPILATION_DEFINE = @GLIB_WIN32_STATIC_COMPILATION_DEFINE@ GREP = @GREP@ GSPAWN = @GSPAWN@ GTHREAD_COMPILE_IMPL_DEFINES = @GTHREAD_COMPILE_IMPL_DEFINES@ G_LIBS_EXTRA = @G_LIBS_EXTRA@ G_MODULE_BROKEN_RTLD_GLOBAL = @G_MODULE_BROKEN_RTLD_GLOBAL@ G_MODULE_HAVE_DLERROR = @G_MODULE_HAVE_DLERROR@ G_MODULE_IMPL = @G_MODULE_IMPL@ G_MODULE_LDFLAGS = @G_MODULE_LDFLAGS@ G_MODULE_LIBS = @G_MODULE_LIBS@ G_MODULE_LIBS_EXTRA = @G_MODULE_LIBS_EXTRA@ G_MODULE_NEED_USCORE = @G_MODULE_NEED_USCORE@ G_MODULE_PLUGIN_LIBS = @G_MODULE_PLUGIN_LIBS@ G_MODULE_SUPPORTED = @G_MODULE_SUPPORTED@ G_THREAD_CFLAGS = @G_THREAD_CFLAGS@ G_THREAD_LIBS = @G_THREAD_LIBS@ G_THREAD_LIBS_EXTRA = @G_THREAD_LIBS_EXTRA@ G_THREAD_LIBS_FOR_GTHREAD = @G_THREAD_LIBS_FOR_GTHREAD@ ICONV_LIBS = @ICONV_LIBS@ INDENT = @INDENT@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIB_EXE_MACHINE_FLAG = @LIB_EXE_MACHINE_FLAG@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LTP = @LTP@ LTP_GENHTML = @LTP_GENHTML@ LT_AGE = @LT_AGE@ LT_CURRENT = @LT_CURRENT@ LT_CURRENT_MINUS_AGE = @LT_CURRENT_MINUS_AGE@ LT_RELEASE = @LT_RELEASE@ LT_REVISION = @LT_REVISION@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NAMESER_COMPAT_INCLUDE = @NAMESER_COMPAT_INCLUDE@ NETWORK_LIBS = @NETWORK_LIBS@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PERL = @PERL@ PERL_PATH = @PERL_PATH@ PLATFORMDEP = @PLATFORMDEP@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ REBUILD = @REBUILD@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHTOOL = @SHTOOL@ STRIP = @STRIP@ VERSION = @VERSION@ WINDRES = @WINDRES@ WSPIAPI_INCLUDE = @WSPIAPI_INCLUDE@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ config_h_INCLUDES = @config_h_INCLUDES@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gio_INCLUDES = @gio_INCLUDES@ glib_INCLUDES = @glib_INCLUDES@ gmodule_INCLUDES = @gmodule_INCLUDES@ gobject_INCLUDES = @gobject_INCLUDES@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ installed_test_metadir = @installed_test_metadir@ installed_testdir = @installed_testdir@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ ms_librarian = @ms_librarian@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ #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 $(am__append_14) charset.alias ref-add.sed \ ref-del.sed DISTCLEANFILES = MAINTAINERCLEANFILES = EXTRA_DIST = $(all_dist_test_scripts) $(all_dist_test_data) README \ config.charset ref-add.sin ref-del.sin glibc21.m4 codeset.m4 \ update.sh make-patch.sh libcharset-glib.patch # 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)) installed_test_LTLIBRARIES = $(am__append_13) installed_test_SCRIPTS = $(am__append_11) nobase_installed_test_DATA = $(am__append_12) noinst_LTLIBRARIES = $(am__append_2) libcharset.la noinst_SCRIPTS = $(am__append_4) noinst_DATA = $(am__append_5) check_LTLIBRARIES = $(am__append_6) check_SCRIPTS = $(am__append_8) check_DATA = $(am__append_9) # 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) 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_data = $(test_data) $(uninstalled_test_data) \ $(installed_test_data) $(all_dist_test_data) all_dist_test_data = $(dist_test_data) $(dist_uninstalled_test_data) $(dist_installed_test_data) all_test_ltlibs = $(test_ltlibraries) $(uninstalled_test_ltlibraries) $(installed_test_ltlibraries) @ENABLE_INSTALLED_TESTS_TRUE@installed_testcases = $(test_programs) $(installed_test_programs) \ @ENABLE_INSTALLED_TESTS_TRUE@ $(test_scripts) $(installed_test_scripts) \ @ENABLE_INSTALLED_TESTS_TRUE@ $(dist_test_scripts) $(dist_installed_test_scripts) @ENABLE_INSTALLED_TESTS_TRUE@installed_test_meta_DATA = $(installed_testcases:=.test) AM_CPPFLAGS = \ -DLIBDIR=\"$(libdir)\" \ $(config_h_INCLUDES) libcharset_la_CFLAGS = $(GLIB_HIDDEN_VISIBILITY_CFLAGS) libcharset_la_SOURCES = \ libcharset.h \ localcharset.h \ localcharset.c charset_alias = $(DESTDIR)$(libdir)/charset.alias charset_tmp = $(DESTDIR)$(libdir)/charset.tmp SUFFIXES = .sed .sin all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .sed .sin .c .lo .log .o .obj .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/glib.mk $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign glib/libcharset/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign glib/libcharset/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_srcdir)/glib.mk $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-checkLTLIBRARIES: -test -z "$(check_LTLIBRARIES)" || rm -f $(check_LTLIBRARIES) @list='$(check_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } install-installed_testLTLIBRARIES: $(installed_test_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(installed_test_LTLIBRARIES)'; test -n "$(installed_testdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(installed_testdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(installed_testdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(installed_testdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(installed_testdir)"; \ } uninstall-installed_testLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(installed_test_LTLIBRARIES)'; test -n "$(installed_testdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(installed_testdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(installed_testdir)/$$f"; \ done clean-installed_testLTLIBRARIES: -test -z "$(installed_test_LTLIBRARIES)" || rm -f $(installed_test_LTLIBRARIES) @list='$(installed_test_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libcharset.la: $(libcharset_la_OBJECTS) $(libcharset_la_DEPENDENCIES) $(EXTRA_libcharset_la_DEPENDENCIES) $(AM_V_CCLD)$(libcharset_la_LINK) $(libcharset_la_OBJECTS) $(libcharset_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list install-installed_testPROGRAMS: $(installed_test_PROGRAMS) @$(NORMAL_INSTALL) @list='$(installed_test_PROGRAMS)'; test -n "$(installed_testdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(installed_testdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(installed_testdir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ || test -f $$p1 \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(installed_testdir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(installed_testdir)$$dir" || exit $$?; \ } \ ; done uninstall-installed_testPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(installed_test_PROGRAMS)'; test -n "$(installed_testdir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(installed_testdir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(installed_testdir)" && rm -f $$files clean-installed_testPROGRAMS: @list='$(installed_test_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list clean-noinstPROGRAMS: @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list install-installed_testSCRIPTS: $(installed_test_SCRIPTS) @$(NORMAL_INSTALL) @list='$(installed_test_SCRIPTS)'; test -n "$(installed_testdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(installed_testdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(installed_testdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) { files[d] = files[d] " " $$1; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$4, $$1 } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(installed_testdir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(installed_testdir)$$dir" || exit $$?; \ } \ ; done uninstall-installed_testSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(installed_test_SCRIPTS)'; test -n "$(installed_testdir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ dir='$(DESTDIR)$(installed_testdir)'; $(am__uninstall_files_from_dir) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcharset_la-localcharset.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libcharset_la-localcharset.lo: localcharset.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcharset_la_CFLAGS) $(CFLAGS) -MT libcharset_la-localcharset.lo -MD -MP -MF $(DEPDIR)/libcharset_la-localcharset.Tpo -c -o libcharset_la-localcharset.lo `test -f 'localcharset.c' || echo '$(srcdir)/'`localcharset.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcharset_la-localcharset.Tpo $(DEPDIR)/libcharset_la-localcharset.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='localcharset.c' object='libcharset_la-localcharset.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcharset_la_CFLAGS) $(CFLAGS) -c -o libcharset_la-localcharset.lo `test -f 'localcharset.c' || echo '$(srcdir)/'`localcharset.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-installed_test_metaDATA: $(installed_test_meta_DATA) @$(NORMAL_INSTALL) @list='$(installed_test_meta_DATA)'; test -n "$(installed_test_metadir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(installed_test_metadir)'"; \ $(MKDIR_P) "$(DESTDIR)$(installed_test_metadir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(installed_test_metadir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(installed_test_metadir)" || exit $$?; \ done uninstall-installed_test_metaDATA: @$(NORMAL_UNINSTALL) @list='$(installed_test_meta_DATA)'; test -n "$(installed_test_metadir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(installed_test_metadir)'; $(am__uninstall_files_from_dir) install-nobase_installed_testDATA: $(nobase_installed_test_DATA) @$(NORMAL_INSTALL) @list='$(nobase_installed_test_DATA)'; test -n "$(installed_testdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(installed_testdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(installed_testdir)" || exit 1; \ fi; \ $(am__nobase_list) | while read dir files; do \ xfiles=; for file in $$files; do \ if test -f "$$file"; then xfiles="$$xfiles $$file"; \ else xfiles="$$xfiles $(srcdir)/$$file"; fi; done; \ test -z "$$xfiles" || { \ test "x$$dir" = x. || { \ echo " $(MKDIR_P) '$(DESTDIR)$(installed_testdir)/$$dir'"; \ $(MKDIR_P) "$(DESTDIR)$(installed_testdir)/$$dir"; }; \ echo " $(INSTALL_DATA) $$xfiles '$(DESTDIR)$(installed_testdir)/$$dir'"; \ $(INSTALL_DATA) $$xfiles "$(DESTDIR)$(installed_testdir)/$$dir" || exit $$?; }; \ done uninstall-nobase_installed_testDATA: @$(NORMAL_UNINSTALL) @list='$(nobase_installed_test_DATA)'; test -n "$(installed_testdir)" || list=; \ $(am__nobase_strip_setup); files=`$(am__nobase_strip)`; \ dir='$(DESTDIR)$(installed_testdir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ elif test -n "$$redo_logs"; then \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_LTLIBRARIES) $(check_PROGRAMS) $(check_SCRIPTS) $(check_DATA) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_LTLIBRARIES) $(check_PROGRAMS) \ $(check_SCRIPTS) $(check_DATA) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check-local check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(SCRIPTS) $(DATA) \ all-local installdirs: for dir in "$(DESTDIR)$(installed_testdir)" "$(DESTDIR)$(installed_testdir)" "$(DESTDIR)$(installed_testdir)" "$(DESTDIR)$(installed_test_metadir)" "$(DESTDIR)$(installed_testdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-checkLTLIBRARIES clean-checkPROGRAMS clean-generic \ clean-installed_testLTLIBRARIES clean-installed_testPROGRAMS \ clean-libtool clean-noinstLTLIBRARIES clean-noinstPROGRAMS \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-installed_testLTLIBRARIES \ install-installed_testPROGRAMS install-installed_testSCRIPTS \ install-installed_test_metaDATA \ install-nobase_installed_testDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-installed_testLTLIBRARIES \ uninstall-installed_testPROGRAMS \ uninstall-installed_testSCRIPTS \ uninstall-installed_test_metaDATA \ uninstall-nobase_installed_testDATA .MAKE: all check check-am install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am all-local check check-TESTS \ check-am check-local clean clean-checkLTLIBRARIES \ clean-checkPROGRAMS clean-generic \ clean-installed_testLTLIBRARIES clean-installed_testPROGRAMS \ clean-libtool clean-noinstLTLIBRARIES clean-noinstPROGRAMS \ cscopelist-am ctags ctags-am distclean distclean-compile \ distclean-generic distclean-libtool distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-installed_testLTLIBRARIES \ install-installed_testPROGRAMS install-installed_testSCRIPTS \ install-installed_test_metaDATA install-man \ install-nobase_installed_testDATA install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am \ uninstall-installed_testLTLIBRARIES \ uninstall-installed_testPROGRAMS \ uninstall-installed_testSCRIPTS \ uninstall-installed_test_metaDATA \ uninstall-nobase_installed_testDATA .PRECIOUS: Makefile ### testing rules # test: run all tests in cwd and subdirs test: test-nonrecursive @OS_UNIX_TRUE@ @ for subdir in $(SUBDIRS) . ; do \ @OS_UNIX_TRUE@ test "$$subdir" = "." -o "$$subdir" = "po" || \ @OS_UNIX_TRUE@ ( cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $@ ) || exit $? ; \ @OS_UNIX_TRUE@ done # test-nonrecursive: run tests only in cwd @OS_UNIX_TRUE@test-nonrecursive: ${TEST_PROGS} @OS_UNIX_TRUE@ @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} @OS_UNIX_FALSE@test-nonrecursive: # 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 ; \ echo '' >> $@.xml ; \ echo '' >> $@.xml ; \ echo ' $(PACKAGE)' >> $@.xml ; \ echo ' $(VERSION)' >> $@.xml ; \ echo " $$REVISION" >> $@.xml ; \ echo '' >> $@.xml ; \ for lf in `ls -L "$$GTESTER_LOGDIR"/.` ; do \ sed '1,1s/^?]*?>//' <"$$GTESTER_LOGDIR"/"$$lf" >> $@.xml ; \ done ; \ echo >> $@.xml ; \ echo '' >> $@.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 @ENABLE_INSTALLED_TESTS_TRUE@%.test: %$(EXEEXT) Makefile @ENABLE_INSTALLED_TESTS_TRUE@ $(AM_V_GEN) (echo '[Test]' > $@.tmp; \ @ENABLE_INSTALLED_TESTS_TRUE@ echo 'Type=session' >> $@.tmp; \ @ENABLE_INSTALLED_TESTS_TRUE@ echo 'Exec=$(installed_testdir)/$<' >> $@.tmp; \ @ENABLE_INSTALLED_TESTS_TRUE@ mv $@.tmp $@) charset.alias: config.charset $(AM_V_GEN) $(SHELL) $(srcdir)/config.charset '@host@' > t-$@ @mv t-$@ $@ all-local: ref-add.sed ref-del.sed charset.alias .sin.sed: $(AM_V_GEN) $(SED) -e '/^#/d' -e 's/@''PACKAGE''@/@PACKAGE@/g' $< > t-$@ @mv t-$@ $@ # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: pkg-config-0.29.1/glib/glib/gthreadprivate.h0000664000175000017500000000442212651243552015575 00000000000000/* GLIB - Library of useful routines for C programming * * gthreadprivate.h - GLib internal thread system related declarations. * * Copyright (C) 2003 Sebastian Wilhelmi * * The Gnome Library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * The Gnome Library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with the Gnome Library; see the file COPYING.LIB. If not, * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __G_THREADPRIVATE_H__ #define __G_THREADPRIVATE_H__ #include "deprecated/gthread.h" typedef struct _GRealThread GRealThread; struct _GRealThread { GThread thread; gint ref_count; gboolean ours; gchar *name; gpointer retval; }; /* system thread implementation (gthread-posix.c, gthread-win32.c) */ void g_system_thread_wait (GRealThread *thread); GRealThread * g_system_thread_new (GThreadFunc func, gulong stack_size, GError **error); void g_system_thread_free (GRealThread *thread); void g_system_thread_exit (void); void g_system_thread_set_name (const gchar *name); /* gthread.c */ GThread * g_thread_new_internal (const gchar *name, GThreadFunc proxy, GThreadFunc func, gpointer data, gsize stack_size, GError **error); gpointer g_thread_proxy (gpointer thread); #endif /* __G_THREADPRIVATE_H__ */ pkg-config-0.29.1/glib/glib/gvarianttypeinfo.h0000664000175000017500000001601212651243552016153 00000000000000/* * Copyright © 2008 Ryan Lortie * Copyright © 2010 Codethink Limited * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * * Author: Ryan Lortie */ #ifndef __G_VARIANT_TYPE_INFO_H__ #define __G_VARIANT_TYPE_INFO_H__ #include #define G_VARIANT_TYPE_INFO_CHAR_MAYBE 'm' #define G_VARIANT_TYPE_INFO_CHAR_ARRAY 'a' #define G_VARIANT_TYPE_INFO_CHAR_TUPLE '(' #define G_VARIANT_TYPE_INFO_CHAR_DICT_ENTRY '{' #define G_VARIANT_TYPE_INFO_CHAR_VARIANT 'v' #define g_variant_type_info_get_type_char(info) \ (g_variant_type_info_get_type_string(info)[0]) typedef struct _GVariantTypeInfo GVariantTypeInfo; /* < private > * GVariantMemberInfo: * * This structure describes how to construct a GVariant instance * corresponding to a given child of a tuple or dictionary entry in a * very short constant time. It contains the typeinfo of the child, * along with 4 constants that allow the bounds of the child's * serialised data within the container's serialised data to be found * very efficiently. * * Since dictionary entries are serialised as if they were tuples of 2 * items, the term "tuple" will be used here in the general sense to * refer to tuples and dictionary entries. * * BACKGROUND: * The serialised data for a tuple contains an array of "offsets" at * the end. There is one "offset" in this array for each * variable-sized item in the tuple (except for the last one). The * offset points to the end point of that item's serialised data. The * procedure for finding the start point is described below. An * offset is not needed for the last item because the end point of the * last item is merely the end point of the container itself (after * the offsets array has been accounted for). An offset is not needed * for fixed-sized items (like integers) because, due to their fixed * size, the end point is a constant addition to the start point. * * It is clear that the starting point of a given item in the tuple is * determined by the items that precede it in the tuple. Logically, * the start point of a particular item in a given type of tuple can * be determined entirely by the end point of the nearest * variable-sized item that came before it (or from the start of the * container itself in case there is no preceding variable-sized * item). In the case of "(isis)" for example, in order to find out * the start point of the last string, one must start at the end point * of the first string, align to 4 (for the integer's alignment) and * then add 4 (for storing the integer). That's the point where the * string starts (since no special alignment is required for strings). * * Of course, this process requires iterating over the types in the * tuple up to the item of interest. As it turns out, it is possible * to determine 3 constants 'a', 'b', and 'c' for each item in the * tuple, such that, given the ending offset of the nearest previous * variable-sized item (prev_end), a very simple calculation can be * performed to determine the start of the item of interest. * * The constants in this structure are used as follows: * * First, among the array of offets contained in the tuple, 'i' is the * index of the offset that refers to the end of the variable-sized item * preceding the item of interest. If no variable-sized items precede * this item, then 'i' will be -1. * * Let 'prev_end' be the end offset of the previous item (or 0 in the * case that there was no such item). The start address of this item * can then be calculate using 'a', 'b', and 'c': * * item_start = ((prev_end + a) & b) | c; * * For details about how 'a', 'b' and 'c' are calculated, see the * comments at the point of the implementation in gvariantypeinfo.c. * * The end address of the item is then determined in one of three ways, * according to the 'end_type' field. * * - FIXED: For fixed sized items, the end address is equal to the * start address plus the fixed size. * * - LAST: For the last variable sized item in the tuple, the end * address is equal to the end address of the tuple, minus the size * of the offset array. * * - OFFSET: For other variable sized items, the next index past 'i' * (ie: 'i + 1') must be consulted to find the end of this item. */ typedef struct { GVariantTypeInfo *type_info; gsize i, a; gint8 b, c; guint8 ending_type; } GVariantMemberInfo; #define G_VARIANT_MEMBER_ENDING_FIXED 0 #define G_VARIANT_MEMBER_ENDING_LAST 1 #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__ */ pkg-config-0.29.1/glib/glib/gbsearcharray.h0000664000175000017500000002755112275467762015426 00000000000000/* GBSearchArray - Binary Searchable Array implementation * Copyright (C) 2000-2003 Tim Janik * * This software is provided "as is"; redistribution and modification * is permitted, provided that the following disclaimer is retained. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * In no event shall the authors or contributors be liable for any * direct, indirect, incidental, special, exemplary, or consequential * damages (including, but not limited to, procurement of substitute * goods or services; loss of use, data, or profits; or business * interruption) however caused and on any theory of liability, whether * in contract, strict liability, or tort (including negligence or * otherwise) arising in any way out of the use of this software, even * if advised of the possibility of such damage. */ #ifndef __G_BSEARCH_ARRAY_H__ #define __G_BSEARCH_ARRAY_H__ #include #include G_BEGIN_DECLS /* c++ guards */ /* this implementation is intended to be usable in third-party code * simply by pasting the contents of this file. as such, the * implementation needs to be self-contained within this file. */ /* convenience macro to avoid signed overflow for value comparisons */ #define G_BSEARCH_ARRAY_CMP(v1,v2) ((v1) > (v2) ? +1 : (v1) == (v2) ? 0 : -1) /* --- typedefs --- */ typedef gint (*GBSearchCompareFunc) (gconstpointer bsearch_node1, /* key */ gconstpointer bsearch_node2); typedef enum { G_BSEARCH_ARRAY_ALIGN_POWER2 = 1 << 0, /* align memory to power2 sizes */ G_BSEARCH_ARRAY_AUTO_SHRINK = 1 << 1 /* shrink array upon removal */ } GBSearchArrayFlags; /* --- structures --- */ typedef struct { guint sizeof_node; GBSearchCompareFunc cmp_nodes; guint flags; } GBSearchConfig; typedef union { guint n_nodes; /*< private >*/ gpointer alignment_dummy1; glong alignment_dummy2; gdouble alignment_dummy3; } GBSearchArray; /* --- public API --- */ static inline GBSearchArray* g_bsearch_array_create (const GBSearchConfig *bconfig); static inline gpointer g_bsearch_array_get_nth (GBSearchArray *barray, const GBSearchConfig *bconfig, guint nth); static inline guint g_bsearch_array_get_index (GBSearchArray *barray, const GBSearchConfig *bconfig, gconstpointer node_in_array); static inline GBSearchArray* g_bsearch_array_remove (GBSearchArray *barray, const GBSearchConfig *bconfig, guint index_); /* provide uninitialized space at index for node insertion */ static inline GBSearchArray* g_bsearch_array_grow (GBSearchArray *barray, const GBSearchConfig *bconfig, guint index); /* insert key_node into array if it does not exist, otherwise do nothing */ static inline GBSearchArray* g_bsearch_array_insert (GBSearchArray *barray, const GBSearchConfig *bconfig, gconstpointer key_node); /* insert key_node into array if it does not exist, * otherwise replace the existing node's contents with key_node */ static inline GBSearchArray* g_bsearch_array_replace (GBSearchArray *barray, const GBSearchConfig *bconfig, gconstpointer key_node); static inline void g_bsearch_array_free (GBSearchArray *barray, const GBSearchConfig *bconfig); #define g_bsearch_array_get_n_nodes(barray) (((GBSearchArray*) (barray))->n_nodes) /* g_bsearch_array_lookup(): * return NULL or exact match node */ #define g_bsearch_array_lookup(barray, bconfig, key_node) \ g_bsearch_array_lookup_fuzzy ((barray), (bconfig), (key_node), 0) /* g_bsearch_array_lookup_sibling(): * return NULL for barray->n_nodes==0, otherwise return the * exact match node, or, if there's no such node, return the * node last visited, which is pretty close to an exact match * (will be one off into either direction). */ #define g_bsearch_array_lookup_sibling(barray, bconfig, key_node) \ g_bsearch_array_lookup_fuzzy ((barray), (bconfig), (key_node), 1) /* g_bsearch_array_lookup_insertion(): * return NULL for barray->n_nodes==0 or exact match, otherwise * return the node where key_node should be inserted (may be one * after end, i.e. g_bsearch_array_get_index(result) <= barray->n_nodes). */ #define g_bsearch_array_lookup_insertion(barray, bconfig, key_node) \ g_bsearch_array_lookup_fuzzy ((barray), (bconfig), (key_node), 2) /* --- implementation --- */ /* helper macro to cut down realloc()s */ #ifdef DISABLE_MEM_POOLS #define G_BSEARCH_UPPER_POWER2(n) (n) #else /* !DISABLE_MEM_POOLS */ #define G_BSEARCH_UPPER_POWER2(n) ((n) ? 1 << g_bit_storage ((n) - 1) : 0) #endif /* !DISABLE_MEM_POOLS */ #define G_BSEARCH_ARRAY_NODES(barray) (((guint8*) (barray)) + sizeof (GBSearchArray)) static inline GBSearchArray* g_bsearch_array_create (const GBSearchConfig *bconfig) { GBSearchArray *barray; guint size; g_return_val_if_fail (bconfig != NULL, NULL); size = sizeof (GBSearchArray) + bconfig->sizeof_node; if (bconfig->flags & G_BSEARCH_ARRAY_ALIGN_POWER2) size = G_BSEARCH_UPPER_POWER2 (size); barray = (GBSearchArray *) g_malloc (size); memset (barray, 0, sizeof (GBSearchArray)); return barray; } static inline gpointer g_bsearch_array_lookup_fuzzy (GBSearchArray *barray, const GBSearchConfig *bconfig, gconstpointer key_node, const guint sibling_or_after); static inline gpointer g_bsearch_array_lookup_fuzzy (GBSearchArray *barray, const GBSearchConfig *bconfig, gconstpointer key_node, const guint sibling_or_after) { GBSearchCompareFunc cmp_nodes = bconfig->cmp_nodes; guint8 *check = NULL, *nodes = G_BSEARCH_ARRAY_NODES (barray); guint n_nodes = barray->n_nodes, offs = 0; guint sizeof_node = bconfig->sizeof_node; gint cmp = 0; while (offs < n_nodes) { guint i = (offs + n_nodes) >> 1; check = nodes + i * sizeof_node; cmp = cmp_nodes (key_node, check); if (cmp == 0) return sibling_or_after > 1 ? NULL : check; else if (cmp < 0) n_nodes = i; else /* (cmp > 0) */ offs = i + 1; } /* check is last mismatch, cmp > 0 indicates greater key */ return G_LIKELY (!sibling_or_after) ? NULL : (sibling_or_after > 1 && cmp > 0) ? check + sizeof_node : check; } static inline gpointer g_bsearch_array_get_nth (GBSearchArray *barray, const GBSearchConfig *bconfig, guint nth) { return (G_LIKELY (nth < barray->n_nodes) ? G_BSEARCH_ARRAY_NODES (barray) + nth * bconfig->sizeof_node : NULL); } static inline guint g_bsearch_array_get_index (GBSearchArray *barray, const GBSearchConfig *bconfig, gconstpointer node_in_array) { guint distance = ((guint8*) node_in_array) - G_BSEARCH_ARRAY_NODES (barray); g_return_val_if_fail (node_in_array != NULL, barray->n_nodes); distance /= bconfig->sizeof_node; return MIN (distance, barray->n_nodes + 1); /* may return one after end */ } static inline GBSearchArray* g_bsearch_array_grow (GBSearchArray *barray, const GBSearchConfig *bconfig, guint index_) { guint old_size = barray->n_nodes * bconfig->sizeof_node; guint new_size = old_size + bconfig->sizeof_node; guint8 *node; g_return_val_if_fail (index_ <= barray->n_nodes, NULL); if (G_UNLIKELY (bconfig->flags & G_BSEARCH_ARRAY_ALIGN_POWER2)) { new_size = G_BSEARCH_UPPER_POWER2 (sizeof (GBSearchArray) + new_size); old_size = G_BSEARCH_UPPER_POWER2 (sizeof (GBSearchArray) + old_size); if (old_size != new_size) barray = (GBSearchArray *) g_realloc (barray, new_size); } else barray = (GBSearchArray *) g_realloc (barray, sizeof (GBSearchArray) + new_size); node = G_BSEARCH_ARRAY_NODES (barray) + index_ * bconfig->sizeof_node; g_memmove (node + bconfig->sizeof_node, node, (barray->n_nodes - index_) * bconfig->sizeof_node); barray->n_nodes += 1; return barray; } static inline GBSearchArray* g_bsearch_array_insert (GBSearchArray *barray, const GBSearchConfig *bconfig, gconstpointer key_node) { guint8 *node; if (G_UNLIKELY (!barray->n_nodes)) { barray = g_bsearch_array_grow (barray, bconfig, 0); node = G_BSEARCH_ARRAY_NODES (barray); } else { node = (guint8 *) g_bsearch_array_lookup_insertion (barray, bconfig, key_node); if (G_LIKELY (node)) { guint index_ = g_bsearch_array_get_index (barray, bconfig, node); /* grow and insert */ barray = g_bsearch_array_grow (barray, bconfig, index_); node = G_BSEARCH_ARRAY_NODES (barray) + index_ * bconfig->sizeof_node; } else /* no insertion needed, node already there */ return barray; } memcpy (node, key_node, bconfig->sizeof_node); return barray; } static inline GBSearchArray* g_bsearch_array_replace (GBSearchArray *barray, const GBSearchConfig *bconfig, gconstpointer key_node) { guint8 *node = (guint8 *) g_bsearch_array_lookup (barray, bconfig, key_node); if (G_LIKELY (node)) /* expected path */ memcpy (node, key_node, bconfig->sizeof_node); else /* revert to insertion */ barray = g_bsearch_array_insert (barray, bconfig, key_node); return barray; } static inline GBSearchArray* g_bsearch_array_remove (GBSearchArray *barray, const GBSearchConfig *bconfig, guint index_) { guint8 *node; g_return_val_if_fail (index_ < barray->n_nodes, NULL); barray->n_nodes -= 1; node = G_BSEARCH_ARRAY_NODES (barray) + index_ * bconfig->sizeof_node; g_memmove (node, node + bconfig->sizeof_node, (barray->n_nodes - index_) * bconfig->sizeof_node); if (G_UNLIKELY (bconfig->flags & G_BSEARCH_ARRAY_AUTO_SHRINK)) { guint new_size = barray->n_nodes * bconfig->sizeof_node; guint old_size = new_size + bconfig->sizeof_node; if (G_UNLIKELY (bconfig->flags & G_BSEARCH_ARRAY_ALIGN_POWER2)) { new_size = G_BSEARCH_UPPER_POWER2 (sizeof (GBSearchArray) + new_size); old_size = G_BSEARCH_UPPER_POWER2 (sizeof (GBSearchArray) + old_size); if (old_size != new_size) barray = (GBSearchArray *) g_realloc (barray, new_size); } else barray = (GBSearchArray *) g_realloc (barray, sizeof (GBSearchArray) + new_size); } return barray; } static inline void g_bsearch_array_free (GBSearchArray *barray, const GBSearchConfig *bconfig) { g_return_if_fail (barray != NULL); g_free (barray); } G_END_DECLS /* c++ guards */ #endif /* !__G_BSEARCH_ARRAY_H__ */ pkg-config-0.29.1/glib/glib/gthread-posix.c0000664000175000017500000007113412651243552015341 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * gthread.c: posix thread system implementation * Copyright 1998 Sebastian Wilhelmi; University of Karlsruhe * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the GLib Team and others 1997-2000. See the AUTHORS * file for a list of people on the GLib Team. See the ChangeLog * files for a list of changes. These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/. */ /* The GMutex, GCond and GPrivate implementations in this file are some * of the lowest-level code in GLib. All other parts of GLib (messages, * memory, slices, etc) assume that they can freely use these facilities * without risking recursion. * * As such, these functions are NOT permitted to call any other part of * GLib. * * The thread manipulation functions (create, exit, join, etc.) have * more freedom -- they can do as they please. */ #include "config.h" #include "gthread.h" #include "gthreadprivate.h" #include "gslice.h" #include "gmessages.h" #include "gstrfuncs.h" #include #include #include #include #include #ifdef HAVE_SYS_TIME_H # include #endif #ifdef HAVE_UNISTD_H # include #endif #ifdef HAVE_SCHED_H #include #endif #ifdef HAVE_SYS_PRCTL_H #include #endif #ifdef G_OS_WIN32 #include #endif static void g_thread_abort (gint status, const gchar *function) { fprintf (stderr, "GLib (gthread-posix.c): Unexpected error from C library during '%s': %s. Aborting.\n", function, strerror (status)); abort (); } /* {{{1 GMutex */ static pthread_mutex_t * g_mutex_impl_new (void) { pthread_mutexattr_t *pattr = NULL; pthread_mutex_t *mutex; gint status; mutex = malloc (sizeof (pthread_mutex_t)); if G_UNLIKELY (mutex == NULL) 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; } #endif if G_UNLIKELY ((status = pthread_mutex_init (mutex, pattr)) != 0) g_thread_abort (status, "pthread_mutex_init"); #ifdef PTHREAD_ADAPTIVE_MUTEX_NP pthread_mutexattr_destroy (&attr); #endif return mutex; } static void g_mutex_impl_free (pthread_mutex_t *mutex) { pthread_mutex_destroy (mutex); free (mutex); } static pthread_mutex_t * g_mutex_get_impl (GMutex *mutex) { pthread_mutex_t *impl = g_atomic_pointer_get (&mutex->p); if G_UNLIKELY (impl == NULL) { impl = g_mutex_impl_new (); if (!g_atomic_pointer_compare_and_exchange (&mutex->p, NULL, impl)) g_mutex_impl_free (impl); impl = mutex->p; } return impl; } /** * g_mutex_init: * @mutex: an uninitialized #GMutex * * Initializes a #GMutex so that it can be used. * * 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 * statically allocated. * * |[ * typedef struct { * GMutex m; * ... * } Blob; * * Blob *b; * * b = g_new (Blob, 1); * g_mutex_init (&b->m); * ]| * * To undo the effect of g_mutex_init() when a mutex is no longer * needed, use g_mutex_clear(). * * Calling g_mutex_init() on an already initialized #GMutex leads * to undefined behaviour. * * Since: 2.32 */ void g_mutex_init (GMutex *mutex) { mutex->p = g_mutex_impl_new (); } /** * g_mutex_clear: * @mutex: an initialized #GMutex * * Frees the resources allocated to a mutex with g_mutex_init(). * * This function should not be used with a #GMutex that has been * statically allocated. * * Calling g_mutex_clear() on a locked mutex leads to undefined * behaviour. * * Sine: 2.32 */ void g_mutex_clear (GMutex *mutex) { g_mutex_impl_free (mutex->p); } /** * g_mutex_lock: * @mutex: a #GMutex * * Locks @mutex. If @mutex is already locked by another thread, the * current thread will block until @mutex is unlocked by the other * thread. * * #GMutex is neither guaranteed to be recursive nor to be * non-recursive. As such, calling g_mutex_lock() on a #GMutex that has * already been locked by the same thread results in undefined behaviour * (including but not limited to deadlocks). */ void g_mutex_lock (GMutex *mutex) { gint status; if G_UNLIKELY ((status = pthread_mutex_lock (g_mutex_get_impl (mutex))) != 0) g_thread_abort (status, "pthread_mutex_lock"); } /** * g_mutex_unlock: * @mutex: a #GMutex * * Unlocks @mutex. If another thread is blocked in a g_mutex_lock() * call for @mutex, it will become unblocked and can lock @mutex itself. * * Calling g_mutex_unlock() on a mutex that is not locked by the * current thread leads to undefined behaviour. */ void g_mutex_unlock (GMutex *mutex) { gint status; if G_UNLIKELY ((status = pthread_mutex_unlock (g_mutex_get_impl (mutex))) != 0) g_thread_abort (status, "pthread_mutex_unlock"); } /** * g_mutex_trylock: * @mutex: a #GMutex * * Tries to lock @mutex. If @mutex is already locked by another thread, * it immediately returns %FALSE. Otherwise it locks @mutex and returns * %TRUE. * * #GMutex is neither guaranteed to be recursive nor to be * non-recursive. As such, calling g_mutex_lock() on a #GMutex that has * already been locked by the same thread results in undefined behaviour * (including but not limited to deadlocks or arbitrary return values). * * Returns: %TRUE if @mutex could be locked */ gboolean g_mutex_trylock (GMutex *mutex) { gint status; if G_LIKELY ((status = pthread_mutex_trylock (g_mutex_get_impl (mutex))) == 0) return TRUE; if G_UNLIKELY (status != EBUSY) g_thread_abort (status, "pthread_mutex_trylock"); return FALSE; } /* {{{1 GRecMutex */ static pthread_mutex_t * g_rec_mutex_impl_new (void) { pthread_mutexattr_t attr; pthread_mutex_t *mutex; mutex = g_slice_new (pthread_mutex_t); pthread_mutexattr_init (&attr); pthread_mutexattr_settype (&attr, PTHREAD_MUTEX_RECURSIVE); pthread_mutex_init (mutex, &attr); pthread_mutexattr_destroy (&attr); return mutex; } static void g_rec_mutex_impl_free (pthread_mutex_t *mutex) { pthread_mutex_destroy (mutex); g_slice_free (pthread_mutex_t, mutex); } static pthread_mutex_t * g_rec_mutex_get_impl (GRecMutex *rec_mutex) { pthread_mutex_t *impl = g_atomic_pointer_get (&rec_mutex->p); if G_UNLIKELY (impl == NULL) { impl = g_rec_mutex_impl_new (); if (!g_atomic_pointer_compare_and_exchange (&rec_mutex->p, NULL, impl)) g_rec_mutex_impl_free (impl); impl = rec_mutex->p; } return impl; } /** * g_rec_mutex_init: * @rec_mutex: an uninitialized #GRecMutex * * Initializes a #GRecMutex so that it can be used. * * This function is useful to initialize a recursive mutex * that has been allocated on the stack, or as part of a larger * structure. * * It is not necessary to initialise a recursive mutex that has been * statically allocated. * * |[ * typedef struct { * GRecMutex m; * ... * } Blob; * * Blob *b; * * b = g_new (Blob, 1); * g_rec_mutex_init (&b->m); * ]| * * Calling g_rec_mutex_init() on an already initialized #GRecMutex * leads to undefined behaviour. * * To undo the effect of g_rec_mutex_init() when a recursive mutex * is no longer needed, use g_rec_mutex_clear(). * * Since: 2.32 */ void g_rec_mutex_init (GRecMutex *rec_mutex) { rec_mutex->p = g_rec_mutex_impl_new (); } /** * g_rec_mutex_clear: * @rec_mutex: an initialized #GRecMutex * * Frees the resources allocated to a recursive mutex with * g_rec_mutex_init(). * * This function should not be used with a #GRecMutex that has been * statically allocated. * * Calling g_rec_mutex_clear() on a locked recursive mutex leads * to undefined behaviour. * * Sine: 2.32 */ void g_rec_mutex_clear (GRecMutex *rec_mutex) { g_rec_mutex_impl_free (rec_mutex->p); } /** * g_rec_mutex_lock: * @rec_mutex: a #GRecMutex * * Locks @rec_mutex. If @rec_mutex is already locked by another * thread, the current thread will block until @rec_mutex is * unlocked by the other thread. If @rec_mutex is already locked * by the current thread, the 'lock count' of @rec_mutex is increased. * The mutex will only become available again when it is unlocked * as many times as it has been locked. * * Since: 2.32 */ void g_rec_mutex_lock (GRecMutex *mutex) { pthread_mutex_lock (g_rec_mutex_get_impl (mutex)); } /** * g_rec_mutex_unlock: * @rec_mutex: a #GRecMutex * * Unlocks @rec_mutex. If another thread is blocked in a * g_rec_mutex_lock() call for @rec_mutex, it will become unblocked * and can lock @rec_mutex itself. * * Calling g_rec_mutex_unlock() on a recursive mutex that is not * locked by the current thread leads to undefined behaviour. * * Since: 2.32 */ void g_rec_mutex_unlock (GRecMutex *rec_mutex) { pthread_mutex_unlock (rec_mutex->p); } /** * g_rec_mutex_trylock: * @rec_mutex: a #GRecMutex * * Tries to lock @rec_mutex. If @rec_mutex is already locked * by another thread, it immediately returns %FALSE. Otherwise * it locks @rec_mutex and returns %TRUE. * * Returns: %TRUE if @rec_mutex could be locked * * Since: 2.32 */ gboolean g_rec_mutex_trylock (GRecMutex *rec_mutex) { if (pthread_mutex_trylock (g_rec_mutex_get_impl (rec_mutex)) != 0) return FALSE; return TRUE; } /* {{{1 GRWLock */ static pthread_rwlock_t * g_rw_lock_impl_new (void) { pthread_rwlock_t *rwlock; gint status; rwlock = malloc (sizeof (pthread_rwlock_t)); if G_UNLIKELY (rwlock == NULL) g_thread_abort (errno, "malloc"); if G_UNLIKELY ((status = pthread_rwlock_init (rwlock, NULL)) != 0) g_thread_abort (status, "pthread_rwlock_init"); return rwlock; } static void g_rw_lock_impl_free (pthread_rwlock_t *rwlock) { pthread_rwlock_destroy (rwlock); free (rwlock); } static pthread_rwlock_t * g_rw_lock_get_impl (GRWLock *lock) { pthread_rwlock_t *impl = g_atomic_pointer_get (&lock->p); if G_UNLIKELY (impl == NULL) { impl = g_rw_lock_impl_new (); if (!g_atomic_pointer_compare_and_exchange (&lock->p, NULL, impl)) g_rw_lock_impl_free (impl); impl = lock->p; } return impl; } /** * g_rw_lock_init: * @rw_lock: an uninitialized #GRWLock * * Initializes a #GRWLock so that it can be used. * * This function is useful to initialize a lock that has been * allocated on the stack, or as part of a larger structure. It is not * necessary to initialise a reader-writer lock that has been statically * allocated. * * |[ * typedef struct { * GRWLock l; * ... * } Blob; * * Blob *b; * * b = g_new (Blob, 1); * g_rw_lock_init (&b->l); * ]| * * To undo the effect of g_rw_lock_init() when a lock is no longer * needed, use g_rw_lock_clear(). * * Calling g_rw_lock_init() on an already initialized #GRWLock leads * to undefined behaviour. * * Since: 2.32 */ void g_rw_lock_init (GRWLock *rw_lock) { rw_lock->p = g_rw_lock_impl_new (); } /** * g_rw_lock_clear: * @rw_lock: an initialized #GRWLock * * Frees the resources allocated to a lock with g_rw_lock_init(). * * This function should not be used with a #GRWLock that has been * statically allocated. * * Calling g_rw_lock_clear() when any thread holds the lock * leads to undefined behaviour. * * Sine: 2.32 */ void g_rw_lock_clear (GRWLock *rw_lock) { g_rw_lock_impl_free (rw_lock->p); } /** * g_rw_lock_writer_lock: * @rw_lock: a #GRWLock * * Obtain a write lock on @rw_lock. If any thread already holds * a read or write lock on @rw_lock, the current thread will block * until all other threads have dropped their locks on @rw_lock. * * Since: 2.32 */ void g_rw_lock_writer_lock (GRWLock *rw_lock) { pthread_rwlock_wrlock (g_rw_lock_get_impl (rw_lock)); } /** * g_rw_lock_writer_trylock: * @rw_lock: a #GRWLock * * Tries to obtain a write lock on @rw_lock. If any other thread holds * a read or write lock on @rw_lock, it immediately returns %FALSE. * Otherwise it locks @rw_lock and returns %TRUE. * * Returns: %TRUE if @rw_lock could be locked * * Since: 2.32 */ gboolean g_rw_lock_writer_trylock (GRWLock *rw_lock) { if (pthread_rwlock_trywrlock (g_rw_lock_get_impl (rw_lock)) != 0) return FALSE; return TRUE; } /** * g_rw_lock_writer_unlock: * @rw_lock: a #GRWLock * * Release a write lock on @rw_lock. * * Calling g_rw_lock_writer_unlock() on a lock that is not held * by the current thread leads to undefined behaviour. * * Since: 2.32 */ void g_rw_lock_writer_unlock (GRWLock *rw_lock) { pthread_rwlock_unlock (g_rw_lock_get_impl (rw_lock)); } /** * g_rw_lock_reader_lock: * @rw_lock: a #GRWLock * * Obtain a read lock on @rw_lock. If another thread currently holds * the write lock on @rw_lock or blocks waiting for it, the current * thread will block. Read locks can be taken recursively. * * It is implementation-defined how many threads are allowed to * hold read locks on the same lock simultaneously. * * Since: 2.32 */ void g_rw_lock_reader_lock (GRWLock *rw_lock) { pthread_rwlock_rdlock (g_rw_lock_get_impl (rw_lock)); } /** * g_rw_lock_reader_trylock: * @rw_lock: a #GRWLock * * Tries to obtain a read lock on @rw_lock and returns %TRUE if * the read lock was successfully obtained. Otherwise it * returns %FALSE. * * Returns: %TRUE if @rw_lock could be locked * * Since: 2.32 */ gboolean g_rw_lock_reader_trylock (GRWLock *rw_lock) { if (pthread_rwlock_tryrdlock (g_rw_lock_get_impl (rw_lock)) != 0) return FALSE; return TRUE; } /** * g_rw_lock_reader_unlock: * @rw_lock: a #GRWLock * * Release a read lock on @rw_lock. * * Calling g_rw_lock_reader_unlock() on a lock that is not held * by the current thread leads to undefined behaviour. * * Since: 2.32 */ void g_rw_lock_reader_unlock (GRWLock *rw_lock) { pthread_rwlock_unlock (g_rw_lock_get_impl (rw_lock)); } /* {{{1 GCond */ static pthread_cond_t * g_cond_impl_new (void) { pthread_condattr_t attr; pthread_cond_t *cond; gint status; pthread_condattr_init (&attr); #if defined (HAVE_PTHREAD_CONDATTR_SETCLOCK) && defined (CLOCK_MONOTONIC) pthread_condattr_setclock (&attr, CLOCK_MONOTONIC); #endif cond = malloc (sizeof (pthread_cond_t)); if G_UNLIKELY (cond == NULL) g_thread_abort (errno, "malloc"); if G_UNLIKELY ((status = pthread_cond_init (cond, &attr)) != 0) g_thread_abort (status, "pthread_cond_init"); pthread_condattr_destroy (&attr); return cond; } static void g_cond_impl_free (pthread_cond_t *cond) { pthread_cond_destroy (cond); free (cond); } static pthread_cond_t * g_cond_get_impl (GCond *cond) { pthread_cond_t *impl = g_atomic_pointer_get (&cond->p); if G_UNLIKELY (impl == NULL) { impl = g_cond_impl_new (); if (!g_atomic_pointer_compare_and_exchange (&cond->p, NULL, impl)) g_cond_impl_free (impl); impl = cond->p; } return impl; } /** * g_cond_init: * @cond: an uninitialized #GCond * * Initialises a #GCond so that it can be used. * * This function is useful to initialise a #GCond that has been * allocated as part of a larger structure. It is not necessary to * initialise a #GCond that has been statically allocated. * * To undo the effect of g_cond_init() when a #GCond is no longer * needed, use g_cond_clear(). * * Calling g_cond_init() on an already-initialised #GCond leads * to undefined behaviour. * * Since: 2.32 */ void g_cond_init (GCond *cond) { cond->p = g_cond_impl_new (); } /** * g_cond_clear: * @cond: an initialised #GCond * * Frees the resources allocated to a #GCond with g_cond_init(). * * This function should not be used with a #GCond that has been * statically allocated. * * Calling g_cond_clear() for a #GCond on which threads are * blocking leads to undefined behaviour. * * Since: 2.32 */ void g_cond_clear (GCond *cond) { g_cond_impl_free (cond->p); } /** * g_cond_wait: * @cond: a #GCond * @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 * not called). It's also possible that a stolen wakeup may occur. * This is when g_cond_signal() is called, but another thread acquires * @mutex before this thread and modifies the state of the program in * such a way that when g_cond_wait() is able to return, the expected * condition is no longer met. * * For this reason, g_cond_wait() must always be used in a loop. See * the documentation for #GCond for a complete example. **/ void g_cond_wait (GCond *cond, GMutex *mutex) { gint status; if G_UNLIKELY ((status = pthread_cond_wait (g_cond_get_impl (cond), g_mutex_get_impl (mutex))) != 0) g_thread_abort (status, "pthread_cond_wait"); } /** * g_cond_signal: * @cond: a #GCond * * If threads are waiting for @cond, at least one of them is unblocked. * If no threads are waiting for @cond, this function has no effect. * It is good practice to hold the same lock as the waiting thread * while calling this function, though not required. */ void g_cond_signal (GCond *cond) { gint status; if G_UNLIKELY ((status = pthread_cond_signal (g_cond_get_impl (cond))) != 0) g_thread_abort (status, "pthread_cond_signal"); } /** * g_cond_broadcast: * @cond: a #GCond * * If threads are waiting for @cond, all of them are unblocked. * If no threads are waiting for @cond, this function has no effect. * It is good practice to lock the same mutex as the waiting threads * while calling this function, though not required. */ void g_cond_broadcast (GCond *cond) { gint status; if G_UNLIKELY ((status = pthread_cond_broadcast (g_cond_get_impl (cond))) != 0) g_thread_abort (status, "pthread_cond_broadcast"); } /** * g_cond_wait_until: * @cond: a #GCond * @mutex: a #GMutex that is currently locked * @end_time: the monotonic time to wait until * * Waits until either @cond is signalled or @end_time has passed. * * As with g_cond_wait() it is possible that a spurious or stolen wakeup * could occur. For that reason, waiting on a condition variable should * always be in a loop, based on an explicitly-checked predicate. * * %TRUE is returned if the condition variable was signalled (or in the * case of a spurious wakeup). %FALSE is returned if @end_time has * passed. * * The following code shows how to correctly perform a timed wait on a * condition variable (extended the example presented in the * documentation for #GCond): * * |[ * gpointer * pop_data_timed (void) * { * gint64 end_time; * gpointer data; * * g_mutex_lock (&data_mutex); * * end_time = g_get_monotonic_time () + 5 * G_TIME_SPAN_SECOND; * while (!current_data) * if (!g_cond_wait_until (&data_cond, &data_mutex, end_time)) * { * // timeout has passed. * g_mutex_unlock (&data_mutex); * return NULL; * } * * // there is data for us * data = current_data; * current_data = NULL; * * g_mutex_unlock (&data_mutex); * * return data; * } * ]| * * Notice that the end time is calculated once, before entering the * loop and reused. This is the motivation behind the use of absolute * time on this API -- if a relative time of 5 seconds were passed * directly to the call and a spurious wakeup occurred, the program would * have to start over waiting again (which would lead to a total wait * time of more than 5 seconds). * * Returns: %TRUE on a signal, %FALSE on a timeout * Since: 2.32 **/ gboolean g_cond_wait_until (GCond *cond, GMutex *mutex, gint64 end_time) { struct timespec ts; gint status; 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"); return FALSE; } /* {{{1 GPrivate */ /** * GPrivate: * * The #GPrivate struct is an opaque data structure to represent a * thread-local data key. It is approximately equivalent to the * pthread_setspecific()/pthread_getspecific() APIs on POSIX and to * TlsSetValue()/TlsGetValue() on Windows. * * If you don't already know why you might want this functionality, * then you probably don't need it. * * #GPrivate is a very limited resource (as far as 128 per program, * shared between all libraries). It is also not possible to destroy a * #GPrivate after it has been used. As such, it is only ever acceptable * to use #GPrivate in static scope, and even then sparingly so. * * See G_PRIVATE_INIT() for a couple of examples. * * The #GPrivate structure should be considered opaque. It should only * be accessed via the g_private_ functions. */ /** * G_PRIVATE_INIT: * @notify: a #GDestroyNotify * * A macro to assist with the static initialisation of a #GPrivate. * * This macro is useful for the case that a #GDestroyNotify function * should be associated the key. This is needed when the key will be * used to point at memory that should be deallocated when the thread * exits. * * Additionally, the #GDestroyNotify will also be called on the previous * value stored in the key when g_private_replace() is used. * * If no #GDestroyNotify is needed, then use of this macro is not * required -- if the #GPrivate is declared in static scope then it will * be properly initialised by default (ie: to all zeros). See the * examples below. * * |[ * static GPrivate name_key = G_PRIVATE_INIT (g_free); * * // return value should not be freed * const gchar * * get_local_name (void) * { * return g_private_get (&name_key); * } * * void * set_local_name (const gchar *name) * { * g_private_replace (&name_key, g_strdup (name)); * } * * * static GPrivate count_key; // no free function * * gint * get_local_count (void) * { * return GPOINTER_TO_INT (g_private_get (&count_key)); * } * * void * set_local_count (gint count) * { * g_private_set (&count_key, GINT_TO_POINTER (count)); * } * ]| * * Since: 2.32 **/ static pthread_key_t * g_private_impl_new (GDestroyNotify notify) { pthread_key_t *key; gint status; key = malloc (sizeof (pthread_key_t)); if G_UNLIKELY (key == NULL) g_thread_abort (errno, "malloc"); status = pthread_key_create (key, notify); if G_UNLIKELY (status != 0) g_thread_abort (status, "pthread_key_create"); return key; } static void g_private_impl_free (pthread_key_t *key) { gint status; status = pthread_key_delete (*key); if G_UNLIKELY (status != 0) g_thread_abort (status, "pthread_key_delete"); free (key); } static pthread_key_t * g_private_get_impl (GPrivate *key) { pthread_key_t *impl = g_atomic_pointer_get (&key->p); if G_UNLIKELY (impl == NULL) { impl = g_private_impl_new (key->notify); if (!g_atomic_pointer_compare_and_exchange (&key->p, NULL, impl)) { g_private_impl_free (impl); impl = key->p; } } return impl; } /** * g_private_get: * @key: a #GPrivate * * Returns the current value of the thread local variable @key. * * If the value has not yet been set in this thread, %NULL is returned. * Values are never copied between threads (when a new thread is * created, for example). * * Returns: the thread-local value */ gpointer g_private_get (GPrivate *key) { /* quote POSIX: No errors are returned from pthread_getspecific(). */ return pthread_getspecific (*g_private_get_impl (key)); } /** * g_private_set: * @key: a #GPrivate * @value: the new value * * Sets the thread local variable @key to have the value @value in the * current thread. * * This function differs from g_private_replace() in the following way: * the #GDestroyNotify for @key is not called on the old value. */ void g_private_set (GPrivate *key, gpointer value) { gint status; if G_UNLIKELY ((status = pthread_setspecific (*g_private_get_impl (key), value)) != 0) g_thread_abort (status, "pthread_setspecific"); } /** * g_private_replace: * @key: a #GPrivate * @value: the new value * * Sets the thread local variable @key to have the value @value in the * current thread. * * This function differs from g_private_set() in the following way: if * the previous value was non-%NULL then the #GDestroyNotify handler for * @key is run on it. * * Since: 2.32 **/ void g_private_replace (GPrivate *key, gpointer value) { pthread_key_t *impl = g_private_get_impl (key); gpointer old; gint status; old = pthread_getspecific (*impl); if (old && key->notify) key->notify (old); if G_UNLIKELY ((status = pthread_setspecific (*impl, value)) != 0) g_thread_abort (status, "pthread_setspecific"); } /* {{{1 GThread */ #define posix_check_err(err, name) G_STMT_START{ \ int error = (err); \ if (error) \ g_error ("file %s: line %d (%s): error '%s' during '%s'", \ __FILE__, __LINE__, G_STRFUNC, \ g_strerror (error), name); \ }G_STMT_END #define posix_check_cmd(cmd) posix_check_err (cmd, #cmd) typedef struct { GRealThread thread; pthread_t system_thread; gboolean joined; GMutex lock; } GThreadPosix; void g_system_thread_free (GRealThread *thread) { GThreadPosix *pt = (GThreadPosix *) thread; if (!pt->joined) pthread_detach (pt->system_thread); g_mutex_clear (&pt->lock); g_slice_free (GThreadPosix, pt); } GRealThread * g_system_thread_new (GThreadFunc thread_func, gulong stack_size, GError **error) { GThreadPosix *thread; pthread_attr_t attr; gint ret; thread = g_slice_new0 (GThreadPosix); posix_check_cmd (pthread_attr_init (&attr)); #ifdef HAVE_PTHREAD_ATTR_SETSTACKSIZE if (stack_size) { #ifdef _SC_THREAD_STACK_MIN stack_size = MAX (sysconf (_SC_THREAD_STACK_MIN), stack_size); #endif /* _SC_THREAD_STACK_MIN */ /* No error check here, because some systems can't do it and * we simply don't want threads to fail because of that. */ pthread_attr_setstacksize (&attr, stack_size); } #endif /* HAVE_PTHREAD_ATTR_SETSTACKSIZE */ ret = pthread_create (&thread->system_thread, &attr, (void* (*)(void*))thread_func, thread); posix_check_cmd (pthread_attr_destroy (&attr)); if (ret == EAGAIN) { g_set_error (error, G_THREAD_ERROR, G_THREAD_ERROR_AGAIN, "Error creating thread: %s", g_strerror (ret)); g_slice_free (GThreadPosix, thread); return NULL; } posix_check_err (ret, "pthread_create"); g_mutex_init (&thread->lock); return (GRealThread *) thread; } /** * g_thread_yield: * * Causes the calling thread to voluntarily relinquish the CPU, so * that other threads can run. * * This function is often used as a method to make busy wait less evil. */ void g_thread_yield (void) { sched_yield (); } void g_system_thread_wait (GRealThread *thread) { GThreadPosix *pt = (GThreadPosix *) thread; g_mutex_lock (&pt->lock); if (!pt->joined) { posix_check_cmd (pthread_join (pt->system_thread, NULL)); pt->joined = TRUE; } g_mutex_unlock (&pt->lock); } void g_system_thread_exit (void) { pthread_exit (NULL); } 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 */ /* vim:set foldmethod=marker: */ pkg-config-0.29.1/glib/glib/gbytes.c0000664000175000017500000003106212651243552014054 00000000000000/* * Copyright © 2009, 2010 Codethink Limited * Copyright © 2011 Collabora Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the licence, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * * Author: Ryan Lortie * Stef Walter */ #include "config.h" #include "gbytes.h" #include #include #include #include #include #include #include #include /** * GBytes: * * A simple refcounted data type representing an immutable byte sequence * from an unspecified origin. * * The purpose of a #GBytes is to keep the memory region that it holds * alive for as long as anyone holds a reference to the bytes. When * the last reference count is dropped, the memory is released. Multiple * unrelated callers can use byte data in the #GBytes without coordinating * their activities, resting assured that the byte data will not change or * move while they hold a reference. * * A #GBytes can come from many different origins that may have * different procedures for freeing the memory region. Examples are * memory from g_malloc(), from memory slices, from a #GMappedFile or * memory from other allocators. * * #GBytes work well as keys in #GHashTable. Use g_bytes_equal() and * g_bytes_hash() as parameters to g_hash_table_new() or g_hash_table_new_full(). * #GBytes can also be used as keys in a #GTree by passing the g_bytes_compare() * function to g_tree_new(). * * The data pointed to by this bytes must not be modified. For a mutable * array of bytes see #GByteArray. Use g_bytes_unref_to_array() to create a * mutable array for a #GBytes sequence. To create an immutable #GBytes from * a mutable #GByteArray, use the g_byte_array_free_to_bytes() function. * * Since: 2.32 **/ struct _GBytes { gconstpointer data; gsize size; gint ref_count; GDestroyNotify free_func; gpointer user_data; }; /** * g_bytes_new: * @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. * * @data is copied. * * Returns: (transfer full): a new #GBytes * * Since: 2.32 */ GBytes * g_bytes_new (gconstpointer data, gsize size) { return g_bytes_new_take (g_memdup (data, size), size); } /** * g_bytes_new_take: * @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. * * After this call, @data belongs to the bytes and may no longer be * modified by the caller. g_free() will be called on @data when the * bytes is no longer in use. Because of this @data must have been created by * a call to g_malloc(), g_malloc0() or g_realloc() or by one of the many * functions that wrap these calls (such as g_new(), g_strdup(), etc). * * For creating #GBytes with memory from other allocators, see * g_bytes_new_with_free_func(). * * Returns: (transfer full): a new #GBytes * * Since: 2.32 */ GBytes * g_bytes_new_take (gpointer data, gsize size) { return g_bytes_new_with_free_func (data, size, g_free, data); } /** * 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. * * @data must be static (ie: never modified or freed). * * Returns: (transfer full): a new #GBytes * * Since: 2.32 */ GBytes * g_bytes_new_static (gconstpointer data, gsize size) { return g_bytes_new_with_free_func (data, size, NULL, NULL); } /** * g_bytes_new_with_free_func: * @data: (array length=size): the data to be used for the bytes * @size: the size of @data * @free_func: the function to call to release the data * @user_data: data to pass to @free_func * * Creates a #GBytes from @data. * * When the last reference is dropped, @free_func will be called with the * @user_data argument. * * @data must not be modified after this call is made until @free_func has * been called to indicate that the bytes is no longer in use. * * Returns: (transfer full): a new #GBytes * * Since: 2.32 */ GBytes * g_bytes_new_with_free_func (gconstpointer data, gsize size, GDestroyNotify free_func, gpointer user_data) { GBytes *bytes; bytes = g_slice_new (GBytes); bytes->data = data; bytes->size = size; bytes->free_func = free_func; bytes->user_data = user_data; bytes->ref_count = 1; return (GBytes *)bytes; } /** * g_bytes_new_from_bytes: * @bytes: a #GBytes * @offset: offset which subsection starts at * @length: length of subsection * * Creates a #GBytes which is a subsection of another #GBytes. The @offset + * @length may not be longer than the size of @bytes. * * A reference to @bytes will be held by the newly created #GBytes until * the byte data is no longer needed. * * Returns: (transfer full): a new #GBytes * * Since: 2.32 */ GBytes * g_bytes_new_from_bytes (GBytes *bytes, gsize offset, gsize length) { g_return_val_if_fail (bytes != NULL, NULL); g_return_val_if_fail (offset <= bytes->size, NULL); g_return_val_if_fail (offset + length <= bytes->size, NULL); return g_bytes_new_with_free_func ((gchar *)bytes->data + offset, length, (GDestroyNotify)g_bytes_unref, g_bytes_ref (bytes)); } /** * g_bytes_get_data: * @bytes: a #GBytes * @size: (out) (allow-none): location to return size of byte data * * Get the byte data in the #GBytes. This data should not be modified. * * This function will always return the same pointer for a given #GBytes. * * Returns: (transfer none) (array length=size) (type guint8): a pointer to the * byte data * * Since: 2.32 */ gconstpointer g_bytes_get_data (GBytes *bytes, gsize *size) { g_return_val_if_fail (bytes != NULL, NULL); if (size) *size = bytes->size; return bytes->data; } /** * g_bytes_get_size: * @bytes: a #GBytes * * Get the size of the byte data in the #GBytes. * * This function will always return the same value for a given #GBytes. * * Returns: the size * * Since: 2.32 */ gsize g_bytes_get_size (GBytes *bytes) { g_return_val_if_fail (bytes != NULL, 0); return bytes->size; } /** * g_bytes_ref: * @bytes: a #GBytes * * Increase the reference count on @bytes. * * Returns: the #GBytes * * Since: 2.32 */ GBytes * g_bytes_ref (GBytes *bytes) { g_return_val_if_fail (bytes != NULL, NULL); g_atomic_int_inc (&bytes->ref_count); return bytes; } /** * g_bytes_unref: * @bytes: (allow-none): a #GBytes * * Releases a reference on @bytes. This may result in the bytes being * freed. * * Since: 2.32 */ void g_bytes_unref (GBytes *bytes) { if (bytes == NULL) return; if (g_atomic_int_dec_and_test (&bytes->ref_count)) { if (bytes->free_func != NULL) bytes->free_func (bytes->user_data); g_slice_free (GBytes, bytes); } } /** * g_bytes_equal: * @bytes1: (type GLib.Bytes): a pointer to a #GBytes * @bytes2: (type GLib.Bytes): a pointer to a #GBytes to compare with @bytes1 * * Compares the two #GBytes values being pointed to and returns * %TRUE if they are equal. * * This function can be passed to g_hash_table_new() as the @key_equal_func * parameter, when using non-%NULL #GBytes pointers as keys in a #GHashTable. * * Returns: %TRUE if the two keys match. * * Since: 2.32 */ gboolean g_bytes_equal (gconstpointer bytes1, gconstpointer bytes2) { const GBytes *b1 = bytes1; const GBytes *b2 = bytes2; g_return_val_if_fail (bytes1 != NULL, FALSE); g_return_val_if_fail (bytes2 != NULL, FALSE); return b1->size == b2->size && memcmp (b1->data, b2->data, b1->size) == 0; } /** * g_bytes_hash: * @bytes: (type GLib.Bytes): a pointer to a #GBytes key * * Creates an integer hash code for the byte data in the #GBytes. * * This function can be passed to g_hash_table_new() as the @key_equal_func * parameter, when using non-%NULL #GBytes pointers as keys in a #GHashTable. * * Returns: a hash value corresponding to the key. * * Since: 2.32 */ guint g_bytes_hash (gconstpointer bytes) { const GBytes *a = bytes; const signed char *p, *e; guint32 h = 5381; g_return_val_if_fail (bytes != NULL, 0); for (p = (signed char *)a->data, e = (signed char *)a->data + a->size; p != e; p++) h = (h << 5) + h + *p; return h; } /** * g_bytes_compare: * @bytes1: (type GLib.Bytes): a pointer to a #GBytes * @bytes2: (type GLib.Bytes): a pointer to a #GBytes to compare with @bytes1 * * Compares the two #GBytes values. * * This function can be used to sort GBytes instances in lexographical order. * * Returns: a negative value if bytes2 is lesser, a positive value if bytes2 is * greater, and zero if bytes2 is equal to bytes1 * * Since: 2.32 */ gint g_bytes_compare (gconstpointer bytes1, gconstpointer bytes2) { const GBytes *b1 = bytes1; const GBytes *b2 = bytes2; gint ret; g_return_val_if_fail (bytes1 != NULL, 0); g_return_val_if_fail (bytes2 != NULL, 0); ret = memcmp (b1->data, b2->data, MIN (b1->size, b2->size)); if (ret == 0 && b1->size != b2->size) ret = b1->size < b2->size ? -1 : 1; return ret; } static gpointer try_steal_and_unref (GBytes *bytes, GDestroyNotify free_func, gsize *size) { gpointer result; if (bytes->free_func != free_func || bytes->data == NULL) return NULL; /* Are we the only reference? */ if (g_atomic_int_get (&bytes->ref_count) == 1) { *size = bytes->size; result = (gpointer)bytes->data; g_slice_free (GBytes, bytes); return result; } return NULL; } /** * g_bytes_unref_to_data: * @bytes: (transfer full): a #GBytes * @size: location to place the length of the returned data * * Unreferences the bytes, and returns a pointer the same byte data * contents. * * As an optimization, the byte data is returned without copying if this was * the last reference to bytes and bytes was created with g_bytes_new(), * g_bytes_new_take() or g_byte_array_free_to_bytes(). In all other cases the * data is copied. * * Returns: (transfer full): a pointer to the same byte data, which should * be freed with g_free() * * Since: 2.32 */ gpointer g_bytes_unref_to_data (GBytes *bytes, gsize *size) { gpointer result; g_return_val_if_fail (bytes != NULL, NULL); g_return_val_if_fail (size != NULL, NULL); /* * Optimal path: if this is was the last reference, then we can return * the data from this GBytes without copying. */ result = try_steal_and_unref (bytes, g_free, size); if (result == NULL) { /* * Copy: Non g_malloc (or compatible) allocator, or static memory, * so we have to copy, and then unref. */ result = g_memdup (bytes->data, bytes->size); *size = bytes->size; g_bytes_unref (bytes); } return result; } /** * g_bytes_unref_to_array: * @bytes: (transfer full): a #GBytes * * Unreferences the bytes, and returns a new mutable #GByteArray containing * the same byte data. * * As an optimization, the byte data is transferred to the array without copying * if this was the last reference to bytes and bytes was created with * g_bytes_new(), g_bytes_new_take() or g_byte_array_free_to_bytes(). In all * other cases the data is copied. * * Returns: (transfer full): a new mutable #GByteArray containing the same byte data * * Since: 2.32 */ GByteArray * g_bytes_unref_to_array (GBytes *bytes) { gpointer data; gsize size; g_return_val_if_fail (bytes != NULL, NULL); data = g_bytes_unref_to_data (bytes, &size); return g_byte_array_new_take (data, size); } pkg-config-0.29.1/glib/glib/gvariant.h0000664000175000017500000005661712651243552014414 00000000000000/* * Copyright © 2007, 2008 Ryan Lortie * Copyright © 2009, 2010 Codethink Limited * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the licence, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * * Author: Ryan Lortie */ #ifndef __G_VARIANT_H__ #define __G_VARIANT_H__ #if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) #error "Only can be included directly." #endif #include #include #include G_BEGIN_DECLS typedef struct _GVariant GVariant; typedef enum { G_VARIANT_CLASS_BOOLEAN = 'b', G_VARIANT_CLASS_BYTE = 'y', G_VARIANT_CLASS_INT16 = 'n', G_VARIANT_CLASS_UINT16 = 'q', G_VARIANT_CLASS_INT32 = 'i', G_VARIANT_CLASS_UINT32 = 'u', G_VARIANT_CLASS_INT64 = 'x', G_VARIANT_CLASS_UINT64 = 't', G_VARIANT_CLASS_HANDLE = 'h', G_VARIANT_CLASS_DOUBLE = 'd', G_VARIANT_CLASS_STRING = 's', G_VARIANT_CLASS_OBJECT_PATH = 'o', G_VARIANT_CLASS_SIGNATURE = 'g', G_VARIANT_CLASS_VARIANT = 'v', G_VARIANT_CLASS_MAYBE = 'm', G_VARIANT_CLASS_ARRAY = 'a', G_VARIANT_CLASS_TUPLE = '(', 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, gboolean trusted, GDestroyNotify notify, gpointer user_data); typedef struct _GVariantIter GVariantIter; struct _GVariantIter { /*< private >*/ 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, ...); typedef struct _GVariantBuilder GVariantBuilder; struct _GVariantBuilder { /*< private >*/ gsize x[16]; }; typedef enum { G_VARIANT_PARSE_ERROR_FAILED, G_VARIANT_PARSE_ERROR_BASIC_TYPE_EXPECTED, G_VARIANT_PARSE_ERROR_CANNOT_INFER_TYPE, G_VARIANT_PARSE_ERROR_DEFINITE_TYPE_EXPECTED, G_VARIANT_PARSE_ERROR_INPUT_NOT_AT_END, G_VARIANT_PARSE_ERROR_INVALID_CHARACTER, G_VARIANT_PARSE_ERROR_INVALID_FORMAT_STRING, G_VARIANT_PARSE_ERROR_INVALID_OBJECT_PATH, G_VARIANT_PARSE_ERROR_INVALID_SIGNATURE, G_VARIANT_PARSE_ERROR_INVALID_TYPE_STRING, G_VARIANT_PARSE_ERROR_NO_COMMON_TYPE, G_VARIANT_PARSE_ERROR_NUMBER_OUT_OF_RANGE, G_VARIANT_PARSE_ERROR_NUMBER_TOO_BIG, G_VARIANT_PARSE_ERROR_TYPE_ERROR, G_VARIANT_PARSE_ERROR_UNEXPECTED_TOKEN, G_VARIANT_PARSE_ERROR_UNKNOWN_KEYWORD, G_VARIANT_PARSE_ERROR_UNTERMINATED_STRING_CONSTANT, G_VARIANT_PARSE_ERROR_VALUE_EXPECTED } 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 #endif /* __G_VARIANT_H__ */ pkg-config-0.29.1/glib/glib/glib-init.c0000664000175000017500000001570612651243552014444 00000000000000/* * Copyright © 2011 Canonical Limited * * This library is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2 of the * licence, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, * USA. * * Author: Ryan Lortie */ #include "config.h" #include "glib-init.h" #include "gutils.h" /* for GDebugKey */ #include "gconstructor.h" #include #include #include #include /** * g_mem_gc_friendly: * * This variable is %TRUE if the G_DEBUG environment variable * includes the key gc-friendly. */ #ifdef ENABLE_GC_FRIENDLY_DEFAULT gboolean g_mem_gc_friendly = TRUE; #else gboolean g_mem_gc_friendly = FALSE; #endif GLogLevelFlags g_log_msg_prefix = G_LOG_LEVEL_ERROR | G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL | G_LOG_LEVEL_DEBUG; GLogLevelFlags g_log_always_fatal = G_LOG_FATAL_MASK; static gboolean debug_key_matches (const gchar *key, const gchar *token, guint length) { /* may not call GLib functions: see note in g_parse_debug_string() */ for (; length; length--, key++, token++) { char k = (*key == '_') ? '-' : tolower (*key ); char t = (*token == '_') ? '-' : tolower (*token); if (k != t) return FALSE; } return *key == '\0'; } /** * g_parse_debug_string: * @string: (allow-none): a list of debug options separated by colons, spaces, or * commas, or %NULL. * @keys: (array length=nkeys): pointer to an array of #GDebugKey which associate * strings with bit flags. * @nkeys: the number of #GDebugKeys in the array. * * Parses a string containing debugging options * into a %guint containing bit flags. This is used * within GDK and GTK+ to parse the debug options passed on the * command line or through environment variables. * * If @string is equal to "all", all flags are set. Any flags * specified along with "all" in @string are inverted; thus, * "all,foo,bar" or "foo,bar,all" sets all flags * except those corresponding to "foo" and "bar". * * If @string is equal to "help", all the available keys in @keys * are printed out to standard error. * * Returns: the combined set of bit flags. */ guint g_parse_debug_string (const gchar *string, const GDebugKey *keys, guint nkeys) { guint i; guint result = 0; if (string == NULL) return 0; /* this function is used during the initialisation of gmessages, gmem * and gslice, so it may not do anything that causes memory to be * allocated or risks messages being emitted. * * this means, more or less, that this code may not call anything * inside GLib. */ if (!strcasecmp (string, "help")) { /* using stdio directly for the reason stated above */ fprintf (stderr, "Supported debug values:"); for (i = 0; i < nkeys; i++) fprintf (stderr, " %s", keys[i].key); fprintf (stderr, " all help\n"); } else { const gchar *p = string; const gchar *q; gboolean invert = FALSE; while (*p) { q = strpbrk (p, ":;, \t"); if (!q) q = p + strlen (p); if (debug_key_matches ("all", p, q - p)) { invert = TRUE; } else { for (i = 0; i < nkeys; i++) if (debug_key_matches (keys[i].key, p, q - p)) result |= keys[i].value; } p = q; if (*p) p++; } if (invert) { guint all_flags = 0; for (i = 0; i < nkeys; i++) all_flags |= keys[i].value; result = all_flags & (~result); } } return result; } static guint g_parse_debug_envvar (const gchar *envvar, const GDebugKey *keys, gint n_keys, guint default_value) { const gchar *value; #ifdef OS_WIN32 /* "fatal-warnings,fatal-criticals,all,help" is pretty short */ gchar buffer[100]; if (GetEnvironmentVariable (envvar, buffer, 100) < 100) value = buffer; else return 0; #else value = getenv (envvar); #endif if (value == NULL) return default_value; return g_parse_debug_string (value, keys, n_keys); } static void g_messages_prefixed_init (void) { const GDebugKey keys[] = { { "error", G_LOG_LEVEL_ERROR }, { "critical", G_LOG_LEVEL_CRITICAL }, { "warning", G_LOG_LEVEL_WARNING }, { "message", G_LOG_LEVEL_MESSAGE }, { "info", G_LOG_LEVEL_INFO }, { "debug", G_LOG_LEVEL_DEBUG } }; g_log_msg_prefix = g_parse_debug_envvar ("G_MESSAGES_PREFIXED", keys, G_N_ELEMENTS (keys), g_log_msg_prefix); } static void g_debug_init (void) { const GDebugKey keys[] = { { "gc-friendly", 1 }, {"fatal-warnings", G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL }, {"fatal-criticals", G_LOG_LEVEL_CRITICAL } }; GLogLevelFlags flags; flags = g_parse_debug_envvar ("G_DEBUG", keys, G_N_ELEMENTS (keys), 0); g_log_always_fatal |= flags & G_LOG_LEVEL_MASK; g_mem_gc_friendly = flags & 1; } static void glib_init (void) { g_messages_prefixed_init (); g_debug_init (); } #if defined (G_OS_WIN32) BOOL WINAPI DllMain (HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved); HMODULE glib_dll; #endif #if defined (G_OS_WIN32) && !defined (GLIB_STATIC_COMPILATION) BOOL WINAPI DllMain (HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { switch (fdwReason) { 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: /* do nothing */ ; } return TRUE; } #elif defined (G_HAS_CONSTRUCTORS) #ifdef G_DEFINE_CONSTRUCTOR_NEEDS_PRAGMA #pragma G_DEFINE_CONSTRUCTOR_PRAGMA_ARGS(glib_init_ctor) #endif G_DEFINE_CONSTRUCTOR(glib_init_ctor) static void glib_init_ctor (void) { #ifdef G_OS_WIN32 g_clock_win32_init (); g_thread_win32_init (); #endif glib_init (); } #else # error Your platform/compiler is missing constructor support #endif pkg-config-0.29.1/glib/glib/gmain.c0000664000175000017500000044346112651243552013664 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * gmain.c: Main loop abstraction, timeouts, and idle functions * Copyright 1998 Owen Taylor * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the GLib Team and others 1997-2000. See the AUTHORS * file for a list of people on the GLib Team. See the ChangeLog * files for a list of changes. These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/. */ /* * MT safe */ #include "config.h" #include "glibconfig.h" /* Uncomment the next line (and the corresponding line in gpoll.c) to * enable debugging printouts if the environment variable * G_MAIN_POLL_DEBUG is set to some value. */ /* #define G_MAIN_POLL_DEBUG */ #ifdef _WIN32 /* Always enable debugging printout on Windows, as it is more often * needed there... */ #define G_MAIN_POLL_DEBUG #endif #ifdef G_OS_UNIX #include "glib-unix.h" #include #ifdef HAVE_EVENTFD #include #endif #endif #include #include #include #include #ifdef HAVE_SYS_TIME_H #include #endif /* HAVE_SYS_TIME_H */ #ifdef HAVE_UNISTD_H #include #endif /* HAVE_UNISTD_H */ #include #include #ifdef G_OS_WIN32 #define STRICT #include #endif /* G_OS_WIN32 */ #ifdef G_OS_BEOS #include #include #endif /* G_OS_BEOS */ #include "gmain.h" #include "garray.h" #include "giochannel.h" #include "ghash.h" #include "ghook.h" #include "gqueue.h" #include "gstrfuncs.h" #include "gtestutils.h" #ifdef G_OS_WIN32 #include "gwin32.h" #endif #ifdef G_MAIN_POLL_DEBUG #include "gtimer.h" #endif #include "gwakeup.h" #include "gmain-internal.h" #include "glib-init.h" #include "glib-private.h" /** * SECTION:main * @title: The Main Event Loop * @short_description: manages all available sources of events * * The main event loop manages all the available sources of events for * GLib and GTK+ applications. These events can come from any number of * different types of sources such as file descriptors (plain files, * pipes or sockets) and timeouts. New types of event sources can also * be added using g_source_attach(). * * To allow multiple independent sets of sources to be handled in * different threads, each source is associated with a #GMainContext. * A GMainContext can only be running in a single thread, but * sources can be added to it and removed from it from other threads. * * Each event source is assigned a priority. The default priority, * #G_PRIORITY_DEFAULT, is 0. Values less than 0 denote higher priorities. * Values greater than 0 denote lower priorities. Events from high priority * sources are always processed before events from lower priority sources. * * Idle functions can also be added, and assigned a priority. These will * be run whenever no events with a higher priority are ready to be processed. * * The #GMainLoop data type represents a main event loop. A GMainLoop is * created with g_main_loop_new(). After adding the initial event sources, * g_main_loop_run() is called. This continuously checks for new events from * each of the event sources and dispatches them. Finally, the processing of * an event from one of the sources leads to a call to g_main_loop_quit() to * exit the main loop, and g_main_loop_run() returns. * * It is possible to create new instances of #GMainLoop recursively. * This is often used in GTK+ applications when showing modal dialog * boxes. Note that event sources are associated with a particular * #GMainContext, and will be checked and dispatched for all main * loops associated with that GMainContext. * * GTK+ contains wrappers of some of these functions, e.g. gtk_main(), * gtk_main_quit() and gtk_events_pending(). * * Creating new source types * One of the unusual features of the #GMainLoop functionality * is that new types of event source can be created and used in * addition to the builtin type of event source. A new event source * type is used for handling GDK events. A new source type is created * by deriving from the #GSource structure. * The derived type of source is represented by a structure that has * the #GSource structure as a first element, and other elements specific * to the new source type. To create an instance of the new source type, * call g_source_new() passing in the size of the derived structure and * a table of functions. These #GSourceFuncs determine the behavior of * the new source type. * New source types basically interact with the main context * in two ways. Their prepare function in #GSourceFuncs can set a timeout * to determine the maximum amount of time that the main loop will sleep * before checking the source again. In addition, or as well, the source * can add file descriptors to the set that the main context checks using * g_source_add_poll(). * * Customizing the main loop iteration * Single iterations of a #GMainContext can be run with * g_main_context_iteration(). In some cases, more detailed control * of exactly how the details of the main loop work is desired, for * instance, when integrating the #GMainLoop with an external main loop. * In such cases, you can call the component functions of * g_main_context_iteration() directly. These functions are * g_main_context_prepare(), g_main_context_query(), * g_main_context_check() and g_main_context_dispatch(). * The operation of these functions can best be seen in terms * of a state diagram, as shown in . *
States of a Main Context * *
*
* * On Unix, the GLib mainloop is incompatible with fork(). Any program * using the mainloop must either exec() or exit() from the child * without returning to the mainloop. */ /* Types */ typedef struct _GTimeoutSource GTimeoutSource; typedef struct _GChildWatchSource GChildWatchSource; typedef struct _GUnixSignalWatchSource GUnixSignalWatchSource; typedef struct _GPollRec GPollRec; typedef struct _GSourceCallback GSourceCallback; typedef enum { G_SOURCE_READY = 1 << G_HOOK_FLAG_USER_SHIFT, G_SOURCE_CAN_RECURSE = 1 << (G_HOOK_FLAG_USER_SHIFT + 1), 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 { GCond *cond; GMutex *mutex; }; typedef struct _GMainDispatch GMainDispatch; struct _GMainDispatch { gint depth; GSList *dispatching_sources; /* stack of current sources */ }; #ifdef G_MAIN_POLL_DEBUG gboolean _g_main_poll_debug = FALSE; #endif struct _GMainContext { /* The following lock is used for both the list of sources * and the list of poll records */ GMutex mutex; GCond cond; GThread *owner; guint owner_count; GSList *waiters; gint ref_count; GPtrArray *pending_dispatches; gint timeout; /* Timeout for current iteration */ guint next_id; GHashTable *overflow_used_source_ids; /* set */ GList *source_lists; gint in_check_or_prepare; GPollRec *poll_records, *poll_records_tail; guint n_poll_records; GPollFD *cached_poll_array; guint cached_poll_array_size; GWakeup *wakeup; GPollFD wake_up_rec; /* Flag indicating whether the set of fd's changed during a poll */ gboolean poll_changed; GPollFunc poll_func; gint64 time; gboolean time_is_fresh; }; struct _GSourceCallback { guint ref_count; GSourceFunc func; gpointer data; GDestroyNotify notify; }; struct _GMainLoop { GMainContext *context; gboolean is_running; gint ref_count; }; struct _GTimeoutSource { GSource source; guint interval; gboolean seconds; }; struct _GChildWatchSource { GSource source; GPid pid; gint child_status; #ifdef G_OS_WIN32 GPollFD poll; #else /* G_OS_WIN32 */ gboolean child_exited; #endif /* G_OS_WIN32 */ }; struct _GUnixSignalWatchSource { GSource source; int signum; gboolean pending; }; struct _GPollRec { GPollFD *fd; GPollRec *prev; GPollRec *next; gint priority; }; 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 () #define SOURCE_DESTROYED(source) (((source)->flags & G_HOOK_FLAG_ACTIVE) == 0) #define SOURCE_BLOCKED(source) (((source)->flags & G_SOURCE_BLOCKED) != 0) #define SOURCE_UNREF(source, context) \ G_STMT_START { \ if ((source)->ref_count > 1) \ (source)->ref_count--; \ else \ g_source_unref_internal ((source), (context), TRUE); \ } G_STMT_END /* Forward declarations */ static void g_source_unref_internal (GSource *source, GMainContext *context, gboolean have_lock); static void g_source_destroy_internal (GSource *source, GMainContext *context, gboolean have_lock); static void g_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, GPollFD *fds, gint n_fds); static void g_main_context_add_poll_unlocked (GMainContext *context, gint priority, GPollFD *fd); static void g_main_context_remove_poll_unlocked (GMainContext *context, GPollFD *fd); static void g_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); static gboolean g_child_watch_prepare (GSource *source, gint *timeout); static gboolean g_child_watch_check (GSource *source); static gboolean g_child_watch_dispatch (GSource *source, GSourceFunc callback, gpointer user_data); static void g_child_watch_finalize (GSource *source); #ifdef G_OS_UNIX static void g_unix_signal_handler (int signum); static gboolean g_unix_signal_watch_prepare (GSource *source, gint *timeout); static gboolean g_unix_signal_watch_check (GSource *source); static gboolean g_unix_signal_watch_dispatch (GSource *source, GSourceFunc callback, gpointer user_data); static void g_unix_signal_watch_finalize (GSource *source); #endif static gboolean g_idle_prepare (GSource *source, gint *timeout); static gboolean g_idle_check (GSource *source); static gboolean g_idle_dispatch (GSource *source, GSourceFunc callback, gpointer user_data); static void block_source (GSource *source); static GMainContext *glib_worker_context; G_LOCK_DEFINE_STATIC (main_loop); static GMainContext *default_main_context; #ifndef G_OS_WIN32 /* UNIX signals work by marking one of these variables then waking the * worker context to check on them and dispatch accordingly. */ #ifdef HAVE_SIG_ATOMIC_T static volatile sig_atomic_t unix_signal_pending[NSIG]; static volatile sig_atomic_t any_unix_signal_pending; #else 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; GSourceFuncs g_unix_signal_funcs = { g_unix_signal_watch_prepare, g_unix_signal_watch_check, g_unix_signal_watch_dispatch, g_unix_signal_watch_finalize }; #endif /* !G_OS_WIN32 */ G_LOCK_DEFINE_STATIC (main_context_list); static GSList *main_context_list = NULL; GSourceFuncs g_timeout_funcs = { NULL, /* prepare */ NULL, /* check */ g_timeout_dispatch, NULL }; GSourceFuncs g_child_watch_funcs = { g_child_watch_prepare, g_child_watch_check, g_child_watch_dispatch, g_child_watch_finalize }; GSourceFuncs g_idle_funcs = { g_idle_prepare, g_idle_check, g_idle_dispatch, NULL }; /** * g_main_context_ref: * @context: a #GMainContext * * Increases the reference count on a #GMainContext object by one. * * Returns: the @context that was passed in (since 2.6) **/ GMainContext * g_main_context_ref (GMainContext *context) { g_return_val_if_fail (context != NULL, NULL); g_return_val_if_fail (g_atomic_int_get (&context->ref_count) > 0, NULL); g_atomic_int_inc (&context->ref_count); return context; } static inline void poll_rec_list_free (GMainContext *context, GPollRec *list) { g_slice_free_chain (GPollRec, list, next); } /** * g_main_context_unref: * @context: a #GMainContext * * Decreases the reference count on a #GMainContext object by one. If * the result is zero, free the context and free all associated memory. **/ void g_main_context_unref (GMainContext *context) { 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); if (!g_atomic_int_dec_and_test (&context->ref_count)) return; G_LOCK (main_context_list); main_context_list = g_slist_remove (main_context_list, context); G_UNLOCK (main_context_list); /* 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) { 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); g_ptr_array_free (context->pending_dispatches, TRUE); g_free (context->cached_poll_array); poll_rec_list_free (context, context->poll_records); g_wakeup_free (context->wakeup); g_cond_clear (&context->cond); 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: * * Creates a new #GMainContext structure. * * Return value: the new #GMainContext **/ GMainContext * g_main_context_new (void) { static gsize initialised; GMainContext *context; if (g_once_init_enter (&initialised)) { #ifdef G_MAIN_POLL_DEBUG if (getenv ("G_MAIN_POLL_DEBUG") != NULL) _g_main_poll_debug = TRUE; #endif g_once_init_leave (&initialised, TRUE); } context = g_new0 (GMainContext, 1); g_mutex_init (&context->mutex); g_cond_init (&context->cond); context->owner = NULL; context->waiters = NULL; context->ref_count = 1; context->next_id = 1; context->source_lists = NULL; context->poll_func = g_poll; context->cached_poll_array = NULL; context->cached_poll_array_size = 0; context->pending_dispatches = g_ptr_array_new (); context->time_is_fresh = FALSE; context->wakeup = g_wakeup_new (); g_wakeup_get_pollfd (context->wakeup, &context->wake_up_rec); g_main_context_add_poll_unlocked (context, 0, &context->wake_up_rec); G_LOCK (main_context_list); main_context_list = g_slist_append (main_context_list, context); #ifdef G_MAIN_POLL_DEBUG if (_g_main_poll_debug) g_print ("created context=%p\n", context); #endif G_UNLOCK (main_context_list); return context; } /** * g_main_context_default: * * Returns the global default main context. This is the main context * used for main loop functions when a main loop is not explicitly * specified, and corresponds to the "main" main loop. See also * g_main_context_get_thread_default(). * * Return value: (transfer none): the global default main context. **/ GMainContext * g_main_context_default (void) { /* Slow, but safe */ G_LOCK (main_loop); if (!default_main_context) { default_main_context = g_main_context_new (); #ifdef G_MAIN_POLL_DEBUG if (_g_main_poll_debug) g_print ("default context=%p\n", default_main_context); #endif } G_UNLOCK (main_loop); return default_main_context; } static void free_context (gpointer data) { GMainContext *context = data; g_main_context_release (context); if (context) g_main_context_unref (context); } static void free_context_stack (gpointer data) { g_queue_free_full((GQueue *) data, (GDestroyNotify) free_context); } static GPrivate thread_context_stack = G_PRIVATE_INIT (free_context_stack); /** * g_main_context_push_thread_default: * @context: (allow-none): a #GMainContext, or %NULL for the global default context * * Acquires @context and sets it as the thread-default context for the * current thread. This will cause certain asynchronous operations * (such as most gio-based I/O) which are * started in this thread to run under @context and deliver their * results to its main loop, rather than running under the global * default context in the main thread. Note that calling this function * changes the context returned by * g_main_context_get_thread_default(), not the * one returned by g_main_context_default(), so it does not affect the * context used by functions like g_idle_add(). * * Normally you would call this function shortly after creating a new * thread, passing it a #GMainContext which will be run by a * #GMainLoop in that thread, to set a new default context for all * async operations in that thread. (In this case, you don't need to * ever call g_main_context_pop_thread_default().) In some cases * however, you may want to schedule a single operation in a * non-default context, or temporarily use a non-default context in * the main thread. In that case, you can wrap the call to the * asynchronous operation inside a * g_main_context_push_thread_default() / * g_main_context_pop_thread_default() pair, but it is up to you to * ensure that no other asynchronous operations accidentally get * started while the non-default context is active. * * Beware that libraries that predate this function may not correctly * handle being used from a thread with a thread-default context. Eg, * see g_file_supports_thread_contexts(). * * Since: 2.22 **/ void g_main_context_push_thread_default (GMainContext *context) { GQueue *stack; gboolean acquired_context; acquired_context = g_main_context_acquire (context); g_return_if_fail (acquired_context); if (context == g_main_context_default ()) context = NULL; else if (context) g_main_context_ref (context); stack = g_private_get (&thread_context_stack); if (!stack) { stack = g_queue_new (); g_private_set (&thread_context_stack, stack); } g_queue_push_head (stack, context); } /** * g_main_context_pop_thread_default: * @context: (allow-none): a #GMainContext object, or %NULL * * Pops @context off the thread-default context stack (verifying that * it was on the top of the stack). * * Since: 2.22 **/ void g_main_context_pop_thread_default (GMainContext *context) { GQueue *stack; if (context == g_main_context_default ()) context = NULL; stack = g_private_get (&thread_context_stack); g_return_if_fail (stack != NULL); g_return_if_fail (g_queue_peek_head (stack) == context); g_queue_pop_head (stack); g_main_context_release (context); if (context) g_main_context_unref (context); } /** * g_main_context_get_thread_default: * * Gets the thread-default #GMainContext for this thread. Asynchronous * operations that want to be able to be run in contexts other than * the default one should call this method or * g_main_context_ref_thread_default() to get a #GMainContext to add * their #GSources to. (Note that even in single-threaded * programs applications may sometimes want to temporarily push a * non-default context, so it is not safe to assume that this will * always return %NULL if you are running in the default thread.) * * If you need to hold a reference on the context, use * g_main_context_ref_thread_default() instead. * * Returns: (transfer none): the thread-default #GMainContext, or * %NULL if the thread-default context is the global default context. * * Since: 2.22 **/ GMainContext * g_main_context_get_thread_default (void) { GQueue *stack; stack = g_private_get (&thread_context_stack); if (stack) return g_queue_peek_head (stack); else return NULL; } /** * g_main_context_ref_thread_default: * * Gets the thread-default #GMainContext for this thread, as with * g_main_context_get_thread_default(), but also adds a reference to * it with g_main_context_ref(). In addition, unlike * g_main_context_get_thread_default(), if the thread-default context * is the global default context, this will return that #GMainContext * (with a ref added to it) rather than returning %NULL. * * Returns: (transfer full): the thread-default #GMainContext. Unref * with g_main_context_unref() when you are done with it. * * Since: 2.32 */ GMainContext * g_main_context_ref_thread_default (void) { GMainContext *context; context = g_main_context_get_thread_default (); if (!context) context = g_main_context_default (); return g_main_context_ref (context); } /* Hooks for adding to the main loop */ /** * g_source_new: * @source_funcs: structure containing functions that implement * the sources behavior. * @struct_size: size of the #GSource structure to create. * * Creates a new #GSource structure. The size is specified to * allow creating structures derived from #GSource that contain * additional data. The size passed in must be at least * sizeof (GSource). * * The source will not initially be associated with any #GMainContext * and must be added to one with g_source_attach() before it will be * executed. * * Return value: the newly-created #GSource. **/ GSource * g_source_new (GSourceFuncs *source_funcs, guint struct_size) { GSource *source; g_return_val_if_fail (source_funcs != NULL, NULL); g_return_val_if_fail (struct_size >= sizeof (GSource), NULL); source = (GSource*) g_malloc0 (struct_size); source->priv = g_slice_new0 (GSourcePrivate); source->source_funcs = source_funcs; source->ref_count = 1; source->priority = G_PRIORITY_DEFAULT; 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 source_add_to_context (GSource *source, GMainContext *context) { 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 */ prev = source->priv->parent_source->prev; next = source->priv->parent_source; } else { prev = source_list->tail; next = NULL; } source->next = next; if (next) next->prev = source; else source_list->tail = source; source->prev = prev; if (prev) prev->next = source; else source_list->head = source; } /* Holds context's lock */ static void 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 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, gboolean do_wakeup) { GSList *tmp_list; source->context = context; assign_source_id_unlocked (context, source); source->ref_count++; source_add_to_context (source, context); if (!SOURCE_BLOCKED (source)) { 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); } tmp_list = source->priv->child_sources; while (tmp_list) { g_source_attach_unlocked (tmp_list->data, context, FALSE); tmp_list = tmp_list->next; } /* 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; } /** * g_source_attach: * @source: a #GSource * @context: (allow-none): a #GMainContext (if %NULL, the default context will be used) * * Adds a #GSource to a @context so that it will be executed within * that context. Remove it by calling g_source_destroy(). * * Return value: the ID (greater than 0) for the source within the * #GMainContext. **/ guint g_source_attach (GSource *source, GMainContext *context) { guint result = 0; g_return_val_if_fail (source->context == NULL, 0); g_return_val_if_fail (!SOURCE_DESTROYED (source), 0); if (!context) context = g_main_context_default (); LOCK_CONTEXT (context); result = g_source_attach_unlocked (source, context, TRUE); UNLOCK_CONTEXT (context); return result; } static void g_source_destroy_internal (GSource *source, GMainContext *context, gboolean have_lock) { if (!have_lock) LOCK_CONTEXT (context); if (!SOURCE_DESTROYED (source)) { GSList *tmp_list; gpointer old_cb_data; GSourceCallbackFuncs *old_cb_funcs; source->flags &= ~G_HOOK_FLAG_ACTIVE; old_cb_data = source->callback_data; old_cb_funcs = source->callback_funcs; source->callback_data = NULL; source->callback_funcs = NULL; if (old_cb_funcs) { UNLOCK_CONTEXT (context); old_cb_funcs->unref (old_cb_data); LOCK_CONTEXT (context); } if (!SOURCE_BLOCKED (source)) { tmp_list = source->poll_fds; while (tmp_list) { g_main_context_remove_poll_unlocked (context, tmp_list->data); tmp_list = tmp_list->next; } 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); } if (!have_lock) UNLOCK_CONTEXT (context); } /** * g_source_destroy: * @source: a #GSource * * Removes a source from its #GMainContext, if any, and mark it as * destroyed. The source cannot be subsequently added to another * context. **/ void g_source_destroy (GSource *source) { GMainContext *context; g_return_if_fail (source != NULL); context = source->context; if (context) g_source_destroy_internal (source, context, FALSE); else source->flags &= ~G_HOOK_FLAG_ACTIVE; } /** * g_source_get_id: * @source: a #GSource * * Returns the numeric ID for a particular source. The ID of a source * is a positive integer which is unique within a particular main loop * context. The reverse * mapping from ID to source is done by g_main_context_find_source_by_id(). * * Return value: the ID (greater than 0) for the source **/ guint g_source_get_id (GSource *source) { guint result; g_return_val_if_fail (source != NULL, 0); g_return_val_if_fail (source->context != NULL, 0); LOCK_CONTEXT (source->context); result = source->source_id; UNLOCK_CONTEXT (source->context); return result; } /** * g_source_get_context: * @source: a #GSource * * Gets the #GMainContext with which the source is associated. * * 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 * yet been added to a source. **/ GMainContext * g_source_get_context (GSource *source) { g_return_val_if_fail (source->context != NULL || !SOURCE_DESTROYED (source), NULL); return source->context; } /** * g_source_add_poll: * @source:a #GSource * @fd: a #GPollFD structure holding information about a file * descriptor to watch. * * Adds a file descriptor to the set of file descriptors polled for * this source. This is usually combined with g_source_new() to add an * event source. The event source's check function will typically test * the @revents field in the #GPollFD struct and return %TRUE if events need * to be processed. * * 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, GPollFD *fd) { GMainContext *context; g_return_if_fail (source != NULL); g_return_if_fail (fd != NULL); g_return_if_fail (!SOURCE_DESTROYED (source)); context = source->context; if (context) LOCK_CONTEXT (context); source->poll_fds = g_slist_prepend (source->poll_fds, fd); if (context) { if (!SOURCE_BLOCKED (source)) g_main_context_add_poll_unlocked (context, source->priority, fd); UNLOCK_CONTEXT (context); } } /** * g_source_remove_poll: * @source:a #GSource * @fd: a #GPollFD structure previously passed to g_source_add_poll(). * * Removes a file descriptor from the set of file descriptors polled for * this source. **/ void g_source_remove_poll (GSource *source, GPollFD *fd) { GMainContext *context; g_return_if_fail (source != NULL); g_return_if_fail (fd != NULL); g_return_if_fail (!SOURCE_DESTROYED (source)); context = source->context; if (context) LOCK_CONTEXT (context); source->poll_fds = g_slist_remove (source->poll_fds, fd); if (context) { if (!SOURCE_BLOCKED (source)) g_main_context_remove_poll_unlocked (context, fd); UNLOCK_CONTEXT (context); } } /** * g_source_add_child_source: * @source:a #GSource * @child_source: a second #GSource that @source should "poll" * * Adds @child_source to @source as a "polled" source; when @source is * added to a #GMainContext, @child_source will be automatically added * with the same priority, when @child_source is triggered, it will * cause @source to dispatch (in addition to calling its own * callback), and when @source is destroyed, it will destroy * @child_source as well. (@source will also still be dispatched if * its own prepare/check functions indicate that it is ready.) * * If you don't need @child_source to do anything on its own when it * triggers, you can call g_source_set_dummy_callback() on it to set a * callback that does nothing (except return %TRUE if appropriate). * * @source will hold a reference on @child_source while @child_source * is attached to it. * * Since: 2.28 **/ void g_source_add_child_source (GSource *source, GSource *child_source) { GMainContext *context; g_return_if_fail (source != NULL); g_return_if_fail (child_source != NULL); 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->parent_source == NULL); context = source->context; if (context) LOCK_CONTEXT (context); 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); } } 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 * @child_source: a #GSource previously passed to * g_source_add_child_source(). * * Detaches @child_source from @source and destroys it. * * Since: 2.28 **/ void g_source_remove_child_source (GSource *source, GSource *child_source) { GMainContext *context; g_return_if_fail (source != NULL); g_return_if_fail (child_source != NULL); 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)); context = source->context; if (context) LOCK_CONTEXT (context); g_child_source_remove_internal (child_source, context); if (context) UNLOCK_CONTEXT (context); } /** * g_source_set_callback_indirect: * @source: the source * @callback_data: pointer to callback data "object" * @callback_funcs: functions for reference counting @callback_data * and getting the callback and data * * Sets the callback function storing the data as a refcounted callback * "object". This is used internally. Note that calling * g_source_set_callback_indirect() assumes * an initial reference count on @callback_data, and thus * @callback_funcs->unref will eventually be called once more * than @callback_funcs->ref. **/ void g_source_set_callback_indirect (GSource *source, gpointer callback_data, GSourceCallbackFuncs *callback_funcs) { GMainContext *context; gpointer old_cb_data; GSourceCallbackFuncs *old_cb_funcs; g_return_if_fail (source != NULL); g_return_if_fail (callback_funcs != NULL || callback_data == NULL); context = source->context; if (context) LOCK_CONTEXT (context); old_cb_data = source->callback_data; old_cb_funcs = source->callback_funcs; source->callback_data = callback_data; source->callback_funcs = callback_funcs; if (context) UNLOCK_CONTEXT (context); if (old_cb_funcs) old_cb_funcs->unref (old_cb_data); } static void g_source_callback_ref (gpointer cb_data) { GSourceCallback *callback = cb_data; callback->ref_count++; } static void g_source_callback_unref (gpointer cb_data) { GSourceCallback *callback = cb_data; callback->ref_count--; if (callback->ref_count == 0) { if (callback->notify) callback->notify (callback->data); g_free (callback); } } static void g_source_callback_get (gpointer cb_data, GSource *source, GSourceFunc *func, gpointer *data) { GSourceCallback *callback = cb_data; *func = callback->func; *data = callback->data; } static GSourceCallbackFuncs g_source_callback_funcs = { g_source_callback_ref, g_source_callback_unref, g_source_callback_get, }; /** * g_source_set_callback: * @source: the source * @func: a callback function * @data: the data to pass to callback function * @notify: (allow-none): a function to call when @data is no longer in use, or %NULL. * * Sets the callback function for a source. The callback for a source is * called from the source's dispatch function. * * The exact type of @func depends on the type of source; ie. you * should not count on @func being called with @data as its first * parameter. * * Typically, you won't use this function. Instead use functions specific * to the type of source you are using. **/ void g_source_set_callback (GSource *source, GSourceFunc func, gpointer data, GDestroyNotify notify) { GSourceCallback *new_callback; g_return_if_fail (source != NULL); new_callback = g_new (GSourceCallback, 1); new_callback->ref_count = 1; new_callback->func = func; new_callback->data = data; new_callback->notify = notify; g_source_set_callback_indirect (source, new_callback, &g_source_callback_funcs); } /** * g_source_set_funcs: * @source: a #GSource * @funcs: the new #GSourceFuncs * * Sets the source functions (can be used to override * default implementations) of an unattached source. * * Since: 2.12 */ void g_source_set_funcs (GSource *source, GSourceFuncs *funcs) { g_return_if_fail (source != NULL); g_return_if_fail (source->context == NULL); g_return_if_fail (source->ref_count > 0); g_return_if_fail (funcs != NULL); source->source_funcs = funcs; } static void g_source_set_priority_unlocked (GSource *source, GMainContext *context, gint priority) { GSList *tmp_list; 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 after so it is sorted in the correct place */ source_remove_from_context (source, source->context); } source->priority = priority; if (context) { source_add_to_context (source, source->context); if (!SOURCE_BLOCKED (source)) { tmp_list = source->poll_fds; while (tmp_list) { g_main_context_remove_poll_unlocked (context, tmp_list->data); g_main_context_add_poll_unlocked (context, priority, tmp_list->data); tmp_list = tmp_list->next; } 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->child_sources) { tmp_list = source->priv->child_sources; while (tmp_list) { g_source_set_priority_unlocked (tmp_list->data, context, priority); tmp_list = tmp_list->next; } } } /** * g_source_set_priority: * @source: a #GSource * @priority: the new priority. * * Sets the priority of a source. While the main loop is being run, a * source will be dispatched if it is ready to be dispatched and no * sources at a higher (numerically smaller) priority are ready to be * dispatched. **/ void g_source_set_priority (GSource *source, gint priority) { GMainContext *context; g_return_if_fail (source != NULL); context = source->context; if (context) LOCK_CONTEXT (context); g_source_set_priority_unlocked (source, context, priority); if (context) UNLOCK_CONTEXT (source->context); } /** * g_source_get_priority: * @source: a #GSource * * Gets the priority of a source. * * Return value: the priority of the source **/ gint g_source_get_priority (GSource *source) { g_return_val_if_fail (source != NULL, 0); return source->priority; } /** * g_source_set_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 * * Sets whether a source can be called recursively. If @can_recurse is * %TRUE, then while the source is being dispatched then this source * will be processed normally. Otherwise, all processing of this * source is blocked until the dispatch function returns. **/ void g_source_set_can_recurse (GSource *source, gboolean can_recurse) { GMainContext *context; g_return_if_fail (source != NULL); context = source->context; if (context) LOCK_CONTEXT (context); if (can_recurse) source->flags |= G_SOURCE_CAN_RECURSE; else source->flags &= ~G_SOURCE_CAN_RECURSE; if (context) UNLOCK_CONTEXT (context); } /** * g_source_get_can_recurse: * @source: a #GSource * * Checks whether a source is allowed to be called recursively. * see g_source_set_can_recurse(). * * Return value: whether recursion is allowed. **/ gboolean g_source_get_can_recurse (GSource *source) { g_return_val_if_fail (source != NULL, FALSE); return (source->flags & G_SOURCE_CAN_RECURSE) != 0; } /** * g_source_set_name: * @source: a #GSource * @name: debug name for the source * * Sets a name for the source, used in debugging and profiling. * The name defaults to #NULL. * * The source name should describe in a human-readable way * what the source does. For example, "X11 event queue" * or "GTK+ repaint idle handler" or whatever it is. * * It is permitted to call this function multiple times, but is not * recommended due to the potential performance impact. For example, * one could change the name in the "check" function of a #GSourceFuncs * to include details like the event type in the source name. * * Since: 2.26 **/ void g_source_set_name (GSource *source, const char *name) { g_return_if_fail (source != NULL); /* setting back to NULL is allowed, just because it's * weird if get_name can return NULL but you can't * set that. */ g_free (source->name); source->name = g_strdup (name); } /** * g_source_get_name: * @source: a #GSource * * Gets a name for the source, used in debugging and profiling. * The name may be #NULL if it has never been set with * g_source_set_name(). * * Return value: the name of the source * Since: 2.26 **/ const char * g_source_get_name (GSource *source) { g_return_val_if_fail (source != NULL, NULL); return source->name; } /** * g_source_set_name_by_id: * @tag: a #GSource ID * @name: debug name for the source * * Sets the name of a source using its ID. * * This is a convenience utility to set source names from the return * value of g_idle_add(), g_timeout_add(), etc. * * Since: 2.26 **/ void g_source_set_name_by_id (guint tag, const char *name) { GSource *source; g_return_if_fail (tag > 0); source = g_main_context_find_source_by_id (NULL, tag); if (source == NULL) return; g_source_set_name (source, name); } /** * g_source_ref: * @source: a #GSource * * Increases the reference count on a source by one. * * Return value: @source **/ GSource * g_source_ref (GSource *source) { GMainContext *context; g_return_val_if_fail (source != NULL, NULL); context = source->context; if (context) LOCK_CONTEXT (context); source->ref_count++; if (context) UNLOCK_CONTEXT (context); return source; } /* g_source_unref() but possible to call within context lock */ static void g_source_unref_internal (GSource *source, GMainContext *context, gboolean have_lock) { gpointer old_cb_data = NULL; GSourceCallbackFuncs *old_cb_funcs = NULL; g_return_if_fail (source != NULL); if (!have_lock && context) LOCK_CONTEXT (context); source->ref_count--; if (source->ref_count == 0) { old_cb_data = source->callback_data; old_cb_funcs = source->callback_funcs; source->callback_data = NULL; source->callback_funcs = NULL; if (context) { if (!SOURCE_DESTROYED (source)) g_warning (G_STRLOC ": ref_count == 0, but source was still attached to a context!"); source_remove_from_context (source, context); } if (source->source_funcs->finalize) { if (context) UNLOCK_CONTEXT (context); source->source_funcs->finalize (source); if (context) LOCK_CONTEXT (context); } g_free (source->name); source->name = NULL; g_slist_free (source->poll_fds); source->poll_fds = NULL; g_slist_free_full (source->priv->fds, g_free); g_slice_free (GSourcePrivate, source->priv); source->priv = NULL; g_free (source); } if (!have_lock && context) UNLOCK_CONTEXT (context); if (old_cb_funcs) { if (have_lock) UNLOCK_CONTEXT (context); old_cb_funcs->unref (old_cb_data); if (have_lock) LOCK_CONTEXT (context); } } /** * g_source_unref: * @source: a #GSource * * Decreases the reference count of a source by one. If the * resulting reference count is zero the source and associated * memory will be destroyed. **/ void g_source_unref (GSource *source) { g_return_if_fail (source != NULL); g_source_unref_internal (source, source->context, FALSE); } /** * g_main_context_find_source_by_id: * @context: (allow-none): a #GMainContext (if %NULL, the default context will be used) * @source_id: the source ID, as returned by g_source_get_id(). * * Finds a #GSource given a pair of context and ID. * * Return value: (transfer none): the #GSource if found, otherwise, %NULL **/ 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); if (context == NULL) context = g_main_context_default (); LOCK_CONTEXT (context); g_source_iter_init (&iter, context, FALSE); while (g_source_iter_next (&iter, &source)) { if (!SOURCE_DESTROYED (source) && source->source_id == source_id) break; } g_source_iter_clear (&iter); UNLOCK_CONTEXT (context); return source; } /** * g_main_context_find_source_by_funcs_user_data: * @context: (allow-none): a #GMainContext (if %NULL, the default context will be used). * @funcs: the @source_funcs passed to g_source_new(). * @user_data: the user data from the callback. * * Finds a source with the given source functions and user data. If * multiple sources exist with the same source function and user data, * the first one found will be returned. * * Return value: (transfer none): the source, if one was found, otherwise %NULL **/ GSource * g_main_context_find_source_by_funcs_user_data (GMainContext *context, GSourceFuncs *funcs, gpointer user_data) { GSourceIter iter; GSource *source; g_return_val_if_fail (funcs != NULL, NULL); if (context == NULL) context = g_main_context_default (); LOCK_CONTEXT (context); g_source_iter_init (&iter, context, FALSE); while (g_source_iter_next (&iter, &source)) { if (!SOURCE_DESTROYED (source) && source->source_funcs == funcs && source->callback_funcs) { GSourceFunc callback; gpointer callback_data; source->callback_funcs->get (source->callback_data, source, &callback, &callback_data); if (callback_data == user_data) break; } } g_source_iter_clear (&iter); UNLOCK_CONTEXT (context); return source; } /** * g_main_context_find_source_by_user_data: * @context: a #GMainContext * @user_data: the user_data for the callback. * * Finds a source with the given user data for the callback. If * multiple sources exist with the same user data, the first * one found will be returned. * * Return value: (transfer none): the source, if one was found, otherwise %NULL **/ GSource * g_main_context_find_source_by_user_data (GMainContext *context, gpointer user_data) { GSourceIter iter; GSource *source; if (context == NULL) context = g_main_context_default (); LOCK_CONTEXT (context); g_source_iter_init (&iter, context, FALSE); while (g_source_iter_next (&iter, &source)) { if (!SOURCE_DESTROYED (source) && source->callback_funcs) { GSourceFunc callback; gpointer callback_data = NULL; source->callback_funcs->get (source->callback_data, source, &callback, &callback_data); if (callback_data == user_data) break; } } g_source_iter_clear (&iter); UNLOCK_CONTEXT (context); return source; } /** * g_source_remove: * @tag: the ID of the source to remove. * * Removes the source with the given id from the default main context. * The id of * a #GSource is given by g_source_get_id(), or will be returned by the * functions g_source_attach(), g_idle_add(), g_idle_add_full(), * g_timeout_add(), g_timeout_add_full(), g_child_watch_add(), * g_child_watch_add_full(), g_io_add_watch(), and g_io_add_watch_full(). * * See also g_source_destroy(). You must use g_source_destroy() for sources * added to a non-default main context. * * Return value: %TRUE if the source was found and removed. **/ gboolean g_source_remove (guint tag) { GSource *source; g_return_val_if_fail (tag > 0, FALSE); source = g_main_context_find_source_by_id (NULL, tag); if (source) g_source_destroy (source); return source != NULL; } /** * g_source_remove_by_user_data: * @user_data: the user_data for the callback. * * Removes a source from the default main loop context given the user * data for the callback. If multiple sources exist with the same user * data, only one will be destroyed. * * Return value: %TRUE if a source was found and removed. **/ gboolean g_source_remove_by_user_data (gpointer user_data) { GSource *source; source = g_main_context_find_source_by_user_data (NULL, user_data); if (source) { g_source_destroy (source); return TRUE; } else return FALSE; } /** * g_source_remove_by_funcs_user_data: * @funcs: The @source_funcs passed to g_source_new() * @user_data: the user data for the callback * * Removes a source from the default main loop context given the * source functions and user data. If multiple sources exist with the * same source functions and user data, only one will be destroyed. * * Return value: %TRUE if a source was found and removed. **/ gboolean g_source_remove_by_funcs_user_data (GSourceFuncs *funcs, gpointer user_data) { GSource *source; g_return_val_if_fail (funcs != NULL, FALSE); source = g_main_context_find_source_by_funcs_user_data (NULL, funcs, user_data); if (source) { g_source_destroy (source); return TRUE; } else return FALSE; } #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. * * Equivalent to the UNIX gettimeofday() function, but portable. * * You may find g_get_real_time() to be more convenient. **/ void g_get_current_time (GTimeVal *result) { #ifndef G_OS_WIN32 struct timeval r; g_return_if_fail (result != NULL); /*this is required on alpha, there the timeval structs are int's not longs and a cast only would fail horribly*/ gettimeofday (&r, NULL); result->tv_sec = r.tv_sec; result->tv_usec = r.tv_usec; #else FILETIME ft; guint64 time64; g_return_if_fail (result != NULL); GetSystemTimeAsFileTime (&ft); memmove (&time64, &ft, sizeof (FILETIME)); /* Convert from 100s of nanoseconds since 1601-01-01 * to Unix epoch. Yes, this is Y2038 unsafe. */ time64 -= G_GINT64_CONSTANT (116444736000000000); time64 /= 10; result->tv_sec = time64 / 1000000; result->tv_usec = time64 % 1000000; #endif } /** * g_get_real_time: * * Queries the system wall-clock time. * * This call is functionally equivalent to g_get_current_time() except * that the return value is often more convenient than dealing with a * #GTimeVal. * * You should only use this call if you are actually interested in the real * wall-clock time. g_get_monotonic_time() is probably more useful for * measuring intervals. * * Returns: the number of microseconds since January 1, 1970 UTC. * * Since: 2.28 **/ gint64 g_get_real_time (void) { GTimeVal tv; g_get_current_time (&tv); return (((gint64) tv.tv_sec) * 1000000) + tv.tv_usec; } #ifdef G_OS_WIN32 static ULONGLONG (*g_GetTickCount64) (void) = NULL; static guint32 g_win32_tick_epoch = 0; void g_clock_win32_init (void) { HMODULE kernel32; g_GetTickCount64 = NULL; kernel32 = GetModuleHandle ("KERNEL32.DLL"); if (kernel32 != NULL) g_GetTickCount64 = (void *) GetProcAddress (kernel32, "GetTickCount64"); g_win32_tick_epoch = ((guint32)GetTickCount()) >> 31; } #endif /** * g_get_monotonic_time: * * Queries the system monotonic time, if available. * * On POSIX systems with clock_gettime() and CLOCK_MONOTONIC this call * is a very shallow wrapper for that. Otherwise, we make a best effort * that probably involves returning the wall clock time (with at least * microsecond accuracy, subject to the limitations of the OS kernel). * * It's important to note that POSIX CLOCK_MONOTONIC does * not count time spent while the machine is suspended. * * On Windows, "limitations of the OS kernel" is a rather substantial * statement. Depending on the configuration of the system, the wall * clock time is updated as infrequently as 64 times a second (which * is approximately every 16ms). Also, on XP (but not on Vista or later) * the monotonic clock is locally monotonic, but may differ in exact * value between processes due to timer wrap handling. * * Returns: the monotonic time, in microseconds * * Since: 2.28 **/ gint64 g_get_monotonic_time (void) { #ifdef HAVE_CLOCK_GETTIME /* librt clock_gettime() is our first choice */ struct timespec ts; #ifdef CLOCK_MONOTONIC clock_gettime (CLOCK_MONOTONIC, &ts); #else clock_gettime (CLOCK_REALTIME, &ts); #endif /* In theory monotonic time can have any epoch. * * glib presently assumes the following: * * 1) The epoch comes some time after the birth of Jesus of Nazareth, but * not more than 10000 years later. * * 2) The current time also falls sometime within this range. * * These two reasonable assumptions leave us with a maximum deviation from * the epoch of 10000 years, or 315569520000000000 seconds. * * If we restrict ourselves to this range then the number of microseconds * will always fit well inside the constraints of a int64 (by a factor of * about 29). * * If you actually hit the following assertion, probably you should file a * bug against your operating system for being excessively silly. **/ g_assert (G_GINT64_CONSTANT (-315569520000000000) < ts.tv_sec && ts.tv_sec < G_GINT64_CONSTANT (315569520000000000)); return (((gint64) ts.tv_sec) * 1000000) + (ts.tv_nsec / 1000); #elif defined (G_OS_WIN32) guint64 ticks; guint32 ticks32; /* There are four sources for the monotonic time on Windows: * * Three are based on a (1 msec accuracy, but only read periodically) clock chip: * - GetTickCount (GTC) * 32bit msec counter, updated each ~15msec, wraps in ~50 days * - GetTickCount64 (GTC64) * Same as GetTickCount, but extended to 64bit, so no wrap * Only available in Vista or later * - timeGetTime (TGT) * similar to GetTickCount by default: 15msec, 50 day wrap. * available in winmm.dll (thus known as the multimedia timers) * However apps can raise the system timer clock frequency using timeBeginPeriod() * increasing the accuracy up to 1 msec, at a cost in general system performance * and battery use. * * One is based on high precision clocks: * - QueryPrecisionCounter (QPC) * This has much higher accuracy, but is not guaranteed monotonic, and * has lots of complications like clock jumps and different times on different * CPUs. It also has lower long term accuracy (i.e. it will drift compared to * the low precision clocks. * * Additionally, the precision available in the timer-based wakeup such as * MsgWaitForMultipleObjectsEx (which is what the mainloop is based on) is based * on the TGT resolution, so by default it is ~15msec, but can be increased by apps. * * The QPC timer has too many issues to be used as is. The only way it could be used * is to use it to interpolate the lower precision clocks. Firefox does something like * this: * https://bugzilla.mozilla.org/show_bug.cgi?id=363258 * * However this seems quite complicated, so we're not doing this right now. * * The approach we take instead is to use the TGT timer, extending it to 64bit * either by using the GTC64 value, or if that is not available, a process local * time epoch that we increment when we detect a timer wrap (assumes that we read * the time at least once every 50 days). * * This means that: * - We have a globally consistent monotonic clock on Vista and later * - We have a locally monotonic clock on XP * - Apps that need higher precision in timeouts and clock reads can call * timeBeginPeriod() to increase it as much as they want */ if (g_GetTickCount64 != NULL) { guint32 ticks_as_32bit; ticks = g_GetTickCount64 (); ticks32 = timeGetTime(); /* GTC64 and TGT are sampled at different times, however they * have the same base and source (msecs since system boot). * They can differ by as much as -16 to +16 msecs. * We can't just inject the low bits into the 64bit counter * as one of the counters can have wrapped in 32bit space and * the other not. Instead we calculate the signed difference * in 32bit space and apply that difference to the 64bit counter. */ ticks_as_32bit = (guint32)ticks; /* We could do some 2's complement hack, but we play it safe */ if (ticks32 - ticks_as_32bit <= G_MAXINT32) ticks += ticks32 - ticks_as_32bit; else ticks -= ticks_as_32bit - ticks32; } else { guint32 epoch; epoch = g_atomic_int_get (&g_win32_tick_epoch); /* Must read ticks after the epoch. Then we're guaranteed * that the ticks value we read is higher or equal to any * previous ones that lead to the writing of the epoch. */ ticks32 = timeGetTime(); /* We store the MSB of the current time as the LSB * of the epoch. Comparing these bits lets us detect when * the 32bit counter has wrapped so we can increase the * epoch. * * This will work as long as this function is called at * least once every ~24 days, which is half the wrap time * of a 32bit msec counter. I think this is pretty likely. * * Note that g_win32_tick_epoch is a process local state, * so the monotonic clock will not be the same between * processes. */ if ((ticks32 >> 31) != (epoch & 1)) { epoch++; g_atomic_int_set (&g_win32_tick_epoch, epoch); } ticks = (guint64)ticks32 | ((guint64)epoch) << 31; } return ticks * 1000; #else /* !HAVE_CLOCK_GETTIME && ! G_OS_WIN32*/ GTimeVal tv; g_get_current_time (&tv); return (((gint64) tv.tv_sec) * 1000000) + tv.tv_usec; #endif } static void g_main_dispatch_free (gpointer dispatch) { g_slice_free (GMainDispatch, dispatch); } /* Running the main loop */ static GMainDispatch * get_dispatch (void) { static GPrivate depth_private = G_PRIVATE_INIT (g_main_dispatch_free); GMainDispatch *dispatch; dispatch = g_private_get (&depth_private); if (!dispatch) { dispatch = g_slice_new0 (GMainDispatch); g_private_set (&depth_private, dispatch); } return dispatch; } /** * g_main_depth: * * Returns the depth of the stack of calls to * g_main_context_dispatch() on any #GMainContext in the current thread. * That is, when called from the toplevel, it gives 0. When * called from within a callback from g_main_context_iteration() * (or g_main_loop_run(), etc.) it returns 1. When called from within * a callback to a recursive call to g_main_context_iteration(), * it returns 2. And so forth. * * This function is useful in a situation like the following: * Imagine an extremely simple "garbage collected" system. * * |[ * static GList *free_list; * * gpointer * allocate_memory (gsize size) * { * gpointer result = g_malloc (size); * free_list = g_list_prepend (free_list, result); * return result; * } * * void * free_allocated_memory (void) * { * GList *l; * for (l = free_list; l; l = l->next); * g_free (l->data); * g_list_free (free_list); * free_list = NULL; * } * * [...] * * while (TRUE); * { * g_main_context_iteration (NULL, TRUE); * free_allocated_memory(); * } * ]| * * This works from an application, however, if you want to do the same * thing from a library, it gets more difficult, since you no longer * control the main loop. You might think you can simply use an idle * function to make the call to free_allocated_memory(), but that * doesn't work, since the idle function could be called from a * recursive callback. This can be fixed by using g_main_depth() * * |[ * gpointer * allocate_memory (gsize size) * { * FreeListBlock *block = g_new (FreeListBlock, 1); * block->mem = g_malloc (size); * block->depth = g_main_depth (); * free_list = g_list_prepend (free_list, block); * return block->mem; * } * * void * free_allocated_memory (void) * { * GList *l; * * int depth = g_main_depth (); * for (l = free_list; l; ); * { * GList *next = l->next; * FreeListBlock *block = l->data; * if (block->depth > depth) * { * g_free (block->mem); * g_free (block); * free_list = g_list_delete_link (free_list, l); * } * * l = next; * } * } * ]| * * There is a temptation to use g_main_depth() to solve * problems with reentrancy. For instance, while waiting for data * to be received from the network in response to a menu item, * the menu item might be selected again. It might seem that * one could make the menu item's callback return immediately * and do nothing if g_main_depth() returns a value greater than 1. * However, this should be avoided since the user then sees selecting * the menu item do nothing. Furthermore, you'll find yourself adding * these checks all over your code, since there are doubtless many, * many things that the user could do. Instead, you can use the * following techniques: * * * * * Use gtk_widget_set_sensitive() or modal dialogs to prevent * the user from interacting with elements while the main * loop is recursing. * * * * * Avoid main loop recursion in situations where you can't handle * arbitrary callbacks. Instead, structure your code so that you * simply return to the main loop and then get called again when * there is more work to do. * * * * * Return value: The main loop recursion level in the current thread **/ int g_main_depth (void) { GMainDispatch *dispatch = get_dispatch (); return dispatch->depth; } /** * g_main_current_source: * * Returns the currently firing source for this thread. * * Return value: (transfer none): The currently firing source or %NULL. * * Since: 2.12 */ GSource * g_main_current_source (void) { GMainDispatch *dispatch = get_dispatch (); return dispatch->dispatching_sources ? dispatch->dispatching_sources->data : NULL; } /** * g_source_is_destroyed: * @source: a #GSource * * Returns whether @source has been destroyed. * * This is important when you operate upon your objects * from within idle handlers, but may have freed the object * before the dispatch of your idle handler. * * |[ * static gboolean * idle_callback (gpointer data) * { * SomeWidget *self = data; * * GDK_THREADS_ENTER (); * /* do stuff with self */ * self->idle_id = 0; * GDK_THREADS_LEAVE (); * * return G_SOURCE_REMOVE; * } * * static void * some_widget_do_stuff_later (SomeWidget *self) * { * self->idle_id = g_idle_add (idle_callback, self); * } * * static void * some_widget_finalize (GObject *object) * { * SomeWidget *self = SOME_WIDGET (object); * * if (self->idle_id) * g_source_remove (self->idle_id); * * G_OBJECT_CLASS (parent_class)->finalize (object); * } * ]| * * This will fail in a multi-threaded application if the * widget is destroyed before the idle handler fires due * to the use after free in the callback. A solution, to * this particular problem, is to check to if the source * has already been destroy within the callback. * * |[ * static gboolean * idle_callback (gpointer data) * { * SomeWidget *self = data; * * GDK_THREADS_ENTER (); * if (!g_source_is_destroyed (g_main_current_source ())) * { * /* do stuff with self */ * } * GDK_THREADS_LEAVE (); * * return FALSE; * } * ]| * * Return value: %TRUE if the source has been destroyed * * Since: 2.12 */ gboolean g_source_is_destroyed (GSource *source) { return SOURCE_DESTROYED (source); } /* Temporarily remove all this source's file descriptors from the * poll(), so that if data comes available for one of the file descriptors * we don't continually spin in the poll() */ /* HOLDS: source->context's lock */ static void block_source (GSource *source) { GSList *tmp_list; g_return_if_fail (!SOURCE_BLOCKED (source)); source->flags |= G_SOURCE_BLOCKED; if (source->context) { 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) { tmp_list = source->priv->child_sources; while (tmp_list) { block_source (tmp_list->data); tmp_list = tmp_list->next; } } } /* HOLDS: source->context's lock */ static void unblock_source (GSource *source) { GSList *tmp_list; g_return_if_fail (SOURCE_BLOCKED (source)); /* Source already unblocked */ g_return_if_fail (!SOURCE_DESTROYED (source)); source->flags &= ~G_SOURCE_BLOCKED; tmp_list = source->poll_fds; while (tmp_list) { g_main_context_add_poll_unlocked (source->context, source->priority, tmp_list->data); tmp_list = tmp_list->next; } 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; while (tmp_list) { unblock_source (tmp_list->data); tmp_list = tmp_list->next; } } } /* HOLDS: context's lock */ static void g_main_dispatch (GMainContext *context) { GMainDispatch *current = get_dispatch (); guint i; for (i = 0; i < context->pending_dispatches->len; i++) { GSource *source = context->pending_dispatches->pdata[i]; context->pending_dispatches->pdata[i] = NULL; g_assert (source); source->flags &= ~G_SOURCE_READY; if (!SOURCE_DESTROYED (source)) { gboolean was_in_call; gpointer user_data = NULL; GSourceFunc callback = NULL; GSourceCallbackFuncs *cb_funcs; gpointer cb_data; gboolean need_destroy; gboolean (*dispatch) (GSource *, GSourceFunc, gpointer); GSList current_source_link; dispatch = source->source_funcs->dispatch; cb_funcs = source->callback_funcs; cb_data = source->callback_data; if (cb_funcs) cb_funcs->ref (cb_data); if ((source->flags & G_SOURCE_CAN_RECURSE) == 0) block_source (source); was_in_call = source->flags & G_HOOK_FLAG_IN_CALL; source->flags |= G_HOOK_FLAG_IN_CALL; if (cb_funcs) cb_funcs->get (cb_data, source, &callback, &user_data); UNLOCK_CONTEXT (context); current->depth++; /* The on-stack allocation of the GSList is unconventional, but * we know that the lifetime of the link is bounded to this * function as the link is kept in a thread specific list and * not manipulated outside of this function and its descendants. * Avoiding the overhead of a g_slist_alloc() is useful as many * applications do little more than dispatch events. * * This is a performance hack - do not revert to g_slist_prepend()! */ current_source_link.data = source; current_source_link.next = current->dispatching_sources; current->dispatching_sources = ¤t_source_link; need_destroy = ! dispatch (source, callback, user_data); g_assert (current->dispatching_sources == ¤t_source_link); current->dispatching_sources = current_source_link.next; current->depth--; if (cb_funcs) cb_funcs->unref (cb_data); LOCK_CONTEXT (context); if (!was_in_call) source->flags &= ~G_HOOK_FLAG_IN_CALL; if (SOURCE_BLOCKED (source) && !SOURCE_DESTROYED (source)) unblock_source (source); /* Note: this depends on the fact that we can't switch * sources from one main context to another */ if (need_destroy && !SOURCE_DESTROYED (source)) { g_assert (source->context == context); g_source_destroy_internal (source, context, TRUE); } } SOURCE_UNREF (source, context); } g_ptr_array_set_size (context->pending_dispatches, 0); } /** * g_main_context_acquire: * @context: a #GMainContext * * Tries to become the owner of the specified context. * If some other thread is the owner of the context, * returns %FALSE immediately. Ownership is properly * recursive: the owner can require ownership again * and will release ownership when g_main_context_release() * is called as many times as g_main_context_acquire(). * * You must be the owner of a context before you * can call g_main_context_prepare(), g_main_context_query(), * g_main_context_check(), g_main_context_dispatch(). * * Return value: %TRUE if the operation succeeded, and * this thread is now the owner of @context. **/ gboolean g_main_context_acquire (GMainContext *context) { gboolean result = FALSE; GThread *self = G_THREAD_SELF; if (context == NULL) context = g_main_context_default (); LOCK_CONTEXT (context); if (!context->owner) { context->owner = self; g_assert (context->owner_count == 0); } if (context->owner == self) { context->owner_count++; result = TRUE; } UNLOCK_CONTEXT (context); return result; } /** * g_main_context_release: * @context: a #GMainContext * * Releases ownership of a context previously acquired by this thread * with g_main_context_acquire(). If the context was acquired multiple * times, the ownership will be released only when g_main_context_release() * is called as many times as it was acquired. **/ void g_main_context_release (GMainContext *context) { if (context == NULL) context = g_main_context_default (); LOCK_CONTEXT (context); context->owner_count--; if (context->owner_count == 0) { context->owner = NULL; if (context->waiters) { GMainWaiter *waiter = context->waiters->data; gboolean loop_internal_waiter = (waiter->mutex == &context->mutex); context->waiters = g_slist_delete_link (context->waiters, context->waiters); if (!loop_internal_waiter) g_mutex_lock (waiter->mutex); g_cond_signal (waiter->cond); if (!loop_internal_waiter) g_mutex_unlock (waiter->mutex); } } UNLOCK_CONTEXT (context); } /** * g_main_context_wait: * @context: a #GMainContext * @cond: a condition variable * @mutex: a mutex, currently held * * Tries to become the owner of the specified context, * as with g_main_context_acquire(). But if another thread * is the owner, atomically drop @mutex and wait on @cond until * that owner releases ownership or until @cond is signaled, then * try again (once) to become the owner. * * Return value: %TRUE if the operation succeeded, and * this thread is now the owner of @context. **/ gboolean g_main_context_wait (GMainContext *context, GCond *cond, GMutex *mutex) { gboolean result = FALSE; GThread *self = G_THREAD_SELF; gboolean loop_internal_waiter; if (context == NULL) context = g_main_context_default (); loop_internal_waiter = (mutex == &context->mutex); if (!loop_internal_waiter) LOCK_CONTEXT (context); if (context->owner && context->owner != self) { GMainWaiter waiter; waiter.cond = cond; waiter.mutex = mutex; context->waiters = g_slist_append (context->waiters, &waiter); if (!loop_internal_waiter) UNLOCK_CONTEXT (context); g_cond_wait (cond, mutex); if (!loop_internal_waiter) LOCK_CONTEXT (context); context->waiters = g_slist_remove (context->waiters, &waiter); } if (!context->owner) { context->owner = self; g_assert (context->owner_count == 0); } if (context->owner == self) { context->owner_count++; result = TRUE; } if (!loop_internal_waiter) UNLOCK_CONTEXT (context); return result; } /** * g_main_context_prepare: * @context: a #GMainContext * @priority: location to store priority of highest priority * source already ready. * * Prepares to poll sources within a main loop. The resulting information * for polling is determined by calling g_main_context_query (). * * Return value: %TRUE if some source is ready to be dispatched * prior to polling. **/ gboolean g_main_context_prepare (GMainContext *context, gint *priority) { gint i; gint n_ready = 0; gint current_priority = G_MAXINT; GSource *source; GSourceIter iter; if (context == NULL) context = g_main_context_default (); LOCK_CONTEXT (context); context->time_is_fresh = FALSE; if (context->in_check_or_prepare) { g_warning ("g_main_context_prepare() called recursively from within a source's check() or " "prepare() member."); UNLOCK_CONTEXT (context); return FALSE; } #if 0 /* If recursing, finish up current dispatch, before starting over */ if (context->pending_dispatches) { if (dispatch) g_main_dispatch (context, ¤t_time); UNLOCK_CONTEXT (context); return TRUE; } #endif /* If recursing, clear list of pending dispatches */ for (i = 0; i < context->pending_dispatches->len; i++) { if (context->pending_dispatches->pdata[i]) SOURCE_UNREF ((GSource *)context->pending_dispatches->pdata[i], context); } g_ptr_array_set_size (context->pending_dispatches, 0); /* Prepare all sources */ context->timeout = -1; 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)) break; if (!(source->flags & G_SOURCE_READY)) { gboolean result; gboolean (* prepare) (GSource *source, gint *timeout); prepare = source->source_funcs->prepare; if (prepare) { context->in_check_or_prepare++; UNLOCK_CONTEXT (context); 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) { GSource *ready_source = source; while (ready_source) { ready_source->flags |= G_SOURCE_READY; ready_source = ready_source->priv->parent_source; } } } if (source->flags & G_SOURCE_READY) { n_ready++; current_priority = source->priority; context->timeout = 0; } if (source_timeout >= 0) { if (context->timeout < 0) context->timeout = source_timeout; else context->timeout = MIN (context->timeout, source_timeout); } } g_source_iter_clear (&iter); UNLOCK_CONTEXT (context); if (priority) *priority = current_priority; return (n_ready > 0); } /** * g_main_context_query: * @context: a #GMainContext * @max_priority: maximum priority source to check * @timeout_: (out): location to store timeout to be used in polling * @fds: (out caller-allocates) (array length=n_fds): location to * store #GPollFD records that need to be polled. * @n_fds: length of @fds. * * Determines information necessary to poll this main loop. * * Return value: the number of records actually stored in @fds, * or, if more than @n_fds records need to be stored, the number * of records that need to be stored. **/ gint g_main_context_query (GMainContext *context, gint max_priority, gint *timeout, GPollFD *fds, gint n_fds) { gint n_poll; GPollRec *pollrec; LOCK_CONTEXT (context); pollrec = context->poll_records; n_poll = 0; while (pollrec && max_priority >= pollrec->priority) { /* We need to include entries with fd->events == 0 in the array because * otherwise if the application changes fd->events behind our back and * makes it non-zero, we'll be out of sync when we check the fds[] array. * (Changing fd->events after adding an FD wasn't an anticipated use of * this API, but it occurs in practice.) */ if (n_poll < n_fds) { fds[n_poll].fd = pollrec->fd->fd; /* In direct contradiction to the Unix98 spec, IRIX runs into * difficulty if you pass in POLLERR, POLLHUP or POLLNVAL * flags in the events field of the pollfd while it should * just ignoring them. So we mask them out here. */ fds[n_poll].events = pollrec->fd->events & ~(G_IO_ERR|G_IO_HUP|G_IO_NVAL); fds[n_poll].revents = 0; } pollrec = pollrec->next; n_poll++; } context->poll_changed = FALSE; if (timeout) { *timeout = context->timeout; if (*timeout != 0) context->time_is_fresh = FALSE; } UNLOCK_CONTEXT (context); return n_poll; } /** * g_main_context_check: * @context: a #GMainContext * @max_priority: the maximum numerical priority of sources to check * @fds: (array length=n_fds): array of #GPollFD's that was passed to * the last call to g_main_context_query() * @n_fds: return value of g_main_context_query() * * Passes the results of polling back to the main loop. * * Return value: %TRUE if some sources are ready to be dispatched. **/ gboolean g_main_context_check (GMainContext *context, gint max_priority, GPollFD *fds, gint n_fds) { GSource *source; GSourceIter iter; GPollRec *pollrec; gint n_ready = 0; gint i; LOCK_CONTEXT (context); if (context->in_check_or_prepare) { g_warning ("g_main_context_check() called recursively from within a source's check() or " "prepare() member."); UNLOCK_CONTEXT (context); return FALSE; } if (context->wake_up_rec.revents) g_wakeup_acknowledge (context->wakeup); /* If the set of poll file descriptors changed, bail out * and let the main loop rerun */ if (context->poll_changed) { UNLOCK_CONTEXT (context); return FALSE; } pollrec = context->poll_records; i = 0; while (i < n_fds) { if (pollrec->fd->events) pollrec->fd->revents = fds[i].revents; pollrec = pollrec->next; i++; } 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)) break; if (!(source->flags & G_SOURCE_READY)) { 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; } if (result) { GSource *ready_source = source; while (ready_source) { ready_source->flags |= G_SOURCE_READY; ready_source = ready_source->priv->parent_source; } } } if (source->flags & G_SOURCE_READY) { source->ref_count++; g_ptr_array_add (context->pending_dispatches, source); n_ready++; /* never dispatch sources with less priority than the first * one we choose to dispatch */ max_priority = source->priority; } } g_source_iter_clear (&iter); UNLOCK_CONTEXT (context); return n_ready > 0; } /** * g_main_context_dispatch: * @context: a #GMainContext * * Dispatches all pending sources. **/ void g_main_context_dispatch (GMainContext *context) { LOCK_CONTEXT (context); if (context->pending_dispatches->len > 0) { g_main_dispatch (context); } UNLOCK_CONTEXT (context); } /* HOLDS context lock */ static gboolean g_main_context_iterate (GMainContext *context, gboolean block, gboolean dispatch, GThread *self) { gint max_priority; gint timeout; gboolean some_ready; gint nfds, allocated_nfds; GPollFD *fds = NULL; UNLOCK_CONTEXT (context); if (!g_main_context_acquire (context)) { gboolean got_ownership; LOCK_CONTEXT (context); if (!block) return FALSE; got_ownership = g_main_context_wait (context, &context->cond, &context->mutex); if (!got_ownership) return FALSE; } else LOCK_CONTEXT (context); if (!context->cached_poll_array) { context->cached_poll_array_size = context->n_poll_records; context->cached_poll_array = g_new (GPollFD, context->n_poll_records); } allocated_nfds = context->cached_poll_array_size; fds = context->cached_poll_array; UNLOCK_CONTEXT (context); g_main_context_prepare (context, &max_priority); while ((nfds = g_main_context_query (context, max_priority, &timeout, fds, allocated_nfds)) > allocated_nfds) { LOCK_CONTEXT (context); g_free (fds); context->cached_poll_array_size = allocated_nfds = nfds; context->cached_poll_array = fds = g_new (GPollFD, nfds); UNLOCK_CONTEXT (context); } if (!block) timeout = 0; g_main_context_poll (context, timeout, max_priority, fds, nfds); some_ready = g_main_context_check (context, max_priority, fds, nfds); if (dispatch) g_main_context_dispatch (context); g_main_context_release (context); LOCK_CONTEXT (context); return some_ready; } /** * g_main_context_pending: * @context: (allow-none): a #GMainContext (if %NULL, the default context will be used) * * Checks if any sources have pending events for the given context. * * Return value: %TRUE if events are pending. **/ gboolean g_main_context_pending (GMainContext *context) { gboolean retval; if (!context) context = g_main_context_default(); LOCK_CONTEXT (context); retval = g_main_context_iterate (context, FALSE, FALSE, G_THREAD_SELF); UNLOCK_CONTEXT (context); return retval; } /** * g_main_context_iteration: * @context: (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 * 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 wait may * be interrupted for other reasons than an event source becoming ready. * * Return value: %TRUE if events were dispatched. **/ gboolean g_main_context_iteration (GMainContext *context, gboolean may_block) { gboolean retval; if (!context) context = g_main_context_default(); LOCK_CONTEXT (context); retval = g_main_context_iterate (context, may_block, TRUE, G_THREAD_SELF); UNLOCK_CONTEXT (context); return retval; } /** * g_main_loop_new: * @context: (allow-none): a #GMainContext (if %NULL, the default context will be used). * @is_running: set to %TRUE to indicate that the loop is running. This * is not very important since calling g_main_loop_run() will set this to * %TRUE anyway. * * Creates a new #GMainLoop structure. * * Return value: a new #GMainLoop. **/ GMainLoop * g_main_loop_new (GMainContext *context, gboolean is_running) { GMainLoop *loop; if (!context) context = g_main_context_default(); g_main_context_ref (context); loop = g_new0 (GMainLoop, 1); loop->context = context; loop->is_running = is_running != FALSE; loop->ref_count = 1; return loop; } /** * g_main_loop_ref: * @loop: a #GMainLoop * * Increases the reference count on a #GMainLoop object by one. * * Return value: @loop **/ GMainLoop * g_main_loop_ref (GMainLoop *loop) { g_return_val_if_fail (loop != NULL, NULL); g_return_val_if_fail (g_atomic_int_get (&loop->ref_count) > 0, NULL); g_atomic_int_inc (&loop->ref_count); return loop; } /** * g_main_loop_unref: * @loop: a #GMainLoop * * Decreases the reference count on a #GMainLoop object by one. If * the result is zero, free the loop and free all associated memory. **/ void g_main_loop_unref (GMainLoop *loop) { g_return_if_fail (loop != NULL); g_return_if_fail (g_atomic_int_get (&loop->ref_count) > 0); if (!g_atomic_int_dec_and_test (&loop->ref_count)) return; g_main_context_unref (loop->context); g_free (loop); } /** * g_main_loop_run: * @loop: a #GMainLoop * * Runs a main loop until g_main_loop_quit() is called on the loop. * If this is called for the thread of the loop's #GMainContext, * it will process events from the loop, otherwise it will * simply wait. **/ void g_main_loop_run (GMainLoop *loop) { GThread *self = G_THREAD_SELF; g_return_if_fail (loop != NULL); g_return_if_fail (g_atomic_int_get (&loop->ref_count) > 0); if (!g_main_context_acquire (loop->context)) { gboolean got_ownership = FALSE; /* Another thread owns this context */ LOCK_CONTEXT (loop->context); g_atomic_int_inc (&loop->ref_count); if (!loop->is_running) loop->is_running = TRUE; while (loop->is_running && !got_ownership) got_ownership = g_main_context_wait (loop->context, &loop->context->cond, &loop->context->mutex); if (!loop->is_running) { UNLOCK_CONTEXT (loop->context); if (got_ownership) g_main_context_release (loop->context); g_main_loop_unref (loop); return; } g_assert (got_ownership); } else LOCK_CONTEXT (loop->context); if (loop->context->in_check_or_prepare) { g_warning ("g_main_loop_run(): called recursively from within a source's " "check() or prepare() member, iteration not possible."); return; } g_atomic_int_inc (&loop->ref_count); loop->is_running = TRUE; while (loop->is_running) g_main_context_iterate (loop->context, TRUE, TRUE, self); UNLOCK_CONTEXT (loop->context); g_main_context_release (loop->context); g_main_loop_unref (loop); } /** * g_main_loop_quit: * @loop: a #GMainLoop * * Stops a #GMainLoop from running. Any calls to g_main_loop_run() * for the loop will return. * * Note that sources that have already been dispatched when * g_main_loop_quit() is called will still be executed. **/ void g_main_loop_quit (GMainLoop *loop) { g_return_if_fail (loop != NULL); g_return_if_fail (g_atomic_int_get (&loop->ref_count) > 0); LOCK_CONTEXT (loop->context); loop->is_running = FALSE; g_wakeup_signal (loop->context->wakeup); g_cond_broadcast (&loop->context->cond); UNLOCK_CONTEXT (loop->context); } /** * g_main_loop_is_running: * @loop: a #GMainLoop. * * Checks to see if the main loop is currently being run via g_main_loop_run(). * * Return value: %TRUE if the mainloop is currently being run. **/ gboolean g_main_loop_is_running (GMainLoop *loop) { g_return_val_if_fail (loop != NULL, FALSE); g_return_val_if_fail (g_atomic_int_get (&loop->ref_count) > 0, FALSE); return loop->is_running; } /** * g_main_loop_get_context: * @loop: a #GMainLoop. * * Returns the #GMainContext of @loop. * * Return value: (transfer none): the #GMainContext of @loop **/ GMainContext * g_main_loop_get_context (GMainLoop *loop) { g_return_val_if_fail (loop != NULL, NULL); g_return_val_if_fail (g_atomic_int_get (&loop->ref_count) > 0, NULL); return loop->context; } /* HOLDS: context's lock */ static void g_main_context_poll (GMainContext *context, gint timeout, gint priority, GPollFD *fds, gint n_fds) { #ifdef G_MAIN_POLL_DEBUG GTimer *poll_timer; GPollRec *pollrec; gint i; #endif GPollFunc poll_func; if (n_fds || timeout != 0) { #ifdef G_MAIN_POLL_DEBUG if (_g_main_poll_debug) { g_print ("polling context=%p n=%d timeout=%d\n", context, n_fds, timeout); poll_timer = g_timer_new (); } #endif LOCK_CONTEXT (context); poll_func = context->poll_func; UNLOCK_CONTEXT (context); if ((*poll_func) (fds, n_fds, timeout) < 0 && errno != EINTR) { #ifndef G_OS_WIN32 g_warning ("poll(2) failed due to: %s.", g_strerror (errno)); #else /* If g_poll () returns -1, it has already called g_warning() */ #endif } #ifdef G_MAIN_POLL_DEBUG if (_g_main_poll_debug) { LOCK_CONTEXT (context); g_print ("g_main_poll(%d) timeout: %d - elapsed %12.10f seconds", n_fds, timeout, g_timer_elapsed (poll_timer, NULL)); g_timer_destroy (poll_timer); pollrec = context->poll_records; while (pollrec != NULL) { i = 0; while (i < n_fds) { if (fds[i].fd == pollrec->fd->fd && pollrec->fd->events && fds[i].revents) { g_print (" [" G_POLLFD_FORMAT " :", fds[i].fd); if (fds[i].revents & G_IO_IN) g_print ("i"); if (fds[i].revents & G_IO_OUT) g_print ("o"); if (fds[i].revents & G_IO_PRI) g_print ("p"); if (fds[i].revents & G_IO_ERR) g_print ("e"); if (fds[i].revents & G_IO_HUP) g_print ("h"); if (fds[i].revents & G_IO_NVAL) g_print ("n"); g_print ("]"); } i++; } pollrec = pollrec->next; } g_print ("\n"); UNLOCK_CONTEXT (context); } #endif } /* if (n_fds || timeout != 0) */ } /** * g_main_context_add_poll: * @context: (allow-none): a #GMainContext (or %NULL for the default context) * @fd: a #GPollFD structure holding information about a file * descriptor to watch. * @priority: the priority for this file descriptor which should be * the same as the priority used for g_source_attach() to ensure that the * file descriptor is polled whenever the results may be needed. * * Adds a file descriptor to the set of file descriptors polled for * this context. This will very seldom be used directly. Instead * a typical event source will use g_source_add_unix_fd() instead. **/ void g_main_context_add_poll (GMainContext *context, GPollFD *fd, gint priority) { if (!context) context = g_main_context_default (); g_return_if_fail (g_atomic_int_get (&context->ref_count) > 0); g_return_if_fail (fd); LOCK_CONTEXT (context); g_main_context_add_poll_unlocked (context, priority, fd); UNLOCK_CONTEXT (context); } /* HOLDS: main_loop_lock */ static void g_main_context_add_poll_unlocked (GMainContext *context, gint priority, GPollFD *fd) { GPollRec *prevrec, *nextrec; GPollRec *newrec = g_slice_new (GPollRec); /* This file descriptor may be checked before we ever poll */ fd->revents = 0; newrec->fd = fd; newrec->priority = priority; prevrec = context->poll_records_tail; nextrec = NULL; while (prevrec && priority < prevrec->priority) { nextrec = prevrec; prevrec = prevrec->prev; } if (prevrec) prevrec->next = newrec; else context->poll_records = newrec; newrec->prev = prevrec; newrec->next = nextrec; if (nextrec) nextrec->prev = newrec; else context->poll_records_tail = newrec; context->n_poll_records++; context->poll_changed = TRUE; /* Now wake up the main loop if it is waiting in the poll() */ g_wakeup_signal (context->wakeup); } /** * g_main_context_remove_poll: * @context:a #GMainContext * @fd: a #GPollFD descriptor previously added with g_main_context_add_poll() * * Removes file descriptor from the set of file descriptors to be * polled for a particular context. **/ void g_main_context_remove_poll (GMainContext *context, GPollFD *fd) { if (!context) context = g_main_context_default (); g_return_if_fail (g_atomic_int_get (&context->ref_count) > 0); g_return_if_fail (fd); LOCK_CONTEXT (context); g_main_context_remove_poll_unlocked (context, fd); UNLOCK_CONTEXT (context); } static void g_main_context_remove_poll_unlocked (GMainContext *context, GPollFD *fd) { GPollRec *pollrec, *prevrec, *nextrec; prevrec = NULL; pollrec = context->poll_records; while (pollrec) { nextrec = pollrec->next; if (pollrec->fd == fd) { if (prevrec != NULL) prevrec->next = nextrec; else context->poll_records = nextrec; if (nextrec != NULL) nextrec->prev = prevrec; else context->poll_records_tail = prevrec; g_slice_free (GPollRec, pollrec); context->n_poll_records--; break; } prevrec = pollrec; pollrec = nextrec; } context->poll_changed = TRUE; /* Now wake up the main loop if it is waiting in the poll() */ g_wakeup_signal (context->wakeup); } /** * g_source_get_current_time: * @source: a #GSource * @timeval: #GTimeVal structure in which to store current time. * * This function ignores @source and is otherwise the same as * g_get_current_time(). * * Deprecated: 2.28: use g_source_get_time() instead **/ void g_source_get_current_time (GSource *source, GTimeVal *timeval) { g_get_current_time (timeval); } /** * g_source_get_time: * @source: a #GSource * * Gets the time to be used when checking this source. The advantage of * calling this function over calling g_get_monotonic_time() directly is * that when checking multiple sources, GLib can cache a single value * instead of having to repeatedly get the system monotonic time. * * The time here is the system monotonic time, if available, or some * other reasonable alternative otherwise. See g_get_monotonic_time(). * * Returns: the monotonic time in microseconds * * Since: 2.28 **/ gint64 g_source_get_time (GSource *source) { GMainContext *context; gint64 result; g_return_val_if_fail (source->context != NULL, 0); context = source->context; LOCK_CONTEXT (context); if (!context->time_is_fresh) { context->time = g_get_monotonic_time (); context->time_is_fresh = TRUE; } result = context->time; UNLOCK_CONTEXT (context); return result; } /** * g_main_context_set_poll_func: * @context: a #GMainContext * @func: the function to call to poll all file descriptors * * Sets the function to use to handle polling of file descriptors. It * will be used instead of the poll() system call * (or GLib's replacement function, which is used where * poll() isn't available). * * This function could possibly be used to integrate the GLib event * loop with an external event loop. **/ void g_main_context_set_poll_func (GMainContext *context, GPollFunc func) { if (!context) context = g_main_context_default (); g_return_if_fail (g_atomic_int_get (&context->ref_count) > 0); LOCK_CONTEXT (context); if (func) context->poll_func = func; else context->poll_func = g_poll; UNLOCK_CONTEXT (context); } /** * g_main_context_get_poll_func: * @context: a #GMainContext * * Gets the poll function set by g_main_context_set_poll_func(). * * Return value: the poll function **/ GPollFunc g_main_context_get_poll_func (GMainContext *context) { GPollFunc result; if (!context) context = g_main_context_default (); g_return_val_if_fail (g_atomic_int_get (&context->ref_count) > 0, NULL); LOCK_CONTEXT (context); result = context->poll_func; UNLOCK_CONTEXT (context); return result; } /** * g_main_context_wakeup: * @context: a #GMainContext * * 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) { if (!context) context = g_main_context_default (); g_return_if_fail (g_atomic_int_get (&context->ref_count) > 0); g_wakeup_signal (context->wakeup); } /** * g_main_context_is_owner: * @context: a #GMainContext * * Determines whether this thread holds the (recursive) * ownership of this #GMainContext. This is useful to * know before waiting on another thread that may be * blocking to get ownership of @context. * * Returns: %TRUE if current thread is owner of @context. * * Since: 2.10 **/ gboolean g_main_context_is_owner (GMainContext *context) { gboolean is_owner; if (!context) context = g_main_context_default (); LOCK_CONTEXT (context); is_owner = context->owner == G_THREAD_SELF; UNLOCK_CONTEXT (context); return is_owner; } /* Timeouts */ static void g_timeout_set_expiration (GTimeoutSource *timeout_source, gint64 current_time) { gint64 expiration; expiration = current_time + (guint64) timeout_source->interval * 1000; if (timeout_source->seconds) { gint64 remainder; static gint timer_perturb = -1; if (timer_perturb == -1) { /* * we want a per machine/session unique 'random' value; try the dbus * address first, that has a UUID in it. If there is no dbus, use the * hostname for hashing. */ const char *session_bus_address = g_getenv ("DBUS_SESSION_BUS_ADDRESS"); if (!session_bus_address) session_bus_address = g_getenv ("HOSTNAME"); if (session_bus_address) timer_perturb = ABS ((gint) g_str_hash (session_bus_address)) % 1000000; else timer_perturb = 0; } /* We want the microseconds part of the timeout to land on the * 'timer_perturb' mark, but we need to make sure we don't try to * set the timeout in the past. We do this by ensuring that we * always only *increase* the expiration time by adding a full * second in the case that the microsecond portion decreases. */ expiration -= timer_perturb; remainder = expiration % 1000000; if (remainder >= 1000000/4) expiration += 1000000; expiration -= remainder; expiration += timer_perturb; } g_source_set_ready_time ((GSource *) timeout_source, expiration); } static gboolean g_timeout_dispatch (GSource *source, GSourceFunc callback, gpointer user_data) { GTimeoutSource *timeout_source = (GTimeoutSource *)source; gboolean again; if (!callback) { g_warning ("Timeout source dispatched without callback\n" "You must call g_source_set_callback()."); return FALSE; } again = callback (user_data); if (again) g_timeout_set_expiration (timeout_source, g_source_get_time (source)); return again; } /** * g_timeout_source_new: * @interval: the timeout interval in milliseconds. * * Creates a new timeout source. * * The source will not initially be associated with any #GMainContext * and must be added to one with g_source_attach() before it will be * executed. * * The interval given is in terms of monotonic time, not wall clock * time. See g_get_monotonic_time(). * * Return value: the newly-created timeout source **/ GSource * g_timeout_source_new (guint interval) { GSource *source = g_source_new (&g_timeout_funcs, sizeof (GTimeoutSource)); GTimeoutSource *timeout_source = (GTimeoutSource *)source; timeout_source->interval = interval; g_timeout_set_expiration (timeout_source, g_get_monotonic_time ()); return source; } /** * g_timeout_source_new_seconds: * @interval: the timeout interval in seconds * * Creates a new timeout source. * * The source will not initially be associated with any #GMainContext * and must be added to one with g_source_attach() before it will be * executed. * * The scheduling granularity/accuracy of this timeout source will be * in seconds. * * The interval given in terms of monotonic time, not wall clock time. * See g_get_monotonic_time(). * * Return value: the newly-created timeout source * * Since: 2.14 **/ GSource * g_timeout_source_new_seconds (guint interval) { GSource *source = g_source_new (&g_timeout_funcs, sizeof (GTimeoutSource)); GTimeoutSource *timeout_source = (GTimeoutSource *)source; timeout_source->interval = 1000 * interval; timeout_source->seconds = TRUE; g_timeout_set_expiration (timeout_source, g_get_monotonic_time ()); return source; } /** * g_timeout_add_full: * @priority: the priority of the timeout source. Typically this will be in * the range between #G_PRIORITY_DEFAULT and #G_PRIORITY_HIGH. * @interval: the time between calls to the function, in milliseconds * (1/1000ths of a second) * @function: function to call * @data: data to pass to @function * @notify: (allow-none): function to call when the timeout is removed, or %NULL * * Sets a function to be called at regular intervals, with the given * priority. The function is called repeatedly until it returns * %FALSE, at which point the timeout is automatically destroyed and * the function will not be called again. The @notify function is * called when the timeout is destroyed. The first call to the * function will be at the end of the first @interval. * * Note that timeout functions may be delayed, due to the processing of other * event sources. Thus they should not be relied on for precise timing. * After each call to the timeout function, the time of the next * timeout is recalculated based on the current time and the given interval * (it does not try to 'catch up' time lost in delays). * * This internally creates a main loop source using g_timeout_source_new() * and attaches it to the main loop context using g_source_attach(). You can * do these steps manually if you need greater control. * * The interval given in terms of monotonic time, not wall clock time. * See g_get_monotonic_time(). * * Return value: the ID (greater than 0) of the event source. * Rename to: g_timeout_add **/ guint g_timeout_add_full (gint priority, guint interval, GSourceFunc function, gpointer data, GDestroyNotify notify) { GSource *source; guint id; g_return_val_if_fail (function != NULL, 0); source = g_timeout_source_new (interval); if (priority != G_PRIORITY_DEFAULT) g_source_set_priority (source, priority); g_source_set_callback (source, function, data, notify); id = g_source_attach (source, NULL); g_source_unref (source); return id; } /** * g_timeout_add: * @interval: the time between calls to the function, in milliseconds * (1/1000ths of a second) * @function: function to call * @data: data to pass to @function * * Sets a function to be called at regular intervals, with the default * priority, #G_PRIORITY_DEFAULT. The function is called repeatedly * until it returns %FALSE, at which point the timeout is automatically * destroyed and the function will not be called again. The first call * to the function will be at the end of the first @interval. * * Note that timeout functions may be delayed, due to the processing of other * event sources. Thus they should not be relied on for precise timing. * After each call to the timeout function, the time of the next * timeout is recalculated based on the current time and the given interval * (it does not try to 'catch up' time lost in delays). * * If you want to have a timer in the "seconds" range and do not care * about the exact time of the first call of the timer, use the * g_timeout_add_seconds() function; this function allows for more * optimizations and more efficient system power usage. * * This internally creates a main loop source using g_timeout_source_new() * and attaches it to the main loop context using g_source_attach(). You can * do these steps manually if you need greater control. * * The interval given is in terms of monotonic time, not wall clock * time. See g_get_monotonic_time(). * * Return value: the ID (greater than 0) of the event source. **/ guint g_timeout_add (guint32 interval, GSourceFunc function, gpointer data) { return g_timeout_add_full (G_PRIORITY_DEFAULT, interval, function, data, NULL); } /** * g_timeout_add_seconds_full: * @priority: the priority of the timeout source. Typically this will be in * the range between #G_PRIORITY_DEFAULT and #G_PRIORITY_HIGH. * @interval: the time between calls to the function, in seconds * @function: function to call * @data: data to pass to @function * @notify: (allow-none): function to call when the timeout is removed, or %NULL * * Sets a function to be called at regular intervals, with @priority. * The function is called repeatedly until it returns %FALSE, at which * point the timeout is automatically destroyed and the function will * not be called again. * * Unlike g_timeout_add(), this function operates at whole second granularity. * The initial starting point of the timer is determined by the implementation * and the implementation is expected to group multiple timers together so that * they fire all at the same time. * To allow this grouping, the @interval to the first timer is rounded * and can deviate up to one second from the specified interval. * Subsequent timer iterations will generally run at the specified interval. * * Note that timeout functions may be delayed, due to the processing of other * event sources. Thus they should not be relied on for precise timing. * After each call to the timeout function, the time of the next * timeout is recalculated based on the current time and the given @interval * * If you want timing more precise than whole seconds, use g_timeout_add() * instead. * * The grouping of timers to fire at the same time results in a more power * and CPU efficient behavior so if your timer is in multiples of seconds * and you don't require the first timer exactly one second from now, the * use of g_timeout_add_seconds() is preferred over g_timeout_add(). * * This internally creates a main loop source using * g_timeout_source_new_seconds() and attaches it to the main loop context * using g_source_attach(). You can do these steps manually if you need * greater control. * * The interval given is in terms of monotonic time, not wall clock * time. See g_get_monotonic_time(). * * Return value: the ID (greater than 0) of the event source. * * Rename to: g_timeout_add_seconds * Since: 2.14 **/ guint g_timeout_add_seconds_full (gint priority, guint32 interval, GSourceFunc function, gpointer data, GDestroyNotify notify) { GSource *source; guint id; g_return_val_if_fail (function != NULL, 0); source = g_timeout_source_new_seconds (interval); if (priority != G_PRIORITY_DEFAULT) g_source_set_priority (source, priority); g_source_set_callback (source, function, data, notify); id = g_source_attach (source, NULL); g_source_unref (source); return id; } /** * g_timeout_add_seconds: * @interval: the time between calls to the function, in seconds * @function: function to call * @data: data to pass to @function * * Sets a function to be called at regular intervals with the default * priority, #G_PRIORITY_DEFAULT. The function is called repeatedly until * it returns %FALSE, at which point the timeout is automatically destroyed * and the function will not be called again. * * This internally creates a main loop source using * g_timeout_source_new_seconds() and attaches it to the main loop context * using g_source_attach(). You can do these steps manually if you need * greater control. Also see g_timeout_add_seconds_full(). * * Note that the first call of the timer may not be precise for timeouts * of one second. If you need finer precision and have such a timeout, * you may want to use g_timeout_add() instead. * * The interval given is in terms of monotonic time, not wall clock * time. See g_get_monotonic_time(). * * Return value: the ID (greater than 0) of the event source. * * Since: 2.14 **/ guint g_timeout_add_seconds (guint interval, GSourceFunc function, gpointer data) { g_return_val_if_fail (function != NULL, 0); return g_timeout_add_seconds_full (G_PRIORITY_DEFAULT, interval, function, data, NULL); } /* Child watch functions */ #ifdef G_OS_WIN32 static gboolean g_child_watch_prepare (GSource *source, gint *timeout) { *timeout = -1; return FALSE; } static gboolean g_child_watch_check (GSource *source) { GChildWatchSource *child_watch_source; gboolean child_exited; child_watch_source = (GChildWatchSource *) source; child_exited = child_watch_source->poll.revents & G_IO_IN; if (child_exited) { DWORD child_status; /* * Note: We do _not_ check for the special value of STILL_ACTIVE * since we know that the process has exited and doing so runs into * problems if the child process "happens to return STILL_ACTIVE(259)" * as Microsoft's Platform SDK puts it. */ if (!GetExitCodeProcess (child_watch_source->pid, &child_status)) { gchar *emsg = g_win32_error_message (GetLastError ()); g_warning (G_STRLOC ": GetExitCodeProcess() failed: %s", emsg); g_free (emsg); child_watch_source->child_status = -1; } else child_watch_source->child_status = child_status; } return child_exited; } static void g_child_watch_finalize (GSource *source) { } #else /* G_OS_WIN32 */ static void wake_source (GSource *source) { GMainContext *context; /* This should be thread-safe: * * - if the source is currently being added to a context, that * context will be woken up anyway * * - if the source is currently being destroyed, we simply need not * to crash: * * - the memory for the source will remain valid until after the * source finalize function was called (which would remove the * source from the global list which we are currently holding the * lock for) * * - the GMainContext will either be NULL or point to a live * GMainContext * * - the GMainContext will remain valid since we hold the * main_context_list lock * * Since we are holding a lot of locks here, don't try to enter any * more GMainContext functions for fear of dealock -- just hit the * GWakeup and run. Even if that's safe now, it could easily become * unsafe with some very minor changes in the future, and signal * handling is not the most well-tested codepath. */ G_LOCK(main_context_list); context = source->context; if (context) g_wakeup_signal (context->wakeup); G_UNLOCK(main_context_list); } static void dispatch_unix_signals (void) { GSList *node; /* clear this first incase another one arrives while we're processing */ any_unix_signal_pending = FALSE; G_LOCK(unix_signal_lock); /* handle GChildWatchSource instances */ if (unix_signal_pending[SIGCHLD]) { /* 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 * explicitly watching, so that ties our hands from calling * waitpid(-1). We also can't use siginfo's si_pid field since if * multiple SIGCHLD arrive at the same time, one of them can be * dropped (since a given UNIX signal can only be pending once). */ for (node = unix_child_watches; node; node = node->next) { GChildWatchSource *source = node->data; if (!source->child_exited) { pid_t pid; do { 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); } } } /* handle GUnixSignalWatchSource instances */ for (node = unix_signal_watches; node; node = node->next) { GUnixSignalWatchSource *source = node->data; if (!source->pending) { if (unix_signal_pending[source->signum]) { source->pending = TRUE; wake_source ((GSource *) source); } } } memset ((void*)unix_signal_pending, 0, sizeof (unix_signal_pending)); G_UNLOCK(unix_signal_lock); } static gboolean g_child_watch_prepare (GSource *source, gint *timeout) { GChildWatchSource *child_watch_source; child_watch_source = (GChildWatchSource *) source; return child_watch_source->child_exited; } static gboolean g_child_watch_check (GSource *source) { GChildWatchSource *child_watch_source; child_watch_source = (GChildWatchSource *) source; return child_watch_source->child_exited; } static gboolean g_unix_signal_watch_prepare (GSource *source, gint *timeout) { GUnixSignalWatchSource *unix_signal_source; unix_signal_source = (GUnixSignalWatchSource *) source; return unix_signal_source->pending; } static gboolean g_unix_signal_watch_check (GSource *source) { GUnixSignalWatchSource *unix_signal_source; unix_signal_source = (GUnixSignalWatchSource *) source; return unix_signal_source->pending; } static gboolean g_unix_signal_watch_dispatch (GSource *source, GSourceFunc callback, gpointer user_data) { GUnixSignalWatchSource *unix_signal_source; gboolean again; unix_signal_source = (GUnixSignalWatchSource *) source; if (!callback) { g_warning ("Unix signal source dispatched without callback\n" "You must call g_source_set_callback()."); return FALSE; } again = (callback) (user_data); unix_signal_source->pending = FALSE; return again; } static void ref_unix_signal_handler_unlocked (int signum) { /* Ensure we have the worker context */ g_get_worker_context (); unix_signal_refcount[signum]++; if (unix_signal_refcount[signum] == 1) { 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); } } 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 * _g_main_create_unix_signal_watch (int signum) { GSource *source; GUnixSignalWatchSource *unix_signal_source; source = g_source_new (&g_unix_signal_funcs, sizeof (GUnixSignalWatchSource)); unix_signal_source = (GUnixSignalWatchSource *) source; unix_signal_source->signum = signum; unix_signal_source->pending = FALSE; G_LOCK (unix_signal_lock); 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; G_UNLOCK (unix_signal_lock); return source; } 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); } static void 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); } #endif /* G_OS_WIN32 */ static gboolean g_child_watch_dispatch (GSource *source, GSourceFunc callback, gpointer user_data) { GChildWatchSource *child_watch_source; GChildWatchFunc child_watch_callback = (GChildWatchFunc) callback; child_watch_source = (GChildWatchSource *) source; if (!callback) { g_warning ("Child watch source dispatched without callback\n" "You must call g_source_set_callback()."); return FALSE; } (child_watch_callback) (child_watch_source->pid, child_watch_source->child_status, user_data); /* We never keep a child watch source around as the child is gone */ return FALSE; } #ifndef G_OS_WIN32 static void g_unix_signal_handler (int signum) { unix_signal_pending[signum] = TRUE; any_unix_signal_pending = TRUE; g_wakeup_signal (glib_worker_context->wakeup); } #endif /* !G_OS_WIN32 */ /** * g_child_watch_source_new: * @pid: process to watch. On POSIX the pid of a child process. On * Windows a handle for a process (which doesn't have to be a child). * * Creates a new child_watch source. * * The source will not initially be associated with any #GMainContext * and must be added to one with g_source_attach() before it will be * executed. * * Note that child watch sources can only be used in conjunction with * g_spawn... when the %G_SPAWN_DO_NOT_REAP_CHILD * flag is used. * * Note that on platforms where #GPid must be explicitly closed * (see g_spawn_close_pid()) @pid must not be closed while the * source is still active. Typically, you will want to call * g_spawn_close_pid() in the callback function for the source. * * Note further that using g_child_watch_source_new() is not * compatible with calling waitpid 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 * * Since: 2.4 **/ GSource * g_child_watch_source_new (GPid pid) { GSource *source = g_source_new (&g_child_watch_funcs, sizeof (GChildWatchSource)); GChildWatchSource *child_watch_source = (GChildWatchSource *)source; child_watch_source->pid = pid; #ifdef G_OS_WIN32 child_watch_source->poll.fd = (gintptr) pid; child_watch_source->poll.events = G_IO_IN; g_source_add_poll (source, &child_watch_source->poll); #else /* G_OS_WIN32 */ G_LOCK (unix_signal_lock); 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; G_UNLOCK (unix_signal_lock); #endif /* G_OS_WIN32 */ return source; } /** * g_child_watch_add_full: * @priority: the priority of the idle source. Typically this will be in the * range between #G_PRIORITY_DEFAULT_IDLE and #G_PRIORITY_HIGH_IDLE. * @pid: process to watch. On POSIX the pid of a child process. On * Windows a handle for a process (which doesn't have to be a child). * @function: function to call * @data: data to pass to @function * @notify: (allow-none): function to call when the idle is removed, or %NULL * * Sets a function to be called when the child indicated by @pid * exits, at the priority @priority. * * If you obtain @pid from g_spawn_async() or g_spawn_async_with_pipes() * you will need to pass #G_SPAWN_DO_NOT_REAP_CHILD as flag to * the spawn function for the child watching to work. * * 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. * * 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. * * This internally creates a main loop source using * g_child_watch_source_new() and attaches it to the main loop context * using g_source_attach(). You can do these steps manually if you * need greater control. * * Return value: the ID (greater than 0) of the event source. * * Rename to: g_child_watch_add * Since: 2.4 **/ guint g_child_watch_add_full (gint priority, GPid pid, GChildWatchFunc function, gpointer data, GDestroyNotify notify) { GSource *source; guint id; g_return_val_if_fail (function != NULL, 0); source = g_child_watch_source_new (pid); if (priority != G_PRIORITY_DEFAULT) g_source_set_priority (source, priority); g_source_set_callback (source, (GSourceFunc) function, data, notify); id = g_source_attach (source, NULL); g_source_unref (source); return id; } /** * g_child_watch_add: * @pid: process id to watch. On POSIX the pid of a child process. On * Windows a handle for a process (which doesn't have to be a child). * @function: function to call * @data: data to pass to @function * * Sets a function to be called when the child indicated by @pid * exits, at a default priority, #G_PRIORITY_DEFAULT. * * If you obtain @pid from g_spawn_async() or g_spawn_async_with_pipes() * you will need to pass #G_SPAWN_DO_NOT_REAP_CHILD as flag to * the spawn function for the child watching to work. * * Note that on platforms where #GPid must be explicitly closed * (see g_spawn_close_pid()) @pid must not be closed while the * source is still active. Typically, you will want to call * g_spawn_close_pid() in the callback function for the source. * * GLib supports only a single callback per process id. * * This internally creates a main loop source using * g_child_watch_source_new() and attaches it to the main loop context * using g_source_attach(). You can do these steps manually if you * need greater control. * * Return value: the ID (greater than 0) of the event source. * * Since: 2.4 **/ guint g_child_watch_add (GPid pid, GChildWatchFunc function, gpointer data) { return g_child_watch_add_full (G_PRIORITY_DEFAULT, pid, function, data, NULL); } /* Idle functions */ static gboolean g_idle_prepare (GSource *source, gint *timeout) { *timeout = 0; return TRUE; } static gboolean g_idle_check (GSource *source) { return TRUE; } static gboolean g_idle_dispatch (GSource *source, GSourceFunc callback, gpointer user_data) { if (!callback) { g_warning ("Idle source dispatched without callback\n" "You must call g_source_set_callback()."); return FALSE; } return callback (user_data); } /** * g_idle_source_new: * * Creates a new idle source. * * The source will not initially be associated with any #GMainContext * and must be added to one with g_source_attach() before it will be * executed. Note that the default priority for idle sources is * %G_PRIORITY_DEFAULT_IDLE, as compared to other sources which * have a default priority of %G_PRIORITY_DEFAULT. * * Return value: the newly-created idle source **/ GSource * g_idle_source_new (void) { GSource *source; source = g_source_new (&g_idle_funcs, sizeof (GSource)); g_source_set_priority (source, G_PRIORITY_DEFAULT_IDLE); return source; } /** * g_idle_add_full: * @priority: the priority of the idle source. Typically this will be in the * range between #G_PRIORITY_DEFAULT_IDLE and #G_PRIORITY_HIGH_IDLE. * @function: function to call * @data: data to pass to @function * @notify: (allow-none): function to call when the idle is removed, or %NULL * * Adds a function to be called whenever there are no higher priority * events pending. If the function returns %FALSE it is automatically * removed from the list of event sources and will not be called again. * * This internally creates a main loop source using g_idle_source_new() * and attaches it to the main loop context using g_source_attach(). * You can do these steps manually if you need greater control. * * Return value: the ID (greater than 0) of the event source. * Rename to: g_idle_add **/ guint g_idle_add_full (gint priority, GSourceFunc function, gpointer data, GDestroyNotify notify) { GSource *source; guint id; g_return_val_if_fail (function != NULL, 0); source = g_idle_source_new (); if (priority != G_PRIORITY_DEFAULT_IDLE) g_source_set_priority (source, priority); g_source_set_callback (source, function, data, notify); id = g_source_attach (source, NULL); g_source_unref (source); return id; } /** * g_idle_add: * @function: function to call * @data: data to pass to @function. * * Adds a function to be called whenever there are no higher priority * events pending to the default main loop. The function is given the * default idle priority, #G_PRIORITY_DEFAULT_IDLE. If the function * returns %FALSE it is automatically removed from the list of event * sources and will not be called again. * * This internally creates a main loop source using g_idle_source_new() * and attaches it to the main loop context using g_source_attach(). * You can do these steps manually if you need greater control. * * Return value: the ID (greater than 0) of the event source. **/ guint g_idle_add (GSourceFunc function, gpointer data) { return g_idle_add_full (G_PRIORITY_DEFAULT_IDLE, function, data, NULL); } /** * g_idle_remove_by_data: * @data: the data for the idle source's callback. * * Removes the idle function with the given data. * * Return value: %TRUE if an idle source was found and removed. **/ gboolean g_idle_remove_by_data (gpointer data) { return g_source_remove_by_funcs_user_data (&g_idle_funcs, data); } /** * g_main_context_invoke: * @context: (allow-none): a #GMainContext, or %NULL * @function: function to call * @data: data to pass to @function * * Invokes a function in such a way that @context is owned during the * invocation of @function. * * If @context is %NULL then the global default main context — as * returned by g_main_context_default() — is used. * * If @context is owned by the current thread, @function is called * directly. Otherwise, if @context is the thread-default main context * of the current thread and g_main_context_acquire() succeeds, then * @function is called and g_main_context_release() is called * afterwards. * * In any other case, an idle source is created to call @function and * that source is attached to @context (presumably to be run in another * thread). The idle source is attached with #G_PRIORITY_DEFAULT * priority. If you want a different priority, use * g_main_context_invoke_full(). * * Note that, as with normal idle functions, @function should probably * return %FALSE. If it returns %TRUE, it will be continuously run in a * loop (and may prevent this call from returning). * * Since: 2.28 **/ void g_main_context_invoke (GMainContext *context, GSourceFunc function, gpointer data) { g_main_context_invoke_full (context, G_PRIORITY_DEFAULT, function, data, NULL); } /** * g_main_context_invoke_full: * @context: (allow-none): a #GMainContext, or %NULL * @priority: the priority at which to run @function * @function: function to call * @data: data to pass to @function * @notify: (allow-none): a function to call when @data is no longer in use, or %NULL. * * Invokes a function in such a way that @context is owned during the * invocation of @function. * * This function is the same as g_main_context_invoke() except that it * lets you specify the priority incase @function ends up being * scheduled as an idle and also lets you give a #GDestroyNotify for @data. * * @notify should not assume that it is called from any particular * thread or with any particular context acquired. * * Since: 2.28 **/ void g_main_context_invoke_full (GMainContext *context, gint priority, GSourceFunc function, gpointer data, GDestroyNotify notify) { g_return_if_fail (function != NULL); if (!context) context = g_main_context_default (); if (g_main_context_is_owner (context)) { while (function (data)); if (notify != NULL) notify (data); } else { GMainContext *thread_default; thread_default = g_main_context_get_thread_default (); if (!thread_default) thread_default = g_main_context_default (); if (thread_default == context && g_main_context_acquire (context)) { while (function (data)); g_main_context_release (context); if (notify != NULL) notify (data); } else { GSource *source; source = g_idle_source_new (); g_source_set_priority (source, priority); g_source_set_callback (source, function, data, notify); g_source_attach (source, context); g_source_unref (source); } } } static gpointer glib_worker_main (gpointer data) { while (TRUE) { g_main_context_iteration (glib_worker_context, TRUE); #ifdef G_OS_UNIX if (any_unix_signal_pending) dispatch_unix_signals (); #endif } return NULL; /* worst GCC warning message ever... */ } GMainContext * g_get_worker_context (void) { static gsize initialised; if (g_once_init_enter (&initialised)) { /* mask all signals in the worker thread */ #ifdef G_OS_UNIX sigset_t prev_mask; sigset_t all; sigfillset (&all); pthread_sigmask (SIG_SETMASK, &all, &prev_mask); #endif glib_worker_context = g_main_context_new (); g_thread_new ("gmain", glib_worker_main, NULL); #ifdef G_OS_UNIX pthread_sigmask (SIG_SETMASK, &prev_mask, NULL); #endif g_once_init_leave (&initialised, TRUE); } return glib_worker_context; } pkg-config-0.29.1/glib/glib/gstdio.h0000664000175000017500000001142212651243552014053 00000000000000/* gstdio.h - GFilename wrappers for C library functions * * Copyright 2004 Tor Lillqvist * * GLib is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * GLib is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with GLib; see the file COPYING.LIB. If not, * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __G_STDIO_H__ #define __G_STDIO_H__ #include #include G_BEGIN_DECLS #if defined (_MSC_VER) && !defined(_WIN64) /* Make it clear that we mean the struct with 32-bit st_size and * 32-bit st_*time fields as that is how the 32-bit GLib DLL normally * has been compiled. If you get a compiler warning when calling * g_stat(), do take it seriously and make sure that the type of * struct stat the code in GLib fills in matches the struct the type * of struct stat you pass to g_stat(). To avoid hassle, to get file * attributes just use the GIO API instead which doesn't use struct * stat. * * Sure, it would be nicer to use a struct with 64-bit st_size and * 64-bit st_*time fields, but changing that now would break ABI. And * in MinGW, a plain "struct stat" is the one with 32-bit st_size and * st_*time fields. */ typedef struct _stat32 GStatBuf; #else typedef struct stat GStatBuf; #endif #if defined(G_OS_UNIX) && !defined(G_STDIO_NO_WRAP_ON_UNIX) /* Just pass on to the system functions, so there's no potential for data * format mismatches, especially with large file interfaces. * A few functions can't be handled in this way, since they are not defined * in a portable system header that we could include here. */ #ifndef __GTK_DOC_IGNORE__ #define g_chmod chmod #define g_open open #define g_creat creat #define g_rename rename #define g_mkdir mkdir #define g_stat stat #define g_lstat lstat #define g_remove remove #define g_fopen fopen #define g_freopen freopen #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 */ /* Wrappers for C library functions that take pathname arguments. On * Unix, the pathname is a file name as it literally is in the file * system. On well-maintained systems with consistent users who know * what they are doing and no exchange of files with others this would * be a well-defined encoding, preferably UTF-8. On Windows, the * pathname is always in UTF-8, even if that is not the on-disk * encoding, and not the encoding accepted by the C library or Win32 * API. */ 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); 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__ */ pkg-config-0.29.1/glib/glib/giowin32.c0000664000175000017500000016651212651243552014231 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * giowin32.c: IO Channels for Win32. * Copyright 1998 Owen Taylor and Tor Lillqvist * Copyright 1999-2000 Tor Lillqvist and Craig Setera * Copyright 2001-2003 Andrew Lanoix * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the GLib Team and others 1997-2000. See the AUTHORS * file for a list of people on the GLib Team. See the ChangeLog * files for a list of changes. These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/. */ /* * Bugs that are related to the code in this file: * * Bug 137968 - Sometimes a GIOFunc on Win32 is called with zero condition * http://bugzilla.gnome.org/show_bug.cgi?id=137968 * * Bug 324234 - Using g_io_add_watch_full() to wait for connect() to return on a non-blocking socket returns prematurely * http://bugzilla.gnome.org/show_bug.cgi?id=324234 * * Bug 331214 - g_io_channel async socket io stalls * http://bugzilla.gnome.org/show_bug.cgi?id=331214 * * Bug 338943 - Multiple watches on the same socket * http://bugzilla.gnome.org/show_bug.cgi?id=338943 * * Bug 357674 - 2 serious bugs in giowin32.c making glib iochannels useless * http://bugzilla.gnome.org/show_bug.cgi?id=357674 * * Bug 425156 - GIOChannel deadlocks on a win32 socket * http://bugzilla.gnome.org/show_bug.cgi?id=425156 * * Bug 468910 - giofunc condition=0 * http://bugzilla.gnome.org/show_bug.cgi?id=468910 * * Bug 500246 - Bug fixes for giowin32 * http://bugzilla.gnome.org/show_bug.cgi?id=500246 * * Bug 548278 - Async GETs connections are always terminated unexpectedly on windows * http://bugzilla.gnome.org/show_bug.cgi?id=548278 * * Bug 548536 - giowin32 problem when adding and removing watches * http://bugzilla.gnome.org/show_bug.cgi?id=548536 * * When fixing bugs related to the code in this file, either the above * bugs or others, make sure that the test programs attached to the * above bugs continue to work. */ #include "config.h" #include "glib.h" #include #include #include #include #include #include #include #include #include #include "gstdio.h" #include "glibintl.h" typedef struct _GIOWin32Channel GIOWin32Channel; typedef struct _GIOWin32Watch GIOWin32Watch; #define BUFFER_SIZE 4096 typedef enum { G_IO_WIN32_WINDOWS_MESSAGES, /* Windows messages */ G_IO_WIN32_FILE_DESC, /* Unix-like file descriptors from * _open() or _pipe(), except for * console IO. Separate thread to read * or write. */ G_IO_WIN32_CONSOLE, /* Console IO (usually stdin, stdout, stderr) */ G_IO_WIN32_SOCKET /* Sockets. No separate thread. */ } GIOWin32ChannelType; struct _GIOWin32Channel { GIOChannel channel; gint fd; /* Either a Unix-like file handle as provided * by the Microsoft C runtime, or a SOCKET * as provided by WinSock. */ GIOWin32ChannelType type; gboolean debug; /* Field used by G_IO_WIN32_WINDOWS_MESSAGES channels */ HWND hwnd; /* Handle of window, or NULL */ /* Fields used by G_IO_WIN32_FILE_DESC channels. */ CRITICAL_SECTION mutex; int direction; /* 0 means we read from it, * 1 means we write to it. */ gboolean running; /* Is reader or writer thread * running. FALSE if EOF has been * reached by the reader thread. */ gboolean needs_close; /* If the channel has been closed while * the reader thread was still running. */ guint thread_id; /* If non-NULL the channel has or has * had a reader or writer thread. */ HANDLE data_avail_event; gushort revents; /* Data is kept in a circular buffer. To be able to distinguish between * empty and full buffers, we cannot fill it completely, but have to * leave a one character gap. * * Data available is between indexes rdp and wrp-1 (modulo BUFFER_SIZE). * * Empty: wrp == rdp * Full: (wrp + 1) % BUFFER_SIZE == rdp * Partial: otherwise */ guchar *buffer; /* (Circular) buffer */ gint wrp, rdp; /* Buffer indices for writing and reading */ HANDLE space_avail_event; /* Fields used by G_IO_WIN32_SOCKET channels */ int event_mask; int last_events; HANDLE event; gboolean write_would_have_blocked; gboolean ever_writable; }; struct _GIOWin32Watch { GSource source; GPollFD pollfd; GIOChannel *channel; GIOCondition condition; }; static void g_win32_print_access_mode (int flags) { g_print ("%s%s%s%s%s%s%s%s%s%s", ((flags & 0x3) == _O_RDWR ? "O_RDWR" : ((flags & 0x3) == _O_RDONLY ? "O_RDONLY" : ((flags & 0x3) == _O_WRONLY ? "O_WRONLY" : "0"))), (flags & _O_APPEND ? "|O_APPEND" : ""), (flags & _O_RANDOM ? "|O_RANDOM" : ""), (flags & _O_SEQUENTIAL ? "|O_SEQUENTIAL" : ""), (flags & _O_TEMPORARY ? "|O_TEMPORARY" : ""), (flags & _O_CREAT ? "|O_CREAT" : ""), (flags & _O_TRUNC ? "|O_TRUNC" : ""), (flags & _O_EXCL ? "|O_EXCL" : ""), (flags & _O_TEXT ? "|O_TEXT" : ""), (flags & _O_BINARY ? "|O_BINARY" : "")); } static void g_win32_print_gioflags (GIOFlags flags) { char *bar = ""; if (flags & G_IO_FLAG_APPEND) bar = "|", g_print ("APPEND"); if (flags & G_IO_FLAG_NONBLOCK) g_print ("%sNONBLOCK", bar), bar = "|"; if (flags & G_IO_FLAG_IS_READABLE) g_print ("%sREADABLE", bar), bar = "|"; if (flags & G_IO_FLAG_IS_WRITABLE) g_print ("%sWRITABLE", bar), bar = "|"; if (flags & G_IO_FLAG_IS_SEEKABLE) g_print ("%sSEEKABLE", bar), bar = "|"; } static const char * event_mask_to_string (int mask) { char buf[100]; int checked_bits = 0; char *bufp = buf; if (mask == 0) return ""; #define BIT(n) checked_bits |= FD_##n; if (mask & FD_##n) bufp += sprintf (bufp, "%s" #n, (bufp>buf ? "|" : "")) BIT (READ); BIT (WRITE); BIT (OOB); BIT (ACCEPT); BIT (CONNECT); BIT (CLOSE); BIT (QOS); BIT (GROUP_QOS); BIT (ROUTING_INTERFACE_CHANGE); BIT (ADDRESS_LIST_CHANGE); #undef BIT if ((mask & ~checked_bits) != 0) bufp += sprintf (bufp, "|%#x", mask & ~checked_bits); return g_quark_to_string (g_quark_from_string (buf)); } static const char * condition_to_string (GIOCondition condition) { char buf[100]; int checked_bits = 0; char *bufp = buf; if (condition == 0) return ""; #define BIT(n) checked_bits |= G_IO_##n; if (condition & G_IO_##n) bufp += sprintf (bufp, "%s" #n, (bufp>buf ? "|" : "")) BIT (IN); BIT (OUT); BIT (PRI); BIT (ERR); BIT (HUP); BIT (NVAL); #undef BIT if ((condition & ~checked_bits) != 0) bufp += sprintf (bufp, "|%#x", condition & ~checked_bits); return g_quark_to_string (g_quark_from_string (buf)); } static gboolean g_io_win32_get_debug_flag (void) { return (getenv ("G_IO_WIN32_DEBUG") != NULL); } static void g_io_channel_win32_init (GIOWin32Channel *channel) { channel->debug = g_io_win32_get_debug_flag (); InitializeCriticalSection (&channel->mutex); channel->running = FALSE; channel->needs_close = FALSE; channel->thread_id = 0; channel->data_avail_event = NULL; channel->revents = 0; channel->buffer = NULL; channel->space_avail_event = NULL; channel->event_mask = 0; channel->last_events = 0; channel->event = NULL; channel->write_would_have_blocked = FALSE; channel->ever_writable = FALSE; } static void create_events (GIOWin32Channel *channel) { SECURITY_ATTRIBUTES sec_attrs; sec_attrs.nLength = sizeof (SECURITY_ATTRIBUTES); sec_attrs.lpSecurityDescriptor = NULL; sec_attrs.bInheritHandle = FALSE; /* The data available event is manual reset, the space available event * is automatic reset. */ if (!(channel->data_avail_event = CreateEvent (&sec_attrs, TRUE, FALSE, NULL)) || !(channel->space_avail_event = CreateEvent (&sec_attrs, FALSE, FALSE, NULL))) { gchar *emsg = g_win32_error_message (GetLastError ()); g_error ("Error creating event: %s", emsg); g_free (emsg); } } static unsigned __stdcall read_thread (void *parameter) { GIOWin32Channel *channel = parameter; guchar *buffer; gint nbytes; g_io_channel_ref ((GIOChannel *)channel); if (channel->debug) g_print ("read_thread %#x: start fd=%d, data_avail=%p space_avail=%p\n", channel->thread_id, channel->fd, channel->data_avail_event, channel->space_avail_event); channel->direction = 0; channel->buffer = g_malloc (BUFFER_SIZE); channel->rdp = channel->wrp = 0; channel->running = TRUE; SetEvent (channel->space_avail_event); EnterCriticalSection (&channel->mutex); while (channel->running) { if (channel->debug) g_print ("read_thread %#x: rdp=%d, wrp=%d\n", channel->thread_id, channel->rdp, channel->wrp); if ((channel->wrp + 1) % BUFFER_SIZE == channel->rdp) { /* Buffer is full */ if (channel->debug) g_print ("read_thread %#x: resetting space_avail\n", channel->thread_id); ResetEvent (channel->space_avail_event); if (channel->debug) g_print ("read_thread %#x: waiting for space\n", channel->thread_id); LeaveCriticalSection (&channel->mutex); WaitForSingleObject (channel->space_avail_event, INFINITE); EnterCriticalSection (&channel->mutex); if (channel->debug) g_print ("read_thread %#x: rdp=%d, wrp=%d\n", channel->thread_id, channel->rdp, channel->wrp); } buffer = channel->buffer + channel->wrp; /* Always leave at least one byte unused gap to be able to * distinguish between the full and empty condition... */ nbytes = MIN ((channel->rdp + BUFFER_SIZE - channel->wrp - 1) % BUFFER_SIZE, BUFFER_SIZE - channel->wrp); if (channel->debug) g_print ("read_thread %#x: calling read() for %d bytes\n", channel->thread_id, nbytes); LeaveCriticalSection (&channel->mutex); nbytes = read (channel->fd, buffer, nbytes); EnterCriticalSection (&channel->mutex); channel->revents = G_IO_IN; if (nbytes == 0) channel->revents |= G_IO_HUP; else if (nbytes < 0) channel->revents |= G_IO_ERR; if (channel->debug) g_print ("read_thread %#x: read() returned %d, rdp=%d, wrp=%d\n", channel->thread_id, nbytes, channel->rdp, channel->wrp); if (nbytes <= 0) break; channel->wrp = (channel->wrp + nbytes) % BUFFER_SIZE; if (channel->debug) g_print ("read_thread %#x: rdp=%d, wrp=%d, setting data_avail\n", channel->thread_id, channel->rdp, channel->wrp); SetEvent (channel->data_avail_event); } channel->running = FALSE; if (channel->needs_close) { if (channel->debug) g_print ("read_thread %#x: channel fd %d needs closing\n", channel->thread_id, channel->fd); close (channel->fd); channel->fd = -1; } if (channel->debug) g_print ("read_thread %#x: EOF, rdp=%d, wrp=%d, setting data_avail\n", channel->thread_id, channel->rdp, channel->wrp); SetEvent (channel->data_avail_event); LeaveCriticalSection (&channel->mutex); g_io_channel_unref ((GIOChannel *)channel); /* No need to call _endthreadex(), the actual thread starter routine * in MSVCRT (see crt/src/threadex.c:_threadstartex) calls * _endthreadex() for us. */ return 0; } static unsigned __stdcall write_thread (void *parameter) { GIOWin32Channel *channel = parameter; guchar *buffer; gint nbytes; g_io_channel_ref ((GIOChannel *)channel); if (channel->debug) g_print ("write_thread %#x: start fd=%d, data_avail=%p space_avail=%p\n", channel->thread_id, channel->fd, channel->data_avail_event, channel->space_avail_event); channel->direction = 1; channel->buffer = g_malloc (BUFFER_SIZE); channel->rdp = channel->wrp = 0; channel->running = TRUE; SetEvent (channel->space_avail_event); /* We use the same event objects as for a reader thread, but with * reversed meaning. So, space_avail is used if data is available * for writing, and data_avail is used if space is available in the * write buffer. */ EnterCriticalSection (&channel->mutex); while (channel->running || channel->rdp != channel->wrp) { if (channel->debug) g_print ("write_thread %#x: rdp=%d, wrp=%d\n", channel->thread_id, channel->rdp, channel->wrp); if (channel->wrp == channel->rdp) { /* Buffer is empty. */ if (channel->debug) g_print ("write_thread %#x: resetting space_avail\n", channel->thread_id); ResetEvent (channel->space_avail_event); if (channel->debug) g_print ("write_thread %#x: waiting for data\n", channel->thread_id); channel->revents = G_IO_OUT; SetEvent (channel->data_avail_event); LeaveCriticalSection (&channel->mutex); WaitForSingleObject (channel->space_avail_event, INFINITE); EnterCriticalSection (&channel->mutex); if (channel->rdp == channel->wrp) break; if (channel->debug) g_print ("write_thread %#x: rdp=%d, wrp=%d\n", channel->thread_id, channel->rdp, channel->wrp); } buffer = channel->buffer + channel->rdp; if (channel->rdp < channel->wrp) nbytes = channel->wrp - channel->rdp; else nbytes = BUFFER_SIZE - channel->rdp; if (channel->debug) g_print ("write_thread %#x: calling write() for %d bytes\n", channel->thread_id, nbytes); LeaveCriticalSection (&channel->mutex); nbytes = write (channel->fd, buffer, nbytes); EnterCriticalSection (&channel->mutex); if (channel->debug) g_print ("write_thread %#x: write(%i) returned %d, rdp=%d, wrp=%d\n", channel->thread_id, channel->fd, nbytes, channel->rdp, channel->wrp); channel->revents = 0; if (nbytes > 0) channel->revents |= G_IO_OUT; else if (nbytes <= 0) channel->revents |= G_IO_ERR; channel->rdp = (channel->rdp + nbytes) % BUFFER_SIZE; if (nbytes <= 0) break; if (channel->debug) g_print ("write_thread: setting data_avail for thread %#x\n", channel->thread_id); SetEvent (channel->data_avail_event); } channel->running = FALSE; if (channel->needs_close) { if (channel->debug) g_print ("write_thread %#x: channel fd %d needs closing\n", channel->thread_id, channel->fd); close (channel->fd); channel->fd = -1; } LeaveCriticalSection (&channel->mutex); g_io_channel_unref ((GIOChannel *)channel); return 0; } static void create_thread (GIOWin32Channel *channel, GIOCondition condition, unsigned (__stdcall *thread) (void *parameter)) { HANDLE thread_handle; thread_handle = (HANDLE) _beginthreadex (NULL, 0, thread, channel, 0, &channel->thread_id); if (thread_handle == 0) g_warning ("Error creating thread: %s.", g_strerror (errno)); else if (!CloseHandle (thread_handle)) { gchar *emsg = g_win32_error_message (GetLastError ()); g_warning ("Error closing thread handle: %s.", emsg); g_free (emsg); } WaitForSingleObject (channel->space_avail_event, INFINITE); } static GIOStatus buffer_read (GIOWin32Channel *channel, gchar *dest, gsize count, gsize *bytes_read, GError **err) { guint nbytes; guint left = count; EnterCriticalSection (&channel->mutex); if (channel->debug) g_print ("reading from thread %#x %" G_GSIZE_FORMAT " bytes, rdp=%d, wrp=%d\n", channel->thread_id, count, channel->rdp, channel->wrp); if (channel->wrp == channel->rdp) { LeaveCriticalSection (&channel->mutex); if (channel->debug) g_print ("waiting for data from thread %#x\n", channel->thread_id); WaitForSingleObject (channel->data_avail_event, INFINITE); if (channel->debug) g_print ("done waiting for data from thread %#x\n", channel->thread_id); EnterCriticalSection (&channel->mutex); if (channel->wrp == channel->rdp && !channel->running) { if (channel->debug) g_print ("wrp==rdp, !running\n"); LeaveCriticalSection (&channel->mutex); *bytes_read = 0; return G_IO_STATUS_EOF; } } if (channel->rdp < channel->wrp) nbytes = channel->wrp - channel->rdp; else nbytes = BUFFER_SIZE - channel->rdp; LeaveCriticalSection (&channel->mutex); nbytes = MIN (left, nbytes); if (channel->debug) g_print ("moving %d bytes from thread %#x\n", nbytes, channel->thread_id); memcpy (dest, channel->buffer + channel->rdp, nbytes); dest += nbytes; left -= nbytes; EnterCriticalSection (&channel->mutex); channel->rdp = (channel->rdp + nbytes) % BUFFER_SIZE; if (channel->debug) g_print ("setting space_avail for thread %#x\n", channel->thread_id); SetEvent (channel->space_avail_event); if (channel->debug) g_print ("for thread %#x: rdp=%d, wrp=%d\n", channel->thread_id, channel->rdp, channel->wrp); if (channel->running && channel->wrp == channel->rdp) { if (channel->debug) g_print ("resetting data_avail of thread %#x\n", channel->thread_id); ResetEvent (channel->data_avail_event); }; LeaveCriticalSection (&channel->mutex); /* We have no way to indicate any errors form the actual * read() or recv() call in the reader thread. Should we have? */ *bytes_read = count - left; return (*bytes_read > 0) ? G_IO_STATUS_NORMAL : G_IO_STATUS_EOF; } static GIOStatus buffer_write (GIOWin32Channel *channel, const gchar *dest, gsize count, gsize *bytes_written, GError **err) { guint nbytes; guint left = count; EnterCriticalSection (&channel->mutex); if (channel->debug) g_print ("buffer_write: writing to thread %#x %" G_GSIZE_FORMAT " bytes, rdp=%d, wrp=%d\n", channel->thread_id, count, channel->rdp, channel->wrp); if ((channel->wrp + 1) % BUFFER_SIZE == channel->rdp) { /* Buffer is full */ if (channel->debug) g_print ("buffer_write: tid %#x: resetting data_avail\n", channel->thread_id); ResetEvent (channel->data_avail_event); if (channel->debug) g_print ("buffer_write: tid %#x: waiting for space\n", channel->thread_id); LeaveCriticalSection (&channel->mutex); WaitForSingleObject (channel->data_avail_event, INFINITE); EnterCriticalSection (&channel->mutex); if (channel->debug) g_print ("buffer_write: tid %#x: rdp=%d, wrp=%d\n", channel->thread_id, channel->rdp, channel->wrp); } nbytes = MIN ((channel->rdp + BUFFER_SIZE - channel->wrp - 1) % BUFFER_SIZE, BUFFER_SIZE - channel->wrp); LeaveCriticalSection (&channel->mutex); nbytes = MIN (left, nbytes); if (channel->debug) g_print ("buffer_write: tid %#x: writing %d bytes\n", channel->thread_id, nbytes); memcpy (channel->buffer + channel->wrp, dest, nbytes); dest += nbytes; left -= nbytes; EnterCriticalSection (&channel->mutex); channel->wrp = (channel->wrp + nbytes) % BUFFER_SIZE; if (channel->debug) g_print ("buffer_write: tid %#x: rdp=%d, wrp=%d, setting space_avail\n", channel->thread_id, channel->rdp, channel->wrp); SetEvent (channel->space_avail_event); if ((channel->wrp + 1) % BUFFER_SIZE == channel->rdp) { /* Buffer is full */ if (channel->debug) g_print ("buffer_write: tid %#x: resetting data_avail\n", channel->thread_id); ResetEvent (channel->data_avail_event); } LeaveCriticalSection (&channel->mutex); /* We have no way to indicate any errors form the actual * write() call in the writer thread. Should we have? */ *bytes_written = count - left; return (*bytes_written > 0) ? G_IO_STATUS_NORMAL : G_IO_STATUS_EOF; } static gboolean g_io_win32_prepare (GSource *source, gint *timeout) { GIOWin32Watch *watch = (GIOWin32Watch *)source; GIOCondition buffer_condition = g_io_channel_get_buffer_condition (watch->channel); GIOWin32Channel *channel = (GIOWin32Channel *)watch->channel; int event_mask; *timeout = -1; if (channel->debug) g_print ("g_io_win32_prepare: source=%p channel=%p", source, channel); switch (channel->type) { case G_IO_WIN32_WINDOWS_MESSAGES: if (channel->debug) g_print (" MSG"); break; case G_IO_WIN32_CONSOLE: if (channel->debug) g_print (" CON"); break; case G_IO_WIN32_FILE_DESC: if (channel->debug) g_print (" FD thread=%#x buffer_condition:{%s}" "\n watch->pollfd.events:{%s} watch->pollfd.revents:{%s} channel->revents:{%s}", channel->thread_id, condition_to_string (buffer_condition), condition_to_string (watch->pollfd.events), condition_to_string (watch->pollfd.revents), condition_to_string (channel->revents)); EnterCriticalSection (&channel->mutex); if (channel->running) { if (channel->direction == 0 && channel->wrp == channel->rdp) { if (channel->debug) g_print ("\n setting revents=0"); channel->revents = 0; } } else { if (channel->direction == 1 && (channel->wrp + 1) % BUFFER_SIZE == channel->rdp) { if (channel->debug) g_print ("\n setting revents=0"); channel->revents = 0; } } LeaveCriticalSection (&channel->mutex); break; case G_IO_WIN32_SOCKET: if (channel->debug) g_print (" SOCK"); event_mask = 0; if (watch->condition & G_IO_IN) event_mask |= (FD_READ | FD_ACCEPT); if (watch->condition & G_IO_OUT) event_mask |= (FD_WRITE | FD_CONNECT); event_mask |= FD_CLOSE; if (channel->event_mask != event_mask) { if (channel->debug) g_print ("\n WSAEventSelect(%d,%p,{%s})", channel->fd, (HANDLE) watch->pollfd.fd, event_mask_to_string (event_mask)); if (WSAEventSelect (channel->fd, (HANDLE) watch->pollfd.fd, event_mask) == SOCKET_ERROR) if (channel->debug) { gchar *emsg = g_win32_error_message (WSAGetLastError ()); g_print (" failed: %s", emsg); g_free (emsg); } channel->event_mask = event_mask; if (channel->debug) g_print ("\n setting last_events=0"); channel->last_events = 0; if ((event_mask & FD_WRITE) && channel->ever_writable && !channel->write_would_have_blocked) { if (channel->debug) g_print (" WSASetEvent(%p)", (WSAEVENT) watch->pollfd.fd); WSASetEvent ((WSAEVENT) watch->pollfd.fd); } } break; default: g_assert_not_reached (); abort (); } if (channel->debug) g_print ("\n"); return ((watch->condition & buffer_condition) == watch->condition); } static gboolean g_io_win32_check (GSource *source) { MSG msg; GIOWin32Watch *watch = (GIOWin32Watch *)source; GIOWin32Channel *channel = (GIOWin32Channel *)watch->channel; GIOCondition buffer_condition = g_io_channel_get_buffer_condition (watch->channel); WSANETWORKEVENTS events; if (channel->debug) g_print ("g_io_win32_check: source=%p channel=%p", source, channel); switch (channel->type) { case G_IO_WIN32_WINDOWS_MESSAGES: if (channel->debug) g_print (" MSG\n"); return (PeekMessage (&msg, channel->hwnd, 0, 0, PM_NOREMOVE)); case G_IO_WIN32_FILE_DESC: if (channel->debug) g_print (" FD thread=%#x buffer_condition=%s\n" " watch->pollfd.events={%s} watch->pollfd.revents={%s} channel->revents={%s}\n", channel->thread_id, condition_to_string (buffer_condition), condition_to_string (watch->pollfd.events), condition_to_string (watch->pollfd.revents), condition_to_string (channel->revents)); watch->pollfd.revents = (watch->pollfd.events & channel->revents); return ((watch->pollfd.revents | buffer_condition) & watch->condition); case G_IO_WIN32_CONSOLE: if (channel->debug) g_print (" CON\n"); if (watch->channel->is_writeable) return TRUE; else if (watch->channel->is_readable) { INPUT_RECORD buffer; DWORD n; if (PeekConsoleInput ((HANDLE) watch->pollfd.fd, &buffer, 1, &n) && n == 1) { /* _kbhit() does quite complex processing to find out * whether at least one of the key events pending corresponds * to a "real" character that can be read. */ if (_kbhit ()) return TRUE; /* Discard all other kinds of events */ ReadConsoleInput ((HANDLE) watch->pollfd.fd, &buffer, 1, &n); } } return FALSE; case G_IO_WIN32_SOCKET: if (channel->debug) g_print (" SOCK"); if (channel->last_events & FD_WRITE) { if (channel->debug) g_print (" sock=%d event=%p last_events has FD_WRITE", channel->fd, (HANDLE) watch->pollfd.fd); } else { WSAEnumNetworkEvents (channel->fd, 0, &events); if (channel->debug) g_print ("\n revents={%s} condition={%s}" "\n WSAEnumNetworkEvents(%d,0) sets events={%s}", condition_to_string (watch->pollfd.revents), condition_to_string (watch->condition), channel->fd, event_mask_to_string (events.lNetworkEvents)); if (watch->pollfd.revents != 0 && events.lNetworkEvents == 0 && !(channel->event_mask & FD_WRITE)) { channel->event_mask = 0; if (channel->debug) g_print ("\n WSAEventSelect(%d,%p,{})", channel->fd, (HANDLE) watch->pollfd.fd); WSAEventSelect (channel->fd, (HANDLE) watch->pollfd.fd, 0); if (channel->debug) g_print (" ResetEvent(%p)", (HANDLE) watch->pollfd.fd); ResetEvent ((HANDLE) watch->pollfd.fd); } else if (events.lNetworkEvents & FD_WRITE) channel->ever_writable = TRUE; channel->last_events = events.lNetworkEvents; } watch->pollfd.revents = 0; if (channel->last_events & (FD_READ | FD_ACCEPT)) watch->pollfd.revents |= G_IO_IN; if (channel->last_events & FD_WRITE) watch->pollfd.revents |= G_IO_OUT; else { /* We have called WSAEnumNetworkEvents() above but it didn't * set FD_WRITE. */ if (events.lNetworkEvents & FD_CONNECT) { if (events.iErrorCode[FD_CONNECT_BIT] == 0) watch->pollfd.revents |= G_IO_OUT; else watch->pollfd.revents |= (G_IO_HUP | G_IO_ERR); } if (watch->pollfd.revents == 0 && (channel->last_events & (FD_CLOSE))) watch->pollfd.revents |= G_IO_HUP; } /* Regardless of WSAEnumNetworkEvents() result, if watching for * writability, and if we have ever got a FD_WRITE event, and * unless last write would have blocked, set G_IO_OUT. But never * set both G_IO_OUT and G_IO_HUP. */ if (!(watch->pollfd.revents & G_IO_HUP) && channel->ever_writable && !channel->write_would_have_blocked && (channel->event_mask & FD_WRITE)) watch->pollfd.revents |= G_IO_OUT; if (channel->debug) g_print ("\n revents={%s} retval={%s}\n", condition_to_string (watch->pollfd.revents), condition_to_string ((watch->pollfd.revents | buffer_condition) & watch->condition)); return ((watch->pollfd.revents | buffer_condition) & watch->condition); default: g_assert_not_reached (); abort (); } } static gboolean g_io_win32_dispatch (GSource *source, GSourceFunc callback, gpointer user_data) { GIOFunc func = (GIOFunc)callback; GIOWin32Watch *watch = (GIOWin32Watch *)source; GIOWin32Channel *channel = (GIOWin32Channel *)watch->channel; GIOCondition buffer_condition = g_io_channel_get_buffer_condition (watch->channel); if (!func) { g_warning ("IO Watch dispatched without callback\n" "You must call g_source_connect()."); return FALSE; } if (channel->debug) g_print ("g_io_win32_dispatch: pollfd.revents=%s condition=%s result=%s\n", condition_to_string (watch->pollfd.revents), condition_to_string (watch->condition), condition_to_string ((watch->pollfd.revents | buffer_condition) & watch->condition)); return (*func) (watch->channel, (watch->pollfd.revents | buffer_condition) & watch->condition, user_data); } static void g_io_win32_finalize (GSource *source) { GIOWin32Watch *watch = (GIOWin32Watch *)source; GIOWin32Channel *channel = (GIOWin32Channel *)watch->channel; if (channel->debug) g_print ("g_io_win32_finalize: source=%p channel=%p", source, channel); switch (channel->type) { case G_IO_WIN32_WINDOWS_MESSAGES: if (channel->debug) g_print (" MSG"); break; case G_IO_WIN32_CONSOLE: if (channel->debug) g_print (" CON"); break; case G_IO_WIN32_FILE_DESC: if (channel->debug) g_print (" FD thread=%#x", channel->thread_id); break; case G_IO_WIN32_SOCKET: if (channel->debug) g_print (" SOCK sock=%d", channel->fd); break; default: g_assert_not_reached (); abort (); } if (channel->debug) g_print ("\n"); g_io_channel_unref (watch->channel); } GSourceFuncs g_io_watch_funcs = { g_io_win32_prepare, g_io_win32_check, g_io_win32_dispatch, g_io_win32_finalize }; static GIOStatus g_io_win32_msg_read (GIOChannel *channel, gchar *buf, gsize count, gsize *bytes_read, GError **err) { GIOWin32Channel *win32_channel = (GIOWin32Channel *)channel; MSG msg; /* In case of alignment problems */ if (count < sizeof (MSG)) { g_set_error_literal (err, G_IO_CHANNEL_ERROR, G_IO_CHANNEL_ERROR_INVAL, "Incorrect message size"); /* Informative enough error message? */ return G_IO_STATUS_ERROR; } if (win32_channel->debug) g_print ("g_io_win32_msg_read: channel=%p hwnd=%p\n", channel, win32_channel->hwnd); if (!PeekMessage (&msg, win32_channel->hwnd, 0, 0, PM_REMOVE)) return G_IO_STATUS_AGAIN; memmove (buf, &msg, sizeof (MSG)); *bytes_read = sizeof (MSG); return G_IO_STATUS_NORMAL; } static GIOStatus g_io_win32_msg_write (GIOChannel *channel, const gchar *buf, gsize count, gsize *bytes_written, GError **err) { GIOWin32Channel *win32_channel = (GIOWin32Channel *)channel; MSG msg; if (count != sizeof (MSG)) { g_set_error_literal (err, G_IO_CHANNEL_ERROR, G_IO_CHANNEL_ERROR_INVAL, "Incorrect message size"); /* Informative enough error message? */ return G_IO_STATUS_ERROR; } /* In case of alignment problems */ memmove (&msg, buf, sizeof (MSG)); if (!PostMessage (win32_channel->hwnd, msg.message, msg.wParam, msg.lParam)) { gchar *emsg = g_win32_error_message (GetLastError ()); g_set_error_literal (err, G_IO_CHANNEL_ERROR, G_IO_CHANNEL_ERROR_FAILED, emsg); g_free (emsg); return G_IO_STATUS_ERROR; } *bytes_written = sizeof (MSG); return G_IO_STATUS_NORMAL; } static GIOStatus g_io_win32_msg_close (GIOChannel *channel, GError **err) { /* Nothing to be done. Or should we set hwnd to some invalid value? */ return G_IO_STATUS_NORMAL; } static void g_io_win32_free (GIOChannel *channel) { GIOWin32Channel *win32_channel = (GIOWin32Channel *)channel; if (win32_channel->debug) g_print ("g_io_win32_free channel=%p fd=%d\n", channel, win32_channel->fd); DeleteCriticalSection (&win32_channel->mutex); if (win32_channel->data_avail_event) if (!CloseHandle (win32_channel->data_avail_event)) if (win32_channel->debug) { gchar *emsg = g_win32_error_message (GetLastError ()); g_print (" CloseHandle(%p) failed: %s\n", win32_channel->data_avail_event, emsg); g_free (emsg); } g_free (win32_channel->buffer); if (win32_channel->space_avail_event) if (!CloseHandle (win32_channel->space_avail_event)) if (win32_channel->debug) { gchar *emsg = g_win32_error_message (GetLastError ()); g_print (" CloseHandle(%p) failed: %s\n", win32_channel->space_avail_event, emsg); g_free (emsg); } if (win32_channel->type == G_IO_WIN32_SOCKET && win32_channel->fd != -1) if (WSAEventSelect (win32_channel->fd, NULL, 0) == SOCKET_ERROR) if (win32_channel->debug) { gchar *emsg = g_win32_error_message (WSAGetLastError ()); g_print (" WSAEventSelect(%d,NULL,{}) failed: %s\n", win32_channel->fd, emsg); g_free (emsg); } if (win32_channel->event) if (!WSACloseEvent (win32_channel->event)) if (win32_channel->debug) { gchar *emsg = g_win32_error_message (WSAGetLastError ()); g_print (" WSACloseEvent(%p) failed: %s\n", win32_channel->event, emsg); g_free (emsg); } g_free (win32_channel); } static GSource * g_io_win32_msg_create_watch (GIOChannel *channel, GIOCondition condition) { GIOWin32Watch *watch; GSource *source; source = g_source_new (&g_io_watch_funcs, sizeof (GIOWin32Watch)); g_source_set_name (source, "GIOChannel (Win32)"); watch = (GIOWin32Watch *)source; watch->channel = channel; g_io_channel_ref (channel); watch->condition = condition; watch->pollfd.fd = (gintptr) G_WIN32_MSG_HANDLE; watch->pollfd.events = condition; g_source_add_poll (source, &watch->pollfd); return source; } static GIOStatus g_io_win32_fd_and_console_read (GIOChannel *channel, gchar *buf, gsize count, gsize *bytes_read, GError **err) { GIOWin32Channel *win32_channel = (GIOWin32Channel *)channel; gint result; if (win32_channel->debug) g_print ("g_io_win32_fd_read: fd=%d count=%" G_GSIZE_FORMAT "\n", win32_channel->fd, count); if (win32_channel->thread_id) { return buffer_read (win32_channel, buf, count, bytes_read, err); } result = read (win32_channel->fd, buf, count); if (win32_channel->debug) g_print ("g_io_win32_fd_read: read() => %d\n", result); if (result < 0) { *bytes_read = 0; switch (errno) { #ifdef EAGAIN case EAGAIN: return G_IO_STATUS_AGAIN; #endif default: g_set_error_literal (err, G_IO_CHANNEL_ERROR, g_io_channel_error_from_errno (errno), g_strerror (errno)); return G_IO_STATUS_ERROR; } } *bytes_read = result; return (result > 0) ? G_IO_STATUS_NORMAL : G_IO_STATUS_EOF; } static GIOStatus g_io_win32_fd_and_console_write (GIOChannel *channel, const gchar *buf, gsize count, gsize *bytes_written, GError **err) { GIOWin32Channel *win32_channel = (GIOWin32Channel *)channel; gint result; if (win32_channel->thread_id) { return buffer_write (win32_channel, buf, count, bytes_written, err); } result = write (win32_channel->fd, buf, count); if (win32_channel->debug) g_print ("g_io_win32_fd_write: fd=%d count=%" G_GSIZE_FORMAT " => %d\n", win32_channel->fd, count, result); if (result < 0) { *bytes_written = 0; switch (errno) { #ifdef EAGAIN case EAGAIN: return G_IO_STATUS_AGAIN; #endif default: g_set_error_literal (err, G_IO_CHANNEL_ERROR, g_io_channel_error_from_errno (errno), g_strerror (errno)); return G_IO_STATUS_ERROR; } } *bytes_written = result; return G_IO_STATUS_NORMAL; } static GIOStatus g_io_win32_fd_seek (GIOChannel *channel, gint64 offset, GSeekType type, GError **err) { GIOWin32Channel *win32_channel = (GIOWin32Channel *)channel; int whence; off_t tmp_offset; off_t result; switch (type) { case G_SEEK_SET: whence = SEEK_SET; break; case G_SEEK_CUR: whence = SEEK_CUR; break; case G_SEEK_END: whence = SEEK_END; break; default: whence = -1; /* Keep the compiler quiet */ g_assert_not_reached (); abort (); } tmp_offset = offset; if (tmp_offset != offset) { g_set_error_literal (err, G_IO_CHANNEL_ERROR, g_io_channel_error_from_errno (EINVAL), g_strerror (EINVAL)); return G_IO_STATUS_ERROR; } result = lseek (win32_channel->fd, tmp_offset, whence); if (result < 0) { g_set_error_literal (err, G_IO_CHANNEL_ERROR, g_io_channel_error_from_errno (errno), g_strerror (errno)); return G_IO_STATUS_ERROR; } return G_IO_STATUS_NORMAL; } static GIOStatus g_io_win32_fd_close (GIOChannel *channel, GError **err) { GIOWin32Channel *win32_channel = (GIOWin32Channel *)channel; if (win32_channel->debug) g_print ("g_io_win32_fd_close: thread=%#x: fd=%d\n", win32_channel->thread_id, win32_channel->fd); EnterCriticalSection (&win32_channel->mutex); if (win32_channel->running) { if (win32_channel->debug) g_print ("thread %#x: running, marking fd %d for later close\n", win32_channel->thread_id, win32_channel->fd); win32_channel->running = FALSE; win32_channel->needs_close = TRUE; if (win32_channel->direction == 0) SetEvent (win32_channel->data_avail_event); else SetEvent (win32_channel->space_avail_event); } else { if (win32_channel->debug) g_print ("closing fd %d\n", win32_channel->fd); close (win32_channel->fd); if (win32_channel->debug) g_print ("closed fd %d, setting to -1\n", win32_channel->fd); win32_channel->fd = -1; } LeaveCriticalSection (&win32_channel->mutex); /* FIXME error detection? */ return G_IO_STATUS_NORMAL; } static GSource * g_io_win32_fd_create_watch (GIOChannel *channel, GIOCondition condition) { GIOWin32Channel *win32_channel = (GIOWin32Channel *)channel; GSource *source = g_source_new (&g_io_watch_funcs, sizeof (GIOWin32Watch)); GIOWin32Watch *watch = (GIOWin32Watch *)source; watch->channel = channel; g_io_channel_ref (channel); watch->condition = condition; if (win32_channel->data_avail_event == NULL) create_events (win32_channel); watch->pollfd.fd = (gintptr) win32_channel->data_avail_event; watch->pollfd.events = condition; if (win32_channel->debug) g_print ("g_io_win32_fd_create_watch: channel=%p fd=%d condition={%s} event=%p\n", channel, win32_channel->fd, condition_to_string (condition), (HANDLE) watch->pollfd.fd); EnterCriticalSection (&win32_channel->mutex); if (win32_channel->thread_id == 0) { if (condition & G_IO_IN) create_thread (win32_channel, condition, read_thread); else if (condition & G_IO_OUT) create_thread (win32_channel, condition, write_thread); } g_source_add_poll (source, &watch->pollfd); LeaveCriticalSection (&win32_channel->mutex); return source; } static GIOStatus g_io_win32_console_close (GIOChannel *channel, GError **err) { GIOWin32Channel *win32_channel = (GIOWin32Channel *)channel; if (close (win32_channel->fd) < 0) { g_set_error_literal (err, G_IO_CHANNEL_ERROR, g_io_channel_error_from_errno (errno), g_strerror (errno)); return G_IO_STATUS_ERROR; } return G_IO_STATUS_NORMAL; } static GSource * g_io_win32_console_create_watch (GIOChannel *channel, GIOCondition condition) { GIOWin32Channel *win32_channel = (GIOWin32Channel *)channel; GSource *source = g_source_new (&g_io_watch_funcs, sizeof (GIOWin32Watch)); GIOWin32Watch *watch = (GIOWin32Watch *)source; watch->channel = channel; g_io_channel_ref (channel); watch->condition = condition; watch->pollfd.fd = _get_osfhandle (win32_channel->fd); watch->pollfd.events = condition; g_source_add_poll (source, &watch->pollfd); return source; } static GIOStatus g_io_win32_sock_read (GIOChannel *channel, gchar *buf, gsize count, gsize *bytes_read, GError **err) { GIOWin32Channel *win32_channel = (GIOWin32Channel *)channel; gint result; GIOChannelError error; int winsock_error; if (win32_channel->debug) g_print ("g_io_win32_sock_read: channel=%p sock=%d count=%" G_GSIZE_FORMAT, channel, win32_channel->fd, count); result = recv (win32_channel->fd, buf, count, 0); if (result == SOCKET_ERROR) winsock_error = WSAGetLastError (); if (win32_channel->debug) g_print (" recv=%d", result); if (result == SOCKET_ERROR) { gchar *emsg = g_win32_error_message (winsock_error); if (win32_channel->debug) g_print (" %s\n", emsg); *bytes_read = 0; switch (winsock_error) { case WSAEINVAL: error = G_IO_CHANNEL_ERROR_INVAL; break; case WSAEWOULDBLOCK: g_free (emsg); return G_IO_STATUS_AGAIN; default: error = G_IO_CHANNEL_ERROR_FAILED; break; } g_set_error_literal (err, G_IO_CHANNEL_ERROR, error, emsg); g_free (emsg); return G_IO_STATUS_ERROR; } else { if (win32_channel->debug) g_print ("\n"); *bytes_read = result; if (result == 0) return G_IO_STATUS_EOF; else return G_IO_STATUS_NORMAL; } } static GIOStatus g_io_win32_sock_write (GIOChannel *channel, const gchar *buf, gsize count, gsize *bytes_written, GError **err) { GIOWin32Channel *win32_channel = (GIOWin32Channel *)channel; gint result; GIOChannelError error; int winsock_error; if (win32_channel->debug) g_print ("g_io_win32_sock_write: channel=%p sock=%d count=%" G_GSIZE_FORMAT, channel, win32_channel->fd, count); result = send (win32_channel->fd, buf, count, 0); if (result == SOCKET_ERROR) winsock_error = WSAGetLastError (); if (win32_channel->debug) g_print (" send=%d", result); if (result == SOCKET_ERROR) { gchar *emsg = g_win32_error_message (winsock_error); if (win32_channel->debug) g_print (" %s\n", emsg); *bytes_written = 0; switch (winsock_error) { case WSAEINVAL: error = G_IO_CHANNEL_ERROR_INVAL; break; case WSAEWOULDBLOCK: win32_channel->write_would_have_blocked = TRUE; win32_channel->last_events = 0; g_free (emsg); return G_IO_STATUS_AGAIN; default: error = G_IO_CHANNEL_ERROR_FAILED; break; } g_set_error_literal (err, G_IO_CHANNEL_ERROR, error, emsg); g_free (emsg); return G_IO_STATUS_ERROR; } else { if (win32_channel->debug) g_print ("\n"); *bytes_written = result; win32_channel->write_would_have_blocked = FALSE; return G_IO_STATUS_NORMAL; } } static GIOStatus g_io_win32_sock_close (GIOChannel *channel, GError **err) { GIOWin32Channel *win32_channel = (GIOWin32Channel *)channel; if (win32_channel->fd != -1) { if (win32_channel->debug) g_print ("g_io_win32_sock_close: channel=%p sock=%d\n", channel, win32_channel->fd); closesocket (win32_channel->fd); win32_channel->fd = -1; } /* FIXME error detection? */ return G_IO_STATUS_NORMAL; } static GSource * g_io_win32_sock_create_watch (GIOChannel *channel, GIOCondition condition) { GIOWin32Channel *win32_channel = (GIOWin32Channel *)channel; GSource *source = g_source_new (&g_io_watch_funcs, sizeof (GIOWin32Watch)); GIOWin32Watch *watch = (GIOWin32Watch *)source; watch->channel = channel; g_io_channel_ref (channel); watch->condition = condition; if (win32_channel->event == 0) win32_channel->event = WSACreateEvent (); watch->pollfd.fd = (gintptr) win32_channel->event; watch->pollfd.events = condition; if (win32_channel->debug) g_print ("g_io_win32_sock_create_watch: channel=%p sock=%d event=%p condition={%s}\n", channel, win32_channel->fd, (HANDLE) watch->pollfd.fd, condition_to_string (watch->condition)); g_source_add_poll (source, &watch->pollfd); return source; } GIOChannel * g_io_channel_new_file (const gchar *filename, const gchar *mode, GError **error) { int fid, flags, pmode; GIOChannel *channel; enum { /* Cheesy hack */ MODE_R = 1 << 0, MODE_W = 1 << 1, MODE_A = 1 << 2, MODE_PLUS = 1 << 3, }; int mode_num; g_return_val_if_fail (filename != NULL, NULL); g_return_val_if_fail (mode != NULL, NULL); g_return_val_if_fail ((error == NULL) || (*error == NULL), NULL); switch (mode[0]) { case 'r': mode_num = MODE_R; break; case 'w': mode_num = MODE_W; break; case 'a': mode_num = MODE_A; break; default: g_warning ("Invalid GIOFileMode %s.", mode); return NULL; } switch (mode[1]) { case '\0': break; case '+': if (mode[2] == '\0') { mode_num |= MODE_PLUS; break; } /* Fall through */ default: g_warning ("Invalid GIOFileMode %s.", mode); return NULL; } switch (mode_num) { case MODE_R: flags = O_RDONLY; pmode = _S_IREAD; break; case MODE_W: flags = O_WRONLY | O_TRUNC | O_CREAT; pmode = _S_IWRITE; break; case MODE_A: flags = O_WRONLY | O_APPEND | O_CREAT; pmode = _S_IWRITE; break; case MODE_R | MODE_PLUS: flags = O_RDWR; pmode = _S_IREAD | _S_IWRITE; break; case MODE_W | MODE_PLUS: flags = O_RDWR | O_TRUNC | O_CREAT; pmode = _S_IREAD | _S_IWRITE; break; case MODE_A | MODE_PLUS: flags = O_RDWR | O_APPEND | O_CREAT; pmode = _S_IREAD | _S_IWRITE; break; default: g_assert_not_reached (); abort (); } /* always open 'untranslated' */ fid = g_open (filename, flags | _O_BINARY, pmode); if (g_io_win32_get_debug_flag ()) { g_print ("g_io_channel_win32_new_file: open(\"%s\",", filename); g_win32_print_access_mode (flags|_O_BINARY); g_print (",%#o)=%d\n", pmode, fid); } if (fid < 0) { g_set_error_literal (error, G_FILE_ERROR, g_file_error_from_errno (errno), g_strerror (errno)); return (GIOChannel *)NULL; } channel = g_io_channel_win32_new_fd (fid); /* XXX: move this to g_io_channel_win32_new_fd () */ channel->close_on_unref = TRUE; channel->is_seekable = TRUE; /* g_io_channel_win32_new_fd sets is_readable and is_writeable to * correspond to actual readability/writeability. Set to FALSE those * that mode doesn't allow */ switch (mode_num) { case MODE_R: channel->is_writeable = FALSE; break; case MODE_W: case MODE_A: channel->is_readable = FALSE; break; case MODE_R | MODE_PLUS: case MODE_W | MODE_PLUS: case MODE_A | MODE_PLUS: break; default: g_assert_not_reached (); abort (); } return channel; } #if !defined (_WIN64) #undef g_io_channel_new_file /* Binary compatibility version. Not for newly compiled code. */ GIOChannel * g_io_channel_new_file (const gchar *filename, const gchar *mode, GError **error) { gchar *utf8_filename = g_locale_to_utf8 (filename, -1, NULL, NULL, error); GIOChannel *retval; if (utf8_filename == NULL) return NULL; retval = g_io_channel_new_file_utf8 (utf8_filename, mode, error); g_free (utf8_filename); return retval; } #endif static GIOStatus g_io_win32_unimpl_set_flags (GIOChannel *channel, GIOFlags flags, GError **err) { GIOWin32Channel *win32_channel = (GIOWin32Channel *)channel; if (win32_channel->debug) { g_print ("g_io_win32_unimpl_set_flags: "); g_win32_print_gioflags (flags); g_print ("\n"); } g_set_error_literal (err, G_IO_CHANNEL_ERROR, G_IO_CHANNEL_ERROR_FAILED, "Not implemented on Win32"); return G_IO_STATUS_ERROR; } static GIOFlags g_io_win32_fd_get_flags_internal (GIOChannel *channel, struct _stati64 *st) { GIOWin32Channel *win32_channel = (GIOWin32Channel *) channel; gchar c; DWORD count; if (st->st_mode & _S_IFIFO) { channel->is_readable = (PeekNamedPipe ((HANDLE) _get_osfhandle (win32_channel->fd), &c, 0, &count, NULL, NULL) != 0) || GetLastError () == ERROR_BROKEN_PIPE; channel->is_writeable = (WriteFile ((HANDLE) _get_osfhandle (win32_channel->fd), &c, 0, &count, NULL) != 0); channel->is_seekable = FALSE; } else { channel->is_readable = (ReadFile ((HANDLE) _get_osfhandle (win32_channel->fd), &c, 0, &count, NULL) != 0); channel->is_writeable = (WriteFile ((HANDLE) _get_osfhandle (win32_channel->fd), &c, 0, &count, NULL) != 0); channel->is_seekable = TRUE; } /* XXX: G_IO_FLAG_APPEND */ /* XXX: G_IO_FLAG_NONBLOCK */ return 0; } static GIOFlags g_io_win32_fd_get_flags (GIOChannel *channel) { struct _stati64 st; GIOWin32Channel *win32_channel = (GIOWin32Channel *)channel; g_return_val_if_fail (win32_channel != NULL, 0); g_return_val_if_fail (win32_channel->type == G_IO_WIN32_FILE_DESC, 0); if (0 == _fstati64 (win32_channel->fd, &st)) return g_io_win32_fd_get_flags_internal (channel, &st); else return 0; } static GIOFlags g_io_win32_console_get_flags_internal (GIOChannel *channel) { GIOWin32Channel *win32_channel = (GIOWin32Channel *) channel; HANDLE handle = (HANDLE) _get_osfhandle (win32_channel->fd); gchar c; DWORD count; INPUT_RECORD record; channel->is_readable = PeekConsoleInput (handle, &record, 1, &count); channel->is_writeable = WriteFile (handle, &c, 0, &count, NULL); channel->is_seekable = FALSE; return 0; } static GIOFlags g_io_win32_console_get_flags (GIOChannel *channel) { GIOWin32Channel *win32_channel = (GIOWin32Channel *)channel; g_return_val_if_fail (win32_channel != NULL, 0); g_return_val_if_fail (win32_channel->type == G_IO_WIN32_CONSOLE, 0); return g_io_win32_console_get_flags_internal (channel); } static GIOFlags g_io_win32_msg_get_flags (GIOChannel *channel) { return 0; } static GIOStatus g_io_win32_sock_set_flags (GIOChannel *channel, GIOFlags flags, GError **err) { GIOWin32Channel *win32_channel = (GIOWin32Channel *)channel; u_long arg; if (win32_channel->debug) { g_print ("g_io_win32_sock_set_flags: "); g_win32_print_gioflags (flags); g_print ("\n"); } if (flags & G_IO_FLAG_NONBLOCK) { arg = 1; if (ioctlsocket (win32_channel->fd, FIONBIO, &arg) == SOCKET_ERROR) { gchar *emsg = g_win32_error_message (WSAGetLastError ()); g_set_error_literal (err, G_IO_CHANNEL_ERROR, G_IO_CHANNEL_ERROR_FAILED, emsg); g_free (emsg); return G_IO_STATUS_ERROR; } } else { arg = 0; if (ioctlsocket (win32_channel->fd, FIONBIO, &arg) == SOCKET_ERROR) { gchar *emsg = g_win32_error_message (WSAGetLastError ()); g_set_error_literal (err, G_IO_CHANNEL_ERROR, G_IO_CHANNEL_ERROR_FAILED, emsg); g_free (emsg); return G_IO_STATUS_ERROR; } } return G_IO_STATUS_NORMAL; } static GIOFlags g_io_win32_sock_get_flags (GIOChannel *channel) { /* Could we do something here? */ return 0; } static GIOFuncs win32_channel_msg_funcs = { g_io_win32_msg_read, g_io_win32_msg_write, NULL, g_io_win32_msg_close, g_io_win32_msg_create_watch, g_io_win32_free, g_io_win32_unimpl_set_flags, g_io_win32_msg_get_flags, }; static GIOFuncs win32_channel_fd_funcs = { g_io_win32_fd_and_console_read, g_io_win32_fd_and_console_write, g_io_win32_fd_seek, g_io_win32_fd_close, g_io_win32_fd_create_watch, g_io_win32_free, g_io_win32_unimpl_set_flags, g_io_win32_fd_get_flags, }; static GIOFuncs win32_channel_console_funcs = { g_io_win32_fd_and_console_read, g_io_win32_fd_and_console_write, NULL, g_io_win32_console_close, g_io_win32_console_create_watch, g_io_win32_free, g_io_win32_unimpl_set_flags, g_io_win32_console_get_flags, }; static GIOFuncs win32_channel_sock_funcs = { g_io_win32_sock_read, g_io_win32_sock_write, NULL, g_io_win32_sock_close, g_io_win32_sock_create_watch, g_io_win32_free, g_io_win32_sock_set_flags, g_io_win32_sock_get_flags, }; /** * g_io_channel_win32_new_messages: * @hwnd: a window handle. * * 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 g_io_channel_win32_new_messages (gsize hwnd) #else g_io_channel_win32_new_messages (guint hwnd) #endif { GIOWin32Channel *win32_channel = g_new (GIOWin32Channel, 1); GIOChannel *channel = (GIOChannel *)win32_channel; g_io_channel_init (channel); g_io_channel_win32_init (win32_channel); if (win32_channel->debug) g_print ("g_io_channel_win32_new_messages: channel=%p hwnd=%p\n", channel, (HWND) hwnd); channel->funcs = &win32_channel_msg_funcs; win32_channel->type = G_IO_WIN32_WINDOWS_MESSAGES; win32_channel->hwnd = (HWND) hwnd; /* XXX: check this. */ channel->is_readable = IsWindow (win32_channel->hwnd); channel->is_writeable = IsWindow (win32_channel->hwnd); channel->is_seekable = FALSE; return channel; } static GIOChannel * g_io_channel_win32_new_fd_internal (gint fd, struct _stati64 *st) { GIOWin32Channel *win32_channel; GIOChannel *channel; win32_channel = g_new (GIOWin32Channel, 1); channel = (GIOChannel *)win32_channel; g_io_channel_init (channel); g_io_channel_win32_init (win32_channel); win32_channel->fd = fd; if (win32_channel->debug) g_print ("g_io_channel_win32_new_fd: channel=%p fd=%u\n", channel, fd); if (st->st_mode & _S_IFCHR) /* console */ { channel->funcs = &win32_channel_console_funcs; win32_channel->type = G_IO_WIN32_CONSOLE; g_io_win32_console_get_flags_internal (channel); } else { channel->funcs = &win32_channel_fd_funcs; win32_channel->type = G_IO_WIN32_FILE_DESC; g_io_win32_fd_get_flags_internal (channel, st); } return channel; } /** * g_io_channel_win32_new_fd: * @fd: a C library file descriptor. * * Creates a new #GIOChannel given a file descriptor on Windows. This * works for file descriptors from the C runtime. * * This function works for file descriptors as returned by the open(), * creat(), pipe() and fileno() calls in the Microsoft C runtime. In * order to meaningfully use this function your code should use the * same C runtime as GLib uses, which is msvcrt.dll. Note that in * current Microsoft compilers it is near impossible to convince it to * build code that would use msvcrt.dll. The last Microsoft compiler * version that supported using msvcrt.dll as the C runtime was version * 6. The GNU compiler and toolchain for Windows, also known as Mingw, * fully supports msvcrt.dll. * * If you have created a #GIOChannel for a file descriptor and started * watching (polling) it, you shouldn't call read() on the file * descriptor. This is because adding polling for a file descriptor is * implemented in GLib on Windows by starting a thread that sits * blocked in a read() from the file descriptor most of the time. All * reads from the file descriptor should be done by this internal GLib * thread. Your code should call only g_io_channel_read(). * * This function is available only in GLib on Windows. * * Returns: a new #GIOChannel. **/ GIOChannel * g_io_channel_win32_new_fd (gint fd) { struct _stati64 st; if (_fstati64 (fd, &st) == -1) { g_warning ("g_io_channel_win32_new_fd: %d isn't an open file descriptor in the C library GLib uses.", fd); return NULL; } return g_io_channel_win32_new_fd_internal (fd, &st); } gint g_io_channel_win32_get_fd (GIOChannel *channel) { GIOWin32Channel *win32_channel = (GIOWin32Channel *)channel; return win32_channel->fd; } /** * g_io_channel_win32_new_socket: * @socket: a Winsock socket * * Creates a new #GIOChannel given a socket on Windows. * * This function works for sockets created by Winsock. It's available * only in GLib on Windows. * * Polling a #GSource created to watch a channel for a socket puts the * socket in non-blocking mode. This is a side-effect of the * implementation and unavoidable. * * Returns: a new #GIOChannel **/ GIOChannel * g_io_channel_win32_new_socket (int socket) { GIOWin32Channel *win32_channel = g_new (GIOWin32Channel, 1); GIOChannel *channel = (GIOChannel *)win32_channel; g_io_channel_init (channel); g_io_channel_win32_init (win32_channel); if (win32_channel->debug) g_print ("g_io_channel_win32_new_socket: channel=%p sock=%d\n", channel, socket); channel->funcs = &win32_channel_sock_funcs; win32_channel->type = G_IO_WIN32_SOCKET; win32_channel->fd = socket; channel->is_readable = TRUE; channel->is_writeable = TRUE; channel->is_seekable = FALSE; return channel; } GIOChannel * g_io_channel_unix_new (gint fd) { gboolean is_fd, is_socket; struct _stati64 st; int optval, optlen; is_fd = (_fstati64 (fd, &st) == 0); optlen = sizeof (optval); is_socket = (getsockopt (fd, SOL_SOCKET, SO_TYPE, (char *) &optval, &optlen) != SOCKET_ERROR); if (is_fd && is_socket) g_warning ("g_io_channel_unix_new: %d is both a file descriptor and a socket. File descriptor interpretation assumed. To avoid ambiguity, call either g_io_channel_win32_new_fd() or g_io_channel_win32_new_socket() instead.", fd); if (is_fd) return g_io_channel_win32_new_fd_internal (fd, &st); if (is_socket) return g_io_channel_win32_new_socket(fd); g_warning ("g_io_channel_unix_new: %d is neither a file descriptor or a socket.", fd); return NULL; } gint g_io_channel_unix_get_fd (GIOChannel *channel) { return g_io_channel_win32_get_fd (channel); } void g_io_channel_win32_set_debug (GIOChannel *channel, gboolean flag) { GIOWin32Channel *win32_channel = (GIOWin32Channel *)channel; win32_channel->debug = flag; } gint g_io_channel_win32_poll (GPollFD *fds, gint n_fds, gint timeout) { g_return_val_if_fail (n_fds >= 0, 0); return g_poll (fds, n_fds, timeout); } void g_io_channel_win32_make_pollfd (GIOChannel *channel, GIOCondition condition, GPollFD *fd) { GIOWin32Channel *win32_channel = (GIOWin32Channel *)channel; switch (win32_channel->type) { case G_IO_WIN32_FILE_DESC: if (win32_channel->data_avail_event == NULL) create_events (win32_channel); fd->fd = (gintptr) win32_channel->data_avail_event; if (win32_channel->thread_id == 0) { /* Is it meaningful for a file descriptor to be polled for * both IN and OUT? For what kind of file descriptor would * that be? Doesn't seem to make sense, in practise the file * descriptors handled here are always read or write ends of * pipes surely, and thus unidirectional. */ if (condition & G_IO_IN) create_thread (win32_channel, condition, read_thread); else if (condition & G_IO_OUT) create_thread (win32_channel, condition, write_thread); } break; case G_IO_WIN32_CONSOLE: fd->fd = _get_osfhandle (win32_channel->fd); break; case G_IO_WIN32_SOCKET: fd->fd = (gintptr) WSACreateEvent (); break; case G_IO_WIN32_WINDOWS_MESSAGES: fd->fd = G_WIN32_MSG_HANDLE; break; default: g_assert_not_reached (); abort (); } fd->events = condition; } #ifndef _WIN64 /* Binary compatibility */ GIOChannel * g_io_channel_win32_new_stream_socket (int socket) { return g_io_channel_win32_new_socket (socket); } #endif pkg-config-0.29.1/glib/glib/gstrfuncs.h0000664000175000017500000002423212651243552014603 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the GLib Team and others 1997-2000. See the AUTHORS * file for a list of people on the GLib Team. See the ChangeLog * files for a list of changes. These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/. */ #ifndef __G_STRFUNCS_H__ #define __G_STRFUNCS_H__ #if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) #error "Only can be included directly." #endif #include #include #include G_BEGIN_DECLS /* Functions like the ones in that are not affected by locale. */ typedef enum { G_ASCII_ALNUM = 1 << 0, G_ASCII_ALPHA = 1 << 1, G_ASCII_CNTRL = 1 << 2, G_ASCII_DIGIT = 1 << 3, G_ASCII_GRAPH = 1 << 4, G_ASCII_LOWER = 1 << 5, G_ASCII_PRINT = 1 << 6, G_ASCII_PUNCT = 1 << 7, G_ASCII_SPACE = 1 << 8, G_ASCII_UPPER = 1 << 9, G_ASCII_XDIGIT = 1 << 10 } GAsciiType; GLIB_VAR const guint16 * const g_ascii_table; #define g_ascii_isalnum(c) \ ((g_ascii_table[(guchar) (c)] & G_ASCII_ALNUM) != 0) #define g_ascii_isalpha(c) \ ((g_ascii_table[(guchar) (c)] & G_ASCII_ALPHA) != 0) #define g_ascii_iscntrl(c) \ ((g_ascii_table[(guchar) (c)] & G_ASCII_CNTRL) != 0) #define g_ascii_isdigit(c) \ ((g_ascii_table[(guchar) (c)] & G_ASCII_DIGIT) != 0) #define g_ascii_isgraph(c) \ ((g_ascii_table[(guchar) (c)] & G_ASCII_GRAPH) != 0) #define g_ascii_islower(c) \ ((g_ascii_table[(guchar) (c)] & G_ASCII_LOWER) != 0) #define g_ascii_isprint(c) \ ((g_ascii_table[(guchar) (c)] & G_ASCII_PRINT) != 0) #define g_ascii_ispunct(c) \ ((g_ascii_table[(guchar) (c)] & G_ASCII_PUNCT) != 0) #define g_ascii_isspace(c) \ ((g_ascii_table[(guchar) (c)] & G_ASCII_SPACE) != 0) #define g_ascii_isupper(c) \ ((g_ascii_table[(guchar) (c)] & G_ASCII_UPPER) != 0) #define g_ascii_isxdigit(c) \ ((g_ascii_table[(guchar) (c)] & G_ASCII_XDIGIT) != 0) 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); /* 29 bytes should enough for all possible values that * g_ascii_dtostr can produce. * Then add 10 for good measure */ #define G_ASCII_DTOSTR_BUF_SIZE (29 + 10) 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; GLIB_DEPRECATED gint g_strcasecmp (const gchar *s1, const gchar *s2); GLIB_DEPRECATED gint g_strncasecmp (const gchar *s1, const gchar *s2, guint n); GLIB_DEPRECATED gchar* g_strdown (gchar *string); GLIB_DEPRECATED 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_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; /* Make a copy of a string interpreting C string -style escape * sequences. Inverse of g_strescape. The recognized sequences are \b * \f \n \r \t \\ \" and the octal format. */ GLIB_AVAILABLE_IN_ALL gchar* g_strcompress (const gchar *source) G_GNUC_MALLOC; /* Copy a string escaping nonprintable characters like in C strings. * Inverse of g_strcompress. The exceptions parameter, if non-NULL, points * to a string containing characters that are not to be escaped. * * Deprecated API: gchar* g_strescape (const gchar *source); * Luckily this function wasn't used much, using NULL as second parameter * provides mostly identical semantics. */ 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); /* NULL terminated string arrays. * g_strsplit(), g_strsplit_set() split up string into max_tokens tokens * at delim and return a newly allocated string array. * g_strjoinv() concatenates all of str_array's strings, sliding in an * optional separator, the returned string is newly allocated. * g_strfreev() frees the array itself and all of its strings. * g_strdupv() copies a NULL-terminated array of strings * g_strv_length() returns the length of a NULL-terminated array of strings */ 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); G_END_DECLS #endif /* __G_STRFUNCS_H__ */ pkg-config-0.29.1/glib/glib/gtimezone.h0000664000175000017500000000675012651243552014573 00000000000000/* * Copyright © 2010 Codethink Limited * * This library is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2 of the * licence, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, * USA. * * Author: Ryan Lortie */ #ifndef __G_TIME_ZONE_H__ #define __G_TIME_ZONE_H__ #if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) #error "Only can be included directly." #endif #include G_BEGIN_DECLS typedef struct _GTimeZone GTimeZone; /** * GTimeType: * @G_TIME_TYPE_STANDARD: the time is in local standard time * @G_TIME_TYPE_DAYLIGHT: the time is in local daylight time * @G_TIME_TYPE_UNIVERSAL: the time is in UTC * * Disambiguates a given time in two ways. * * First, specifies if the given time is in universal or local time. * * Second, if the time is in local time, specifies if it is local * standard time or local daylight time. This is important for the case * where the same local time occurs twice (during daylight savings time * transitions, for example). */ typedef enum { G_TIME_TYPE_STANDARD, G_TIME_TYPE_DAYLIGHT, 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); G_END_DECLS #endif /* __G_TIME_ZONE_H__ */ pkg-config-0.29.1/glib/glib/ggettext.c0000664000175000017500000004432112651243552014414 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1998 Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the GLib Team and others 1997-2000. See the AUTHORS * file for a list of people on the GLib Team. See the ChangeLog * files for a list of changes. These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/. */ #include "config.h" #include "ggettext.h" #include "glibintl.h" #include "glib-private.h" #include "galloca.h" #include "gthread.h" #include "gmem.h" #ifdef G_OS_WIN32 #include "gwin32.h" #include "gfileutils.h" #include "gstrfuncs.h" #include "glib-init.h" #endif #include #include #include "glibintl.h" #ifdef G_OS_WIN32 /** * _glib_get_locale_dir: * * Return the path to the share\locale or lib\locale subfolder of the * GLib installation folder. The path is in the system codepage. We * have to use system codepage as bindtextdomain() doesn't have a * UTF-8 interface. */ gchar * _glib_get_locale_dir (void) { gchar *install_dir = NULL, *locale_dir; gchar *retval = NULL; if (glib_dll != NULL) install_dir = g_win32_get_package_installation_directory_of_module (glib_dll); if (install_dir) { /* * Append "/share/locale" or "/lib/locale" depending on whether * autoconfigury detected GNU gettext or not. */ const char *p = GLIB_LOCALE_DIR + strlen (GLIB_LOCALE_DIR); while (*--p != '/') ; while (*--p != '/') ; locale_dir = g_build_filename (install_dir, p, NULL); retval = g_win32_locale_filename_from_utf8 (locale_dir); g_free (install_dir); g_free (locale_dir); } if (retval) return retval; else return g_strdup (""); } #undef GLIB_LOCALE_DIR #endif /* G_OS_WIN32 */ static void ensure_gettext_initialized (void) { static gsize initialised; if (g_once_init_enter (&initialised)) { #ifdef G_OS_WIN32 gchar *tmp = _glib_get_locale_dir (); bindtextdomain (GETTEXT_PACKAGE, tmp); g_free (tmp); #else bindtextdomain (GETTEXT_PACKAGE, GLIB_LOCALE_DIR); #endif # ifdef HAVE_BIND_TEXTDOMAIN_CODESET bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); # endif g_once_init_leave (&initialised, TRUE); } } /** * glib_gettext: * @str: The string to be translated * * Returns the translated string from the glib translations. * This is an internal function and should only be used by * the internals of glib (such as libgio). * * Returns: the transation of @str to the current locale */ const gchar * glib_gettext (const gchar *str) { ensure_gettext_initialized (); return g_dgettext (GETTEXT_PACKAGE, str); } /** * glib_pgettext: * @msgctxtid: a combined message context and message id, separated * by a \004 character * @msgidoffset: the offset of the message id in @msgctxid * * This function is a variant of glib_gettext() which supports * a disambiguating message context. See g_dpgettext() for full * details. * * This is an internal function and should only be used by * the internals of glib (such as libgio). * * Returns: the translation of @str to the current locale */ const gchar * glib_pgettext (const gchar *msgctxtid, gsize msgidoffset) { ensure_gettext_initialized (); return g_dpgettext (GETTEXT_PACKAGE, msgctxtid, msgidoffset); } /** * g_strip_context: * @msgid: a string * @msgval: another string * * An auxiliary function for gettext() support (see Q_()). * * Return value: @msgval, unless @msgval is identical to @msgid * and contains a '|' character, in which case a pointer to * the substring of msgid after the first '|' character is returned. * * Since: 2.4 */ const gchar * g_strip_context (const gchar *msgid, const gchar *msgval) { if (msgval == msgid) { const char *c = strchr (msgid, '|'); if (c != NULL) return c + 1; } return msgval; } /** * g_dpgettext: * @domain: (allow-none): the translation domain to use, or %NULL to use * the domain set with textdomain() * @msgctxtid: a combined message context and message id, separated * by a \004 character * @msgidoffset: the offset of the message id in @msgctxid * * This function is a variant of g_dgettext() which supports * a disambiguating message context. GNU gettext uses the * '\004' character to separate the message context and * message id in @msgctxtid. * If 0 is passed as @msgidoffset, this function will fall back to * trying to use the deprecated convention of using "|" as a separation * character. * * This uses g_dgettext() internally. See that functions for differences * with dgettext() proper. * * Applications should normally not use this function directly, * but use the C_() macro for translations with context. * * Returns: The translated string * * Since: 2.16 */ const gchar * g_dpgettext (const gchar *domain, const gchar *msgctxtid, gsize msgidoffset) { const gchar *translation; gchar *sep; translation = g_dgettext (domain, msgctxtid); if (translation == msgctxtid) { if (msgidoffset > 0) return msgctxtid + msgidoffset; sep = strchr (msgctxtid, '|'); if (sep) { /* try with '\004' instead of '|', in case * xgettext -kQ_:1g was used */ gchar *tmp = g_alloca (strlen (msgctxtid) + 1); strcpy (tmp, msgctxtid); tmp[sep - msgctxtid] = '\004'; translation = g_dgettext (domain, tmp); if (translation == tmp) return sep + 1; } } return translation; } /* This function is taken from gettext.h * GNU gettext uses '\004' to separate context and msgid in .mo files. */ /** * g_dpgettext2: * @domain: (allow-none): the translation domain to use, or %NULL to use * the domain set with textdomain() * @context: the message context * @msgid: the message * * This function is a variant of g_dgettext() which supports * a disambiguating message context. GNU gettext uses the * '\004' character to separate the message context and * message id in @msgctxtid. * * This uses g_dgettext() internally. See that functions for differences * with dgettext() proper. * * This function differs from C_() in that it is not a macro and * thus you may use non-string-literals as context and msgid arguments. * * Returns: The translated string * * Since: 2.18 */ const gchar * g_dpgettext2 (const gchar *domain, const gchar *msgctxt, const gchar *msgid) { size_t msgctxt_len = strlen (msgctxt) + 1; size_t msgid_len = strlen (msgid) + 1; const char *translation; char* msg_ctxt_id; msg_ctxt_id = g_alloca (msgctxt_len + msgid_len); memcpy (msg_ctxt_id, msgctxt, msgctxt_len - 1); msg_ctxt_id[msgctxt_len - 1] = '\004'; memcpy (msg_ctxt_id + msgctxt_len, msgid, msgid_len); translation = g_dgettext (domain, msg_ctxt_id); if (translation == msg_ctxt_id) { /* try the old way of doing message contexts, too */ msg_ctxt_id[msgctxt_len - 1] = '|'; translation = g_dgettext (domain, msg_ctxt_id); if (translation == msg_ctxt_id) return msgid; } return translation; } static gboolean _g_dgettext_should_translate (void) { static gsize translate = 0; enum { SHOULD_TRANSLATE = 1, SHOULD_NOT_TRANSLATE = 2 }; if (G_UNLIKELY (g_once_init_enter (&translate))) { gboolean should_translate = TRUE; const char *default_domain = textdomain (NULL); const char *translator_comment = gettext (""); #ifndef G_OS_WIN32 const char *translate_locale = setlocale (LC_MESSAGES, NULL); #else const char *translate_locale = g_win32_getlocale (); #endif /* We should NOT translate only if all the following hold: * - user has called textdomain() and set textdomain to non-default * - default domain has no translations * - locale does not start with "en_" and is not "C" * * Rationale: * - If text domain is still the default domain, maybe user calls * it later. Continue with old behavior of translating. * - If locale starts with "en_", we can continue using the * translations even if the app doesn't have translations for * this locale. That is, en_UK and en_CA for example. * - If locale is "C", maybe user calls setlocale(LC_ALL,"") later. * Continue with old behavior of translating. */ 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"))) should_translate = FALSE; g_once_init_leave (&translate, should_translate ? SHOULD_TRANSLATE : SHOULD_NOT_TRANSLATE); } return translate == SHOULD_TRANSLATE; } /** * g_dgettext: * @domain: (allow-none): the translation domain to use, or %NULL to use * the domain set with textdomain() * @msgid: message to translate * * This function is a wrapper of dgettext() which does not translate * the message if the default domain as set with textdomain() has no * translations for the current locale. * * The advantage of using this function over dgettext() proper is that * libraries using this function (like GTK+) will not use translations * if the application using the library does not have translations for * the current locale. This results in a consistent English-only * interface instead of one having partial translations. For this * feature to work, the call to textdomain() and setlocale() should * precede any g_dgettext() invocations. For GTK+, it means calling * textdomain() before gtk_init or its variants. * * This function disables translations if and only if upon its first * call all the following conditions hold: * * @domain is not %NULL * textdomain() has been called to set a default text domain * there is no translations available for the default text domain * and the current locale * current locale is not "C" or any English locales (those * starting with "en_") * * * Note that this behavior may not be desired for example if an application * has its untranslated messages in a language other than English. In those * cases the application should call textdomain() after initializing GTK+. * * Applications should normally not use this function directly, * but use the _() macro for translations. * * Returns: The translated string * * Since: 2.18 */ const gchar * g_dgettext (const gchar *domain, const gchar *msgid) { if (domain && G_UNLIKELY (!_g_dgettext_should_translate ())) return msgid; return dgettext (domain, msgid); } /** * g_dcgettext: * @domain: (allow-none): the translation domain to use, or %NULL to use * the domain set with textdomain() * @msgid: message to translate * @category: a locale category * * This is a variant of g_dgettext() that allows specifying a locale * category instead of always using LC_MESSAGES. See g_dgettext() for * more information about how this functions differs from calling * dcgettext() directly. * * Returns: the translated string for the given locale category * * Since: 2.26 */ const gchar * g_dcgettext (const gchar *domain, const gchar *msgid, gint category) { if (domain && G_UNLIKELY (!_g_dgettext_should_translate ())) return msgid; return dcgettext (domain, msgid, category); } /** * g_dngettext: * @domain: (allow-none): the translation domain to use, or %NULL to use * the domain set with textdomain() * @msgid: message to translate * @msgid_plural: plural form of the message * @n: the quantity for which translation is needed * * This function is a wrapper of dngettext() which does not translate * the message if the default domain as set with textdomain() has no * translations for the current locale. * * See g_dgettext() for details of how this differs from dngettext() * proper. * * Returns: The translated string * * Since: 2.18 */ const gchar * g_dngettext (const gchar *domain, const gchar *msgid, const gchar *msgid_plural, gulong n) { if (domain && G_UNLIKELY (!_g_dgettext_should_translate ())) return n == 1 ? msgid : msgid_plural; return dngettext (domain, msgid, msgid_plural, n); } /** * SECTION:i18n * @title: Internationalization * @short_description: gettext support macros * @see_also: the gettext manual * * GLib doesn't force any particular localization method upon its users. * But since GLib itself is localized using the gettext() mechanism, it seems * natural to offer the de-facto standard gettext() support macros in an * easy-to-use form. * * In order to use these macros in an application, you must include * glib/gi18n.h. For use in a library, you must include * glib/gi18n-lib.h after defining * the GETTEXT_PACKAGE macro suitably for your library: * |[ * #define GETTEXT_PACKAGE "gtk20" * #include <glib/gi18n-lib.h> * ]| * 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. */ /** * _: * @String: the string to be translated * * Marks a string for translation, gets replaced with the translated string * at runtime. * * Since: 2.4 */ /** * Q_: * @String: the string to be translated, with a '|'-separated prefix * which must not be translated * * Like _(), but handles context in message ids. This has the advantage * that the string can be adorned with a prefix to guarantee uniqueness * and provide context to the translator. * * One use case given in the gettext manual is GUI translation, where one * could e.g. disambiguate two "Open" menu entries as "File|Open" and * "Printer|Open". Another use case is the string "Russian" which may * have to be translated differently depending on whether it's the name * of a character set or a language. This could be solved by using * "charset|Russian" and "language|Russian". * * See the C_() macro for a different way to mark up translatable strings * with context. * * If you are using the Q_() macro, you need to make sure * that you pass to xgettext when extracting * messages. If you are using GNU gettext >= 0.15, you can also use * to let xgettext split the context * string off into a msgctxt line in the po file. * * Returns: the translated message * * Since: 2.4 */ /** * C_: * @Context: a message context, must be a string literal * @String: a message id, must be a string literal * * Uses gettext to get the translation for @String. @Context is * used as a context. This is mainly useful for short strings which * may need different translations, depending on the context in which * they are used. * |[ * label1 = C_("Navigation", "Back"); * label2 = C_("Body part", "Back"); * ]| * * If you are using the C_() macro, you need to make sure * that you pass to xgettext when * extracting messages. Note that this only works with GNU * gettext >= 0.15. * * Returns: the translated message * * Since: 2.16 */ /** * N_: * @String: the string to be translated * * Only marks a string for translation. This is useful in situations * where the translated strings can't be directly used, e.g. in string * array initializers. To get the translated string, call gettext() * at runtime. * |[ * { * static const char *messages[] = { * N_("some very meaningful message"), * N_("and another one") * }; * const char *string; * ... * string * = index > 1 ? _("a default message") : gettext (messages[index]); * * fputs (string); * ... * } * ]| * * Since: 2.4 */ /** * NC_: * @Context: a message context, must be a string literal * @String: a message id, must be a string literal * * Only marks a string for translation, with context. * This is useful in situations where the translated strings can't * be directly used, e.g. in string array initializers. To get the * translated string, you should call g_dpgettext2() at runtime. * * |[ * { * static const char *messages[] = { * NC_("some context", "some very meaningful message"), * NC_("some context", "and another one") * }; * const char *string; * ... * string * = index > 1 ? g_dpgettext2 (NULL, "some context", "a default message") * : g_dpgettext2 (NULL, "some context", messages[index]); * * fputs (string); * ... * } * ]| * * If you are using the NC_() macro, you need to make sure * that you pass to xgettext when * extracting messages. Note that this only works with GNU gettext >= 0.15. * Intltool has support for the NC_() macro since version 0.40.1. * * * Since: 2.18 */ pkg-config-0.29.1/glib/glib/gbacktrace.h0000664000175000017500000000471212651243552014654 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the GLib Team and others 1997-2000. See the AUTHORS * file for a list of people on the GLib Team. See the ChangeLog * files for a list of changes. These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/. */ #ifndef __G_BACKTRACE_H__ #define __G_BACKTRACE_H__ #if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) #error "Only can be included directly." #endif #include #include 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); /** * G_BREAKPOINT: * * Inserts a breakpoint instruction into the code. * * On x86 and alpha systems this is implemented as a soft interrupt * and on other architectures it raises a SIGTRAP signal. */ #if (defined (__i386__) || defined (__x86_64__)) && defined (__GNUC__) && __GNUC__ >= 2 # define G_BREAKPOINT() G_STMT_START{ __asm__ __volatile__ ("int $03"); }G_STMT_END #elif (defined (_MSC_VER) || defined (__DMC__)) && defined (_M_IX86) # define G_BREAKPOINT() G_STMT_START{ __asm int 3h }G_STMT_END #elif defined (_MSC_VER) # define G_BREAKPOINT() G_STMT_START{ __debugbreak(); }G_STMT_END #elif defined (__alpha__) && !defined(__osf__) && defined (__GNUC__) && __GNUC__ >= 2 # define G_BREAKPOINT() G_STMT_START{ __asm__ __volatile__ ("bpt"); }G_STMT_END #else /* !__i386__ && !__alpha__ */ # define G_BREAKPOINT() G_STMT_START{ raise (SIGTRAP); }G_STMT_END #endif /* __i386__ */ G_END_DECLS #endif /* __G_BACKTRACE_H__ */ pkg-config-0.29.1/glib/glib/glist.c0000664000175000017500000006356212651243552013713 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the GLib Team and others 1997-2000. See the AUTHORS * file for a list of people on the GLib Team. See the ChangeLog * files for a list of changes. These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/. */ /* * MT safe */ #include "config.h" #include "glist.h" #include "gslice.h" #include "gmessages.h" #include "gtestutils.h" /** * SECTION:linked_lists_double * @title: Doubly-Linked Lists * @short_description: linked lists that can be iterated over in both directions * * The #GList structure and its associated functions provide a standard * doubly-linked list data structure. * * Each element in the list contains a piece of data, together with * pointers which link to the previous and next elements in the list. * Using these pointers it is possible to move through the list in both * directions (unlike the Singly-Linked Lists which * only allows movement through the list in the forward direction). * * The data contained in each element can be either integer values, by * using one of the Type * Conversion Macros, or simply pointers to any type of data. * * List elements are allocated from the slice allocator, which is more * efficient than allocating elements individually. * * Note that most of the #GList functions expect to be passed a pointer * to the first element in the list. The functions which insert * elements return the new start of the list, which may have changed. * * There is no function to create a #GList. %NULL is considered to be * the empty list so you simply set a #GList* to %NULL. * * To add elements, use g_list_append(), g_list_prepend(), * g_list_insert() and g_list_insert_sorted(). * * To remove elements, use g_list_remove(). * * To find elements in the list use g_list_first(), g_list_last(), * g_list_next(), g_list_previous(), g_list_nth(), g_list_nth_data(), * g_list_find() and g_list_find_custom(). * * To find the index of an element use g_list_position() and * g_list_index(). * * To call a function for each element in the list use g_list_foreach(). * * To free the entire list, use g_list_free(). **/ /** * GList: * @data: holds the element's data, which can be a pointer to any kind * of data, or any integer value using the Type Conversion * Macros. * @next: contains the link to the next element in the list. * @prev: contains the link to the previous element in the list. * * The #GList struct is used for each element in a doubly-linked list. **/ /** * g_list_previous: * @list: an element in a #GList. * * 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. * * 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) #define _g_list_alloc0() g_slice_new0 (GList) #define _g_list_free1(list) g_slice_free (GList, list) /** * g_list_alloc: * * 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) { return _g_list_alloc0 (); } /** * g_list_free: * @list: a #GList * * Frees all of the memory used by a #GList. * The freed elements are returned to the slice allocator. * * * If list elements contain dynamically-allocated memory, * you should either use g_list_free_full() or free them manually * first. * */ void g_list_free (GList *list) { g_slice_free_chain (GList, list, next); } /** * g_list_free_1: * @list: a #GList element * * Frees one #GList element. * It is usually used after g_list_remove_link(). */ /** * g_list_free1: * * Another name for g_list_free_1(). **/ void g_list_free_1 (GList *list) { _g_list_free1 (list); } /** * g_list_free_full: * @list: a pointer to a #GList * @free_func: the function to be called to free each element's data * * Convenience method, which frees all the memory used by a #GList, and * calls the specified destroy function on every element's data. * * Since: 2.28 */ void g_list_free_full (GList *list, GDestroyNotify free_func) { g_list_foreach (list, (GFunc) free_func, NULL); g_list_free (list); } /** * g_list_append: * @list: a pointer to a #GList * @data: the data for the new element * * Adds a new element on to the end of the list. * * * The return value is the new start of the list, which * may have changed, so make sure you store the new value. * * * * Note that g_list_append() has to traverse the entire list * to find the end, which is inefficient when adding multiple * elements. A common idiom to avoid the inefficiency is to prepend * the elements and reverse the list when all elements have been added. * * * |[ * /* Notice that these are initialized to the empty list. */ * GList *list = NULL, *number_list = NULL; * * /* This is a list of strings. */ * list = g_list_append (list, "first"); * list = g_list_append (list, "second"); * * /* This is a list of integers. */ * number_list = g_list_append (number_list, GINT_TO_POINTER (27)); * number_list = g_list_append (number_list, GINT_TO_POINTER (14)); * ]| * * Returns: the new start of the #GList */ GList* g_list_append (GList *list, gpointer data) { GList *new_list; GList *last; new_list = _g_list_alloc (); new_list->data = data; new_list->next = NULL; if (list) { last = g_list_last (list); /* g_assert (last != NULL); */ last->next = new_list; new_list->prev = last; return list; } else { new_list->prev = NULL; return new_list; } } /** * g_list_prepend: * @list: a pointer to a #GList * @data: the data for the new element * * Adds a new element on to the start of the list. * * * The return value is the new start of the list, which * may have changed, so make sure you store the new value. * * * |[ * /* Notice that it is initialized to the empty list. */ * GList *list = NULL; * list = g_list_prepend (list, "last"); * list = g_list_prepend (list, "first"); * ]| * * Returns: the new start of the #GList */ GList* g_list_prepend (GList *list, gpointer data) { GList *new_list; new_list = _g_list_alloc (); new_list->data = data; new_list->next = list; if (list) { new_list->prev = list->prev; if (list->prev) list->prev->next = new_list; list->prev = new_list; } else new_list->prev = NULL; return new_list; } /** * g_list_insert: * @list: a pointer to a #GList * @data: the data for the new element * @position: the position to insert the element. If this is * negative, or is larger than the number of elements in the * list, the new element is added on to the end of the list. * * Inserts a new element into the list at the given position. * * Returns: the new start of the #GList */ GList* g_list_insert (GList *list, gpointer data, gint position) { GList *new_list; GList *tmp_list; if (position < 0) return g_list_append (list, data); else if (position == 0) return g_list_prepend (list, data); tmp_list = g_list_nth (list, position); if (!tmp_list) return g_list_append (list, data); new_list = _g_list_alloc (); new_list->data = data; new_list->prev = tmp_list->prev; tmp_list->prev->next = new_list; new_list->next = tmp_list; tmp_list->prev = new_list; return list; } /** * g_list_insert_before: * @list: a pointer to a #GList * @sibling: the list element before which the new element * is inserted or %NULL to insert at the end of the list * @data: the data for the new element * * Inserts a new element into the list before the given position. * * Returns: the new start of the #GList */ GList* g_list_insert_before (GList *list, GList *sibling, gpointer data) { if (!list) { list = g_list_alloc (); list->data = data; g_return_val_if_fail (sibling == NULL, list); return list; } else if (sibling) { GList *node; node = _g_list_alloc (); node->data = data; node->prev = sibling->prev; node->next = sibling; sibling->prev = node; if (node->prev) { node->prev->next = node; return list; } else { g_return_val_if_fail (sibling == list, node); return node; } } else { GList *last; last = list; while (last->next) last = last->next; last->next = _g_list_alloc (); last->next->data = data; last->next->prev = last; last->next->next = NULL; return list; } } /** * g_list_concat: * @list1: a #GList * @list2: the #GList to add to the end of the first #GList * * Adds the second #GList onto the end of the first #GList. * Note that the elements of the second #GList are not copied. * They are used directly. * * Returns: the start of the new #GList */ GList * g_list_concat (GList *list1, GList *list2) { GList *tmp_list; if (list2) { tmp_list = g_list_last (list1); if (tmp_list) tmp_list->next = list2; else list1 = list2; list2->prev = tmp_list; } return list1; } 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 * @data: the data of the element to remove * * Removes an element from a #GList. * If two elements contain the same data, only the first is removed. * If none of the elements contain the data, the #GList is unchanged. * * Returns: the new start of the #GList */ GList* g_list_remove (GList *list, gconstpointer data) { GList *tmp; tmp = list; while (tmp) { if (tmp->data != data) tmp = tmp->next; else { list = _g_list_remove_link (list, tmp); _g_list_free1 (tmp); break; } } return list; } /** * g_list_remove_all: * @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 * matching the given data. * * Returns: new head of @list */ GList* g_list_remove_all (GList *list, gconstpointer data) { GList *tmp = list; while (tmp) { if (tmp->data != data) tmp = tmp->next; else { GList *next = tmp->next; if (tmp->prev) tmp->prev->next = next; else list = next; if (next) next->prev = tmp->prev; _g_list_free1 (tmp); tmp = next; } } return list; } /** * g_list_remove_link: * @list: a #GList * @llink: an element in the #GList * * Removes an element from a #GList, without freeing the element. * The removed element's prev and next links are set to %NULL, so * that it becomes a self-contained list with one element. * * Returns: the new start of the #GList, without the element */ GList* g_list_remove_link (GList *list, GList *llink) { return _g_list_remove_link (list, llink); } /** * g_list_delete_link: * @list: a #GList * @link_: node to delete from @list * * Removes the node link_ from the list and frees it. * Compare this to g_list_remove_link() which removes the node * without freeing it. * * Returns: the new head of @list */ GList* g_list_delete_link (GList *list, GList *link_) { list = _g_list_remove_link (list, link_); _g_list_free1 (link_); return list; } /** * g_list_copy: * @list: a #GList * * Copies a #GList. * * * 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. See g_list_copy_deep() if you need * to copy the data as well. * * * Returns: a copy of @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) { GList *last; new_list = _g_list_alloc (); 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; while (list) { last->next = _g_list_alloc (); last->next->prev = last; last = last->next; if (func) last->data = func (list->data, user_data); else last->data = list->data; list = list->next; } last->next = NULL; } return new_list; } /** * g_list_reverse: * @list: a #GList * * Reverses a #GList. * It simply switches the next and prev pointers of each element. * * Returns: the start of the reversed #GList */ GList* g_list_reverse (GList *list) { GList *last; last = NULL; while (list) { last = list; list = last->next; last->next = last->prev; last->prev = list; } return last; } /** * g_list_nth: * @list: a #GList * @n: the position of the element, counting from 0 * * Gets the element at the given position in a #GList. * * Returns: the element, or %NULL if the position is off * the end of the #GList */ GList* g_list_nth (GList *list, guint n) { while ((n-- > 0) && list) list = list->next; return list; } /** * g_list_nth_prev: * @list: a #GList * @n: the position of the element, counting from 0 * * Gets the element @n places before @list. * * Returns: the element, or %NULL if the position is * off the end of the #GList */ GList* g_list_nth_prev (GList *list, guint n) { while ((n-- > 0) && list) list = list->prev; return list; } /** * g_list_nth_data: * @list: a #GList * @n: the position of the element * * Gets the data of the element at the given position. * * Returns: the element's data, or %NULL if the position * is off the end of the #GList */ gpointer g_list_nth_data (GList *list, guint n) { while ((n-- > 0) && list) list = list->next; return list ? list->data : NULL; } /** * g_list_find: * @list: a #GList * @data: the element data to find * * Finds the element in a #GList which * contains the given data. * * Returns: the found #GList element, * or %NULL if it is not found */ GList* g_list_find (GList *list, gconstpointer data) { while (list) { if (list->data == data) break; list = list->next; } return list; } /** * g_list_find_custom: * @list: a #GList * @data: user data passed to the function * @func: the function to call for each element. * It should return 0 when the desired element is found * * Finds an element in a #GList, using a supplied function to * find the desired element. It iterates over the list, calling * the given function which should return 0 when the desired * element is found. The function takes two #gconstpointer arguments, * the #GList element's data as the first argument and the * given user data. * * Returns: the found #GList element, or %NULL if it is not found */ GList* g_list_find_custom (GList *list, gconstpointer data, GCompareFunc func) { g_return_val_if_fail (func != NULL, list); while (list) { if (! func (list->data, data)) return list; list = list->next; } return NULL; } /** * g_list_position: * @list: a #GList * @llink: an element in the #GList * * Gets the position of the given element * in the #GList (starting from 0). * * Returns: the position of the element in the #GList, * or -1 if the element is not found */ gint g_list_position (GList *list, GList *llink) { gint i; i = 0; while (list) { if (list == llink) return i; i++; list = list->next; } return -1; } /** * g_list_index: * @list: a #GList * @data: the data to find * * Gets the position of the element containing * the given data (starting from 0). * * Returns: the index of the element containing the data, * or -1 if the data is not found */ gint g_list_index (GList *list, gconstpointer data) { gint i; i = 0; while (list) { if (list->data == data) return i; i++; list = list->next; } return -1; } /** * g_list_last: * @list: a #GList * * Gets the last element in a #GList. * * Returns: the last element in the #GList, * or %NULL if the #GList has no elements */ GList* g_list_last (GList *list) { if (list) { while (list->next) list = list->next; } return list; } /** * g_list_first: * @list: a #GList * * Gets the first element in a #GList. * * Returns: the first element in the #GList, * or %NULL if the #GList has no elements */ GList* g_list_first (GList *list) { if (list) { while (list->prev) list = list->prev; } return list; } /** * g_list_length: * @list: a #GList * * Gets the number of elements in a #GList. * * * This function iterates over the whole list to * count its elements. * * * Returns: the number of elements in the #GList */ guint g_list_length (GList *list) { guint length; length = 0; while (list) { length++; list = list->next; } return length; } /** * g_list_foreach: * @list: a #GList * @func: the function to call with each element's data * @user_data: user data to pass to the function * * Calls a function for each element of a #GList. */ /** * GFunc: * @data: the element's data. * @user_data: user data passed to g_list_foreach() or * g_slist_foreach(). * * Specifies the type of functions passed to g_list_foreach() and * g_slist_foreach(). **/ void g_list_foreach (GList *list, GFunc func, gpointer user_data) { while (list) { GList *next = list->next; (*func) (list->data, user_data); list = next; } } static GList* g_list_insert_sorted_real (GList *list, gpointer data, GFunc func, gpointer user_data) { GList *tmp_list = list; GList *new_list; gint cmp; g_return_val_if_fail (func != NULL, list); if (!list) { new_list = _g_list_alloc0 (); new_list->data = data; return new_list; } cmp = ((GCompareDataFunc) func) (data, tmp_list->data, user_data); while ((tmp_list->next) && (cmp > 0)) { tmp_list = tmp_list->next; cmp = ((GCompareDataFunc) func) (data, tmp_list->data, user_data); } new_list = _g_list_alloc0 (); new_list->data = data; if ((!tmp_list->next) && (cmp > 0)) { tmp_list->next = new_list; new_list->prev = tmp_list; return list; } if (tmp_list->prev) { tmp_list->prev->next = new_list; new_list->prev = tmp_list->prev; } new_list->next = tmp_list; tmp_list->prev = new_list; if (tmp_list == list) return new_list; else return list; } /** * g_list_insert_sorted: * @list: a pointer to a #GList * @data: the data for the new element * @func: the function to compare elements in the list. It should * return a number > 0 if the first parameter comes after the * second parameter in the sort order. * * Inserts a new element into the list, using the given comparison * function to determine its position. * * Returns: the new start of the #GList */ GList* g_list_insert_sorted (GList *list, gpointer data, GCompareFunc func) { return g_list_insert_sorted_real (list, data, (GFunc) func, NULL); } /** * g_list_insert_sorted_with_data: * @list: a pointer to a #GList * @data: the data for the new element * @func: the function to compare elements in the list. * It should return a number > 0 if the first parameter * comes after the second parameter in the sort order. * @user_data: user data to pass to comparison function. * * Inserts a new element into the list, using the given comparison * function to determine its position. * * Returns: the new start of the #GList * * Since: 2.10 */ GList* g_list_insert_sorted_with_data (GList *list, gpointer data, GCompareDataFunc func, gpointer user_data) { return g_list_insert_sorted_real (list, data, (GFunc) func, user_data); } static GList * g_list_sort_merge (GList *l1, GList *l2, GFunc compare_func, gpointer user_data) { GList list, *l, *lprev; gint cmp; l = &list; lprev = NULL; while (l1 && l2) { cmp = ((GCompareDataFunc) compare_func) (l1->data, l2->data, user_data); if (cmp <= 0) { l->next = l1; l1 = l1->next; } else { l->next = l2; l2 = l2->next; } l = l->next; l->prev = lprev; lprev = l; } l->next = l1 ? l1 : l2; l->next->prev = l; return list.next; } static GList* g_list_sort_real (GList *list, GFunc compare_func, gpointer user_data) { GList *l1, *l2; if (!list) return NULL; if (!list->next) return list; l1 = list; l2 = list->next; while ((l2 = l2->next) != NULL) { if ((l2 = l2->next) == NULL) break; l1 = l1->next; } l2 = l1->next; l1->next = NULL; return g_list_sort_merge (g_list_sort_real (list, compare_func, user_data), g_list_sort_real (l2, compare_func, user_data), compare_func, user_data); } /** * g_list_sort: * @list: a #GList * @compare_func: the comparison function used to sort the #GList. * This function is passed the data from 2 elements of the #GList * and should return 0 if they are equal, a negative value if the * first element comes before the second, or a positive value if * the first element comes after the second. * * Sorts a #GList using the given comparison function. The algorithm * used is a stable sort. * * Returns: the start of the sorted #GList */ /** * GCompareFunc: * @a: a value. * @b: a value to compare with. * * 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 < @b; zero if @a = @b; positive * value if @a > @b. **/ GList * g_list_sort (GList *list, GCompareFunc compare_func) { return g_list_sort_real (list, (GFunc) compare_func, NULL); } /** * g_list_sort_with_data: * @list: a #GList * @compare_func: comparison function * @user_data: user data to pass to comparison function * * Like g_list_sort(), but the comparison function accepts * a user data argument. * * Returns: the new head of @list */ /** * GCompareDataFunc: * @a: a value. * @b: a value to compare with. * @user_data: user data to pass to comparison function. * * 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 < @b; zero if @a = @b; positive * value if @a > @b. **/ GList * g_list_sort_with_data (GList *list, GCompareDataFunc compare_func, gpointer user_data) { return g_list_sort_real (list, (GFunc) compare_func, user_data); } pkg-config-0.29.1/glib/glib/gunibreak.c0000664000175000017500000000432712275467762014547 00000000000000/* gunibreak.c - line break properties * * Copyright 2000 Red Hat, Inc. * * The Gnome Library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * The Gnome Library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with the Gnome Library; see the file COPYING.LIB. If not, * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "config.h" #include #include "gunibreak.h" #define TPROP_PART1(Page, Char) \ ((break_property_table_part1[Page] >= G_UNICODE_MAX_TABLE_INDEX) \ ? (break_property_table_part1[Page] - G_UNICODE_MAX_TABLE_INDEX) \ : (break_property_data[break_property_table_part1[Page]][Char])) #define TPROP_PART2(Page, Char) \ ((break_property_table_part2[Page] >= G_UNICODE_MAX_TABLE_INDEX) \ ? (break_property_table_part2[Page] - G_UNICODE_MAX_TABLE_INDEX) \ : (break_property_data[break_property_table_part2[Page]][Char])) #define PROP(Char) \ (((Char) <= G_UNICODE_LAST_CHAR_PART1) \ ? TPROP_PART1 ((Char) >> 8, (Char) & 0xff) \ : (((Char) >= 0xe0000 && (Char) <= G_UNICODE_LAST_CHAR) \ ? TPROP_PART2 (((Char) - 0xe0000) >> 8, (Char) & 0xff) \ : G_UNICODE_BREAK_UNKNOWN)) /** * g_unichar_break_type: * @c: a Unicode character * * Determines the break type of @c. @c should be a Unicode character * (to derive a character from UTF-8 encoded text, use * g_utf8_get_char()). The break type is used to find word and line * breaks ("text boundaries"), Pango implements the Unicode boundary * resolution algorithms and normally you would use a function such * as pango_break() instead of caring about break types yourself. * * Return value: the break type of @c **/ GUnicodeBreakType g_unichar_break_type (gunichar c) { return PROP (c); } pkg-config-0.29.1/glib/glib/grand.c0000664000175000017500000004303212651243552013652 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* Originally developed and coded by Makoto Matsumoto and Takuji * Nishimura. Please mail , if you're using * code from this file in your own programs or libraries. * Further information on the Mersenne Twister can be found at * http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html * This code was adapted to glib by Sebastian Wilhelmi. */ /* * Modified by the GLib Team and others 1997-2000. See the AUTHORS * file for a list of people on the GLib Team. See the ChangeLog * files for a list of changes. These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/. */ /* * MT safe */ #include "config.h" #include #include #include #include #include #ifdef HAVE_UNISTD_H #include #endif #include "grand.h" #include "genviron.h" #include "gmain.h" #include "gmem.h" #include "gtestutils.h" #include "gthread.h" #ifdef G_OS_WIN32 #include /* For getpid() */ #endif /** * SECTION:random_numbers * @title: Random Numbers * @short_description: pseudo-random number generator * * The following functions allow you to use a portable, fast and good * pseudo-random number generator (PRNG). It uses the Mersenne Twister * PRNG, which was originally developed by Makoto Matsumoto and Takuji * Nishimura. Further information can be found at * * http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html. * * If you just need a random number, you simply call the * g_random_* functions, which will create a * globally used #GRand and use the according * g_rand_* functions internally. Whenever you * need a stream of reproducible random numbers, you better create a * #GRand yourself and use the g_rand_* functions * directly, which will also be slightly faster. Initializing a #GRand * with a certain seed will produce exactly the same series of random * numbers on all platforms. This can thus be used as a seed for e.g. * games. * * The g_rand*_range functions will return high * quality equally distributed random numbers, whereas for example the * (g_random_int()%max) approach often * doesn't yield equally distributed numbers. * * GLib changed the seeding algorithm for the pseudo-random number * generator Mersenne Twister, as used by * GRand and GRandom. * This was necessary, because some seeds would yield very bad * pseudo-random streams. Also the pseudo-random integers generated by * g_rand*_int_range() will have a slightly better * equal distribution with the new version of GLib. * * The original seeding and generation algorithms, as found in GLib * 2.0.x, can be used instead of the new ones by setting the * environment variable G_RANDOM_VERSION to the value of * '2.0'. Use the GLib-2.0 algorithms only if you have sequences of * numbers generated with Glib-2.0 that you need to reproduce exactly. **/ /** * GRand: * * The #GRand struct is an opaque data structure. It should only be * accessed through the g_rand_* functions. **/ G_LOCK_DEFINE_STATIC (global_random); static GRand* global_random = NULL; /* Period parameters */ #define N 624 #define M 397 #define MATRIX_A 0x9908b0df /* constant vector a */ #define UPPER_MASK 0x80000000 /* most significant w-r bits */ #define LOWER_MASK 0x7fffffff /* least significant r bits */ /* Tempering parameters */ #define TEMPERING_MASK_B 0x9d2c5680 #define TEMPERING_MASK_C 0xefc60000 #define TEMPERING_SHIFT_U(y) (y >> 11) #define TEMPERING_SHIFT_S(y) (y << 7) #define TEMPERING_SHIFT_T(y) (y << 15) #define TEMPERING_SHIFT_L(y) (y >> 18) static guint get_random_version (void) { static gsize initialized = FALSE; static guint random_version; if (g_once_init_enter (&initialized)) { const gchar *version_string = g_getenv ("G_RANDOM_VERSION"); if (!version_string || version_string[0] == '\000' || strcmp (version_string, "2.2") == 0) random_version = 22; else if (strcmp (version_string, "2.0") == 0) random_version = 20; else { g_warning ("Unknown G_RANDOM_VERSION \"%s\". Using version 2.2.", version_string); random_version = 22; } g_once_init_leave (&initialized, TRUE); } return random_version; } struct _GRand { guint32 mt[N]; /* the array for the state vector */ guint mti; }; /** * g_rand_new_with_seed: * @seed: a value to initialize the random number generator. * * Creates a new random number generator initialized with @seed. * * Return value: the new #GRand. **/ GRand* g_rand_new_with_seed (guint32 seed) { GRand *rand = g_new0 (GRand, 1); g_rand_set_seed (rand, seed); return rand; } /** * g_rand_new_with_seed_array: * @seed: an array of seeds to initialize the random number generator. * @seed_length: an array of seeds to initialize the random number generator. * * Creates a new random number generator initialized with @seed. * * Return value: the new #GRand. * * Since: 2.4 **/ GRand* g_rand_new_with_seed_array (const guint32 *seed, guint seed_length) { GRand *rand = g_new0 (GRand, 1); g_rand_set_seed_array (rand, seed, seed_length); return rand; } /** * g_rand_new: * * Creates a new random number generator initialized with a seed taken * either from /dev/urandom (if existing) or from * the current time (as a fallback). * * Return value: the new #GRand. **/ GRand* g_rand_new (void) { guint32 seed[4]; GTimeVal now; #ifdef G_OS_UNIX static gboolean dev_urandom_exists = TRUE; if (dev_urandom_exists) { FILE* dev_urandom; do { dev_urandom = fopen("/dev/urandom", "rb"); } while G_UNLIKELY (dev_urandom == NULL && errno == EINTR); if (dev_urandom) { int r; setvbuf (dev_urandom, NULL, _IONBF, 0); do { errno = 0; r = fread (seed, sizeof (seed), 1, dev_urandom); } while G_UNLIKELY (errno == EINTR); if (r != 1) dev_urandom_exists = FALSE; fclose (dev_urandom); } else dev_urandom_exists = FALSE; } #else static gboolean dev_urandom_exists = FALSE; #endif if (!dev_urandom_exists) { g_get_current_time (&now); seed[0] = now.tv_sec; seed[1] = now.tv_usec; seed[2] = getpid (); #ifdef G_OS_UNIX seed[3] = getppid (); #else seed[3] = 0; #endif } return g_rand_new_with_seed_array (seed, 4); } /** * g_rand_free: * @rand_: a #GRand. * * Frees the memory allocated for the #GRand. **/ void g_rand_free (GRand* rand) { g_return_if_fail (rand != NULL); g_free (rand); } /** * g_rand_copy: * @rand_: a #GRand. * * Copies a #GRand into a new one with the same exact state as before. * This way you can take a snapshot of the random number generator for * replaying later. * * Return value: the new #GRand. * * Since: 2.4 **/ GRand * g_rand_copy (GRand* rand) { GRand* new_rand; g_return_val_if_fail (rand != NULL, NULL); new_rand = g_new0 (GRand, 1); memcpy (new_rand, rand, sizeof (GRand)); return new_rand; } /** * g_rand_set_seed: * @rand_: a #GRand. * @seed: a value to reinitialize the random number generator. * * Sets the seed for the random number generator #GRand to @seed. **/ void g_rand_set_seed (GRand* rand, guint32 seed) { g_return_if_fail (rand != NULL); switch (get_random_version ()) { case 20: /* setting initial seeds to mt[N] using */ /* the generator Line 25 of Table 1 in */ /* [KNUTH 1981, The Art of Computer Programming */ /* Vol. 2 (2nd Ed.), pp102] */ if (seed == 0) /* This would make the PRNG produce only zeros */ seed = 0x6b842128; /* Just set it to another number */ rand->mt[0]= seed; for (rand->mti=1; rand->mtimti++) rand->mt[rand->mti] = (69069 * rand->mt[rand->mti-1]); break; case 22: /* See Knuth TAOCP Vol2. 3rd Ed. P.106 for multiplier. */ /* In the previous version (see above), MSBs of the */ /* seed affect only MSBs of the array mt[]. */ rand->mt[0]= seed; for (rand->mti=1; rand->mtimti++) rand->mt[rand->mti] = 1812433253UL * (rand->mt[rand->mti-1] ^ (rand->mt[rand->mti-1] >> 30)) + rand->mti; break; default: g_assert_not_reached (); } } /** * g_rand_set_seed_array: * @rand_: a #GRand. * @seed: array to initialize with * @seed_length: length of array * * Initializes the random number generator by an array of * longs. Array can be of arbitrary size, though only the * first 624 values are taken. This function is useful * if you have many low entropy seeds, or if you require more then * 32bits of actual entropy for your application. * * Since: 2.4 **/ void g_rand_set_seed_array (GRand* rand, const guint32 *seed, guint seed_length) { int i, j, k; g_return_if_fail (rand != NULL); g_return_if_fail (seed_length >= 1); g_rand_set_seed (rand, 19650218UL); i=1; j=0; k = (N>seed_length ? N : seed_length); for (; k; k--) { rand->mt[i] = (rand->mt[i] ^ ((rand->mt[i-1] ^ (rand->mt[i-1] >> 30)) * 1664525UL)) + seed[j] + j; /* non linear */ rand->mt[i] &= 0xffffffffUL; /* for WORDSIZE > 32 machines */ i++; j++; if (i>=N) { rand->mt[0] = rand->mt[N-1]; i=1; } if (j>=seed_length) j=0; } for (k=N-1; k; k--) { rand->mt[i] = (rand->mt[i] ^ ((rand->mt[i-1] ^ (rand->mt[i-1] >> 30)) * 1566083941UL)) - i; /* non linear */ rand->mt[i] &= 0xffffffffUL; /* for WORDSIZE > 32 machines */ i++; if (i>=N) { rand->mt[0] = rand->mt[N-1]; i=1; } } rand->mt[0] = 0x80000000UL; /* MSB is 1; assuring non-zero initial array */ } /** * g_rand_boolean: * @rand_: a #GRand. * * Returns a random #gboolean from @rand_. This corresponds to a * unbiased coin toss. * * Returns: a random #gboolean. **/ /** * g_rand_int: * @rand_: a #GRand. * * Returns the next random #guint32 from @rand_ equally distributed over * the range [0..2^32-1]. * * Return value: A random number. **/ guint32 g_rand_int (GRand* rand) { guint32 y; static const guint32 mag01[2]={0x0, MATRIX_A}; /* mag01[x] = x * MATRIX_A for x=0,1 */ g_return_val_if_fail (rand != NULL, 0); if (rand->mti >= N) { /* generate N words at one time */ int kk; for (kk=0;kkmt[kk]&UPPER_MASK)|(rand->mt[kk+1]&LOWER_MASK); rand->mt[kk] = rand->mt[kk+M] ^ (y >> 1) ^ mag01[y & 0x1]; } for (;kkmt[kk]&UPPER_MASK)|(rand->mt[kk+1]&LOWER_MASK); rand->mt[kk] = rand->mt[kk+(M-N)] ^ (y >> 1) ^ mag01[y & 0x1]; } y = (rand->mt[N-1]&UPPER_MASK)|(rand->mt[0]&LOWER_MASK); rand->mt[N-1] = rand->mt[M-1] ^ (y >> 1) ^ mag01[y & 0x1]; rand->mti = 0; } y = rand->mt[rand->mti++]; y ^= TEMPERING_SHIFT_U(y); y ^= TEMPERING_SHIFT_S(y) & TEMPERING_MASK_B; y ^= TEMPERING_SHIFT_T(y) & TEMPERING_MASK_C; y ^= TEMPERING_SHIFT_L(y); return y; } /* transform [0..2^32] -> [0..1] */ #define G_RAND_DOUBLE_TRANSFORM 2.3283064365386962890625e-10 /** * g_rand_int_range: * @rand_: a #GRand. * @begin: lower closed bound of the interval. * @end: upper open bound of the interval. * * Returns the next random #gint32 from @rand_ equally distributed over * the range [@begin..@end-1]. * * Return value: A random number. **/ gint32 g_rand_int_range (GRand* rand, gint32 begin, gint32 end) { guint32 dist = end - begin; guint32 random; g_return_val_if_fail (rand != NULL, begin); g_return_val_if_fail (end > begin, begin); switch (get_random_version ()) { case 20: if (dist <= 0x10000L) /* 2^16 */ { /* This method, which only calls g_rand_int once is only good * for (end - begin) <= 2^16, because we only have 32 bits set * from the one call to g_rand_int (). */ /* we are using (trans + trans * trans), because g_rand_int only * covers [0..2^32-1] and thus g_rand_int * trans only covers * [0..1-2^-32], but the biggest double < 1 is 1-2^-52. */ gdouble double_rand = g_rand_int (rand) * (G_RAND_DOUBLE_TRANSFORM + G_RAND_DOUBLE_TRANSFORM * G_RAND_DOUBLE_TRANSFORM); random = (gint32) (double_rand * dist); } else { /* Now we use g_rand_double_range (), which will set 52 bits for us, so that it is safe to round and still get a decent distribution */ random = (gint32) g_rand_double_range (rand, 0, dist); } break; case 22: if (dist == 0) random = 0; else { /* maxvalue is set to the predecessor of the greatest * multiple of dist less or equal 2^32. */ guint32 maxvalue; if (dist <= 0x80000000u) /* 2^31 */ { /* maxvalue = 2^32 - 1 - (2^32 % dist) */ guint32 leftover = (0x80000000u % dist) * 2; if (leftover >= dist) leftover -= dist; maxvalue = 0xffffffffu - leftover; } else maxvalue = dist - 1; do random = g_rand_int (rand); while (random > maxvalue); random %= dist; } break; default: random = 0; /* Quiet GCC */ g_assert_not_reached (); } return begin + random; } /** * g_rand_double: * @rand_: a #GRand. * * Returns the next random #gdouble from @rand_ equally distributed over * the range [0..1). * * Return value: A random number. **/ gdouble g_rand_double (GRand* rand) { /* We set all 52 bits after the point for this, not only the first 32. Thats why we need two calls to g_rand_int */ gdouble retval = g_rand_int (rand) * G_RAND_DOUBLE_TRANSFORM; retval = (retval + g_rand_int (rand)) * G_RAND_DOUBLE_TRANSFORM; /* The following might happen due to very bad rounding luck, but * actually this should be more than rare, we just try again then */ if (retval >= 1.0) return g_rand_double (rand); return retval; } /** * g_rand_double_range: * @rand_: a #GRand. * @begin: lower closed bound of the interval. * @end: upper open bound of the interval. * * Returns the next random #gdouble from @rand_ equally distributed over * the range [@begin..@end). * * Return value: A random number. **/ gdouble g_rand_double_range (GRand* rand, gdouble begin, gdouble end) { gdouble r; r = g_rand_double (rand); return r * end - (r - 1) * begin; } /** * g_random_boolean: * * Returns a random #gboolean. This corresponds to a unbiased coin toss. * * Returns: a random #gboolean. **/ /** * g_random_int: * * Return a random #guint32 equally distributed over the range * [0..2^32-1]. * * Return value: A random number. **/ guint32 g_random_int (void) { guint32 result; G_LOCK (global_random); if (!global_random) global_random = g_rand_new (); result = g_rand_int (global_random); G_UNLOCK (global_random); return result; } /** * g_random_int_range: * @begin: lower closed bound of the interval. * @end: upper open bound of the interval. * * Returns a random #gint32 equally distributed over the range * [@begin..@end-1]. * * Return value: A random number. **/ gint32 g_random_int_range (gint32 begin, gint32 end) { gint32 result; G_LOCK (global_random); if (!global_random) global_random = g_rand_new (); result = g_rand_int_range (global_random, begin, end); G_UNLOCK (global_random); return result; } /** * g_random_double: * * Returns a random #gdouble equally distributed over the range [0..1). * * Return value: A random number. **/ gdouble g_random_double (void) { double result; G_LOCK (global_random); if (!global_random) global_random = g_rand_new (); result = g_rand_double (global_random); G_UNLOCK (global_random); return result; } /** * g_random_double_range: * @begin: lower closed bound of the interval. * @end: upper open bound of the interval. * * Returns a random #gdouble equally distributed over the range [@begin..@end). * * Return value: A random number. **/ gdouble g_random_double_range (gdouble begin, gdouble end) { double result; G_LOCK (global_random); if (!global_random) global_random = g_rand_new (); result = g_rand_double_range (global_random, begin, end); G_UNLOCK (global_random); return result; } /** * g_random_set_seed: * @seed: a value to reinitialize the global random number generator. * * Sets the seed for the global random number generator, which is used * by the g_random_* functions, to @seed. **/ void g_random_set_seed (guint32 seed) { G_LOCK (global_random); if (!global_random) global_random = g_rand_new_with_seed (seed); else g_rand_set_seed (global_random, seed); G_UNLOCK (global_random); } pkg-config-0.29.1/glib/glib/gshell.h0000664000175000017500000000344112651243552014042 00000000000000/* gshell.h - Shell-related utilities * * Copyright 2000 Red Hat, Inc. * * GLib is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * GLib is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with GLib; see the file COPYING.LIB. If not, write * to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __G_SHELL_H__ #define __G_SHELL_H__ #if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) #error "Only can be included directly." #endif #include G_BEGIN_DECLS #define G_SHELL_ERROR g_shell_error_quark () typedef enum { /* mismatched or otherwise mangled quoting */ G_SHELL_ERROR_BAD_QUOTING, /* string to be parsed was empty */ G_SHELL_ERROR_EMPTY_STRING, G_SHELL_ERROR_FAILED } GShellError; 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, GError **error); G_END_DECLS #endif /* __G_SHELL_H__ */ pkg-config-0.29.1/glib/glib/gprintf.c0000664000175000017500000002271112275467762014246 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997, 2002 Peter Mattis, Red Hat, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "config.h" #include #include #include #include "gprintf.h" #include "gprintfint.h" /** * g_printf: * @format: a standard printf() format string, but notice * string precision pitfalls. * @...: the arguments to insert in the output. * * An implementation of the standard printf() function which supports * positional parameters, as specified in the Single Unix Specification. * * Returns: the number of bytes printed. * * Since: 2.2 **/ gint g_printf (gchar const *format, ...) { va_list args; gint retval; va_start (args, format); retval = g_vprintf (format, args); va_end (args); return retval; } /** * g_fprintf: * @file: the stream to write to. * @format: a standard printf() format string, but notice * string precision pitfalls. * @...: the arguments to insert in the output. * * An implementation of the standard fprintf() function which supports * positional parameters, as specified in the Single Unix Specification. * * Returns: the number of bytes printed. * * Since: 2.2 **/ gint g_fprintf (FILE *file, gchar const *format, ...) { va_list args; gint retval; va_start (args, format); retval = g_vfprintf (file, format, args); va_end (args); return retval; } /** * g_sprintf: * @string: A pointer to a memory buffer to contain the resulting string. It * is up to the caller to ensure that the allocated buffer is large * enough to hold the formatted result * @format: a standard printf() format string, but notice * string precision pitfalls. * @...: the arguments to insert in the output. * * An implementation of the standard sprintf() function which supports * positional parameters, as specified in the Single Unix Specification. * * Note that it is usually better to use g_snprintf(), to avoid the * risk of buffer overflow. * * See also g_strdup_printf(). * * Returns: the number of bytes printed. * * Since: 2.2 **/ gint g_sprintf (gchar *string, gchar const *format, ...) { va_list args; gint retval; va_start (args, format); retval = g_vsprintf (string, format, args); va_end (args); return retval; } /** * g_snprintf: * @string: the buffer to hold the output. * @n: the maximum number of bytes to produce (including the * terminating nul character). * @format: a standard printf() format string, but notice * string precision pitfalls. * @...: the arguments to insert in the output. * * A safer form of the standard sprintf() function. The output is guaranteed * to not exceed @n characters (including the terminating nul character), so * it is easy to ensure that a buffer overflow cannot occur. * * See also g_strdup_printf(). * * In versions of GLib prior to 1.2.3, this function may return -1 if the * output was truncated, and the truncated string may not be nul-terminated. * In versions prior to 1.3.12, this function returns the length of the output * string. * * The return value of g_snprintf() conforms to the snprintf() * function as standardized in ISO C99. Note that this is different from * traditional snprintf(), which returns the length of the output string. * * The format string may contain positional parameters, as specified in * the Single Unix Specification. * * Returns: the number of bytes which would be produced if the buffer * was large enough. **/ gint g_snprintf (gchar *string, gulong n, gchar const *format, ...) { va_list args; gint retval; va_start (args, format); retval = g_vsnprintf (string, n, format, args); va_end (args); return retval; } /** * g_vprintf: * @format: a standard printf() format string, but notice * string precision pitfalls. * @args: the list of arguments to insert in the output. * * An implementation of the standard vprintf() function which supports * positional parameters, as specified in the Single Unix Specification. * * Returns: the number of bytes printed. * * Since: 2.2 **/ gint g_vprintf (gchar const *format, va_list args) { g_return_val_if_fail (format != NULL, -1); return _g_vprintf (format, args); } /** * g_vfprintf: * @file: the stream to write to. * @format: a standard printf() format string, but notice * string precision pitfalls. * @args: the list of arguments to insert in the output. * * An implementation of the standard fprintf() function which supports * positional parameters, as specified in the Single Unix Specification. * * Returns: the number of bytes printed. * * Since: 2.2 **/ gint g_vfprintf (FILE *file, gchar const *format, va_list args) { g_return_val_if_fail (format != NULL, -1); return _g_vfprintf (file, format, args); } /** * g_vsprintf: * @string: the buffer to hold the output. * @format: a standard printf() format string, but notice * string precision pitfalls. * @args: the list of arguments to insert in the output. * * An implementation of the standard vsprintf() function which supports * positional parameters, as specified in the Single Unix Specification. * * Returns: the number of bytes printed. * * Since: 2.2 **/ gint g_vsprintf (gchar *string, gchar const *format, va_list args) { g_return_val_if_fail (string != NULL, -1); g_return_val_if_fail (format != NULL, -1); return _g_vsprintf (string, format, args); } /** * g_vsnprintf: * @string: the buffer to hold the output. * @n: the maximum number of bytes to produce (including the * terminating nul character). * @format: a standard printf() format string, but notice * string precision pitfalls. * @args: the list of arguments to insert in the output. * * A safer form of the standard vsprintf() function. The output is guaranteed * to not exceed @n characters (including the terminating nul character), so * it is easy to ensure that a buffer overflow cannot occur. * * See also g_strdup_vprintf(). * * In versions of GLib prior to 1.2.3, this function may return -1 if the * output was truncated, and the truncated string may not be nul-terminated. * In versions prior to 1.3.12, this function returns the length of the output * string. * * The return value of g_vsnprintf() conforms to the vsnprintf() function * as standardized in ISO C99. Note that this is different from traditional * vsnprintf(), which returns the length of the output string. * * The format string may contain positional parameters, as specified in * the Single Unix Specification. * * Returns: the number of bytes which would be produced if the buffer * was large enough. */ gint g_vsnprintf (gchar *string, gulong n, gchar const *format, va_list args) { g_return_val_if_fail (n == 0 || string != NULL, -1); g_return_val_if_fail (format != NULL, -1); return _g_vsnprintf (string, n, format, args); } /** * g_vasprintf: * @string: the return location for the newly-allocated string. * @format: a standard printf() format string, but notice * string precision pitfalls. * @args: the list of arguments to insert in the output. * * An implementation of the GNU vasprintf() function which supports * positional parameters, as specified in the Single Unix Specification. * This function is similar to g_vsprintf(), except that it allocates a * string to hold the output, instead of putting the output in a buffer * you allocate in advance. * * Returns: the number of bytes printed. * * Since: 2.4 **/ gint g_vasprintf (gchar **string, gchar const *format, va_list args) { gint len; g_return_val_if_fail (string != NULL, -1); #if !defined(HAVE_GOOD_PRINTF) len = _g_gnulib_vasprintf (string, format, args); if (len < 0) *string = NULL; #elif defined (HAVE_VASPRINTF) len = vasprintf (string, format, args); if (len < 0) *string = NULL; else if (!g_mem_is_system_malloc ()) { /* vasprintf returns malloc-allocated memory */ gchar *string1 = g_strndup (*string, len); free (*string); *string = string1; } #else { va_list args2; G_VA_COPY (args2, args); *string = g_new (gchar, g_printf_string_upper_bound (format, args)); len = _g_vsprintf (*string, format, args2); va_end (args2); } #endif return len; } pkg-config-0.29.1/glib/glib/gcharset.h0000664000175000017500000000264512651243552014371 00000000000000/* gcharset.h - Charset functions * * Copyright (C) 2011 Red Hat, Inc. * * The GLib Library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * The GLib Library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with the Gnome Library; see the file COPYING.LIB. If not, * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __G_CHARSET_H__ #define __G_CHARSET_H__ #if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) #error "Only can be included directly." #endif #include 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 #endif /* __G_CHARSET_H__ */ pkg-config-0.29.1/glib/glib/gwakeup.c0000664000175000017500000001371012651243552014222 00000000000000/* * Copyright © 2011 Canonical Limited * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the licence, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * * Author: Ryan Lortie */ #include "config.h" /* 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). */ #ifdef GLIB_COMPILATION #include "gtypes.h" #include "gpoll.h" #else #include #endif #include "gwakeup.h" /*< private > * SECTION:gwakeup * @title: GWakeup * @short_description: portable cross-thread event signal mechanism * * #GWakeup is a simple and portable way of signaling events between * different threads in a way that integrates nicely with g_poll(). * GLib uses it internally for cross-thread signalling in the * implementation of #GMainContext and #GCancellable. * * You first create a #GWakeup with g_wakeup_new() and initialise a * #GPollFD from it using g_wakeup_get_pollfd(). Polling on the created * #GPollFD will block until g_wakeup_signal() is called, at which point * it will immediately return. Future attempts to poll will continue to * return until g_wakeup_acknowledge() is called. g_wakeup_free() is * used to free a #GWakeup. * * On sufficiently modern Linux, this is implemented using eventfd. On * Windows it is implemented using an event handle. On other systems it * is implemented with a pair of pipes. * * Since: 2.30 **/ #ifdef _WIN32 #include #ifdef GLIB_COMPILATION #include "gmessages.h" #include "giochannel.h" #include "gwin32.h" #endif GWakeup * g_wakeup_new (void) { HANDLE wakeup; wakeup = CreateEvent (NULL, TRUE, FALSE, NULL); if (wakeup == NULL) g_error ("Cannot create event for GWakeup: %s", g_win32_error_message (GetLastError ())); return (GWakeup *) wakeup; } void g_wakeup_get_pollfd (GWakeup *wakeup, GPollFD *poll_fd) { poll_fd->fd = (gintptr) wakeup; poll_fd->events = G_IO_IN; } void g_wakeup_acknowledge (GWakeup *wakeup) { ResetEvent ((HANDLE) wakeup); } void g_wakeup_signal (GWakeup *wakeup) { SetEvent ((HANDLE) wakeup); } void g_wakeup_free (GWakeup *wakeup) { CloseHandle ((HANDLE) wakeup); } #else #include "glib-unix.h" #include #if defined (HAVE_EVENTFD) #include #endif struct _GWakeup { gint fds[2]; }; /** * g_wakeup_new: * * Creates a new #GWakeup. * * You should use g_wakeup_free() to free it when you are done. * * Returns: a new #GWakeup * * Since: 2.30 **/ GWakeup * g_wakeup_new (void) { GError *error = NULL; GWakeup *wakeup; wakeup = g_slice_new (GWakeup); /* try eventfd first, if we think we can */ #if defined (HAVE_EVENTFD) #ifndef TEST_EVENTFD_FALLBACK wakeup->fds[0] = eventfd (0, EFD_CLOEXEC | EFD_NONBLOCK); #else wakeup->fds[0] = -1; #endif if (wakeup->fds[0] != -1) { wakeup->fds[1] = -1; return wakeup; } /* for any failure, try a pipe instead */ #endif if (!g_unix_open_pipe (wakeup->fds, FD_CLOEXEC, &error)) g_error ("Creating pipes for GWakeup: %s\n", error->message); if (!g_unix_set_fd_nonblocking (wakeup->fds[0], TRUE, &error) || !g_unix_set_fd_nonblocking (wakeup->fds[1], TRUE, &error)) g_error ("Set pipes non-blocking for GWakeup: %s\n", error->message); return wakeup; } /** * g_wakeup_get_pollfd: * @wakeup: a #GWakeup * @poll_fd: a #GPollFD * * Prepares a @poll_fd such that polling on it will succeed when * g_wakeup_signal() has been called on @wakeup. * * @poll_fd is valid until @wakeup is freed. * * Since: 2.30 **/ void g_wakeup_get_pollfd (GWakeup *wakeup, GPollFD *poll_fd) { poll_fd->fd = wakeup->fds[0]; poll_fd->events = G_IO_IN; } /** * g_wakeup_acknowledge: * @wakeup: a #GWakeup * * Acknowledges receipt of a wakeup signal on @wakeup. * * You must call this after @wakeup polls as ready. If not, it will * continue to poll as ready until you do so. * * If you call this function and @wakeup is not signaled, nothing * happens. * * Since: 2.30 **/ void g_wakeup_acknowledge (GWakeup *wakeup) { char buffer[16]; /* read until it is empty */ while (read (wakeup->fds[0], buffer, sizeof buffer) == sizeof buffer); } /** * g_wakeup_signal: * @wakeup: a #GWakeup * * Signals @wakeup. * * Any future (or present) polling on the #GPollFD returned by * g_wakeup_get_pollfd() will immediately succeed until such a time as * g_wakeup_acknowledge() is called. * * This function is safe to call from a UNIX signal handler. * * Since: 2.30 **/ void g_wakeup_signal (GWakeup *wakeup) { guint64 one = 1; int res; if (wakeup->fds[1] == -1) { do res = write (wakeup->fds[0], &one, sizeof one); while (G_UNLIKELY (res == -1 && errno == EINTR)); } else { do res = write (wakeup->fds[1], &one, 1); while (G_UNLIKELY (res == -1 && errno == EINTR)); } } /** * g_wakeup_free: * @wakeup: a #GWakeup * * Frees @wakeup. * * You must not currently be polling on the #GPollFD returned by * g_wakeup_get_pollfd(), or the result is undefined. **/ void g_wakeup_free (GWakeup *wakeup) { close (wakeup->fds[0]); if (wakeup->fds[1] != -1) close (wakeup->fds[1]); g_slice_free (GWakeup, wakeup); } #endif /* !_WIN32 */ pkg-config-0.29.1/glib/glib/gspawn.h0000664000175000017500000003452212651243552014067 00000000000000/* gspawn.h - Process launching * * Copyright 2000 Red Hat, Inc. * * GLib is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * GLib is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with GLib; see the file COPYING.LIB. If not, write * to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __G_SPAWN_H__ #define __G_SPAWN_H__ #if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) #error "Only can be included directly." #endif #include G_BEGIN_DECLS /* I'm not sure I remember our proposed naming convention here. */ /** * G_SPAWN_ERROR: * * Error domain for spawning processes. Errors in this domain will * be from the #GSpawnError enumeration. See #GError for information on * error domains. */ #define G_SPAWN_ERROR g_spawn_error_quark () /** * GSpawnError: * @G_SPAWN_ERROR_FORK: Fork failed due to lack of memory. * @G_SPAWN_ERROR_READ: Read or select on pipes failed. * @G_SPAWN_ERROR_CHDIR: Changing to working directory failed. * @G_SPAWN_ERROR_ACCES: execv() returned EACCES * @G_SPAWN_ERROR_PERM: execv() returned EPERM * @G_SPAWN_ERROR_TOO_BIG: execv() returned E2BIG * @G_SPAWN_ERROR_2BIG: deprecated alias for %G_SPAWN_ERROR_TOO_BIG * @G_SPAWN_ERROR_NOEXEC: execv() returned ENOEXEC * @G_SPAWN_ERROR_NAMETOOLONG: execv() returned ENAMETOOLONG * @G_SPAWN_ERROR_NOENT: execv() returned ENOENT * @G_SPAWN_ERROR_NOMEM: execv() returned ENOMEM * @G_SPAWN_ERROR_NOTDIR: execv() returned ENOTDIR * @G_SPAWN_ERROR_LOOP: execv() returned ELOOP * @G_SPAWN_ERROR_TXTBUSY: execv() returned ETXTBUSY * @G_SPAWN_ERROR_IO: execv() returned EIO * @G_SPAWN_ERROR_NFILE: execv() returned ENFILE * @G_SPAWN_ERROR_MFILE: execv() returned EMFILE * @G_SPAWN_ERROR_INVAL: execv() returned EINVAL * @G_SPAWN_ERROR_ISDIR: execv() returned EISDIR * @G_SPAWN_ERROR_LIBBAD: execv() returned ELIBBAD * @G_SPAWN_ERROR_FAILED: Some other fatal failure, * error->message should explain. * * Error codes returned by spawning processes. */ typedef enum { G_SPAWN_ERROR_FORK, /* fork failed due to lack of memory */ G_SPAWN_ERROR_READ, /* read or select on pipes failed */ G_SPAWN_ERROR_CHDIR, /* changing to working dir failed */ G_SPAWN_ERROR_ACCES, /* execv() returned EACCES */ G_SPAWN_ERROR_PERM, /* execv() returned EPERM */ G_SPAWN_ERROR_TOO_BIG,/* execv() returned E2BIG */ #ifndef G_DISABLE_DEPRECATED G_SPAWN_ERROR_2BIG = G_SPAWN_ERROR_TOO_BIG, #endif G_SPAWN_ERROR_NOEXEC, /* execv() returned ENOEXEC */ G_SPAWN_ERROR_NAMETOOLONG, /* "" "" ENAMETOOLONG */ G_SPAWN_ERROR_NOENT, /* "" "" ENOENT */ G_SPAWN_ERROR_NOMEM, /* "" "" ENOMEM */ G_SPAWN_ERROR_NOTDIR, /* "" "" ENOTDIR */ G_SPAWN_ERROR_LOOP, /* "" "" ELOOP */ G_SPAWN_ERROR_TXTBUSY, /* "" "" ETXTBUSY */ G_SPAWN_ERROR_IO, /* "" "" EIO */ G_SPAWN_ERROR_NFILE, /* "" "" ENFILE */ G_SPAWN_ERROR_MFILE, /* "" "" EMFLE */ G_SPAWN_ERROR_INVAL, /* "" "" EINVAL */ G_SPAWN_ERROR_ISDIR, /* "" "" EISDIR */ G_SPAWN_ERROR_LIBBAD, /* "" "" ELIBBAD */ G_SPAWN_ERROR_FAILED /* other fatal failure, error->message * should explain */ } GSpawnError; /** * 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. * * Specifies the type of the setup function passed to g_spawn_async(), * g_spawn_sync() and g_spawn_async_with_pipes(), which can, in very * limited ways, be used to affect the child's execution. * * On POSIX platforms, the function is called in the child after GLib * has performed all the setup it plans to perform, but before calling * exec(). Actions taken in this function will only affect the child, * not the parent. * * On Windows, the function is called in the parent. Its usefulness on * Windows is thus questionable. In many cases executing the child setup * function in the parent can have ill effects, and you should be very * careful when porting software to Windows that uses child setup * functions. * * However, even on POSIX, you are extremely limited in what you can * safely do from a #GSpawnChildSetupFunc, because any mutexes that * were held by other threads in the parent process at the time of the * fork() will still be locked in the child process, and they will * never be unlocked (since the threads that held them don't exist in * the child). POSIX allows only async-signal-safe functions (see * signal7) * to be called in the child between fork() and exec(), which * drastically limits the usefulness of child setup functions. * * In particular, it is not safe to call any function which may * call malloc(), which includes POSIX functions such as setenv(). * If you need to set up the child environment differently from * the parent, you should use g_get_environ(), g_environ_setenv(), * and g_environ_unsetenv(), and then pass the complete environment * list to the g_spawn... function. */ 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. * @G_SPAWN_DO_NOT_REAP_CHILD: the child will not be automatically reaped; you * must use g_child_watch_add() yourself (or call waitpid() * or handle SIGCHLD yourself), or the child will become a zombie. * @G_SPAWN_SEARCH_PATH: argv[0] need not be an absolute path, * it will be looked for in the user's PATH. * @G_SPAWN_STDOUT_TO_DEV_NULL: the child's standard output will be discarded, * instead of going to the same location as the parent's standard output. * @G_SPAWN_STDERR_TO_DEV_NULL: the child's standard error will be discarded. * @G_SPAWN_CHILD_INHERITS_STDIN: the child will inherit the parent's standard * input (by default, the child's standard input is attached to * /dev/null). * @G_SPAWN_FILE_AND_ARGV_ZERO: the first element of argv is * the file to execute, while the remaining elements are the actual argument * vector to pass to the file. Normally g_spawn_async_with_pipes() uses * argv[0] as the file to execute, and passes all of * argv to the child. * @G_SPAWN_SEARCH_PATH_FROM_ENVP: if argv[0] is not an abolute path, * it will be looked for in the PATH 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() */ G_SPAWN_SEARCH_PATH = 1 << 2, /* Dump output to /dev/null */ G_SPAWN_STDOUT_TO_DEV_NULL = 1 << 3, G_SPAWN_STDERR_TO_DEV_NULL = 1 << 4, G_SPAWN_CHILD_INHERITS_STDIN = 1 << 5, G_SPAWN_FILE_AND_ARGV_ZERO = 1 << 6, 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); GLIB_AVAILABLE_IN_ALL gboolean g_spawn_async (const gchar *working_directory, gchar **argv, gchar **envp, GSpawnFlags flags, GSpawnChildSetupFunc child_setup, gpointer user_data, GPid *child_pid, GError **error); /* Opens pipes for non-NULL standard_output, standard_input, standard_error, * and returns the parent's end of the pipes. */ GLIB_AVAILABLE_IN_ALL gboolean g_spawn_async_with_pipes (const gchar *working_directory, gchar **argv, gchar **envp, GSpawnFlags flags, GSpawnChildSetupFunc child_setup, gpointer user_data, GPid *child_pid, gint *standard_input, gint *standard_output, gint *standard_error, GError **error); /* If standard_output or standard_error are non-NULL, the full * standard output or error of the command will be placed there. */ GLIB_AVAILABLE_IN_ALL gboolean g_spawn_sync (const gchar *working_directory, gchar **argv, gchar **envp, GSpawnFlags flags, GSpawnChildSetupFunc child_setup, gpointer user_data, gchar **standard_output, gchar **standard_error, gint *exit_status, GError **error); 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__ */ pkg-config-0.29.1/glib/glib/gtrashstack.h0000664000175000017500000000527312651243552015107 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the GLib Team and others 1997-2000. See the AUTHORS * file for a list of people on the GLib Team. See the ChangeLog * files for a list of changes. These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/. */ #ifndef __G_TRASH_STACK_H__ #define __G_TRASH_STACK_H__ #if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) #error "Only can be included directly." #endif #include G_BEGIN_DECLS typedef struct _GTrashStack GTrashStack; struct _GTrashStack { GTrashStack *next; }; G_INLINE_FUNC void g_trash_stack_push (GTrashStack **stack_p, gpointer data_p); G_INLINE_FUNC gpointer g_trash_stack_pop (GTrashStack **stack_p); G_INLINE_FUNC gpointer g_trash_stack_peek (GTrashStack **stack_p); G_INLINE_FUNC guint g_trash_stack_height (GTrashStack **stack_p); #if defined (G_CAN_INLINE) || defined (__G_TRASH_STACK_C__) G_INLINE_FUNC void g_trash_stack_push (GTrashStack **stack_p, gpointer data_p) { GTrashStack *data = (GTrashStack *) data_p; data->next = *stack_p; *stack_p = data; } G_INLINE_FUNC gpointer g_trash_stack_pop (GTrashStack **stack_p) { GTrashStack *data; data = *stack_p; if (data) { *stack_p = data->next; /* NULLify private pointer here, most platforms store NULL as * subsequent 0 bytes */ data->next = NULL; } return data; } G_INLINE_FUNC gpointer g_trash_stack_peek (GTrashStack **stack_p) { GTrashStack *data; data = *stack_p; return data; } G_INLINE_FUNC guint g_trash_stack_height (GTrashStack **stack_p) { GTrashStack *data; guint i = 0; for (data = *stack_p; data; data = data->next) i++; return i; } #endif /* G_CAN_INLINE || __G_TRASH_STACK_C__ */ G_END_DECLS #endif /* __G_UTILS_H__ */ pkg-config-0.29.1/glib/glib/gunicodeprivate.h0000664000175000017500000000210512651243552015750 00000000000000/* gunicodeprivate.h * * Copyright (C) 2003 Noah Levitt * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __G_UNICODE_PRIVATE_H__ #define __G_UNICODE_PRIVATE_H__ #include "gtypes.h" G_BEGIN_DECLS gunichar *_g_utf8_normalize_wc (const gchar *str, gssize max_len, GNormalizeMode mode); G_END_DECLS #endif /* __G_UNICODE_PRIVATE_H__ */ pkg-config-0.29.1/glib/glib/gen-iswide-table.py0000775000175000017500000000164612275467762016132 00000000000000#!/usr/bin/python import sys W = {} W['A'] = [] W['W'] = [] W['F'] = W['W'] for line in sys.stdin: i = line.find ('#') if i >= 0: line = line[:i] line = line.strip () if not len (line): continue fields = [x.strip () for x in line.split (';')] chars = fields[0] width = fields[1] if width not in ['A', 'W', 'F']: continue if chars.find ('..') > 0: (start,end) = chars.split ('..') else: start = chars end = chars start, end = int(start,16), int(end,16) for i in range (start, end+1): W[width].append (i) def write_intervals (S): S.sort () start = S[0]; end = start - 1 for c in S: if c == end+1: end += 1 continue else: print "{0x%04X, 0x%04X}, " % (start, end) start = c end = start print "{0x%04X, 0x%04X} " % (start, end) print "table for g_unichar_iswide():" print write_intervals (W['W']) print print "table for g_unichar_iswide_cjk():" print write_intervals (W['A']) pkg-config-0.29.1/glib/glib/gvariant-serialiser.h0000664000175000017500000000715312651243552016543 00000000000000/* * Copyright © 2007, 2008 Ryan Lortie * Copyright © 2010 Codethink Limited * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * * Author: Ryan Lortie */ #ifndef __G_VARIANT_SERIALISER_H__ #define __G_VARIANT_SERIALISER_H__ #include "gvarianttypeinfo.h" typedef struct { GVariantTypeInfo *type_info; guchar *data; gsize size; } 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); /* serialisation */ 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); #endif /* __G_VARIANT_SERIALISER_H__ */ pkg-config-0.29.1/glib/glib/ghmac.h0000664000175000017500000000633112651243552013644 00000000000000/* ghmac.h - secure data hashing * * Copyright (C) 2011 Stef Walter * * 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_HMAC_H__ #define __G_HMAC_H__ #if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) #error "Only can be included directly." #endif #include #include "gchecksum.h" G_BEGIN_DECLS /** * GHmac: * * An opaque structure representing a HMAC operation. * To create a new GHmac, use g_hmac_new(). To free * a GHmac, use g_hmac_unref(). * * Since: 2.30 */ typedef struct _GHmac GHmac; GLIB_AVAILABLE_IN_2_30 GHmac * g_hmac_new (GChecksumType digest_type, const guchar *key, gsize key_len); GLIB_AVAILABLE_IN_2_30 GHmac * g_hmac_copy (const GHmac *hmac); GLIB_AVAILABLE_IN_2_30 GHmac * g_hmac_ref (GHmac *hmac); GLIB_AVAILABLE_IN_2_30 void g_hmac_unref (GHmac *hmac); GLIB_AVAILABLE_IN_2_30 void g_hmac_update (GHmac *hmac, const guchar *data, gssize length); GLIB_AVAILABLE_IN_2_30 const gchar * g_hmac_get_string (GHmac *hmac); GLIB_AVAILABLE_IN_2_30 void g_hmac_get_digest (GHmac *hmac, guint8 *buffer, gsize *digest_len); GLIB_AVAILABLE_IN_2_30 gchar *g_compute_hmac_for_data (GChecksumType digest_type, const guchar *key, gsize key_len, const guchar *data, gsize length); GLIB_AVAILABLE_IN_2_30 gchar *g_compute_hmac_for_string (GChecksumType digest_type, const guchar *key, gsize key_len, const gchar *str, gssize length); G_END_DECLS #endif /* __G_CHECKSUM_H__ */ pkg-config-0.29.1/glib/glib/gconvert.c0000664000175000017500000015701512651243552014415 00000000000000/* GLIB - Library of useful routines for C programming * * gconvert.c: Convert between character sets using iconv * Copyright Red Hat Inc., 2000 * Authors: Havoc Pennington , Owen Taylor * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "config.h" #include "glibconfig.h" #ifndef G_OS_WIN32 #include #endif #include #include #include #include #ifdef G_OS_WIN32 #include "win_iconv.c" #endif #ifdef G_PLATFORM_WIN32 #define STRICT #include #undef STRICT #endif #include "gconvert.h" #include "gcharsetprivate.h" #include "gslist.h" #include "gstrfuncs.h" #include "gtestutils.h" #include "gthread.h" #include "gunicode.h" #include "gfileutils.h" #include "glibintl.h" #if defined(USE_LIBICONV_GNU) && !defined (_LIBICONV_H) #error GNU libiconv in use but included iconv.h not from libiconv #endif #if !defined(USE_LIBICONV_GNU) && defined (_LIBICONV_H) \ && !defined (__APPLE_CC__) && !defined (__LP_64__) #error GNU libiconv not in use but included iconv.h is from libiconv #endif /** * SECTION:conversions * @title: Character Set Conversion * @short_description: convert strings between different character sets * * The g_convert() family of function wraps the functionality of iconv(). In * addition to pure character set conversions, GLib has functions to deal * with the extra complications of encodings for file names. * * * File Name Encodings * * Historically, Unix has not had a defined encoding for file * names: a file name is valid as long as it does not have path * separators in it ("/"). However, displaying file names may * require conversion: from the character set in which they were * created, to the character set in which the application * operates. Consider the Spanish file name * "Presentación.sxi". If the * application which created it uses ISO-8859-1 for its encoding, * * * Character: P r e s e n t a c i ó n . s x i * Hex code: 50 72 65 73 65 6e 74 61 63 69 f3 6e 2e 73 78 69 * * * However, if the application use UTF-8, the actual file name on * disk would look like this: * * * Character: P r e s e n t a c i ó n . s x i * Hex code: 50 72 65 73 65 6e 74 61 63 69 c3 b3 6e 2e 73 78 69 * * * Glib uses UTF-8 for its strings, and GUI toolkits like GTK+ * that use Glib do the same thing. If you get a file name from * the file system, for example, from readdir(3) or from g_dir_read_name(), * and you wish to display the file name to the user, you * will need to convert it into UTF-8. The * opposite case is when the user types the name of a file he * wishes to save: the toolkit will give you that string in * UTF-8 encoding, and you will need to convert it to the * character set used for file names before you can create the * file with open(2) or fopen(3). * * * By default, Glib assumes that file names on disk are in UTF-8 * encoding. This is a valid assumption for file systems which * were created relatively recently: most applications use UTF-8 * encoding for their strings, and that is also what they use for * the file names they create. However, older file systems may * still contain file names created in "older" encodings, such as * ISO-8859-1. In this case, for compatibility reasons, you may * want to instruct Glib to use that particular encoding for file * names rather than UTF-8. You can do this by specifying the * encoding for file names in the G_FILENAME_ENCODING * environment variable. For example, if your installation uses * ISO-8859-1 for file names, you can put this in your * ~/.profile: * * * export G_FILENAME_ENCODING=ISO-8859-1 * * * Glib provides the functions g_filename_to_utf8() and * g_filename_from_utf8() to perform the necessary conversions. These * functions convert file names from the encoding specified in * G_FILENAME_ENCODING to UTF-8 and vice-versa. * illustrates how * these functions are used to convert between UTF-8 and the * encoding for file names in the file system. * *
* Conversion between File Name Encodings * *
* * Checklist for Application Writers * * This section is a practical summary of the detailed * description above. You can use this as a checklist of * things to do to make sure your applications process file * name encodings correctly. * * * * If you get a file name from the file system from a function * such as readdir(3) or gtk_file_chooser_get_filename(), * you do not need to do any conversion to pass that * file name to functions like open(2), rename(2), or * fopen(3) — those are "raw" file names which the file * system understands. * * * If you need to display a file name, convert it to UTF-8 first by * using g_filename_to_utf8(). If conversion fails, display a string like * "Unknown file name". Do not * convert this string back into the encoding used for file names if you * wish to pass it to the file system; use the original file name instead. * For example, the document window of a word processor could display * "Unknown file name" in its title bar but still let the user save the * file, as it would keep the raw file name internally. This can happen * if the user has not set the G_FILENAME_ENCODING * environment variable even though he has files whose names are not * encoded in UTF-8. * * * If your user interface lets the user type a file name for saving or * renaming, convert it to the encoding used for file names in the file * system by using g_filename_from_utf8(). Pass the converted file name * to functions like fopen(3). If conversion fails, ask the user to enter * a different file name. This can happen if the user types Japanese * characters when G_FILENAME_ENCODING is set to * ISO-8859-1, for example. * * * *
*/ /* We try to terminate strings in unknown charsets with this many zero bytes * to ensure that multibyte strings really are nul-terminated when we return * them from g_convert() and friends. */ #define NUL_TERMINATOR_LENGTH 4 G_DEFINE_QUARK (g_convert_error, g_convert_error) static gboolean try_conversion (const char *to_codeset, const char *from_codeset, iconv_t *cd) { *cd = iconv_open (to_codeset, from_codeset); if (*cd == (iconv_t)-1 && errno == EINVAL) return FALSE; else return TRUE; } static gboolean try_to_aliases (const char **to_aliases, const char *from_codeset, iconv_t *cd) { if (to_aliases) { const char **p = to_aliases; while (*p) { if (try_conversion (*p, from_codeset, cd)) return TRUE; p++; } } return FALSE; } extern const char ** _g_charset_get_aliases (const char *canonical_name); /** * g_iconv_open: * @to_codeset: destination codeset * @from_codeset: source codeset * * Same as the standard UNIX routine iconv_open(), but * may be implemented via libiconv on UNIX flavors that lack * a native implementation. * * GLib provides g_convert() and g_locale_to_utf8() which are likely * more convenient than the raw iconv wrappers. * * Return value: a "conversion descriptor", or (GIConv)-1 if * opening the converter failed. **/ GIConv g_iconv_open (const gchar *to_codeset, const gchar *from_codeset) { iconv_t cd; if (!try_conversion (to_codeset, from_codeset, &cd)) { const char **to_aliases = _g_charset_get_aliases (to_codeset); const char **from_aliases = _g_charset_get_aliases (from_codeset); if (from_aliases) { const char **p = from_aliases; while (*p) { if (try_conversion (to_codeset, *p, &cd)) goto out; if (try_to_aliases (to_aliases, *p, &cd)) goto out; p++; } } if (try_to_aliases (to_aliases, from_codeset, &cd)) goto out; } out: return (cd == (iconv_t)-1) ? (GIConv)-1 : (GIConv)cd; } /** * g_iconv: * @converter: conversion descriptor from g_iconv_open() * @inbuf: bytes to convert * @inbytes_left: inout parameter, bytes remaining to convert in @inbuf * @outbuf: converted output bytes * @outbytes_left: inout parameter, bytes available to fill in @outbuf * * Same as the standard UNIX routine iconv(), but * may be implemented via libiconv on UNIX flavors that lack * a native implementation. * * GLib provides g_convert() and g_locale_to_utf8() which are likely * more convenient than the raw iconv wrappers. * * Return value: count of non-reversible conversions, or -1 on error **/ gsize g_iconv (GIConv converter, gchar **inbuf, gsize *inbytes_left, gchar **outbuf, gsize *outbytes_left) { iconv_t cd = (iconv_t)converter; return iconv (cd, inbuf, inbytes_left, outbuf, outbytes_left); } /** * g_iconv_close: * @converter: a conversion descriptor from g_iconv_open() * * Same as the standard UNIX routine iconv_close(), but * may be implemented via libiconv on UNIX flavors that lack * a native implementation. Should be called to clean up * the conversion descriptor from g_iconv_open() when * you are done converting things. * * GLib provides g_convert() and g_locale_to_utf8() which are likely * more convenient than the raw iconv wrappers. * * Return value: -1 on error, 0 on success **/ gint g_iconv_close (GIConv converter) { iconv_t cd = (iconv_t)converter; return iconv_close (cd); } static GIConv open_converter (const gchar *to_codeset, const gchar *from_codeset, GError **error) { GIConv cd; cd = g_iconv_open (to_codeset, from_codeset); if (cd == (GIConv) -1) { /* Something went wrong. */ if (error) { if (errno == EINVAL) g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_NO_CONVERSION, _("Conversion from character set '%s' to '%s' is not supported"), from_codeset, to_codeset); else g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_FAILED, _("Could not open converter from '%s' to '%s'"), from_codeset, to_codeset); } } return cd; } static int close_converter (GIConv cd) { if (cd == (GIConv) -1) return 0; return g_iconv_close (cd); } /** * g_convert_with_iconv: * @str: the string to convert * @len: the length of the string, or -1 if the string is * nul-terminated. * @converter: conversion descriptor from g_iconv_open() * @bytes_read: location to store the number of bytes in the * input string that were successfully converted, or %NULL. * Even if the conversion was successful, this may be * less than @len if there were partial characters * at the end of the input. If the error * #G_CONVERT_ERROR_ILLEGAL_SEQUENCE occurs, the value * stored will the byte offset after the last valid * input sequence. * @bytes_written: the number of bytes stored in the output buffer (not * including the terminating nul). * @error: location to store the error occurring, or %NULL to ignore * errors. Any of the errors in #GConvertError may occur. * * Converts a string from one character set to another. * * Note that you should use g_iconv() for streaming * conversions * * Despite the fact that @byes_read can return information about partial * characters, the g_convert_... functions * are not generally suitable for streaming. If the underlying converter * being used maintains internal state, then this won't be preserved * across successive calls to g_convert(), g_convert_with_iconv() or * g_convert_with_fallback(). (An example of this is the GNU C converter * for CP1255 which does not emit a base character until it knows that * the next character is not a mark that could combine with the base * character.) * * . * * Return value: If the conversion was successful, a newly allocated * nul-terminated string, which must be freed with * g_free(). Otherwise %NULL and @error will be set. **/ gchar* g_convert_with_iconv (const gchar *str, gssize len, GIConv converter, gsize *bytes_read, gsize *bytes_written, GError **error) { gchar *dest; gchar *outp; const gchar *p; gsize inbytes_remaining; gsize outbytes_remaining; gsize err; gsize outbuf_size; gboolean have_error = FALSE; gboolean done = FALSE; gboolean reset = FALSE; g_return_val_if_fail (converter != (GIConv) -1, NULL); if (len < 0) len = strlen (str); p = str; inbytes_remaining = len; outbuf_size = len + NUL_TERMINATOR_LENGTH; outbytes_remaining = outbuf_size - NUL_TERMINATOR_LENGTH; outp = dest = g_malloc (outbuf_size); while (!done && !have_error) { if (reset) err = g_iconv (converter, NULL, &inbytes_remaining, &outp, &outbytes_remaining); else err = g_iconv (converter, (char **)&p, &inbytes_remaining, &outp, &outbytes_remaining); if (err == (gsize) -1) { switch (errno) { case EINVAL: /* Incomplete text, do not report an error */ done = TRUE; break; case E2BIG: { gsize used = outp - dest; outbuf_size *= 2; dest = g_realloc (dest, outbuf_size); outp = dest + used; outbytes_remaining = outbuf_size - used - NUL_TERMINATOR_LENGTH; } break; case EILSEQ: g_set_error_literal (error, G_CONVERT_ERROR, G_CONVERT_ERROR_ILLEGAL_SEQUENCE, _("Invalid byte sequence in conversion input")); have_error = TRUE; break; default: { int errsv = errno; g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_FAILED, _("Error during conversion: %s"), g_strerror (errsv)); } have_error = TRUE; break; } } else { if (!reset) { /* call g_iconv with NULL inbuf to cleanup shift state */ reset = TRUE; inbytes_remaining = 0; } else done = TRUE; } } memset (outp, 0, NUL_TERMINATOR_LENGTH); if (bytes_read) *bytes_read = p - str; else { if ((p - str) != len) { if (!have_error) { g_set_error_literal (error, G_CONVERT_ERROR, G_CONVERT_ERROR_PARTIAL_INPUT, _("Partial character sequence at end of input")); have_error = TRUE; } } } if (bytes_written) *bytes_written = outp - dest; /* Doesn't include '\0' */ if (have_error) { g_free (dest); return NULL; } else return dest; } /** * g_convert: * @str: the string to convert * @len: the length of the string, or -1 if the string is * nul-terminated Note that some encodings may allow nul bytes to occur inside strings. In that case, using -1 for the @len parameter is unsafe. . * @to_codeset: name of character set into which to convert @str * @from_codeset: character set of @str. * @bytes_read: (out): 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: (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. * * Converts a string from one character set to another. * * Note that you should use g_iconv() for streaming * conversions. * * Return value: If the conversion was successful, a newly allocated * nul-terminated string, which must be freed with * g_free(). Otherwise %NULL and @error will be set. **/ gchar* g_convert (const gchar *str, gssize len, const gchar *to_codeset, const gchar *from_codeset, gsize *bytes_read, gsize *bytes_written, GError **error) { gchar *res; GIConv cd; g_return_val_if_fail (str != NULL, NULL); g_return_val_if_fail (to_codeset != NULL, NULL); g_return_val_if_fail (from_codeset != NULL, NULL); cd = open_converter (to_codeset, from_codeset, error); if (cd == (GIConv) -1) { if (bytes_read) *bytes_read = 0; if (bytes_written) *bytes_written = 0; return NULL; } res = g_convert_with_iconv (str, len, cd, bytes_read, bytes_written, error); close_converter (cd); return res; } /** * g_convert_with_fallback: * @str: the string to convert * @len: the length of the string, or -1 if the string is * nul-terminated. * @to_codeset: name of character set into which to convert @str * @from_codeset: character set of @str. * @fallback: UTF-8 string to use in place of character not * present in the target encoding. (The string must be * representable in the target encoding). If %NULL, characters not in the target encoding will be represented as Unicode escapes \uxxxx or \Uxxxxyyyy. * @bytes_read: location to store the number of bytes in the * input string that were successfully converted, or %NULL. * Even if the conversion was successful, this may be * less than @len if there were partial characters * at the end of the input. * @bytes_written: the number of bytes stored in the output buffer (not * including the terminating nul). * @error: location to store the error occurring, or %NULL to ignore * errors. Any of the errors in #GConvertError may occur. * * Converts a string from one character set to another, possibly * including fallback sequences for characters not representable * in the output. Note that it is not guaranteed that the specification * for the fallback sequences in @fallback will be honored. Some * systems may do an approximate conversion from @from_codeset * to @to_codeset in their iconv() functions, * in which case GLib will simply return that approximate conversion. * * Note that you should use g_iconv() for streaming * conversions. * * Return value: If the conversion was successful, a newly allocated * nul-terminated string, which must be freed with * g_free(). Otherwise %NULL and @error will be set. **/ gchar* g_convert_with_fallback (const gchar *str, gssize len, const gchar *to_codeset, const gchar *from_codeset, const gchar *fallback, gsize *bytes_read, gsize *bytes_written, GError **error) { gchar *utf8; gchar *dest; gchar *outp; const gchar *insert_str = NULL; const gchar *p; gsize inbytes_remaining; const gchar *save_p = NULL; gsize save_inbytes = 0; gsize outbytes_remaining; gsize err; GIConv cd; gsize outbuf_size; gboolean have_error = FALSE; gboolean done = FALSE; GError *local_error = NULL; g_return_val_if_fail (str != NULL, NULL); g_return_val_if_fail (to_codeset != NULL, NULL); g_return_val_if_fail (from_codeset != NULL, NULL); if (len < 0) len = strlen (str); /* Try an exact conversion; we only proceed if this fails * due to an illegal sequence in the input string. */ dest = g_convert (str, len, to_codeset, from_codeset, bytes_read, bytes_written, &local_error); if (!local_error) return dest; if (!g_error_matches (local_error, G_CONVERT_ERROR, G_CONVERT_ERROR_ILLEGAL_SEQUENCE)) { g_propagate_error (error, local_error); return NULL; } else g_error_free (local_error); local_error = NULL; /* No go; to proceed, we need a converter from "UTF-8" to * to_codeset, and the string as UTF-8. */ cd = open_converter (to_codeset, "UTF-8", error); if (cd == (GIConv) -1) { if (bytes_read) *bytes_read = 0; if (bytes_written) *bytes_written = 0; return NULL; } utf8 = g_convert (str, len, "UTF-8", from_codeset, bytes_read, &inbytes_remaining, error); if (!utf8) { close_converter (cd); if (bytes_written) *bytes_written = 0; return NULL; } /* Now the heart of the code. We loop through the UTF-8 string, and * whenever we hit an offending character, we form fallback, convert * the fallback to the target codeset, and then go back to * converting the original string after finishing with the fallback. * * The variables save_p and save_inbytes store the input state * for the original string while we are converting the fallback */ p = utf8; outbuf_size = len + NUL_TERMINATOR_LENGTH; outbytes_remaining = outbuf_size - NUL_TERMINATOR_LENGTH; outp = dest = g_malloc (outbuf_size); while (!done && !have_error) { gsize inbytes_tmp = inbytes_remaining; err = g_iconv (cd, (char **)&p, &inbytes_tmp, &outp, &outbytes_remaining); inbytes_remaining = inbytes_tmp; if (err == (gsize) -1) { switch (errno) { case EINVAL: g_assert_not_reached(); break; case E2BIG: { gsize used = outp - dest; outbuf_size *= 2; dest = g_realloc (dest, outbuf_size); outp = dest + used; outbytes_remaining = outbuf_size - used - NUL_TERMINATOR_LENGTH; break; } case EILSEQ: if (save_p) { /* Error converting fallback string - fatal */ g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_ILLEGAL_SEQUENCE, _("Cannot convert fallback '%s' to codeset '%s'"), insert_str, to_codeset); have_error = TRUE; break; } else if (p) { if (!fallback) { gunichar ch = g_utf8_get_char (p); insert_str = g_strdup_printf (ch < 0x10000 ? "\\u%04x" : "\\U%08x", ch); } else insert_str = fallback; save_p = g_utf8_next_char (p); save_inbytes = inbytes_remaining - (save_p - p); p = insert_str; inbytes_remaining = strlen (p); break; } /* fall thru if p is NULL */ default: { int errsv = errno; g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_FAILED, _("Error during conversion: %s"), g_strerror (errsv)); } have_error = TRUE; break; } } else { if (save_p) { if (!fallback) g_free ((gchar *)insert_str); p = save_p; inbytes_remaining = save_inbytes; save_p = NULL; } else if (p) { /* call g_iconv with NULL inbuf to cleanup shift state */ p = NULL; inbytes_remaining = 0; } else done = TRUE; } } /* Cleanup */ memset (outp, 0, NUL_TERMINATOR_LENGTH); close_converter (cd); if (bytes_written) *bytes_written = outp - dest; /* Doesn't include '\0' */ g_free (utf8); if (have_error) { if (save_p && !fallback) g_free ((gchar *)insert_str); g_free (dest); return NULL; } else return dest; } /* * g_locale_to_utf8 * * */ static gchar * strdup_len (const gchar *string, gssize len, gsize *bytes_written, gsize *bytes_read, GError **error) { gsize real_len; if (!g_utf8_validate (string, len, NULL)) { if (bytes_read) *bytes_read = 0; if (bytes_written) *bytes_written = 0; g_set_error_literal (error, G_CONVERT_ERROR, G_CONVERT_ERROR_ILLEGAL_SEQUENCE, _("Invalid byte sequence in conversion input")); return NULL; } if (len < 0) real_len = strlen (string); else { real_len = 0; while (real_len < len && string[real_len]) real_len++; } if (bytes_read) *bytes_read = real_len; if (bytes_written) *bytes_written = real_len; return g_strndup (string, real_len); } /** * g_locale_to_utf8: * @opsysstring: a string in the encoding of the current locale. On Windows * this means the system codepage. * @len: the length of the string, or -1 if the string is * nul-terminated. * @bytes_read: location to store the number of bytes in the * input string that were successfully converted, or %NULL. * Even if the conversion was successful, this may be * less than @len if there were partial characters * at the end of the input. If the error * #G_CONVERT_ERROR_ILLEGAL_SEQUENCE occurs, the value * stored will the byte offset after the last valid * input sequence. * @bytes_written: the number of bytes stored in the output buffer (not * including the terminating nul). * @error: location to store the error occurring, or %NULL to ignore * errors. Any of the errors in #GConvertError may occur. * * Converts a string which is in the encoding used for strings by * the C runtime (usually the same as that used by the operating * system) in the current locale into a * UTF-8 string. * * Return value: The converted string, or %NULL on an error. **/ gchar * g_locale_to_utf8 (const gchar *opsysstring, gssize len, gsize *bytes_read, gsize *bytes_written, GError **error) { const char *charset; if (g_get_charset (&charset)) return strdup_len (opsysstring, len, bytes_read, bytes_written, error); else return g_convert (opsysstring, len, "UTF-8", charset, bytes_read, bytes_written, error); } /** * g_locale_from_utf8: * @utf8string: a UTF-8 encoded string * @len: the length of the string, or -1 if the string is * nul-terminated. * @bytes_read: location to store the number of bytes in the * input string that were successfully converted, or %NULL. * Even if the conversion was successful, this may be * less than @len if there were partial characters * at the end of the input. If the error * #G_CONVERT_ERROR_ILLEGAL_SEQUENCE occurs, the value * stored will the byte offset after the last valid * input sequence. * @bytes_written: the number of bytes stored in the output buffer (not * including the terminating nul). * @error: location to store the error occurring, or %NULL to ignore * errors. Any of the errors in #GConvertError may occur. * * Converts a string from UTF-8 to the encoding used for strings by * the C runtime (usually the same as that used by the operating * system) in the current locale. On * Windows this means the system codepage. * * Return value: The converted string, or %NULL on an error. **/ gchar * g_locale_from_utf8 (const gchar *utf8string, gssize len, gsize *bytes_read, gsize *bytes_written, GError **error) { const gchar *charset; if (g_get_charset (&charset)) return strdup_len (utf8string, len, bytes_read, bytes_written, error); else return g_convert (utf8string, len, charset, "UTF-8", bytes_read, bytes_written, error); } #ifndef G_PLATFORM_WIN32 typedef struct _GFilenameCharsetCache GFilenameCharsetCache; struct _GFilenameCharsetCache { gboolean is_utf8; gchar *charset; gchar **filename_charsets; }; static void filename_charset_cache_free (gpointer data) { GFilenameCharsetCache *cache = data; g_free (cache->charset); g_strfreev (cache->filename_charsets); g_free (cache); } /** * g_get_filename_charsets: * @charsets: return location for the %NULL-terminated list of encoding names * * Determines the preferred character sets used for filenames. * The first character set from the @charsets is the filename encoding, the * subsequent character sets are used when trying to generate a displayable * representation of a filename, see g_filename_display_name(). * * On Unix, the character sets are determined by consulting the * environment variables G_FILENAME_ENCODING and * G_BROKEN_FILENAMES. On Windows, the character set * used in the GLib API is always UTF-8 and said environment variables * have no effect. * * G_FILENAME_ENCODING may be set to a comma-separated list * of character set names. The special token "@locale" is taken to * mean the character set for the current * locale. If G_FILENAME_ENCODING is not set, but * G_BROKEN_FILENAMES is, the character set of the current * locale is taken as the filename encoding. If neither environment variable * is set, UTF-8 is taken as the filename encoding, but the character * set of the current locale is also put in the list of encodings. * * The returned @charsets belong to GLib and must not be freed. * * Note that on Unix, regardless of the locale character set or * G_FILENAME_ENCODING value, the actual file names present * on a system might be in any random encoding or just gibberish. * * Return value: %TRUE if the filename encoding is UTF-8. * * Since: 2.6 */ gboolean g_get_filename_charsets (const gchar ***filename_charsets) { static GPrivate cache_private = G_PRIVATE_INIT (filename_charset_cache_free); GFilenameCharsetCache *cache = g_private_get (&cache_private); const gchar *charset; if (!cache) { cache = g_new0 (GFilenameCharsetCache, 1); g_private_set (&cache_private, cache); } g_get_charset (&charset); if (!(cache->charset && strcmp (cache->charset, charset) == 0)) { const gchar *new_charset; gchar *p; gint i; g_free (cache->charset); g_strfreev (cache->filename_charsets); cache->charset = g_strdup (charset); p = getenv ("G_FILENAME_ENCODING"); if (p != NULL && p[0] != '\0') { cache->filename_charsets = g_strsplit (p, ",", 0); cache->is_utf8 = (strcmp (cache->filename_charsets[0], "UTF-8") == 0); for (i = 0; cache->filename_charsets[i]; i++) { if (strcmp ("@locale", cache->filename_charsets[i]) == 0) { g_get_charset (&new_charset); g_free (cache->filename_charsets[i]); cache->filename_charsets[i] = g_strdup (new_charset); } } } else if (getenv ("G_BROKEN_FILENAMES") != NULL) { cache->filename_charsets = g_new0 (gchar *, 2); cache->is_utf8 = g_get_charset (&new_charset); cache->filename_charsets[0] = g_strdup (new_charset); } else { cache->filename_charsets = g_new0 (gchar *, 3); cache->is_utf8 = TRUE; cache->filename_charsets[0] = g_strdup ("UTF-8"); if (!g_get_charset (&new_charset)) cache->filename_charsets[1] = g_strdup (new_charset); } } if (filename_charsets) *filename_charsets = (const gchar **)cache->filename_charsets; return cache->is_utf8; } #else /* G_PLATFORM_WIN32 */ gboolean g_get_filename_charsets (const gchar ***filename_charsets) { static const gchar *charsets[] = { "UTF-8", NULL }; #ifdef G_OS_WIN32 /* On Windows GLib pretends that the filename charset is UTF-8 */ if (filename_charsets) *filename_charsets = charsets; return TRUE; #else gboolean result; /* Cygwin works like before */ result = g_get_charset (&(charsets[0])); if (filename_charsets) *filename_charsets = charsets; return result; #endif } #endif /* G_PLATFORM_WIN32 */ static gboolean get_filename_charset (const gchar **filename_charset) { const gchar **charsets; gboolean is_utf8; is_utf8 = g_get_filename_charsets (&charsets); if (filename_charset) *filename_charset = charsets[0]; return is_utf8; } /** * g_filename_to_utf8: * @opsysstring: a string in the encoding for filenames * @len: the length of the string, or -1 if the string is * nul-terminated. * @bytes_read: location to store the number of bytes in the * input string that were successfully converted, or %NULL. * Even if the conversion was successful, this may be * less than @len if there were partial characters * at the end of the input. If the error * #G_CONVERT_ERROR_ILLEGAL_SEQUENCE occurs, the value * stored will the byte offset after the last valid * input sequence. * @bytes_written: the number of bytes stored in the output buffer (not * including the terminating nul). * @error: location to store the error occurring, or %NULL to ignore * errors. Any of the errors in #GConvertError may occur. * * Converts a string which is in the encoding used by GLib for * filenames into a UTF-8 string. Note that on Windows GLib uses UTF-8 * for filenames; on other platforms, this function indirectly depends on * the current locale. * * Return value: The converted string, or %NULL on an error. **/ gchar* g_filename_to_utf8 (const gchar *opsysstring, gssize len, gsize *bytes_read, gsize *bytes_written, GError **error) { const gchar *charset; g_return_val_if_fail (opsysstring != NULL, NULL); if (get_filename_charset (&charset)) return strdup_len (opsysstring, len, bytes_read, bytes_written, error); else return g_convert (opsysstring, len, "UTF-8", charset, bytes_read, bytes_written, error); } #if defined (G_OS_WIN32) && !defined (_WIN64) #undef g_filename_to_utf8 /* Binary compatibility version. Not for newly compiled code. Also not needed for * 64-bit versions as there should be no old deployed binaries that would use * the old versions. */ gchar* g_filename_to_utf8 (const gchar *opsysstring, gssize len, gsize *bytes_read, gsize *bytes_written, GError **error) { const gchar *charset; g_return_val_if_fail (opsysstring != NULL, NULL); if (g_get_charset (&charset)) return strdup_len (opsysstring, len, bytes_read, bytes_written, error); else return g_convert (opsysstring, len, "UTF-8", charset, bytes_read, bytes_written, error); } #endif /** * g_filename_from_utf8: * @utf8string: a UTF-8 encoded string. * @len: the length of the string, or -1 if the string is * nul-terminated. * @bytes_read: (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: (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. * * Converts a string from UTF-8 to the encoding GLib uses for * filenames. Note that on Windows GLib uses UTF-8 for filenames; * on other platforms, this function indirectly depends on the * current locale. * * 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, gssize len, gsize *bytes_read, gsize *bytes_written, GError **error) { const gchar *charset; if (get_filename_charset (&charset)) return strdup_len (utf8string, len, bytes_read, bytes_written, error); else return g_convert (utf8string, len, charset, "UTF-8", bytes_read, bytes_written, error); } #if defined (G_OS_WIN32) && !defined (_WIN64) #undef g_filename_from_utf8 /* Binary compatibility version. Not for newly compiled code. */ gchar* g_filename_from_utf8 (const gchar *utf8string, gssize len, gsize *bytes_read, gsize *bytes_written, GError **error) { const gchar *charset; if (g_get_charset (&charset)) return strdup_len (utf8string, len, bytes_read, bytes_written, error); else return g_convert (utf8string, len, charset, "UTF-8", bytes_read, bytes_written, error); } #endif /* Test of haystack has the needle prefix, comparing case * insensitive. haystack may be UTF-8, but needle must * contain only ascii. */ static gboolean has_case_prefix (const gchar *haystack, const gchar *needle) { const gchar *h, *n; /* Eat one character at a time. */ h = haystack; n = needle; while (*n && *h && g_ascii_tolower (*n) == g_ascii_tolower (*h)) { n++; h++; } return *n == '\0'; } typedef enum { UNSAFE_ALL = 0x1, /* Escape all unsafe characters */ UNSAFE_ALLOW_PLUS = 0x2, /* Allows '+' */ UNSAFE_PATH = 0x8, /* Allows '/', '&', '=', ':', '@', '+', '$' and ',' */ UNSAFE_HOST = 0x10, /* Allows '/' and ':' and '@' */ UNSAFE_SLASHES = 0x20 /* Allows all characters except for '/' and '%' */ } UnsafeCharacterSet; static const guchar acceptable[96] = { /* A table of the ASCII chars from space (32) to DEL (127) */ /* ! " # $ % & ' ( ) * + , - . / */ 0x00,0x3F,0x20,0x20,0x28,0x00,0x2C,0x3F,0x3F,0x3F,0x3F,0x2A,0x28,0x3F,0x3F,0x1C, /* 0 1 2 3 4 5 6 7 8 9 : ; < = > ? */ 0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x38,0x20,0x20,0x2C,0x20,0x20, /* @ A B C D E F G H I J K L M N O */ 0x38,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F, /* P Q R S T U V W X Y Z [ \ ] ^ _ */ 0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x20,0x20,0x20,0x20,0x3F, /* ` a b c d e f g h i j k l m n o */ 0x20,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F, /* p q r s t u v w x y z { | } ~ DEL */ 0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x20,0x20,0x20,0x3F,0x20 }; static const gchar hex[16] = "0123456789ABCDEF"; /* Note: This escape function works on file: URIs, but if you want to * escape something else, please read RFC-2396 */ static gchar * g_escape_uri_string (const gchar *string, UnsafeCharacterSet mask) { #define ACCEPTABLE(a) ((a)>=32 && (a)<128 && (acceptable[(a)-32] & use_mask)) const gchar *p; gchar *q; gchar *result; int c; gint unacceptable; UnsafeCharacterSet use_mask; g_return_val_if_fail (mask == UNSAFE_ALL || mask == UNSAFE_ALLOW_PLUS || mask == UNSAFE_PATH || mask == UNSAFE_HOST || mask == UNSAFE_SLASHES, NULL); unacceptable = 0; use_mask = mask; for (p = string; *p != '\0'; p++) { c = (guchar) *p; if (!ACCEPTABLE (c)) unacceptable++; } result = g_malloc (p - string + unacceptable * 2 + 1); use_mask = mask; for (q = result, p = string; *p != '\0'; p++) { c = (guchar) *p; if (!ACCEPTABLE (c)) { *q++ = '%'; /* means hex coming */ *q++ = hex[c >> 4]; *q++ = hex[c & 15]; } else *q++ = *p; } *q = '\0'; return result; } static gchar * g_escape_file_uri (const gchar *hostname, const gchar *pathname) { char *escaped_hostname = NULL; char *escaped_path; char *res; #ifdef G_OS_WIN32 char *p, *backslash; /* Turn backslashes into forward slashes. That's what Netscape * does, and they are actually more or less equivalent in Windows. */ pathname = g_strdup (pathname); p = (char *) pathname; while ((backslash = strchr (p, '\\')) != NULL) { *backslash = '/'; p = backslash + 1; } #endif if (hostname && *hostname != '\0') { escaped_hostname = g_escape_uri_string (hostname, UNSAFE_HOST); } escaped_path = g_escape_uri_string (pathname, UNSAFE_PATH); res = g_strconcat ("file://", (escaped_hostname) ? escaped_hostname : "", (*escaped_path != '/') ? "/" : "", escaped_path, NULL); #ifdef G_OS_WIN32 g_free ((char *) pathname); #endif g_free (escaped_hostname); g_free (escaped_path); return res; } static int unescape_character (const char *scanner) { int first_digit; int second_digit; first_digit = g_ascii_xdigit_value (scanner[0]); if (first_digit < 0) return -1; second_digit = g_ascii_xdigit_value (scanner[1]); if (second_digit < 0) return -1; return (first_digit << 4) | second_digit; } static gchar * g_unescape_uri_string (const char *escaped, int len, const char *illegal_escaped_characters, gboolean ascii_must_not_be_escaped) { const gchar *in, *in_end; gchar *out, *result; int c; if (escaped == NULL) return NULL; if (len < 0) len = strlen (escaped); result = g_malloc (len + 1); out = result; for (in = escaped, in_end = escaped + len; in < in_end; in++) { c = *in; if (c == '%') { /* catch partial escape sequences past the end of the substring */ if (in + 3 > in_end) break; c = unescape_character (in + 1); /* catch bad escape sequences and NUL characters */ if (c <= 0) break; /* catch escaped ASCII */ if (ascii_must_not_be_escaped && c <= 0x7F) break; /* catch other illegal escaped characters */ if (strchr (illegal_escaped_characters, c) != NULL) break; in += 2; } *out++ = c; } g_assert (out - result <= len); *out = '\0'; if (in != in_end) { g_free (result); return NULL; } return result; } static gboolean is_asciialphanum (gunichar c) { return c <= 0x7F && g_ascii_isalnum (c); } static gboolean is_asciialpha (gunichar c) { return c <= 0x7F && g_ascii_isalpha (c); } /* allows an empty string */ static gboolean hostname_validate (const char *hostname) { const char *p; gunichar c, first_char, last_char; p = hostname; if (*p == '\0') return TRUE; do { /* read in a label */ c = g_utf8_get_char (p); p = g_utf8_next_char (p); if (!is_asciialphanum (c)) return FALSE; first_char = c; do { last_char = c; c = g_utf8_get_char (p); p = g_utf8_next_char (p); } while (is_asciialphanum (c) || c == '-'); if (last_char == '-') return FALSE; /* if that was the last label, check that it was a toplabel */ if (c == '\0' || (c == '.' && *p == '\0')) return is_asciialpha (first_char); } while (c == '.'); return FALSE; } /** * g_filename_from_uri: * @uri: a uri describing a filename (escaped, encoded in ASCII). * @hostname: (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 * errors. Any of the errors in #GConvertError may occur. * * Converts an escaped ASCII-encoded URI to a local filename in the * encoding used for filenames. * * Return value: (type filename): a newly-allocated string holding * the resulting filename, or %NULL on an error. **/ gchar * g_filename_from_uri (const gchar *uri, gchar **hostname, GError **error) { const char *path_part; const char *host_part; char *unescaped_hostname; char *result; char *filename; int offs; #ifdef G_OS_WIN32 char *p, *slash; #endif if (hostname) *hostname = NULL; if (!has_case_prefix (uri, "file:/")) { g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_BAD_URI, _("The URI '%s' is not an absolute URI using the \"file\" scheme"), uri); return NULL; } path_part = uri + strlen ("file:"); if (strchr (path_part, '#') != NULL) { g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_BAD_URI, _("The local file URI '%s' may not include a '#'"), uri); return NULL; } if (has_case_prefix (path_part, "///")) path_part += 2; else if (has_case_prefix (path_part, "//")) { path_part += 2; host_part = path_part; path_part = strchr (path_part, '/'); if (path_part == NULL) { g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_BAD_URI, _("The URI '%s' is invalid"), uri); return NULL; } unescaped_hostname = g_unescape_uri_string (host_part, path_part - host_part, "", TRUE); if (unescaped_hostname == NULL || !hostname_validate (unescaped_hostname)) { g_free (unescaped_hostname); g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_BAD_URI, _("The hostname of the URI '%s' is invalid"), uri); return NULL; } if (hostname) *hostname = unescaped_hostname; else g_free (unescaped_hostname); } filename = g_unescape_uri_string (path_part, -1, "/", FALSE); if (filename == NULL) { g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_BAD_URI, _("The URI '%s' contains invalidly escaped characters"), uri); return NULL; } offs = 0; #ifdef G_OS_WIN32 /* Drop localhost */ if (hostname && *hostname != NULL && g_ascii_strcasecmp (*hostname, "localhost") == 0) { g_free (*hostname); *hostname = NULL; } /* Turn slashes into backslashes, because that's the canonical spelling */ p = filename; while ((slash = strchr (p, '/')) != NULL) { *slash = '\\'; p = slash + 1; } /* Windows URIs with a drive letter can be like "file://host/c:/foo" * or "file://host/c|/foo" (some Netscape versions). In those cases, start * the filename from the drive letter. */ if (g_ascii_isalpha (filename[1])) { if (filename[2] == ':') offs = 1; else if (filename[2] == '|') { filename[2] = ':'; offs = 1; } } #endif result = g_strdup (filename + offs); g_free (filename); return result; } #if defined (G_OS_WIN32) && !defined (_WIN64) #undef g_filename_from_uri gchar * g_filename_from_uri (const gchar *uri, gchar **hostname, GError **error) { gchar *utf8_filename; gchar *retval = NULL; utf8_filename = g_filename_from_uri_utf8 (uri, hostname, error); if (utf8_filename) { retval = g_locale_from_utf8 (utf8_filename, -1, NULL, NULL, error); g_free (utf8_filename); } return retval; } #endif /** * g_filename_to_uri: * @filename: an absolute filename specified in the GLib file name encoding, * which is the on-disk file name bytes on Unix, and UTF-8 on * Windows * @hostname: (allow-none): A UTF-8 encoded hostname, or %NULL for none. * @error: location to store the error occurring, or %NULL to ignore * errors. Any of the errors in #GConvertError may occur. * * Converts an absolute filename to an escaped ASCII-encoded URI, with the path * component following Section 3.3. of RFC 2396. * * Return value: a newly-allocated string holding the resulting * URI, or %NULL on an error. **/ gchar * g_filename_to_uri (const gchar *filename, const gchar *hostname, GError **error) { char *escaped_uri; g_return_val_if_fail (filename != NULL, NULL); if (!g_path_is_absolute (filename)) { g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_NOT_ABSOLUTE_PATH, _("The pathname '%s' is not an absolute path"), filename); return NULL; } if (hostname && !(g_utf8_validate (hostname, -1, NULL) && hostname_validate (hostname))) { g_set_error_literal (error, G_CONVERT_ERROR, G_CONVERT_ERROR_ILLEGAL_SEQUENCE, _("Invalid hostname")); return NULL; } #ifdef G_OS_WIN32 /* Don't use localhost unnecessarily */ if (hostname && g_ascii_strcasecmp (hostname, "localhost") == 0) hostname = NULL; #endif escaped_uri = g_escape_file_uri (hostname, filename); return escaped_uri; } #if defined (G_OS_WIN32) && !defined (_WIN64) #undef g_filename_to_uri gchar * g_filename_to_uri (const gchar *filename, const gchar *hostname, GError **error) { gchar *utf8_filename; gchar *retval = NULL; utf8_filename = g_locale_to_utf8 (filename, -1, NULL, NULL, error); if (utf8_filename) { retval = g_filename_to_uri_utf8 (utf8_filename, hostname, error); g_free (utf8_filename); } return retval; } #endif /** * g_uri_list_extract_uris: * @uri_list: an URI list * * Splits an URI list conforming to the text/uri-list * mime type defined in RFC 2483 into individual URIs, * discarding any comments. The URIs are not validated. * * Returns: (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 */ gchar ** g_uri_list_extract_uris (const gchar *uri_list) { GSList *uris, *u; const gchar *p, *q; gchar **result; gint n_uris = 0; uris = NULL; p = uri_list; /* We don't actually try to validate the URI according to RFC * 2396, or even check for allowed characters - we just ignore * comments and trim whitespace off the ends. We also * allow LF delimination as well as the specified CRLF. * * We do allow comments like specified in RFC 2483. */ while (p) { if (*p != '#') { while (g_ascii_isspace (*p)) p++; q = p; while (*q && (*q != '\n') && (*q != '\r')) q++; if (q > p) { q--; while (q > p && g_ascii_isspace (*q)) q--; if (q > p) { uris = g_slist_prepend (uris, g_strndup (p, q - p + 1)); n_uris++; } } } p = strchr (p, '\n'); if (p) p++; } result = g_new (gchar *, n_uris + 1); result[n_uris--] = NULL; for (u = uris; u; u = u->next) result[n_uris--] = u->data; g_slist_free (uris); return result; } /** * g_filename_display_basename: * @filename: an absolute pathname in the GLib file name encoding * * Returns the display basename for the particular filename, guaranteed * to be valid UTF-8. The display name might not be identical to the filename, * for instance there might be problems converting it to UTF-8, and some files * can be translated in the display. * * If GLib cannot make sense of the encoding of @filename, as a last resort it * replaces unknown characters with U+FFFD, the Unicode replacement character. * You can search the result for the UTF-8 encoding of this character (which is * "\357\277\275" in octal notation) to find out if @filename was in an invalid * encoding. * * You must pass the whole absolute pathname to this functions so that * translation of well known locations can be done. * * This function is preferred over g_filename_display_name() if you know the * whole path, as it allows translation. * * Return value: a newly allocated string containing * a rendition of the basename of the filename in valid UTF-8 * * Since: 2.6 **/ gchar * g_filename_display_basename (const gchar *filename) { char *basename; char *display_name; g_return_val_if_fail (filename != NULL, NULL); basename = g_path_get_basename (filename); display_name = g_filename_display_name (basename); g_free (basename); return display_name; } /** * g_filename_display_name: * @filename: a pathname hopefully in the GLib file name encoding * * Converts a filename into a valid UTF-8 string. The conversion is * not necessarily reversible, so you should keep the original around * and use the return value of this function only for display purposes. * Unlike g_filename_to_utf8(), the result is guaranteed to be non-%NULL * even if the filename actually isn't in the GLib file name encoding. * * If GLib cannot make sense of the encoding of @filename, as a last resort it * replaces unknown characters with U+FFFD, the Unicode replacement character. * You can search the result for the UTF-8 encoding of this character (which is * "\357\277\275" in octal notation) to find out if @filename was in an invalid * encoding. * * If you know the whole pathname of the file you should use * g_filename_display_basename(), since that allows location-based * translation of filenames. * * Return value: a newly allocated string containing * a rendition of the filename in valid UTF-8 * * Since: 2.6 **/ gchar * g_filename_display_name (const gchar *filename) { gint i; const gchar **charsets; gchar *display_name = NULL; gboolean is_utf8; is_utf8 = g_get_filename_charsets (&charsets); if (is_utf8) { if (g_utf8_validate (filename, -1, NULL)) display_name = g_strdup (filename); } if (!display_name) { /* Try to convert from the filename charsets to UTF-8. * Skip the first charset if it is UTF-8. */ for (i = is_utf8 ? 1 : 0; charsets[i]; i++) { display_name = g_convert (filename, -1, "UTF-8", charsets[i], NULL, NULL, NULL); if (display_name) break; } } /* if all conversions failed, we replace invalid UTF-8 * by a question mark */ if (!display_name) display_name = _g_utf8_make_valid (filename); return display_name; } pkg-config-0.29.1/glib/glib/ghash.c0000664000175000017500000015235512651243552013662 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the GLib Team and others 1997-2000. See the AUTHORS * file for a list of people on the GLib Team. See the ChangeLog * files for a list of changes. These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/. */ /* * MT safe */ #include "config.h" #include /* memset */ #include "ghash.h" #include "gstrfuncs.h" #include "gatomic.h" #include "gtestutils.h" #include "gslice.h" /** * SECTION:hash_tables * @title: Hash Tables * @short_description: associations between keys and values so that * given a key the value can be found quickly * * A #GHashTable provides associations between keys and values which is * optimized so that given a key, the associated value can be found * very quickly. * * Note that neither keys nor values are copied when inserted into the * #GHashTable, so they must exist for the lifetime of the #GHashTable. * This means that the use of static strings is OK, but temporary * strings (i.e. those created in buffers and those returned by GTK+ * widgets) should be copied with g_strdup() before being inserted. * * If keys or values are dynamically allocated, you must be careful to * ensure that they are freed when they are removed from the * #GHashTable, and also when they are overwritten by new insertions * into the #GHashTable. It is also not advisable to mix static strings * and dynamically-allocated strings in a #GHashTable, because it then * becomes difficult to determine whether the string should be freed. * * To create a #GHashTable, use g_hash_table_new(). * * To insert a key and value into a #GHashTable, use * g_hash_table_insert(). * * To lookup a value corresponding to a given key, use * g_hash_table_lookup() and g_hash_table_lookup_extended(). * * g_hash_table_lookup_extended() can also be used to simply * check if a key is present in the hash table. * * To remove a key and value, use g_hash_table_remove(). * * To call a function for each key and value pair use * g_hash_table_foreach() or use a iterator to iterate over the * key/value pairs in the hash table, see #GHashTableIter. * * To destroy a #GHashTable use g_hash_table_destroy(). * * 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. The functions * g_hash_table_add() and g_hash_table_contains() are designed to be * used when using #GHashTable this way. */ /** * GHashTable: * * The #GHashTable struct is an opaque data structure to represent a * Hash Table. It should only be * accessed via the following functions. */ /** * GHashFunc: * @key: a key * * Specifies the type of the hash function which is passed to * g_hash_table_new() when a #GHashTable is created. * * The function is passed a key and should return a #guint hash value. * The functions g_direct_hash(), g_int_hash() and g_str_hash() provide * hash functions which can be used when the key is a #gpointer, #gint*, * and #gchar* respectively. * * g_direct_hash() is also the appropriate hash function for keys * of the form GINT_TO_POINTER (n) (or similar macros). * * A good hash functions should produce * hash values that are evenly distributed over a fairly large range. * The modulus is taken with the hash table size (a prime number) to * find the 'bucket' to place each key into. The function should also * be very fast, since it is called for each key lookup. * * Note that the hash functions provided by GLib have these qualities, * but are not particularly robust against manufactured keys that * cause hash collisions. Therefore, you should consider choosing * a more secure hash function when using a GHashTable with keys * that originate in untrusted data (such as HTTP requests). * Using g_str_hash() in that situation might make your application * vulerable to Algorithmic Complexity Attacks. * * The key to choosing a good hash is unpredictability. Even * cryptographic hashes are very easy to find collisions for when the * remainder is taken modulo a somewhat predictable prime number. There * must be an element of randomness that an attacker is unable to guess. * * Returns: the hash value corresponding to the key */ /** * GHFunc: * @key: a key * @value: the value corresponding to the key * @user_data: user data passed to g_hash_table_foreach() * * Specifies the type of the function passed to g_hash_table_foreach(). * It is called with each key/value pair, together with the @user_data * parameter which is passed to g_hash_table_foreach(). */ /** * GHRFunc: * @key: a key * @value: the value associated with the key * @user_data: user data passed to g_hash_table_remove() * * Specifies the type of the function passed to * g_hash_table_foreach_remove(). It is called with each key/value * pair, together with the @user_data parameter passed to * g_hash_table_foreach_remove(). It should return %TRUE if the * key/value pair should be removed from the #GHashTable. * * Returns: %TRUE if the key/value pair should be removed from the * #GHashTable */ /** * GEqualFunc: * @a: a value * @b: a value to compare with * * Specifies the type of a function used to test two values for * equality. The function should return %TRUE if both values are equal * and %FALSE otherwise. * * Returns: %TRUE if @a = @b; %FALSE otherwise */ /** * GHashTableIter: * * A GHashTableIter structure represents an iterator that can be used * to iterate over the elements of a #GHashTable. GHashTableIter * structures are typically allocated on the stack and then initialized * with g_hash_table_iter_init(). */ /** * g_hash_table_freeze: * @hash_table: a #GHashTable * * This function is deprecated and will be removed in the next major * release of GLib. It does nothing. */ /** * g_hash_table_thaw: * @hash_table: a #GHashTable * * This function is deprecated and will be removed in the next major * release of GLib. It does nothing. */ #define HASH_TABLE_MIN_SHIFT 3 /* 1 << 3 == 8 buckets */ #define UNUSED_HASH_VALUE 0 #define TOMBSTONE_HASH_VALUE 1 #define HASH_IS_UNUSED(h_) ((h_) == UNUSED_HASH_VALUE) #define HASH_IS_TOMBSTONE(h_) ((h_) == TOMBSTONE_HASH_VALUE) #define HASH_IS_REAL(h_) ((h_) >= 2) struct _GHashTable { gint size; gint mod; guint mask; gint nnodes; gint noccupied; /* nnodes + tombstones */ gpointer *keys; guint *hashes; gpointer *values; GHashFunc hash_func; GEqualFunc key_equal_func; gint ref_count; #ifndef G_DISABLE_ASSERT /* * Tracks the structure of the hash table, not its contents: is only * incremented when a node is added or removed (is not incremented * when the key or data of a node is modified). */ int version; #endif GDestroyNotify key_destroy_func; GDestroyNotify value_destroy_func; }; typedef struct { GHashTable *hash_table; gpointer dummy1; gpointer dummy2; int position; gboolean dummy3; int version; } RealIter; /* Each table size has an associated prime modulo (the first prime * lower than the table size) used to find the initial bucket. Probing * then works modulo 2^n. The prime modulo is necessary to get a * good distribution with poor hash functions. */ static const gint prime_mod [] = { 1, /* For 1 << 0 */ 2, 3, 7, 13, 31, 61, 127, 251, 509, 1021, 2039, 4093, 8191, 16381, 32749, 65521, /* For 1 << 16 */ 131071, 262139, 524287, 1048573, 2097143, 4194301, 8388593, 16777213, 33554393, 67108859, 134217689, 268435399, 536870909, 1073741789, 2147483647 /* For 1 << 31 */ }; static void g_hash_table_set_shift (GHashTable *hash_table, gint shift) { gint i; guint mask = 0; hash_table->size = 1 << shift; hash_table->mod = prime_mod [shift]; for (i = 0; i < shift; i++) { mask <<= 1; mask |= 1; } hash_table->mask = mask; } static gint g_hash_table_find_closest_shift (gint n) { gint i; for (i = 0; n; i++) n >>= 1; return i; } static void g_hash_table_set_shift_from_size (GHashTable *hash_table, gint size) { gint shift; shift = g_hash_table_find_closest_shift (size); shift = MAX (shift, HASH_TABLE_MIN_SHIFT); g_hash_table_set_shift (hash_table, shift); } /* * g_hash_table_lookup_node: * @hash_table: our #GHashTable * @key: the key to lookup against * @hash_return: key hash return location * * Performs a lookup in the hash table, preserving extra information * usually needed for insertion. * * This function first computes the hash value of the key using the * user's hash function. * * If an entry in the table matching @key is found then this function * returns the index of that entry in the table, and if not, the * index of an unused node (empty or tombstone) where the key can be * inserted. * * The computed hash value is returned in the variable pointed to * by @hash_return. This is to save insertions from having to compute * the hash record again for the new record. * * Returns: index of the described node */ static inline guint g_hash_table_lookup_node (GHashTable *hash_table, gconstpointer key, guint *hash_return) { guint node_index; guint node_hash; guint hash_value; guint first_tombstone = 0; gboolean have_tombstone = FALSE; guint step = 0; hash_value = hash_table->hash_func (key); if (G_UNLIKELY (!HASH_IS_REAL (hash_value))) hash_value = 2; *hash_return = hash_value; node_index = hash_value % hash_table->mod; node_hash = hash_table->hashes[node_index]; while (!HASH_IS_UNUSED (node_hash)) { /* We first check if our full hash values * are equal so we can avoid calling the full-blown * key equality function in most cases. */ if (node_hash == hash_value) { gpointer node_key = hash_table->keys[node_index]; if (hash_table->key_equal_func) { if (hash_table->key_equal_func (node_key, key)) return node_index; } else if (node_key == key) { return node_index; } } else if (HASH_IS_TOMBSTONE (node_hash) && !have_tombstone) { first_tombstone = node_index; have_tombstone = TRUE; } step++; node_index += step; node_index &= hash_table->mask; node_hash = hash_table->hashes[node_index]; } if (have_tombstone) return first_tombstone; return node_index; } /* * g_hash_table_remove_node: * @hash_table: our #GHashTable * @node: pointer to node to remove * @notify: %TRUE if the destroy notify handlers are to be called * * Removes a node from the hash table and updates the node count. * The node is replaced by a tombstone. No table resize is performed. * * If @notify is %TRUE then the destroy notify functions are called * for the key and value of the hash node. */ static void g_hash_table_remove_node (GHashTable *hash_table, gint i, gboolean notify) { gpointer key; gpointer value; key = hash_table->keys[i]; value = hash_table->values[i]; /* Erect tombstone */ hash_table->hashes[i] = TOMBSTONE_HASH_VALUE; /* Be GC friendly */ hash_table->keys[i] = NULL; hash_table->values[i] = NULL; hash_table->nnodes--; if (notify && hash_table->key_destroy_func) hash_table->key_destroy_func (key); if (notify && hash_table->value_destroy_func) hash_table->value_destroy_func (value); } /* * g_hash_table_remove_all_nodes: * @hash_table: our #GHashTable * @notify: %TRUE if the destroy notify handlers are to be called * * Removes all nodes from the table. Since this may be a precursor to * freeing the table entirely, no resize is performed. * * If @notify is %TRUE then the destroy notify functions are called * for the key and value of the hash node. */ static void g_hash_table_remove_all_nodes (GHashTable *hash_table, gboolean notify) { int i; gpointer key; gpointer value; hash_table->nnodes = 0; hash_table->noccupied = 0; if (!notify || (hash_table->key_destroy_func == NULL && hash_table->value_destroy_func == NULL)) { memset (hash_table->hashes, 0, hash_table->size * sizeof (guint)); memset (hash_table->keys, 0, hash_table->size * sizeof (gpointer)); memset (hash_table->values, 0, hash_table->size * sizeof (gpointer)); return; } for (i = 0; i < hash_table->size; i++) { if (HASH_IS_REAL (hash_table->hashes[i])) { key = hash_table->keys[i]; value = hash_table->values[i]; hash_table->hashes[i] = UNUSED_HASH_VALUE; hash_table->keys[i] = NULL; hash_table->values[i] = NULL; if (hash_table->key_destroy_func != NULL) hash_table->key_destroy_func (key); if (hash_table->value_destroy_func != NULL) hash_table->value_destroy_func (value); } else if (HASH_IS_TOMBSTONE (hash_table->hashes[i])) { hash_table->hashes[i] = UNUSED_HASH_VALUE; } } } /* * g_hash_table_resize: * @hash_table: our #GHashTable * * Resizes the hash table to the optimal size based on the number of * nodes currently held. If you call this function then a resize will * occur, even if one does not need to occur. * Use g_hash_table_maybe_resize() instead. * * This function may "resize" the hash table to its current size, with * the side effect of cleaning up tombstones and otherwise optimizing * the probe sequences. */ static void g_hash_table_resize (GHashTable *hash_table) { gpointer *new_keys; gpointer *new_values; guint *new_hashes; gint old_size; gint i; old_size = hash_table->size; g_hash_table_set_shift_from_size (hash_table, hash_table->nnodes * 2); new_keys = g_new0 (gpointer, hash_table->size); if (hash_table->keys == hash_table->values) new_values = new_keys; else new_values = g_new0 (gpointer, hash_table->size); new_hashes = g_new0 (guint, hash_table->size); for (i = 0; i < old_size; i++) { guint node_hash = hash_table->hashes[i]; guint hash_val; guint step = 0; if (!HASH_IS_REAL (node_hash)) continue; hash_val = node_hash % hash_table->mod; while (!HASH_IS_UNUSED (new_hashes[hash_val])) { step++; hash_val += step; hash_val &= hash_table->mask; } new_hashes[hash_val] = hash_table->hashes[i]; new_keys[hash_val] = hash_table->keys[i]; new_values[hash_val] = hash_table->values[i]; } if (hash_table->keys != hash_table->values) g_free (hash_table->values); g_free (hash_table->keys); g_free (hash_table->hashes); hash_table->keys = new_keys; hash_table->values = new_values; hash_table->hashes = new_hashes; hash_table->noccupied = hash_table->nnodes; } /* * g_hash_table_maybe_resize: * @hash_table: our #GHashTable * * Resizes the hash table, if needed. * * Essentially, calls g_hash_table_resize() if the table has strayed * too far from its ideal size for its number of nodes. */ static inline void g_hash_table_maybe_resize (GHashTable *hash_table) { gint noccupied = hash_table->noccupied; gint size = hash_table->size; if ((size > hash_table->nnodes * 4 && size > 1 << HASH_TABLE_MIN_SHIFT) || (size <= noccupied + (noccupied / 16))) g_hash_table_resize (hash_table); } /** * g_hash_table_new: * @hash_func: a function to create a hash value from a key * @key_equal_func: a function to check two keys for equality * * Creates a new #GHashTable with a reference count of 1. * * Hash values returned by @hash_func are used to determine where keys * are stored within the #GHashTable data structure. The g_direct_hash(), * g_int_hash(), g_int64_hash(), g_double_hash() and g_str_hash() * functions are provided for some common types of keys. * If @hash_func is %NULL, g_direct_hash() is used. * * @key_equal_func is used when looking up keys in the #GHashTable. * The g_direct_equal(), g_int_equal(), g_int64_equal(), g_double_equal() * and g_str_equal() functions are provided for the most common types * of keys. If @key_equal_func is %NULL, keys are compared directly in * a similar fashion to g_direct_equal(), but without the overhead of * a function call. * * Return value: a new #GHashTable */ GHashTable * g_hash_table_new (GHashFunc hash_func, GEqualFunc key_equal_func) { return g_hash_table_new_full (hash_func, key_equal_func, NULL, NULL); } /** * g_hash_table_new_full: * @hash_func: a function to create a hash value from a key * @key_equal_func: a function to check two keys for equality * @key_destroy_func: (allow-none): a function to free the memory allocated for the key * used when removing the entry from the #GHashTable, or %NULL * if you don't want to supply such a function. * @value_destroy_func: (allow-none): a function to free the memory allocated for the * value used when removing the entry from the #GHashTable, or %NULL * if you don't want to supply such a function. * * Creates a new #GHashTable like g_hash_table_new() with a reference * count of 1 and allows to specify functions to free the memory * allocated for the key and value that get called when removing the * entry from the #GHashTable. * * Return value: a new #GHashTable */ GHashTable * g_hash_table_new_full (GHashFunc hash_func, GEqualFunc key_equal_func, GDestroyNotify key_destroy_func, GDestroyNotify value_destroy_func) { GHashTable *hash_table; hash_table = g_slice_new (GHashTable); g_hash_table_set_shift (hash_table, HASH_TABLE_MIN_SHIFT); hash_table->nnodes = 0; hash_table->noccupied = 0; hash_table->hash_func = hash_func ? hash_func : g_direct_hash; hash_table->key_equal_func = key_equal_func; hash_table->ref_count = 1; #ifndef G_DISABLE_ASSERT hash_table->version = 0; #endif hash_table->key_destroy_func = key_destroy_func; hash_table->value_destroy_func = value_destroy_func; hash_table->keys = g_new0 (gpointer, hash_table->size); hash_table->values = hash_table->keys; hash_table->hashes = g_new0 (guint, hash_table->size); return hash_table; } /** * g_hash_table_iter_init: * @iter: an uninitialized #GHashTableIter * @hash_table: a #GHashTable * * Initializes a key/value pair iterator and associates it with * @hash_table. Modifying the hash table after calling this function * invalidates the returned iterator. * |[ * GHashTableIter iter; * gpointer key, value; * * g_hash_table_iter_init (&iter, hash_table); * while (g_hash_table_iter_next (&iter, &key, &value)) * { * /* do something with key and value */ * } * ]| * * Since: 2.16 */ void g_hash_table_iter_init (GHashTableIter *iter, GHashTable *hash_table) { RealIter *ri = (RealIter *) iter; g_return_if_fail (iter != NULL); g_return_if_fail (hash_table != NULL); ri->hash_table = hash_table; ri->position = -1; #ifndef G_DISABLE_ASSERT ri->version = hash_table->version; #endif } /** * g_hash_table_iter_next: * @iter: an initialized #GHashTableIter * @key: (allow-none): a location to store the key, or %NULL * @value: (allow-none): a location to store the value, or %NULL * * Advances @iter and retrieves the key and/or value that are now * pointed to as a result of this advancement. If %FALSE is returned, * @key and @value are not set, and the iterator becomes invalid. * * Return value: %FALSE if the end of the #GHashTable has been reached. * * Since: 2.16 */ gboolean g_hash_table_iter_next (GHashTableIter *iter, gpointer *key, gpointer *value) { RealIter *ri = (RealIter *) iter; gint position; g_return_val_if_fail (iter != NULL, FALSE); #ifndef G_DISABLE_ASSERT g_return_val_if_fail (ri->version == ri->hash_table->version, FALSE); #endif g_return_val_if_fail (ri->position < ri->hash_table->size, FALSE); position = ri->position; do { position++; if (position >= ri->hash_table->size) { ri->position = position; return FALSE; } } while (!HASH_IS_REAL (ri->hash_table->hashes[position])); if (key != NULL) *key = ri->hash_table->keys[position]; if (value != NULL) *value = ri->hash_table->values[position]; ri->position = position; return TRUE; } /** * g_hash_table_iter_get_hash_table: * @iter: an initialized #GHashTableIter * * Returns the #GHashTable associated with @iter. * * Return value: the #GHashTable associated with @iter. * * Since: 2.16 */ GHashTable * g_hash_table_iter_get_hash_table (GHashTableIter *iter) { g_return_val_if_fail (iter != NULL, NULL); return ((RealIter *) iter)->hash_table; } static void iter_remove_or_steal (RealIter *ri, gboolean notify) { g_return_if_fail (ri != NULL); #ifndef G_DISABLE_ASSERT g_return_if_fail (ri->version == ri->hash_table->version); #endif g_return_if_fail (ri->position >= 0); g_return_if_fail (ri->position < ri->hash_table->size); g_hash_table_remove_node (ri->hash_table, ri->position, notify); #ifndef G_DISABLE_ASSERT ri->version++; ri->hash_table->version++; #endif } /** * g_hash_table_iter_remove: * @iter: an initialized #GHashTableIter * * Removes the key/value pair currently pointed to by the iterator * from its associated #GHashTable. Can only be called after * g_hash_table_iter_next() returned %TRUE, and cannot be called * more than once for the same key/value pair. * * If the #GHashTable was created using g_hash_table_new_full(), * the key and value are freed using the supplied destroy functions, * otherwise you have to make sure that any dynamically allocated * values are freed yourself. * * Since: 2.16 */ void g_hash_table_iter_remove (GHashTableIter *iter) { iter_remove_or_steal ((RealIter *) iter, TRUE); } /* * g_hash_table_insert_node: * @hash_table: our #GHashTable * @node_index: pointer to node to insert/replace * @key_hash: key hash * @key: (allow-none): key to replace with, or %NULL * @value: value to replace with * @keep_new_key: whether to replace the key in the node with @key * @reusing_key: whether @key was taken out of the existing node * * Inserts a value at @node_index in the hash table and updates it. * * If @key has been taken out of the existing node (ie it is not * passed in via a g_hash_table_insert/replace) call, then @reusing_key * should be %TRUE. */ static void g_hash_table_insert_node (GHashTable *hash_table, guint node_index, guint key_hash, gpointer new_key, gpointer new_value, gboolean keep_new_key, gboolean reusing_key) { gboolean already_exists; guint old_hash; gpointer key_to_free = NULL; gpointer value_to_free = NULL; old_hash = hash_table->hashes[node_index]; 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) { key_to_free = hash_table->keys[node_index]; hash_table->keys[node_index] = new_key; } else key_to_free = new_key; } else { 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)) { /* We replaced an empty node, and not a tombstone */ hash_table->noccupied++; g_hash_table_maybe_resize (hash_table); } #ifndef G_DISABLE_ASSERT hash_table->version++; #endif } if (already_exists) { if (hash_table->key_destroy_func && !reusing_key) (* hash_table->key_destroy_func) (key_to_free); if (hash_table->value_destroy_func) (* hash_table->value_destroy_func) (value_to_free); } } /** * g_hash_table_iter_replace: * @iter: an initialized #GHashTableIter * @value: the value to replace with * * Replaces the value currently pointed to by the iterator * from its associated #GHashTable. Can only be called after * g_hash_table_iter_next() returned %TRUE. * * If you supplied a @value_destroy_func when creating the * #GHashTable, the old value is freed using that function. * * Since: 2.30 */ void g_hash_table_iter_replace (GHashTableIter *iter, gpointer value) { RealIter *ri; guint node_hash; gpointer key; ri = (RealIter *) iter; g_return_if_fail (ri != NULL); #ifndef G_DISABLE_ASSERT g_return_if_fail (ri->version == ri->hash_table->version); #endif g_return_if_fail (ri->position >= 0); g_return_if_fail (ri->position < ri->hash_table->size); node_hash = ri->hash_table->hashes[ri->position]; key = ri->hash_table->keys[ri->position]; g_hash_table_insert_node (ri->hash_table, ri->position, node_hash, key, value, TRUE, TRUE); #ifndef G_DISABLE_ASSERT ri->version++; ri->hash_table->version++; #endif } /** * g_hash_table_iter_steal: * @iter: an initialized #GHashTableIter * * Removes the key/value pair currently pointed to by the * iterator from its associated #GHashTable, without calling * the key and value destroy functions. Can only be called * after g_hash_table_iter_next() returned %TRUE, and cannot * be called more than once for the same key/value pair. * * Since: 2.16 */ void g_hash_table_iter_steal (GHashTableIter *iter) { iter_remove_or_steal ((RealIter *) iter, FALSE); } /** * g_hash_table_ref: * @hash_table: a valid #GHashTable * * Atomically increments the reference count of @hash_table by one. * This function is MT-safe and may be called from any thread. * * Return value: the passed in #GHashTable * * Since: 2.10 */ GHashTable * g_hash_table_ref (GHashTable *hash_table) { g_return_val_if_fail (hash_table != NULL, NULL); g_atomic_int_inc (&hash_table->ref_count); return hash_table; } /** * g_hash_table_unref: * @hash_table: a valid #GHashTable * * Atomically decrements the reference count of @hash_table by one. * If the reference count drops to 0, all keys and values will be * destroyed, and all memory allocated by the hash table is released. * This function is MT-safe and may be called from any thread. * * Since: 2.10 */ void g_hash_table_unref (GHashTable *hash_table) { g_return_if_fail (hash_table != NULL); if (g_atomic_int_dec_and_test (&hash_table->ref_count)) { g_hash_table_remove_all_nodes (hash_table, TRUE); if (hash_table->keys != hash_table->values) g_free (hash_table->values); g_free (hash_table->keys); g_free (hash_table->hashes); g_slice_free (GHashTable, hash_table); } } /** * g_hash_table_destroy: * @hash_table: a #GHashTable * * Destroys all keys and values in the #GHashTable and decrements its * reference count by 1. If keys and/or values are dynamically allocated, * you should either free them first or create the #GHashTable with destroy * notifiers using g_hash_table_new_full(). In the latter case the destroy * functions you supplied will be called on all keys and values during the * destruction phase. */ void g_hash_table_destroy (GHashTable *hash_table) { g_return_if_fail (hash_table != NULL); g_hash_table_remove_all (hash_table); g_hash_table_unref (hash_table); } /** * g_hash_table_lookup: * @hash_table: a #GHashTable * @key: the key to look up * * Looks up a key in a #GHashTable. Note that this function cannot * distinguish between a key that is not present and one which is present * and has the value %NULL. If you need this distinction, use * g_hash_table_lookup_extended(). * * Return value: (allow-none): the associated value, or %NULL if the key is not found */ gpointer g_hash_table_lookup (GHashTable *hash_table, gconstpointer key) { guint node_index; guint node_hash; g_return_val_if_fail (hash_table != NULL, NULL); node_index = g_hash_table_lookup_node (hash_table, key, &node_hash); return HASH_IS_REAL (hash_table->hashes[node_index]) ? hash_table->values[node_index] : NULL; } /** * g_hash_table_lookup_extended: * @hash_table: a #GHashTable * @lookup_key: the key to look up * @orig_key: (allow-none): return location for the original key, or %NULL * @value: (allow-none): return location for the value associated with the key, or %NULL * * Looks up a key in the #GHashTable, returning the original key and the * associated value and a #gboolean which is %TRUE if the key was found. This * is useful if you need to free the memory allocated for the original key, * for example before calling g_hash_table_remove(). * * You can actually pass %NULL for @lookup_key to test * whether the %NULL key exists, provided the hash and equal functions * of @hash_table are %NULL-safe. * * Return value: %TRUE if the key was found in the #GHashTable */ gboolean g_hash_table_lookup_extended (GHashTable *hash_table, gconstpointer lookup_key, gpointer *orig_key, gpointer *value) { guint node_index; guint node_hash; g_return_val_if_fail (hash_table != NULL, FALSE); node_index = g_hash_table_lookup_node (hash_table, lookup_key, &node_hash); if (!HASH_IS_REAL (hash_table->hashes[node_index])) return FALSE; if (orig_key) *orig_key = hash_table->keys[node_index]; if (value) *value = hash_table->values[node_index]; return TRUE; } /* * g_hash_table_insert_internal: * @hash_table: our #GHashTable * @key: the key to insert * @value: the value to insert * @keep_new_key: if %TRUE and this key already exists in the table * then call the destroy notify function on the old key. If %FALSE * then call the destroy notify function on the new key. * * Implements the common logic for the g_hash_table_insert() and * g_hash_table_replace() functions. * * Do a lookup of @key. If it is found, replace it with the new * @value (and perhaps the new @key). If it is not found, create * a new node. */ static void g_hash_table_insert_internal (GHashTable *hash_table, gpointer key, gpointer value, gboolean keep_new_key) { guint key_hash; guint node_index; g_return_if_fail (hash_table != NULL); node_index = g_hash_table_lookup_node (hash_table, key, &key_hash); g_hash_table_insert_node (hash_table, node_index, key_hash, key, value, keep_new_key, FALSE); } /** * g_hash_table_insert: * @hash_table: a #GHashTable * @key: a key to insert * @value: the value to associate with the key * * Inserts a new key and value into a #GHashTable. * * If the key already exists in the #GHashTable its current * value is replaced with the new value. If you supplied a * @value_destroy_func when creating the #GHashTable, the old * value is freed using that function. If you supplied a * @key_destroy_func when creating the #GHashTable, the passed * key is freed using that function. */ void g_hash_table_insert (GHashTable *hash_table, gpointer key, gpointer value) { g_hash_table_insert_internal (hash_table, key, value, FALSE); } /** * g_hash_table_replace: * @hash_table: a #GHashTable * @key: a key to insert * @value: the value to associate with the key * * Inserts a new key and value into a #GHashTable similar to * g_hash_table_insert(). The difference is that if the key * already exists in the #GHashTable, it gets replaced by the * new key. If you supplied a @value_destroy_func when creating * the #GHashTable, the old value is freed using that function. * If you supplied a @key_destroy_func when creating the * #GHashTable, the old key is freed using that function. */ void g_hash_table_replace (GHashTable *hash_table, gpointer key, gpointer value) { g_hash_table_insert_internal (hash_table, key, value, TRUE); } /** * g_hash_table_add: * @hash_table: a #GHashTable * @key: a key to insert * * This is a convenience function for using a #GHashTable as a set. It * is equivalent to calling g_hash_table_replace() with @key as both the * key and the value. * * When a hash table only ever contains keys that have themselves as the * corresponding value it is able to be stored more efficiently. See * the discussion in the section description. * * Since: 2.32 **/ void g_hash_table_add (GHashTable *hash_table, gpointer key) { g_hash_table_insert_internal (hash_table, key, key, TRUE); } /** * g_hash_table_contains: * @hash_table: a #GHashTable * @key: a key to check * * Checks if @key is in @hash_table. * * Since: 2.32 **/ gboolean g_hash_table_contains (GHashTable *hash_table, gconstpointer key) { guint node_index; guint node_hash; g_return_val_if_fail (hash_table != NULL, FALSE); node_index = g_hash_table_lookup_node (hash_table, key, &node_hash); return HASH_IS_REAL (hash_table->hashes[node_index]); } /* * g_hash_table_remove_internal: * @hash_table: our #GHashTable * @key: the key to remove * @notify: %TRUE if the destroy notify handlers are to be called * Return value: %TRUE if a node was found and removed, else %FALSE * * Implements the common logic for the g_hash_table_remove() and * g_hash_table_steal() functions. * * Do a lookup of @key and remove it if it is found, calling the * destroy notify handlers only if @notify is %TRUE. */ static gboolean g_hash_table_remove_internal (GHashTable *hash_table, gconstpointer key, gboolean notify) { guint node_index; guint node_hash; g_return_val_if_fail (hash_table != NULL, FALSE); node_index = g_hash_table_lookup_node (hash_table, key, &node_hash); if (!HASH_IS_REAL (hash_table->hashes[node_index])) return FALSE; g_hash_table_remove_node (hash_table, node_index, notify); g_hash_table_maybe_resize (hash_table); #ifndef G_DISABLE_ASSERT hash_table->version++; #endif return TRUE; } /** * g_hash_table_remove: * @hash_table: a #GHashTable * @key: the key to remove * * Removes a key and its associated value from a #GHashTable. * * If the #GHashTable was created using g_hash_table_new_full(), the * key and value are freed using the supplied destroy functions, otherwise * you have to make sure that any dynamically allocated values are freed * yourself. * * Returns: %TRUE if the key was found and removed from the #GHashTable */ gboolean g_hash_table_remove (GHashTable *hash_table, gconstpointer key) { return g_hash_table_remove_internal (hash_table, key, TRUE); } /** * g_hash_table_steal: * @hash_table: a #GHashTable * @key: the key to remove * * Removes a key and its associated value from a #GHashTable without * calling the key and value destroy functions. * * Returns: %TRUE if the key was found and removed from the #GHashTable */ gboolean g_hash_table_steal (GHashTable *hash_table, gconstpointer key) { return g_hash_table_remove_internal (hash_table, key, FALSE); } /** * g_hash_table_remove_all: * @hash_table: a #GHashTable * * Removes all keys and their associated values from a #GHashTable. * * If the #GHashTable was created using g_hash_table_new_full(), * the keys and values are freed using the supplied destroy functions, * otherwise you have to make sure that any dynamically allocated * values are freed yourself. * * Since: 2.12 */ void g_hash_table_remove_all (GHashTable *hash_table) { g_return_if_fail (hash_table != NULL); #ifndef G_DISABLE_ASSERT if (hash_table->nnodes != 0) hash_table->version++; #endif g_hash_table_remove_all_nodes (hash_table, TRUE); g_hash_table_maybe_resize (hash_table); } /** * g_hash_table_steal_all: * @hash_table: a #GHashTable * * Removes all keys and their associated values from a #GHashTable * without calling the key and value destroy functions. * * Since: 2.12 */ void g_hash_table_steal_all (GHashTable *hash_table) { g_return_if_fail (hash_table != NULL); #ifndef G_DISABLE_ASSERT if (hash_table->nnodes != 0) hash_table->version++; #endif g_hash_table_remove_all_nodes (hash_table, FALSE); g_hash_table_maybe_resize (hash_table); } /* * g_hash_table_foreach_remove_or_steal: * @hash_table: a #GHashTable * @func: the user's callback function * @user_data: data for @func * @notify: %TRUE if the destroy notify handlers are to be called * * Implements the common logic for g_hash_table_foreach_remove() * and g_hash_table_foreach_steal(). * * Iterates over every node in the table, calling @func with the key * and value of the node (and @user_data). If @func returns %TRUE the * node is removed from the table. * * If @notify is true then the destroy notify handlers will be called * for each removed node. */ static guint g_hash_table_foreach_remove_or_steal (GHashTable *hash_table, GHRFunc func, gpointer user_data, gboolean notify) { guint deleted = 0; gint i; #ifndef G_DISABLE_ASSERT gint version = hash_table->version; #endif for (i = 0; i < hash_table->size; i++) { guint node_hash = hash_table->hashes[i]; gpointer node_key = hash_table->keys[i]; gpointer node_value = hash_table->values[i]; if (HASH_IS_REAL (node_hash) && (* func) (node_key, node_value, user_data)) { g_hash_table_remove_node (hash_table, i, notify); deleted++; } #ifndef G_DISABLE_ASSERT g_return_val_if_fail (version == hash_table->version, 0); #endif } g_hash_table_maybe_resize (hash_table); #ifndef G_DISABLE_ASSERT if (deleted > 0) hash_table->version++; #endif return deleted; } /** * g_hash_table_foreach_remove: * @hash_table: a #GHashTable * @func: the function to call for each key/value pair * @user_data: user data to pass to the function * * Calls the given function for each key/value pair in the * #GHashTable. If the function returns %TRUE, then the key/value * pair is removed from the #GHashTable. If you supplied key or * value destroy functions when creating the #GHashTable, they are * used to free the memory allocated for the removed keys and values. * * See #GHashTableIter for an alternative way to loop over the * key/value pairs in the hash table. * * Return value: the number of key/value pairs removed */ guint g_hash_table_foreach_remove (GHashTable *hash_table, GHRFunc func, gpointer user_data) { g_return_val_if_fail (hash_table != NULL, 0); g_return_val_if_fail (func != NULL, 0); return g_hash_table_foreach_remove_or_steal (hash_table, func, user_data, TRUE); } /** * g_hash_table_foreach_steal: * @hash_table: a #GHashTable * @func: the function to call for each key/value pair * @user_data: user data to pass to the function * * Calls the given function for each key/value pair in the * #GHashTable. If the function returns %TRUE, then the key/value * pair is removed from the #GHashTable, but no key or value * destroy functions are called. * * See #GHashTableIter for an alternative way to loop over the * key/value pairs in the hash table. * * Return value: the number of key/value pairs removed. */ guint g_hash_table_foreach_steal (GHashTable *hash_table, GHRFunc func, gpointer user_data) { g_return_val_if_fail (hash_table != NULL, 0); g_return_val_if_fail (func != NULL, 0); return g_hash_table_foreach_remove_or_steal (hash_table, func, user_data, FALSE); } /** * g_hash_table_foreach: * @hash_table: a #GHashTable * @func: the function to call for each key/value pair * @user_data: user data to pass to the function * * Calls the given function for each of the key/value pairs in the * #GHashTable. The function is passed the key and value of each * pair, and the given @user_data parameter. The hash table may not * be modified while iterating over it (you can't add/remove * items). To remove all items matching a predicate, use * g_hash_table_foreach_remove(). * * See g_hash_table_find() for performance caveats for linear * order searches in contrast to g_hash_table_lookup(). */ void g_hash_table_foreach (GHashTable *hash_table, GHFunc func, gpointer user_data) { gint i; #ifndef G_DISABLE_ASSERT gint version; #endif g_return_if_fail (hash_table != NULL); g_return_if_fail (func != NULL); #ifndef G_DISABLE_ASSERT version = hash_table->version; #endif for (i = 0; i < hash_table->size; i++) { guint node_hash = hash_table->hashes[i]; gpointer node_key = hash_table->keys[i]; gpointer node_value = hash_table->values[i]; if (HASH_IS_REAL (node_hash)) (* func) (node_key, node_value, user_data); #ifndef G_DISABLE_ASSERT g_return_if_fail (version == hash_table->version); #endif } } /** * g_hash_table_find: * @hash_table: a #GHashTable * @predicate: function to test the key/value pairs for a certain property * @user_data: user data to pass to the function * * Calls the given function for key/value pairs in the #GHashTable * until @predicate returns %TRUE. The function is passed the key * and value of each pair, and the given @user_data parameter. The * hash table may not be modified while iterating over it (you can't * add/remove items). * * Note, that hash tables are really only optimized for forward * lookups, i.e. g_hash_table_lookup(). So code that frequently issues * g_hash_table_find() or g_hash_table_foreach() (e.g. in the order of * once per every entry in a hash table) should probably be reworked * to use additional or different data structures for reverse lookups * (keep in mind that an O(n) find/foreach operation issued for all n * values in a hash table ends up needing O(n*n) operations). * * Return value: (allow-none): The value of the first key/value pair is returned, * for which @predicate evaluates to %TRUE. If no pair with the * requested property is found, %NULL is returned. * * Since: 2.4 */ gpointer g_hash_table_find (GHashTable *hash_table, GHRFunc predicate, gpointer user_data) { gint i; #ifndef G_DISABLE_ASSERT gint version; #endif gboolean match; g_return_val_if_fail (hash_table != NULL, NULL); g_return_val_if_fail (predicate != NULL, NULL); #ifndef G_DISABLE_ASSERT version = hash_table->version; #endif match = FALSE; for (i = 0; i < hash_table->size; i++) { guint node_hash = hash_table->hashes[i]; gpointer node_key = hash_table->keys[i]; gpointer node_value = hash_table->values[i]; if (HASH_IS_REAL (node_hash)) match = predicate (node_key, node_value, user_data); #ifndef G_DISABLE_ASSERT g_return_val_if_fail (version == hash_table->version, NULL); #endif if (match) return node_value; } return NULL; } /** * g_hash_table_size: * @hash_table: a #GHashTable * * Returns the number of elements contained in the #GHashTable. * * Return value: the number of key/value pairs in the #GHashTable. */ guint g_hash_table_size (GHashTable *hash_table) { g_return_val_if_fail (hash_table != NULL, 0); return hash_table->nnodes; } /** * g_hash_table_get_keys: * @hash_table: a #GHashTable * * Retrieves every key inside @hash_table. The returned data is valid * until 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 * should not be modified or freed. Use g_list_free() when done * using the list. * * Since: 2.14 */ GList * g_hash_table_get_keys (GHashTable *hash_table) { gint i; GList *retval; g_return_val_if_fail (hash_table != NULL, NULL); retval = NULL; for (i = 0; i < hash_table->size; i++) { if (HASH_IS_REAL (hash_table->hashes[i])) retval = g_list_prepend (retval, hash_table->keys[i]); } return retval; } /** * g_hash_table_get_values: * @hash_table: a #GHashTable * * Retrieves every value inside @hash_table. The returned data * is valid until @hash_table is modified. * * Return value: a #GList containing all the values inside the hash * table. The content of the list is owned by the hash table and * should not be modified or freed. Use g_list_free() when done * using the list. * * Since: 2.14 */ GList * g_hash_table_get_values (GHashTable *hash_table) { gint i; GList *retval; g_return_val_if_fail (hash_table != NULL, NULL); retval = NULL; for (i = 0; i < hash_table->size; i++) { if (HASH_IS_REAL (hash_table->hashes[i])) retval = g_list_prepend (retval, hash_table->values[i]); } return retval; } /* Hash functions. */ /** * g_str_equal: * @v1: a key * @v2: a key to compare with @v1 * * Compares two strings for byte-by-byte equality and returns %TRUE * if they are equal. It can be passed to g_hash_table_new() as the * @key_equal_func parameter, when using non-%NULL strings as keys in a * #GHashTable. * * Note that this function is primarily meant as a hash table comparison * function. For a general-purpose, %NULL-safe string comparison function, * see g_strcmp0(). * * Returns: %TRUE if the two keys match */ gboolean g_str_equal (gconstpointer v1, gconstpointer v2) { const gchar *string1 = v1; const gchar *string2 = v2; return strcmp (string1, string2) == 0; } /** * g_str_hash: * @v: a string key * * Converts a string to a hash value. * * This function implements the widely used "djb" hash apparently posted * by Daniel Bernstein to comp.lang.c some time ago. The 32 bit * unsigned hash value starts at 5381 and for each byte 'c' in the * string, is updated: hash = hash * 33 + c. This * function uses the signed value of each byte. * * It can be passed to g_hash_table_new() as the @hash_func parameter, * when using non-%NULL strings as keys in a #GHashTable. * * Returns: a hash value corresponding to the key */ guint g_str_hash (gconstpointer v) { const signed char *p; guint32 h = 5381; for (p = v; *p != '\0'; p++) h = (h << 5) + h + *p; return h; } /** * g_direct_hash: * @v: (allow-none): a #gpointer key * * Converts a gpointer to a hash value. * It can be passed to g_hash_table_new() as the @hash_func parameter, * when using opaque pointers compared by pointer value as keys in a * #GHashTable. * * This hash function is also appropriate for keys that are integers stored * in pointers, such as GINT_TO_POINTER (n). * * Returns: a hash value corresponding to the key. */ guint g_direct_hash (gconstpointer v) { return GPOINTER_TO_UINT (v); } /** * g_direct_equal: * @v1: (allow-none): a key * @v2: (allow-none): a key to compare with @v1 * * Compares two #gpointer arguments and returns %TRUE if they are equal. * It can be passed to g_hash_table_new() as the @key_equal_func * parameter, when using opaque pointers compared by pointer value as keys * in a #GHashTable. * * This equality function is also appropriate for keys that are integers stored * in pointers, such as GINT_TO_POINTER (n). * * Returns: %TRUE if the two keys match. */ gboolean g_direct_equal (gconstpointer v1, gconstpointer v2) { return v1 == v2; } /** * g_int_equal: * @v1: a pointer to a #gint key * @v2: a pointer to a #gint key to compare with @v1 * * Compares the two #gint values being pointed to and returns * %TRUE if they are equal. * It can be passed to g_hash_table_new() as the @key_equal_func * parameter, when using non-%NULL pointers to integers as keys in a * #GHashTable. * * Note that this function acts on pointers to #gint, not on #gint directly: * if your hash table's keys are of the form * GINT_TO_POINTER (n), use g_direct_equal() instead. * * Returns: %TRUE if the two keys match. */ gboolean g_int_equal (gconstpointer v1, gconstpointer v2) { return *((const gint*) v1) == *((const gint*) v2); } /** * g_int_hash: * @v: a pointer to a #gint key * * Converts a pointer to a #gint to a hash value. * It can be passed to g_hash_table_new() as the @hash_func parameter, * when using non-%NULL pointers to integer values as keys in a #GHashTable. * * Note that this function acts on pointers to #gint, not on #gint directly: * if your hash table's keys are of the form * GINT_TO_POINTER (n), use g_direct_hash() instead. * * Returns: a hash value corresponding to the key. */ guint g_int_hash (gconstpointer v) { return *(const gint*) v; } /** * g_int64_equal: * @v1: a pointer to a #gint64 key * @v2: a pointer to a #gint64 key to compare with @v1 * * Compares the two #gint64 values being pointed to and returns * %TRUE if they are equal. * It can be passed to g_hash_table_new() as the @key_equal_func * parameter, when using non-%NULL pointers to 64-bit integers as keys in a * #GHashTable. * * Returns: %TRUE if the two keys match. * * Since: 2.22 */ gboolean g_int64_equal (gconstpointer v1, gconstpointer v2) { return *((const gint64*) v1) == *((const gint64*) v2); } /** * g_int64_hash: * @v: a pointer to a #gint64 key * * Converts a pointer to a #gint64 to a hash value. * * It can be passed to g_hash_table_new() as the @hash_func parameter, * when using non-%NULL pointers to 64-bit integer values as keys in a * #GHashTable. * * Returns: a hash value corresponding to the key. * * Since: 2.22 */ guint g_int64_hash (gconstpointer v) { return (guint) *(const gint64*) v; } /** * g_double_equal: * @v1: a pointer to a #gdouble key * @v2: a pointer to a #gdouble key to compare with @v1 * * Compares the two #gdouble values being pointed to and returns * %TRUE if they are equal. * It can be passed to g_hash_table_new() as the @key_equal_func * parameter, when using non-%NULL pointers to doubles as keys in a * #GHashTable. * * Returns: %TRUE if the two keys match. * * Since: 2.22 */ gboolean g_double_equal (gconstpointer v1, gconstpointer v2) { return *((const gdouble*) v1) == *((const gdouble*) v2); } /** * g_double_hash: * @v: a pointer to a #gdouble key * * Converts a pointer to a #gdouble to a hash value. * It can be passed to g_hash_table_new() as the @hash_func parameter, * It can be passed to g_hash_table_new() as the @hash_func parameter, * when using non-%NULL pointers to doubles as keys in a #GHashTable. * * Returns: a hash value corresponding to the key. * * Since: 2.22 */ guint g_double_hash (gconstpointer v) { return (guint) *(const gdouble*) v; } pkg-config-0.29.1/glib/glib/gatomic.h0000664000175000017500000003040012651243552014202 00000000000000/* * Copyright © 2011 Ryan Lortie * * This library is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2 of the * licence, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, * USA. * * Author: Ryan Lortie */ #ifndef __G_ATOMIC_H__ #define __G_ATOMIC_H__ #if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) #error "Only can be included directly." #endif #include G_BEGIN_DECLS 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 guint g_atomic_int_and (volatile guint *atomic, guint val); 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); 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 gsize g_atomic_pointer_and (volatile void *atomic, gsize val); 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); GLIB_DEPRECATED_IN_2_30_FOR(g_atomic_add) gint g_atomic_int_exchange_and_add (volatile gint *atomic, gint val); G_END_DECLS #if defined(G_ATOMIC_LOCK_FREE) && defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4) #define g_atomic_int_get(atomic) \ (G_GNUC_EXTENSION ({ \ G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gint)); \ (void) (0 ? *(atomic) ^ *(atomic) : 0); \ __sync_synchronize (); \ (gint) *(atomic); \ })) #define g_atomic_int_set(atomic, newval) \ (G_GNUC_EXTENSION ({ \ G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gint)); \ (void) (0 ? *(atomic) ^ (newval) : 0); \ *(atomic) = (newval); \ __sync_synchronize (); \ })) #define g_atomic_int_inc(atomic) \ (G_GNUC_EXTENSION ({ \ G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gint)); \ (void) (0 ? *(atomic) ^ *(atomic) : 0); \ (void) __sync_fetch_and_add ((atomic), 1); \ })) #define g_atomic_int_dec_and_test(atomic) \ (G_GNUC_EXTENSION ({ \ G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gint)); \ (void) (0 ? *(atomic) ^ *(atomic) : 0); \ __sync_fetch_and_sub ((atomic), 1) == 1; \ })) #define g_atomic_int_compare_and_exchange(atomic, oldval, newval) \ (G_GNUC_EXTENSION ({ \ G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gint)); \ (void) (0 ? *(atomic) ^ (newval) ^ (oldval) : 0); \ (gboolean) __sync_bool_compare_and_swap ((atomic), (oldval), (newval)); \ })) #define g_atomic_int_add(atomic, val) \ (G_GNUC_EXTENSION ({ \ G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gint)); \ (void) (0 ? *(atomic) ^ (val) : 0); \ (gint) __sync_fetch_and_add ((atomic), (val)); \ })) #define g_atomic_int_and(atomic, val) \ (G_GNUC_EXTENSION ({ \ G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gint)); \ (void) (0 ? *(atomic) ^ (val) : 0); \ (guint) __sync_fetch_and_and ((atomic), (val)); \ })) #define g_atomic_int_or(atomic, val) \ (G_GNUC_EXTENSION ({ \ G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gint)); \ (void) (0 ? *(atomic) ^ (val) : 0); \ (guint) __sync_fetch_and_or ((atomic), (val)); \ })) #define g_atomic_int_xor(atomic, val) \ (G_GNUC_EXTENSION ({ \ G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gint)); \ (void) (0 ? *(atomic) ^ (val) : 0); \ (guint) __sync_fetch_and_xor ((atomic), (val)); \ })) #define g_atomic_pointer_get(atomic) \ (G_GNUC_EXTENSION ({ \ G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer)); \ __sync_synchronize (); \ (gpointer) *(atomic); \ })) #define g_atomic_pointer_set(atomic, newval) \ (G_GNUC_EXTENSION ({ \ G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer)); \ (void) (0 ? (gpointer) *(atomic) : 0); \ *(atomic) = (__typeof__ (*(atomic))) (gsize) (newval); \ __sync_synchronize (); \ })) #define g_atomic_pointer_compare_and_exchange(atomic, oldval, newval) \ (G_GNUC_EXTENSION ({ \ G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer)); \ (void) (0 ? (gpointer) *(atomic) : 0); \ (gboolean) __sync_bool_compare_and_swap ((atomic), (oldval), (newval)); \ })) #define g_atomic_pointer_add(atomic, val) \ (G_GNUC_EXTENSION ({ \ G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer)); \ (void) (0 ? (gpointer) *(atomic) : 0); \ (void) (0 ? (val) ^ (val) : 0); \ (gssize) __sync_fetch_and_add ((atomic), (val)); \ })) #define g_atomic_pointer_and(atomic, val) \ (G_GNUC_EXTENSION ({ \ G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer)); \ (void) (0 ? (gpointer) *(atomic) : 0); \ (void) (0 ? (val) ^ (val) : 0); \ (gsize) __sync_fetch_and_and ((atomic), (val)); \ })) #define g_atomic_pointer_or(atomic, val) \ (G_GNUC_EXTENSION ({ \ G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer)); \ (void) (0 ? (gpointer) *(atomic) : 0); \ (void) (0 ? (val) ^ (val) : 0); \ (gsize) __sync_fetch_and_or ((atomic), (val)); \ })) #define g_atomic_pointer_xor(atomic, val) \ (G_GNUC_EXTENSION ({ \ G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer)); \ (void) (0 ? (gpointer) *(atomic) : 0); \ (void) (0 ? (val) ^ (val) : 0); \ (gsize) __sync_fetch_and_xor ((atomic), (val)); \ })) #else /* defined(G_ATOMIC_LOCK_FREE) && defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4) */ #define g_atomic_int_get(atomic) \ (g_atomic_int_get ((gint *) (atomic))) #define g_atomic_int_set(atomic, newval) \ (g_atomic_int_set ((gint *) (atomic), (gint) (newval))) #define g_atomic_int_compare_and_exchange(atomic, oldval, newval) \ (g_atomic_int_compare_and_exchange ((gint *) (atomic), (oldval), (newval))) #define g_atomic_int_add(atomic, val) \ (g_atomic_int_add ((gint *) (atomic), (val))) #define g_atomic_int_and(atomic, val) \ (g_atomic_int_and ((guint *) (atomic), (val))) #define g_atomic_int_or(atomic, val) \ (g_atomic_int_or ((guint *) (atomic), (val))) #define g_atomic_int_xor(atomic, val) \ (g_atomic_int_xor ((guint *) (atomic), (val))) #define g_atomic_int_inc(atomic) \ (g_atomic_int_inc ((gint *) (atomic))) #define g_atomic_int_dec_and_test(atomic) \ (g_atomic_int_dec_and_test ((gint *) (atomic))) #define g_atomic_pointer_get(atomic) \ (g_atomic_pointer_get (atomic)) #define g_atomic_pointer_set(atomic, newval) \ (g_atomic_pointer_set ((atomic), (gpointer) (newval))) #define g_atomic_pointer_compare_and_exchange(atomic, oldval, newval) \ (g_atomic_pointer_compare_and_exchange ((atomic), (gpointer) (oldval), (gpointer) (newval))) #define g_atomic_pointer_add(atomic, val) \ (g_atomic_pointer_add ((atomic), (gssize) (val))) #define g_atomic_pointer_and(atomic, val) \ (g_atomic_pointer_and ((atomic), (gsize) (val))) #define g_atomic_pointer_or(atomic, val) \ (g_atomic_pointer_or ((atomic), (gsize) (val))) #define g_atomic_pointer_xor(atomic, val) \ (g_atomic_pointer_xor ((atomic), (gsize) (val))) #endif /* defined(__GNUC__) && defined(G_ATOMIC_OP_USE_GCC_BUILTINS) */ #endif /* __G_ATOMIC_H__ */ pkg-config-0.29.1/glib/glib/gunicomp.h0000664000175000017500000020527312651243552014414 00000000000000#define COMPOSE_FIRST_START 1 #define COMPOSE_FIRST_SINGLE_START 147 #define COMPOSE_SECOND_START 373 #define COMPOSE_SECOND_SINGLE_START 404 #define COMPOSE_TABLE_LAST 273 static const guint16 compose_data[][256] = { { /* page 0, index 0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 147, 148, 149, 0, 0, 1, 2, 3, 4, 5, 150, 6, 7, 8, 151, 9, 10, 11, 12, 13, 14, 0, 15, 16, 17, 18, 19, 20, 21, 22, 23, 0, 0, 0, 0, 0, 0, 24, 25, 26, 27, 28, 152, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 0, 39, 40, 41, 42, 43, 44, 45, 46, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, 153, 154, 50, 155, 0, 0, 51, 0, 0, 0, 0, 156, 0, 0, 0, 0, 52, 53, 157, 0, 158, 0, 0, 0, 54, 0, 0, 0, 0, 0, 55, 0, 159, 160, 56, 161, 0, 0, 57, 0, 0, 0, 0, 162, 0, 0, 0, 0, 58, 59, 163, 0, 164, 0, 0, 0, 60, 0, 0, 0 }, { /* page 1, index 1 */ 0, 0, 61, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 165, 166, 0, 0, 0, 0, 167, 168, 0, 0, 0, 0, 0, 0, 169, 170, 171, 172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, 70, 0, 0, 0, 0, 0, 0, 174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 175, 176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 2, index 2 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 177, 178, 179, 180, 0, 0, 0, 0, 181, 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 183, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 3, index 3 */ 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, 72, 0, 73, 0, 74, 0, 0, 0, 0, 0, 75, 0, 184, 0, 0, 0, 76, 0, 0, 0, 77, 0, 0, 185, 0, 186, 0, 0, 78, 0, 0, 0, 79, 0, 80, 0, 81, 0, 0, 0, 0, 0, 82, 0, 83, 0, 0, 0, 84, 0, 0, 0, 85, 86, 87, 0, 0, 187, 0, 0, 0, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 4, index 4 */ 0, 0, 0, 0, 0, 0, 188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 0, 0, 189, 0, 90, 91, 190, 92, 0, 191, 0, 0, 0, 192, 0, 0, 0, 0, 93, 0, 0, 0, 193, 0, 0, 0, 194, 0, 195, 0, 0, 94, 0, 0, 196, 0, 95, 96, 197, 97, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 98, 0, 0, 0, 200, 0, 0, 0, 201, 0, 202, 0, 0, 0, 0, 0, 0, 0, 0, 203, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 204, 205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 206, 207, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 208, 209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 6, index 5 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 210, 0, 211, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 213, 0, 0, 214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 9, index 6 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 215, 0, 0, 0, 0, 0, 0, 0, 216, 0, 0, 217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 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, 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 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, 0, 0, 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, 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, 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 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 225, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 27, index 11 */ 0, 0, 0, 0, 0, 226, 0, 227, 0, 228, 0, 229, 0, 230, 0, 0, 0, 231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 232, 0, 233, 0, 234, 235, 0, 0, 236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 30, index 12 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 237, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 239, 240, 0, 0, 0, 0, 0, 0, 241, 242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 106, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 243, 244, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 245, 246, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 31, index 13 */ 108, 109, 247, 248, 249, 250, 251, 252, 110, 111, 253, 254, 255, 256, 257, 258, 112, 113, 0, 0, 0, 0, 0, 0, 114, 115, 0, 0, 0, 0, 0, 0, 116, 117, 259, 260, 261, 262, 263, 264, 118, 119, 265, 266, 267, 268, 269, 270, 120, 121, 0, 0, 0, 0, 0, 0, 122, 123, 0, 0, 0, 0, 0, 0, 124, 125, 0, 0, 0, 0, 0, 0, 126, 127, 0, 0, 0, 0, 0, 0, 128, 129, 0, 0, 0, 0, 0, 0, 0, 130, 0, 0, 0, 0, 0, 0, 131, 132, 271, 272, 273, 274, 275, 276, 133, 134, 277, 278, 279, 280, 281, 282, 283, 0, 0, 0, 284, 0, 0, 0, 0, 0, 0, 0, 285, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 286, 0, 0, 0, 0, 0, 0, 0, 0, 135, 0, 0, 0, 0, 0, 0, 287, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 288, 0, 0, 0, 0, 0, 0, 0, 136, 0 }, { /* page 33, index 14 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 289, 0, 290, 0, 291, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 292, 0, 293, 0, 294, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 34, index 15 */ 0, 0, 0, 295, 0, 0, 0, 0, 296, 0, 0, 297, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 298, 0, 299, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 300, 0, 0, 0, 0, 0, 0, 301, 0, 302, 0, 0, 303, 0, 0, 0, 0, 304, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 305, 0, 0, 306, 307, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 308, 309, 0, 0, 310, 311, 0, 0, 312, 313, 314, 315, 0, 0, 0, 0, 316, 317, 0, 0, 318, 319, 0, 0, 0, 0, 0, 0, 0, 0, 0, 320, 321, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 322, 0, 0, 0, 0, 0, 323, 324, 0, 325, 0, 0, 0, 0, 0, 0, 326, 327, 328, 329, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 48, index 16 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 330, 0, 0, 0, 0, 331, 0, 332, 0, 333, 0, 334, 0, 335, 0, 336, 0, 337, 0, 338, 0, 339, 0, 340, 0, 341, 0, 342, 0, 0, 343, 0, 344, 0, 345, 0, 0, 0, 0, 0, 0, 137, 0, 0, 138, 0, 0, 139, 0, 0, 140, 0, 0, 141, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 145, 0, 0, 146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 363, 364, 365, 366, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 367, 0, 0 }, { /* page 272, index 17 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 368, 0, 369, 0, 0, 0, 0, 0, 0, 0, 0, 0, 370, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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 } }; static const gint16 compose_table[COMPOSE_TABLE_LAST + 1] = { 0 /* page 0 */, 1 /* page 1 */, 2 /* page 2 */, 3 /* page 3 */, 4 /* page 4 */, 0 + G_UNICODE_MAX_TABLE_INDEX, 5 /* page 6 */, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 6 /* page 9 */, 0 + G_UNICODE_MAX_TABLE_INDEX, 7 /* page 11 */, 8 /* page 12 */, 9 /* page 13 */, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 10 /* page 16 */, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 11 /* page 27 */, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 12 /* page 30 */, 13 /* page 31 */, 0 + G_UNICODE_MAX_TABLE_INDEX, 14 /* page 33 */, 15 /* page 34 */, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 16 /* page 48 */, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 17 /* page 272 */, 18 /* page 273 */ }; static const gunichar compose_first_single[][2] = { { 0x0338, 0x226e }, { 0x0338, 0x2260 }, { 0x0338, 0x226f }, { 0x0307, 0x1e1e }, { 0x0302, 0x0134 }, { 0x0307, 0x1e1f }, { 0x0304, 0x01de }, { 0x0301, 0x01fa }, { 0x0301, 0x1e08 }, { 0x0301, 0x1e2e }, { 0x0304, 0x022a }, { 0x0301, 0x01fe }, { 0x0304, 0x01df }, { 0x0301, 0x01fb }, { 0x0301, 0x1e09 }, { 0x0301, 0x1e2f }, { 0x0304, 0x022b }, { 0x0301, 0x01ff }, { 0x0307, 0x1e64 }, { 0x0307, 0x1e65 }, { 0x0307, 0x1e66 }, { 0x0307, 0x1e67 }, { 0x0301, 0x1e78 }, { 0x0301, 0x1e79 }, { 0x0308, 0x1e7a }, { 0x0308, 0x1e7b }, { 0x0307, 0x1e9b }, { 0x030c, 0x01ee }, { 0x0304, 0x01ec }, { 0x0304, 0x01ed }, { 0x0304, 0x01e0 }, { 0x0304, 0x01e1 }, { 0x0306, 0x1e1c }, { 0x0306, 0x1e1d }, { 0x0304, 0x0230 }, { 0x0304, 0x0231 }, { 0x030c, 0x01ef }, { 0x0314, 0x1fec }, { 0x0345, 0x1fb4 }, { 0x0345, 0x1fc4 }, { 0x0345, 0x1ff4 }, { 0x0308, 0x0407 }, { 0x0301, 0x0403 }, { 0x0308, 0x04de }, { 0x0301, 0x040c }, { 0x0308, 0x04e6 }, { 0x0308, 0x04f4 }, { 0x0308, 0x04f8 }, { 0x0308, 0x04ec }, { 0x0301, 0x0453 }, { 0x0308, 0x04df }, { 0x0301, 0x045c }, { 0x0308, 0x04e7 }, { 0x0308, 0x04f5 }, { 0x0308, 0x04f9 }, { 0x0308, 0x04ed }, { 0x0308, 0x0457 }, { 0x030f, 0x0476 }, { 0x030f, 0x0477 }, { 0x0308, 0x04da }, { 0x0308, 0x04db }, { 0x0308, 0x04ea }, { 0x0308, 0x04eb }, { 0x0654, 0x0624 }, { 0x0654, 0x0626 }, { 0x0654, 0x06c2 }, { 0x0654, 0x06d3 }, { 0x0654, 0x06c0 }, { 0x093c, 0x0929 }, { 0x093c, 0x0931 }, { 0x093c, 0x0934 }, { 0x0bd7, 0x0b94 }, { 0x0bbe, 0x0bcb }, { 0x0c56, 0x0c48 }, { 0x0cd5, 0x0cc0 }, { 0x0cd5, 0x0ccb }, { 0x0d3e, 0x0d4b }, { 0x0dca, 0x0ddd }, { 0x102e, 0x1026 }, { 0x1b35, 0x1b06 }, { 0x1b35, 0x1b08 }, { 0x1b35, 0x1b0a }, { 0x1b35, 0x1b0c }, { 0x1b35, 0x1b0e }, { 0x1b35, 0x1b12 }, { 0x1b35, 0x1b3b }, { 0x1b35, 0x1b3d }, { 0x1b35, 0x1b40 }, { 0x1b35, 0x1b41 }, { 0x1b35, 0x1b43 }, { 0x0304, 0x1e38 }, { 0x0304, 0x1e39 }, { 0x0304, 0x1e5c }, { 0x0304, 0x1e5d }, { 0x0307, 0x1e68 }, { 0x0307, 0x1e69 }, { 0x0302, 0x1ec6 }, { 0x0302, 0x1ec7 }, { 0x0302, 0x1ed8 }, { 0x0302, 0x1ed9 }, { 0x0345, 0x1f82 }, { 0x0345, 0x1f83 }, { 0x0345, 0x1f84 }, { 0x0345, 0x1f85 }, { 0x0345, 0x1f86 }, { 0x0345, 0x1f87 }, { 0x0345, 0x1f8a }, { 0x0345, 0x1f8b }, { 0x0345, 0x1f8c }, { 0x0345, 0x1f8d }, { 0x0345, 0x1f8e }, { 0x0345, 0x1f8f }, { 0x0345, 0x1f92 }, { 0x0345, 0x1f93 }, { 0x0345, 0x1f94 }, { 0x0345, 0x1f95 }, { 0x0345, 0x1f96 }, { 0x0345, 0x1f97 }, { 0x0345, 0x1f9a }, { 0x0345, 0x1f9b }, { 0x0345, 0x1f9c }, { 0x0345, 0x1f9d }, { 0x0345, 0x1f9e }, { 0x0345, 0x1f9f }, { 0x0345, 0x1fa2 }, { 0x0345, 0x1fa3 }, { 0x0345, 0x1fa4 }, { 0x0345, 0x1fa5 }, { 0x0345, 0x1fa6 }, { 0x0345, 0x1fa7 }, { 0x0345, 0x1faa }, { 0x0345, 0x1fab }, { 0x0345, 0x1fac }, { 0x0345, 0x1fad }, { 0x0345, 0x1fae }, { 0x0345, 0x1faf }, { 0x0345, 0x1fb2 }, { 0x0345, 0x1fc2 }, { 0x0345, 0x1ff2 }, { 0x0345, 0x1fb7 }, { 0x0345, 0x1fc7 }, { 0x0345, 0x1ff7 }, { 0x0338, 0x219a }, { 0x0338, 0x219b }, { 0x0338, 0x21ae }, { 0x0338, 0x21cd }, { 0x0338, 0x21cf }, { 0x0338, 0x21ce }, { 0x0338, 0x2204 }, { 0x0338, 0x2209 }, { 0x0338, 0x220c }, { 0x0338, 0x2224 }, { 0x0338, 0x2226 }, { 0x0338, 0x2241 }, { 0x0338, 0x2244 }, { 0x0338, 0x2247 }, { 0x0338, 0x2249 }, { 0x0338, 0x226d }, { 0x0338, 0x2262 }, { 0x0338, 0x2270 }, { 0x0338, 0x2271 }, { 0x0338, 0x2274 }, { 0x0338, 0x2275 }, { 0x0338, 0x2278 }, { 0x0338, 0x2279 }, { 0x0338, 0x2280 }, { 0x0338, 0x2281 }, { 0x0338, 0x22e0 }, { 0x0338, 0x22e1 }, { 0x0338, 0x2284 }, { 0x0338, 0x2285 }, { 0x0338, 0x2288 }, { 0x0338, 0x2289 }, { 0x0338, 0x22e2 }, { 0x0338, 0x22e3 }, { 0x0338, 0x22ac }, { 0x0338, 0x22ad }, { 0x0338, 0x22ae }, { 0x0338, 0x22af }, { 0x0338, 0x22ea }, { 0x0338, 0x22eb }, { 0x0338, 0x22ec }, { 0x0338, 0x22ed }, { 0x3099, 0x3094 }, { 0x3099, 0x304c }, { 0x3099, 0x304e }, { 0x3099, 0x3050 }, { 0x3099, 0x3052 }, { 0x3099, 0x3054 }, { 0x3099, 0x3056 }, { 0x3099, 0x3058 }, { 0x3099, 0x305a }, { 0x3099, 0x305c }, { 0x3099, 0x305e }, { 0x3099, 0x3060 }, { 0x3099, 0x3062 }, { 0x3099, 0x3065 }, { 0x3099, 0x3067 }, { 0x3099, 0x3069 }, { 0x3099, 0x309e }, { 0x3099, 0x30f4 }, { 0x3099, 0x30ac }, { 0x3099, 0x30ae }, { 0x3099, 0x30b0 }, { 0x3099, 0x30b2 }, { 0x3099, 0x30b4 }, { 0x3099, 0x30b6 }, { 0x3099, 0x30b8 }, { 0x3099, 0x30ba }, { 0x3099, 0x30bc }, { 0x3099, 0x30be }, { 0x3099, 0x30c0 }, { 0x3099, 0x30c2 }, { 0x3099, 0x30c5 }, { 0x3099, 0x30c7 }, { 0x3099, 0x30c9 }, { 0x3099, 0x30f7 }, { 0x3099, 0x30f8 }, { 0x3099, 0x30f9 }, { 0x3099, 0x30fa }, { 0x3099, 0x30fe }, { 0x110ba, 0x1109a }, { 0x110ba, 0x1109c }, { 0x110ba, 0x110ab }, { 0x11127, 0x1112e }, { 0x11127, 0x1112f } }; static const guint16 compose_second_single[][2] = { { 0x0627, 0x0622 }, { 0x0627, 0x0623 }, { 0x0627, 0x0625 }, { 0x09c7, 0x09cb }, { 0x09c7, 0x09cc }, { 0x0b47, 0x0b4b }, { 0x0b47, 0x0b48 }, { 0x0b47, 0x0b4c }, { 0x0bc6, 0x0bca }, { 0x0bc6, 0x0bcc }, { 0x0cc6, 0x0cca }, { 0x0cc6, 0x0cc7 }, { 0x0cc6, 0x0cc8 }, { 0x0d46, 0x0d4a }, { 0x0d46, 0x0d4c }, { 0x0dd9, 0x0dda }, { 0x0dd9, 0x0ddc }, { 0x0dd9, 0x0dde } }; static const guint16 compose_array[146][31] = { { 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x0100, 0x0102, 0x0226, 0x00c4, 0x1ea2, 0x00c5, 0, 0x01cd, 0x0200, 0x0202, 0, 0, 0, 0x1ea0, 0, 0x1e00, 0, 0, 0x0104, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0x1e02, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1e04, 0, 0, 0, 0, 0, 0, 0, 0, 0x1e06, 0, 0, 0, 0 }, { 0, 0x0106, 0x0108, 0, 0, 0, 0x010a, 0, 0, 0, 0, 0x010c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00c7, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0x1e0a, 0, 0, 0, 0, 0x010e, 0, 0, 0, 0, 0, 0x1e0c, 0, 0, 0, 0x1e10, 0, 0x1e12, 0, 0, 0x1e0e, 0, 0, 0, 0 }, { 0x00c8, 0x00c9, 0x00ca, 0x1ebc, 0x0112, 0x0114, 0x0116, 0x00cb, 0x1eba, 0, 0, 0x011a, 0x0204, 0x0206, 0, 0, 0, 0x1eb8, 0, 0, 0, 0x0228, 0x0118, 0x1e18, 0, 0x1e1a, 0, 0, 0, 0, 0 }, { 0, 0x01f4, 0x011c, 0, 0x1e20, 0x011e, 0x0120, 0, 0, 0, 0, 0x01e6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x0122, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0x0124, 0, 0, 0, 0x1e22, 0x1e26, 0, 0, 0, 0x021e, 0, 0, 0, 0, 0, 0x1e24, 0, 0, 0, 0x1e28, 0, 0, 0x1e2a, 0, 0, 0, 0, 0, 0 }, { 0x00cc, 0x00cd, 0x00ce, 0x0128, 0x012a, 0x012c, 0x0130, 0x00cf, 0x1ec8, 0, 0, 0x01cf, 0x0208, 0x020a, 0, 0, 0, 0x1eca, 0, 0, 0, 0, 0x012e, 0, 0, 0x1e2c, 0, 0, 0, 0, 0 }, { 0, 0x1e30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x01e8, 0, 0, 0, 0, 0, 0x1e32, 0, 0, 0, 0x0136, 0, 0, 0, 0, 0x1e34, 0, 0, 0, 0 }, { 0, 0x0139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x013d, 0, 0, 0, 0, 0, 0x1e36, 0, 0, 0, 0x013b, 0, 0x1e3c, 0, 0, 0x1e3a, 0, 0, 0, 0 }, { 0, 0x1e3e, 0, 0, 0, 0, 0x1e40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1e42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0x01f8, 0x0143, 0, 0x00d1, 0, 0, 0x1e44, 0, 0, 0, 0, 0x0147, 0, 0, 0, 0, 0, 0x1e46, 0, 0, 0, 0x0145, 0, 0x1e4a, 0, 0, 0x1e48, 0, 0, 0, 0 }, { 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x014c, 0x014e, 0x022e, 0x00d6, 0x1ece, 0, 0x0150, 0x01d1, 0x020c, 0x020e, 0, 0, 0x01a0, 0x1ecc, 0, 0, 0, 0, 0x01ea, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0x1e54, 0, 0, 0, 0, 0x1e56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0x0154, 0, 0, 0, 0, 0x1e58, 0, 0, 0, 0, 0x0158, 0x0210, 0x0212, 0, 0, 0, 0x1e5a, 0, 0, 0, 0x0156, 0, 0, 0, 0, 0x1e5e, 0, 0, 0, 0 }, { 0, 0x015a, 0x015c, 0, 0, 0, 0x1e60, 0, 0, 0, 0, 0x0160, 0, 0, 0, 0, 0, 0x1e62, 0, 0, 0x0218, 0x015e, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0x1e6a, 0, 0, 0, 0, 0x0164, 0, 0, 0, 0, 0, 0x1e6c, 0, 0, 0x021a, 0x0162, 0, 0x1e70, 0, 0, 0x1e6e, 0, 0, 0, 0 }, { 0x00d9, 0x00da, 0x00db, 0x0168, 0x016a, 0x016c, 0, 0x00dc, 0x1ee6, 0x016e, 0x0170, 0x01d3, 0x0214, 0x0216, 0, 0, 0x01af, 0x1ee4, 0x1e72, 0, 0, 0, 0x0172, 0x1e76, 0, 0x1e74, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0x1e7c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1e7e, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0x1e80, 0x1e82, 0x0174, 0, 0, 0, 0x1e86, 0x1e84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1e88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0x1e8a, 0x1e8c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0x1ef2, 0x00dd, 0x0176, 0x1ef8, 0x0232, 0, 0x1e8e, 0x0178, 0x1ef6, 0, 0, 0, 0, 0, 0, 0, 0, 0x1ef4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0x0179, 0x1e90, 0, 0, 0, 0x017b, 0, 0, 0, 0, 0x017d, 0, 0, 0, 0, 0, 0x1e92, 0, 0, 0, 0, 0, 0, 0, 0, 0x1e94, 0, 0, 0, 0 }, { 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x0101, 0x0103, 0x0227, 0x00e4, 0x1ea3, 0x00e5, 0, 0x01ce, 0x0201, 0x0203, 0, 0, 0, 0x1ea1, 0, 0x1e01, 0, 0, 0x0105, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0x1e03, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1e05, 0, 0, 0, 0, 0, 0, 0, 0, 0x1e07, 0, 0, 0, 0 }, { 0, 0x0107, 0x0109, 0, 0, 0, 0x010b, 0, 0, 0, 0, 0x010d, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00e7, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0x1e0b, 0, 0, 0, 0, 0x010f, 0, 0, 0, 0, 0, 0x1e0d, 0, 0, 0, 0x1e11, 0, 0x1e13, 0, 0, 0x1e0f, 0, 0, 0, 0 }, { 0x00e8, 0x00e9, 0x00ea, 0x1ebd, 0x0113, 0x0115, 0x0117, 0x00eb, 0x1ebb, 0, 0, 0x011b, 0x0205, 0x0207, 0, 0, 0, 0x1eb9, 0, 0, 0, 0x0229, 0x0119, 0x1e19, 0, 0x1e1b, 0, 0, 0, 0, 0 }, { 0, 0x01f5, 0x011d, 0, 0x1e21, 0x011f, 0x0121, 0, 0, 0, 0, 0x01e7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x0123, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0x0125, 0, 0, 0, 0x1e23, 0x1e27, 0, 0, 0, 0x021f, 0, 0, 0, 0, 0, 0x1e25, 0, 0, 0, 0x1e29, 0, 0, 0x1e2b, 0, 0x1e96, 0, 0, 0, 0 }, { 0x00ec, 0x00ed, 0x00ee, 0x0129, 0x012b, 0x012d, 0, 0x00ef, 0x1ec9, 0, 0, 0x01d0, 0x0209, 0x020b, 0, 0, 0, 0x1ecb, 0, 0, 0, 0, 0x012f, 0, 0, 0x1e2d, 0, 0, 0, 0, 0 }, { 0, 0, 0x0135, 0, 0, 0, 0, 0, 0, 0, 0, 0x01f0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0x1e31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x01e9, 0, 0, 0, 0, 0, 0x1e33, 0, 0, 0, 0x0137, 0, 0, 0, 0, 0x1e35, 0, 0, 0, 0 }, { 0, 0x013a, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x013e, 0, 0, 0, 0, 0, 0x1e37, 0, 0, 0, 0x013c, 0, 0x1e3d, 0, 0, 0x1e3b, 0, 0, 0, 0 }, { 0, 0x1e3f, 0, 0, 0, 0, 0x1e41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1e43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0x01f9, 0x0144, 0, 0x00f1, 0, 0, 0x1e45, 0, 0, 0, 0, 0x0148, 0, 0, 0, 0, 0, 0x1e47, 0, 0, 0, 0x0146, 0, 0x1e4b, 0, 0, 0x1e49, 0, 0, 0, 0 }, { 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x014d, 0x014f, 0x022f, 0x00f6, 0x1ecf, 0, 0x0151, 0x01d2, 0x020d, 0x020f, 0, 0, 0x01a1, 0x1ecd, 0, 0, 0, 0, 0x01eb, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0x1e55, 0, 0, 0, 0, 0x1e57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0x0155, 0, 0, 0, 0, 0x1e59, 0, 0, 0, 0, 0x0159, 0x0211, 0x0213, 0, 0, 0, 0x1e5b, 0, 0, 0, 0x0157, 0, 0, 0, 0, 0x1e5f, 0, 0, 0, 0 }, { 0, 0x015b, 0x015d, 0, 0, 0, 0x1e61, 0, 0, 0, 0, 0x0161, 0, 0, 0, 0, 0, 0x1e63, 0, 0, 0x0219, 0x015f, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0x1e6b, 0x1e97, 0, 0, 0, 0x0165, 0, 0, 0, 0, 0, 0x1e6d, 0, 0, 0x021b, 0x0163, 0, 0x1e71, 0, 0, 0x1e6f, 0, 0, 0, 0 }, { 0x00f9, 0x00fa, 0x00fb, 0x0169, 0x016b, 0x016d, 0, 0x00fc, 0x1ee7, 0x016f, 0x0171, 0x01d4, 0x0215, 0x0217, 0, 0, 0x01b0, 0x1ee5, 0x1e73, 0, 0, 0, 0x0173, 0x1e77, 0, 0x1e75, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0x1e7d, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1e7f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0x1e81, 0x1e83, 0x0175, 0, 0, 0, 0x1e87, 0x1e85, 0, 0x1e98, 0, 0, 0, 0, 0, 0, 0, 0x1e89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0x1e8b, 0x1e8d, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0x1ef3, 0x00fd, 0x0177, 0x1ef9, 0x0233, 0, 0x1e8f, 0x00ff, 0x1ef7, 0x1e99, 0, 0, 0, 0, 0, 0, 0, 0x1ef5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0x017a, 0x1e91, 0, 0, 0, 0x017c, 0, 0, 0, 0, 0x017e, 0, 0, 0, 0, 0, 0x1e93, 0, 0, 0, 0, 0, 0, 0, 0, 0x1e95, 0, 0, 0, 0 }, { 0x1fed, 0x0385, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1fc1, 0, 0, 0 }, { 0x1ea6, 0x1ea4, 0, 0x1eaa, 0, 0, 0, 0, 0x1ea8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0x01fc, 0, 0, 0x01e2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0x1ec0, 0x1ebe, 0, 0x1ec4, 0, 0, 0, 0, 0x1ec2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0x1ed2, 0x1ed0, 0, 0x1ed6, 0, 0, 0, 0, 0x1ed4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0x1e4c, 0, 0, 0x022c, 0, 0, 0x1e4e, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0x01db, 0x01d7, 0, 0, 0x01d5, 0, 0, 0, 0, 0, 0, 0x01d9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0x1ea7, 0x1ea5, 0, 0x1eab, 0, 0, 0, 0, 0x1ea9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0x01fd, 0, 0, 0x01e3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0x1ec1, 0x1ebf, 0, 0x1ec5, 0, 0, 0, 0, 0x1ec3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0x1ed3, 0x1ed1, 0, 0x1ed7, 0, 0, 0, 0, 0x1ed5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0x1e4d, 0, 0, 0x022d, 0, 0, 0x1e4f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0x01dc, 0x01d8, 0, 0, 0x01d6, 0, 0, 0, 0, 0, 0, 0x01da, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0x1eb0, 0x1eae, 0, 0x1eb4, 0, 0, 0, 0, 0x1eb2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0x1eb1, 0x1eaf, 0, 0x1eb5, 0, 0, 0, 0, 0x1eb3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0x1e14, 0x1e16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0x1e15, 0x1e17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0x1e50, 0x1e52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0x1e51, 0x1e53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0x1edc, 0x1eda, 0, 0x1ee0, 0, 0, 0, 0, 0x1ede, 0, 0, 0, 0, 0, 0, 0, 0, 0x1ee2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0x1edd, 0x1edb, 0, 0x1ee1, 0, 0, 0, 0, 0x1edf, 0, 0, 0, 0, 0, 0, 0, 0, 0x1ee3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0x1eea, 0x1ee8, 0, 0x1eee, 0, 0, 0, 0, 0x1eec, 0, 0, 0, 0, 0, 0, 0, 0, 0x1ef0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0x1eeb, 0x1ee9, 0, 0x1eef, 0, 0, 0, 0, 0x1eed, 0, 0, 0, 0, 0, 0, 0, 0, 0x1ef1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0x1fba, 0x0386, 0, 0, 0x1fb9, 0x1fb8, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f08, 0x1f09, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1fbc, 0, 0 }, { 0x1fc8, 0x0388, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f18, 0x1f19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0x1fca, 0x0389, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f28, 0x1f29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1fcc, 0, 0 }, { 0x1fda, 0x038a, 0, 0, 0x1fd9, 0x1fd8, 0, 0x03aa, 0, 0, 0, 0, 0, 0, 0x1f38, 0x1f39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0x1ff8, 0x038c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f48, 0x1f49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0x1fea, 0x038e, 0, 0, 0x1fe9, 0x1fe8, 0, 0x03ab, 0, 0, 0, 0, 0, 0, 0, 0x1f59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0x1ffa, 0x038f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f68, 0x1f69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1ffc, 0, 0 }, { 0x1f70, 0x03ac, 0, 0, 0x1fb1, 0x1fb0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f00, 0x1f01, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1fb6, 0x1fb3, 0, 0 }, { 0x1f72, 0x03ad, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f10, 0x1f11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0x1f74, 0x03ae, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f20, 0x1f21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1fc6, 0x1fc3, 0, 0 }, { 0x1f76, 0x03af, 0, 0, 0x1fd1, 0x1fd0, 0, 0x03ca, 0, 0, 0, 0, 0, 0, 0x1f30, 0x1f31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1fd6, 0, 0, 0 }, { 0x1f78, 0x03cc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f40, 0x1f41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1fe4, 0x1fe5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0x1f7a, 0x03cd, 0, 0, 0x1fe1, 0x1fe0, 0, 0x03cb, 0, 0, 0, 0, 0, 0, 0x1f50, 0x1f51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1fe6, 0, 0, 0 }, { 0x1f7c, 0x03ce, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f60, 0x1f61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1ff6, 0x1ff3, 0, 0 }, { 0x1fd2, 0x0390, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1fd7, 0, 0, 0 }, { 0x1fe2, 0x03b0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1fe7, 0, 0, 0 }, { 0, 0x03d3, 0, 0, 0, 0, 0, 0x03d4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0x04d0, 0, 0x04d2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0x0400, 0, 0, 0, 0, 0x04d6, 0, 0x0401, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0x04c1, 0, 0x04dc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0x040d, 0, 0, 0, 0x04e2, 0x0419, 0, 0x04e4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0x04ee, 0x040e, 0, 0x04f0, 0, 0, 0x04f2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0x04d1, 0, 0x04d3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0x0450, 0, 0, 0, 0, 0x04d7, 0, 0x0451, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0x04c2, 0, 0x04dd, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0x045d, 0, 0, 0, 0x04e3, 0x0439, 0, 0x04e5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0x04ef, 0x045e, 0, 0x04f1, 0, 0, 0x04f3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0x1eac, 0, 0, 0x1eb6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0x1ead, 0, 0, 0x1eb7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0x1f02, 0x1f04, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f06, 0x1f80, 0, 0 }, { 0x1f03, 0x1f05, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f07, 0x1f81, 0, 0 }, { 0x1f0a, 0x1f0c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f0e, 0x1f88, 0, 0 }, { 0x1f0b, 0x1f0d, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f0f, 0x1f89, 0, 0 }, { 0x1f12, 0x1f14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0x1f13, 0x1f15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0x1f1a, 0x1f1c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0x1f1b, 0x1f1d, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0x1f22, 0x1f24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f26, 0x1f90, 0, 0 }, { 0x1f23, 0x1f25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f27, 0x1f91, 0, 0 }, { 0x1f2a, 0x1f2c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f2e, 0x1f98, 0, 0 }, { 0x1f2b, 0x1f2d, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f2f, 0x1f99, 0, 0 }, { 0x1f32, 0x1f34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f36, 0, 0, 0 }, { 0x1f33, 0x1f35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f37, 0, 0, 0 }, { 0x1f3a, 0x1f3c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f3e, 0, 0, 0 }, { 0x1f3b, 0x1f3d, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f3f, 0, 0, 0 }, { 0x1f42, 0x1f44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0x1f43, 0x1f45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0x1f4a, 0x1f4c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0x1f4b, 0x1f4d, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0x1f52, 0x1f54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f56, 0, 0, 0 }, { 0x1f53, 0x1f55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f57, 0, 0, 0 }, { 0x1f5b, 0x1f5d, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f5f, 0, 0, 0 }, { 0x1f62, 0x1f64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f66, 0x1fa0, 0, 0 }, { 0x1f63, 0x1f65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f67, 0x1fa1, 0, 0 }, { 0x1f6a, 0x1f6c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f6e, 0x1fa8, 0, 0 }, { 0x1f6b, 0x1f6d, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f6f, 0x1fa9, 0, 0 }, { 0x1fcd, 0x1fce, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1fcf, 0, 0, 0 }, { 0x1fdd, 0x1fde, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1fdf, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x3070, 0x3071 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x3073, 0x3074 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x3076, 0x3077 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x3079, 0x307a }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x307c, 0x307d }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x30d0, 0x30d1 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x30d3, 0x30d4 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x30d6, 0x30d7 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x30d9, 0x30da }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x30dc, 0x30dd } }; pkg-config-0.29.1/glib/glib/giounix.c0000664000175000017500000004042112651243552014240 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * giounix.c: IO Channels using unix file descriptors * Copyright 1998 Owen Taylor * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the GLib Team and others 1997-2000. See the AUTHORS * file for a list of people on the GLib Team. See the ChangeLog * files for a list of changes. These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/. */ /* * MT safe */ #include "config.h" #define _POSIX_SOURCE /* for SSIZE_MAX */ #include #include #include #include #include #include #include #include #include "giochannel.h" #include "gerror.h" #include "gfileutils.h" #include "gstrfuncs.h" #include "gtestutils.h" /* * Unix IO Channels */ typedef struct _GIOUnixChannel GIOUnixChannel; typedef struct _GIOUnixWatch GIOUnixWatch; struct _GIOUnixChannel { GIOChannel channel; gint fd; }; struct _GIOUnixWatch { GSource source; GPollFD pollfd; GIOChannel *channel; GIOCondition condition; }; static GIOStatus g_io_unix_read (GIOChannel *channel, gchar *buf, gsize count, gsize *bytes_read, GError **err); static GIOStatus g_io_unix_write (GIOChannel *channel, const gchar *buf, gsize count, gsize *bytes_written, GError **err); static GIOStatus g_io_unix_seek (GIOChannel *channel, gint64 offset, GSeekType type, GError **err); static GIOStatus g_io_unix_close (GIOChannel *channel, GError **err); static void g_io_unix_free (GIOChannel *channel); static GSource* g_io_unix_create_watch (GIOChannel *channel, GIOCondition condition); static GIOStatus g_io_unix_set_flags (GIOChannel *channel, GIOFlags flags, GError **err); static GIOFlags g_io_unix_get_flags (GIOChannel *channel); static gboolean g_io_unix_prepare (GSource *source, gint *timeout); static gboolean g_io_unix_check (GSource *source); static gboolean g_io_unix_dispatch (GSource *source, GSourceFunc callback, gpointer user_data); static void g_io_unix_finalize (GSource *source); GSourceFuncs g_io_watch_funcs = { g_io_unix_prepare, g_io_unix_check, g_io_unix_dispatch, g_io_unix_finalize }; static GIOFuncs unix_channel_funcs = { g_io_unix_read, g_io_unix_write, g_io_unix_seek, g_io_unix_close, g_io_unix_create_watch, g_io_unix_free, g_io_unix_set_flags, g_io_unix_get_flags, }; static gboolean g_io_unix_prepare (GSource *source, gint *timeout) { GIOUnixWatch *watch = (GIOUnixWatch *)source; GIOCondition buffer_condition = g_io_channel_get_buffer_condition (watch->channel); *timeout = -1; /* Only return TRUE here if _all_ bits in watch->condition will be set */ return ((watch->condition & buffer_condition) == watch->condition); } static gboolean g_io_unix_check (GSource *source) { GIOUnixWatch *watch = (GIOUnixWatch *)source; GIOCondition buffer_condition = g_io_channel_get_buffer_condition (watch->channel); GIOCondition poll_condition = watch->pollfd.revents; return ((poll_condition | buffer_condition) & watch->condition); } static gboolean g_io_unix_dispatch (GSource *source, GSourceFunc callback, gpointer user_data) { GIOFunc func = (GIOFunc)callback; GIOUnixWatch *watch = (GIOUnixWatch *)source; GIOCondition buffer_condition = g_io_channel_get_buffer_condition (watch->channel); if (!func) { g_warning ("IO watch dispatched without callback\n" "You must call g_source_connect()."); return FALSE; } return (*func) (watch->channel, (watch->pollfd.revents | buffer_condition) & watch->condition, user_data); } static void g_io_unix_finalize (GSource *source) { GIOUnixWatch *watch = (GIOUnixWatch *)source; g_io_channel_unref (watch->channel); } static GIOStatus g_io_unix_read (GIOChannel *channel, gchar *buf, gsize count, gsize *bytes_read, GError **err) { GIOUnixChannel *unix_channel = (GIOUnixChannel *)channel; gssize result; if (count > SSIZE_MAX) /* At least according to the Debian manpage for read */ count = SSIZE_MAX; retry: result = read (unix_channel->fd, buf, count); if (result < 0) { int errsv = errno; *bytes_read = 0; switch (errsv) { #ifdef EINTR case EINTR: goto retry; #endif #ifdef EAGAIN case EAGAIN: return G_IO_STATUS_AGAIN; #endif default: g_set_error_literal (err, G_IO_CHANNEL_ERROR, g_io_channel_error_from_errno (errsv), g_strerror (errsv)); return G_IO_STATUS_ERROR; } } *bytes_read = result; return (result > 0) ? G_IO_STATUS_NORMAL : G_IO_STATUS_EOF; } static GIOStatus g_io_unix_write (GIOChannel *channel, const gchar *buf, gsize count, gsize *bytes_written, GError **err) { GIOUnixChannel *unix_channel = (GIOUnixChannel *)channel; gssize result; retry: result = write (unix_channel->fd, buf, count); if (result < 0) { int errsv = errno; *bytes_written = 0; switch (errsv) { #ifdef EINTR case EINTR: goto retry; #endif #ifdef EAGAIN case EAGAIN: return G_IO_STATUS_AGAIN; #endif default: g_set_error_literal (err, G_IO_CHANNEL_ERROR, g_io_channel_error_from_errno (errsv), g_strerror (errsv)); return G_IO_STATUS_ERROR; } } *bytes_written = result; return G_IO_STATUS_NORMAL; } static GIOStatus g_io_unix_seek (GIOChannel *channel, gint64 offset, GSeekType type, GError **err) { GIOUnixChannel *unix_channel = (GIOUnixChannel *)channel; int whence; off_t tmp_offset; off_t result; switch (type) { case G_SEEK_SET: whence = SEEK_SET; break; case G_SEEK_CUR: whence = SEEK_CUR; break; case G_SEEK_END: whence = SEEK_END; break; default: whence = -1; /* Shut the compiler up */ g_assert_not_reached (); } tmp_offset = offset; if (tmp_offset != offset) { g_set_error_literal (err, G_IO_CHANNEL_ERROR, g_io_channel_error_from_errno (EINVAL), g_strerror (EINVAL)); return G_IO_STATUS_ERROR; } result = lseek (unix_channel->fd, tmp_offset, whence); if (result < 0) { int errsv = errno; g_set_error_literal (err, G_IO_CHANNEL_ERROR, g_io_channel_error_from_errno (errsv), g_strerror (errsv)); return G_IO_STATUS_ERROR; } return G_IO_STATUS_NORMAL; } static GIOStatus g_io_unix_close (GIOChannel *channel, GError **err) { GIOUnixChannel *unix_channel = (GIOUnixChannel *)channel; if (close (unix_channel->fd) < 0) { int errsv = errno; g_set_error_literal (err, G_IO_CHANNEL_ERROR, g_io_channel_error_from_errno (errsv), g_strerror (errsv)); return G_IO_STATUS_ERROR; } return G_IO_STATUS_NORMAL; } static void g_io_unix_free (GIOChannel *channel) { GIOUnixChannel *unix_channel = (GIOUnixChannel *)channel; g_free (unix_channel); } static GSource * g_io_unix_create_watch (GIOChannel *channel, GIOCondition condition) { GIOUnixChannel *unix_channel = (GIOUnixChannel *)channel; GSource *source; GIOUnixWatch *watch; source = g_source_new (&g_io_watch_funcs, sizeof (GIOUnixWatch)); g_source_set_name (source, "GIOChannel (Unix)"); watch = (GIOUnixWatch *)source; watch->channel = channel; g_io_channel_ref (channel); watch->condition = condition; watch->pollfd.fd = unix_channel->fd; watch->pollfd.events = condition; g_source_add_poll (source, &watch->pollfd); return source; } static GIOStatus g_io_unix_set_flags (GIOChannel *channel, GIOFlags flags, GError **err) { glong fcntl_flags; GIOUnixChannel *unix_channel = (GIOUnixChannel *) channel; fcntl_flags = 0; if (flags & G_IO_FLAG_APPEND) fcntl_flags |= O_APPEND; if (flags & G_IO_FLAG_NONBLOCK) #ifdef O_NONBLOCK fcntl_flags |= O_NONBLOCK; #else fcntl_flags |= O_NDELAY; #endif if (fcntl (unix_channel->fd, F_SETFL, fcntl_flags) == -1) { int errsv = errno; g_set_error_literal (err, G_IO_CHANNEL_ERROR, g_io_channel_error_from_errno (errsv), g_strerror (errsv)); return G_IO_STATUS_ERROR; } return G_IO_STATUS_NORMAL; } static GIOFlags g_io_unix_get_flags (GIOChannel *channel) { GIOFlags flags = 0; glong fcntl_flags; GIOUnixChannel *unix_channel = (GIOUnixChannel *) channel; fcntl_flags = fcntl (unix_channel->fd, F_GETFL); if (fcntl_flags == -1) { int err = errno; g_warning (G_STRLOC "Error while getting flags for FD: %s (%d)\n", g_strerror (err), err); return 0; } if (fcntl_flags & O_APPEND) flags |= G_IO_FLAG_APPEND; #ifdef O_NONBLOCK if (fcntl_flags & O_NONBLOCK) #else if (fcntl_flags & O_NDELAY) #endif flags |= G_IO_FLAG_NONBLOCK; switch (fcntl_flags & (O_RDONLY | O_WRONLY | O_RDWR)) { case O_RDONLY: channel->is_readable = TRUE; channel->is_writeable = FALSE; break; case O_WRONLY: channel->is_readable = FALSE; channel->is_writeable = TRUE; break; case O_RDWR: channel->is_readable = TRUE; channel->is_writeable = TRUE; break; default: g_assert_not_reached (); } return flags; } GIOChannel * g_io_channel_new_file (const gchar *filename, const gchar *mode, GError **error) { int fid, flags; mode_t create_mode; GIOChannel *channel; enum { /* Cheesy hack */ MODE_R = 1 << 0, MODE_W = 1 << 1, MODE_A = 1 << 2, MODE_PLUS = 1 << 3, MODE_R_PLUS = MODE_R | MODE_PLUS, MODE_W_PLUS = MODE_W | MODE_PLUS, MODE_A_PLUS = MODE_A | MODE_PLUS } mode_num; struct stat buffer; g_return_val_if_fail (filename != NULL, NULL); g_return_val_if_fail (mode != NULL, NULL); g_return_val_if_fail ((error == NULL) || (*error == NULL), NULL); switch (mode[0]) { case 'r': mode_num = MODE_R; break; case 'w': mode_num = MODE_W; break; case 'a': mode_num = MODE_A; break; default: g_warning ("Invalid GIOFileMode %s.\n", mode); return NULL; } switch (mode[1]) { case '\0': break; case '+': if (mode[2] == '\0') { mode_num |= MODE_PLUS; break; } /* Fall through */ default: g_warning ("Invalid GIOFileMode %s.\n", mode); return NULL; } switch (mode_num) { case MODE_R: flags = O_RDONLY; break; case MODE_W: flags = O_WRONLY | O_TRUNC | O_CREAT; break; case MODE_A: flags = O_WRONLY | O_APPEND | O_CREAT; break; case MODE_R_PLUS: flags = O_RDWR; break; case MODE_W_PLUS: flags = O_RDWR | O_TRUNC | O_CREAT; break; case MODE_A_PLUS: flags = O_RDWR | O_APPEND | O_CREAT; break; case MODE_PLUS: default: g_assert_not_reached (); flags = 0; } create_mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH; fid = g_open (filename, flags, create_mode); if (fid == -1) { int err = errno; g_set_error_literal (error, G_FILE_ERROR, g_file_error_from_errno (err), g_strerror (err)); return (GIOChannel *)NULL; } if (fstat (fid, &buffer) == -1) /* In case someone opens a FIFO */ { int err = errno; close (fid); g_set_error_literal (error, G_FILE_ERROR, g_file_error_from_errno (err), g_strerror (err)); return (GIOChannel *)NULL; } channel = (GIOChannel *) g_new (GIOUnixChannel, 1); channel->is_seekable = S_ISREG (buffer.st_mode) || S_ISCHR (buffer.st_mode) || S_ISBLK (buffer.st_mode); switch (mode_num) { case MODE_R: channel->is_readable = TRUE; channel->is_writeable = FALSE; break; case MODE_W: case MODE_A: channel->is_readable = FALSE; channel->is_writeable = TRUE; break; case MODE_R_PLUS: case MODE_W_PLUS: case MODE_A_PLUS: channel->is_readable = TRUE; channel->is_writeable = TRUE; break; case MODE_PLUS: default: g_assert_not_reached (); } g_io_channel_init (channel); channel->close_on_unref = TRUE; /* must be after g_io_channel_init () */ channel->funcs = &unix_channel_funcs; ((GIOUnixChannel *) channel)->fd = fid; return channel; } /** * g_io_channel_unix_new: * @fd: a file descriptor. * * Creates a new #GIOChannel given a file descriptor. On UNIX systems * this works for plain files, pipes, and sockets. * * The returned #GIOChannel has a reference count of 1. * * The default encoding for #GIOChannel is UTF-8. If your application * is reading output from a command using via pipe, you may need to set * the encoding to the encoding of the current locale (see * g_get_charset()) with the g_io_channel_set_encoding() function. * * If you want to read raw binary data without interpretation, then * call the g_io_channel_set_encoding() function with %NULL for the * encoding argument. * * This function is available in GLib on Windows, too, but you should * avoid using it on Windows. The domain of file descriptors and * sockets overlap. There is no way for GLib to know which one you mean * in case the argument you pass to this function happens to be both a * valid file descriptor and socket. If that happens a warning is * issued, and GLib assumes that it is the file descriptor you mean. * * Returns: a new #GIOChannel. **/ GIOChannel * g_io_channel_unix_new (gint fd) { struct stat buffer; GIOUnixChannel *unix_channel = g_new (GIOUnixChannel, 1); GIOChannel *channel = (GIOChannel *)unix_channel; g_io_channel_init (channel); channel->funcs = &unix_channel_funcs; unix_channel->fd = fd; /* I'm not sure if fstat on a non-file (e.g., socket) works * it should be safe to say if it fails, the fd isn't seekable. */ /* Newer UNIX versions support S_ISSOCK(), fstat() will probably * succeed in most cases. */ if (fstat (unix_channel->fd, &buffer) == 0) channel->is_seekable = S_ISREG (buffer.st_mode) || S_ISCHR (buffer.st_mode) || S_ISBLK (buffer.st_mode); else /* Assume not seekable */ channel->is_seekable = FALSE; g_io_unix_get_flags (channel); /* Sets is_readable, is_writeable */ return channel; } /** * g_io_channel_unix_get_fd: * @channel: a #GIOChannel, created with g_io_channel_unix_new(). * * 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) { GIOUnixChannel *unix_channel = (GIOUnixChannel *)channel; return unix_channel->fd; } pkg-config-0.29.1/glib/glib/gthread.h0000664000175000017500000002376012651243552014210 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2 of the * licence, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, * USA. */ /* * Modified by the GLib Team and others 1997-2000. See the AUTHORS * file for a list of people on the GLib Team. See the ChangeLog * files for a list of changes. These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/. */ #ifndef __G_THREAD_H__ #define __G_THREAD_H__ #if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) #error "Only can be included directly." #endif #include #include G_BEGIN_DECLS #define G_THREAD_ERROR g_thread_error_quark () GLIB_AVAILABLE_IN_ALL GQuark g_thread_error_quark (void); typedef enum { G_THREAD_ERROR_AGAIN /* Resource temporarily unavailable */ } GThreadError; typedef gpointer (*GThreadFunc) (gpointer data); typedef struct _GThread GThread; typedef union _GMutex GMutex; typedef struct _GRecMutex GRecMutex; typedef struct _GRWLock GRWLock; typedef struct _GCond GCond; typedef struct _GPrivate GPrivate; typedef struct _GOnce GOnce; union _GMutex { /*< private >*/ gpointer p; guint i[2]; }; struct _GRWLock { /*< private >*/ gpointer p; guint i[2]; }; struct _GCond { /*< private >*/ gpointer p; guint i[2]; }; struct _GRecMutex { /*< private >*/ gpointer p; guint i[2]; }; #define G_PRIVATE_INIT(notify) { NULL, (notify), { NULL, NULL } } struct _GPrivate { /*< private >*/ gpointer p; GDestroyNotify notify; gpointer future[2]; }; typedef enum { G_ONCE_STATUS_NOTCALLED, G_ONCE_STATUS_PROGRESS, G_ONCE_STATUS_READY } GOnceStatus; #define G_ONCE_INIT { G_ONCE_STATUS_NOTCALLED, NULL } struct _GOnce { volatile GOnceStatus status; volatile gpointer retval; }; #define G_LOCK_NAME(name) g__ ## name ## _lock #define G_LOCK_DEFINE_STATIC(name) static G_LOCK_DEFINE (name) #define G_LOCK_DEFINE(name) GMutex G_LOCK_NAME (name) #define G_LOCK_EXTERN(name) extern GMutex G_LOCK_NAME (name) #ifdef G_DEBUG_LOCKS # define G_LOCK(name) G_STMT_START{ \ g_log (G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, \ "file %s: line %d (%s): locking: %s ", \ __FILE__, __LINE__, G_STRFUNC, \ #name); \ g_mutex_lock (&G_LOCK_NAME (name)); \ }G_STMT_END # define G_UNLOCK(name) G_STMT_START{ \ g_log (G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, \ "file %s: line %d (%s): unlocking: %s ", \ __FILE__, __LINE__, G_STRFUNC, \ #name); \ g_mutex_unlock (&G_LOCK_NAME (name)); \ }G_STMT_END # define G_TRYLOCK(name) \ (g_log (G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, \ "file %s: line %d (%s): try locking: %s ", \ __FILE__, __LINE__, G_STRFUNC, \ #name), g_mutex_trylock (&G_LOCK_NAME (name))) #else /* !G_DEBUG_LOCKS */ # define G_LOCK(name) g_mutex_lock (&G_LOCK_NAME (name)) # define G_UNLOCK(name) g_mutex_unlock (&G_LOCK_NAME (name)) # 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); #ifdef G_ATOMIC_OP_MEMORY_BARRIER_NEEDED # define g_once(once, func, arg) g_once_impl ((once), (func), (arg)) #else /* !G_ATOMIC_OP_MEMORY_BARRIER_NEEDED*/ # define g_once(once, func, arg) \ (((once)->status == G_ONCE_STATUS_READY) ? \ (once)->retval : \ g_once_impl ((once), (func), (arg))) #endif /* G_ATOMIC_OP_MEMORY_BARRIER_NEEDED */ #ifdef __GNUC__ # define g_once_init_enter(location) \ (G_GNUC_EXTENSION ({ \ G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer)); \ (void) (0 ? (gpointer) *(location) : 0); \ (!g_atomic_pointer_get (location) && \ g_once_init_enter (location)); \ })) # define g_once_init_leave(location, result) \ (G_GNUC_EXTENSION ({ \ G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer)); \ (void) (0 ? *(location) = (result) : 0); \ g_once_init_leave ((location), (gsize) (result)); \ })) #else # define g_once_init_enter(location) \ (g_once_init_enter((location))) # define g_once_init_leave(location, result) \ (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__ */ pkg-config-0.29.1/glib/glib/ghostutils.h0000664000175000017500000000276512651243552015001 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 2008 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_HOST_UTILS_H__ #define __G_HOST_UTILS_H__ #if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) #error "Only can be included directly." #endif #include 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 #endif /* __G_HOST_UTILS_H__ */ pkg-config-0.29.1/glib/glib/gprimes.c0000664000175000017500000000423012275467762014237 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the GLib Team and others 1997-2000. See the AUTHORS * file for a list of people on the GLib Team. See the ChangeLog * files for a list of changes. These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/. */ /* * MT safe */ #include "config.h" #include "gprimes.h" static const guint g_primes[] = { 11, 19, 37, 73, 109, 163, 251, 367, 557, 823, 1237, 1861, 2777, 4177, 6247, 9371, 14057, 21089, 31627, 47431, 71143, 106721, 160073, 240101, 360163, 540217, 810343, 1215497, 1823231, 2734867, 4102283, 6153409, 9230113, 13845163, }; /** * g_spaced_primes_closest: * @num: a #guint * * Gets the smallest prime number from a built-in array of primes which * is larger than @num. This is used within GLib to calculate the optimum * size of a #GHashTable. * * The built-in array of primes ranges from 11 to 13845163 such that * each prime is approximately 1.5-2 times the previous prime. * * Returns: the smallest prime number from a built-in array of primes * which is larger than @num */ guint g_spaced_primes_closest (guint num) { gint i; for (i = 0; i < G_N_ELEMENTS (g_primes); i++) if (g_primes[i] > num) return g_primes[i]; return g_primes[G_N_ELEMENTS (g_primes) - 1]; } pkg-config-0.29.1/glib/glib/gdir.h0000664000175000017500000000407312651243552013513 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * gdir.c: Simplified wrapper around the DIRENT functions. * * Copyright 2001 Hans Breuer * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __G_DIR_H__ #define __G_DIR_H__ #if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) #error "Only can be included directly." #endif #include #ifdef G_OS_UNIX #include #endif G_BEGIN_DECLS typedef struct _GDir GDir; 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__ */ pkg-config-0.29.1/glib/glib/gkeyfile.h0000664000175000017500000003342712651243552014372 00000000000000/* gkeyfile.h - desktop entry file parser * * Copyright 2004 Red Hat, Inc. * * Ray Strode * * GLib is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * GLib is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with GLib; see the file COPYING.LIB. If not, * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __G_KEY_FILE_H__ #define __G_KEY_FILE_H__ #if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) #error "Only can be included directly." #endif #include G_BEGIN_DECLS typedef enum { G_KEY_FILE_ERROR_UNKNOWN_ENCODING, G_KEY_FILE_ERROR_PARSE, G_KEY_FILE_ERROR_NOT_FOUND, G_KEY_FILE_ERROR_KEY_NOT_FOUND, G_KEY_FILE_ERROR_GROUP_NOT_FOUND, G_KEY_FILE_ERROR_INVALID_VALUE } GKeyFileError; #define G_KEY_FILE_ERROR g_key_file_error_quark() GLIB_AVAILABLE_IN_ALL GQuark g_key_file_error_quark (void); typedef struct _GKeyFile GKeyFile; typedef enum { G_KEY_FILE_NONE = 0, G_KEY_FILE_KEEP_COMMENTS = 1 << 0, G_KEY_FILE_KEEP_TRANSLATIONS = 1 << 1 } GKeyFileFlags; 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); /* Defines for handling freedesktop.org Desktop files */ #define G_KEY_FILE_DESKTOP_GROUP "Desktop Entry" #define G_KEY_FILE_DESKTOP_KEY_TYPE "Type" #define G_KEY_FILE_DESKTOP_KEY_VERSION "Version" #define G_KEY_FILE_DESKTOP_KEY_NAME "Name" #define G_KEY_FILE_DESKTOP_KEY_GENERIC_NAME "GenericName" #define G_KEY_FILE_DESKTOP_KEY_NO_DISPLAY "NoDisplay" #define G_KEY_FILE_DESKTOP_KEY_COMMENT "Comment" #define G_KEY_FILE_DESKTOP_KEY_ICON "Icon" #define G_KEY_FILE_DESKTOP_KEY_HIDDEN "Hidden" #define G_KEY_FILE_DESKTOP_KEY_ONLY_SHOW_IN "OnlyShowIn" #define G_KEY_FILE_DESKTOP_KEY_NOT_SHOW_IN "NotShowIn" #define G_KEY_FILE_DESKTOP_KEY_TRY_EXEC "TryExec" #define G_KEY_FILE_DESKTOP_KEY_EXEC "Exec" #define G_KEY_FILE_DESKTOP_KEY_PATH "Path" #define G_KEY_FILE_DESKTOP_KEY_TERMINAL "Terminal" #define G_KEY_FILE_DESKTOP_KEY_MIME_TYPE "MimeType" #define G_KEY_FILE_DESKTOP_KEY_CATEGORIES "Categories" #define G_KEY_FILE_DESKTOP_KEY_STARTUP_NOTIFY "StartupNotify" #define G_KEY_FILE_DESKTOP_KEY_STARTUP_WM_CLASS "StartupWMClass" #define G_KEY_FILE_DESKTOP_KEY_URL "URL" #define G_KEY_FILE_DESKTOP_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" #define G_KEY_FILE_DESKTOP_TYPE_DIRECTORY "Directory" G_END_DECLS #endif /* __G_KEY_FILE_H__ */ pkg-config-0.29.1/glib/glib/gtester-report0000775000175000017500000004446412651243552015341 00000000000000#! /usr/bin/env python # GLib Testing Framework Utility -*- Mode: python; -*- # Copyright (C) 2007 Imendio AB # Authors: Tim Janik # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the # Free Software Foundation, Inc., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. import datetime import optparse import sys, re, xml.dom.minidom try: import subunit from subunit import iso8601 from testtools.content import Content, ContentType mime_utf8 = ContentType('text', 'plain', {'charset': 'utf8'}) except ImportError: subunit = None pkginstall_configvars = { #@PKGINSTALL_CONFIGVARS_IN24LINES@ # configvars are substituted upon script installation } # xml utilities def find_child (node, child_name): for child in node.childNodes: if child.nodeName == child_name: return child return None def list_children (node, child_name): rlist = [] for child in node.childNodes: if child.nodeName == child_name: rlist += [ child ] return rlist def find_node (node, name = None): if not node or node.nodeName == name or not name: return node for child in node.childNodes: c = find_node (child, name) if c: return c return None def node_as_text (node, name = None): if name: node = find_node (node, name) txt = '' if node: if node.nodeValue: txt += node.nodeValue for child in node.childNodes: txt += node_as_text (child) return txt def attribute_as_text (node, aname, node_name = None): node = find_node (node, node_name) if not node: return '' attr = node.attributes.get (aname, '') if hasattr (attr, 'value'): return attr.value return '' # HTML utilities def html_indent_string (n): uncollapsible_space = '  ' # HTML won't compress alternating sequences of ' ' and ' ' string = '' for i in range (0, (n + 1) / 2): string += uncollapsible_space return string # TestBinary object, instantiated per test binary in the log file class TestBinary: def __init__ (self, name): self.name = name self.testcases = [] self.duration = 0 self.success_cases = 0 self.skipped_cases = 0 self.file = '???' self.random_seed = '' # base class to handle processing/traversion of XML nodes class TreeProcess: def __init__ (self): self.nest_level = 0 def trampoline (self, node): name = node.nodeName if name == '#text': self.handle_text (node) else: try: method = getattr (self, 'handle_' + re.sub ('[^a-zA-Z0-9]', '_', name)) except: method = None if method: return method (node) else: return self.process_recursive (name, node) def process_recursive (self, node_name, node): self.process_children (node) def process_children (self, node): self.nest_level += 1 for child in node.childNodes: self.trampoline (child) self.nest_level += 1 # test report reader, this class collects some statistics and merges duplicate test binary runs class ReportReader (TreeProcess): def __init__ (self): TreeProcess.__init__ (self) self.binary_names = [] self.binaries = {} self.last_binary = None self.info = {} def binary_list (self): lst = [] for name in self.binary_names: lst += [ self.binaries[name] ] return lst def get_info (self): return self.info def handle_info (self, node): dn = find_child (node, 'package') self.info['package'] = node_as_text (dn) dn = find_child (node, 'version') self.info['version'] = node_as_text (dn) dn = find_child (node, 'revision') if dn is not None: self.info['revision'] = node_as_text (dn) def handle_testcase (self, node): self.last_binary.testcases += [ node ] result = attribute_as_text (node, 'result', 'status') if result == 'success': self.last_binary.success_cases += 1 if bool (int (attribute_as_text (node, 'skipped') + '0')): self.last_binary.skipped_cases += 1 def handle_text (self, node): pass def handle_testbinary (self, node): path = node.attributes.get ('path', None).value if self.binaries.get (path, -1) == -1: self.binaries[path] = TestBinary (path) self.binary_names += [ path ] self.last_binary = self.binaries[path] dn = find_child (node, 'duration') dur = node_as_text (dn) try: dur = float (dur) except: dur = 0 if dur: self.last_binary.duration += dur bin = find_child (node, 'binary') if bin: self.last_binary.file = attribute_as_text (bin, 'file') rseed = find_child (node, 'random-seed') if rseed: self.last_binary.random_seed = node_as_text (rseed) self.process_children (node) class ReportWriter(object): """Base class for reporting.""" def __init__(self, binary_list): self.binaries = binary_list def _error_text(self, node): """Get a string representing the error children of node.""" rlist = list_children(node, 'error') txt = '' for enode in rlist: txt += node_as_text (enode) if txt and txt[-1] != '\n': txt += '\n' return txt class HTMLReportWriter(ReportWriter): # Javascript/CSS snippet to toggle element visibility cssjs = r''' ''' def __init__ (self, info, binary_list): ReportWriter.__init__(self, binary_list) self.info = info self.bcounter = 0 self.tcounter = 0 self.total_tcounter = 0 self.total_fcounter = 0 self.total_duration = 0 self.indent_depth = 0 self.lastchar = '' def oprint (self, message): sys.stdout.write (message) if message: self.lastchar = message[-1] def handle_info (self): self.oprint ('

Package: %(package)s, version: %(version)s

\n' % self.info) if self.info['revision']: self.oprint ('
Report generated from: %(revision)s
\n' % self.info) def handle_text (self, node): self.oprint (node.nodeValue) def handle_testcase (self, node, binary): skipped = bool (int (attribute_as_text (node, 'skipped') + '0')) if skipped: return # skipped tests are uninteresting for HTML reports path = attribute_as_text (node, 'path') duration = node_as_text (node, 'duration') result = attribute_as_text (node, 'result', 'status') rcolor = { 'success': 'bgcolor="lightgreen"', 'failed': 'bgcolor="red"', }.get (result, '') if result != 'success': duration = '-' # ignore bogus durations self.oprint ('\n' % (self.bcounter, self.tcounter, result)) self.oprint ('%s %s %s \n' % (html_indent_string (4), path, duration)) perflist = list_children (node, 'performance') if result != 'success': txt = self._error_text(node) txt = re.sub (r'"', r'\\"', txt) txt = re.sub (r'\n', r'\\n', txt) txt = re.sub (r'&', r'&', txt) txt = re.sub (r'<', r'<', txt) self.oprint ('\n' % (self.bcounter, self.tcounter, txt)) self.oprint ('Details\n' % ('TestResultWindow', binary.file, binary.random_seed, path, self.bcounter, self.tcounter)) elif perflist: presults = [] for perf in perflist: pmin = bool (int (attribute_as_text (perf, 'minimize'))) pmax = bool (int (attribute_as_text (perf, 'maximize'))) pval = float (attribute_as_text (perf, 'value')) txt = node_as_text (perf) txt = re.sub (r'&', r'&', txt) txt = re.sub (r'<', r'>', txt) txt = 'Performance(' + (pmin and 'minimized' or 'maximized') + '): ' + txt.strip() + '
\n' txt = re.sub (r'"', r'\\"', txt) txt = re.sub (r'\n', r'\\n', txt) presults += [ (pval, txt) ] presults.sort() ptxt = ''.join ([e[1] for e in presults]) self.oprint ('\n' % (self.bcounter, self.tcounter, ptxt)) self.oprint ('Details\n' % ('TestResultWindow', binary.file, binary.random_seed, path, self.bcounter, self.tcounter)) else: self.oprint ('-\n') self.oprint ('%s\n' % (rcolor, result)) self.oprint ('\n') self.tcounter += 1 self.total_tcounter += 1 self.total_fcounter += result != 'success' def handle_binary (self, binary): self.tcounter = 1 self.bcounter += 1 self.total_duration += binary.duration self.oprint ('%s%f \n' % (binary.name, binary.duration)) erlink, oklink = ('', '') real_cases = len (binary.testcases) - binary.skipped_cases if binary.success_cases < real_cases: erlink = 'href="javascript:toggle_display (\'ResultTable\', \'tr\', \'b%u_\', \'failed\')"' % self.bcounter if binary.success_cases: oklink = 'href="javascript:toggle_display (\'ResultTable\', \'tr\', \'b%u_\', \'success\')"' % self.bcounter if real_cases != 0: self.oprint ('ER\n' % erlink) self.oprint ('OK\n' % oklink) self.oprint ('\n') perc = binary.success_cases * 100.0 / real_cases pcolor = { 100 : 'bgcolor="lightgreen"', 0 : 'bgcolor="red"', }.get (int (perc), 'bgcolor="yellow"') self.oprint ('%.2f%%\n' % (pcolor, perc)) self.oprint ('\n') else: self.oprint ('Empty\n') self.oprint ('\n') self.oprint ('\n') for tc in binary.testcases: self.handle_testcase (tc, binary) def handle_totals (self): self.oprint ('') self.oprint ('Totals: %u Binaries, %u Tests, %u Failed, %u Succeeded' % (self.bcounter, self.total_tcounter, self.total_fcounter, self.total_tcounter - self.total_fcounter)) self.oprint ('%f\n' % self.total_duration) self.oprint ('-\n') if self.total_tcounter != 0: perc = (self.total_tcounter - self.total_fcounter) * 100.0 / self.total_tcounter else: perc = 0.0 pcolor = { 100 : 'bgcolor="lightgreen"', 0 : 'bgcolor="red"', }.get (int (perc), 'bgcolor="yellow"') self.oprint ('%.2f%%\n' % (pcolor, perc)) self.oprint ('\n') def printout (self): self.oprint ('\n') self.oprint ('GTester Unit Test Report\n') self.oprint (self.cssjs) self.oprint ('\n') self.oprint ('\n') self.oprint ('

GTester Unit Test Report

\n') self.handle_info () self.oprint ('\n\n') self.oprint ('\n') self.oprint ('\n') self.oprint ('\n') self.oprint ('\n') self.oprint ('\n') for tb in self.binaries: self.handle_binary (tb) self.handle_totals() self.oprint ('
Program / Testcase Duration (sec)ViewResult
\n') self.oprint ('\n') self.oprint ('\n') class SubunitWriter(ReportWriter): """Reporter to output a subunit stream.""" def printout(self): reporter = subunit.TestProtocolClient(sys.stdout) for binary in self.binaries: for tc in binary.testcases: test = GTestCase(tc, binary) test.run(reporter) 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'.""" self._case = case self._binary = binary # the name of the case - e.g. /dbusmenu/glib/objects/menuitem/props_boolstr self._path = attribute_as_text(self._case, 'path') def id(self): """What test is this? Returns the gtester path for the testcase.""" return self._path def _get_details(self): """Calculate a details dict for the test - attachments etc.""" details = {} result = attribute_as_text(self._case, 'result', 'status') details['filename'] = Content(mime_utf8, lambda:[self._binary.file]) details['random_seed'] = Content(mime_utf8, lambda:[self._binary.random_seed]) if self._get_outcome() == 'addFailure': # Extract the error details. Skips have no details because its not # skip like unittest does, instead the runner just bypasses N test. txt = self._error_text(self._case) details['error'] = Content(mime_utf8, lambda:[txt]) if self._get_outcome() == 'addSuccess': # Sucessful tests may have performance metrics. perflist = list_children(self._case, 'performance') if perflist: presults = [] for perf in perflist: pmin = bool (int (attribute_as_text (perf, 'minimize'))) pmax = bool (int (attribute_as_text (perf, 'maximize'))) pval = float (attribute_as_text (perf, 'value')) txt = node_as_text (perf) txt = 'Performance(' + (pmin and 'minimized' or 'maximized' ) + '): ' + txt.strip() + '\n' presults += [(pval, txt)] presults.sort() perf_details = [e[1] for e in presults] details['performance'] = Content(mime_utf8, lambda:perf_details) return details def _get_outcome(self): if int(attribute_as_text(self._case, 'skipped') + '0'): return 'addSkip' outcome = attribute_as_text(self._case, 'result', 'status') if outcome == 'success': return 'addSuccess' else: return 'addFailure' def run(self, result): time = datetime.datetime.utcnow().replace(tzinfo=iso8601.Utc()) result.time(time) result.startTest(self) try: outcome = self._get_outcome() details = self._get_details() # Only provide a duration IFF outcome == 'addSuccess' - the main # parser claims bogus results otherwise: in that case emit time as # zero perhaps. if outcome == 'addSuccess': duration = float(node_as_text(self._case, 'duration')) duration = duration * 1000000 timedelta = datetime.timedelta(0, 0, duration) time = time + timedelta result.time(time) getattr(result, outcome)(self, details=details) finally: result.stopTest(self) # main program handling def parse_opts(): """Parse program options. :return: An options object and the program arguments. """ parser = optparse.OptionParser() parser.version = pkginstall_configvars.get ('glib-version', '0.0-uninstalled') parser.usage = "%prog [OPTIONS] " parser.description = "Generate HTML reports from the XML log files generated by gtester." parser.epilog = "gtester-report (GLib utils) version %s."% (parser.version,) parser.add_option("-v", "--version", action="store_true", dest="version", default=False, help="Show program version.") parser.add_option("-s", "--subunit", action="store_true", dest="subunit", default=False, help="Output subunit [See https://launchpad.net/subunit/" " Needs python-subunit]") options, files = parser.parse_args() if options.version: print parser.epilog return None, None if len(files) != 1: parser.error("Must supply a log file to parse.") if options.subunit and subunit is None: parser.error("python-subunit is not installed.") return options, files def main(): options, files = parse_opts() if options is None: return 0 xd = xml.dom.minidom.parse (files[0]) rr = ReportReader() rr.trampoline (xd) if not options.subunit: HTMLReportWriter(rr.get_info(), rr.binary_list()).printout() else: SubunitWriter(rr.get_info(), rr.binary_list()).printout() if __name__ == '__main__': main() pkg-config-0.29.1/glib/glib/gunidecomp.h0000664000175000017500000220246512651243552014727 00000000000000/* This file is automatically generated. DO NOT EDIT! */ #ifndef DECOMP_H #define DECOMP_H #define G_UNICODE_LAST_CHAR 0x10ffff #define G_UNICODE_MAX_TABLE_INDEX (0x110000 / 256) #define G_UNICODE_LAST_CHAR_PART1 0x2FAFF #define G_UNICODE_LAST_PAGE_PART1 762 #define G_UNICODE_NOT_PRESENT_OFFSET 65535 static const guchar cclass_data[][256] = { { /* page 3, index 0 */ 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 232, 220, 220, 220, 220, 232, 216, 220, 220, 220, 220, 220, 202, 202, 220, 220, 220, 220, 202, 202, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 1, 1, 1, 1, 1, 220, 220, 220, 220, 230, 230, 230, 230, 230, 230, 230, 230, 240, 230, 220, 220, 220, 230, 230, 230, 220, 220, 0, 230, 230, 230, 220, 220, 220, 220, 230, 232, 220, 220, 230, 233, 234, 234, 233, 234, 234, 233, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 4, index 1 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 5, index 2 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 230, 230, 230, 230, 220, 230, 230, 230, 222, 220, 230, 230, 230, 230, 230, 230, 220, 220, 220, 220, 220, 220, 230, 230, 220, 230, 230, 222, 228, 230, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 19, 20, 21, 22, 0, 23, 0, 24, 25, 0, 230, 220, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 6, index 3 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 230, 230, 230, 230, 230, 30, 31, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 28, 29, 30, 31, 32, 33, 34, 230, 230, 220, 220, 230, 230, 230, 230, 230, 220, 230, 230, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 230, 230, 230, 230, 0, 0, 230, 230, 230, 230, 220, 230, 0, 0, 230, 230, 0, 220, 230, 230, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 7, index 4 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 220, 230, 230, 220, 230, 230, 220, 220, 220, 230, 220, 220, 230, 220, 230, 230, 230, 220, 230, 220, 230, 220, 230, 220, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 230, 230, 230, 230, 220, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 8, index 5 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 230, 0, 230, 230, 230, 230, 230, 230, 230, 230, 230, 0, 230, 230, 230, 0, 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, 220, 220, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 230, 220, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 10, index 7 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 11, index 8 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 12, index 9 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 84, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 13, index 10 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 14, index 11 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 103, 103, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 107, 107, 107, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 118, 118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 122, 122, 122, 122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 15, index 12 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 220, 0, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 130, 0, 132, 0, 0, 0, 0, 0, 130, 130, 130, 130, 0, 0, 130, 0, 230, 230, 9, 0, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 16, index 13 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 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, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 19, index 14 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 23, index 15 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 24, index 16 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 25, index 17 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 222, 230, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 26, index 18 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 230, 230, 230, 230, 230, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 27, index 19 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 220, 230, 230, 230, 230, 230, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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 }, { /* page 28, index 20 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 220, 230, 230, 230, 230, 230, 230, 230, 220, 230, 230, 234, 214, 220, 202, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 233, 220, 230, 220 }, { /* page 32, index 22 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 1, 1, 230, 230, 230, 230, 1, 1, 1, 230, 230, 0, 0, 0, 0, 230, 0, 0, 0, 1, 1, 230, 220, 230, 1, 1, 220, 220, 220, 220, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 44, index 23 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 45, index 24 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230 }, { /* page 48, index 25 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 218, 228, 232, 222, 224, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 166, index 26 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 169, index 28 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 220, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 7, 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 170, index 29 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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 }, { /* page 251, index 31 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 254, index 32 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 230, 230, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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 257, index 33 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0 }, { /* page 266, index 34 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 1, 220, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 272, index 35 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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 }, { /* 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 216, 216, 1, 1, 1, 0, 0, 0, 226, 216, 216, 216, 216, 216, 0, 0, 0, 0, 0, 0, 0, 0, 220, 220, 220, 220, 220, 220, 220, 220, 0, 0, 230, 230, 230, 230, 230, 220, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 466, index 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }; static const gint16 combining_class_table_part1[763] = { 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 /* page 3 */, 1 /* page 4 */, 2 /* page 5 */, 3 /* page 6 */, 4 /* page 7 */, 5 /* page 8 */, 6 /* page 9 */, 7 /* page 10 */, 8 /* page 11 */, 9 /* page 12 */, 10 /* page 13 */, 11 /* page 14 */, 12 /* page 15 */, 13 /* page 16 */, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 14 /* page 19 */, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 15 /* page 23 */, 16 /* page 24 */, 17 /* page 25 */, 18 /* page 26 */, 19 /* page 27 */, 20 /* page 28 */, 21 /* page 29 */, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 22 /* page 32 */, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 23 /* page 44 */, 24 /* page 45 */, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 25 /* page 48 */, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 26 /* page 166 */, 0 + G_UNICODE_MAX_TABLE_INDEX, 27 /* page 168 */, 28 /* page 169 */, 29 /* page 170 */, 30 /* page 171 */, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 31 /* page 251 */, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 32 /* page 254 */, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 33 /* page 257 */, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 34 /* page 266 */, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 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, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 38 /* page 465 */, 39 /* page 466 */, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX }; static const gint16 combining_class_table_part2[768] = { 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX, 0 + G_UNICODE_MAX_TABLE_INDEX }; typedef struct { gunichar ch; guint16 canon_offset; guint16 compat_offset; } decomposition; static const decomposition decomp_table[] = { { 0x00a0, G_UNICODE_NOT_PRESENT_OFFSET, 0 }, { 0x00a8, G_UNICODE_NOT_PRESENT_OFFSET, 2 }, { 0x00aa, G_UNICODE_NOT_PRESENT_OFFSET, 6 }, { 0x00af, G_UNICODE_NOT_PRESENT_OFFSET, 8 }, { 0x00b2, G_UNICODE_NOT_PRESENT_OFFSET, 12 }, { 0x00b3, G_UNICODE_NOT_PRESENT_OFFSET, 14 }, { 0x00b4, G_UNICODE_NOT_PRESENT_OFFSET, 16 }, { 0x00b5, G_UNICODE_NOT_PRESENT_OFFSET, 20 }, { 0x00b8, G_UNICODE_NOT_PRESENT_OFFSET, 23 }, { 0x00b9, G_UNICODE_NOT_PRESENT_OFFSET, 27 }, { 0x00ba, G_UNICODE_NOT_PRESENT_OFFSET, 29 }, { 0x00bc, G_UNICODE_NOT_PRESENT_OFFSET, 31 }, { 0x00bd, G_UNICODE_NOT_PRESENT_OFFSET, 37 }, { 0x00be, G_UNICODE_NOT_PRESENT_OFFSET, 43 }, { 0x00c0, 49, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x00c1, 53, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x00c2, 57, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x00c3, 61, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x00c4, 65, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x00c5, 69, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x00c7, 73, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x00c8, 77, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x00c9, 81, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x00ca, 85, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x00cb, 89, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x00cc, 93, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x00cd, 97, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x00ce, 101, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x00cf, 105, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x00d1, 109, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x00d2, 113, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x00d3, 117, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x00d4, 121, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x00d5, 125, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x00d6, 129, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x00d9, 133, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x00da, 137, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x00db, 141, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x00dc, 145, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x00dd, 149, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x00e0, 153, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x00e1, 157, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x00e2, 161, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x00e3, 165, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x00e4, 169, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x00e5, 173, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x00e7, 177, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x00e8, 181, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x00e9, 185, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x00ea, 189, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x00eb, 193, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x00ec, 197, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x00ed, 201, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x00ee, 205, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x00ef, 209, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x00f1, 213, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x00f2, 217, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x00f3, 221, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x00f4, 225, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x00f5, 229, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x00f6, 233, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x00f9, 237, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x00fa, 241, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x00fb, 245, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x00fc, 249, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x00fd, 253, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x00ff, 257, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0100, 261, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0101, 265, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0102, 269, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0103, 273, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0104, 277, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0105, 281, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0106, 285, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0107, 289, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0108, 293, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0109, 297, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x010a, 301, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x010b, 305, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x010c, 309, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x010d, 313, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x010e, 317, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x010f, 321, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0112, 325, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0113, 329, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0114, 333, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0115, 337, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0116, 341, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0117, 345, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0118, 349, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0119, 353, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x011a, 357, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x011b, 361, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x011c, 365, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x011d, 369, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x011e, 373, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x011f, 377, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0120, 381, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0121, 385, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0122, 389, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0123, 393, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0124, 397, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0125, 401, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0128, 405, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0129, 409, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x012a, 413, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x012b, 417, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x012c, 421, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x012d, 425, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x012e, 429, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x012f, 433, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0130, 437, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0132, G_UNICODE_NOT_PRESENT_OFFSET, 441 }, { 0x0133, G_UNICODE_NOT_PRESENT_OFFSET, 444 }, { 0x0134, 447, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0135, 451, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0136, 455, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0137, 459, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0139, 463, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x013a, 467, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x013b, 471, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x013c, 475, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x013d, 479, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x013e, 483, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x013f, G_UNICODE_NOT_PRESENT_OFFSET, 487 }, { 0x0140, G_UNICODE_NOT_PRESENT_OFFSET, 491 }, { 0x0143, 495, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0144, 499, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0145, 503, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0146, 507, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0147, 511, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0148, 515, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0149, G_UNICODE_NOT_PRESENT_OFFSET, 519 }, { 0x014c, 523, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x014d, 527, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x014e, 531, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x014f, 535, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0150, 539, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0151, 543, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0154, 547, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0155, 551, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0156, 555, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0157, 559, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0158, 563, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0159, 567, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x015a, 571, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x015b, 575, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x015c, 579, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x015d, 583, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x015e, 587, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x015f, 591, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0160, 595, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0161, 599, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0162, 603, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0163, 607, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0164, 611, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0165, 615, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0168, 619, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0169, 623, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x016a, 627, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x016b, 631, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x016c, 635, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x016d, 639, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x016e, 643, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x016f, 647, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0170, 651, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0171, 655, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0172, 659, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0173, 663, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0174, 667, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0175, 671, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0176, 675, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0177, 679, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0178, 683, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0179, 687, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x017a, 691, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x017b, 695, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x017c, 699, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x017d, 703, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x017e, 707, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x017f, G_UNICODE_NOT_PRESENT_OFFSET, 711 }, { 0x01a0, 713, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x01a1, 717, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x01af, 721, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x01b0, 725, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x01c4, G_UNICODE_NOT_PRESENT_OFFSET, 729 }, { 0x01c5, G_UNICODE_NOT_PRESENT_OFFSET, 734 }, { 0x01c6, G_UNICODE_NOT_PRESENT_OFFSET, 739 }, { 0x01c7, G_UNICODE_NOT_PRESENT_OFFSET, 744 }, { 0x01c8, G_UNICODE_NOT_PRESENT_OFFSET, 747 }, { 0x01c9, G_UNICODE_NOT_PRESENT_OFFSET, 750 }, { 0x01ca, G_UNICODE_NOT_PRESENT_OFFSET, 753 }, { 0x01cb, G_UNICODE_NOT_PRESENT_OFFSET, 756 }, { 0x01cc, G_UNICODE_NOT_PRESENT_OFFSET, 759 }, { 0x01cd, 762, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x01ce, 766, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x01cf, 770, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x01d0, 774, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x01d1, 778, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x01d2, 782, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x01d3, 786, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x01d4, 790, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x01d5, 794, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x01d6, 800, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x01d7, 806, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x01d8, 812, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x01d9, 818, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x01da, 824, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x01db, 830, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x01dc, 836, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x01de, 842, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x01df, 848, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x01e0, 854, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x01e1, 860, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x01e2, 866, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x01e3, 871, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x01e6, 876, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x01e7, 880, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x01e8, 884, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x01e9, 888, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x01ea, 892, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x01eb, 896, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x01ec, 900, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x01ed, 906, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x01ee, 912, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x01ef, 917, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x01f0, 922, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x01f1, G_UNICODE_NOT_PRESENT_OFFSET, 926 }, { 0x01f2, G_UNICODE_NOT_PRESENT_OFFSET, 929 }, { 0x01f3, G_UNICODE_NOT_PRESENT_OFFSET, 932 }, { 0x01f4, 935, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x01f5, 939, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x01f8, 943, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x01f9, 947, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x01fa, 951, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x01fb, 957, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x01fc, 963, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x01fd, 968, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x01fe, 973, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x01ff, 978, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0200, 983, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0201, 987, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0202, 991, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0203, 995, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0204, 999, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0205, 1003, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0206, 1007, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0207, 1011, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0208, 1015, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0209, 1019, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x020a, 1023, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x020b, 1027, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x020c, 1031, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x020d, 1035, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x020e, 1039, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x020f, 1043, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0210, 1047, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0211, 1051, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0212, 1055, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0213, 1059, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0214, 1063, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0215, 1067, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0216, 1071, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0217, 1075, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0218, 1079, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0219, 1083, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x021a, 1087, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x021b, 1091, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x021e, 1095, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x021f, 1099, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0226, 1103, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0227, 1107, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0228, 1111, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0229, 1115, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x022a, 1119, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x022b, 1125, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x022c, 1131, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x022d, 1137, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x022e, 1143, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x022f, 1147, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0230, 1151, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0231, 1157, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0232, 1163, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0233, 1167, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x02b0, G_UNICODE_NOT_PRESENT_OFFSET, 1171 }, { 0x02b1, G_UNICODE_NOT_PRESENT_OFFSET, 1173 }, { 0x02b2, G_UNICODE_NOT_PRESENT_OFFSET, 1176 }, { 0x02b3, G_UNICODE_NOT_PRESENT_OFFSET, 1178 }, { 0x02b4, G_UNICODE_NOT_PRESENT_OFFSET, 1180 }, { 0x02b5, G_UNICODE_NOT_PRESENT_OFFSET, 1183 }, { 0x02b6, G_UNICODE_NOT_PRESENT_OFFSET, 1186 }, { 0x02b7, G_UNICODE_NOT_PRESENT_OFFSET, 1189 }, { 0x02b8, G_UNICODE_NOT_PRESENT_OFFSET, 1191 }, { 0x02d8, G_UNICODE_NOT_PRESENT_OFFSET, 1193 }, { 0x02d9, G_UNICODE_NOT_PRESENT_OFFSET, 1197 }, { 0x02da, G_UNICODE_NOT_PRESENT_OFFSET, 1201 }, { 0x02db, G_UNICODE_NOT_PRESENT_OFFSET, 1205 }, { 0x02dc, G_UNICODE_NOT_PRESENT_OFFSET, 1209 }, { 0x02dd, G_UNICODE_NOT_PRESENT_OFFSET, 1213 }, { 0x02e0, G_UNICODE_NOT_PRESENT_OFFSET, 1217 }, { 0x02e1, G_UNICODE_NOT_PRESENT_OFFSET, 1220 }, { 0x02e2, G_UNICODE_NOT_PRESENT_OFFSET, 711 }, { 0x02e3, G_UNICODE_NOT_PRESENT_OFFSET, 1222 }, { 0x02e4, G_UNICODE_NOT_PRESENT_OFFSET, 1224 }, { 0x0340, 1227, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0341, 1230, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0343, 1233, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0344, 1236, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0374, 1241, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x037a, G_UNICODE_NOT_PRESENT_OFFSET, 1244 }, { 0x037e, 1248, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0384, G_UNICODE_NOT_PRESENT_OFFSET, 16 }, { 0x0385, 1250, 1255 }, { 0x0386, 1261, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0387, 1266, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0388, 1269, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0389, 1274, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x038a, 1279, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x038c, 1284, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x038e, 1289, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x038f, 1294, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0390, 1299, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x03aa, 1306, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x03ab, 1311, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x03ac, 1316, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x03ad, 1321, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x03ae, 1326, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x03af, 1331, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x03b0, 1336, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x03ca, 1343, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x03cb, 1348, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x03cc, 1353, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x03cd, 1358, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x03ce, 1363, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x03d0, G_UNICODE_NOT_PRESENT_OFFSET, 1368 }, { 0x03d1, G_UNICODE_NOT_PRESENT_OFFSET, 1371 }, { 0x03d2, G_UNICODE_NOT_PRESENT_OFFSET, 1374 }, { 0x03d3, 1377, 1289 }, { 0x03d4, 1382, 1311 }, { 0x03d5, G_UNICODE_NOT_PRESENT_OFFSET, 1387 }, { 0x03d6, G_UNICODE_NOT_PRESENT_OFFSET, 1390 }, { 0x03f0, G_UNICODE_NOT_PRESENT_OFFSET, 1393 }, { 0x03f1, G_UNICODE_NOT_PRESENT_OFFSET, 1396 }, { 0x03f2, G_UNICODE_NOT_PRESENT_OFFSET, 1399 }, { 0x03f4, G_UNICODE_NOT_PRESENT_OFFSET, 1402 }, { 0x03f5, G_UNICODE_NOT_PRESENT_OFFSET, 1405 }, { 0x03f9, G_UNICODE_NOT_PRESENT_OFFSET, 1408 }, { 0x0400, 1411, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0401, 1416, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0403, 1421, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0407, 1426, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x040c, 1431, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x040d, 1436, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x040e, 1441, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0419, 1446, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0439, 1451, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0450, 1456, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0451, 1461, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0453, 1466, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0457, 1471, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x045c, 1476, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x045d, 1481, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x045e, 1486, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0476, 1491, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0477, 1496, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x04c1, 1501, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x04c2, 1506, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x04d0, 1511, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x04d1, 1516, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x04d2, 1521, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x04d3, 1526, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x04d6, 1531, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x04d7, 1536, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x04da, 1541, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x04db, 1546, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x04dc, 1551, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x04dd, 1556, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x04de, 1561, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x04df, 1566, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x04e2, 1571, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x04e3, 1576, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x04e4, 1581, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x04e5, 1586, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x04e6, 1591, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x04e7, 1596, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x04ea, 1601, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x04eb, 1606, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x04ec, 1611, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x04ed, 1616, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x04ee, 1621, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x04ef, 1626, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x04f0, 1631, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x04f1, 1636, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x04f2, 1641, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x04f3, 1646, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x04f4, 1651, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x04f5, 1656, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x04f8, 1661, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x04f9, 1666, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0587, G_UNICODE_NOT_PRESENT_OFFSET, 1671 }, { 0x0622, 1676, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0623, 1681, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0624, 1686, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0625, 1691, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0626, 1696, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0675, G_UNICODE_NOT_PRESENT_OFFSET, 1701 }, { 0x0676, G_UNICODE_NOT_PRESENT_OFFSET, 1706 }, { 0x0677, G_UNICODE_NOT_PRESENT_OFFSET, 1711 }, { 0x0678, G_UNICODE_NOT_PRESENT_OFFSET, 1716 }, { 0x06c0, 1721, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x06c2, 1726, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x06d3, 1731, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0929, 1736, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0931, 1743, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0934, 1750, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0958, 1757, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0959, 1764, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x095a, 1771, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x095b, 1778, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x095c, 1785, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x095d, 1792, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x095e, 1799, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x095f, 1806, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x09cb, 1813, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x09cc, 1820, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x09dc, 1827, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x09dd, 1834, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x09df, 1841, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0a33, 1848, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0a36, 1855, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0a59, 1862, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0a5a, 1869, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0a5b, 1876, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0a5e, 1883, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0b48, 1890, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0b4b, 1897, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0b4c, 1904, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0b5c, 1911, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0b5d, 1918, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0b94, 1925, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0bca, 1932, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0bcb, 1939, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0bcc, 1946, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0c48, 1953, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0cc0, 1960, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0cc7, 1967, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0cc8, 1974, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0cca, 1981, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0ccb, 1988, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0d4a, 1998, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0d4b, 2005, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0d4c, 2012, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0dda, 2019, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0ddc, 2026, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0ddd, 2033, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0dde, 2043, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0e33, G_UNICODE_NOT_PRESENT_OFFSET, 2050 }, { 0x0eb3, G_UNICODE_NOT_PRESENT_OFFSET, 2057 }, { 0x0edc, G_UNICODE_NOT_PRESENT_OFFSET, 2064 }, { 0x0edd, G_UNICODE_NOT_PRESENT_OFFSET, 2071 }, { 0x0f0c, G_UNICODE_NOT_PRESENT_OFFSET, 2078 }, { 0x0f43, 2082, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0f4d, 2089, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0f52, 2096, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0f57, 2103, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0f5c, 2110, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0f69, 2117, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0f73, 2124, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0f75, 2131, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0f76, 2138, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0f77, G_UNICODE_NOT_PRESENT_OFFSET, 2145 }, { 0x0f78, 2155, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0f79, G_UNICODE_NOT_PRESENT_OFFSET, 2162 }, { 0x0f81, 2172, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0f93, 2179, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0f9d, 2186, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0fa2, 2193, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0fa7, 2200, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0fac, 2207, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x0fb9, 2214, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1026, 2221, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x10fc, G_UNICODE_NOT_PRESENT_OFFSET, 2228 }, { 0x1b06, 2232, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1b08, 2239, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1b0a, 2246, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1b0c, 2253, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1b0e, 2260, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1b12, 2267, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1b3b, 2274, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1b3d, 2281, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1b40, 2288, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1b41, 2295, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1b43, 2302, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1d2c, G_UNICODE_NOT_PRESENT_OFFSET, 2309 }, { 0x1d2d, G_UNICODE_NOT_PRESENT_OFFSET, 2311 }, { 0x1d2e, G_UNICODE_NOT_PRESENT_OFFSET, 2314 }, { 0x1d30, G_UNICODE_NOT_PRESENT_OFFSET, 2316 }, { 0x1d31, G_UNICODE_NOT_PRESENT_OFFSET, 2318 }, { 0x1d32, G_UNICODE_NOT_PRESENT_OFFSET, 2320 }, { 0x1d33, G_UNICODE_NOT_PRESENT_OFFSET, 2323 }, { 0x1d34, G_UNICODE_NOT_PRESENT_OFFSET, 2325 }, { 0x1d35, G_UNICODE_NOT_PRESENT_OFFSET, 2327 }, { 0x1d36, G_UNICODE_NOT_PRESENT_OFFSET, 2329 }, { 0x1d37, G_UNICODE_NOT_PRESENT_OFFSET, 2331 }, { 0x1d38, G_UNICODE_NOT_PRESENT_OFFSET, 2333 }, { 0x1d39, G_UNICODE_NOT_PRESENT_OFFSET, 2335 }, { 0x1d3a, G_UNICODE_NOT_PRESENT_OFFSET, 2337 }, { 0x1d3c, G_UNICODE_NOT_PRESENT_OFFSET, 2339 }, { 0x1d3d, G_UNICODE_NOT_PRESENT_OFFSET, 2341 }, { 0x1d3e, G_UNICODE_NOT_PRESENT_OFFSET, 2344 }, { 0x1d3f, G_UNICODE_NOT_PRESENT_OFFSET, 2346 }, { 0x1d40, G_UNICODE_NOT_PRESENT_OFFSET, 2348 }, { 0x1d41, G_UNICODE_NOT_PRESENT_OFFSET, 2350 }, { 0x1d42, G_UNICODE_NOT_PRESENT_OFFSET, 2352 }, { 0x1d43, G_UNICODE_NOT_PRESENT_OFFSET, 6 }, { 0x1d44, G_UNICODE_NOT_PRESENT_OFFSET, 2354 }, { 0x1d45, G_UNICODE_NOT_PRESENT_OFFSET, 2357 }, { 0x1d46, G_UNICODE_NOT_PRESENT_OFFSET, 2360 }, { 0x1d47, G_UNICODE_NOT_PRESENT_OFFSET, 2364 }, { 0x1d48, G_UNICODE_NOT_PRESENT_OFFSET, 2366 }, { 0x1d49, G_UNICODE_NOT_PRESENT_OFFSET, 2368 }, { 0x1d4a, G_UNICODE_NOT_PRESENT_OFFSET, 2370 }, { 0x1d4b, G_UNICODE_NOT_PRESENT_OFFSET, 2373 }, { 0x1d4c, G_UNICODE_NOT_PRESENT_OFFSET, 2376 }, { 0x1d4d, G_UNICODE_NOT_PRESENT_OFFSET, 2379 }, { 0x1d4f, G_UNICODE_NOT_PRESENT_OFFSET, 2381 }, { 0x1d50, G_UNICODE_NOT_PRESENT_OFFSET, 2383 }, { 0x1d51, G_UNICODE_NOT_PRESENT_OFFSET, 2385 }, { 0x1d52, G_UNICODE_NOT_PRESENT_OFFSET, 29 }, { 0x1d53, G_UNICODE_NOT_PRESENT_OFFSET, 2388 }, { 0x1d54, G_UNICODE_NOT_PRESENT_OFFSET, 2391 }, { 0x1d55, G_UNICODE_NOT_PRESENT_OFFSET, 2395 }, { 0x1d56, G_UNICODE_NOT_PRESENT_OFFSET, 2399 }, { 0x1d57, G_UNICODE_NOT_PRESENT_OFFSET, 2401 }, { 0x1d58, G_UNICODE_NOT_PRESENT_OFFSET, 2403 }, { 0x1d59, G_UNICODE_NOT_PRESENT_OFFSET, 2405 }, { 0x1d5a, G_UNICODE_NOT_PRESENT_OFFSET, 2409 }, { 0x1d5b, G_UNICODE_NOT_PRESENT_OFFSET, 2412 }, { 0x1d5c, G_UNICODE_NOT_PRESENT_OFFSET, 2414 }, { 0x1d5d, G_UNICODE_NOT_PRESENT_OFFSET, 1368 }, { 0x1d5e, G_UNICODE_NOT_PRESENT_OFFSET, 2418 }, { 0x1d5f, G_UNICODE_NOT_PRESENT_OFFSET, 2421 }, { 0x1d60, G_UNICODE_NOT_PRESENT_OFFSET, 1387 }, { 0x1d61, G_UNICODE_NOT_PRESENT_OFFSET, 2424 }, { 0x1d62, G_UNICODE_NOT_PRESENT_OFFSET, 2427 }, { 0x1d63, G_UNICODE_NOT_PRESENT_OFFSET, 1178 }, { 0x1d64, G_UNICODE_NOT_PRESENT_OFFSET, 2403 }, { 0x1d65, G_UNICODE_NOT_PRESENT_OFFSET, 2412 }, { 0x1d66, G_UNICODE_NOT_PRESENT_OFFSET, 1368 }, { 0x1d67, G_UNICODE_NOT_PRESENT_OFFSET, 2418 }, { 0x1d68, G_UNICODE_NOT_PRESENT_OFFSET, 1396 }, { 0x1d69, G_UNICODE_NOT_PRESENT_OFFSET, 1387 }, { 0x1d6a, G_UNICODE_NOT_PRESENT_OFFSET, 2424 }, { 0x1d78, G_UNICODE_NOT_PRESENT_OFFSET, 2429 }, { 0x1d9b, G_UNICODE_NOT_PRESENT_OFFSET, 2432 }, { 0x1d9c, G_UNICODE_NOT_PRESENT_OFFSET, 2435 }, { 0x1d9d, G_UNICODE_NOT_PRESENT_OFFSET, 2437 }, { 0x1d9e, G_UNICODE_NOT_PRESENT_OFFSET, 2440 }, { 0x1d9f, G_UNICODE_NOT_PRESENT_OFFSET, 2376 }, { 0x1da0, G_UNICODE_NOT_PRESENT_OFFSET, 2443 }, { 0x1da1, G_UNICODE_NOT_PRESENT_OFFSET, 2445 }, { 0x1da2, G_UNICODE_NOT_PRESENT_OFFSET, 2448 }, { 0x1da3, G_UNICODE_NOT_PRESENT_OFFSET, 2451 }, { 0x1da4, G_UNICODE_NOT_PRESENT_OFFSET, 2454 }, { 0x1da5, G_UNICODE_NOT_PRESENT_OFFSET, 2457 }, { 0x1da6, G_UNICODE_NOT_PRESENT_OFFSET, 2460 }, { 0x1da7, G_UNICODE_NOT_PRESENT_OFFSET, 2463 }, { 0x1da8, G_UNICODE_NOT_PRESENT_OFFSET, 2467 }, { 0x1da9, G_UNICODE_NOT_PRESENT_OFFSET, 2470 }, { 0x1daa, G_UNICODE_NOT_PRESENT_OFFSET, 2473 }, { 0x1dab, G_UNICODE_NOT_PRESENT_OFFSET, 2477 }, { 0x1dac, G_UNICODE_NOT_PRESENT_OFFSET, 2480 }, { 0x1dad, G_UNICODE_NOT_PRESENT_OFFSET, 2483 }, { 0x1dae, G_UNICODE_NOT_PRESENT_OFFSET, 2486 }, { 0x1daf, G_UNICODE_NOT_PRESENT_OFFSET, 2489 }, { 0x1db0, G_UNICODE_NOT_PRESENT_OFFSET, 2492 }, { 0x1db1, G_UNICODE_NOT_PRESENT_OFFSET, 2495 }, { 0x1db2, G_UNICODE_NOT_PRESENT_OFFSET, 2498 }, { 0x1db3, G_UNICODE_NOT_PRESENT_OFFSET, 2501 }, { 0x1db4, G_UNICODE_NOT_PRESENT_OFFSET, 2504 }, { 0x1db5, G_UNICODE_NOT_PRESENT_OFFSET, 2507 }, { 0x1db6, G_UNICODE_NOT_PRESENT_OFFSET, 2510 }, { 0x1db7, G_UNICODE_NOT_PRESENT_OFFSET, 2513 }, { 0x1db8, G_UNICODE_NOT_PRESENT_OFFSET, 2516 }, { 0x1db9, G_UNICODE_NOT_PRESENT_OFFSET, 2520 }, { 0x1dba, G_UNICODE_NOT_PRESENT_OFFSET, 2523 }, { 0x1dbb, G_UNICODE_NOT_PRESENT_OFFSET, 2526 }, { 0x1dbc, G_UNICODE_NOT_PRESENT_OFFSET, 2528 }, { 0x1dbd, G_UNICODE_NOT_PRESENT_OFFSET, 2531 }, { 0x1dbe, G_UNICODE_NOT_PRESENT_OFFSET, 2534 }, { 0x1dbf, G_UNICODE_NOT_PRESENT_OFFSET, 1371 }, { 0x1e00, 2537, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e01, 2541, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e02, 2545, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e03, 2549, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e04, 2553, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e05, 2557, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e06, 2561, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e07, 2565, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e08, 2569, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e09, 2575, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e0a, 2581, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e0b, 2585, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e0c, 2589, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e0d, 2593, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e0e, 2597, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e0f, 2601, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e10, 2605, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e11, 2609, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e12, 2613, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e13, 2617, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e14, 2621, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e15, 2627, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e16, 2633, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e17, 2639, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e18, 2645, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e19, 2649, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e1a, 2653, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e1b, 2657, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e1c, 2661, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e1d, 2667, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e1e, 2673, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e1f, 2677, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e20, 2681, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e21, 2685, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e22, 2689, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e23, 2693, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e24, 2697, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e25, 2701, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e26, 2705, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e27, 2709, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e28, 2713, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e29, 2717, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e2a, 2721, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e2b, 2725, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e2c, 2729, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e2d, 2733, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e2e, 2737, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e2f, 2743, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e30, 2749, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e31, 2753, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e32, 2757, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e33, 2761, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e34, 2765, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e35, 2769, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e36, 2773, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e37, 2777, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e38, 2781, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e39, 2787, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e3a, 2793, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e3b, 2797, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e3c, 2801, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e3d, 2805, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e3e, 2809, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e3f, 2813, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e40, 2817, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e41, 2821, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e42, 2825, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e43, 2829, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e44, 2833, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e45, 2837, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e46, 2841, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e47, 2845, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e48, 2849, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e49, 2853, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e4a, 2857, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e4b, 2861, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e4c, 2865, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e4d, 2871, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e4e, 2877, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e4f, 2883, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e50, 2889, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e51, 2895, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e52, 2901, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e53, 2907, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e54, 2913, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e55, 2917, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e56, 2921, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e57, 2925, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e58, 2929, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e59, 2933, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e5a, 2937, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e5b, 2941, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e5c, 2945, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e5d, 2951, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e5e, 2957, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e5f, 2961, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e60, 2965, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e61, 2969, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e62, 2973, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e63, 2977, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e64, 2981, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e65, 2987, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e66, 2993, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e67, 2999, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e68, 3005, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e69, 3011, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e6a, 3017, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e6b, 3021, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e6c, 3025, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e6d, 3029, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e6e, 3033, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e6f, 3037, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e70, 3041, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e71, 3045, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e72, 3049, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e73, 3053, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e74, 3057, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e75, 3061, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e76, 3065, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e77, 3069, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e78, 3073, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e79, 3079, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e7a, 3085, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e7b, 3091, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e7c, 3097, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e7d, 3101, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e7e, 3105, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e7f, 3109, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e80, 3113, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e81, 3117, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e82, 3121, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e83, 3125, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e84, 3129, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e85, 3133, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e86, 3137, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e87, 3141, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e88, 3145, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e89, 3149, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e8a, 3153, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e8b, 3157, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e8c, 3161, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e8d, 3165, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e8e, 3169, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e8f, 3173, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e90, 3177, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e91, 3181, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e92, 3185, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e93, 3189, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e94, 3193, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e95, 3197, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e96, 3201, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e97, 3205, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e98, 3209, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e99, 3213, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1e9a, G_UNICODE_NOT_PRESENT_OFFSET, 3217 }, { 0x1e9b, 3221, 2969 }, { 0x1ea0, 3226, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1ea1, 3230, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1ea2, 3234, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1ea3, 3238, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1ea4, 3242, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1ea5, 3248, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1ea6, 3254, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1ea7, 3260, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1ea8, 3266, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1ea9, 3272, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1eaa, 3278, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1eab, 3284, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1eac, 3290, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1ead, 3296, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1eae, 3302, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1eaf, 3308, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1eb0, 3314, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1eb1, 3320, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1eb2, 3326, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1eb3, 3332, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1eb4, 3338, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1eb5, 3344, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1eb6, 3350, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1eb7, 3356, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1eb8, 3362, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1eb9, 3366, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1eba, 3370, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1ebb, 3374, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1ebc, 3378, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1ebd, 3382, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1ebe, 3386, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1ebf, 3392, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1ec0, 3398, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1ec1, 3404, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1ec2, 3410, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1ec3, 3416, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1ec4, 3422, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1ec5, 3428, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1ec6, 3434, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1ec7, 3440, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1ec8, 3446, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1ec9, 3450, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1eca, 3454, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1ecb, 3458, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1ecc, 3462, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1ecd, 3466, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1ece, 3470, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1ecf, 3474, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1ed0, 3478, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1ed1, 3484, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1ed2, 3490, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1ed3, 3496, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1ed4, 3502, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1ed5, 3508, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1ed6, 3514, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1ed7, 3520, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1ed8, 3526, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1ed9, 3532, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1eda, 3538, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1edb, 3544, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1edc, 3550, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1edd, 3556, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1ede, 3562, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1edf, 3568, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1ee0, 3574, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1ee1, 3580, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1ee2, 3586, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1ee3, 3592, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1ee4, 3598, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1ee5, 3602, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1ee6, 3606, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1ee7, 3610, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1ee8, 3614, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1ee9, 3620, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1eea, 3626, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1eeb, 3632, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1eec, 3638, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1eed, 3644, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1eee, 3650, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1eef, 3656, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1ef0, 3662, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1ef1, 3668, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1ef2, 3674, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1ef3, 3678, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1ef4, 3682, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1ef5, 3686, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1ef6, 3690, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1ef7, 3694, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1ef8, 3698, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1ef9, 3702, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f00, 3706, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f01, 3711, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f02, 3716, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f03, 3723, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f04, 3730, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f05, 3737, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f06, 3744, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f07, 3751, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f08, 3758, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f09, 3763, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f0a, 3768, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f0b, 3775, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f0c, 3782, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f0d, 3789, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f0e, 3796, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f0f, 3803, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f10, 3810, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f11, 3815, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f12, 3820, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f13, 3827, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f14, 3834, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f15, 3841, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f18, 3848, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f19, 3853, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f1a, 3858, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f1b, 3865, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f1c, 3872, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f1d, 3879, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f20, 3886, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f21, 3891, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f22, 3896, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f23, 3903, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f24, 3910, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f25, 3917, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f26, 3924, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f27, 3931, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f28, 3938, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f29, 3943, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f2a, 3948, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f2b, 3955, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f2c, 3962, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f2d, 3969, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f2e, 3976, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f2f, 3983, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f30, 3990, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f31, 3995, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f32, 4000, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f33, 4007, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f34, 4014, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f35, 4021, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f36, 4028, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f37, 4035, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f38, 4042, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f39, 4047, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f3a, 4052, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f3b, 4059, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f3c, 4066, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f3d, 4073, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f3e, 4080, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f3f, 4087, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f40, 4094, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f41, 4099, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f42, 4104, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f43, 4111, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f44, 4118, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f45, 4125, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f48, 4132, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f49, 4137, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f4a, 4142, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f4b, 4149, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f4c, 4156, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f4d, 4163, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f50, 4170, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f51, 4175, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f52, 4180, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f53, 4187, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f54, 4194, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f55, 4201, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f56, 4208, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f57, 4215, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f59, 4222, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f5b, 4227, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f5d, 4234, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f5f, 4241, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f60, 4248, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f61, 4253, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f62, 4258, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f63, 4265, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f64, 4272, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f65, 4279, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f66, 4286, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f67, 4293, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f68, 4300, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f69, 4305, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f6a, 4310, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f6b, 4317, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f6c, 4324, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f6d, 4331, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f6e, 4338, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f6f, 4345, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f70, 4352, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f71, 1316, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f72, 4357, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f73, 1321, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f74, 4362, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f75, 1326, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f76, 4367, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f77, 1331, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f78, 4372, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f79, 1353, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f7a, 4377, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f7b, 1358, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f7c, 4382, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f7d, 1363, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f80, 4387, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f81, 4394, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f82, 4401, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f83, 4410, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f84, 4419, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f85, 4428, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f86, 4437, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f87, 4446, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f88, 4455, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f89, 4462, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f8a, 4469, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f8b, 4478, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f8c, 4487, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f8d, 4496, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f8e, 4505, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f8f, 4514, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f90, 4523, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f91, 4530, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f92, 4537, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f93, 4546, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f94, 4555, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f95, 4564, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f96, 4573, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f97, 4582, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f98, 4591, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f99, 4598, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f9a, 4605, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f9b, 4614, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f9c, 4623, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f9d, 4632, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f9e, 4641, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1f9f, 4650, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1fa0, 4659, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1fa1, 4666, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1fa2, 4673, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1fa3, 4682, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1fa4, 4691, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1fa5, 4700, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1fa6, 4709, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1fa7, 4718, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1fa8, 4727, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1fa9, 4734, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1faa, 4741, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1fab, 4750, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1fac, 4759, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1fad, 4768, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1fae, 4777, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1faf, 4786, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1fb0, 4795, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1fb1, 4800, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1fb2, 4805, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1fb3, 4812, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1fb4, 4817, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1fb6, 4824, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1fb7, 4829, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1fb8, 4836, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1fb9, 4841, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1fba, 4846, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1fbb, 1261, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1fbc, 4851, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1fbd, G_UNICODE_NOT_PRESENT_OFFSET, 4856 }, { 0x1fbe, 4860, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1fbf, G_UNICODE_NOT_PRESENT_OFFSET, 4856 }, { 0x1fc0, G_UNICODE_NOT_PRESENT_OFFSET, 4863 }, { 0x1fc1, 4867, 4872 }, { 0x1fc2, 4878, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1fc3, 4885, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1fc4, 4890, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1fc6, 4897, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1fc7, 4902, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1fc8, 4909, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1fc9, 1269, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1fca, 4914, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1fcb, 1274, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1fcc, 4919, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1fcd, 4924, 4930 }, { 0x1fce, 4936, 4942 }, { 0x1fcf, 4948, 4954 }, { 0x1fd0, 4960, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1fd1, 4965, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1fd2, 4970, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1fd3, 1299, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1fd6, 4977, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1fd7, 4982, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1fd8, 4989, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1fd9, 4994, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1fda, 4999, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1fdb, 1279, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1fdd, 5004, 5010 }, { 0x1fde, 5016, 5022 }, { 0x1fdf, 5028, 5034 }, { 0x1fe0, 5040, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1fe1, 5045, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1fe2, 5050, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1fe3, 1336, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1fe4, 5057, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1fe5, 5062, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1fe6, 5067, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1fe7, 5072, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1fe8, 5079, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1fe9, 5084, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1fea, 5089, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1feb, 1289, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1fec, 5094, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1fed, 5099, 5104 }, { 0x1fee, 1250, 1255 }, { 0x1fef, 5110, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1ff2, 5112, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1ff3, 5119, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1ff4, 5124, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1ff6, 5131, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1ff7, 5136, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1ff8, 5143, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1ff9, 1284, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1ffa, 5148, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1ffb, 1294, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1ffc, 5153, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x1ffd, 5158, 16 }, { 0x1ffe, G_UNICODE_NOT_PRESENT_OFFSET, 5161 }, { 0x2000, 5165, 0 }, { 0x2001, 5169, 0 }, { 0x2002, G_UNICODE_NOT_PRESENT_OFFSET, 0 }, { 0x2003, G_UNICODE_NOT_PRESENT_OFFSET, 0 }, { 0x2004, G_UNICODE_NOT_PRESENT_OFFSET, 0 }, { 0x2005, G_UNICODE_NOT_PRESENT_OFFSET, 0 }, { 0x2006, G_UNICODE_NOT_PRESENT_OFFSET, 0 }, { 0x2007, G_UNICODE_NOT_PRESENT_OFFSET, 0 }, { 0x2008, G_UNICODE_NOT_PRESENT_OFFSET, 0 }, { 0x2009, G_UNICODE_NOT_PRESENT_OFFSET, 0 }, { 0x200a, G_UNICODE_NOT_PRESENT_OFFSET, 0 }, { 0x2011, G_UNICODE_NOT_PRESENT_OFFSET, 5173 }, { 0x2017, G_UNICODE_NOT_PRESENT_OFFSET, 5177 }, { 0x2024, G_UNICODE_NOT_PRESENT_OFFSET, 5181 }, { 0x2025, G_UNICODE_NOT_PRESENT_OFFSET, 5183 }, { 0x2026, G_UNICODE_NOT_PRESENT_OFFSET, 5186 }, { 0x202f, G_UNICODE_NOT_PRESENT_OFFSET, 0 }, { 0x2033, G_UNICODE_NOT_PRESENT_OFFSET, 5190 }, { 0x2034, G_UNICODE_NOT_PRESENT_OFFSET, 5197 }, { 0x2036, G_UNICODE_NOT_PRESENT_OFFSET, 5207 }, { 0x2037, G_UNICODE_NOT_PRESENT_OFFSET, 5214 }, { 0x203c, G_UNICODE_NOT_PRESENT_OFFSET, 5224 }, { 0x203e, G_UNICODE_NOT_PRESENT_OFFSET, 5227 }, { 0x2047, G_UNICODE_NOT_PRESENT_OFFSET, 5231 }, { 0x2048, G_UNICODE_NOT_PRESENT_OFFSET, 5234 }, { 0x2049, G_UNICODE_NOT_PRESENT_OFFSET, 5237 }, { 0x2057, G_UNICODE_NOT_PRESENT_OFFSET, 5240 }, { 0x205f, G_UNICODE_NOT_PRESENT_OFFSET, 0 }, { 0x2070, G_UNICODE_NOT_PRESENT_OFFSET, 5253 }, { 0x2071, G_UNICODE_NOT_PRESENT_OFFSET, 2427 }, { 0x2074, G_UNICODE_NOT_PRESENT_OFFSET, 5255 }, { 0x2075, G_UNICODE_NOT_PRESENT_OFFSET, 5257 }, { 0x2076, G_UNICODE_NOT_PRESENT_OFFSET, 5259 }, { 0x2077, G_UNICODE_NOT_PRESENT_OFFSET, 5261 }, { 0x2078, G_UNICODE_NOT_PRESENT_OFFSET, 5263 }, { 0x2079, G_UNICODE_NOT_PRESENT_OFFSET, 5265 }, { 0x207a, G_UNICODE_NOT_PRESENT_OFFSET, 5267 }, { 0x207b, G_UNICODE_NOT_PRESENT_OFFSET, 5269 }, { 0x207c, G_UNICODE_NOT_PRESENT_OFFSET, 5273 }, { 0x207d, G_UNICODE_NOT_PRESENT_OFFSET, 5275 }, { 0x207e, G_UNICODE_NOT_PRESENT_OFFSET, 5277 }, { 0x207f, G_UNICODE_NOT_PRESENT_OFFSET, 5279 }, { 0x2080, G_UNICODE_NOT_PRESENT_OFFSET, 5253 }, { 0x2081, G_UNICODE_NOT_PRESENT_OFFSET, 27 }, { 0x2082, G_UNICODE_NOT_PRESENT_OFFSET, 12 }, { 0x2083, G_UNICODE_NOT_PRESENT_OFFSET, 14 }, { 0x2084, G_UNICODE_NOT_PRESENT_OFFSET, 5255 }, { 0x2085, G_UNICODE_NOT_PRESENT_OFFSET, 5257 }, { 0x2086, G_UNICODE_NOT_PRESENT_OFFSET, 5259 }, { 0x2087, G_UNICODE_NOT_PRESENT_OFFSET, 5261 }, { 0x2088, G_UNICODE_NOT_PRESENT_OFFSET, 5263 }, { 0x2089, G_UNICODE_NOT_PRESENT_OFFSET, 5265 }, { 0x208a, G_UNICODE_NOT_PRESENT_OFFSET, 5267 }, { 0x208b, G_UNICODE_NOT_PRESENT_OFFSET, 5269 }, { 0x208c, G_UNICODE_NOT_PRESENT_OFFSET, 5273 }, { 0x208d, G_UNICODE_NOT_PRESENT_OFFSET, 5275 }, { 0x208e, G_UNICODE_NOT_PRESENT_OFFSET, 5277 }, { 0x2090, G_UNICODE_NOT_PRESENT_OFFSET, 6 }, { 0x2091, G_UNICODE_NOT_PRESENT_OFFSET, 2368 }, { 0x2092, G_UNICODE_NOT_PRESENT_OFFSET, 29 }, { 0x2093, G_UNICODE_NOT_PRESENT_OFFSET, 1222 }, { 0x2094, G_UNICODE_NOT_PRESENT_OFFSET, 2370 }, { 0x2095, G_UNICODE_NOT_PRESENT_OFFSET, 1171 }, { 0x2096, G_UNICODE_NOT_PRESENT_OFFSET, 2381 }, { 0x2097, G_UNICODE_NOT_PRESENT_OFFSET, 1220 }, { 0x2098, G_UNICODE_NOT_PRESENT_OFFSET, 2383 }, { 0x2099, G_UNICODE_NOT_PRESENT_OFFSET, 5279 }, { 0x209a, G_UNICODE_NOT_PRESENT_OFFSET, 2399 }, { 0x209b, G_UNICODE_NOT_PRESENT_OFFSET, 711 }, { 0x209c, G_UNICODE_NOT_PRESENT_OFFSET, 2401 }, { 0x20a8, G_UNICODE_NOT_PRESENT_OFFSET, 5281 }, { 0x2100, G_UNICODE_NOT_PRESENT_OFFSET, 5284 }, { 0x2101, G_UNICODE_NOT_PRESENT_OFFSET, 5288 }, { 0x2102, G_UNICODE_NOT_PRESENT_OFFSET, 5292 }, { 0x2103, G_UNICODE_NOT_PRESENT_OFFSET, 5294 }, { 0x2105, G_UNICODE_NOT_PRESENT_OFFSET, 5298 }, { 0x2106, G_UNICODE_NOT_PRESENT_OFFSET, 5302 }, { 0x2107, G_UNICODE_NOT_PRESENT_OFFSET, 5306 }, { 0x2109, G_UNICODE_NOT_PRESENT_OFFSET, 5309 }, { 0x210a, G_UNICODE_NOT_PRESENT_OFFSET, 2379 }, { 0x210b, G_UNICODE_NOT_PRESENT_OFFSET, 2325 }, { 0x210c, G_UNICODE_NOT_PRESENT_OFFSET, 2325 }, { 0x210d, G_UNICODE_NOT_PRESENT_OFFSET, 2325 }, { 0x210e, G_UNICODE_NOT_PRESENT_OFFSET, 1171 }, { 0x210f, G_UNICODE_NOT_PRESENT_OFFSET, 5313 }, { 0x2110, G_UNICODE_NOT_PRESENT_OFFSET, 2327 }, { 0x2111, G_UNICODE_NOT_PRESENT_OFFSET, 2327 }, { 0x2112, G_UNICODE_NOT_PRESENT_OFFSET, 2333 }, { 0x2113, G_UNICODE_NOT_PRESENT_OFFSET, 1220 }, { 0x2115, G_UNICODE_NOT_PRESENT_OFFSET, 2337 }, { 0x2116, G_UNICODE_NOT_PRESENT_OFFSET, 5316 }, { 0x2119, G_UNICODE_NOT_PRESENT_OFFSET, 2344 }, { 0x211a, G_UNICODE_NOT_PRESENT_OFFSET, 5319 }, { 0x211b, G_UNICODE_NOT_PRESENT_OFFSET, 2346 }, { 0x211c, G_UNICODE_NOT_PRESENT_OFFSET, 2346 }, { 0x211d, G_UNICODE_NOT_PRESENT_OFFSET, 2346 }, { 0x2120, G_UNICODE_NOT_PRESENT_OFFSET, 5321 }, { 0x2121, G_UNICODE_NOT_PRESENT_OFFSET, 5324 }, { 0x2122, G_UNICODE_NOT_PRESENT_OFFSET, 5328 }, { 0x2124, G_UNICODE_NOT_PRESENT_OFFSET, 5331 }, { 0x2126, 5333, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x2128, G_UNICODE_NOT_PRESENT_OFFSET, 5331 }, { 0x212a, 2331, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x212b, 69, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x212c, G_UNICODE_NOT_PRESENT_OFFSET, 2314 }, { 0x212d, G_UNICODE_NOT_PRESENT_OFFSET, 5292 }, { 0x212f, G_UNICODE_NOT_PRESENT_OFFSET, 2368 }, { 0x2130, G_UNICODE_NOT_PRESENT_OFFSET, 2318 }, { 0x2131, G_UNICODE_NOT_PRESENT_OFFSET, 5336 }, { 0x2133, G_UNICODE_NOT_PRESENT_OFFSET, 2335 }, { 0x2134, G_UNICODE_NOT_PRESENT_OFFSET, 29 }, { 0x2135, G_UNICODE_NOT_PRESENT_OFFSET, 5338 }, { 0x2136, G_UNICODE_NOT_PRESENT_OFFSET, 5341 }, { 0x2137, G_UNICODE_NOT_PRESENT_OFFSET, 5344 }, { 0x2138, G_UNICODE_NOT_PRESENT_OFFSET, 5347 }, { 0x2139, G_UNICODE_NOT_PRESENT_OFFSET, 2427 }, { 0x213b, G_UNICODE_NOT_PRESENT_OFFSET, 5350 }, { 0x213c, G_UNICODE_NOT_PRESENT_OFFSET, 1390 }, { 0x213d, G_UNICODE_NOT_PRESENT_OFFSET, 2418 }, { 0x213e, G_UNICODE_NOT_PRESENT_OFFSET, 5354 }, { 0x213f, G_UNICODE_NOT_PRESENT_OFFSET, 5357 }, { 0x2140, G_UNICODE_NOT_PRESENT_OFFSET, 5360 }, { 0x2145, G_UNICODE_NOT_PRESENT_OFFSET, 2316 }, { 0x2146, G_UNICODE_NOT_PRESENT_OFFSET, 2366 }, { 0x2147, G_UNICODE_NOT_PRESENT_OFFSET, 2368 }, { 0x2148, G_UNICODE_NOT_PRESENT_OFFSET, 2427 }, { 0x2149, G_UNICODE_NOT_PRESENT_OFFSET, 1176 }, { 0x2150, G_UNICODE_NOT_PRESENT_OFFSET, 5364 }, { 0x2151, G_UNICODE_NOT_PRESENT_OFFSET, 5370 }, { 0x2152, G_UNICODE_NOT_PRESENT_OFFSET, 5376 }, { 0x2153, G_UNICODE_NOT_PRESENT_OFFSET, 5383 }, { 0x2154, G_UNICODE_NOT_PRESENT_OFFSET, 5389 }, { 0x2155, G_UNICODE_NOT_PRESENT_OFFSET, 5395 }, { 0x2156, G_UNICODE_NOT_PRESENT_OFFSET, 5401 }, { 0x2157, G_UNICODE_NOT_PRESENT_OFFSET, 5407 }, { 0x2158, G_UNICODE_NOT_PRESENT_OFFSET, 5413 }, { 0x2159, G_UNICODE_NOT_PRESENT_OFFSET, 5419 }, { 0x215a, G_UNICODE_NOT_PRESENT_OFFSET, 5425 }, { 0x215b, G_UNICODE_NOT_PRESENT_OFFSET, 5431 }, { 0x215c, G_UNICODE_NOT_PRESENT_OFFSET, 5437 }, { 0x215d, G_UNICODE_NOT_PRESENT_OFFSET, 5443 }, { 0x215e, G_UNICODE_NOT_PRESENT_OFFSET, 5449 }, { 0x215f, G_UNICODE_NOT_PRESENT_OFFSET, 5455 }, { 0x2160, G_UNICODE_NOT_PRESENT_OFFSET, 2327 }, { 0x2161, G_UNICODE_NOT_PRESENT_OFFSET, 5460 }, { 0x2162, G_UNICODE_NOT_PRESENT_OFFSET, 5463 }, { 0x2163, G_UNICODE_NOT_PRESENT_OFFSET, 5467 }, { 0x2164, G_UNICODE_NOT_PRESENT_OFFSET, 5470 }, { 0x2165, G_UNICODE_NOT_PRESENT_OFFSET, 5472 }, { 0x2166, G_UNICODE_NOT_PRESENT_OFFSET, 5475 }, { 0x2167, G_UNICODE_NOT_PRESENT_OFFSET, 5479 }, { 0x2168, G_UNICODE_NOT_PRESENT_OFFSET, 5484 }, { 0x2169, G_UNICODE_NOT_PRESENT_OFFSET, 5487 }, { 0x216a, G_UNICODE_NOT_PRESENT_OFFSET, 5489 }, { 0x216b, G_UNICODE_NOT_PRESENT_OFFSET, 5492 }, { 0x216c, G_UNICODE_NOT_PRESENT_OFFSET, 2333 }, { 0x216d, G_UNICODE_NOT_PRESENT_OFFSET, 5292 }, { 0x216e, G_UNICODE_NOT_PRESENT_OFFSET, 2316 }, { 0x216f, G_UNICODE_NOT_PRESENT_OFFSET, 2335 }, { 0x2170, G_UNICODE_NOT_PRESENT_OFFSET, 2427 }, { 0x2171, G_UNICODE_NOT_PRESENT_OFFSET, 5496 }, { 0x2172, G_UNICODE_NOT_PRESENT_OFFSET, 5499 }, { 0x2173, G_UNICODE_NOT_PRESENT_OFFSET, 5503 }, { 0x2174, G_UNICODE_NOT_PRESENT_OFFSET, 2412 }, { 0x2175, G_UNICODE_NOT_PRESENT_OFFSET, 5506 }, { 0x2176, G_UNICODE_NOT_PRESENT_OFFSET, 5509 }, { 0x2177, G_UNICODE_NOT_PRESENT_OFFSET, 5513 }, { 0x2178, G_UNICODE_NOT_PRESENT_OFFSET, 5518 }, { 0x2179, G_UNICODE_NOT_PRESENT_OFFSET, 1222 }, { 0x217a, G_UNICODE_NOT_PRESENT_OFFSET, 5521 }, { 0x217b, G_UNICODE_NOT_PRESENT_OFFSET, 5524 }, { 0x217c, G_UNICODE_NOT_PRESENT_OFFSET, 1220 }, { 0x217d, G_UNICODE_NOT_PRESENT_OFFSET, 2435 }, { 0x217e, G_UNICODE_NOT_PRESENT_OFFSET, 2366 }, { 0x217f, G_UNICODE_NOT_PRESENT_OFFSET, 2383 }, { 0x2189, G_UNICODE_NOT_PRESENT_OFFSET, 5528 }, { 0x219a, 5534, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x219b, 5540, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x21ae, 5546, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x21cd, 5552, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x21ce, 5558, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x21cf, 5564, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x2204, 5570, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x2209, 5576, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x220c, 5582, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x2224, 5588, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x2226, 5594, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x222c, G_UNICODE_NOT_PRESENT_OFFSET, 5600 }, { 0x222d, G_UNICODE_NOT_PRESENT_OFFSET, 5607 }, { 0x222f, G_UNICODE_NOT_PRESENT_OFFSET, 5617 }, { 0x2230, G_UNICODE_NOT_PRESENT_OFFSET, 5624 }, { 0x2241, 5634, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x2244, 5640, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x2247, 5646, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x2249, 5652, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x2260, 5658, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x2262, 5662, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x226d, 5668, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x226e, 5674, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x226f, 5678, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x2270, 5682, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x2271, 5688, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x2274, 5694, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x2275, 5700, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x2278, 5706, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x2279, 5712, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x2280, 5718, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x2281, 5724, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x2284, 5730, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x2285, 5736, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x2288, 5742, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x2289, 5748, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x22ac, 5754, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x22ad, 5760, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x22ae, 5766, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x22af, 5772, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x22e0, 5778, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x22e1, 5784, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x22e2, 5790, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x22e3, 5796, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x22ea, 5802, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x22eb, 5808, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x22ec, 5814, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x22ed, 5820, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x2329, 5826, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x232a, 5830, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x2460, G_UNICODE_NOT_PRESENT_OFFSET, 27 }, { 0x2461, G_UNICODE_NOT_PRESENT_OFFSET, 12 }, { 0x2462, G_UNICODE_NOT_PRESENT_OFFSET, 14 }, { 0x2463, G_UNICODE_NOT_PRESENT_OFFSET, 5255 }, { 0x2464, G_UNICODE_NOT_PRESENT_OFFSET, 5257 }, { 0x2465, G_UNICODE_NOT_PRESENT_OFFSET, 5259 }, { 0x2466, G_UNICODE_NOT_PRESENT_OFFSET, 5261 }, { 0x2467, G_UNICODE_NOT_PRESENT_OFFSET, 5263 }, { 0x2468, G_UNICODE_NOT_PRESENT_OFFSET, 5265 }, { 0x2469, G_UNICODE_NOT_PRESENT_OFFSET, 5834 }, { 0x246a, G_UNICODE_NOT_PRESENT_OFFSET, 5837 }, { 0x246b, G_UNICODE_NOT_PRESENT_OFFSET, 5840 }, { 0x246c, G_UNICODE_NOT_PRESENT_OFFSET, 5843 }, { 0x246d, G_UNICODE_NOT_PRESENT_OFFSET, 5846 }, { 0x246e, G_UNICODE_NOT_PRESENT_OFFSET, 5849 }, { 0x246f, G_UNICODE_NOT_PRESENT_OFFSET, 5852 }, { 0x2470, G_UNICODE_NOT_PRESENT_OFFSET, 5855 }, { 0x2471, G_UNICODE_NOT_PRESENT_OFFSET, 5858 }, { 0x2472, G_UNICODE_NOT_PRESENT_OFFSET, 5861 }, { 0x2473, G_UNICODE_NOT_PRESENT_OFFSET, 5864 }, { 0x2474, G_UNICODE_NOT_PRESENT_OFFSET, 5867 }, { 0x2475, G_UNICODE_NOT_PRESENT_OFFSET, 5871 }, { 0x2476, G_UNICODE_NOT_PRESENT_OFFSET, 5875 }, { 0x2477, G_UNICODE_NOT_PRESENT_OFFSET, 5879 }, { 0x2478, G_UNICODE_NOT_PRESENT_OFFSET, 5883 }, { 0x2479, G_UNICODE_NOT_PRESENT_OFFSET, 5887 }, { 0x247a, G_UNICODE_NOT_PRESENT_OFFSET, 5891 }, { 0x247b, G_UNICODE_NOT_PRESENT_OFFSET, 5895 }, { 0x247c, G_UNICODE_NOT_PRESENT_OFFSET, 5899 }, { 0x247d, G_UNICODE_NOT_PRESENT_OFFSET, 5903 }, { 0x247e, G_UNICODE_NOT_PRESENT_OFFSET, 5908 }, { 0x247f, G_UNICODE_NOT_PRESENT_OFFSET, 5913 }, { 0x2480, G_UNICODE_NOT_PRESENT_OFFSET, 5918 }, { 0x2481, G_UNICODE_NOT_PRESENT_OFFSET, 5923 }, { 0x2482, G_UNICODE_NOT_PRESENT_OFFSET, 5928 }, { 0x2483, G_UNICODE_NOT_PRESENT_OFFSET, 5933 }, { 0x2484, G_UNICODE_NOT_PRESENT_OFFSET, 5938 }, { 0x2485, G_UNICODE_NOT_PRESENT_OFFSET, 5943 }, { 0x2486, G_UNICODE_NOT_PRESENT_OFFSET, 5948 }, { 0x2487, G_UNICODE_NOT_PRESENT_OFFSET, 5953 }, { 0x2488, G_UNICODE_NOT_PRESENT_OFFSET, 5958 }, { 0x2489, G_UNICODE_NOT_PRESENT_OFFSET, 5961 }, { 0x248a, G_UNICODE_NOT_PRESENT_OFFSET, 5964 }, { 0x248b, G_UNICODE_NOT_PRESENT_OFFSET, 5967 }, { 0x248c, G_UNICODE_NOT_PRESENT_OFFSET, 5970 }, { 0x248d, G_UNICODE_NOT_PRESENT_OFFSET, 5973 }, { 0x248e, G_UNICODE_NOT_PRESENT_OFFSET, 5976 }, { 0x248f, G_UNICODE_NOT_PRESENT_OFFSET, 5979 }, { 0x2490, G_UNICODE_NOT_PRESENT_OFFSET, 5982 }, { 0x2491, G_UNICODE_NOT_PRESENT_OFFSET, 5985 }, { 0x2492, G_UNICODE_NOT_PRESENT_OFFSET, 5989 }, { 0x2493, G_UNICODE_NOT_PRESENT_OFFSET, 5993 }, { 0x2494, G_UNICODE_NOT_PRESENT_OFFSET, 5997 }, { 0x2495, G_UNICODE_NOT_PRESENT_OFFSET, 6001 }, { 0x2496, G_UNICODE_NOT_PRESENT_OFFSET, 6005 }, { 0x2497, G_UNICODE_NOT_PRESENT_OFFSET, 6009 }, { 0x2498, G_UNICODE_NOT_PRESENT_OFFSET, 6013 }, { 0x2499, G_UNICODE_NOT_PRESENT_OFFSET, 6017 }, { 0x249a, G_UNICODE_NOT_PRESENT_OFFSET, 6021 }, { 0x249b, G_UNICODE_NOT_PRESENT_OFFSET, 6025 }, { 0x249c, G_UNICODE_NOT_PRESENT_OFFSET, 6029 }, { 0x249d, G_UNICODE_NOT_PRESENT_OFFSET, 6033 }, { 0x249e, G_UNICODE_NOT_PRESENT_OFFSET, 6037 }, { 0x249f, G_UNICODE_NOT_PRESENT_OFFSET, 6041 }, { 0x24a0, G_UNICODE_NOT_PRESENT_OFFSET, 6045 }, { 0x24a1, G_UNICODE_NOT_PRESENT_OFFSET, 6049 }, { 0x24a2, G_UNICODE_NOT_PRESENT_OFFSET, 6053 }, { 0x24a3, G_UNICODE_NOT_PRESENT_OFFSET, 6057 }, { 0x24a4, G_UNICODE_NOT_PRESENT_OFFSET, 6061 }, { 0x24a5, G_UNICODE_NOT_PRESENT_OFFSET, 6065 }, { 0x24a6, G_UNICODE_NOT_PRESENT_OFFSET, 6069 }, { 0x24a7, G_UNICODE_NOT_PRESENT_OFFSET, 6073 }, { 0x24a8, G_UNICODE_NOT_PRESENT_OFFSET, 6077 }, { 0x24a9, G_UNICODE_NOT_PRESENT_OFFSET, 6081 }, { 0x24aa, G_UNICODE_NOT_PRESENT_OFFSET, 6085 }, { 0x24ab, G_UNICODE_NOT_PRESENT_OFFSET, 6089 }, { 0x24ac, G_UNICODE_NOT_PRESENT_OFFSET, 6093 }, { 0x24ad, G_UNICODE_NOT_PRESENT_OFFSET, 6097 }, { 0x24ae, G_UNICODE_NOT_PRESENT_OFFSET, 6101 }, { 0x24af, G_UNICODE_NOT_PRESENT_OFFSET, 6105 }, { 0x24b0, G_UNICODE_NOT_PRESENT_OFFSET, 6109 }, { 0x24b1, G_UNICODE_NOT_PRESENT_OFFSET, 6113 }, { 0x24b2, G_UNICODE_NOT_PRESENT_OFFSET, 6117 }, { 0x24b3, G_UNICODE_NOT_PRESENT_OFFSET, 6121 }, { 0x24b4, G_UNICODE_NOT_PRESENT_OFFSET, 6125 }, { 0x24b5, G_UNICODE_NOT_PRESENT_OFFSET, 6129 }, { 0x24b6, G_UNICODE_NOT_PRESENT_OFFSET, 2309 }, { 0x24b7, G_UNICODE_NOT_PRESENT_OFFSET, 2314 }, { 0x24b8, G_UNICODE_NOT_PRESENT_OFFSET, 5292 }, { 0x24b9, G_UNICODE_NOT_PRESENT_OFFSET, 2316 }, { 0x24ba, G_UNICODE_NOT_PRESENT_OFFSET, 2318 }, { 0x24bb, G_UNICODE_NOT_PRESENT_OFFSET, 5336 }, { 0x24bc, G_UNICODE_NOT_PRESENT_OFFSET, 2323 }, { 0x24bd, G_UNICODE_NOT_PRESENT_OFFSET, 2325 }, { 0x24be, G_UNICODE_NOT_PRESENT_OFFSET, 2327 }, { 0x24bf, G_UNICODE_NOT_PRESENT_OFFSET, 2329 }, { 0x24c0, G_UNICODE_NOT_PRESENT_OFFSET, 2331 }, { 0x24c1, G_UNICODE_NOT_PRESENT_OFFSET, 2333 }, { 0x24c2, G_UNICODE_NOT_PRESENT_OFFSET, 2335 }, { 0x24c3, G_UNICODE_NOT_PRESENT_OFFSET, 2337 }, { 0x24c4, G_UNICODE_NOT_PRESENT_OFFSET, 2339 }, { 0x24c5, G_UNICODE_NOT_PRESENT_OFFSET, 2344 }, { 0x24c6, G_UNICODE_NOT_PRESENT_OFFSET, 5319 }, { 0x24c7, G_UNICODE_NOT_PRESENT_OFFSET, 2346 }, { 0x24c8, G_UNICODE_NOT_PRESENT_OFFSET, 6133 }, { 0x24c9, G_UNICODE_NOT_PRESENT_OFFSET, 2348 }, { 0x24ca, G_UNICODE_NOT_PRESENT_OFFSET, 2350 }, { 0x24cb, G_UNICODE_NOT_PRESENT_OFFSET, 5470 }, { 0x24cc, G_UNICODE_NOT_PRESENT_OFFSET, 2352 }, { 0x24cd, G_UNICODE_NOT_PRESENT_OFFSET, 5487 }, { 0x24ce, G_UNICODE_NOT_PRESENT_OFFSET, 6135 }, { 0x24cf, G_UNICODE_NOT_PRESENT_OFFSET, 5331 }, { 0x24d0, G_UNICODE_NOT_PRESENT_OFFSET, 6 }, { 0x24d1, G_UNICODE_NOT_PRESENT_OFFSET, 2364 }, { 0x24d2, G_UNICODE_NOT_PRESENT_OFFSET, 2435 }, { 0x24d3, G_UNICODE_NOT_PRESENT_OFFSET, 2366 }, { 0x24d4, G_UNICODE_NOT_PRESENT_OFFSET, 2368 }, { 0x24d5, G_UNICODE_NOT_PRESENT_OFFSET, 2443 }, { 0x24d6, G_UNICODE_NOT_PRESENT_OFFSET, 2379 }, { 0x24d7, G_UNICODE_NOT_PRESENT_OFFSET, 1171 }, { 0x24d8, G_UNICODE_NOT_PRESENT_OFFSET, 2427 }, { 0x24d9, G_UNICODE_NOT_PRESENT_OFFSET, 1176 }, { 0x24da, G_UNICODE_NOT_PRESENT_OFFSET, 2381 }, { 0x24db, G_UNICODE_NOT_PRESENT_OFFSET, 1220 }, { 0x24dc, G_UNICODE_NOT_PRESENT_OFFSET, 2383 }, { 0x24dd, G_UNICODE_NOT_PRESENT_OFFSET, 5279 }, { 0x24de, G_UNICODE_NOT_PRESENT_OFFSET, 29 }, { 0x24df, G_UNICODE_NOT_PRESENT_OFFSET, 2399 }, { 0x24e0, G_UNICODE_NOT_PRESENT_OFFSET, 6137 }, { 0x24e1, G_UNICODE_NOT_PRESENT_OFFSET, 1178 }, { 0x24e2, G_UNICODE_NOT_PRESENT_OFFSET, 711 }, { 0x24e3, G_UNICODE_NOT_PRESENT_OFFSET, 2401 }, { 0x24e4, G_UNICODE_NOT_PRESENT_OFFSET, 2403 }, { 0x24e5, G_UNICODE_NOT_PRESENT_OFFSET, 2412 }, { 0x24e6, G_UNICODE_NOT_PRESENT_OFFSET, 1189 }, { 0x24e7, G_UNICODE_NOT_PRESENT_OFFSET, 1222 }, { 0x24e8, G_UNICODE_NOT_PRESENT_OFFSET, 1191 }, { 0x24e9, G_UNICODE_NOT_PRESENT_OFFSET, 2526 }, { 0x24ea, G_UNICODE_NOT_PRESENT_OFFSET, 5253 }, { 0x2a0c, G_UNICODE_NOT_PRESENT_OFFSET, 6139 }, { 0x2a74, G_UNICODE_NOT_PRESENT_OFFSET, 6152 }, { 0x2a75, G_UNICODE_NOT_PRESENT_OFFSET, 6156 }, { 0x2a76, G_UNICODE_NOT_PRESENT_OFFSET, 6159 }, { 0x2adc, 6163, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x2c7c, G_UNICODE_NOT_PRESENT_OFFSET, 1176 }, { 0x2c7d, G_UNICODE_NOT_PRESENT_OFFSET, 5470 }, { 0x2d6f, G_UNICODE_NOT_PRESENT_OFFSET, 6169 }, { 0x2e9f, G_UNICODE_NOT_PRESENT_OFFSET, 6173 }, { 0x2ef3, G_UNICODE_NOT_PRESENT_OFFSET, 6177 }, { 0x2f00, G_UNICODE_NOT_PRESENT_OFFSET, 6181 }, { 0x2f01, G_UNICODE_NOT_PRESENT_OFFSET, 6185 }, { 0x2f02, G_UNICODE_NOT_PRESENT_OFFSET, 6189 }, { 0x2f03, G_UNICODE_NOT_PRESENT_OFFSET, 6193 }, { 0x2f04, G_UNICODE_NOT_PRESENT_OFFSET, 6197 }, { 0x2f05, G_UNICODE_NOT_PRESENT_OFFSET, 6201 }, { 0x2f06, G_UNICODE_NOT_PRESENT_OFFSET, 6205 }, { 0x2f07, G_UNICODE_NOT_PRESENT_OFFSET, 6209 }, { 0x2f08, G_UNICODE_NOT_PRESENT_OFFSET, 6213 }, { 0x2f09, G_UNICODE_NOT_PRESENT_OFFSET, 6217 }, { 0x2f0a, G_UNICODE_NOT_PRESENT_OFFSET, 6221 }, { 0x2f0b, G_UNICODE_NOT_PRESENT_OFFSET, 6225 }, { 0x2f0c, G_UNICODE_NOT_PRESENT_OFFSET, 6229 }, { 0x2f0d, G_UNICODE_NOT_PRESENT_OFFSET, 6233 }, { 0x2f0e, G_UNICODE_NOT_PRESENT_OFFSET, 6237 }, { 0x2f0f, G_UNICODE_NOT_PRESENT_OFFSET, 6241 }, { 0x2f10, G_UNICODE_NOT_PRESENT_OFFSET, 6245 }, { 0x2f11, G_UNICODE_NOT_PRESENT_OFFSET, 6249 }, { 0x2f12, G_UNICODE_NOT_PRESENT_OFFSET, 6253 }, { 0x2f13, G_UNICODE_NOT_PRESENT_OFFSET, 6257 }, { 0x2f14, G_UNICODE_NOT_PRESENT_OFFSET, 6261 }, { 0x2f15, G_UNICODE_NOT_PRESENT_OFFSET, 6265 }, { 0x2f16, G_UNICODE_NOT_PRESENT_OFFSET, 6269 }, { 0x2f17, G_UNICODE_NOT_PRESENT_OFFSET, 6273 }, { 0x2f18, G_UNICODE_NOT_PRESENT_OFFSET, 6277 }, { 0x2f19, G_UNICODE_NOT_PRESENT_OFFSET, 6281 }, { 0x2f1a, G_UNICODE_NOT_PRESENT_OFFSET, 6285 }, { 0x2f1b, G_UNICODE_NOT_PRESENT_OFFSET, 6289 }, { 0x2f1c, G_UNICODE_NOT_PRESENT_OFFSET, 6293 }, { 0x2f1d, G_UNICODE_NOT_PRESENT_OFFSET, 6297 }, { 0x2f1e, G_UNICODE_NOT_PRESENT_OFFSET, 6301 }, { 0x2f1f, G_UNICODE_NOT_PRESENT_OFFSET, 6305 }, { 0x2f20, G_UNICODE_NOT_PRESENT_OFFSET, 6309 }, { 0x2f21, G_UNICODE_NOT_PRESENT_OFFSET, 6313 }, { 0x2f22, G_UNICODE_NOT_PRESENT_OFFSET, 6317 }, { 0x2f23, G_UNICODE_NOT_PRESENT_OFFSET, 6321 }, { 0x2f24, G_UNICODE_NOT_PRESENT_OFFSET, 6325 }, { 0x2f25, G_UNICODE_NOT_PRESENT_OFFSET, 6329 }, { 0x2f26, G_UNICODE_NOT_PRESENT_OFFSET, 6333 }, { 0x2f27, G_UNICODE_NOT_PRESENT_OFFSET, 6337 }, { 0x2f28, G_UNICODE_NOT_PRESENT_OFFSET, 6341 }, { 0x2f29, G_UNICODE_NOT_PRESENT_OFFSET, 6345 }, { 0x2f2a, G_UNICODE_NOT_PRESENT_OFFSET, 6349 }, { 0x2f2b, G_UNICODE_NOT_PRESENT_OFFSET, 6353 }, { 0x2f2c, G_UNICODE_NOT_PRESENT_OFFSET, 6357 }, { 0x2f2d, G_UNICODE_NOT_PRESENT_OFFSET, 6361 }, { 0x2f2e, G_UNICODE_NOT_PRESENT_OFFSET, 6365 }, { 0x2f2f, G_UNICODE_NOT_PRESENT_OFFSET, 6369 }, { 0x2f30, G_UNICODE_NOT_PRESENT_OFFSET, 6373 }, { 0x2f31, G_UNICODE_NOT_PRESENT_OFFSET, 6377 }, { 0x2f32, G_UNICODE_NOT_PRESENT_OFFSET, 6381 }, { 0x2f33, G_UNICODE_NOT_PRESENT_OFFSET, 6385 }, { 0x2f34, G_UNICODE_NOT_PRESENT_OFFSET, 6389 }, { 0x2f35, G_UNICODE_NOT_PRESENT_OFFSET, 6393 }, { 0x2f36, G_UNICODE_NOT_PRESENT_OFFSET, 6397 }, { 0x2f37, G_UNICODE_NOT_PRESENT_OFFSET, 6401 }, { 0x2f38, G_UNICODE_NOT_PRESENT_OFFSET, 6405 }, { 0x2f39, G_UNICODE_NOT_PRESENT_OFFSET, 6409 }, { 0x2f3a, G_UNICODE_NOT_PRESENT_OFFSET, 6413 }, { 0x2f3b, G_UNICODE_NOT_PRESENT_OFFSET, 6417 }, { 0x2f3c, G_UNICODE_NOT_PRESENT_OFFSET, 6421 }, { 0x2f3d, G_UNICODE_NOT_PRESENT_OFFSET, 6425 }, { 0x2f3e, G_UNICODE_NOT_PRESENT_OFFSET, 6429 }, { 0x2f3f, G_UNICODE_NOT_PRESENT_OFFSET, 6433 }, { 0x2f40, G_UNICODE_NOT_PRESENT_OFFSET, 6437 }, { 0x2f41, G_UNICODE_NOT_PRESENT_OFFSET, 6441 }, { 0x2f42, G_UNICODE_NOT_PRESENT_OFFSET, 6445 }, { 0x2f43, G_UNICODE_NOT_PRESENT_OFFSET, 6449 }, { 0x2f44, G_UNICODE_NOT_PRESENT_OFFSET, 6453 }, { 0x2f45, G_UNICODE_NOT_PRESENT_OFFSET, 6457 }, { 0x2f46, G_UNICODE_NOT_PRESENT_OFFSET, 6461 }, { 0x2f47, G_UNICODE_NOT_PRESENT_OFFSET, 6465 }, { 0x2f48, G_UNICODE_NOT_PRESENT_OFFSET, 6469 }, { 0x2f49, G_UNICODE_NOT_PRESENT_OFFSET, 6473 }, { 0x2f4a, G_UNICODE_NOT_PRESENT_OFFSET, 6477 }, { 0x2f4b, G_UNICODE_NOT_PRESENT_OFFSET, 6481 }, { 0x2f4c, G_UNICODE_NOT_PRESENT_OFFSET, 6485 }, { 0x2f4d, G_UNICODE_NOT_PRESENT_OFFSET, 6489 }, { 0x2f4e, G_UNICODE_NOT_PRESENT_OFFSET, 6493 }, { 0x2f4f, G_UNICODE_NOT_PRESENT_OFFSET, 6497 }, { 0x2f50, G_UNICODE_NOT_PRESENT_OFFSET, 6501 }, { 0x2f51, G_UNICODE_NOT_PRESENT_OFFSET, 6505 }, { 0x2f52, G_UNICODE_NOT_PRESENT_OFFSET, 6509 }, { 0x2f53, G_UNICODE_NOT_PRESENT_OFFSET, 6513 }, { 0x2f54, G_UNICODE_NOT_PRESENT_OFFSET, 6517 }, { 0x2f55, G_UNICODE_NOT_PRESENT_OFFSET, 6521 }, { 0x2f56, G_UNICODE_NOT_PRESENT_OFFSET, 6525 }, { 0x2f57, G_UNICODE_NOT_PRESENT_OFFSET, 6529 }, { 0x2f58, G_UNICODE_NOT_PRESENT_OFFSET, 6533 }, { 0x2f59, G_UNICODE_NOT_PRESENT_OFFSET, 6537 }, { 0x2f5a, G_UNICODE_NOT_PRESENT_OFFSET, 6541 }, { 0x2f5b, G_UNICODE_NOT_PRESENT_OFFSET, 6545 }, { 0x2f5c, G_UNICODE_NOT_PRESENT_OFFSET, 6549 }, { 0x2f5d, G_UNICODE_NOT_PRESENT_OFFSET, 6553 }, { 0x2f5e, G_UNICODE_NOT_PRESENT_OFFSET, 6557 }, { 0x2f5f, G_UNICODE_NOT_PRESENT_OFFSET, 6561 }, { 0x2f60, G_UNICODE_NOT_PRESENT_OFFSET, 6565 }, { 0x2f61, G_UNICODE_NOT_PRESENT_OFFSET, 6569 }, { 0x2f62, G_UNICODE_NOT_PRESENT_OFFSET, 6573 }, { 0x2f63, G_UNICODE_NOT_PRESENT_OFFSET, 6577 }, { 0x2f64, G_UNICODE_NOT_PRESENT_OFFSET, 6581 }, { 0x2f65, G_UNICODE_NOT_PRESENT_OFFSET, 6585 }, { 0x2f66, G_UNICODE_NOT_PRESENT_OFFSET, 6589 }, { 0x2f67, G_UNICODE_NOT_PRESENT_OFFSET, 6593 }, { 0x2f68, G_UNICODE_NOT_PRESENT_OFFSET, 6597 }, { 0x2f69, G_UNICODE_NOT_PRESENT_OFFSET, 6601 }, { 0x2f6a, G_UNICODE_NOT_PRESENT_OFFSET, 6605 }, { 0x2f6b, G_UNICODE_NOT_PRESENT_OFFSET, 6609 }, { 0x2f6c, G_UNICODE_NOT_PRESENT_OFFSET, 6613 }, { 0x2f6d, G_UNICODE_NOT_PRESENT_OFFSET, 6617 }, { 0x2f6e, G_UNICODE_NOT_PRESENT_OFFSET, 6621 }, { 0x2f6f, G_UNICODE_NOT_PRESENT_OFFSET, 6625 }, { 0x2f70, G_UNICODE_NOT_PRESENT_OFFSET, 6629 }, { 0x2f71, G_UNICODE_NOT_PRESENT_OFFSET, 6633 }, { 0x2f72, G_UNICODE_NOT_PRESENT_OFFSET, 6637 }, { 0x2f73, G_UNICODE_NOT_PRESENT_OFFSET, 6641 }, { 0x2f74, G_UNICODE_NOT_PRESENT_OFFSET, 6645 }, { 0x2f75, G_UNICODE_NOT_PRESENT_OFFSET, 6649 }, { 0x2f76, G_UNICODE_NOT_PRESENT_OFFSET, 6653 }, { 0x2f77, G_UNICODE_NOT_PRESENT_OFFSET, 6657 }, { 0x2f78, G_UNICODE_NOT_PRESENT_OFFSET, 6661 }, { 0x2f79, G_UNICODE_NOT_PRESENT_OFFSET, 6665 }, { 0x2f7a, G_UNICODE_NOT_PRESENT_OFFSET, 6669 }, { 0x2f7b, G_UNICODE_NOT_PRESENT_OFFSET, 6673 }, { 0x2f7c, G_UNICODE_NOT_PRESENT_OFFSET, 6677 }, { 0x2f7d, G_UNICODE_NOT_PRESENT_OFFSET, 6681 }, { 0x2f7e, G_UNICODE_NOT_PRESENT_OFFSET, 6685 }, { 0x2f7f, G_UNICODE_NOT_PRESENT_OFFSET, 6689 }, { 0x2f80, G_UNICODE_NOT_PRESENT_OFFSET, 6693 }, { 0x2f81, G_UNICODE_NOT_PRESENT_OFFSET, 6697 }, { 0x2f82, G_UNICODE_NOT_PRESENT_OFFSET, 6701 }, { 0x2f83, G_UNICODE_NOT_PRESENT_OFFSET, 6705 }, { 0x2f84, G_UNICODE_NOT_PRESENT_OFFSET, 6709 }, { 0x2f85, G_UNICODE_NOT_PRESENT_OFFSET, 6713 }, { 0x2f86, G_UNICODE_NOT_PRESENT_OFFSET, 6717 }, { 0x2f87, G_UNICODE_NOT_PRESENT_OFFSET, 6721 }, { 0x2f88, G_UNICODE_NOT_PRESENT_OFFSET, 6725 }, { 0x2f89, G_UNICODE_NOT_PRESENT_OFFSET, 6729 }, { 0x2f8a, G_UNICODE_NOT_PRESENT_OFFSET, 6733 }, { 0x2f8b, G_UNICODE_NOT_PRESENT_OFFSET, 6737 }, { 0x2f8c, G_UNICODE_NOT_PRESENT_OFFSET, 6741 }, { 0x2f8d, G_UNICODE_NOT_PRESENT_OFFSET, 6745 }, { 0x2f8e, G_UNICODE_NOT_PRESENT_OFFSET, 6749 }, { 0x2f8f, G_UNICODE_NOT_PRESENT_OFFSET, 6753 }, { 0x2f90, G_UNICODE_NOT_PRESENT_OFFSET, 6757 }, { 0x2f91, G_UNICODE_NOT_PRESENT_OFFSET, 6761 }, { 0x2f92, G_UNICODE_NOT_PRESENT_OFFSET, 6765 }, { 0x2f93, G_UNICODE_NOT_PRESENT_OFFSET, 6769 }, { 0x2f94, G_UNICODE_NOT_PRESENT_OFFSET, 6773 }, { 0x2f95, G_UNICODE_NOT_PRESENT_OFFSET, 6777 }, { 0x2f96, G_UNICODE_NOT_PRESENT_OFFSET, 6781 }, { 0x2f97, G_UNICODE_NOT_PRESENT_OFFSET, 6785 }, { 0x2f98, G_UNICODE_NOT_PRESENT_OFFSET, 6789 }, { 0x2f99, G_UNICODE_NOT_PRESENT_OFFSET, 6793 }, { 0x2f9a, G_UNICODE_NOT_PRESENT_OFFSET, 6797 }, { 0x2f9b, G_UNICODE_NOT_PRESENT_OFFSET, 6801 }, { 0x2f9c, G_UNICODE_NOT_PRESENT_OFFSET, 6805 }, { 0x2f9d, G_UNICODE_NOT_PRESENT_OFFSET, 6809 }, { 0x2f9e, G_UNICODE_NOT_PRESENT_OFFSET, 6813 }, { 0x2f9f, G_UNICODE_NOT_PRESENT_OFFSET, 6817 }, { 0x2fa0, G_UNICODE_NOT_PRESENT_OFFSET, 6821 }, { 0x2fa1, G_UNICODE_NOT_PRESENT_OFFSET, 6825 }, { 0x2fa2, G_UNICODE_NOT_PRESENT_OFFSET, 6829 }, { 0x2fa3, G_UNICODE_NOT_PRESENT_OFFSET, 6833 }, { 0x2fa4, G_UNICODE_NOT_PRESENT_OFFSET, 6837 }, { 0x2fa5, G_UNICODE_NOT_PRESENT_OFFSET, 6841 }, { 0x2fa6, G_UNICODE_NOT_PRESENT_OFFSET, 6845 }, { 0x2fa7, G_UNICODE_NOT_PRESENT_OFFSET, 6849 }, { 0x2fa8, G_UNICODE_NOT_PRESENT_OFFSET, 6853 }, { 0x2fa9, G_UNICODE_NOT_PRESENT_OFFSET, 6857 }, { 0x2faa, G_UNICODE_NOT_PRESENT_OFFSET, 6861 }, { 0x2fab, G_UNICODE_NOT_PRESENT_OFFSET, 6865 }, { 0x2fac, G_UNICODE_NOT_PRESENT_OFFSET, 6869 }, { 0x2fad, G_UNICODE_NOT_PRESENT_OFFSET, 6873 }, { 0x2fae, G_UNICODE_NOT_PRESENT_OFFSET, 6877 }, { 0x2faf, G_UNICODE_NOT_PRESENT_OFFSET, 6881 }, { 0x2fb0, G_UNICODE_NOT_PRESENT_OFFSET, 6885 }, { 0x2fb1, G_UNICODE_NOT_PRESENT_OFFSET, 6889 }, { 0x2fb2, G_UNICODE_NOT_PRESENT_OFFSET, 6893 }, { 0x2fb3, G_UNICODE_NOT_PRESENT_OFFSET, 6897 }, { 0x2fb4, G_UNICODE_NOT_PRESENT_OFFSET, 6901 }, { 0x2fb5, G_UNICODE_NOT_PRESENT_OFFSET, 6905 }, { 0x2fb6, G_UNICODE_NOT_PRESENT_OFFSET, 6909 }, { 0x2fb7, G_UNICODE_NOT_PRESENT_OFFSET, 6913 }, { 0x2fb8, G_UNICODE_NOT_PRESENT_OFFSET, 6917 }, { 0x2fb9, G_UNICODE_NOT_PRESENT_OFFSET, 6921 }, { 0x2fba, G_UNICODE_NOT_PRESENT_OFFSET, 6925 }, { 0x2fbb, G_UNICODE_NOT_PRESENT_OFFSET, 6929 }, { 0x2fbc, G_UNICODE_NOT_PRESENT_OFFSET, 6933 }, { 0x2fbd, G_UNICODE_NOT_PRESENT_OFFSET, 6937 }, { 0x2fbe, G_UNICODE_NOT_PRESENT_OFFSET, 6941 }, { 0x2fbf, G_UNICODE_NOT_PRESENT_OFFSET, 6945 }, { 0x2fc0, G_UNICODE_NOT_PRESENT_OFFSET, 6949 }, { 0x2fc1, G_UNICODE_NOT_PRESENT_OFFSET, 6953 }, { 0x2fc2, G_UNICODE_NOT_PRESENT_OFFSET, 6957 }, { 0x2fc3, G_UNICODE_NOT_PRESENT_OFFSET, 6961 }, { 0x2fc4, G_UNICODE_NOT_PRESENT_OFFSET, 6965 }, { 0x2fc5, G_UNICODE_NOT_PRESENT_OFFSET, 6969 }, { 0x2fc6, G_UNICODE_NOT_PRESENT_OFFSET, 6973 }, { 0x2fc7, G_UNICODE_NOT_PRESENT_OFFSET, 6977 }, { 0x2fc8, G_UNICODE_NOT_PRESENT_OFFSET, 6981 }, { 0x2fc9, G_UNICODE_NOT_PRESENT_OFFSET, 6985 }, { 0x2fca, G_UNICODE_NOT_PRESENT_OFFSET, 6989 }, { 0x2fcb, G_UNICODE_NOT_PRESENT_OFFSET, 6993 }, { 0x2fcc, G_UNICODE_NOT_PRESENT_OFFSET, 6997 }, { 0x2fcd, G_UNICODE_NOT_PRESENT_OFFSET, 7001 }, { 0x2fce, G_UNICODE_NOT_PRESENT_OFFSET, 7005 }, { 0x2fcf, G_UNICODE_NOT_PRESENT_OFFSET, 7009 }, { 0x2fd0, G_UNICODE_NOT_PRESENT_OFFSET, 7013 }, { 0x2fd1, G_UNICODE_NOT_PRESENT_OFFSET, 7017 }, { 0x2fd2, G_UNICODE_NOT_PRESENT_OFFSET, 7021 }, { 0x2fd3, G_UNICODE_NOT_PRESENT_OFFSET, 7025 }, { 0x2fd4, G_UNICODE_NOT_PRESENT_OFFSET, 7029 }, { 0x2fd5, G_UNICODE_NOT_PRESENT_OFFSET, 7033 }, { 0x3000, G_UNICODE_NOT_PRESENT_OFFSET, 0 }, { 0x3036, G_UNICODE_NOT_PRESENT_OFFSET, 7037 }, { 0x3038, G_UNICODE_NOT_PRESENT_OFFSET, 6273 }, { 0x3039, G_UNICODE_NOT_PRESENT_OFFSET, 7041 }, { 0x303a, G_UNICODE_NOT_PRESENT_OFFSET, 7045 }, { 0x304c, 7049, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x304e, 7056, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x3050, 7063, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x3052, 7070, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x3054, 7077, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x3056, 7084, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x3058, 7091, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x305a, 7098, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x305c, 7105, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x305e, 7112, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x3060, 7119, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x3062, 7126, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x3065, 7133, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x3067, 7140, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x3069, 7147, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x3070, 7154, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x3071, 7161, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x3073, 7168, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x3074, 7175, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x3076, 7182, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x3077, 7189, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x3079, 7196, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x307a, 7203, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x307c, 7210, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x307d, 7217, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x3094, 7224, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x309b, G_UNICODE_NOT_PRESENT_OFFSET, 7231 }, { 0x309c, G_UNICODE_NOT_PRESENT_OFFSET, 7236 }, { 0x309e, 7241, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x309f, G_UNICODE_NOT_PRESENT_OFFSET, 7248 }, { 0x30ac, 7255, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x30ae, 7262, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x30b0, 7269, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x30b2, 7276, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x30b4, 7283, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x30b6, 7290, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x30b8, 7297, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x30ba, 7304, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x30bc, 7311, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x30be, 7318, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x30c0, 7325, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x30c2, 7332, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x30c5, 7339, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x30c7, 7346, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x30c9, 7353, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x30d0, 7360, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x30d1, 7367, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x30d3, 7374, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x30d4, 7381, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x30d6, 7388, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x30d7, 7395, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x30d9, 7402, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x30da, 7409, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x30dc, 7416, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x30dd, 7423, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x30f4, 7430, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x30f7, 7437, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x30f8, 7444, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x30f9, 7451, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x30fa, 7458, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x30fe, 7465, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x30ff, G_UNICODE_NOT_PRESENT_OFFSET, 7472 }, { 0x3131, G_UNICODE_NOT_PRESENT_OFFSET, 7479 }, { 0x3132, G_UNICODE_NOT_PRESENT_OFFSET, 7483 }, { 0x3133, G_UNICODE_NOT_PRESENT_OFFSET, 7487 }, { 0x3134, G_UNICODE_NOT_PRESENT_OFFSET, 7491 }, { 0x3135, G_UNICODE_NOT_PRESENT_OFFSET, 7495 }, { 0x3136, G_UNICODE_NOT_PRESENT_OFFSET, 7499 }, { 0x3137, G_UNICODE_NOT_PRESENT_OFFSET, 7503 }, { 0x3138, G_UNICODE_NOT_PRESENT_OFFSET, 7507 }, { 0x3139, G_UNICODE_NOT_PRESENT_OFFSET, 7511 }, { 0x313a, G_UNICODE_NOT_PRESENT_OFFSET, 7515 }, { 0x313b, G_UNICODE_NOT_PRESENT_OFFSET, 7519 }, { 0x313c, G_UNICODE_NOT_PRESENT_OFFSET, 7523 }, { 0x313d, G_UNICODE_NOT_PRESENT_OFFSET, 7527 }, { 0x313e, G_UNICODE_NOT_PRESENT_OFFSET, 7531 }, { 0x313f, G_UNICODE_NOT_PRESENT_OFFSET, 7535 }, { 0x3140, G_UNICODE_NOT_PRESENT_OFFSET, 7539 }, { 0x3141, G_UNICODE_NOT_PRESENT_OFFSET, 7543 }, { 0x3142, G_UNICODE_NOT_PRESENT_OFFSET, 7547 }, { 0x3143, G_UNICODE_NOT_PRESENT_OFFSET, 7551 }, { 0x3144, G_UNICODE_NOT_PRESENT_OFFSET, 7555 }, { 0x3145, G_UNICODE_NOT_PRESENT_OFFSET, 7559 }, { 0x3146, G_UNICODE_NOT_PRESENT_OFFSET, 7563 }, { 0x3147, G_UNICODE_NOT_PRESENT_OFFSET, 7567 }, { 0x3148, G_UNICODE_NOT_PRESENT_OFFSET, 7571 }, { 0x3149, G_UNICODE_NOT_PRESENT_OFFSET, 7575 }, { 0x314a, G_UNICODE_NOT_PRESENT_OFFSET, 7579 }, { 0x314b, G_UNICODE_NOT_PRESENT_OFFSET, 7583 }, { 0x314c, G_UNICODE_NOT_PRESENT_OFFSET, 7587 }, { 0x314d, G_UNICODE_NOT_PRESENT_OFFSET, 7591 }, { 0x314e, G_UNICODE_NOT_PRESENT_OFFSET, 7595 }, { 0x314f, G_UNICODE_NOT_PRESENT_OFFSET, 7599 }, { 0x3150, G_UNICODE_NOT_PRESENT_OFFSET, 7603 }, { 0x3151, G_UNICODE_NOT_PRESENT_OFFSET, 7607 }, { 0x3152, G_UNICODE_NOT_PRESENT_OFFSET, 7611 }, { 0x3153, G_UNICODE_NOT_PRESENT_OFFSET, 7615 }, { 0x3154, G_UNICODE_NOT_PRESENT_OFFSET, 7619 }, { 0x3155, G_UNICODE_NOT_PRESENT_OFFSET, 7623 }, { 0x3156, G_UNICODE_NOT_PRESENT_OFFSET, 7627 }, { 0x3157, G_UNICODE_NOT_PRESENT_OFFSET, 7631 }, { 0x3158, G_UNICODE_NOT_PRESENT_OFFSET, 7635 }, { 0x3159, G_UNICODE_NOT_PRESENT_OFFSET, 7639 }, { 0x315a, G_UNICODE_NOT_PRESENT_OFFSET, 7643 }, { 0x315b, G_UNICODE_NOT_PRESENT_OFFSET, 7647 }, { 0x315c, G_UNICODE_NOT_PRESENT_OFFSET, 7651 }, { 0x315d, G_UNICODE_NOT_PRESENT_OFFSET, 7655 }, { 0x315e, G_UNICODE_NOT_PRESENT_OFFSET, 7659 }, { 0x315f, G_UNICODE_NOT_PRESENT_OFFSET, 7663 }, { 0x3160, G_UNICODE_NOT_PRESENT_OFFSET, 7667 }, { 0x3161, G_UNICODE_NOT_PRESENT_OFFSET, 7671 }, { 0x3162, G_UNICODE_NOT_PRESENT_OFFSET, 7675 }, { 0x3163, G_UNICODE_NOT_PRESENT_OFFSET, 7679 }, { 0x3164, G_UNICODE_NOT_PRESENT_OFFSET, 7683 }, { 0x3165, G_UNICODE_NOT_PRESENT_OFFSET, 7687 }, { 0x3166, G_UNICODE_NOT_PRESENT_OFFSET, 7691 }, { 0x3167, G_UNICODE_NOT_PRESENT_OFFSET, 7695 }, { 0x3168, G_UNICODE_NOT_PRESENT_OFFSET, 7699 }, { 0x3169, G_UNICODE_NOT_PRESENT_OFFSET, 7703 }, { 0x316a, G_UNICODE_NOT_PRESENT_OFFSET, 7707 }, { 0x316b, G_UNICODE_NOT_PRESENT_OFFSET, 7711 }, { 0x316c, G_UNICODE_NOT_PRESENT_OFFSET, 7715 }, { 0x316d, G_UNICODE_NOT_PRESENT_OFFSET, 7719 }, { 0x316e, G_UNICODE_NOT_PRESENT_OFFSET, 7723 }, { 0x316f, G_UNICODE_NOT_PRESENT_OFFSET, 7727 }, { 0x3170, G_UNICODE_NOT_PRESENT_OFFSET, 7731 }, { 0x3171, G_UNICODE_NOT_PRESENT_OFFSET, 7735 }, { 0x3172, G_UNICODE_NOT_PRESENT_OFFSET, 7739 }, { 0x3173, G_UNICODE_NOT_PRESENT_OFFSET, 7743 }, { 0x3174, G_UNICODE_NOT_PRESENT_OFFSET, 7747 }, { 0x3175, G_UNICODE_NOT_PRESENT_OFFSET, 7751 }, { 0x3176, G_UNICODE_NOT_PRESENT_OFFSET, 7755 }, { 0x3177, G_UNICODE_NOT_PRESENT_OFFSET, 7759 }, { 0x3178, G_UNICODE_NOT_PRESENT_OFFSET, 7763 }, { 0x3179, G_UNICODE_NOT_PRESENT_OFFSET, 7767 }, { 0x317a, G_UNICODE_NOT_PRESENT_OFFSET, 7771 }, { 0x317b, G_UNICODE_NOT_PRESENT_OFFSET, 7775 }, { 0x317c, G_UNICODE_NOT_PRESENT_OFFSET, 7779 }, { 0x317d, G_UNICODE_NOT_PRESENT_OFFSET, 7783 }, { 0x317e, G_UNICODE_NOT_PRESENT_OFFSET, 7787 }, { 0x317f, G_UNICODE_NOT_PRESENT_OFFSET, 7791 }, { 0x3180, G_UNICODE_NOT_PRESENT_OFFSET, 7795 }, { 0x3181, G_UNICODE_NOT_PRESENT_OFFSET, 7799 }, { 0x3182, G_UNICODE_NOT_PRESENT_OFFSET, 7803 }, { 0x3183, G_UNICODE_NOT_PRESENT_OFFSET, 7807 }, { 0x3184, G_UNICODE_NOT_PRESENT_OFFSET, 7811 }, { 0x3185, G_UNICODE_NOT_PRESENT_OFFSET, 7815 }, { 0x3186, G_UNICODE_NOT_PRESENT_OFFSET, 7819 }, { 0x3187, G_UNICODE_NOT_PRESENT_OFFSET, 7823 }, { 0x3188, G_UNICODE_NOT_PRESENT_OFFSET, 7827 }, { 0x3189, G_UNICODE_NOT_PRESENT_OFFSET, 7831 }, { 0x318a, G_UNICODE_NOT_PRESENT_OFFSET, 7835 }, { 0x318b, G_UNICODE_NOT_PRESENT_OFFSET, 7839 }, { 0x318c, G_UNICODE_NOT_PRESENT_OFFSET, 7843 }, { 0x318d, G_UNICODE_NOT_PRESENT_OFFSET, 7847 }, { 0x318e, G_UNICODE_NOT_PRESENT_OFFSET, 7851 }, { 0x3192, G_UNICODE_NOT_PRESENT_OFFSET, 6181 }, { 0x3193, G_UNICODE_NOT_PRESENT_OFFSET, 6205 }, { 0x3194, G_UNICODE_NOT_PRESENT_OFFSET, 7855 }, { 0x3195, G_UNICODE_NOT_PRESENT_OFFSET, 7859 }, { 0x3196, G_UNICODE_NOT_PRESENT_OFFSET, 7863 }, { 0x3197, G_UNICODE_NOT_PRESENT_OFFSET, 7867 }, { 0x3198, G_UNICODE_NOT_PRESENT_OFFSET, 7871 }, { 0x3199, G_UNICODE_NOT_PRESENT_OFFSET, 7875 }, { 0x319a, G_UNICODE_NOT_PRESENT_OFFSET, 6197 }, { 0x319b, G_UNICODE_NOT_PRESENT_OFFSET, 7879 }, { 0x319c, G_UNICODE_NOT_PRESENT_OFFSET, 7883 }, { 0x319d, G_UNICODE_NOT_PRESENT_OFFSET, 7887 }, { 0x319e, G_UNICODE_NOT_PRESENT_OFFSET, 7891 }, { 0x319f, G_UNICODE_NOT_PRESENT_OFFSET, 6213 }, { 0x3200, G_UNICODE_NOT_PRESENT_OFFSET, 7895 }, { 0x3201, G_UNICODE_NOT_PRESENT_OFFSET, 7901 }, { 0x3202, G_UNICODE_NOT_PRESENT_OFFSET, 7907 }, { 0x3203, G_UNICODE_NOT_PRESENT_OFFSET, 7913 }, { 0x3204, G_UNICODE_NOT_PRESENT_OFFSET, 7919 }, { 0x3205, G_UNICODE_NOT_PRESENT_OFFSET, 7925 }, { 0x3206, G_UNICODE_NOT_PRESENT_OFFSET, 7931 }, { 0x3207, G_UNICODE_NOT_PRESENT_OFFSET, 7937 }, { 0x3208, G_UNICODE_NOT_PRESENT_OFFSET, 7943 }, { 0x3209, G_UNICODE_NOT_PRESENT_OFFSET, 7949 }, { 0x320a, G_UNICODE_NOT_PRESENT_OFFSET, 7955 }, { 0x320b, G_UNICODE_NOT_PRESENT_OFFSET, 7961 }, { 0x320c, G_UNICODE_NOT_PRESENT_OFFSET, 7967 }, { 0x320d, G_UNICODE_NOT_PRESENT_OFFSET, 7973 }, { 0x320e, G_UNICODE_NOT_PRESENT_OFFSET, 7979 }, { 0x320f, G_UNICODE_NOT_PRESENT_OFFSET, 7988 }, { 0x3210, G_UNICODE_NOT_PRESENT_OFFSET, 7997 }, { 0x3211, G_UNICODE_NOT_PRESENT_OFFSET, 8006 }, { 0x3212, G_UNICODE_NOT_PRESENT_OFFSET, 8015 }, { 0x3213, G_UNICODE_NOT_PRESENT_OFFSET, 8024 }, { 0x3214, G_UNICODE_NOT_PRESENT_OFFSET, 8033 }, { 0x3215, G_UNICODE_NOT_PRESENT_OFFSET, 8042 }, { 0x3216, G_UNICODE_NOT_PRESENT_OFFSET, 8051 }, { 0x3217, G_UNICODE_NOT_PRESENT_OFFSET, 8060 }, { 0x3218, G_UNICODE_NOT_PRESENT_OFFSET, 8069 }, { 0x3219, G_UNICODE_NOT_PRESENT_OFFSET, 8078 }, { 0x321a, G_UNICODE_NOT_PRESENT_OFFSET, 8087 }, { 0x321b, G_UNICODE_NOT_PRESENT_OFFSET, 8096 }, { 0x321c, G_UNICODE_NOT_PRESENT_OFFSET, 8105 }, { 0x321d, G_UNICODE_NOT_PRESENT_OFFSET, 8114 }, { 0x321e, G_UNICODE_NOT_PRESENT_OFFSET, 8132 }, { 0x3220, G_UNICODE_NOT_PRESENT_OFFSET, 8147 }, { 0x3221, G_UNICODE_NOT_PRESENT_OFFSET, 8153 }, { 0x3222, G_UNICODE_NOT_PRESENT_OFFSET, 8159 }, { 0x3223, G_UNICODE_NOT_PRESENT_OFFSET, 8165 }, { 0x3224, G_UNICODE_NOT_PRESENT_OFFSET, 8171 }, { 0x3225, G_UNICODE_NOT_PRESENT_OFFSET, 8177 }, { 0x3226, G_UNICODE_NOT_PRESENT_OFFSET, 8183 }, { 0x3227, G_UNICODE_NOT_PRESENT_OFFSET, 8189 }, { 0x3228, G_UNICODE_NOT_PRESENT_OFFSET, 8195 }, { 0x3229, G_UNICODE_NOT_PRESENT_OFFSET, 8201 }, { 0x322a, G_UNICODE_NOT_PRESENT_OFFSET, 8207 }, { 0x322b, G_UNICODE_NOT_PRESENT_OFFSET, 8213 }, { 0x322c, G_UNICODE_NOT_PRESENT_OFFSET, 8219 }, { 0x322d, G_UNICODE_NOT_PRESENT_OFFSET, 8225 }, { 0x322e, G_UNICODE_NOT_PRESENT_OFFSET, 8231 }, { 0x322f, G_UNICODE_NOT_PRESENT_OFFSET, 8237 }, { 0x3230, G_UNICODE_NOT_PRESENT_OFFSET, 8243 }, { 0x3231, G_UNICODE_NOT_PRESENT_OFFSET, 8249 }, { 0x3232, G_UNICODE_NOT_PRESENT_OFFSET, 8255 }, { 0x3233, G_UNICODE_NOT_PRESENT_OFFSET, 8261 }, { 0x3234, G_UNICODE_NOT_PRESENT_OFFSET, 8267 }, { 0x3235, G_UNICODE_NOT_PRESENT_OFFSET, 8273 }, { 0x3236, G_UNICODE_NOT_PRESENT_OFFSET, 8279 }, { 0x3237, G_UNICODE_NOT_PRESENT_OFFSET, 8285 }, { 0x3238, G_UNICODE_NOT_PRESENT_OFFSET, 8291 }, { 0x3239, G_UNICODE_NOT_PRESENT_OFFSET, 8297 }, { 0x323a, G_UNICODE_NOT_PRESENT_OFFSET, 8303 }, { 0x323b, G_UNICODE_NOT_PRESENT_OFFSET, 8309 }, { 0x323c, G_UNICODE_NOT_PRESENT_OFFSET, 8315 }, { 0x323d, G_UNICODE_NOT_PRESENT_OFFSET, 8321 }, { 0x323e, G_UNICODE_NOT_PRESENT_OFFSET, 8327 }, { 0x323f, G_UNICODE_NOT_PRESENT_OFFSET, 8333 }, { 0x3240, G_UNICODE_NOT_PRESENT_OFFSET, 8339 }, { 0x3241, G_UNICODE_NOT_PRESENT_OFFSET, 8345 }, { 0x3242, G_UNICODE_NOT_PRESENT_OFFSET, 8351 }, { 0x3243, G_UNICODE_NOT_PRESENT_OFFSET, 8357 }, { 0x3244, G_UNICODE_NOT_PRESENT_OFFSET, 8363 }, { 0x3245, G_UNICODE_NOT_PRESENT_OFFSET, 8367 }, { 0x3246, G_UNICODE_NOT_PRESENT_OFFSET, 6445 }, { 0x3247, G_UNICODE_NOT_PRESENT_OFFSET, 8371 }, { 0x3250, G_UNICODE_NOT_PRESENT_OFFSET, 8375 }, { 0x3251, G_UNICODE_NOT_PRESENT_OFFSET, 8379 }, { 0x3252, G_UNICODE_NOT_PRESENT_OFFSET, 8382 }, { 0x3253, G_UNICODE_NOT_PRESENT_OFFSET, 8385 }, { 0x3254, G_UNICODE_NOT_PRESENT_OFFSET, 8388 }, { 0x3255, G_UNICODE_NOT_PRESENT_OFFSET, 8391 }, { 0x3256, G_UNICODE_NOT_PRESENT_OFFSET, 8394 }, { 0x3257, G_UNICODE_NOT_PRESENT_OFFSET, 8397 }, { 0x3258, G_UNICODE_NOT_PRESENT_OFFSET, 8400 }, { 0x3259, G_UNICODE_NOT_PRESENT_OFFSET, 8403 }, { 0x325a, G_UNICODE_NOT_PRESENT_OFFSET, 8406 }, { 0x325b, G_UNICODE_NOT_PRESENT_OFFSET, 8409 }, { 0x325c, G_UNICODE_NOT_PRESENT_OFFSET, 8412 }, { 0x325d, G_UNICODE_NOT_PRESENT_OFFSET, 8415 }, { 0x325e, G_UNICODE_NOT_PRESENT_OFFSET, 8418 }, { 0x325f, G_UNICODE_NOT_PRESENT_OFFSET, 8421 }, { 0x3260, G_UNICODE_NOT_PRESENT_OFFSET, 7479 }, { 0x3261, G_UNICODE_NOT_PRESENT_OFFSET, 7491 }, { 0x3262, G_UNICODE_NOT_PRESENT_OFFSET, 7503 }, { 0x3263, G_UNICODE_NOT_PRESENT_OFFSET, 7511 }, { 0x3264, G_UNICODE_NOT_PRESENT_OFFSET, 7543 }, { 0x3265, G_UNICODE_NOT_PRESENT_OFFSET, 7547 }, { 0x3266, G_UNICODE_NOT_PRESENT_OFFSET, 7559 }, { 0x3267, G_UNICODE_NOT_PRESENT_OFFSET, 7567 }, { 0x3268, G_UNICODE_NOT_PRESENT_OFFSET, 7571 }, { 0x3269, G_UNICODE_NOT_PRESENT_OFFSET, 7579 }, { 0x326a, G_UNICODE_NOT_PRESENT_OFFSET, 7583 }, { 0x326b, G_UNICODE_NOT_PRESENT_OFFSET, 7587 }, { 0x326c, G_UNICODE_NOT_PRESENT_OFFSET, 7591 }, { 0x326d, G_UNICODE_NOT_PRESENT_OFFSET, 7595 }, { 0x326e, G_UNICODE_NOT_PRESENT_OFFSET, 8424 }, { 0x326f, G_UNICODE_NOT_PRESENT_OFFSET, 8431 }, { 0x3270, G_UNICODE_NOT_PRESENT_OFFSET, 8438 }, { 0x3271, G_UNICODE_NOT_PRESENT_OFFSET, 8445 }, { 0x3272, G_UNICODE_NOT_PRESENT_OFFSET, 8452 }, { 0x3273, G_UNICODE_NOT_PRESENT_OFFSET, 8459 }, { 0x3274, G_UNICODE_NOT_PRESENT_OFFSET, 8466 }, { 0x3275, G_UNICODE_NOT_PRESENT_OFFSET, 8473 }, { 0x3276, G_UNICODE_NOT_PRESENT_OFFSET, 8480 }, { 0x3277, G_UNICODE_NOT_PRESENT_OFFSET, 8487 }, { 0x3278, G_UNICODE_NOT_PRESENT_OFFSET, 8494 }, { 0x3279, G_UNICODE_NOT_PRESENT_OFFSET, 8501 }, { 0x327a, G_UNICODE_NOT_PRESENT_OFFSET, 8508 }, { 0x327b, G_UNICODE_NOT_PRESENT_OFFSET, 8515 }, { 0x327c, G_UNICODE_NOT_PRESENT_OFFSET, 8522 }, { 0x327d, G_UNICODE_NOT_PRESENT_OFFSET, 8538 }, { 0x327e, G_UNICODE_NOT_PRESENT_OFFSET, 8551 }, { 0x3280, G_UNICODE_NOT_PRESENT_OFFSET, 6181 }, { 0x3281, G_UNICODE_NOT_PRESENT_OFFSET, 6205 }, { 0x3282, G_UNICODE_NOT_PRESENT_OFFSET, 7855 }, { 0x3283, G_UNICODE_NOT_PRESENT_OFFSET, 7859 }, { 0x3284, G_UNICODE_NOT_PRESENT_OFFSET, 8558 }, { 0x3285, G_UNICODE_NOT_PRESENT_OFFSET, 8562 }, { 0x3286, G_UNICODE_NOT_PRESENT_OFFSET, 8566 }, { 0x3287, G_UNICODE_NOT_PRESENT_OFFSET, 6225 }, { 0x3288, G_UNICODE_NOT_PRESENT_OFFSET, 8570 }, { 0x3289, G_UNICODE_NOT_PRESENT_OFFSET, 6273 }, { 0x328a, G_UNICODE_NOT_PRESENT_OFFSET, 6473 }, { 0x328b, G_UNICODE_NOT_PRESENT_OFFSET, 6521 }, { 0x328c, G_UNICODE_NOT_PRESENT_OFFSET, 6517 }, { 0x328d, G_UNICODE_NOT_PRESENT_OFFSET, 6477 }, { 0x328e, G_UNICODE_NOT_PRESENT_OFFSET, 6845 }, { 0x328f, G_UNICODE_NOT_PRESENT_OFFSET, 6305 }, { 0x3290, G_UNICODE_NOT_PRESENT_OFFSET, 6465 }, { 0x3291, G_UNICODE_NOT_PRESENT_OFFSET, 8574 }, { 0x3292, G_UNICODE_NOT_PRESENT_OFFSET, 8578 }, { 0x3293, G_UNICODE_NOT_PRESENT_OFFSET, 8582 }, { 0x3294, G_UNICODE_NOT_PRESENT_OFFSET, 8586 }, { 0x3295, G_UNICODE_NOT_PRESENT_OFFSET, 8590 }, { 0x3296, G_UNICODE_NOT_PRESENT_OFFSET, 8594 }, { 0x3297, G_UNICODE_NOT_PRESENT_OFFSET, 8598 }, { 0x3298, G_UNICODE_NOT_PRESENT_OFFSET, 8602 }, { 0x3299, G_UNICODE_NOT_PRESENT_OFFSET, 8606 }, { 0x329a, G_UNICODE_NOT_PRESENT_OFFSET, 8610 }, { 0x329b, G_UNICODE_NOT_PRESENT_OFFSET, 6329 }, { 0x329c, G_UNICODE_NOT_PRESENT_OFFSET, 8614 }, { 0x329d, G_UNICODE_NOT_PRESENT_OFFSET, 8618 }, { 0x329e, G_UNICODE_NOT_PRESENT_OFFSET, 8622 }, { 0x329f, G_UNICODE_NOT_PRESENT_OFFSET, 8626 }, { 0x32a0, G_UNICODE_NOT_PRESENT_OFFSET, 8630 }, { 0x32a1, G_UNICODE_NOT_PRESENT_OFFSET, 8634 }, { 0x32a2, G_UNICODE_NOT_PRESENT_OFFSET, 8638 }, { 0x32a3, G_UNICODE_NOT_PRESENT_OFFSET, 8642 }, { 0x32a4, G_UNICODE_NOT_PRESENT_OFFSET, 7863 }, { 0x32a5, G_UNICODE_NOT_PRESENT_OFFSET, 7867 }, { 0x32a6, G_UNICODE_NOT_PRESENT_OFFSET, 7871 }, { 0x32a7, G_UNICODE_NOT_PRESENT_OFFSET, 8646 }, { 0x32a8, G_UNICODE_NOT_PRESENT_OFFSET, 8650 }, { 0x32a9, G_UNICODE_NOT_PRESENT_OFFSET, 8654 }, { 0x32aa, G_UNICODE_NOT_PRESENT_OFFSET, 8658 }, { 0x32ab, G_UNICODE_NOT_PRESENT_OFFSET, 8662 }, { 0x32ac, G_UNICODE_NOT_PRESENT_OFFSET, 8666 }, { 0x32ad, G_UNICODE_NOT_PRESENT_OFFSET, 8670 }, { 0x32ae, G_UNICODE_NOT_PRESENT_OFFSET, 8674 }, { 0x32af, G_UNICODE_NOT_PRESENT_OFFSET, 8678 }, { 0x32b0, G_UNICODE_NOT_PRESENT_OFFSET, 8682 }, { 0x32b1, G_UNICODE_NOT_PRESENT_OFFSET, 8686 }, { 0x32b2, G_UNICODE_NOT_PRESENT_OFFSET, 8689 }, { 0x32b3, G_UNICODE_NOT_PRESENT_OFFSET, 8692 }, { 0x32b4, G_UNICODE_NOT_PRESENT_OFFSET, 8695 }, { 0x32b5, G_UNICODE_NOT_PRESENT_OFFSET, 8698 }, { 0x32b6, G_UNICODE_NOT_PRESENT_OFFSET, 8701 }, { 0x32b7, G_UNICODE_NOT_PRESENT_OFFSET, 8704 }, { 0x32b8, G_UNICODE_NOT_PRESENT_OFFSET, 8707 }, { 0x32b9, G_UNICODE_NOT_PRESENT_OFFSET, 8710 }, { 0x32ba, G_UNICODE_NOT_PRESENT_OFFSET, 8713 }, { 0x32bb, G_UNICODE_NOT_PRESENT_OFFSET, 8716 }, { 0x32bc, G_UNICODE_NOT_PRESENT_OFFSET, 8719 }, { 0x32bd, G_UNICODE_NOT_PRESENT_OFFSET, 8722 }, { 0x32be, G_UNICODE_NOT_PRESENT_OFFSET, 8725 }, { 0x32bf, G_UNICODE_NOT_PRESENT_OFFSET, 8728 }, { 0x32c0, G_UNICODE_NOT_PRESENT_OFFSET, 8731 }, { 0x32c1, G_UNICODE_NOT_PRESENT_OFFSET, 8736 }, { 0x32c2, G_UNICODE_NOT_PRESENT_OFFSET, 8741 }, { 0x32c3, G_UNICODE_NOT_PRESENT_OFFSET, 8746 }, { 0x32c4, G_UNICODE_NOT_PRESENT_OFFSET, 8751 }, { 0x32c5, G_UNICODE_NOT_PRESENT_OFFSET, 8756 }, { 0x32c6, G_UNICODE_NOT_PRESENT_OFFSET, 8761 }, { 0x32c7, G_UNICODE_NOT_PRESENT_OFFSET, 8766 }, { 0x32c8, G_UNICODE_NOT_PRESENT_OFFSET, 8771 }, { 0x32c9, G_UNICODE_NOT_PRESENT_OFFSET, 8776 }, { 0x32ca, G_UNICODE_NOT_PRESENT_OFFSET, 8782 }, { 0x32cb, G_UNICODE_NOT_PRESENT_OFFSET, 8788 }, { 0x32cc, G_UNICODE_NOT_PRESENT_OFFSET, 8794 }, { 0x32cd, G_UNICODE_NOT_PRESENT_OFFSET, 8797 }, { 0x32ce, G_UNICODE_NOT_PRESENT_OFFSET, 8801 }, { 0x32cf, G_UNICODE_NOT_PRESENT_OFFSET, 8804 }, { 0x32d0, G_UNICODE_NOT_PRESENT_OFFSET, 8808 }, { 0x32d1, G_UNICODE_NOT_PRESENT_OFFSET, 8812 }, { 0x32d2, G_UNICODE_NOT_PRESENT_OFFSET, 8816 }, { 0x32d3, G_UNICODE_NOT_PRESENT_OFFSET, 8820 }, { 0x32d4, G_UNICODE_NOT_PRESENT_OFFSET, 8824 }, { 0x32d5, G_UNICODE_NOT_PRESENT_OFFSET, 8828 }, { 0x32d6, G_UNICODE_NOT_PRESENT_OFFSET, 8832 }, { 0x32d7, G_UNICODE_NOT_PRESENT_OFFSET, 8836 }, { 0x32d8, G_UNICODE_NOT_PRESENT_OFFSET, 8840 }, { 0x32d9, G_UNICODE_NOT_PRESENT_OFFSET, 8844 }, { 0x32da, G_UNICODE_NOT_PRESENT_OFFSET, 8848 }, { 0x32db, G_UNICODE_NOT_PRESENT_OFFSET, 8852 }, { 0x32dc, G_UNICODE_NOT_PRESENT_OFFSET, 8856 }, { 0x32dd, G_UNICODE_NOT_PRESENT_OFFSET, 8860 }, { 0x32de, G_UNICODE_NOT_PRESENT_OFFSET, 8864 }, { 0x32df, G_UNICODE_NOT_PRESENT_OFFSET, 8868 }, { 0x32e0, G_UNICODE_NOT_PRESENT_OFFSET, 8872 }, { 0x32e1, G_UNICODE_NOT_PRESENT_OFFSET, 8876 }, { 0x32e2, G_UNICODE_NOT_PRESENT_OFFSET, 8880 }, { 0x32e3, G_UNICODE_NOT_PRESENT_OFFSET, 8884 }, { 0x32e4, G_UNICODE_NOT_PRESENT_OFFSET, 8888 }, { 0x32e5, G_UNICODE_NOT_PRESENT_OFFSET, 8892 }, { 0x32e6, G_UNICODE_NOT_PRESENT_OFFSET, 8896 }, { 0x32e7, G_UNICODE_NOT_PRESENT_OFFSET, 8900 }, { 0x32e8, G_UNICODE_NOT_PRESENT_OFFSET, 8904 }, { 0x32e9, G_UNICODE_NOT_PRESENT_OFFSET, 8908 }, { 0x32ea, G_UNICODE_NOT_PRESENT_OFFSET, 8912 }, { 0x32eb, G_UNICODE_NOT_PRESENT_OFFSET, 8916 }, { 0x32ec, G_UNICODE_NOT_PRESENT_OFFSET, 8920 }, { 0x32ed, G_UNICODE_NOT_PRESENT_OFFSET, 8924 }, { 0x32ee, G_UNICODE_NOT_PRESENT_OFFSET, 8928 }, { 0x32ef, G_UNICODE_NOT_PRESENT_OFFSET, 8932 }, { 0x32f0, G_UNICODE_NOT_PRESENT_OFFSET, 8936 }, { 0x32f1, G_UNICODE_NOT_PRESENT_OFFSET, 8940 }, { 0x32f2, G_UNICODE_NOT_PRESENT_OFFSET, 8944 }, { 0x32f3, G_UNICODE_NOT_PRESENT_OFFSET, 8948 }, { 0x32f4, G_UNICODE_NOT_PRESENT_OFFSET, 8952 }, { 0x32f5, G_UNICODE_NOT_PRESENT_OFFSET, 8956 }, { 0x32f6, G_UNICODE_NOT_PRESENT_OFFSET, 8960 }, { 0x32f7, G_UNICODE_NOT_PRESENT_OFFSET, 8964 }, { 0x32f8, G_UNICODE_NOT_PRESENT_OFFSET, 8968 }, { 0x32f9, G_UNICODE_NOT_PRESENT_OFFSET, 8972 }, { 0x32fa, G_UNICODE_NOT_PRESENT_OFFSET, 8976 }, { 0x32fb, G_UNICODE_NOT_PRESENT_OFFSET, 8980 }, { 0x32fc, G_UNICODE_NOT_PRESENT_OFFSET, 8984 }, { 0x32fd, G_UNICODE_NOT_PRESENT_OFFSET, 8988 }, { 0x32fe, G_UNICODE_NOT_PRESENT_OFFSET, 8992 }, { 0x3300, G_UNICODE_NOT_PRESENT_OFFSET, 8996 }, { 0x3301, G_UNICODE_NOT_PRESENT_OFFSET, 9012 }, { 0x3302, G_UNICODE_NOT_PRESENT_OFFSET, 9025 }, { 0x3303, G_UNICODE_NOT_PRESENT_OFFSET, 9041 }, { 0x3304, G_UNICODE_NOT_PRESENT_OFFSET, 9051 }, { 0x3305, G_UNICODE_NOT_PRESENT_OFFSET, 9067 }, { 0x3306, G_UNICODE_NOT_PRESENT_OFFSET, 9077 }, { 0x3307, G_UNICODE_NOT_PRESENT_OFFSET, 9087 }, { 0x3308, G_UNICODE_NOT_PRESENT_OFFSET, 9106 }, { 0x3309, G_UNICODE_NOT_PRESENT_OFFSET, 9119 }, { 0x330a, G_UNICODE_NOT_PRESENT_OFFSET, 9129 }, { 0x330b, G_UNICODE_NOT_PRESENT_OFFSET, 9139 }, { 0x330c, G_UNICODE_NOT_PRESENT_OFFSET, 9149 }, { 0x330d, G_UNICODE_NOT_PRESENT_OFFSET, 9162 }, { 0x330e, G_UNICODE_NOT_PRESENT_OFFSET, 9175 }, { 0x330f, G_UNICODE_NOT_PRESENT_OFFSET, 9188 }, { 0x3310, G_UNICODE_NOT_PRESENT_OFFSET, 9201 }, { 0x3311, G_UNICODE_NOT_PRESENT_OFFSET, 9214 }, { 0x3312, G_UNICODE_NOT_PRESENT_OFFSET, 9227 }, { 0x3313, G_UNICODE_NOT_PRESENT_OFFSET, 9240 }, { 0x3314, G_UNICODE_NOT_PRESENT_OFFSET, 9259 }, { 0x3315, G_UNICODE_NOT_PRESENT_OFFSET, 9266 }, { 0x3316, G_UNICODE_NOT_PRESENT_OFFSET, 9285 }, { 0x3317, G_UNICODE_NOT_PRESENT_OFFSET, 9304 }, { 0x3318, G_UNICODE_NOT_PRESENT_OFFSET, 9320 }, { 0x3319, G_UNICODE_NOT_PRESENT_OFFSET, 9333 }, { 0x331a, G_UNICODE_NOT_PRESENT_OFFSET, 9352 }, { 0x331b, G_UNICODE_NOT_PRESENT_OFFSET, 9371 }, { 0x331c, G_UNICODE_NOT_PRESENT_OFFSET, 9384 }, { 0x331d, G_UNICODE_NOT_PRESENT_OFFSET, 9394 }, { 0x331e, G_UNICODE_NOT_PRESENT_OFFSET, 9404 }, { 0x331f, G_UNICODE_NOT_PRESENT_OFFSET, 9417 }, { 0x3320, G_UNICODE_NOT_PRESENT_OFFSET, 9430 }, { 0x3321, G_UNICODE_NOT_PRESENT_OFFSET, 9446 }, { 0x3322, G_UNICODE_NOT_PRESENT_OFFSET, 9462 }, { 0x3323, G_UNICODE_NOT_PRESENT_OFFSET, 9472 }, { 0x3324, G_UNICODE_NOT_PRESENT_OFFSET, 9482 }, { 0x3325, G_UNICODE_NOT_PRESENT_OFFSET, 9495 }, { 0x3326, G_UNICODE_NOT_PRESENT_OFFSET, 9505 }, { 0x3327, G_UNICODE_NOT_PRESENT_OFFSET, 9515 }, { 0x3328, G_UNICODE_NOT_PRESENT_OFFSET, 9522 }, { 0x3329, G_UNICODE_NOT_PRESENT_OFFSET, 9529 }, { 0x332a, G_UNICODE_NOT_PRESENT_OFFSET, 9539 }, { 0x332b, G_UNICODE_NOT_PRESENT_OFFSET, 9549 }, { 0x332c, G_UNICODE_NOT_PRESENT_OFFSET, 9568 }, { 0x332d, G_UNICODE_NOT_PRESENT_OFFSET, 9581 }, { 0x332e, G_UNICODE_NOT_PRESENT_OFFSET, 9597 }, { 0x332f, G_UNICODE_NOT_PRESENT_OFFSET, 9616 }, { 0x3330, G_UNICODE_NOT_PRESENT_OFFSET, 9629 }, { 0x3331, G_UNICODE_NOT_PRESENT_OFFSET, 9639 }, { 0x3332, G_UNICODE_NOT_PRESENT_OFFSET, 9649 }, { 0x3333, G_UNICODE_NOT_PRESENT_OFFSET, 9668 }, { 0x3334, G_UNICODE_NOT_PRESENT_OFFSET, 9681 }, { 0x3335, G_UNICODE_NOT_PRESENT_OFFSET, 9700 }, { 0x3336, G_UNICODE_NOT_PRESENT_OFFSET, 9710 }, { 0x3337, G_UNICODE_NOT_PRESENT_OFFSET, 9726 }, { 0x3338, G_UNICODE_NOT_PRESENT_OFFSET, 9736 }, { 0x3339, G_UNICODE_NOT_PRESENT_OFFSET, 9749 }, { 0x333a, G_UNICODE_NOT_PRESENT_OFFSET, 9759 }, { 0x333b, G_UNICODE_NOT_PRESENT_OFFSET, 9772 }, { 0x333c, G_UNICODE_NOT_PRESENT_OFFSET, 9788 }, { 0x333d, G_UNICODE_NOT_PRESENT_OFFSET, 9801 }, { 0x333e, G_UNICODE_NOT_PRESENT_OFFSET, 9817 }, { 0x333f, G_UNICODE_NOT_PRESENT_OFFSET, 9830 }, { 0x3340, G_UNICODE_NOT_PRESENT_OFFSET, 9837 }, { 0x3341, G_UNICODE_NOT_PRESENT_OFFSET, 9853 }, { 0x3342, G_UNICODE_NOT_PRESENT_OFFSET, 9863 }, { 0x3343, G_UNICODE_NOT_PRESENT_OFFSET, 9873 }, { 0x3344, G_UNICODE_NOT_PRESENT_OFFSET, 9886 }, { 0x3345, G_UNICODE_NOT_PRESENT_OFFSET, 9896 }, { 0x3346, G_UNICODE_NOT_PRESENT_OFFSET, 9906 }, { 0x3347, G_UNICODE_NOT_PRESENT_OFFSET, 9916 }, { 0x3348, G_UNICODE_NOT_PRESENT_OFFSET, 9932 }, { 0x3349, G_UNICODE_NOT_PRESENT_OFFSET, 9945 }, { 0x334a, G_UNICODE_NOT_PRESENT_OFFSET, 9952 }, { 0x334b, G_UNICODE_NOT_PRESENT_OFFSET, 9971 }, { 0x334c, G_UNICODE_NOT_PRESENT_OFFSET, 9981 }, { 0x334d, G_UNICODE_NOT_PRESENT_OFFSET, 9997 }, { 0x334e, G_UNICODE_NOT_PRESENT_OFFSET, 10010 }, { 0x334f, G_UNICODE_NOT_PRESENT_OFFSET, 10023 }, { 0x3350, G_UNICODE_NOT_PRESENT_OFFSET, 10033 }, { 0x3351, G_UNICODE_NOT_PRESENT_OFFSET, 10043 }, { 0x3352, G_UNICODE_NOT_PRESENT_OFFSET, 10056 }, { 0x3353, G_UNICODE_NOT_PRESENT_OFFSET, 10063 }, { 0x3354, G_UNICODE_NOT_PRESENT_OFFSET, 10076 }, { 0x3355, G_UNICODE_NOT_PRESENT_OFFSET, 10092 }, { 0x3356, G_UNICODE_NOT_PRESENT_OFFSET, 10099 }, { 0x3357, G_UNICODE_NOT_PRESENT_OFFSET, 10118 }, { 0x3358, G_UNICODE_NOT_PRESENT_OFFSET, 10128 }, { 0x3359, G_UNICODE_NOT_PRESENT_OFFSET, 10133 }, { 0x335a, G_UNICODE_NOT_PRESENT_OFFSET, 10138 }, { 0x335b, G_UNICODE_NOT_PRESENT_OFFSET, 10143 }, { 0x335c, G_UNICODE_NOT_PRESENT_OFFSET, 10148 }, { 0x335d, G_UNICODE_NOT_PRESENT_OFFSET, 10153 }, { 0x335e, G_UNICODE_NOT_PRESENT_OFFSET, 10158 }, { 0x335f, G_UNICODE_NOT_PRESENT_OFFSET, 10163 }, { 0x3360, G_UNICODE_NOT_PRESENT_OFFSET, 10168 }, { 0x3361, G_UNICODE_NOT_PRESENT_OFFSET, 10173 }, { 0x3362, G_UNICODE_NOT_PRESENT_OFFSET, 10178 }, { 0x3363, G_UNICODE_NOT_PRESENT_OFFSET, 10184 }, { 0x3364, G_UNICODE_NOT_PRESENT_OFFSET, 10190 }, { 0x3365, G_UNICODE_NOT_PRESENT_OFFSET, 10196 }, { 0x3366, G_UNICODE_NOT_PRESENT_OFFSET, 10202 }, { 0x3367, G_UNICODE_NOT_PRESENT_OFFSET, 10208 }, { 0x3368, G_UNICODE_NOT_PRESENT_OFFSET, 10214 }, { 0x3369, G_UNICODE_NOT_PRESENT_OFFSET, 10220 }, { 0x336a, G_UNICODE_NOT_PRESENT_OFFSET, 10226 }, { 0x336b, G_UNICODE_NOT_PRESENT_OFFSET, 10232 }, { 0x336c, G_UNICODE_NOT_PRESENT_OFFSET, 10238 }, { 0x336d, G_UNICODE_NOT_PRESENT_OFFSET, 10244 }, { 0x336e, G_UNICODE_NOT_PRESENT_OFFSET, 10250 }, { 0x336f, G_UNICODE_NOT_PRESENT_OFFSET, 10256 }, { 0x3370, G_UNICODE_NOT_PRESENT_OFFSET, 10262 }, { 0x3371, G_UNICODE_NOT_PRESENT_OFFSET, 10268 }, { 0x3372, G_UNICODE_NOT_PRESENT_OFFSET, 10272 }, { 0x3373, G_UNICODE_NOT_PRESENT_OFFSET, 10275 }, { 0x3374, G_UNICODE_NOT_PRESENT_OFFSET, 10278 }, { 0x3375, G_UNICODE_NOT_PRESENT_OFFSET, 10282 }, { 0x3376, G_UNICODE_NOT_PRESENT_OFFSET, 10285 }, { 0x3377, G_UNICODE_NOT_PRESENT_OFFSET, 10288 }, { 0x3378, G_UNICODE_NOT_PRESENT_OFFSET, 10291 }, { 0x3379, G_UNICODE_NOT_PRESENT_OFFSET, 10295 }, { 0x337a, G_UNICODE_NOT_PRESENT_OFFSET, 10299 }, { 0x337b, G_UNICODE_NOT_PRESENT_OFFSET, 10302 }, { 0x337c, G_UNICODE_NOT_PRESENT_OFFSET, 10309 }, { 0x337d, G_UNICODE_NOT_PRESENT_OFFSET, 10316 }, { 0x337e, G_UNICODE_NOT_PRESENT_OFFSET, 10323 }, { 0x337f, G_UNICODE_NOT_PRESENT_OFFSET, 10330 }, { 0x3380, G_UNICODE_NOT_PRESENT_OFFSET, 10343 }, { 0x3381, G_UNICODE_NOT_PRESENT_OFFSET, 10346 }, { 0x3382, G_UNICODE_NOT_PRESENT_OFFSET, 10349 }, { 0x3383, G_UNICODE_NOT_PRESENT_OFFSET, 10353 }, { 0x3384, G_UNICODE_NOT_PRESENT_OFFSET, 10356 }, { 0x3385, G_UNICODE_NOT_PRESENT_OFFSET, 10359 }, { 0x3386, G_UNICODE_NOT_PRESENT_OFFSET, 10362 }, { 0x3387, G_UNICODE_NOT_PRESENT_OFFSET, 10365 }, { 0x3388, G_UNICODE_NOT_PRESENT_OFFSET, 10368 }, { 0x3389, G_UNICODE_NOT_PRESENT_OFFSET, 10372 }, { 0x338a, G_UNICODE_NOT_PRESENT_OFFSET, 10377 }, { 0x338b, G_UNICODE_NOT_PRESENT_OFFSET, 10380 }, { 0x338c, G_UNICODE_NOT_PRESENT_OFFSET, 10383 }, { 0x338d, G_UNICODE_NOT_PRESENT_OFFSET, 10387 }, { 0x338e, G_UNICODE_NOT_PRESENT_OFFSET, 10391 }, { 0x338f, G_UNICODE_NOT_PRESENT_OFFSET, 10394 }, { 0x3390, G_UNICODE_NOT_PRESENT_OFFSET, 10397 }, { 0x3391, G_UNICODE_NOT_PRESENT_OFFSET, 10400 }, { 0x3392, G_UNICODE_NOT_PRESENT_OFFSET, 10404 }, { 0x3393, G_UNICODE_NOT_PRESENT_OFFSET, 10408 }, { 0x3394, G_UNICODE_NOT_PRESENT_OFFSET, 10412 }, { 0x3395, G_UNICODE_NOT_PRESENT_OFFSET, 10416 }, { 0x3396, G_UNICODE_NOT_PRESENT_OFFSET, 10420 }, { 0x3397, G_UNICODE_NOT_PRESENT_OFFSET, 10423 }, { 0x3398, G_UNICODE_NOT_PRESENT_OFFSET, 10426 }, { 0x3399, G_UNICODE_NOT_PRESENT_OFFSET, 10429 }, { 0x339a, G_UNICODE_NOT_PRESENT_OFFSET, 10432 }, { 0x339b, G_UNICODE_NOT_PRESENT_OFFSET, 10435 }, { 0x339c, G_UNICODE_NOT_PRESENT_OFFSET, 10439 }, { 0x339d, G_UNICODE_NOT_PRESENT_OFFSET, 10442 }, { 0x339e, G_UNICODE_NOT_PRESENT_OFFSET, 10445 }, { 0x339f, G_UNICODE_NOT_PRESENT_OFFSET, 10448 }, { 0x33a0, G_UNICODE_NOT_PRESENT_OFFSET, 10452 }, { 0x33a1, G_UNICODE_NOT_PRESENT_OFFSET, 10456 }, { 0x33a2, G_UNICODE_NOT_PRESENT_OFFSET, 10459 }, { 0x33a3, G_UNICODE_NOT_PRESENT_OFFSET, 10463 }, { 0x33a4, G_UNICODE_NOT_PRESENT_OFFSET, 10467 }, { 0x33a5, G_UNICODE_NOT_PRESENT_OFFSET, 10471 }, { 0x33a6, G_UNICODE_NOT_PRESENT_OFFSET, 10474 }, { 0x33a7, G_UNICODE_NOT_PRESENT_OFFSET, 10478 }, { 0x33a8, G_UNICODE_NOT_PRESENT_OFFSET, 10484 }, { 0x33a9, G_UNICODE_NOT_PRESENT_OFFSET, 10491 }, { 0x33aa, G_UNICODE_NOT_PRESENT_OFFSET, 10494 }, { 0x33ab, G_UNICODE_NOT_PRESENT_OFFSET, 10498 }, { 0x33ac, G_UNICODE_NOT_PRESENT_OFFSET, 10502 }, { 0x33ad, G_UNICODE_NOT_PRESENT_OFFSET, 10506 }, { 0x33ae, G_UNICODE_NOT_PRESENT_OFFSET, 10510 }, { 0x33af, G_UNICODE_NOT_PRESENT_OFFSET, 10518 }, { 0x33b0, G_UNICODE_NOT_PRESENT_OFFSET, 10527 }, { 0x33b1, G_UNICODE_NOT_PRESENT_OFFSET, 10530 }, { 0x33b2, G_UNICODE_NOT_PRESENT_OFFSET, 10533 }, { 0x33b3, G_UNICODE_NOT_PRESENT_OFFSET, 10537 }, { 0x33b4, G_UNICODE_NOT_PRESENT_OFFSET, 10540 }, { 0x33b5, G_UNICODE_NOT_PRESENT_OFFSET, 10543 }, { 0x33b6, G_UNICODE_NOT_PRESENT_OFFSET, 10546 }, { 0x33b7, G_UNICODE_NOT_PRESENT_OFFSET, 10550 }, { 0x33b8, G_UNICODE_NOT_PRESENT_OFFSET, 10553 }, { 0x33b9, G_UNICODE_NOT_PRESENT_OFFSET, 10556 }, { 0x33ba, G_UNICODE_NOT_PRESENT_OFFSET, 10559 }, { 0x33bb, G_UNICODE_NOT_PRESENT_OFFSET, 10562 }, { 0x33bc, G_UNICODE_NOT_PRESENT_OFFSET, 10565 }, { 0x33bd, G_UNICODE_NOT_PRESENT_OFFSET, 10569 }, { 0x33be, G_UNICODE_NOT_PRESENT_OFFSET, 10572 }, { 0x33bf, G_UNICODE_NOT_PRESENT_OFFSET, 10575 }, { 0x33c0, G_UNICODE_NOT_PRESENT_OFFSET, 10578 }, { 0x33c1, G_UNICODE_NOT_PRESENT_OFFSET, 10582 }, { 0x33c2, G_UNICODE_NOT_PRESENT_OFFSET, 10586 }, { 0x33c3, G_UNICODE_NOT_PRESENT_OFFSET, 10591 }, { 0x33c4, G_UNICODE_NOT_PRESENT_OFFSET, 10594 }, { 0x33c5, G_UNICODE_NOT_PRESENT_OFFSET, 10597 }, { 0x33c6, G_UNICODE_NOT_PRESENT_OFFSET, 10600 }, { 0x33c7, G_UNICODE_NOT_PRESENT_OFFSET, 10607 }, { 0x33c8, G_UNICODE_NOT_PRESENT_OFFSET, 10611 }, { 0x33c9, G_UNICODE_NOT_PRESENT_OFFSET, 10614 }, { 0x33ca, G_UNICODE_NOT_PRESENT_OFFSET, 10617 }, { 0x33cb, G_UNICODE_NOT_PRESENT_OFFSET, 10620 }, { 0x33cc, G_UNICODE_NOT_PRESENT_OFFSET, 10623 }, { 0x33cd, G_UNICODE_NOT_PRESENT_OFFSET, 10626 }, { 0x33ce, G_UNICODE_NOT_PRESENT_OFFSET, 10629 }, { 0x33cf, G_UNICODE_NOT_PRESENT_OFFSET, 10632 }, { 0x33d0, G_UNICODE_NOT_PRESENT_OFFSET, 10635 }, { 0x33d1, G_UNICODE_NOT_PRESENT_OFFSET, 10638 }, { 0x33d2, G_UNICODE_NOT_PRESENT_OFFSET, 10641 }, { 0x33d3, G_UNICODE_NOT_PRESENT_OFFSET, 10645 }, { 0x33d4, G_UNICODE_NOT_PRESENT_OFFSET, 10648 }, { 0x33d5, G_UNICODE_NOT_PRESENT_OFFSET, 10651 }, { 0x33d6, G_UNICODE_NOT_PRESENT_OFFSET, 10655 }, { 0x33d7, G_UNICODE_NOT_PRESENT_OFFSET, 10659 }, { 0x33d8, G_UNICODE_NOT_PRESENT_OFFSET, 10662 }, { 0x33d9, G_UNICODE_NOT_PRESENT_OFFSET, 10667 }, { 0x33da, G_UNICODE_NOT_PRESENT_OFFSET, 10671 }, { 0x33db, G_UNICODE_NOT_PRESENT_OFFSET, 10674 }, { 0x33dc, G_UNICODE_NOT_PRESENT_OFFSET, 10677 }, { 0x33dd, G_UNICODE_NOT_PRESENT_OFFSET, 10680 }, { 0x33de, G_UNICODE_NOT_PRESENT_OFFSET, 10683 }, { 0x33df, G_UNICODE_NOT_PRESENT_OFFSET, 10689 }, { 0x33e0, G_UNICODE_NOT_PRESENT_OFFSET, 10695 }, { 0x33e1, G_UNICODE_NOT_PRESENT_OFFSET, 10700 }, { 0x33e2, G_UNICODE_NOT_PRESENT_OFFSET, 10705 }, { 0x33e3, G_UNICODE_NOT_PRESENT_OFFSET, 10710 }, { 0x33e4, G_UNICODE_NOT_PRESENT_OFFSET, 10715 }, { 0x33e5, G_UNICODE_NOT_PRESENT_OFFSET, 10720 }, { 0x33e6, G_UNICODE_NOT_PRESENT_OFFSET, 10725 }, { 0x33e7, G_UNICODE_NOT_PRESENT_OFFSET, 10730 }, { 0x33e8, G_UNICODE_NOT_PRESENT_OFFSET, 10735 }, { 0x33e9, G_UNICODE_NOT_PRESENT_OFFSET, 10740 }, { 0x33ea, G_UNICODE_NOT_PRESENT_OFFSET, 10746 }, { 0x33eb, G_UNICODE_NOT_PRESENT_OFFSET, 10752 }, { 0x33ec, G_UNICODE_NOT_PRESENT_OFFSET, 10758 }, { 0x33ed, G_UNICODE_NOT_PRESENT_OFFSET, 10764 }, { 0x33ee, G_UNICODE_NOT_PRESENT_OFFSET, 10770 }, { 0x33ef, G_UNICODE_NOT_PRESENT_OFFSET, 10776 }, { 0x33f0, G_UNICODE_NOT_PRESENT_OFFSET, 10782 }, { 0x33f1, G_UNICODE_NOT_PRESENT_OFFSET, 10788 }, { 0x33f2, G_UNICODE_NOT_PRESENT_OFFSET, 10794 }, { 0x33f3, G_UNICODE_NOT_PRESENT_OFFSET, 10800 }, { 0x33f4, G_UNICODE_NOT_PRESENT_OFFSET, 10806 }, { 0x33f5, G_UNICODE_NOT_PRESENT_OFFSET, 10812 }, { 0x33f6, G_UNICODE_NOT_PRESENT_OFFSET, 10818 }, { 0x33f7, G_UNICODE_NOT_PRESENT_OFFSET, 10824 }, { 0x33f8, G_UNICODE_NOT_PRESENT_OFFSET, 10830 }, { 0x33f9, G_UNICODE_NOT_PRESENT_OFFSET, 10836 }, { 0x33fa, G_UNICODE_NOT_PRESENT_OFFSET, 10842 }, { 0x33fb, G_UNICODE_NOT_PRESENT_OFFSET, 10848 }, { 0x33fc, G_UNICODE_NOT_PRESENT_OFFSET, 10854 }, { 0x33fd, G_UNICODE_NOT_PRESENT_OFFSET, 10860 }, { 0x33fe, G_UNICODE_NOT_PRESENT_OFFSET, 10866 }, { 0x33ff, G_UNICODE_NOT_PRESENT_OFFSET, 10872 }, { 0xa770, G_UNICODE_NOT_PRESENT_OFFSET, 10876 }, { 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, 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, 10910, G_UNICODE_NOT_PRESENT_OFFSET }, { 0xf90a, 6845, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 11870, G_UNICODE_NOT_PRESENT_OFFSET }, { 0xfa0a, 6765, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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 }, { 0xfe84, G_UNICODE_NOT_PRESENT_OFFSET, 1681 }, { 0xfe85, G_UNICODE_NOT_PRESENT_OFFSET, 1686 }, { 0xfe86, G_UNICODE_NOT_PRESENT_OFFSET, 1686 }, { 0xfe87, G_UNICODE_NOT_PRESENT_OFFSET, 1691 }, { 0xfe88, G_UNICODE_NOT_PRESENT_OFFSET, 1691 }, { 0xfe89, G_UNICODE_NOT_PRESENT_OFFSET, 1696 }, { 0xfe8a, G_UNICODE_NOT_PRESENT_OFFSET, 1696 }, { 0xfe8b, G_UNICODE_NOT_PRESENT_OFFSET, 1696 }, { 0xfe8c, G_UNICODE_NOT_PRESENT_OFFSET, 1696 }, { 0xfe8d, G_UNICODE_NOT_PRESENT_OFFSET, 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, 14659 }, { 0xff0b, G_UNICODE_NOT_PRESENT_OFFSET, 5267 }, { 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, 14857 }, { 0xff10, G_UNICODE_NOT_PRESENT_OFFSET, 5253 }, { 0xff11, G_UNICODE_NOT_PRESENT_OFFSET, 27 }, { 0xff12, G_UNICODE_NOT_PRESENT_OFFSET, 12 }, { 0xff13, G_UNICODE_NOT_PRESENT_OFFSET, 14 }, { 0xff14, G_UNICODE_NOT_PRESENT_OFFSET, 5255 }, { 0xff15, G_UNICODE_NOT_PRESENT_OFFSET, 5257 }, { 0xff16, G_UNICODE_NOT_PRESENT_OFFSET, 5259 }, { 0xff17, G_UNICODE_NOT_PRESENT_OFFSET, 5261 }, { 0xff18, G_UNICODE_NOT_PRESENT_OFFSET, 5263 }, { 0xff19, G_UNICODE_NOT_PRESENT_OFFSET, 5265 }, { 0xff1a, G_UNICODE_NOT_PRESENT_OFFSET, 14583 }, { 0xff1b, G_UNICODE_NOT_PRESENT_OFFSET, 1248 }, { 0xff1c, G_UNICODE_NOT_PRESENT_OFFSET, 14663 }, { 0xff1d, G_UNICODE_NOT_PRESENT_OFFSET, 5273 }, { 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 }, { 0xff24, G_UNICODE_NOT_PRESENT_OFFSET, 2316 }, { 0xff25, G_UNICODE_NOT_PRESENT_OFFSET, 2318 }, { 0xff26, G_UNICODE_NOT_PRESENT_OFFSET, 5336 }, { 0xff27, G_UNICODE_NOT_PRESENT_OFFSET, 2323 }, { 0xff28, G_UNICODE_NOT_PRESENT_OFFSET, 2325 }, { 0xff29, G_UNICODE_NOT_PRESENT_OFFSET, 2327 }, { 0xff2a, G_UNICODE_NOT_PRESENT_OFFSET, 2329 }, { 0xff2b, G_UNICODE_NOT_PRESENT_OFFSET, 2331 }, { 0xff2c, G_UNICODE_NOT_PRESENT_OFFSET, 2333 }, { 0xff2d, G_UNICODE_NOT_PRESENT_OFFSET, 2335 }, { 0xff2e, G_UNICODE_NOT_PRESENT_OFFSET, 2337 }, { 0xff2f, G_UNICODE_NOT_PRESENT_OFFSET, 2339 }, { 0xff30, G_UNICODE_NOT_PRESENT_OFFSET, 2344 }, { 0xff31, G_UNICODE_NOT_PRESENT_OFFSET, 5319 }, { 0xff32, G_UNICODE_NOT_PRESENT_OFFSET, 2346 }, { 0xff33, G_UNICODE_NOT_PRESENT_OFFSET, 6133 }, { 0xff34, G_UNICODE_NOT_PRESENT_OFFSET, 2348 }, { 0xff35, G_UNICODE_NOT_PRESENT_OFFSET, 2350 }, { 0xff36, G_UNICODE_NOT_PRESENT_OFFSET, 5470 }, { 0xff37, G_UNICODE_NOT_PRESENT_OFFSET, 2352 }, { 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, 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 }, { 0xff43, G_UNICODE_NOT_PRESENT_OFFSET, 2435 }, { 0xff44, G_UNICODE_NOT_PRESENT_OFFSET, 2366 }, { 0xff45, G_UNICODE_NOT_PRESENT_OFFSET, 2368 }, { 0xff46, G_UNICODE_NOT_PRESENT_OFFSET, 2443 }, { 0xff47, G_UNICODE_NOT_PRESENT_OFFSET, 2379 }, { 0xff48, G_UNICODE_NOT_PRESENT_OFFSET, 1171 }, { 0xff49, G_UNICODE_NOT_PRESENT_OFFSET, 2427 }, { 0xff4a, G_UNICODE_NOT_PRESENT_OFFSET, 1176 }, { 0xff4b, G_UNICODE_NOT_PRESENT_OFFSET, 2381 }, { 0xff4c, G_UNICODE_NOT_PRESENT_OFFSET, 1220 }, { 0xff4d, G_UNICODE_NOT_PRESENT_OFFSET, 2383 }, { 0xff4e, G_UNICODE_NOT_PRESENT_OFFSET, 5279 }, { 0xff4f, G_UNICODE_NOT_PRESENT_OFFSET, 29 }, { 0xff50, G_UNICODE_NOT_PRESENT_OFFSET, 2399 }, { 0xff51, G_UNICODE_NOT_PRESENT_OFFSET, 6137 }, { 0xff52, G_UNICODE_NOT_PRESENT_OFFSET, 1178 }, { 0xff53, G_UNICODE_NOT_PRESENT_OFFSET, 711 }, { 0xff54, G_UNICODE_NOT_PRESENT_OFFSET, 2401 }, { 0xff55, G_UNICODE_NOT_PRESENT_OFFSET, 2403 }, { 0xff56, G_UNICODE_NOT_PRESENT_OFFSET, 2412 }, { 0xff57, G_UNICODE_NOT_PRESENT_OFFSET, 1189 }, { 0xff58, G_UNICODE_NOT_PRESENT_OFFSET, 1222 }, { 0xff59, G_UNICODE_NOT_PRESENT_OFFSET, 1191 }, { 0xff5a, G_UNICODE_NOT_PRESENT_OFFSET, 2526 }, { 0xff5b, G_UNICODE_NOT_PRESENT_OFFSET, 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, 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 }, { 0xff74, G_UNICODE_NOT_PRESENT_OFFSET, 8820 }, { 0xff75, G_UNICODE_NOT_PRESENT_OFFSET, 8824 }, { 0xff76, G_UNICODE_NOT_PRESENT_OFFSET, 8828 }, { 0xff77, G_UNICODE_NOT_PRESENT_OFFSET, 8832 }, { 0xff78, G_UNICODE_NOT_PRESENT_OFFSET, 8836 }, { 0xff79, G_UNICODE_NOT_PRESENT_OFFSET, 8840 }, { 0xff7a, G_UNICODE_NOT_PRESENT_OFFSET, 8844 }, { 0xff7b, G_UNICODE_NOT_PRESENT_OFFSET, 8848 }, { 0xff7c, G_UNICODE_NOT_PRESENT_OFFSET, 8852 }, { 0xff7d, G_UNICODE_NOT_PRESENT_OFFSET, 8856 }, { 0xff7e, G_UNICODE_NOT_PRESENT_OFFSET, 8860 }, { 0xff7f, G_UNICODE_NOT_PRESENT_OFFSET, 8864 }, { 0xff80, G_UNICODE_NOT_PRESENT_OFFSET, 8868 }, { 0xff81, G_UNICODE_NOT_PRESENT_OFFSET, 8872 }, { 0xff82, G_UNICODE_NOT_PRESENT_OFFSET, 8876 }, { 0xff83, G_UNICODE_NOT_PRESENT_OFFSET, 8880 }, { 0xff84, G_UNICODE_NOT_PRESENT_OFFSET, 8884 }, { 0xff85, G_UNICODE_NOT_PRESENT_OFFSET, 8888 }, { 0xff86, G_UNICODE_NOT_PRESENT_OFFSET, 8892 }, { 0xff87, G_UNICODE_NOT_PRESENT_OFFSET, 8896 }, { 0xff88, G_UNICODE_NOT_PRESENT_OFFSET, 8900 }, { 0xff89, G_UNICODE_NOT_PRESENT_OFFSET, 8904 }, { 0xff8a, G_UNICODE_NOT_PRESENT_OFFSET, 8908 }, { 0xff8b, G_UNICODE_NOT_PRESENT_OFFSET, 8912 }, { 0xff8c, G_UNICODE_NOT_PRESENT_OFFSET, 8916 }, { 0xff8d, G_UNICODE_NOT_PRESENT_OFFSET, 8920 }, { 0xff8e, G_UNICODE_NOT_PRESENT_OFFSET, 8924 }, { 0xff8f, G_UNICODE_NOT_PRESENT_OFFSET, 8928 }, { 0xff90, G_UNICODE_NOT_PRESENT_OFFSET, 8932 }, { 0xff91, G_UNICODE_NOT_PRESENT_OFFSET, 8936 }, { 0xff92, G_UNICODE_NOT_PRESENT_OFFSET, 8940 }, { 0xff93, G_UNICODE_NOT_PRESENT_OFFSET, 8944 }, { 0xff94, G_UNICODE_NOT_PRESENT_OFFSET, 8948 }, { 0xff95, G_UNICODE_NOT_PRESENT_OFFSET, 8952 }, { 0xff96, G_UNICODE_NOT_PRESENT_OFFSET, 8956 }, { 0xff97, G_UNICODE_NOT_PRESENT_OFFSET, 8960 }, { 0xff98, G_UNICODE_NOT_PRESENT_OFFSET, 8964 }, { 0xff99, G_UNICODE_NOT_PRESENT_OFFSET, 8968 }, { 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, 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 }, { 0xffa3, G_UNICODE_NOT_PRESENT_OFFSET, 7487 }, { 0xffa4, G_UNICODE_NOT_PRESENT_OFFSET, 7491 }, { 0xffa5, G_UNICODE_NOT_PRESENT_OFFSET, 7495 }, { 0xffa6, G_UNICODE_NOT_PRESENT_OFFSET, 7499 }, { 0xffa7, G_UNICODE_NOT_PRESENT_OFFSET, 7503 }, { 0xffa8, G_UNICODE_NOT_PRESENT_OFFSET, 7507 }, { 0xffa9, G_UNICODE_NOT_PRESENT_OFFSET, 7511 }, { 0xffaa, G_UNICODE_NOT_PRESENT_OFFSET, 7515 }, { 0xffab, G_UNICODE_NOT_PRESENT_OFFSET, 7519 }, { 0xffac, G_UNICODE_NOT_PRESENT_OFFSET, 7523 }, { 0xffad, G_UNICODE_NOT_PRESENT_OFFSET, 7527 }, { 0xffae, G_UNICODE_NOT_PRESENT_OFFSET, 7531 }, { 0xffaf, G_UNICODE_NOT_PRESENT_OFFSET, 7535 }, { 0xffb0, G_UNICODE_NOT_PRESENT_OFFSET, 7539 }, { 0xffb1, G_UNICODE_NOT_PRESENT_OFFSET, 7543 }, { 0xffb2, G_UNICODE_NOT_PRESENT_OFFSET, 7547 }, { 0xffb3, G_UNICODE_NOT_PRESENT_OFFSET, 7551 }, { 0xffb4, G_UNICODE_NOT_PRESENT_OFFSET, 7555 }, { 0xffb5, G_UNICODE_NOT_PRESENT_OFFSET, 7559 }, { 0xffb6, G_UNICODE_NOT_PRESENT_OFFSET, 7563 }, { 0xffb7, G_UNICODE_NOT_PRESENT_OFFSET, 7567 }, { 0xffb8, G_UNICODE_NOT_PRESENT_OFFSET, 7571 }, { 0xffb9, G_UNICODE_NOT_PRESENT_OFFSET, 7575 }, { 0xffba, G_UNICODE_NOT_PRESENT_OFFSET, 7579 }, { 0xffbb, G_UNICODE_NOT_PRESENT_OFFSET, 7583 }, { 0xffbc, G_UNICODE_NOT_PRESENT_OFFSET, 7587 }, { 0xffbd, G_UNICODE_NOT_PRESENT_OFFSET, 7591 }, { 0xffbe, G_UNICODE_NOT_PRESENT_OFFSET, 7595 }, { 0xffc2, G_UNICODE_NOT_PRESENT_OFFSET, 7599 }, { 0xffc3, G_UNICODE_NOT_PRESENT_OFFSET, 7603 }, { 0xffc4, G_UNICODE_NOT_PRESENT_OFFSET, 7607 }, { 0xffc5, G_UNICODE_NOT_PRESENT_OFFSET, 7611 }, { 0xffc6, G_UNICODE_NOT_PRESENT_OFFSET, 7615 }, { 0xffc7, G_UNICODE_NOT_PRESENT_OFFSET, 7619 }, { 0xffca, G_UNICODE_NOT_PRESENT_OFFSET, 7623 }, { 0xffcb, G_UNICODE_NOT_PRESENT_OFFSET, 7627 }, { 0xffcc, G_UNICODE_NOT_PRESENT_OFFSET, 7631 }, { 0xffcd, G_UNICODE_NOT_PRESENT_OFFSET, 7635 }, { 0xffce, G_UNICODE_NOT_PRESENT_OFFSET, 7639 }, { 0xffcf, G_UNICODE_NOT_PRESENT_OFFSET, 7643 }, { 0xffd2, G_UNICODE_NOT_PRESENT_OFFSET, 7647 }, { 0xffd3, G_UNICODE_NOT_PRESENT_OFFSET, 7651 }, { 0xffd4, G_UNICODE_NOT_PRESENT_OFFSET, 7655 }, { 0xffd5, G_UNICODE_NOT_PRESENT_OFFSET, 7659 }, { 0xffd6, G_UNICODE_NOT_PRESENT_OFFSET, 7663 }, { 0xffd7, G_UNICODE_NOT_PRESENT_OFFSET, 7667 }, { 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, 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, 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 }, { 0x1d403, G_UNICODE_NOT_PRESENT_OFFSET, 2316 }, { 0x1d404, G_UNICODE_NOT_PRESENT_OFFSET, 2318 }, { 0x1d405, G_UNICODE_NOT_PRESENT_OFFSET, 5336 }, { 0x1d406, G_UNICODE_NOT_PRESENT_OFFSET, 2323 }, { 0x1d407, G_UNICODE_NOT_PRESENT_OFFSET, 2325 }, { 0x1d408, G_UNICODE_NOT_PRESENT_OFFSET, 2327 }, { 0x1d409, G_UNICODE_NOT_PRESENT_OFFSET, 2329 }, { 0x1d40a, G_UNICODE_NOT_PRESENT_OFFSET, 2331 }, { 0x1d40b, G_UNICODE_NOT_PRESENT_OFFSET, 2333 }, { 0x1d40c, G_UNICODE_NOT_PRESENT_OFFSET, 2335 }, { 0x1d40d, G_UNICODE_NOT_PRESENT_OFFSET, 2337 }, { 0x1d40e, G_UNICODE_NOT_PRESENT_OFFSET, 2339 }, { 0x1d40f, G_UNICODE_NOT_PRESENT_OFFSET, 2344 }, { 0x1d410, G_UNICODE_NOT_PRESENT_OFFSET, 5319 }, { 0x1d411, G_UNICODE_NOT_PRESENT_OFFSET, 2346 }, { 0x1d412, G_UNICODE_NOT_PRESENT_OFFSET, 6133 }, { 0x1d413, G_UNICODE_NOT_PRESENT_OFFSET, 2348 }, { 0x1d414, G_UNICODE_NOT_PRESENT_OFFSET, 2350 }, { 0x1d415, G_UNICODE_NOT_PRESENT_OFFSET, 5470 }, { 0x1d416, G_UNICODE_NOT_PRESENT_OFFSET, 2352 }, { 0x1d417, G_UNICODE_NOT_PRESENT_OFFSET, 5487 }, { 0x1d418, G_UNICODE_NOT_PRESENT_OFFSET, 6135 }, { 0x1d419, G_UNICODE_NOT_PRESENT_OFFSET, 5331 }, { 0x1d41a, G_UNICODE_NOT_PRESENT_OFFSET, 6 }, { 0x1d41b, G_UNICODE_NOT_PRESENT_OFFSET, 2364 }, { 0x1d41c, G_UNICODE_NOT_PRESENT_OFFSET, 2435 }, { 0x1d41d, G_UNICODE_NOT_PRESENT_OFFSET, 2366 }, { 0x1d41e, G_UNICODE_NOT_PRESENT_OFFSET, 2368 }, { 0x1d41f, G_UNICODE_NOT_PRESENT_OFFSET, 2443 }, { 0x1d420, G_UNICODE_NOT_PRESENT_OFFSET, 2379 }, { 0x1d421, G_UNICODE_NOT_PRESENT_OFFSET, 1171 }, { 0x1d422, G_UNICODE_NOT_PRESENT_OFFSET, 2427 }, { 0x1d423, G_UNICODE_NOT_PRESENT_OFFSET, 1176 }, { 0x1d424, G_UNICODE_NOT_PRESENT_OFFSET, 2381 }, { 0x1d425, G_UNICODE_NOT_PRESENT_OFFSET, 1220 }, { 0x1d426, G_UNICODE_NOT_PRESENT_OFFSET, 2383 }, { 0x1d427, G_UNICODE_NOT_PRESENT_OFFSET, 5279 }, { 0x1d428, G_UNICODE_NOT_PRESENT_OFFSET, 29 }, { 0x1d429, G_UNICODE_NOT_PRESENT_OFFSET, 2399 }, { 0x1d42a, G_UNICODE_NOT_PRESENT_OFFSET, 6137 }, { 0x1d42b, G_UNICODE_NOT_PRESENT_OFFSET, 1178 }, { 0x1d42c, G_UNICODE_NOT_PRESENT_OFFSET, 711 }, { 0x1d42d, G_UNICODE_NOT_PRESENT_OFFSET, 2401 }, { 0x1d42e, G_UNICODE_NOT_PRESENT_OFFSET, 2403 }, { 0x1d42f, G_UNICODE_NOT_PRESENT_OFFSET, 2412 }, { 0x1d430, G_UNICODE_NOT_PRESENT_OFFSET, 1189 }, { 0x1d431, G_UNICODE_NOT_PRESENT_OFFSET, 1222 }, { 0x1d432, G_UNICODE_NOT_PRESENT_OFFSET, 1191 }, { 0x1d433, G_UNICODE_NOT_PRESENT_OFFSET, 2526 }, { 0x1d434, G_UNICODE_NOT_PRESENT_OFFSET, 2309 }, { 0x1d435, G_UNICODE_NOT_PRESENT_OFFSET, 2314 }, { 0x1d436, G_UNICODE_NOT_PRESENT_OFFSET, 5292 }, { 0x1d437, G_UNICODE_NOT_PRESENT_OFFSET, 2316 }, { 0x1d438, G_UNICODE_NOT_PRESENT_OFFSET, 2318 }, { 0x1d439, G_UNICODE_NOT_PRESENT_OFFSET, 5336 }, { 0x1d43a, G_UNICODE_NOT_PRESENT_OFFSET, 2323 }, { 0x1d43b, G_UNICODE_NOT_PRESENT_OFFSET, 2325 }, { 0x1d43c, G_UNICODE_NOT_PRESENT_OFFSET, 2327 }, { 0x1d43d, G_UNICODE_NOT_PRESENT_OFFSET, 2329 }, { 0x1d43e, G_UNICODE_NOT_PRESENT_OFFSET, 2331 }, { 0x1d43f, G_UNICODE_NOT_PRESENT_OFFSET, 2333 }, { 0x1d440, G_UNICODE_NOT_PRESENT_OFFSET, 2335 }, { 0x1d441, G_UNICODE_NOT_PRESENT_OFFSET, 2337 }, { 0x1d442, G_UNICODE_NOT_PRESENT_OFFSET, 2339 }, { 0x1d443, G_UNICODE_NOT_PRESENT_OFFSET, 2344 }, { 0x1d444, G_UNICODE_NOT_PRESENT_OFFSET, 5319 }, { 0x1d445, G_UNICODE_NOT_PRESENT_OFFSET, 2346 }, { 0x1d446, G_UNICODE_NOT_PRESENT_OFFSET, 6133 }, { 0x1d447, G_UNICODE_NOT_PRESENT_OFFSET, 2348 }, { 0x1d448, G_UNICODE_NOT_PRESENT_OFFSET, 2350 }, { 0x1d449, G_UNICODE_NOT_PRESENT_OFFSET, 5470 }, { 0x1d44a, G_UNICODE_NOT_PRESENT_OFFSET, 2352 }, { 0x1d44b, G_UNICODE_NOT_PRESENT_OFFSET, 5487 }, { 0x1d44c, G_UNICODE_NOT_PRESENT_OFFSET, 6135 }, { 0x1d44d, G_UNICODE_NOT_PRESENT_OFFSET, 5331 }, { 0x1d44e, G_UNICODE_NOT_PRESENT_OFFSET, 6 }, { 0x1d44f, G_UNICODE_NOT_PRESENT_OFFSET, 2364 }, { 0x1d450, G_UNICODE_NOT_PRESENT_OFFSET, 2435 }, { 0x1d451, G_UNICODE_NOT_PRESENT_OFFSET, 2366 }, { 0x1d452, G_UNICODE_NOT_PRESENT_OFFSET, 2368 }, { 0x1d453, G_UNICODE_NOT_PRESENT_OFFSET, 2443 }, { 0x1d454, G_UNICODE_NOT_PRESENT_OFFSET, 2379 }, { 0x1d456, G_UNICODE_NOT_PRESENT_OFFSET, 2427 }, { 0x1d457, G_UNICODE_NOT_PRESENT_OFFSET, 1176 }, { 0x1d458, G_UNICODE_NOT_PRESENT_OFFSET, 2381 }, { 0x1d459, G_UNICODE_NOT_PRESENT_OFFSET, 1220 }, { 0x1d45a, G_UNICODE_NOT_PRESENT_OFFSET, 2383 }, { 0x1d45b, G_UNICODE_NOT_PRESENT_OFFSET, 5279 }, { 0x1d45c, G_UNICODE_NOT_PRESENT_OFFSET, 29 }, { 0x1d45d, G_UNICODE_NOT_PRESENT_OFFSET, 2399 }, { 0x1d45e, G_UNICODE_NOT_PRESENT_OFFSET, 6137 }, { 0x1d45f, G_UNICODE_NOT_PRESENT_OFFSET, 1178 }, { 0x1d460, G_UNICODE_NOT_PRESENT_OFFSET, 711 }, { 0x1d461, G_UNICODE_NOT_PRESENT_OFFSET, 2401 }, { 0x1d462, G_UNICODE_NOT_PRESENT_OFFSET, 2403 }, { 0x1d463, G_UNICODE_NOT_PRESENT_OFFSET, 2412 }, { 0x1d464, G_UNICODE_NOT_PRESENT_OFFSET, 1189 }, { 0x1d465, G_UNICODE_NOT_PRESENT_OFFSET, 1222 }, { 0x1d466, G_UNICODE_NOT_PRESENT_OFFSET, 1191 }, { 0x1d467, G_UNICODE_NOT_PRESENT_OFFSET, 2526 }, { 0x1d468, G_UNICODE_NOT_PRESENT_OFFSET, 2309 }, { 0x1d469, G_UNICODE_NOT_PRESENT_OFFSET, 2314 }, { 0x1d46a, G_UNICODE_NOT_PRESENT_OFFSET, 5292 }, { 0x1d46b, G_UNICODE_NOT_PRESENT_OFFSET, 2316 }, { 0x1d46c, G_UNICODE_NOT_PRESENT_OFFSET, 2318 }, { 0x1d46d, G_UNICODE_NOT_PRESENT_OFFSET, 5336 }, { 0x1d46e, G_UNICODE_NOT_PRESENT_OFFSET, 2323 }, { 0x1d46f, G_UNICODE_NOT_PRESENT_OFFSET, 2325 }, { 0x1d470, G_UNICODE_NOT_PRESENT_OFFSET, 2327 }, { 0x1d471, G_UNICODE_NOT_PRESENT_OFFSET, 2329 }, { 0x1d472, G_UNICODE_NOT_PRESENT_OFFSET, 2331 }, { 0x1d473, G_UNICODE_NOT_PRESENT_OFFSET, 2333 }, { 0x1d474, G_UNICODE_NOT_PRESENT_OFFSET, 2335 }, { 0x1d475, G_UNICODE_NOT_PRESENT_OFFSET, 2337 }, { 0x1d476, G_UNICODE_NOT_PRESENT_OFFSET, 2339 }, { 0x1d477, G_UNICODE_NOT_PRESENT_OFFSET, 2344 }, { 0x1d478, G_UNICODE_NOT_PRESENT_OFFSET, 5319 }, { 0x1d479, G_UNICODE_NOT_PRESENT_OFFSET, 2346 }, { 0x1d47a, G_UNICODE_NOT_PRESENT_OFFSET, 6133 }, { 0x1d47b, G_UNICODE_NOT_PRESENT_OFFSET, 2348 }, { 0x1d47c, G_UNICODE_NOT_PRESENT_OFFSET, 2350 }, { 0x1d47d, G_UNICODE_NOT_PRESENT_OFFSET, 5470 }, { 0x1d47e, G_UNICODE_NOT_PRESENT_OFFSET, 2352 }, { 0x1d47f, G_UNICODE_NOT_PRESENT_OFFSET, 5487 }, { 0x1d480, G_UNICODE_NOT_PRESENT_OFFSET, 6135 }, { 0x1d481, G_UNICODE_NOT_PRESENT_OFFSET, 5331 }, { 0x1d482, G_UNICODE_NOT_PRESENT_OFFSET, 6 }, { 0x1d483, G_UNICODE_NOT_PRESENT_OFFSET, 2364 }, { 0x1d484, G_UNICODE_NOT_PRESENT_OFFSET, 2435 }, { 0x1d485, G_UNICODE_NOT_PRESENT_OFFSET, 2366 }, { 0x1d486, G_UNICODE_NOT_PRESENT_OFFSET, 2368 }, { 0x1d487, G_UNICODE_NOT_PRESENT_OFFSET, 2443 }, { 0x1d488, G_UNICODE_NOT_PRESENT_OFFSET, 2379 }, { 0x1d489, G_UNICODE_NOT_PRESENT_OFFSET, 1171 }, { 0x1d48a, G_UNICODE_NOT_PRESENT_OFFSET, 2427 }, { 0x1d48b, G_UNICODE_NOT_PRESENT_OFFSET, 1176 }, { 0x1d48c, G_UNICODE_NOT_PRESENT_OFFSET, 2381 }, { 0x1d48d, G_UNICODE_NOT_PRESENT_OFFSET, 1220 }, { 0x1d48e, G_UNICODE_NOT_PRESENT_OFFSET, 2383 }, { 0x1d48f, G_UNICODE_NOT_PRESENT_OFFSET, 5279 }, { 0x1d490, G_UNICODE_NOT_PRESENT_OFFSET, 29 }, { 0x1d491, G_UNICODE_NOT_PRESENT_OFFSET, 2399 }, { 0x1d492, G_UNICODE_NOT_PRESENT_OFFSET, 6137 }, { 0x1d493, G_UNICODE_NOT_PRESENT_OFFSET, 1178 }, { 0x1d494, G_UNICODE_NOT_PRESENT_OFFSET, 711 }, { 0x1d495, G_UNICODE_NOT_PRESENT_OFFSET, 2401 }, { 0x1d496, G_UNICODE_NOT_PRESENT_OFFSET, 2403 }, { 0x1d497, G_UNICODE_NOT_PRESENT_OFFSET, 2412 }, { 0x1d498, G_UNICODE_NOT_PRESENT_OFFSET, 1189 }, { 0x1d499, G_UNICODE_NOT_PRESENT_OFFSET, 1222 }, { 0x1d49a, G_UNICODE_NOT_PRESENT_OFFSET, 1191 }, { 0x1d49b, G_UNICODE_NOT_PRESENT_OFFSET, 2526 }, { 0x1d49c, G_UNICODE_NOT_PRESENT_OFFSET, 2309 }, { 0x1d49e, G_UNICODE_NOT_PRESENT_OFFSET, 5292 }, { 0x1d49f, G_UNICODE_NOT_PRESENT_OFFSET, 2316 }, { 0x1d4a2, G_UNICODE_NOT_PRESENT_OFFSET, 2323 }, { 0x1d4a5, G_UNICODE_NOT_PRESENT_OFFSET, 2329 }, { 0x1d4a6, G_UNICODE_NOT_PRESENT_OFFSET, 2331 }, { 0x1d4a9, G_UNICODE_NOT_PRESENT_OFFSET, 2337 }, { 0x1d4aa, G_UNICODE_NOT_PRESENT_OFFSET, 2339 }, { 0x1d4ab, G_UNICODE_NOT_PRESENT_OFFSET, 2344 }, { 0x1d4ac, G_UNICODE_NOT_PRESENT_OFFSET, 5319 }, { 0x1d4ae, G_UNICODE_NOT_PRESENT_OFFSET, 6133 }, { 0x1d4af, G_UNICODE_NOT_PRESENT_OFFSET, 2348 }, { 0x1d4b0, G_UNICODE_NOT_PRESENT_OFFSET, 2350 }, { 0x1d4b1, G_UNICODE_NOT_PRESENT_OFFSET, 5470 }, { 0x1d4b2, G_UNICODE_NOT_PRESENT_OFFSET, 2352 }, { 0x1d4b3, G_UNICODE_NOT_PRESENT_OFFSET, 5487 }, { 0x1d4b4, G_UNICODE_NOT_PRESENT_OFFSET, 6135 }, { 0x1d4b5, G_UNICODE_NOT_PRESENT_OFFSET, 5331 }, { 0x1d4b6, G_UNICODE_NOT_PRESENT_OFFSET, 6 }, { 0x1d4b7, G_UNICODE_NOT_PRESENT_OFFSET, 2364 }, { 0x1d4b8, G_UNICODE_NOT_PRESENT_OFFSET, 2435 }, { 0x1d4b9, G_UNICODE_NOT_PRESENT_OFFSET, 2366 }, { 0x1d4bb, G_UNICODE_NOT_PRESENT_OFFSET, 2443 }, { 0x1d4bd, G_UNICODE_NOT_PRESENT_OFFSET, 1171 }, { 0x1d4be, G_UNICODE_NOT_PRESENT_OFFSET, 2427 }, { 0x1d4bf, G_UNICODE_NOT_PRESENT_OFFSET, 1176 }, { 0x1d4c0, G_UNICODE_NOT_PRESENT_OFFSET, 2381 }, { 0x1d4c1, G_UNICODE_NOT_PRESENT_OFFSET, 1220 }, { 0x1d4c2, G_UNICODE_NOT_PRESENT_OFFSET, 2383 }, { 0x1d4c3, G_UNICODE_NOT_PRESENT_OFFSET, 5279 }, { 0x1d4c5, G_UNICODE_NOT_PRESENT_OFFSET, 2399 }, { 0x1d4c6, G_UNICODE_NOT_PRESENT_OFFSET, 6137 }, { 0x1d4c7, G_UNICODE_NOT_PRESENT_OFFSET, 1178 }, { 0x1d4c8, G_UNICODE_NOT_PRESENT_OFFSET, 711 }, { 0x1d4c9, G_UNICODE_NOT_PRESENT_OFFSET, 2401 }, { 0x1d4ca, G_UNICODE_NOT_PRESENT_OFFSET, 2403 }, { 0x1d4cb, G_UNICODE_NOT_PRESENT_OFFSET, 2412 }, { 0x1d4cc, G_UNICODE_NOT_PRESENT_OFFSET, 1189 }, { 0x1d4cd, G_UNICODE_NOT_PRESENT_OFFSET, 1222 }, { 0x1d4ce, G_UNICODE_NOT_PRESENT_OFFSET, 1191 }, { 0x1d4cf, G_UNICODE_NOT_PRESENT_OFFSET, 2526 }, { 0x1d4d0, G_UNICODE_NOT_PRESENT_OFFSET, 2309 }, { 0x1d4d1, G_UNICODE_NOT_PRESENT_OFFSET, 2314 }, { 0x1d4d2, G_UNICODE_NOT_PRESENT_OFFSET, 5292 }, { 0x1d4d3, G_UNICODE_NOT_PRESENT_OFFSET, 2316 }, { 0x1d4d4, G_UNICODE_NOT_PRESENT_OFFSET, 2318 }, { 0x1d4d5, G_UNICODE_NOT_PRESENT_OFFSET, 5336 }, { 0x1d4d6, G_UNICODE_NOT_PRESENT_OFFSET, 2323 }, { 0x1d4d7, G_UNICODE_NOT_PRESENT_OFFSET, 2325 }, { 0x1d4d8, G_UNICODE_NOT_PRESENT_OFFSET, 2327 }, { 0x1d4d9, G_UNICODE_NOT_PRESENT_OFFSET, 2329 }, { 0x1d4da, G_UNICODE_NOT_PRESENT_OFFSET, 2331 }, { 0x1d4db, G_UNICODE_NOT_PRESENT_OFFSET, 2333 }, { 0x1d4dc, G_UNICODE_NOT_PRESENT_OFFSET, 2335 }, { 0x1d4dd, G_UNICODE_NOT_PRESENT_OFFSET, 2337 }, { 0x1d4de, G_UNICODE_NOT_PRESENT_OFFSET, 2339 }, { 0x1d4df, G_UNICODE_NOT_PRESENT_OFFSET, 2344 }, { 0x1d4e0, G_UNICODE_NOT_PRESENT_OFFSET, 5319 }, { 0x1d4e1, G_UNICODE_NOT_PRESENT_OFFSET, 2346 }, { 0x1d4e2, G_UNICODE_NOT_PRESENT_OFFSET, 6133 }, { 0x1d4e3, G_UNICODE_NOT_PRESENT_OFFSET, 2348 }, { 0x1d4e4, G_UNICODE_NOT_PRESENT_OFFSET, 2350 }, { 0x1d4e5, G_UNICODE_NOT_PRESENT_OFFSET, 5470 }, { 0x1d4e6, G_UNICODE_NOT_PRESENT_OFFSET, 2352 }, { 0x1d4e7, G_UNICODE_NOT_PRESENT_OFFSET, 5487 }, { 0x1d4e8, G_UNICODE_NOT_PRESENT_OFFSET, 6135 }, { 0x1d4e9, G_UNICODE_NOT_PRESENT_OFFSET, 5331 }, { 0x1d4ea, G_UNICODE_NOT_PRESENT_OFFSET, 6 }, { 0x1d4eb, G_UNICODE_NOT_PRESENT_OFFSET, 2364 }, { 0x1d4ec, G_UNICODE_NOT_PRESENT_OFFSET, 2435 }, { 0x1d4ed, G_UNICODE_NOT_PRESENT_OFFSET, 2366 }, { 0x1d4ee, G_UNICODE_NOT_PRESENT_OFFSET, 2368 }, { 0x1d4ef, G_UNICODE_NOT_PRESENT_OFFSET, 2443 }, { 0x1d4f0, G_UNICODE_NOT_PRESENT_OFFSET, 2379 }, { 0x1d4f1, G_UNICODE_NOT_PRESENT_OFFSET, 1171 }, { 0x1d4f2, G_UNICODE_NOT_PRESENT_OFFSET, 2427 }, { 0x1d4f3, G_UNICODE_NOT_PRESENT_OFFSET, 1176 }, { 0x1d4f4, G_UNICODE_NOT_PRESENT_OFFSET, 2381 }, { 0x1d4f5, G_UNICODE_NOT_PRESENT_OFFSET, 1220 }, { 0x1d4f6, G_UNICODE_NOT_PRESENT_OFFSET, 2383 }, { 0x1d4f7, G_UNICODE_NOT_PRESENT_OFFSET, 5279 }, { 0x1d4f8, G_UNICODE_NOT_PRESENT_OFFSET, 29 }, { 0x1d4f9, G_UNICODE_NOT_PRESENT_OFFSET, 2399 }, { 0x1d4fa, G_UNICODE_NOT_PRESENT_OFFSET, 6137 }, { 0x1d4fb, G_UNICODE_NOT_PRESENT_OFFSET, 1178 }, { 0x1d4fc, G_UNICODE_NOT_PRESENT_OFFSET, 711 }, { 0x1d4fd, G_UNICODE_NOT_PRESENT_OFFSET, 2401 }, { 0x1d4fe, G_UNICODE_NOT_PRESENT_OFFSET, 2403 }, { 0x1d4ff, G_UNICODE_NOT_PRESENT_OFFSET, 2412 }, { 0x1d500, G_UNICODE_NOT_PRESENT_OFFSET, 1189 }, { 0x1d501, G_UNICODE_NOT_PRESENT_OFFSET, 1222 }, { 0x1d502, G_UNICODE_NOT_PRESENT_OFFSET, 1191 }, { 0x1d503, G_UNICODE_NOT_PRESENT_OFFSET, 2526 }, { 0x1d504, G_UNICODE_NOT_PRESENT_OFFSET, 2309 }, { 0x1d505, G_UNICODE_NOT_PRESENT_OFFSET, 2314 }, { 0x1d507, G_UNICODE_NOT_PRESENT_OFFSET, 2316 }, { 0x1d508, G_UNICODE_NOT_PRESENT_OFFSET, 2318 }, { 0x1d509, G_UNICODE_NOT_PRESENT_OFFSET, 5336 }, { 0x1d50a, G_UNICODE_NOT_PRESENT_OFFSET, 2323 }, { 0x1d50d, G_UNICODE_NOT_PRESENT_OFFSET, 2329 }, { 0x1d50e, G_UNICODE_NOT_PRESENT_OFFSET, 2331 }, { 0x1d50f, G_UNICODE_NOT_PRESENT_OFFSET, 2333 }, { 0x1d510, G_UNICODE_NOT_PRESENT_OFFSET, 2335 }, { 0x1d511, G_UNICODE_NOT_PRESENT_OFFSET, 2337 }, { 0x1d512, G_UNICODE_NOT_PRESENT_OFFSET, 2339 }, { 0x1d513, G_UNICODE_NOT_PRESENT_OFFSET, 2344 }, { 0x1d514, G_UNICODE_NOT_PRESENT_OFFSET, 5319 }, { 0x1d516, G_UNICODE_NOT_PRESENT_OFFSET, 6133 }, { 0x1d517, G_UNICODE_NOT_PRESENT_OFFSET, 2348 }, { 0x1d518, G_UNICODE_NOT_PRESENT_OFFSET, 2350 }, { 0x1d519, G_UNICODE_NOT_PRESENT_OFFSET, 5470 }, { 0x1d51a, G_UNICODE_NOT_PRESENT_OFFSET, 2352 }, { 0x1d51b, G_UNICODE_NOT_PRESENT_OFFSET, 5487 }, { 0x1d51c, G_UNICODE_NOT_PRESENT_OFFSET, 6135 }, { 0x1d51e, G_UNICODE_NOT_PRESENT_OFFSET, 6 }, { 0x1d51f, G_UNICODE_NOT_PRESENT_OFFSET, 2364 }, { 0x1d520, G_UNICODE_NOT_PRESENT_OFFSET, 2435 }, { 0x1d521, G_UNICODE_NOT_PRESENT_OFFSET, 2366 }, { 0x1d522, G_UNICODE_NOT_PRESENT_OFFSET, 2368 }, { 0x1d523, G_UNICODE_NOT_PRESENT_OFFSET, 2443 }, { 0x1d524, G_UNICODE_NOT_PRESENT_OFFSET, 2379 }, { 0x1d525, G_UNICODE_NOT_PRESENT_OFFSET, 1171 }, { 0x1d526, G_UNICODE_NOT_PRESENT_OFFSET, 2427 }, { 0x1d527, G_UNICODE_NOT_PRESENT_OFFSET, 1176 }, { 0x1d528, G_UNICODE_NOT_PRESENT_OFFSET, 2381 }, { 0x1d529, G_UNICODE_NOT_PRESENT_OFFSET, 1220 }, { 0x1d52a, G_UNICODE_NOT_PRESENT_OFFSET, 2383 }, { 0x1d52b, G_UNICODE_NOT_PRESENT_OFFSET, 5279 }, { 0x1d52c, G_UNICODE_NOT_PRESENT_OFFSET, 29 }, { 0x1d52d, G_UNICODE_NOT_PRESENT_OFFSET, 2399 }, { 0x1d52e, G_UNICODE_NOT_PRESENT_OFFSET, 6137 }, { 0x1d52f, G_UNICODE_NOT_PRESENT_OFFSET, 1178 }, { 0x1d530, G_UNICODE_NOT_PRESENT_OFFSET, 711 }, { 0x1d531, G_UNICODE_NOT_PRESENT_OFFSET, 2401 }, { 0x1d532, G_UNICODE_NOT_PRESENT_OFFSET, 2403 }, { 0x1d533, G_UNICODE_NOT_PRESENT_OFFSET, 2412 }, { 0x1d534, G_UNICODE_NOT_PRESENT_OFFSET, 1189 }, { 0x1d535, G_UNICODE_NOT_PRESENT_OFFSET, 1222 }, { 0x1d536, G_UNICODE_NOT_PRESENT_OFFSET, 1191 }, { 0x1d537, G_UNICODE_NOT_PRESENT_OFFSET, 2526 }, { 0x1d538, G_UNICODE_NOT_PRESENT_OFFSET, 2309 }, { 0x1d539, G_UNICODE_NOT_PRESENT_OFFSET, 2314 }, { 0x1d53b, G_UNICODE_NOT_PRESENT_OFFSET, 2316 }, { 0x1d53c, G_UNICODE_NOT_PRESENT_OFFSET, 2318 }, { 0x1d53d, G_UNICODE_NOT_PRESENT_OFFSET, 5336 }, { 0x1d53e, G_UNICODE_NOT_PRESENT_OFFSET, 2323 }, { 0x1d540, G_UNICODE_NOT_PRESENT_OFFSET, 2327 }, { 0x1d541, G_UNICODE_NOT_PRESENT_OFFSET, 2329 }, { 0x1d542, G_UNICODE_NOT_PRESENT_OFFSET, 2331 }, { 0x1d543, G_UNICODE_NOT_PRESENT_OFFSET, 2333 }, { 0x1d544, G_UNICODE_NOT_PRESENT_OFFSET, 2335 }, { 0x1d546, G_UNICODE_NOT_PRESENT_OFFSET, 2339 }, { 0x1d54a, G_UNICODE_NOT_PRESENT_OFFSET, 6133 }, { 0x1d54b, G_UNICODE_NOT_PRESENT_OFFSET, 2348 }, { 0x1d54c, G_UNICODE_NOT_PRESENT_OFFSET, 2350 }, { 0x1d54d, G_UNICODE_NOT_PRESENT_OFFSET, 5470 }, { 0x1d54e, G_UNICODE_NOT_PRESENT_OFFSET, 2352 }, { 0x1d54f, G_UNICODE_NOT_PRESENT_OFFSET, 5487 }, { 0x1d550, G_UNICODE_NOT_PRESENT_OFFSET, 6135 }, { 0x1d552, G_UNICODE_NOT_PRESENT_OFFSET, 6 }, { 0x1d553, G_UNICODE_NOT_PRESENT_OFFSET, 2364 }, { 0x1d554, G_UNICODE_NOT_PRESENT_OFFSET, 2435 }, { 0x1d555, G_UNICODE_NOT_PRESENT_OFFSET, 2366 }, { 0x1d556, G_UNICODE_NOT_PRESENT_OFFSET, 2368 }, { 0x1d557, G_UNICODE_NOT_PRESENT_OFFSET, 2443 }, { 0x1d558, G_UNICODE_NOT_PRESENT_OFFSET, 2379 }, { 0x1d559, G_UNICODE_NOT_PRESENT_OFFSET, 1171 }, { 0x1d55a, G_UNICODE_NOT_PRESENT_OFFSET, 2427 }, { 0x1d55b, G_UNICODE_NOT_PRESENT_OFFSET, 1176 }, { 0x1d55c, G_UNICODE_NOT_PRESENT_OFFSET, 2381 }, { 0x1d55d, G_UNICODE_NOT_PRESENT_OFFSET, 1220 }, { 0x1d55e, G_UNICODE_NOT_PRESENT_OFFSET, 2383 }, { 0x1d55f, G_UNICODE_NOT_PRESENT_OFFSET, 5279 }, { 0x1d560, G_UNICODE_NOT_PRESENT_OFFSET, 29 }, { 0x1d561, G_UNICODE_NOT_PRESENT_OFFSET, 2399 }, { 0x1d562, G_UNICODE_NOT_PRESENT_OFFSET, 6137 }, { 0x1d563, G_UNICODE_NOT_PRESENT_OFFSET, 1178 }, { 0x1d564, G_UNICODE_NOT_PRESENT_OFFSET, 711 }, { 0x1d565, G_UNICODE_NOT_PRESENT_OFFSET, 2401 }, { 0x1d566, G_UNICODE_NOT_PRESENT_OFFSET, 2403 }, { 0x1d567, G_UNICODE_NOT_PRESENT_OFFSET, 2412 }, { 0x1d568, G_UNICODE_NOT_PRESENT_OFFSET, 1189 }, { 0x1d569, G_UNICODE_NOT_PRESENT_OFFSET, 1222 }, { 0x1d56a, G_UNICODE_NOT_PRESENT_OFFSET, 1191 }, { 0x1d56b, G_UNICODE_NOT_PRESENT_OFFSET, 2526 }, { 0x1d56c, G_UNICODE_NOT_PRESENT_OFFSET, 2309 }, { 0x1d56d, G_UNICODE_NOT_PRESENT_OFFSET, 2314 }, { 0x1d56e, G_UNICODE_NOT_PRESENT_OFFSET, 5292 }, { 0x1d56f, G_UNICODE_NOT_PRESENT_OFFSET, 2316 }, { 0x1d570, G_UNICODE_NOT_PRESENT_OFFSET, 2318 }, { 0x1d571, G_UNICODE_NOT_PRESENT_OFFSET, 5336 }, { 0x1d572, G_UNICODE_NOT_PRESENT_OFFSET, 2323 }, { 0x1d573, G_UNICODE_NOT_PRESENT_OFFSET, 2325 }, { 0x1d574, G_UNICODE_NOT_PRESENT_OFFSET, 2327 }, { 0x1d575, G_UNICODE_NOT_PRESENT_OFFSET, 2329 }, { 0x1d576, G_UNICODE_NOT_PRESENT_OFFSET, 2331 }, { 0x1d577, G_UNICODE_NOT_PRESENT_OFFSET, 2333 }, { 0x1d578, G_UNICODE_NOT_PRESENT_OFFSET, 2335 }, { 0x1d579, G_UNICODE_NOT_PRESENT_OFFSET, 2337 }, { 0x1d57a, G_UNICODE_NOT_PRESENT_OFFSET, 2339 }, { 0x1d57b, G_UNICODE_NOT_PRESENT_OFFSET, 2344 }, { 0x1d57c, G_UNICODE_NOT_PRESENT_OFFSET, 5319 }, { 0x1d57d, G_UNICODE_NOT_PRESENT_OFFSET, 2346 }, { 0x1d57e, G_UNICODE_NOT_PRESENT_OFFSET, 6133 }, { 0x1d57f, G_UNICODE_NOT_PRESENT_OFFSET, 2348 }, { 0x1d580, G_UNICODE_NOT_PRESENT_OFFSET, 2350 }, { 0x1d581, G_UNICODE_NOT_PRESENT_OFFSET, 5470 }, { 0x1d582, G_UNICODE_NOT_PRESENT_OFFSET, 2352 }, { 0x1d583, G_UNICODE_NOT_PRESENT_OFFSET, 5487 }, { 0x1d584, G_UNICODE_NOT_PRESENT_OFFSET, 6135 }, { 0x1d585, G_UNICODE_NOT_PRESENT_OFFSET, 5331 }, { 0x1d586, G_UNICODE_NOT_PRESENT_OFFSET, 6 }, { 0x1d587, G_UNICODE_NOT_PRESENT_OFFSET, 2364 }, { 0x1d588, G_UNICODE_NOT_PRESENT_OFFSET, 2435 }, { 0x1d589, G_UNICODE_NOT_PRESENT_OFFSET, 2366 }, { 0x1d58a, G_UNICODE_NOT_PRESENT_OFFSET, 2368 }, { 0x1d58b, G_UNICODE_NOT_PRESENT_OFFSET, 2443 }, { 0x1d58c, G_UNICODE_NOT_PRESENT_OFFSET, 2379 }, { 0x1d58d, G_UNICODE_NOT_PRESENT_OFFSET, 1171 }, { 0x1d58e, G_UNICODE_NOT_PRESENT_OFFSET, 2427 }, { 0x1d58f, G_UNICODE_NOT_PRESENT_OFFSET, 1176 }, { 0x1d590, G_UNICODE_NOT_PRESENT_OFFSET, 2381 }, { 0x1d591, G_UNICODE_NOT_PRESENT_OFFSET, 1220 }, { 0x1d592, G_UNICODE_NOT_PRESENT_OFFSET, 2383 }, { 0x1d593, G_UNICODE_NOT_PRESENT_OFFSET, 5279 }, { 0x1d594, G_UNICODE_NOT_PRESENT_OFFSET, 29 }, { 0x1d595, G_UNICODE_NOT_PRESENT_OFFSET, 2399 }, { 0x1d596, G_UNICODE_NOT_PRESENT_OFFSET, 6137 }, { 0x1d597, G_UNICODE_NOT_PRESENT_OFFSET, 1178 }, { 0x1d598, G_UNICODE_NOT_PRESENT_OFFSET, 711 }, { 0x1d599, G_UNICODE_NOT_PRESENT_OFFSET, 2401 }, { 0x1d59a, G_UNICODE_NOT_PRESENT_OFFSET, 2403 }, { 0x1d59b, G_UNICODE_NOT_PRESENT_OFFSET, 2412 }, { 0x1d59c, G_UNICODE_NOT_PRESENT_OFFSET, 1189 }, { 0x1d59d, G_UNICODE_NOT_PRESENT_OFFSET, 1222 }, { 0x1d59e, G_UNICODE_NOT_PRESENT_OFFSET, 1191 }, { 0x1d59f, G_UNICODE_NOT_PRESENT_OFFSET, 2526 }, { 0x1d5a0, G_UNICODE_NOT_PRESENT_OFFSET, 2309 }, { 0x1d5a1, G_UNICODE_NOT_PRESENT_OFFSET, 2314 }, { 0x1d5a2, G_UNICODE_NOT_PRESENT_OFFSET, 5292 }, { 0x1d5a3, G_UNICODE_NOT_PRESENT_OFFSET, 2316 }, { 0x1d5a4, G_UNICODE_NOT_PRESENT_OFFSET, 2318 }, { 0x1d5a5, G_UNICODE_NOT_PRESENT_OFFSET, 5336 }, { 0x1d5a6, G_UNICODE_NOT_PRESENT_OFFSET, 2323 }, { 0x1d5a7, G_UNICODE_NOT_PRESENT_OFFSET, 2325 }, { 0x1d5a8, G_UNICODE_NOT_PRESENT_OFFSET, 2327 }, { 0x1d5a9, G_UNICODE_NOT_PRESENT_OFFSET, 2329 }, { 0x1d5aa, G_UNICODE_NOT_PRESENT_OFFSET, 2331 }, { 0x1d5ab, G_UNICODE_NOT_PRESENT_OFFSET, 2333 }, { 0x1d5ac, G_UNICODE_NOT_PRESENT_OFFSET, 2335 }, { 0x1d5ad, G_UNICODE_NOT_PRESENT_OFFSET, 2337 }, { 0x1d5ae, G_UNICODE_NOT_PRESENT_OFFSET, 2339 }, { 0x1d5af, G_UNICODE_NOT_PRESENT_OFFSET, 2344 }, { 0x1d5b0, G_UNICODE_NOT_PRESENT_OFFSET, 5319 }, { 0x1d5b1, G_UNICODE_NOT_PRESENT_OFFSET, 2346 }, { 0x1d5b2, G_UNICODE_NOT_PRESENT_OFFSET, 6133 }, { 0x1d5b3, G_UNICODE_NOT_PRESENT_OFFSET, 2348 }, { 0x1d5b4, G_UNICODE_NOT_PRESENT_OFFSET, 2350 }, { 0x1d5b5, G_UNICODE_NOT_PRESENT_OFFSET, 5470 }, { 0x1d5b6, G_UNICODE_NOT_PRESENT_OFFSET, 2352 }, { 0x1d5b7, G_UNICODE_NOT_PRESENT_OFFSET, 5487 }, { 0x1d5b8, G_UNICODE_NOT_PRESENT_OFFSET, 6135 }, { 0x1d5b9, G_UNICODE_NOT_PRESENT_OFFSET, 5331 }, { 0x1d5ba, G_UNICODE_NOT_PRESENT_OFFSET, 6 }, { 0x1d5bb, G_UNICODE_NOT_PRESENT_OFFSET, 2364 }, { 0x1d5bc, G_UNICODE_NOT_PRESENT_OFFSET, 2435 }, { 0x1d5bd, G_UNICODE_NOT_PRESENT_OFFSET, 2366 }, { 0x1d5be, G_UNICODE_NOT_PRESENT_OFFSET, 2368 }, { 0x1d5bf, G_UNICODE_NOT_PRESENT_OFFSET, 2443 }, { 0x1d5c0, G_UNICODE_NOT_PRESENT_OFFSET, 2379 }, { 0x1d5c1, G_UNICODE_NOT_PRESENT_OFFSET, 1171 }, { 0x1d5c2, G_UNICODE_NOT_PRESENT_OFFSET, 2427 }, { 0x1d5c3, G_UNICODE_NOT_PRESENT_OFFSET, 1176 }, { 0x1d5c4, G_UNICODE_NOT_PRESENT_OFFSET, 2381 }, { 0x1d5c5, G_UNICODE_NOT_PRESENT_OFFSET, 1220 }, { 0x1d5c6, G_UNICODE_NOT_PRESENT_OFFSET, 2383 }, { 0x1d5c7, G_UNICODE_NOT_PRESENT_OFFSET, 5279 }, { 0x1d5c8, G_UNICODE_NOT_PRESENT_OFFSET, 29 }, { 0x1d5c9, G_UNICODE_NOT_PRESENT_OFFSET, 2399 }, { 0x1d5ca, G_UNICODE_NOT_PRESENT_OFFSET, 6137 }, { 0x1d5cb, G_UNICODE_NOT_PRESENT_OFFSET, 1178 }, { 0x1d5cc, G_UNICODE_NOT_PRESENT_OFFSET, 711 }, { 0x1d5cd, G_UNICODE_NOT_PRESENT_OFFSET, 2401 }, { 0x1d5ce, G_UNICODE_NOT_PRESENT_OFFSET, 2403 }, { 0x1d5cf, G_UNICODE_NOT_PRESENT_OFFSET, 2412 }, { 0x1d5d0, G_UNICODE_NOT_PRESENT_OFFSET, 1189 }, { 0x1d5d1, G_UNICODE_NOT_PRESENT_OFFSET, 1222 }, { 0x1d5d2, G_UNICODE_NOT_PRESENT_OFFSET, 1191 }, { 0x1d5d3, G_UNICODE_NOT_PRESENT_OFFSET, 2526 }, { 0x1d5d4, G_UNICODE_NOT_PRESENT_OFFSET, 2309 }, { 0x1d5d5, G_UNICODE_NOT_PRESENT_OFFSET, 2314 }, { 0x1d5d6, G_UNICODE_NOT_PRESENT_OFFSET, 5292 }, { 0x1d5d7, G_UNICODE_NOT_PRESENT_OFFSET, 2316 }, { 0x1d5d8, G_UNICODE_NOT_PRESENT_OFFSET, 2318 }, { 0x1d5d9, G_UNICODE_NOT_PRESENT_OFFSET, 5336 }, { 0x1d5da, G_UNICODE_NOT_PRESENT_OFFSET, 2323 }, { 0x1d5db, G_UNICODE_NOT_PRESENT_OFFSET, 2325 }, { 0x1d5dc, G_UNICODE_NOT_PRESENT_OFFSET, 2327 }, { 0x1d5dd, G_UNICODE_NOT_PRESENT_OFFSET, 2329 }, { 0x1d5de, G_UNICODE_NOT_PRESENT_OFFSET, 2331 }, { 0x1d5df, G_UNICODE_NOT_PRESENT_OFFSET, 2333 }, { 0x1d5e0, G_UNICODE_NOT_PRESENT_OFFSET, 2335 }, { 0x1d5e1, G_UNICODE_NOT_PRESENT_OFFSET, 2337 }, { 0x1d5e2, G_UNICODE_NOT_PRESENT_OFFSET, 2339 }, { 0x1d5e3, G_UNICODE_NOT_PRESENT_OFFSET, 2344 }, { 0x1d5e4, G_UNICODE_NOT_PRESENT_OFFSET, 5319 }, { 0x1d5e5, G_UNICODE_NOT_PRESENT_OFFSET, 2346 }, { 0x1d5e6, G_UNICODE_NOT_PRESENT_OFFSET, 6133 }, { 0x1d5e7, G_UNICODE_NOT_PRESENT_OFFSET, 2348 }, { 0x1d5e8, G_UNICODE_NOT_PRESENT_OFFSET, 2350 }, { 0x1d5e9, G_UNICODE_NOT_PRESENT_OFFSET, 5470 }, { 0x1d5ea, G_UNICODE_NOT_PRESENT_OFFSET, 2352 }, { 0x1d5eb, G_UNICODE_NOT_PRESENT_OFFSET, 5487 }, { 0x1d5ec, G_UNICODE_NOT_PRESENT_OFFSET, 6135 }, { 0x1d5ed, G_UNICODE_NOT_PRESENT_OFFSET, 5331 }, { 0x1d5ee, G_UNICODE_NOT_PRESENT_OFFSET, 6 }, { 0x1d5ef, G_UNICODE_NOT_PRESENT_OFFSET, 2364 }, { 0x1d5f0, G_UNICODE_NOT_PRESENT_OFFSET, 2435 }, { 0x1d5f1, G_UNICODE_NOT_PRESENT_OFFSET, 2366 }, { 0x1d5f2, G_UNICODE_NOT_PRESENT_OFFSET, 2368 }, { 0x1d5f3, G_UNICODE_NOT_PRESENT_OFFSET, 2443 }, { 0x1d5f4, G_UNICODE_NOT_PRESENT_OFFSET, 2379 }, { 0x1d5f5, G_UNICODE_NOT_PRESENT_OFFSET, 1171 }, { 0x1d5f6, G_UNICODE_NOT_PRESENT_OFFSET, 2427 }, { 0x1d5f7, G_UNICODE_NOT_PRESENT_OFFSET, 1176 }, { 0x1d5f8, G_UNICODE_NOT_PRESENT_OFFSET, 2381 }, { 0x1d5f9, G_UNICODE_NOT_PRESENT_OFFSET, 1220 }, { 0x1d5fa, G_UNICODE_NOT_PRESENT_OFFSET, 2383 }, { 0x1d5fb, G_UNICODE_NOT_PRESENT_OFFSET, 5279 }, { 0x1d5fc, G_UNICODE_NOT_PRESENT_OFFSET, 29 }, { 0x1d5fd, G_UNICODE_NOT_PRESENT_OFFSET, 2399 }, { 0x1d5fe, G_UNICODE_NOT_PRESENT_OFFSET, 6137 }, { 0x1d5ff, G_UNICODE_NOT_PRESENT_OFFSET, 1178 }, { 0x1d600, G_UNICODE_NOT_PRESENT_OFFSET, 711 }, { 0x1d601, G_UNICODE_NOT_PRESENT_OFFSET, 2401 }, { 0x1d602, G_UNICODE_NOT_PRESENT_OFFSET, 2403 }, { 0x1d603, G_UNICODE_NOT_PRESENT_OFFSET, 2412 }, { 0x1d604, G_UNICODE_NOT_PRESENT_OFFSET, 1189 }, { 0x1d605, G_UNICODE_NOT_PRESENT_OFFSET, 1222 }, { 0x1d606, G_UNICODE_NOT_PRESENT_OFFSET, 1191 }, { 0x1d607, G_UNICODE_NOT_PRESENT_OFFSET, 2526 }, { 0x1d608, G_UNICODE_NOT_PRESENT_OFFSET, 2309 }, { 0x1d609, G_UNICODE_NOT_PRESENT_OFFSET, 2314 }, { 0x1d60a, G_UNICODE_NOT_PRESENT_OFFSET, 5292 }, { 0x1d60b, G_UNICODE_NOT_PRESENT_OFFSET, 2316 }, { 0x1d60c, G_UNICODE_NOT_PRESENT_OFFSET, 2318 }, { 0x1d60d, G_UNICODE_NOT_PRESENT_OFFSET, 5336 }, { 0x1d60e, G_UNICODE_NOT_PRESENT_OFFSET, 2323 }, { 0x1d60f, G_UNICODE_NOT_PRESENT_OFFSET, 2325 }, { 0x1d610, G_UNICODE_NOT_PRESENT_OFFSET, 2327 }, { 0x1d611, G_UNICODE_NOT_PRESENT_OFFSET, 2329 }, { 0x1d612, G_UNICODE_NOT_PRESENT_OFFSET, 2331 }, { 0x1d613, G_UNICODE_NOT_PRESENT_OFFSET, 2333 }, { 0x1d614, G_UNICODE_NOT_PRESENT_OFFSET, 2335 }, { 0x1d615, G_UNICODE_NOT_PRESENT_OFFSET, 2337 }, { 0x1d616, G_UNICODE_NOT_PRESENT_OFFSET, 2339 }, { 0x1d617, G_UNICODE_NOT_PRESENT_OFFSET, 2344 }, { 0x1d618, G_UNICODE_NOT_PRESENT_OFFSET, 5319 }, { 0x1d619, G_UNICODE_NOT_PRESENT_OFFSET, 2346 }, { 0x1d61a, G_UNICODE_NOT_PRESENT_OFFSET, 6133 }, { 0x1d61b, G_UNICODE_NOT_PRESENT_OFFSET, 2348 }, { 0x1d61c, G_UNICODE_NOT_PRESENT_OFFSET, 2350 }, { 0x1d61d, G_UNICODE_NOT_PRESENT_OFFSET, 5470 }, { 0x1d61e, G_UNICODE_NOT_PRESENT_OFFSET, 2352 }, { 0x1d61f, G_UNICODE_NOT_PRESENT_OFFSET, 5487 }, { 0x1d620, G_UNICODE_NOT_PRESENT_OFFSET, 6135 }, { 0x1d621, G_UNICODE_NOT_PRESENT_OFFSET, 5331 }, { 0x1d622, G_UNICODE_NOT_PRESENT_OFFSET, 6 }, { 0x1d623, G_UNICODE_NOT_PRESENT_OFFSET, 2364 }, { 0x1d624, G_UNICODE_NOT_PRESENT_OFFSET, 2435 }, { 0x1d625, G_UNICODE_NOT_PRESENT_OFFSET, 2366 }, { 0x1d626, G_UNICODE_NOT_PRESENT_OFFSET, 2368 }, { 0x1d627, G_UNICODE_NOT_PRESENT_OFFSET, 2443 }, { 0x1d628, G_UNICODE_NOT_PRESENT_OFFSET, 2379 }, { 0x1d629, G_UNICODE_NOT_PRESENT_OFFSET, 1171 }, { 0x1d62a, G_UNICODE_NOT_PRESENT_OFFSET, 2427 }, { 0x1d62b, G_UNICODE_NOT_PRESENT_OFFSET, 1176 }, { 0x1d62c, G_UNICODE_NOT_PRESENT_OFFSET, 2381 }, { 0x1d62d, G_UNICODE_NOT_PRESENT_OFFSET, 1220 }, { 0x1d62e, G_UNICODE_NOT_PRESENT_OFFSET, 2383 }, { 0x1d62f, G_UNICODE_NOT_PRESENT_OFFSET, 5279 }, { 0x1d630, G_UNICODE_NOT_PRESENT_OFFSET, 29 }, { 0x1d631, G_UNICODE_NOT_PRESENT_OFFSET, 2399 }, { 0x1d632, G_UNICODE_NOT_PRESENT_OFFSET, 6137 }, { 0x1d633, G_UNICODE_NOT_PRESENT_OFFSET, 1178 }, { 0x1d634, G_UNICODE_NOT_PRESENT_OFFSET, 711 }, { 0x1d635, G_UNICODE_NOT_PRESENT_OFFSET, 2401 }, { 0x1d636, G_UNICODE_NOT_PRESENT_OFFSET, 2403 }, { 0x1d637, G_UNICODE_NOT_PRESENT_OFFSET, 2412 }, { 0x1d638, G_UNICODE_NOT_PRESENT_OFFSET, 1189 }, { 0x1d639, G_UNICODE_NOT_PRESENT_OFFSET, 1222 }, { 0x1d63a, G_UNICODE_NOT_PRESENT_OFFSET, 1191 }, { 0x1d63b, G_UNICODE_NOT_PRESENT_OFFSET, 2526 }, { 0x1d63c, G_UNICODE_NOT_PRESENT_OFFSET, 2309 }, { 0x1d63d, G_UNICODE_NOT_PRESENT_OFFSET, 2314 }, { 0x1d63e, G_UNICODE_NOT_PRESENT_OFFSET, 5292 }, { 0x1d63f, G_UNICODE_NOT_PRESENT_OFFSET, 2316 }, { 0x1d640, G_UNICODE_NOT_PRESENT_OFFSET, 2318 }, { 0x1d641, G_UNICODE_NOT_PRESENT_OFFSET, 5336 }, { 0x1d642, G_UNICODE_NOT_PRESENT_OFFSET, 2323 }, { 0x1d643, G_UNICODE_NOT_PRESENT_OFFSET, 2325 }, { 0x1d644, G_UNICODE_NOT_PRESENT_OFFSET, 2327 }, { 0x1d645, G_UNICODE_NOT_PRESENT_OFFSET, 2329 }, { 0x1d646, G_UNICODE_NOT_PRESENT_OFFSET, 2331 }, { 0x1d647, G_UNICODE_NOT_PRESENT_OFFSET, 2333 }, { 0x1d648, G_UNICODE_NOT_PRESENT_OFFSET, 2335 }, { 0x1d649, G_UNICODE_NOT_PRESENT_OFFSET, 2337 }, { 0x1d64a, G_UNICODE_NOT_PRESENT_OFFSET, 2339 }, { 0x1d64b, G_UNICODE_NOT_PRESENT_OFFSET, 2344 }, { 0x1d64c, G_UNICODE_NOT_PRESENT_OFFSET, 5319 }, { 0x1d64d, G_UNICODE_NOT_PRESENT_OFFSET, 2346 }, { 0x1d64e, G_UNICODE_NOT_PRESENT_OFFSET, 6133 }, { 0x1d64f, G_UNICODE_NOT_PRESENT_OFFSET, 2348 }, { 0x1d650, G_UNICODE_NOT_PRESENT_OFFSET, 2350 }, { 0x1d651, G_UNICODE_NOT_PRESENT_OFFSET, 5470 }, { 0x1d652, G_UNICODE_NOT_PRESENT_OFFSET, 2352 }, { 0x1d653, G_UNICODE_NOT_PRESENT_OFFSET, 5487 }, { 0x1d654, G_UNICODE_NOT_PRESENT_OFFSET, 6135 }, { 0x1d655, G_UNICODE_NOT_PRESENT_OFFSET, 5331 }, { 0x1d656, G_UNICODE_NOT_PRESENT_OFFSET, 6 }, { 0x1d657, G_UNICODE_NOT_PRESENT_OFFSET, 2364 }, { 0x1d658, G_UNICODE_NOT_PRESENT_OFFSET, 2435 }, { 0x1d659, G_UNICODE_NOT_PRESENT_OFFSET, 2366 }, { 0x1d65a, G_UNICODE_NOT_PRESENT_OFFSET, 2368 }, { 0x1d65b, G_UNICODE_NOT_PRESENT_OFFSET, 2443 }, { 0x1d65c, G_UNICODE_NOT_PRESENT_OFFSET, 2379 }, { 0x1d65d, G_UNICODE_NOT_PRESENT_OFFSET, 1171 }, { 0x1d65e, G_UNICODE_NOT_PRESENT_OFFSET, 2427 }, { 0x1d65f, G_UNICODE_NOT_PRESENT_OFFSET, 1176 }, { 0x1d660, G_UNICODE_NOT_PRESENT_OFFSET, 2381 }, { 0x1d661, G_UNICODE_NOT_PRESENT_OFFSET, 1220 }, { 0x1d662, G_UNICODE_NOT_PRESENT_OFFSET, 2383 }, { 0x1d663, G_UNICODE_NOT_PRESENT_OFFSET, 5279 }, { 0x1d664, G_UNICODE_NOT_PRESENT_OFFSET, 29 }, { 0x1d665, G_UNICODE_NOT_PRESENT_OFFSET, 2399 }, { 0x1d666, G_UNICODE_NOT_PRESENT_OFFSET, 6137 }, { 0x1d667, G_UNICODE_NOT_PRESENT_OFFSET, 1178 }, { 0x1d668, G_UNICODE_NOT_PRESENT_OFFSET, 711 }, { 0x1d669, G_UNICODE_NOT_PRESENT_OFFSET, 2401 }, { 0x1d66a, G_UNICODE_NOT_PRESENT_OFFSET, 2403 }, { 0x1d66b, G_UNICODE_NOT_PRESENT_OFFSET, 2412 }, { 0x1d66c, G_UNICODE_NOT_PRESENT_OFFSET, 1189 }, { 0x1d66d, G_UNICODE_NOT_PRESENT_OFFSET, 1222 }, { 0x1d66e, G_UNICODE_NOT_PRESENT_OFFSET, 1191 }, { 0x1d66f, G_UNICODE_NOT_PRESENT_OFFSET, 2526 }, { 0x1d670, G_UNICODE_NOT_PRESENT_OFFSET, 2309 }, { 0x1d671, G_UNICODE_NOT_PRESENT_OFFSET, 2314 }, { 0x1d672, G_UNICODE_NOT_PRESENT_OFFSET, 5292 }, { 0x1d673, G_UNICODE_NOT_PRESENT_OFFSET, 2316 }, { 0x1d674, G_UNICODE_NOT_PRESENT_OFFSET, 2318 }, { 0x1d675, G_UNICODE_NOT_PRESENT_OFFSET, 5336 }, { 0x1d676, G_UNICODE_NOT_PRESENT_OFFSET, 2323 }, { 0x1d677, G_UNICODE_NOT_PRESENT_OFFSET, 2325 }, { 0x1d678, G_UNICODE_NOT_PRESENT_OFFSET, 2327 }, { 0x1d679, G_UNICODE_NOT_PRESENT_OFFSET, 2329 }, { 0x1d67a, G_UNICODE_NOT_PRESENT_OFFSET, 2331 }, { 0x1d67b, G_UNICODE_NOT_PRESENT_OFFSET, 2333 }, { 0x1d67c, G_UNICODE_NOT_PRESENT_OFFSET, 2335 }, { 0x1d67d, G_UNICODE_NOT_PRESENT_OFFSET, 2337 }, { 0x1d67e, G_UNICODE_NOT_PRESENT_OFFSET, 2339 }, { 0x1d67f, G_UNICODE_NOT_PRESENT_OFFSET, 2344 }, { 0x1d680, G_UNICODE_NOT_PRESENT_OFFSET, 5319 }, { 0x1d681, G_UNICODE_NOT_PRESENT_OFFSET, 2346 }, { 0x1d682, G_UNICODE_NOT_PRESENT_OFFSET, 6133 }, { 0x1d683, G_UNICODE_NOT_PRESENT_OFFSET, 2348 }, { 0x1d684, G_UNICODE_NOT_PRESENT_OFFSET, 2350 }, { 0x1d685, G_UNICODE_NOT_PRESENT_OFFSET, 5470 }, { 0x1d686, G_UNICODE_NOT_PRESENT_OFFSET, 2352 }, { 0x1d687, G_UNICODE_NOT_PRESENT_OFFSET, 5487 }, { 0x1d688, G_UNICODE_NOT_PRESENT_OFFSET, 6135 }, { 0x1d689, G_UNICODE_NOT_PRESENT_OFFSET, 5331 }, { 0x1d68a, G_UNICODE_NOT_PRESENT_OFFSET, 6 }, { 0x1d68b, G_UNICODE_NOT_PRESENT_OFFSET, 2364 }, { 0x1d68c, G_UNICODE_NOT_PRESENT_OFFSET, 2435 }, { 0x1d68d, G_UNICODE_NOT_PRESENT_OFFSET, 2366 }, { 0x1d68e, G_UNICODE_NOT_PRESENT_OFFSET, 2368 }, { 0x1d68f, G_UNICODE_NOT_PRESENT_OFFSET, 2443 }, { 0x1d690, G_UNICODE_NOT_PRESENT_OFFSET, 2379 }, { 0x1d691, G_UNICODE_NOT_PRESENT_OFFSET, 1171 }, { 0x1d692, G_UNICODE_NOT_PRESENT_OFFSET, 2427 }, { 0x1d693, G_UNICODE_NOT_PRESENT_OFFSET, 1176 }, { 0x1d694, G_UNICODE_NOT_PRESENT_OFFSET, 2381 }, { 0x1d695, G_UNICODE_NOT_PRESENT_OFFSET, 1220 }, { 0x1d696, G_UNICODE_NOT_PRESENT_OFFSET, 2383 }, { 0x1d697, G_UNICODE_NOT_PRESENT_OFFSET, 5279 }, { 0x1d698, G_UNICODE_NOT_PRESENT_OFFSET, 29 }, { 0x1d699, G_UNICODE_NOT_PRESENT_OFFSET, 2399 }, { 0x1d69a, G_UNICODE_NOT_PRESENT_OFFSET, 6137 }, { 0x1d69b, G_UNICODE_NOT_PRESENT_OFFSET, 1178 }, { 0x1d69c, G_UNICODE_NOT_PRESENT_OFFSET, 711 }, { 0x1d69d, G_UNICODE_NOT_PRESENT_OFFSET, 2401 }, { 0x1d69e, G_UNICODE_NOT_PRESENT_OFFSET, 2403 }, { 0x1d69f, G_UNICODE_NOT_PRESENT_OFFSET, 2412 }, { 0x1d6a0, G_UNICODE_NOT_PRESENT_OFFSET, 1189 }, { 0x1d6a1, G_UNICODE_NOT_PRESENT_OFFSET, 1222 }, { 0x1d6a2, G_UNICODE_NOT_PRESENT_OFFSET, 1191 }, { 0x1d6a3, G_UNICODE_NOT_PRESENT_OFFSET, 2526 }, { 0x1d6a4, G_UNICODE_NOT_PRESENT_OFFSET, 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, 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, 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, 15219 }, { 0x1d6b9, G_UNICODE_NOT_PRESENT_OFFSET, 1402 }, { 0x1d6ba, G_UNICODE_NOT_PRESENT_OFFSET, 1408 }, { 0x1d6bb, G_UNICODE_NOT_PRESENT_OFFSET, 15222 }, { 0x1d6bc, G_UNICODE_NOT_PRESENT_OFFSET, 1374 }, { 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, 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, 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, 15247 }, { 0x1d6cd, G_UNICODE_NOT_PRESENT_OFFSET, 20 }, { 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, 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, 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, 15180 }, { 0x1d6e3, G_UNICODE_NOT_PRESENT_OFFSET, 15183 }, { 0x1d6e4, G_UNICODE_NOT_PRESENT_OFFSET, 5354 }, { 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, 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, 15219 }, { 0x1d6f3, G_UNICODE_NOT_PRESENT_OFFSET, 1402 }, { 0x1d6f4, G_UNICODE_NOT_PRESENT_OFFSET, 1408 }, { 0x1d6f5, G_UNICODE_NOT_PRESENT_OFFSET, 15222 }, { 0x1d6f6, G_UNICODE_NOT_PRESENT_OFFSET, 1374 }, { 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, 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, 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, 15247 }, { 0x1d707, G_UNICODE_NOT_PRESENT_OFFSET, 20 }, { 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, 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, 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, 15180 }, { 0x1d71d, G_UNICODE_NOT_PRESENT_OFFSET, 15183 }, { 0x1d71e, G_UNICODE_NOT_PRESENT_OFFSET, 5354 }, { 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, 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, 15219 }, { 0x1d72d, G_UNICODE_NOT_PRESENT_OFFSET, 1402 }, { 0x1d72e, G_UNICODE_NOT_PRESENT_OFFSET, 1408 }, { 0x1d72f, G_UNICODE_NOT_PRESENT_OFFSET, 15222 }, { 0x1d730, G_UNICODE_NOT_PRESENT_OFFSET, 1374 }, { 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, 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, 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, 15247 }, { 0x1d741, G_UNICODE_NOT_PRESENT_OFFSET, 20 }, { 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, 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, 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, 15180 }, { 0x1d757, G_UNICODE_NOT_PRESENT_OFFSET, 15183 }, { 0x1d758, G_UNICODE_NOT_PRESENT_OFFSET, 5354 }, { 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, 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, 15219 }, { 0x1d767, G_UNICODE_NOT_PRESENT_OFFSET, 1402 }, { 0x1d768, G_UNICODE_NOT_PRESENT_OFFSET, 1408 }, { 0x1d769, G_UNICODE_NOT_PRESENT_OFFSET, 15222 }, { 0x1d76a, G_UNICODE_NOT_PRESENT_OFFSET, 1374 }, { 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, 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, 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, 15247 }, { 0x1d77b, G_UNICODE_NOT_PRESENT_OFFSET, 20 }, { 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, 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, 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, 15180 }, { 0x1d791, G_UNICODE_NOT_PRESENT_OFFSET, 15183 }, { 0x1d792, G_UNICODE_NOT_PRESENT_OFFSET, 5354 }, { 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, 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, 15219 }, { 0x1d7a1, G_UNICODE_NOT_PRESENT_OFFSET, 1402 }, { 0x1d7a2, G_UNICODE_NOT_PRESENT_OFFSET, 1408 }, { 0x1d7a3, G_UNICODE_NOT_PRESENT_OFFSET, 15222 }, { 0x1d7a4, G_UNICODE_NOT_PRESENT_OFFSET, 1374 }, { 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, 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, 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, 15247 }, { 0x1d7b5, G_UNICODE_NOT_PRESENT_OFFSET, 20 }, { 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, 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, 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, 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 }, { 0x1d7d1, G_UNICODE_NOT_PRESENT_OFFSET, 14 }, { 0x1d7d2, G_UNICODE_NOT_PRESENT_OFFSET, 5255 }, { 0x1d7d3, G_UNICODE_NOT_PRESENT_OFFSET, 5257 }, { 0x1d7d4, G_UNICODE_NOT_PRESENT_OFFSET, 5259 }, { 0x1d7d5, G_UNICODE_NOT_PRESENT_OFFSET, 5261 }, { 0x1d7d6, G_UNICODE_NOT_PRESENT_OFFSET, 5263 }, { 0x1d7d7, G_UNICODE_NOT_PRESENT_OFFSET, 5265 }, { 0x1d7d8, G_UNICODE_NOT_PRESENT_OFFSET, 5253 }, { 0x1d7d9, G_UNICODE_NOT_PRESENT_OFFSET, 27 }, { 0x1d7da, G_UNICODE_NOT_PRESENT_OFFSET, 12 }, { 0x1d7db, G_UNICODE_NOT_PRESENT_OFFSET, 14 }, { 0x1d7dc, G_UNICODE_NOT_PRESENT_OFFSET, 5255 }, { 0x1d7dd, G_UNICODE_NOT_PRESENT_OFFSET, 5257 }, { 0x1d7de, G_UNICODE_NOT_PRESENT_OFFSET, 5259 }, { 0x1d7df, G_UNICODE_NOT_PRESENT_OFFSET, 5261 }, { 0x1d7e0, G_UNICODE_NOT_PRESENT_OFFSET, 5263 }, { 0x1d7e1, G_UNICODE_NOT_PRESENT_OFFSET, 5265 }, { 0x1d7e2, G_UNICODE_NOT_PRESENT_OFFSET, 5253 }, { 0x1d7e3, G_UNICODE_NOT_PRESENT_OFFSET, 27 }, { 0x1d7e4, G_UNICODE_NOT_PRESENT_OFFSET, 12 }, { 0x1d7e5, G_UNICODE_NOT_PRESENT_OFFSET, 14 }, { 0x1d7e6, G_UNICODE_NOT_PRESENT_OFFSET, 5255 }, { 0x1d7e7, G_UNICODE_NOT_PRESENT_OFFSET, 5257 }, { 0x1d7e8, G_UNICODE_NOT_PRESENT_OFFSET, 5259 }, { 0x1d7e9, G_UNICODE_NOT_PRESENT_OFFSET, 5261 }, { 0x1d7ea, G_UNICODE_NOT_PRESENT_OFFSET, 5263 }, { 0x1d7eb, G_UNICODE_NOT_PRESENT_OFFSET, 5265 }, { 0x1d7ec, G_UNICODE_NOT_PRESENT_OFFSET, 5253 }, { 0x1d7ed, G_UNICODE_NOT_PRESENT_OFFSET, 27 }, { 0x1d7ee, G_UNICODE_NOT_PRESENT_OFFSET, 12 }, { 0x1d7ef, G_UNICODE_NOT_PRESENT_OFFSET, 14 }, { 0x1d7f0, G_UNICODE_NOT_PRESENT_OFFSET, 5255 }, { 0x1d7f1, G_UNICODE_NOT_PRESENT_OFFSET, 5257 }, { 0x1d7f2, G_UNICODE_NOT_PRESENT_OFFSET, 5259 }, { 0x1d7f3, G_UNICODE_NOT_PRESENT_OFFSET, 5261 }, { 0x1d7f4, G_UNICODE_NOT_PRESENT_OFFSET, 5263 }, { 0x1d7f5, G_UNICODE_NOT_PRESENT_OFFSET, 5265 }, { 0x1d7f6, G_UNICODE_NOT_PRESENT_OFFSET, 5253 }, { 0x1d7f7, G_UNICODE_NOT_PRESENT_OFFSET, 27 }, { 0x1d7f8, G_UNICODE_NOT_PRESENT_OFFSET, 12 }, { 0x1d7f9, G_UNICODE_NOT_PRESENT_OFFSET, 14 }, { 0x1d7fa, G_UNICODE_NOT_PRESENT_OFFSET, 5255 }, { 0x1d7fb, G_UNICODE_NOT_PRESENT_OFFSET, 5257 }, { 0x1d7fc, G_UNICODE_NOT_PRESENT_OFFSET, 5259 }, { 0x1d7fd, G_UNICODE_NOT_PRESENT_OFFSET, 5261 }, { 0x1d7fe, G_UNICODE_NOT_PRESENT_OFFSET, 5263 }, { 0x1d7ff, G_UNICODE_NOT_PRESENT_OFFSET, 5265 }, { 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, 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 }, { 0x1f133, G_UNICODE_NOT_PRESENT_OFFSET, 2316 }, { 0x1f134, G_UNICODE_NOT_PRESENT_OFFSET, 2318 }, { 0x1f135, G_UNICODE_NOT_PRESENT_OFFSET, 5336 }, { 0x1f136, G_UNICODE_NOT_PRESENT_OFFSET, 2323 }, { 0x1f137, G_UNICODE_NOT_PRESENT_OFFSET, 2325 }, { 0x1f138, G_UNICODE_NOT_PRESENT_OFFSET, 2327 }, { 0x1f139, G_UNICODE_NOT_PRESENT_OFFSET, 2329 }, { 0x1f13a, G_UNICODE_NOT_PRESENT_OFFSET, 2331 }, { 0x1f13b, G_UNICODE_NOT_PRESENT_OFFSET, 2333 }, { 0x1f13c, G_UNICODE_NOT_PRESENT_OFFSET, 2335 }, { 0x1f13d, G_UNICODE_NOT_PRESENT_OFFSET, 2337 }, { 0x1f13e, G_UNICODE_NOT_PRESENT_OFFSET, 2339 }, { 0x1f13f, G_UNICODE_NOT_PRESENT_OFFSET, 2344 }, { 0x1f140, G_UNICODE_NOT_PRESENT_OFFSET, 5319 }, { 0x1f141, G_UNICODE_NOT_PRESENT_OFFSET, 2346 }, { 0x1f142, G_UNICODE_NOT_PRESENT_OFFSET, 6133 }, { 0x1f143, G_UNICODE_NOT_PRESENT_OFFSET, 2348 }, { 0x1f144, G_UNICODE_NOT_PRESENT_OFFSET, 2350 }, { 0x1f145, G_UNICODE_NOT_PRESENT_OFFSET, 5470 }, { 0x1f146, G_UNICODE_NOT_PRESENT_OFFSET, 2352 }, { 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, 15444 }, { 0x1f14b, G_UNICODE_NOT_PRESENT_OFFSET, 10556 }, { 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, 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, 15491 }, { 0x1f216, G_UNICODE_NOT_PRESENT_OFFSET, 15495 }, { 0x1f217, G_UNICODE_NOT_PRESENT_OFFSET, 7887 }, { 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, 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, 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, 15563 }, { 0x1f230, G_UNICODE_NOT_PRESENT_OFFSET, 6801 }, { 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, 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, 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, 16089, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x2f877, 16093, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x2f878, 6357, 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, 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, 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, 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, 17639, G_UNICODE_NOT_PRESENT_OFFSET }, { 0x2fa17, 6993, 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, 17659, G_UNICODE_NOT_PRESENT_OFFSET } }; static const gchar decomp_expansion_string[] = "\x20\0" /* offset 0 */ "\x20\xcc\x88\0" /* offset 2 */ "\x61\0" /* offset 6 */ "\x20\xcc\x84\0" /* offset 8 */ "\x32\0" /* offset 12 */ "\x33\0" /* offset 14 */ "\x20\xcc\x81\0" /* offset 16 */ "\xce\xbc\0" /* offset 20 */ "\x20\xcc\xa7\0" /* offset 23 */ "\x31\0" /* offset 27 */ "\x6f\0" /* offset 29 */ "\x31\xe2\x81\x84\x34\0" /* offset 31 */ "\x31\xe2\x81\x84\x32\0" /* offset 37 */ "\x33\xe2\x81\x84\x34\0" /* offset 43 */ "\x41\xcc\x80\0" /* offset 49 */ "\x41\xcc\x81\0" /* offset 53 */ "\x41\xcc\x82\0" /* offset 57 */ "\x41\xcc\x83\0" /* offset 61 */ "\x41\xcc\x88\0" /* offset 65 */ "\x41\xcc\x8a\0" /* offset 69 */ "\x43\xcc\xa7\0" /* offset 73 */ "\x45\xcc\x80\0" /* offset 77 */ "\x45\xcc\x81\0" /* offset 81 */ "\x45\xcc\x82\0" /* offset 85 */ "\x45\xcc\x88\0" /* offset 89 */ "\x49\xcc\x80\0" /* offset 93 */ "\x49\xcc\x81\0" /* offset 97 */ "\x49\xcc\x82\0" /* offset 101 */ "\x49\xcc\x88\0" /* offset 105 */ "\x4e\xcc\x83\0" /* offset 109 */ "\x4f\xcc\x80\0" /* offset 113 */ "\x4f\xcc\x81\0" /* offset 117 */ "\x4f\xcc\x82\0" /* offset 121 */ "\x4f\xcc\x83\0" /* offset 125 */ "\x4f\xcc\x88\0" /* offset 129 */ "\x55\xcc\x80\0" /* offset 133 */ "\x55\xcc\x81\0" /* offset 137 */ "\x55\xcc\x82\0" /* offset 141 */ "\x55\xcc\x88\0" /* offset 145 */ "\x59\xcc\x81\0" /* offset 149 */ "\x61\xcc\x80\0" /* offset 153 */ "\x61\xcc\x81\0" /* offset 157 */ "\x61\xcc\x82\0" /* offset 161 */ "\x61\xcc\x83\0" /* offset 165 */ "\x61\xcc\x88\0" /* offset 169 */ "\x61\xcc\x8a\0" /* offset 173 */ "\x63\xcc\xa7\0" /* offset 177 */ "\x65\xcc\x80\0" /* offset 181 */ "\x65\xcc\x81\0" /* offset 185 */ "\x65\xcc\x82\0" /* offset 189 */ "\x65\xcc\x88\0" /* offset 193 */ "\x69\xcc\x80\0" /* offset 197 */ "\x69\xcc\x81\0" /* offset 201 */ "\x69\xcc\x82\0" /* offset 205 */ "\x69\xcc\x88\0" /* offset 209 */ "\x6e\xcc\x83\0" /* offset 213 */ "\x6f\xcc\x80\0" /* offset 217 */ "\x6f\xcc\x81\0" /* offset 221 */ "\x6f\xcc\x82\0" /* offset 225 */ "\x6f\xcc\x83\0" /* offset 229 */ "\x6f\xcc\x88\0" /* offset 233 */ "\x75\xcc\x80\0" /* offset 237 */ "\x75\xcc\x81\0" /* offset 241 */ "\x75\xcc\x82\0" /* offset 245 */ "\x75\xcc\x88\0" /* offset 249 */ "\x79\xcc\x81\0" /* offset 253 */ "\x79\xcc\x88\0" /* offset 257 */ "\x41\xcc\x84\0" /* offset 261 */ "\x61\xcc\x84\0" /* offset 265 */ "\x41\xcc\x86\0" /* offset 269 */ "\x61\xcc\x86\0" /* offset 273 */ "\x41\xcc\xa8\0" /* offset 277 */ "\x61\xcc\xa8\0" /* offset 281 */ "\x43\xcc\x81\0" /* offset 285 */ "\x63\xcc\x81\0" /* offset 289 */ "\x43\xcc\x82\0" /* offset 293 */ "\x63\xcc\x82\0" /* offset 297 */ "\x43\xcc\x87\0" /* offset 301 */ "\x63\xcc\x87\0" /* offset 305 */ "\x43\xcc\x8c\0" /* offset 309 */ "\x63\xcc\x8c\0" /* offset 313 */ "\x44\xcc\x8c\0" /* offset 317 */ "\x64\xcc\x8c\0" /* offset 321 */ "\x45\xcc\x84\0" /* offset 325 */ "\x65\xcc\x84\0" /* offset 329 */ "\x45\xcc\x86\0" /* offset 333 */ "\x65\xcc\x86\0" /* offset 337 */ "\x45\xcc\x87\0" /* offset 341 */ "\x65\xcc\x87\0" /* offset 345 */ "\x45\xcc\xa8\0" /* offset 349 */ "\x65\xcc\xa8\0" /* offset 353 */ "\x45\xcc\x8c\0" /* offset 357 */ "\x65\xcc\x8c\0" /* offset 361 */ "\x47\xcc\x82\0" /* offset 365 */ "\x67\xcc\x82\0" /* offset 369 */ "\x47\xcc\x86\0" /* offset 373 */ "\x67\xcc\x86\0" /* offset 377 */ "\x47\xcc\x87\0" /* offset 381 */ "\x67\xcc\x87\0" /* offset 385 */ "\x47\xcc\xa7\0" /* offset 389 */ "\x67\xcc\xa7\0" /* offset 393 */ "\x48\xcc\x82\0" /* offset 397 */ "\x68\xcc\x82\0" /* offset 401 */ "\x49\xcc\x83\0" /* offset 405 */ "\x69\xcc\x83\0" /* offset 409 */ "\x49\xcc\x84\0" /* offset 413 */ "\x69\xcc\x84\0" /* offset 417 */ "\x49\xcc\x86\0" /* offset 421 */ "\x69\xcc\x86\0" /* offset 425 */ "\x49\xcc\xa8\0" /* offset 429 */ "\x69\xcc\xa8\0" /* offset 433 */ "\x49\xcc\x87\0" /* offset 437 */ "\x49\x4a\0" /* offset 441 */ "\x69\x6a\0" /* offset 444 */ "\x4a\xcc\x82\0" /* offset 447 */ "\x6a\xcc\x82\0" /* offset 451 */ "\x4b\xcc\xa7\0" /* offset 455 */ "\x6b\xcc\xa7\0" /* offset 459 */ "\x4c\xcc\x81\0" /* offset 463 */ "\x6c\xcc\x81\0" /* offset 467 */ "\x4c\xcc\xa7\0" /* offset 471 */ "\x6c\xcc\xa7\0" /* offset 475 */ "\x4c\xcc\x8c\0" /* offset 479 */ "\x6c\xcc\x8c\0" /* offset 483 */ "\x4c\xc2\xb7\0" /* offset 487 */ "\x6c\xc2\xb7\0" /* offset 491 */ "\x4e\xcc\x81\0" /* offset 495 */ "\x6e\xcc\x81\0" /* offset 499 */ "\x4e\xcc\xa7\0" /* offset 503 */ "\x6e\xcc\xa7\0" /* offset 507 */ "\x4e\xcc\x8c\0" /* offset 511 */ "\x6e\xcc\x8c\0" /* offset 515 */ "\xca\xbc\x6e\0" /* offset 519 */ "\x4f\xcc\x84\0" /* offset 523 */ "\x6f\xcc\x84\0" /* offset 527 */ "\x4f\xcc\x86\0" /* offset 531 */ "\x6f\xcc\x86\0" /* offset 535 */ "\x4f\xcc\x8b\0" /* offset 539 */ "\x6f\xcc\x8b\0" /* offset 543 */ "\x52\xcc\x81\0" /* offset 547 */ "\x72\xcc\x81\0" /* offset 551 */ "\x52\xcc\xa7\0" /* offset 555 */ "\x72\xcc\xa7\0" /* offset 559 */ "\x52\xcc\x8c\0" /* offset 563 */ "\x72\xcc\x8c\0" /* offset 567 */ "\x53\xcc\x81\0" /* offset 571 */ "\x73\xcc\x81\0" /* offset 575 */ "\x53\xcc\x82\0" /* offset 579 */ "\x73\xcc\x82\0" /* offset 583 */ "\x53\xcc\xa7\0" /* offset 587 */ "\x73\xcc\xa7\0" /* offset 591 */ "\x53\xcc\x8c\0" /* offset 595 */ "\x73\xcc\x8c\0" /* offset 599 */ "\x54\xcc\xa7\0" /* offset 603 */ "\x74\xcc\xa7\0" /* offset 607 */ "\x54\xcc\x8c\0" /* offset 611 */ "\x74\xcc\x8c\0" /* offset 615 */ "\x55\xcc\x83\0" /* offset 619 */ "\x75\xcc\x83\0" /* offset 623 */ "\x55\xcc\x84\0" /* offset 627 */ "\x75\xcc\x84\0" /* offset 631 */ "\x55\xcc\x86\0" /* offset 635 */ "\x75\xcc\x86\0" /* offset 639 */ "\x55\xcc\x8a\0" /* offset 643 */ "\x75\xcc\x8a\0" /* offset 647 */ "\x55\xcc\x8b\0" /* offset 651 */ "\x75\xcc\x8b\0" /* offset 655 */ "\x55\xcc\xa8\0" /* offset 659 */ "\x75\xcc\xa8\0" /* offset 663 */ "\x57\xcc\x82\0" /* offset 667 */ "\x77\xcc\x82\0" /* offset 671 */ "\x59\xcc\x82\0" /* offset 675 */ "\x79\xcc\x82\0" /* offset 679 */ "\x59\xcc\x88\0" /* offset 683 */ "\x5a\xcc\x81\0" /* offset 687 */ "\x7a\xcc\x81\0" /* offset 691 */ "\x5a\xcc\x87\0" /* offset 695 */ "\x7a\xcc\x87\0" /* offset 699 */ "\x5a\xcc\x8c\0" /* offset 703 */ "\x7a\xcc\x8c\0" /* offset 707 */ "\x73\0" /* offset 711 */ "\x4f\xcc\x9b\0" /* offset 713 */ "\x6f\xcc\x9b\0" /* offset 717 */ "\x55\xcc\x9b\0" /* offset 721 */ "\x75\xcc\x9b\0" /* offset 725 */ "\x44\x5a\xcc\x8c\0" /* offset 729 */ "\x44\x7a\xcc\x8c\0" /* offset 734 */ "\x64\x7a\xcc\x8c\0" /* offset 739 */ "\x4c\x4a\0" /* offset 744 */ "\x4c\x6a\0" /* offset 747 */ "\x6c\x6a\0" /* offset 750 */ "\x4e\x4a\0" /* offset 753 */ "\x4e\x6a\0" /* offset 756 */ "\x6e\x6a\0" /* offset 759 */ "\x41\xcc\x8c\0" /* offset 762 */ "\x61\xcc\x8c\0" /* offset 766 */ "\x49\xcc\x8c\0" /* offset 770 */ "\x69\xcc\x8c\0" /* offset 774 */ "\x4f\xcc\x8c\0" /* offset 778 */ "\x6f\xcc\x8c\0" /* offset 782 */ "\x55\xcc\x8c\0" /* offset 786 */ "\x75\xcc\x8c\0" /* offset 790 */ "\x55\xcc\x88\xcc\x84\0" /* offset 794 */ "\x75\xcc\x88\xcc\x84\0" /* offset 800 */ "\x55\xcc\x88\xcc\x81\0" /* offset 806 */ "\x75\xcc\x88\xcc\x81\0" /* offset 812 */ "\x55\xcc\x88\xcc\x8c\0" /* offset 818 */ "\x75\xcc\x88\xcc\x8c\0" /* offset 824 */ "\x55\xcc\x88\xcc\x80\0" /* offset 830 */ "\x75\xcc\x88\xcc\x80\0" /* offset 836 */ "\x41\xcc\x88\xcc\x84\0" /* offset 842 */ "\x61\xcc\x88\xcc\x84\0" /* offset 848 */ "\x41\xcc\x87\xcc\x84\0" /* offset 854 */ "\x61\xcc\x87\xcc\x84\0" /* offset 860 */ "\xc3\x86\xcc\x84\0" /* offset 866 */ "\xc3\xa6\xcc\x84\0" /* offset 871 */ "\x47\xcc\x8c\0" /* offset 876 */ "\x67\xcc\x8c\0" /* offset 880 */ "\x4b\xcc\x8c\0" /* offset 884 */ "\x6b\xcc\x8c\0" /* offset 888 */ "\x4f\xcc\xa8\0" /* offset 892 */ "\x6f\xcc\xa8\0" /* offset 896 */ "\x4f\xcc\xa8\xcc\x84\0" /* offset 900 */ "\x6f\xcc\xa8\xcc\x84\0" /* offset 906 */ "\xc6\xb7\xcc\x8c\0" /* offset 912 */ "\xca\x92\xcc\x8c\0" /* offset 917 */ "\x6a\xcc\x8c\0" /* offset 922 */ "\x44\x5a\0" /* offset 926 */ "\x44\x7a\0" /* offset 929 */ "\x64\x7a\0" /* offset 932 */ "\x47\xcc\x81\0" /* offset 935 */ "\x67\xcc\x81\0" /* offset 939 */ "\x4e\xcc\x80\0" /* offset 943 */ "\x6e\xcc\x80\0" /* offset 947 */ "\x41\xcc\x8a\xcc\x81\0" /* offset 951 */ "\x61\xcc\x8a\xcc\x81\0" /* offset 957 */ "\xc3\x86\xcc\x81\0" /* offset 963 */ "\xc3\xa6\xcc\x81\0" /* offset 968 */ "\xc3\x98\xcc\x81\0" /* offset 973 */ "\xc3\xb8\xcc\x81\0" /* offset 978 */ "\x41\xcc\x8f\0" /* offset 983 */ "\x61\xcc\x8f\0" /* offset 987 */ "\x41\xcc\x91\0" /* offset 991 */ "\x61\xcc\x91\0" /* offset 995 */ "\x45\xcc\x8f\0" /* offset 999 */ "\x65\xcc\x8f\0" /* offset 1003 */ "\x45\xcc\x91\0" /* offset 1007 */ "\x65\xcc\x91\0" /* offset 1011 */ "\x49\xcc\x8f\0" /* offset 1015 */ "\x69\xcc\x8f\0" /* offset 1019 */ "\x49\xcc\x91\0" /* offset 1023 */ "\x69\xcc\x91\0" /* offset 1027 */ "\x4f\xcc\x8f\0" /* offset 1031 */ "\x6f\xcc\x8f\0" /* offset 1035 */ "\x4f\xcc\x91\0" /* offset 1039 */ "\x6f\xcc\x91\0" /* offset 1043 */ "\x52\xcc\x8f\0" /* offset 1047 */ "\x72\xcc\x8f\0" /* offset 1051 */ "\x52\xcc\x91\0" /* offset 1055 */ "\x72\xcc\x91\0" /* offset 1059 */ "\x55\xcc\x8f\0" /* offset 1063 */ "\x75\xcc\x8f\0" /* offset 1067 */ "\x55\xcc\x91\0" /* offset 1071 */ "\x75\xcc\x91\0" /* offset 1075 */ "\x53\xcc\xa6\0" /* offset 1079 */ "\x73\xcc\xa6\0" /* offset 1083 */ "\x54\xcc\xa6\0" /* offset 1087 */ "\x74\xcc\xa6\0" /* offset 1091 */ "\x48\xcc\x8c\0" /* offset 1095 */ "\x68\xcc\x8c\0" /* offset 1099 */ "\x41\xcc\x87\0" /* offset 1103 */ "\x61\xcc\x87\0" /* offset 1107 */ "\x45\xcc\xa7\0" /* offset 1111 */ "\x65\xcc\xa7\0" /* offset 1115 */ "\x4f\xcc\x88\xcc\x84\0" /* offset 1119 */ "\x6f\xcc\x88\xcc\x84\0" /* offset 1125 */ "\x4f\xcc\x83\xcc\x84\0" /* offset 1131 */ "\x6f\xcc\x83\xcc\x84\0" /* offset 1137 */ "\x4f\xcc\x87\0" /* offset 1143 */ "\x6f\xcc\x87\0" /* offset 1147 */ "\x4f\xcc\x87\xcc\x84\0" /* offset 1151 */ "\x6f\xcc\x87\xcc\x84\0" /* offset 1157 */ "\x59\xcc\x84\0" /* offset 1163 */ "\x79\xcc\x84\0" /* offset 1167 */ "\x68\0" /* offset 1171 */ "\xc9\xa6\0" /* offset 1173 */ "\x6a\0" /* offset 1176 */ "\x72\0" /* offset 1178 */ "\xc9\xb9\0" /* offset 1180 */ "\xc9\xbb\0" /* offset 1183 */ "\xca\x81\0" /* offset 1186 */ "\x77\0" /* offset 1189 */ "\x79\0" /* offset 1191 */ "\x20\xcc\x86\0" /* offset 1193 */ "\x20\xcc\x87\0" /* offset 1197 */ "\x20\xcc\x8a\0" /* offset 1201 */ "\x20\xcc\xa8\0" /* offset 1205 */ "\x20\xcc\x83\0" /* offset 1209 */ "\x20\xcc\x8b\0" /* offset 1213 */ "\xc9\xa3\0" /* offset 1217 */ "\x6c\0" /* offset 1220 */ "\x78\0" /* offset 1222 */ "\xca\x95\0" /* offset 1224 */ "\xcc\x80\0" /* offset 1227 */ "\xcc\x81\0" /* offset 1230 */ "\xcc\x93\0" /* offset 1233 */ "\xcc\x88\xcc\x81\0" /* offset 1236 */ "\xca\xb9\0" /* offset 1241 */ "\x20\xcd\x85\0" /* offset 1244 */ "\x3b\0" /* offset 1248 */ "\xc2\xa8\xcc\x81\0" /* offset 1250 */ "\x20\xcc\x88\xcc\x81\0" /* offset 1255 */ "\xce\x91\xcc\x81\0" /* offset 1261 */ "\xc2\xb7\0" /* offset 1266 */ "\xce\x95\xcc\x81\0" /* offset 1269 */ "\xce\x97\xcc\x81\0" /* offset 1274 */ "\xce\x99\xcc\x81\0" /* offset 1279 */ "\xce\x9f\xcc\x81\0" /* offset 1284 */ "\xce\xa5\xcc\x81\0" /* offset 1289 */ "\xce\xa9\xcc\x81\0" /* offset 1294 */ "\xce\xb9\xcc\x88\xcc\x81\0" /* offset 1299 */ "\xce\x99\xcc\x88\0" /* offset 1306 */ "\xce\xa5\xcc\x88\0" /* offset 1311 */ "\xce\xb1\xcc\x81\0" /* offset 1316 */ "\xce\xb5\xcc\x81\0" /* offset 1321 */ "\xce\xb7\xcc\x81\0" /* offset 1326 */ "\xce\xb9\xcc\x81\0" /* offset 1331 */ "\xcf\x85\xcc\x88\xcc\x81\0" /* offset 1336 */ "\xce\xb9\xcc\x88\0" /* offset 1343 */ "\xcf\x85\xcc\x88\0" /* offset 1348 */ "\xce\xbf\xcc\x81\0" /* offset 1353 */ "\xcf\x85\xcc\x81\0" /* offset 1358 */ "\xcf\x89\xcc\x81\0" /* offset 1363 */ "\xce\xb2\0" /* offset 1368 */ "\xce\xb8\0" /* offset 1371 */ "\xce\xa5\0" /* offset 1374 */ "\xcf\x92\xcc\x81\0" /* offset 1377 */ "\xcf\x92\xcc\x88\0" /* offset 1382 */ "\xcf\x86\0" /* offset 1387 */ "\xcf\x80\0" /* offset 1390 */ "\xce\xba\0" /* offset 1393 */ "\xcf\x81\0" /* offset 1396 */ "\xcf\x82\0" /* offset 1399 */ "\xce\x98\0" /* offset 1402 */ "\xce\xb5\0" /* offset 1405 */ "\xce\xa3\0" /* offset 1408 */ "\xd0\x95\xcc\x80\0" /* offset 1411 */ "\xd0\x95\xcc\x88\0" /* offset 1416 */ "\xd0\x93\xcc\x81\0" /* offset 1421 */ "\xd0\x86\xcc\x88\0" /* offset 1426 */ "\xd0\x9a\xcc\x81\0" /* offset 1431 */ "\xd0\x98\xcc\x80\0" /* offset 1436 */ "\xd0\xa3\xcc\x86\0" /* offset 1441 */ "\xd0\x98\xcc\x86\0" /* offset 1446 */ "\xd0\xb8\xcc\x86\0" /* offset 1451 */ "\xd0\xb5\xcc\x80\0" /* offset 1456 */ "\xd0\xb5\xcc\x88\0" /* offset 1461 */ "\xd0\xb3\xcc\x81\0" /* offset 1466 */ "\xd1\x96\xcc\x88\0" /* offset 1471 */ "\xd0\xba\xcc\x81\0" /* offset 1476 */ "\xd0\xb8\xcc\x80\0" /* offset 1481 */ "\xd1\x83\xcc\x86\0" /* offset 1486 */ "\xd1\xb4\xcc\x8f\0" /* offset 1491 */ "\xd1\xb5\xcc\x8f\0" /* offset 1496 */ "\xd0\x96\xcc\x86\0" /* offset 1501 */ "\xd0\xb6\xcc\x86\0" /* offset 1506 */ "\xd0\x90\xcc\x86\0" /* offset 1511 */ "\xd0\xb0\xcc\x86\0" /* offset 1516 */ "\xd0\x90\xcc\x88\0" /* offset 1521 */ "\xd0\xb0\xcc\x88\0" /* offset 1526 */ "\xd0\x95\xcc\x86\0" /* offset 1531 */ "\xd0\xb5\xcc\x86\0" /* offset 1536 */ "\xd3\x98\xcc\x88\0" /* offset 1541 */ "\xd3\x99\xcc\x88\0" /* offset 1546 */ "\xd0\x96\xcc\x88\0" /* offset 1551 */ "\xd0\xb6\xcc\x88\0" /* offset 1556 */ "\xd0\x97\xcc\x88\0" /* offset 1561 */ "\xd0\xb7\xcc\x88\0" /* offset 1566 */ "\xd0\x98\xcc\x84\0" /* offset 1571 */ "\xd0\xb8\xcc\x84\0" /* offset 1576 */ "\xd0\x98\xcc\x88\0" /* offset 1581 */ "\xd0\xb8\xcc\x88\0" /* offset 1586 */ "\xd0\x9e\xcc\x88\0" /* offset 1591 */ "\xd0\xbe\xcc\x88\0" /* offset 1596 */ "\xd3\xa8\xcc\x88\0" /* offset 1601 */ "\xd3\xa9\xcc\x88\0" /* offset 1606 */ "\xd0\xad\xcc\x88\0" /* offset 1611 */ "\xd1\x8d\xcc\x88\0" /* offset 1616 */ "\xd0\xa3\xcc\x84\0" /* offset 1621 */ "\xd1\x83\xcc\x84\0" /* offset 1626 */ "\xd0\xa3\xcc\x88\0" /* offset 1631 */ "\xd1\x83\xcc\x88\0" /* offset 1636 */ "\xd0\xa3\xcc\x8b\0" /* offset 1641 */ "\xd1\x83\xcc\x8b\0" /* offset 1646 */ "\xd0\xa7\xcc\x88\0" /* offset 1651 */ "\xd1\x87\xcc\x88\0" /* offset 1656 */ "\xd0\xab\xcc\x88\0" /* offset 1661 */ "\xd1\x8b\xcc\x88\0" /* offset 1666 */ "\xd5\xa5\xd6\x82\0" /* offset 1671 */ "\xd8\xa7\xd9\x93\0" /* offset 1676 */ "\xd8\xa7\xd9\x94\0" /* offset 1681 */ "\xd9\x88\xd9\x94\0" /* offset 1686 */ "\xd8\xa7\xd9\x95\0" /* offset 1691 */ "\xd9\x8a\xd9\x94\0" /* offset 1696 */ "\xd8\xa7\xd9\xb4\0" /* offset 1701 */ "\xd9\x88\xd9\xb4\0" /* offset 1706 */ "\xdb\x87\xd9\xb4\0" /* offset 1711 */ "\xd9\x8a\xd9\xb4\0" /* offset 1716 */ "\xdb\x95\xd9\x94\0" /* offset 1721 */ "\xdb\x81\xd9\x94\0" /* offset 1726 */ "\xdb\x92\xd9\x94\0" /* offset 1731 */ "\xe0\xa4\xa8\xe0\xa4\xbc\0" /* offset 1736 */ "\xe0\xa4\xb0\xe0\xa4\xbc\0" /* offset 1743 */ "\xe0\xa4\xb3\xe0\xa4\xbc\0" /* offset 1750 */ "\xe0\xa4\x95\xe0\xa4\xbc\0" /* offset 1757 */ "\xe0\xa4\x96\xe0\xa4\xbc\0" /* offset 1764 */ "\xe0\xa4\x97\xe0\xa4\xbc\0" /* offset 1771 */ "\xe0\xa4\x9c\xe0\xa4\xbc\0" /* offset 1778 */ "\xe0\xa4\xa1\xe0\xa4\xbc\0" /* offset 1785 */ "\xe0\xa4\xa2\xe0\xa4\xbc\0" /* offset 1792 */ "\xe0\xa4\xab\xe0\xa4\xbc\0" /* offset 1799 */ "\xe0\xa4\xaf\xe0\xa4\xbc\0" /* offset 1806 */ "\xe0\xa7\x87\xe0\xa6\xbe\0" /* offset 1813 */ "\xe0\xa7\x87\xe0\xa7\x97\0" /* offset 1820 */ "\xe0\xa6\xa1\xe0\xa6\xbc\0" /* offset 1827 */ "\xe0\xa6\xa2\xe0\xa6\xbc\0" /* offset 1834 */ "\xe0\xa6\xaf\xe0\xa6\xbc\0" /* offset 1841 */ "\xe0\xa8\xb2\xe0\xa8\xbc\0" /* offset 1848 */ "\xe0\xa8\xb8\xe0\xa8\xbc\0" /* offset 1855 */ "\xe0\xa8\x96\xe0\xa8\xbc\0" /* offset 1862 */ "\xe0\xa8\x97\xe0\xa8\xbc\0" /* offset 1869 */ "\xe0\xa8\x9c\xe0\xa8\xbc\0" /* offset 1876 */ "\xe0\xa8\xab\xe0\xa8\xbc\0" /* offset 1883 */ "\xe0\xad\x87\xe0\xad\x96\0" /* offset 1890 */ "\xe0\xad\x87\xe0\xac\xbe\0" /* offset 1897 */ "\xe0\xad\x87\xe0\xad\x97\0" /* offset 1904 */ "\xe0\xac\xa1\xe0\xac\xbc\0" /* offset 1911 */ "\xe0\xac\xa2\xe0\xac\xbc\0" /* offset 1918 */ "\xe0\xae\x92\xe0\xaf\x97\0" /* offset 1925 */ "\xe0\xaf\x86\xe0\xae\xbe\0" /* offset 1932 */ "\xe0\xaf\x87\xe0\xae\xbe\0" /* offset 1939 */ "\xe0\xaf\x86\xe0\xaf\x97\0" /* offset 1946 */ "\xe0\xb1\x86\xe0\xb1\x96\0" /* offset 1953 */ "\xe0\xb2\xbf\xe0\xb3\x95\0" /* offset 1960 */ "\xe0\xb3\x86\xe0\xb3\x95\0" /* offset 1967 */ "\xe0\xb3\x86\xe0\xb3\x96\0" /* offset 1974 */ "\xe0\xb3\x86\xe0\xb3\x82\0" /* offset 1981 */ "\xe0\xb3\x86\xe0\xb3\x82\xe0\xb3\x95\0" /* offset 1988 */ "\xe0\xb5\x86\xe0\xb4\xbe\0" /* offset 1998 */ "\xe0\xb5\x87\xe0\xb4\xbe\0" /* offset 2005 */ "\xe0\xb5\x86\xe0\xb5\x97\0" /* offset 2012 */ "\xe0\xb7\x99\xe0\xb7\x8a\0" /* offset 2019 */ "\xe0\xb7\x99\xe0\xb7\x8f\0" /* offset 2026 */ "\xe0\xb7\x99\xe0\xb7\x8f\xe0\xb7\x8a\0" /* offset 2033 */ "\xe0\xb7\x99\xe0\xb7\x9f\0" /* offset 2043 */ "\xe0\xb9\x8d\xe0\xb8\xb2\0" /* offset 2050 */ "\xe0\xbb\x8d\xe0\xba\xb2\0" /* offset 2057 */ "\xe0\xba\xab\xe0\xba\x99\0" /* offset 2064 */ "\xe0\xba\xab\xe0\xba\xa1\0" /* offset 2071 */ "\xe0\xbc\x8b\0" /* offset 2078 */ "\xe0\xbd\x82\xe0\xbe\xb7\0" /* offset 2082 */ "\xe0\xbd\x8c\xe0\xbe\xb7\0" /* offset 2089 */ "\xe0\xbd\x91\xe0\xbe\xb7\0" /* offset 2096 */ "\xe0\xbd\x96\xe0\xbe\xb7\0" /* offset 2103 */ "\xe0\xbd\x9b\xe0\xbe\xb7\0" /* offset 2110 */ "\xe0\xbd\x80\xe0\xbe\xb5\0" /* offset 2117 */ "\xe0\xbd\xb1\xe0\xbd\xb2\0" /* offset 2124 */ "\xe0\xbd\xb1\xe0\xbd\xb4\0" /* offset 2131 */ "\xe0\xbe\xb2\xe0\xbe\x80\0" /* offset 2138 */ "\xe0\xbe\xb2\xe0\xbd\xb1\xe0\xbe\x80\0" /* offset 2145 */ "\xe0\xbe\xb3\xe0\xbe\x80\0" /* offset 2155 */ "\xe0\xbe\xb3\xe0\xbd\xb1\xe0\xbe\x80\0" /* offset 2162 */ "\xe0\xbd\xb1\xe0\xbe\x80\0" /* offset 2172 */ "\xe0\xbe\x92\xe0\xbe\xb7\0" /* offset 2179 */ "\xe0\xbe\x9c\xe0\xbe\xb7\0" /* offset 2186 */ "\xe0\xbe\xa1\xe0\xbe\xb7\0" /* offset 2193 */ "\xe0\xbe\xa6\xe0\xbe\xb7\0" /* offset 2200 */ "\xe0\xbe\xab\xe0\xbe\xb7\0" /* offset 2207 */ "\xe0\xbe\x90\xe0\xbe\xb5\0" /* offset 2214 */ "\xe1\x80\xa5\xe1\x80\xae\0" /* offset 2221 */ "\xe1\x83\x9c\0" /* offset 2228 */ "\xe1\xac\x85\xe1\xac\xb5\0" /* offset 2232 */ "\xe1\xac\x87\xe1\xac\xb5\0" /* offset 2239 */ "\xe1\xac\x89\xe1\xac\xb5\0" /* offset 2246 */ "\xe1\xac\x8b\xe1\xac\xb5\0" /* offset 2253 */ "\xe1\xac\x8d\xe1\xac\xb5\0" /* offset 2260 */ "\xe1\xac\x91\xe1\xac\xb5\0" /* offset 2267 */ "\xe1\xac\xba\xe1\xac\xb5\0" /* offset 2274 */ "\xe1\xac\xbc\xe1\xac\xb5\0" /* offset 2281 */ "\xe1\xac\xbe\xe1\xac\xb5\0" /* offset 2288 */ "\xe1\xac\xbf\xe1\xac\xb5\0" /* offset 2295 */ "\xe1\xad\x82\xe1\xac\xb5\0" /* offset 2302 */ "\x41\0" /* offset 2309 */ "\xc3\x86\0" /* offset 2311 */ "\x42\0" /* offset 2314 */ "\x44\0" /* offset 2316 */ "\x45\0" /* offset 2318 */ "\xc6\x8e\0" /* offset 2320 */ "\x47\0" /* offset 2323 */ "\x48\0" /* offset 2325 */ "\x49\0" /* offset 2327 */ "\x4a\0" /* offset 2329 */ "\x4b\0" /* offset 2331 */ "\x4c\0" /* offset 2333 */ "\x4d\0" /* offset 2335 */ "\x4e\0" /* offset 2337 */ "\x4f\0" /* offset 2339 */ "\xc8\xa2\0" /* offset 2341 */ "\x50\0" /* offset 2344 */ "\x52\0" /* offset 2346 */ "\x54\0" /* offset 2348 */ "\x55\0" /* offset 2350 */ "\x57\0" /* offset 2352 */ "\xc9\x90\0" /* offset 2354 */ "\xc9\x91\0" /* offset 2357 */ "\xe1\xb4\x82\0" /* offset 2360 */ "\x62\0" /* offset 2364 */ "\x64\0" /* offset 2366 */ "\x65\0" /* offset 2368 */ "\xc9\x99\0" /* offset 2370 */ "\xc9\x9b\0" /* offset 2373 */ "\xc9\x9c\0" /* offset 2376 */ "\x67\0" /* offset 2379 */ "\x6b\0" /* offset 2381 */ "\x6d\0" /* offset 2383 */ "\xc5\x8b\0" /* offset 2385 */ "\xc9\x94\0" /* offset 2388 */ "\xe1\xb4\x96\0" /* offset 2391 */ "\xe1\xb4\x97\0" /* offset 2395 */ "\x70\0" /* offset 2399 */ "\x74\0" /* offset 2401 */ "\x75\0" /* offset 2403 */ "\xe1\xb4\x9d\0" /* offset 2405 */ "\xc9\xaf\0" /* offset 2409 */ "\x76\0" /* offset 2412 */ "\xe1\xb4\xa5\0" /* offset 2414 */ "\xce\xb3\0" /* offset 2418 */ "\xce\xb4\0" /* offset 2421 */ "\xcf\x87\0" /* offset 2424 */ "\x69\0" /* offset 2427 */ "\xd0\xbd\0" /* offset 2429 */ "\xc9\x92\0" /* offset 2432 */ "\x63\0" /* offset 2435 */ "\xc9\x95\0" /* offset 2437 */ "\xc3\xb0\0" /* offset 2440 */ "\x66\0" /* offset 2443 */ "\xc9\x9f\0" /* offset 2445 */ "\xc9\xa1\0" /* offset 2448 */ "\xc9\xa5\0" /* offset 2451 */ "\xc9\xa8\0" /* offset 2454 */ "\xc9\xa9\0" /* offset 2457 */ "\xc9\xaa\0" /* offset 2460 */ "\xe1\xb5\xbb\0" /* offset 2463 */ "\xca\x9d\0" /* offset 2467 */ "\xc9\xad\0" /* offset 2470 */ "\xe1\xb6\x85\0" /* offset 2473 */ "\xca\x9f\0" /* offset 2477 */ "\xc9\xb1\0" /* offset 2480 */ "\xc9\xb0\0" /* offset 2483 */ "\xc9\xb2\0" /* offset 2486 */ "\xc9\xb3\0" /* offset 2489 */ "\xc9\xb4\0" /* offset 2492 */ "\xc9\xb5\0" /* offset 2495 */ "\xc9\xb8\0" /* offset 2498 */ "\xca\x82\0" /* offset 2501 */ "\xca\x83\0" /* offset 2504 */ "\xc6\xab\0" /* offset 2507 */ "\xca\x89\0" /* offset 2510 */ "\xca\x8a\0" /* offset 2513 */ "\xe1\xb4\x9c\0" /* offset 2516 */ "\xca\x8b\0" /* offset 2520 */ "\xca\x8c\0" /* offset 2523 */ "\x7a\0" /* offset 2526 */ "\xca\x90\0" /* offset 2528 */ "\xca\x91\0" /* offset 2531 */ "\xca\x92\0" /* offset 2534 */ "\x41\xcc\xa5\0" /* offset 2537 */ "\x61\xcc\xa5\0" /* offset 2541 */ "\x42\xcc\x87\0" /* offset 2545 */ "\x62\xcc\x87\0" /* offset 2549 */ "\x42\xcc\xa3\0" /* offset 2553 */ "\x62\xcc\xa3\0" /* offset 2557 */ "\x42\xcc\xb1\0" /* offset 2561 */ "\x62\xcc\xb1\0" /* offset 2565 */ "\x43\xcc\xa7\xcc\x81\0" /* offset 2569 */ "\x63\xcc\xa7\xcc\x81\0" /* offset 2575 */ "\x44\xcc\x87\0" /* offset 2581 */ "\x64\xcc\x87\0" /* offset 2585 */ "\x44\xcc\xa3\0" /* offset 2589 */ "\x64\xcc\xa3\0" /* offset 2593 */ "\x44\xcc\xb1\0" /* offset 2597 */ "\x64\xcc\xb1\0" /* offset 2601 */ "\x44\xcc\xa7\0" /* offset 2605 */ "\x64\xcc\xa7\0" /* offset 2609 */ "\x44\xcc\xad\0" /* offset 2613 */ "\x64\xcc\xad\0" /* offset 2617 */ "\x45\xcc\x84\xcc\x80\0" /* offset 2621 */ "\x65\xcc\x84\xcc\x80\0" /* offset 2627 */ "\x45\xcc\x84\xcc\x81\0" /* offset 2633 */ "\x65\xcc\x84\xcc\x81\0" /* offset 2639 */ "\x45\xcc\xad\0" /* offset 2645 */ "\x65\xcc\xad\0" /* offset 2649 */ "\x45\xcc\xb0\0" /* offset 2653 */ "\x65\xcc\xb0\0" /* offset 2657 */ "\x45\xcc\xa7\xcc\x86\0" /* offset 2661 */ "\x65\xcc\xa7\xcc\x86\0" /* offset 2667 */ "\x46\xcc\x87\0" /* offset 2673 */ "\x66\xcc\x87\0" /* offset 2677 */ "\x47\xcc\x84\0" /* offset 2681 */ "\x67\xcc\x84\0" /* offset 2685 */ "\x48\xcc\x87\0" /* offset 2689 */ "\x68\xcc\x87\0" /* offset 2693 */ "\x48\xcc\xa3\0" /* offset 2697 */ "\x68\xcc\xa3\0" /* offset 2701 */ "\x48\xcc\x88\0" /* offset 2705 */ "\x68\xcc\x88\0" /* offset 2709 */ "\x48\xcc\xa7\0" /* offset 2713 */ "\x68\xcc\xa7\0" /* offset 2717 */ "\x48\xcc\xae\0" /* offset 2721 */ "\x68\xcc\xae\0" /* offset 2725 */ "\x49\xcc\xb0\0" /* offset 2729 */ "\x69\xcc\xb0\0" /* offset 2733 */ "\x49\xcc\x88\xcc\x81\0" /* offset 2737 */ "\x69\xcc\x88\xcc\x81\0" /* offset 2743 */ "\x4b\xcc\x81\0" /* offset 2749 */ "\x6b\xcc\x81\0" /* offset 2753 */ "\x4b\xcc\xa3\0" /* offset 2757 */ "\x6b\xcc\xa3\0" /* offset 2761 */ "\x4b\xcc\xb1\0" /* offset 2765 */ "\x6b\xcc\xb1\0" /* offset 2769 */ "\x4c\xcc\xa3\0" /* offset 2773 */ "\x6c\xcc\xa3\0" /* offset 2777 */ "\x4c\xcc\xa3\xcc\x84\0" /* offset 2781 */ "\x6c\xcc\xa3\xcc\x84\0" /* offset 2787 */ "\x4c\xcc\xb1\0" /* offset 2793 */ "\x6c\xcc\xb1\0" /* offset 2797 */ "\x4c\xcc\xad\0" /* offset 2801 */ "\x6c\xcc\xad\0" /* offset 2805 */ "\x4d\xcc\x81\0" /* offset 2809 */ "\x6d\xcc\x81\0" /* offset 2813 */ "\x4d\xcc\x87\0" /* offset 2817 */ "\x6d\xcc\x87\0" /* offset 2821 */ "\x4d\xcc\xa3\0" /* offset 2825 */ "\x6d\xcc\xa3\0" /* offset 2829 */ "\x4e\xcc\x87\0" /* offset 2833 */ "\x6e\xcc\x87\0" /* offset 2837 */ "\x4e\xcc\xa3\0" /* offset 2841 */ "\x6e\xcc\xa3\0" /* offset 2845 */ "\x4e\xcc\xb1\0" /* offset 2849 */ "\x6e\xcc\xb1\0" /* offset 2853 */ "\x4e\xcc\xad\0" /* offset 2857 */ "\x6e\xcc\xad\0" /* offset 2861 */ "\x4f\xcc\x83\xcc\x81\0" /* offset 2865 */ "\x6f\xcc\x83\xcc\x81\0" /* offset 2871 */ "\x4f\xcc\x83\xcc\x88\0" /* offset 2877 */ "\x6f\xcc\x83\xcc\x88\0" /* offset 2883 */ "\x4f\xcc\x84\xcc\x80\0" /* offset 2889 */ "\x6f\xcc\x84\xcc\x80\0" /* offset 2895 */ "\x4f\xcc\x84\xcc\x81\0" /* offset 2901 */ "\x6f\xcc\x84\xcc\x81\0" /* offset 2907 */ "\x50\xcc\x81\0" /* offset 2913 */ "\x70\xcc\x81\0" /* offset 2917 */ "\x50\xcc\x87\0" /* offset 2921 */ "\x70\xcc\x87\0" /* offset 2925 */ "\x52\xcc\x87\0" /* offset 2929 */ "\x72\xcc\x87\0" /* offset 2933 */ "\x52\xcc\xa3\0" /* offset 2937 */ "\x72\xcc\xa3\0" /* offset 2941 */ "\x52\xcc\xa3\xcc\x84\0" /* offset 2945 */ "\x72\xcc\xa3\xcc\x84\0" /* offset 2951 */ "\x52\xcc\xb1\0" /* offset 2957 */ "\x72\xcc\xb1\0" /* offset 2961 */ "\x53\xcc\x87\0" /* offset 2965 */ "\x73\xcc\x87\0" /* offset 2969 */ "\x53\xcc\xa3\0" /* offset 2973 */ "\x73\xcc\xa3\0" /* offset 2977 */ "\x53\xcc\x81\xcc\x87\0" /* offset 2981 */ "\x73\xcc\x81\xcc\x87\0" /* offset 2987 */ "\x53\xcc\x8c\xcc\x87\0" /* offset 2993 */ "\x73\xcc\x8c\xcc\x87\0" /* offset 2999 */ "\x53\xcc\xa3\xcc\x87\0" /* offset 3005 */ "\x73\xcc\xa3\xcc\x87\0" /* offset 3011 */ "\x54\xcc\x87\0" /* offset 3017 */ "\x74\xcc\x87\0" /* offset 3021 */ "\x54\xcc\xa3\0" /* offset 3025 */ "\x74\xcc\xa3\0" /* offset 3029 */ "\x54\xcc\xb1\0" /* offset 3033 */ "\x74\xcc\xb1\0" /* offset 3037 */ "\x54\xcc\xad\0" /* offset 3041 */ "\x74\xcc\xad\0" /* offset 3045 */ "\x55\xcc\xa4\0" /* offset 3049 */ "\x75\xcc\xa4\0" /* offset 3053 */ "\x55\xcc\xb0\0" /* offset 3057 */ "\x75\xcc\xb0\0" /* offset 3061 */ "\x55\xcc\xad\0" /* offset 3065 */ "\x75\xcc\xad\0" /* offset 3069 */ "\x55\xcc\x83\xcc\x81\0" /* offset 3073 */ "\x75\xcc\x83\xcc\x81\0" /* offset 3079 */ "\x55\xcc\x84\xcc\x88\0" /* offset 3085 */ "\x75\xcc\x84\xcc\x88\0" /* offset 3091 */ "\x56\xcc\x83\0" /* offset 3097 */ "\x76\xcc\x83\0" /* offset 3101 */ "\x56\xcc\xa3\0" /* offset 3105 */ "\x76\xcc\xa3\0" /* offset 3109 */ "\x57\xcc\x80\0" /* offset 3113 */ "\x77\xcc\x80\0" /* offset 3117 */ "\x57\xcc\x81\0" /* offset 3121 */ "\x77\xcc\x81\0" /* offset 3125 */ "\x57\xcc\x88\0" /* offset 3129 */ "\x77\xcc\x88\0" /* offset 3133 */ "\x57\xcc\x87\0" /* offset 3137 */ "\x77\xcc\x87\0" /* offset 3141 */ "\x57\xcc\xa3\0" /* offset 3145 */ "\x77\xcc\xa3\0" /* offset 3149 */ "\x58\xcc\x87\0" /* offset 3153 */ "\x78\xcc\x87\0" /* offset 3157 */ "\x58\xcc\x88\0" /* offset 3161 */ "\x78\xcc\x88\0" /* offset 3165 */ "\x59\xcc\x87\0" /* offset 3169 */ "\x79\xcc\x87\0" /* offset 3173 */ "\x5a\xcc\x82\0" /* offset 3177 */ "\x7a\xcc\x82\0" /* offset 3181 */ "\x5a\xcc\xa3\0" /* offset 3185 */ "\x7a\xcc\xa3\0" /* offset 3189 */ "\x5a\xcc\xb1\0" /* offset 3193 */ "\x7a\xcc\xb1\0" /* offset 3197 */ "\x68\xcc\xb1\0" /* offset 3201 */ "\x74\xcc\x88\0" /* offset 3205 */ "\x77\xcc\x8a\0" /* offset 3209 */ "\x79\xcc\x8a\0" /* offset 3213 */ "\x61\xca\xbe\0" /* offset 3217 */ "\xc5\xbf\xcc\x87\0" /* offset 3221 */ "\x41\xcc\xa3\0" /* offset 3226 */ "\x61\xcc\xa3\0" /* offset 3230 */ "\x41\xcc\x89\0" /* offset 3234 */ "\x61\xcc\x89\0" /* offset 3238 */ "\x41\xcc\x82\xcc\x81\0" /* offset 3242 */ "\x61\xcc\x82\xcc\x81\0" /* offset 3248 */ "\x41\xcc\x82\xcc\x80\0" /* offset 3254 */ "\x61\xcc\x82\xcc\x80\0" /* offset 3260 */ "\x41\xcc\x82\xcc\x89\0" /* offset 3266 */ "\x61\xcc\x82\xcc\x89\0" /* offset 3272 */ "\x41\xcc\x82\xcc\x83\0" /* offset 3278 */ "\x61\xcc\x82\xcc\x83\0" /* offset 3284 */ "\x41\xcc\xa3\xcc\x82\0" /* offset 3290 */ "\x61\xcc\xa3\xcc\x82\0" /* offset 3296 */ "\x41\xcc\x86\xcc\x81\0" /* offset 3302 */ "\x61\xcc\x86\xcc\x81\0" /* offset 3308 */ "\x41\xcc\x86\xcc\x80\0" /* offset 3314 */ "\x61\xcc\x86\xcc\x80\0" /* offset 3320 */ "\x41\xcc\x86\xcc\x89\0" /* offset 3326 */ "\x61\xcc\x86\xcc\x89\0" /* offset 3332 */ "\x41\xcc\x86\xcc\x83\0" /* offset 3338 */ "\x61\xcc\x86\xcc\x83\0" /* offset 3344 */ "\x41\xcc\xa3\xcc\x86\0" /* offset 3350 */ "\x61\xcc\xa3\xcc\x86\0" /* offset 3356 */ "\x45\xcc\xa3\0" /* offset 3362 */ "\x65\xcc\xa3\0" /* offset 3366 */ "\x45\xcc\x89\0" /* offset 3370 */ "\x65\xcc\x89\0" /* offset 3374 */ "\x45\xcc\x83\0" /* offset 3378 */ "\x65\xcc\x83\0" /* offset 3382 */ "\x45\xcc\x82\xcc\x81\0" /* offset 3386 */ "\x65\xcc\x82\xcc\x81\0" /* offset 3392 */ "\x45\xcc\x82\xcc\x80\0" /* offset 3398 */ "\x65\xcc\x82\xcc\x80\0" /* offset 3404 */ "\x45\xcc\x82\xcc\x89\0" /* offset 3410 */ "\x65\xcc\x82\xcc\x89\0" /* offset 3416 */ "\x45\xcc\x82\xcc\x83\0" /* offset 3422 */ "\x65\xcc\x82\xcc\x83\0" /* offset 3428 */ "\x45\xcc\xa3\xcc\x82\0" /* offset 3434 */ "\x65\xcc\xa3\xcc\x82\0" /* offset 3440 */ "\x49\xcc\x89\0" /* offset 3446 */ "\x69\xcc\x89\0" /* offset 3450 */ "\x49\xcc\xa3\0" /* offset 3454 */ "\x69\xcc\xa3\0" /* offset 3458 */ "\x4f\xcc\xa3\0" /* offset 3462 */ "\x6f\xcc\xa3\0" /* offset 3466 */ "\x4f\xcc\x89\0" /* offset 3470 */ "\x6f\xcc\x89\0" /* offset 3474 */ "\x4f\xcc\x82\xcc\x81\0" /* offset 3478 */ "\x6f\xcc\x82\xcc\x81\0" /* offset 3484 */ "\x4f\xcc\x82\xcc\x80\0" /* offset 3490 */ "\x6f\xcc\x82\xcc\x80\0" /* offset 3496 */ "\x4f\xcc\x82\xcc\x89\0" /* offset 3502 */ "\x6f\xcc\x82\xcc\x89\0" /* offset 3508 */ "\x4f\xcc\x82\xcc\x83\0" /* offset 3514 */ "\x6f\xcc\x82\xcc\x83\0" /* offset 3520 */ "\x4f\xcc\xa3\xcc\x82\0" /* offset 3526 */ "\x6f\xcc\xa3\xcc\x82\0" /* offset 3532 */ "\x4f\xcc\x9b\xcc\x81\0" /* offset 3538 */ "\x6f\xcc\x9b\xcc\x81\0" /* offset 3544 */ "\x4f\xcc\x9b\xcc\x80\0" /* offset 3550 */ "\x6f\xcc\x9b\xcc\x80\0" /* offset 3556 */ "\x4f\xcc\x9b\xcc\x89\0" /* offset 3562 */ "\x6f\xcc\x9b\xcc\x89\0" /* offset 3568 */ "\x4f\xcc\x9b\xcc\x83\0" /* offset 3574 */ "\x6f\xcc\x9b\xcc\x83\0" /* offset 3580 */ "\x4f\xcc\x9b\xcc\xa3\0" /* offset 3586 */ "\x6f\xcc\x9b\xcc\xa3\0" /* offset 3592 */ "\x55\xcc\xa3\0" /* offset 3598 */ "\x75\xcc\xa3\0" /* offset 3602 */ "\x55\xcc\x89\0" /* offset 3606 */ "\x75\xcc\x89\0" /* offset 3610 */ "\x55\xcc\x9b\xcc\x81\0" /* offset 3614 */ "\x75\xcc\x9b\xcc\x81\0" /* offset 3620 */ "\x55\xcc\x9b\xcc\x80\0" /* offset 3626 */ "\x75\xcc\x9b\xcc\x80\0" /* offset 3632 */ "\x55\xcc\x9b\xcc\x89\0" /* offset 3638 */ "\x75\xcc\x9b\xcc\x89\0" /* offset 3644 */ "\x55\xcc\x9b\xcc\x83\0" /* offset 3650 */ "\x75\xcc\x9b\xcc\x83\0" /* offset 3656 */ "\x55\xcc\x9b\xcc\xa3\0" /* offset 3662 */ "\x75\xcc\x9b\xcc\xa3\0" /* offset 3668 */ "\x59\xcc\x80\0" /* offset 3674 */ "\x79\xcc\x80\0" /* offset 3678 */ "\x59\xcc\xa3\0" /* offset 3682 */ "\x79\xcc\xa3\0" /* offset 3686 */ "\x59\xcc\x89\0" /* offset 3690 */ "\x79\xcc\x89\0" /* offset 3694 */ "\x59\xcc\x83\0" /* offset 3698 */ "\x79\xcc\x83\0" /* offset 3702 */ "\xce\xb1\xcc\x93\0" /* offset 3706 */ "\xce\xb1\xcc\x94\0" /* offset 3711 */ "\xce\xb1\xcc\x93\xcc\x80\0" /* offset 3716 */ "\xce\xb1\xcc\x94\xcc\x80\0" /* offset 3723 */ "\xce\xb1\xcc\x93\xcc\x81\0" /* offset 3730 */ "\xce\xb1\xcc\x94\xcc\x81\0" /* offset 3737 */ "\xce\xb1\xcc\x93\xcd\x82\0" /* offset 3744 */ "\xce\xb1\xcc\x94\xcd\x82\0" /* offset 3751 */ "\xce\x91\xcc\x93\0" /* offset 3758 */ "\xce\x91\xcc\x94\0" /* offset 3763 */ "\xce\x91\xcc\x93\xcc\x80\0" /* offset 3768 */ "\xce\x91\xcc\x94\xcc\x80\0" /* offset 3775 */ "\xce\x91\xcc\x93\xcc\x81\0" /* offset 3782 */ "\xce\x91\xcc\x94\xcc\x81\0" /* offset 3789 */ "\xce\x91\xcc\x93\xcd\x82\0" /* offset 3796 */ "\xce\x91\xcc\x94\xcd\x82\0" /* offset 3803 */ "\xce\xb5\xcc\x93\0" /* offset 3810 */ "\xce\xb5\xcc\x94\0" /* offset 3815 */ "\xce\xb5\xcc\x93\xcc\x80\0" /* offset 3820 */ "\xce\xb5\xcc\x94\xcc\x80\0" /* offset 3827 */ "\xce\xb5\xcc\x93\xcc\x81\0" /* offset 3834 */ "\xce\xb5\xcc\x94\xcc\x81\0" /* offset 3841 */ "\xce\x95\xcc\x93\0" /* offset 3848 */ "\xce\x95\xcc\x94\0" /* offset 3853 */ "\xce\x95\xcc\x93\xcc\x80\0" /* offset 3858 */ "\xce\x95\xcc\x94\xcc\x80\0" /* offset 3865 */ "\xce\x95\xcc\x93\xcc\x81\0" /* offset 3872 */ "\xce\x95\xcc\x94\xcc\x81\0" /* offset 3879 */ "\xce\xb7\xcc\x93\0" /* offset 3886 */ "\xce\xb7\xcc\x94\0" /* offset 3891 */ "\xce\xb7\xcc\x93\xcc\x80\0" /* offset 3896 */ "\xce\xb7\xcc\x94\xcc\x80\0" /* offset 3903 */ "\xce\xb7\xcc\x93\xcc\x81\0" /* offset 3910 */ "\xce\xb7\xcc\x94\xcc\x81\0" /* offset 3917 */ "\xce\xb7\xcc\x93\xcd\x82\0" /* offset 3924 */ "\xce\xb7\xcc\x94\xcd\x82\0" /* offset 3931 */ "\xce\x97\xcc\x93\0" /* offset 3938 */ "\xce\x97\xcc\x94\0" /* offset 3943 */ "\xce\x97\xcc\x93\xcc\x80\0" /* offset 3948 */ "\xce\x97\xcc\x94\xcc\x80\0" /* offset 3955 */ "\xce\x97\xcc\x93\xcc\x81\0" /* offset 3962 */ "\xce\x97\xcc\x94\xcc\x81\0" /* offset 3969 */ "\xce\x97\xcc\x93\xcd\x82\0" /* offset 3976 */ "\xce\x97\xcc\x94\xcd\x82\0" /* offset 3983 */ "\xce\xb9\xcc\x93\0" /* offset 3990 */ "\xce\xb9\xcc\x94\0" /* offset 3995 */ "\xce\xb9\xcc\x93\xcc\x80\0" /* offset 4000 */ "\xce\xb9\xcc\x94\xcc\x80\0" /* offset 4007 */ "\xce\xb9\xcc\x93\xcc\x81\0" /* offset 4014 */ "\xce\xb9\xcc\x94\xcc\x81\0" /* offset 4021 */ "\xce\xb9\xcc\x93\xcd\x82\0" /* offset 4028 */ "\xce\xb9\xcc\x94\xcd\x82\0" /* offset 4035 */ "\xce\x99\xcc\x93\0" /* offset 4042 */ "\xce\x99\xcc\x94\0" /* offset 4047 */ "\xce\x99\xcc\x93\xcc\x80\0" /* offset 4052 */ "\xce\x99\xcc\x94\xcc\x80\0" /* offset 4059 */ "\xce\x99\xcc\x93\xcc\x81\0" /* offset 4066 */ "\xce\x99\xcc\x94\xcc\x81\0" /* offset 4073 */ "\xce\x99\xcc\x93\xcd\x82\0" /* offset 4080 */ "\xce\x99\xcc\x94\xcd\x82\0" /* offset 4087 */ "\xce\xbf\xcc\x93\0" /* offset 4094 */ "\xce\xbf\xcc\x94\0" /* offset 4099 */ "\xce\xbf\xcc\x93\xcc\x80\0" /* offset 4104 */ "\xce\xbf\xcc\x94\xcc\x80\0" /* offset 4111 */ "\xce\xbf\xcc\x93\xcc\x81\0" /* offset 4118 */ "\xce\xbf\xcc\x94\xcc\x81\0" /* offset 4125 */ "\xce\x9f\xcc\x93\0" /* offset 4132 */ "\xce\x9f\xcc\x94\0" /* offset 4137 */ "\xce\x9f\xcc\x93\xcc\x80\0" /* offset 4142 */ "\xce\x9f\xcc\x94\xcc\x80\0" /* offset 4149 */ "\xce\x9f\xcc\x93\xcc\x81\0" /* offset 4156 */ "\xce\x9f\xcc\x94\xcc\x81\0" /* offset 4163 */ "\xcf\x85\xcc\x93\0" /* offset 4170 */ "\xcf\x85\xcc\x94\0" /* offset 4175 */ "\xcf\x85\xcc\x93\xcc\x80\0" /* offset 4180 */ "\xcf\x85\xcc\x94\xcc\x80\0" /* offset 4187 */ "\xcf\x85\xcc\x93\xcc\x81\0" /* offset 4194 */ "\xcf\x85\xcc\x94\xcc\x81\0" /* offset 4201 */ "\xcf\x85\xcc\x93\xcd\x82\0" /* offset 4208 */ "\xcf\x85\xcc\x94\xcd\x82\0" /* offset 4215 */ "\xce\xa5\xcc\x94\0" /* offset 4222 */ "\xce\xa5\xcc\x94\xcc\x80\0" /* offset 4227 */ "\xce\xa5\xcc\x94\xcc\x81\0" /* offset 4234 */ "\xce\xa5\xcc\x94\xcd\x82\0" /* offset 4241 */ "\xcf\x89\xcc\x93\0" /* offset 4248 */ "\xcf\x89\xcc\x94\0" /* offset 4253 */ "\xcf\x89\xcc\x93\xcc\x80\0" /* offset 4258 */ "\xcf\x89\xcc\x94\xcc\x80\0" /* offset 4265 */ "\xcf\x89\xcc\x93\xcc\x81\0" /* offset 4272 */ "\xcf\x89\xcc\x94\xcc\x81\0" /* offset 4279 */ "\xcf\x89\xcc\x93\xcd\x82\0" /* offset 4286 */ "\xcf\x89\xcc\x94\xcd\x82\0" /* offset 4293 */ "\xce\xa9\xcc\x93\0" /* offset 4300 */ "\xce\xa9\xcc\x94\0" /* offset 4305 */ "\xce\xa9\xcc\x93\xcc\x80\0" /* offset 4310 */ "\xce\xa9\xcc\x94\xcc\x80\0" /* offset 4317 */ "\xce\xa9\xcc\x93\xcc\x81\0" /* offset 4324 */ "\xce\xa9\xcc\x94\xcc\x81\0" /* offset 4331 */ "\xce\xa9\xcc\x93\xcd\x82\0" /* offset 4338 */ "\xce\xa9\xcc\x94\xcd\x82\0" /* offset 4345 */ "\xce\xb1\xcc\x80\0" /* offset 4352 */ "\xce\xb5\xcc\x80\0" /* offset 4357 */ "\xce\xb7\xcc\x80\0" /* offset 4362 */ "\xce\xb9\xcc\x80\0" /* offset 4367 */ "\xce\xbf\xcc\x80\0" /* offset 4372 */ "\xcf\x85\xcc\x80\0" /* offset 4377 */ "\xcf\x89\xcc\x80\0" /* offset 4382 */ "\xce\xb1\xcc\x93\xcd\x85\0" /* offset 4387 */ "\xce\xb1\xcc\x94\xcd\x85\0" /* offset 4394 */ "\xce\xb1\xcc\x93\xcc\x80\xcd\x85\0" /* offset 4401 */ "\xce\xb1\xcc\x94\xcc\x80\xcd\x85\0" /* offset 4410 */ "\xce\xb1\xcc\x93\xcc\x81\xcd\x85\0" /* offset 4419 */ "\xce\xb1\xcc\x94\xcc\x81\xcd\x85\0" /* offset 4428 */ "\xce\xb1\xcc\x93\xcd\x82\xcd\x85\0" /* offset 4437 */ "\xce\xb1\xcc\x94\xcd\x82\xcd\x85\0" /* offset 4446 */ "\xce\x91\xcc\x93\xcd\x85\0" /* offset 4455 */ "\xce\x91\xcc\x94\xcd\x85\0" /* offset 4462 */ "\xce\x91\xcc\x93\xcc\x80\xcd\x85\0" /* offset 4469 */ "\xce\x91\xcc\x94\xcc\x80\xcd\x85\0" /* offset 4478 */ "\xce\x91\xcc\x93\xcc\x81\xcd\x85\0" /* offset 4487 */ "\xce\x91\xcc\x94\xcc\x81\xcd\x85\0" /* offset 4496 */ "\xce\x91\xcc\x93\xcd\x82\xcd\x85\0" /* offset 4505 */ "\xce\x91\xcc\x94\xcd\x82\xcd\x85\0" /* offset 4514 */ "\xce\xb7\xcc\x93\xcd\x85\0" /* offset 4523 */ "\xce\xb7\xcc\x94\xcd\x85\0" /* offset 4530 */ "\xce\xb7\xcc\x93\xcc\x80\xcd\x85\0" /* offset 4537 */ "\xce\xb7\xcc\x94\xcc\x80\xcd\x85\0" /* offset 4546 */ "\xce\xb7\xcc\x93\xcc\x81\xcd\x85\0" /* offset 4555 */ "\xce\xb7\xcc\x94\xcc\x81\xcd\x85\0" /* offset 4564 */ "\xce\xb7\xcc\x93\xcd\x82\xcd\x85\0" /* offset 4573 */ "\xce\xb7\xcc\x94\xcd\x82\xcd\x85\0" /* offset 4582 */ "\xce\x97\xcc\x93\xcd\x85\0" /* offset 4591 */ "\xce\x97\xcc\x94\xcd\x85\0" /* offset 4598 */ "\xce\x97\xcc\x93\xcc\x80\xcd\x85\0" /* offset 4605 */ "\xce\x97\xcc\x94\xcc\x80\xcd\x85\0" /* offset 4614 */ "\xce\x97\xcc\x93\xcc\x81\xcd\x85\0" /* offset 4623 */ "\xce\x97\xcc\x94\xcc\x81\xcd\x85\0" /* offset 4632 */ "\xce\x97\xcc\x93\xcd\x82\xcd\x85\0" /* offset 4641 */ "\xce\x97\xcc\x94\xcd\x82\xcd\x85\0" /* offset 4650 */ "\xcf\x89\xcc\x93\xcd\x85\0" /* offset 4659 */ "\xcf\x89\xcc\x94\xcd\x85\0" /* offset 4666 */ "\xcf\x89\xcc\x93\xcc\x80\xcd\x85\0" /* offset 4673 */ "\xcf\x89\xcc\x94\xcc\x80\xcd\x85\0" /* offset 4682 */ "\xcf\x89\xcc\x93\xcc\x81\xcd\x85\0" /* offset 4691 */ "\xcf\x89\xcc\x94\xcc\x81\xcd\x85\0" /* offset 4700 */ "\xcf\x89\xcc\x93\xcd\x82\xcd\x85\0" /* offset 4709 */ "\xcf\x89\xcc\x94\xcd\x82\xcd\x85\0" /* offset 4718 */ "\xce\xa9\xcc\x93\xcd\x85\0" /* offset 4727 */ "\xce\xa9\xcc\x94\xcd\x85\0" /* offset 4734 */ "\xce\xa9\xcc\x93\xcc\x80\xcd\x85\0" /* offset 4741 */ "\xce\xa9\xcc\x94\xcc\x80\xcd\x85\0" /* offset 4750 */ "\xce\xa9\xcc\x93\xcc\x81\xcd\x85\0" /* offset 4759 */ "\xce\xa9\xcc\x94\xcc\x81\xcd\x85\0" /* offset 4768 */ "\xce\xa9\xcc\x93\xcd\x82\xcd\x85\0" /* offset 4777 */ "\xce\xa9\xcc\x94\xcd\x82\xcd\x85\0" /* offset 4786 */ "\xce\xb1\xcc\x86\0" /* offset 4795 */ "\xce\xb1\xcc\x84\0" /* offset 4800 */ "\xce\xb1\xcc\x80\xcd\x85\0" /* offset 4805 */ "\xce\xb1\xcd\x85\0" /* offset 4812 */ "\xce\xb1\xcc\x81\xcd\x85\0" /* offset 4817 */ "\xce\xb1\xcd\x82\0" /* offset 4824 */ "\xce\xb1\xcd\x82\xcd\x85\0" /* offset 4829 */ "\xce\x91\xcc\x86\0" /* offset 4836 */ "\xce\x91\xcc\x84\0" /* offset 4841 */ "\xce\x91\xcc\x80\0" /* offset 4846 */ "\xce\x91\xcd\x85\0" /* offset 4851 */ "\x20\xcc\x93\0" /* offset 4856 */ "\xce\xb9\0" /* offset 4860 */ "\x20\xcd\x82\0" /* offset 4863 */ "\xc2\xa8\xcd\x82\0" /* offset 4867 */ "\x20\xcc\x88\xcd\x82\0" /* offset 4872 */ "\xce\xb7\xcc\x80\xcd\x85\0" /* offset 4878 */ "\xce\xb7\xcd\x85\0" /* offset 4885 */ "\xce\xb7\xcc\x81\xcd\x85\0" /* offset 4890 */ "\xce\xb7\xcd\x82\0" /* offset 4897 */ "\xce\xb7\xcd\x82\xcd\x85\0" /* offset 4902 */ "\xce\x95\xcc\x80\0" /* offset 4909 */ "\xce\x97\xcc\x80\0" /* offset 4914 */ "\xce\x97\xcd\x85\0" /* offset 4919 */ "\xe1\xbe\xbf\xcc\x80\0" /* offset 4924 */ "\x20\xcc\x93\xcc\x80\0" /* offset 4930 */ "\xe1\xbe\xbf\xcc\x81\0" /* offset 4936 */ "\x20\xcc\x93\xcc\x81\0" /* offset 4942 */ "\xe1\xbe\xbf\xcd\x82\0" /* offset 4948 */ "\x20\xcc\x93\xcd\x82\0" /* offset 4954 */ "\xce\xb9\xcc\x86\0" /* offset 4960 */ "\xce\xb9\xcc\x84\0" /* offset 4965 */ "\xce\xb9\xcc\x88\xcc\x80\0" /* offset 4970 */ "\xce\xb9\xcd\x82\0" /* offset 4977 */ "\xce\xb9\xcc\x88\xcd\x82\0" /* offset 4982 */ "\xce\x99\xcc\x86\0" /* offset 4989 */ "\xce\x99\xcc\x84\0" /* offset 4994 */ "\xce\x99\xcc\x80\0" /* offset 4999 */ "\xe1\xbf\xbe\xcc\x80\0" /* offset 5004 */ "\x20\xcc\x94\xcc\x80\0" /* offset 5010 */ "\xe1\xbf\xbe\xcc\x81\0" /* offset 5016 */ "\x20\xcc\x94\xcc\x81\0" /* offset 5022 */ "\xe1\xbf\xbe\xcd\x82\0" /* offset 5028 */ "\x20\xcc\x94\xcd\x82\0" /* offset 5034 */ "\xcf\x85\xcc\x86\0" /* offset 5040 */ "\xcf\x85\xcc\x84\0" /* offset 5045 */ "\xcf\x85\xcc\x88\xcc\x80\0" /* offset 5050 */ "\xcf\x81\xcc\x93\0" /* offset 5057 */ "\xcf\x81\xcc\x94\0" /* offset 5062 */ "\xcf\x85\xcd\x82\0" /* offset 5067 */ "\xcf\x85\xcc\x88\xcd\x82\0" /* offset 5072 */ "\xce\xa5\xcc\x86\0" /* offset 5079 */ "\xce\xa5\xcc\x84\0" /* offset 5084 */ "\xce\xa5\xcc\x80\0" /* offset 5089 */ "\xce\xa1\xcc\x94\0" /* offset 5094 */ "\xc2\xa8\xcc\x80\0" /* offset 5099 */ "\x20\xcc\x88\xcc\x80\0" /* offset 5104 */ "\x60\0" /* offset 5110 */ "\xcf\x89\xcc\x80\xcd\x85\0" /* offset 5112 */ "\xcf\x89\xcd\x85\0" /* offset 5119 */ "\xcf\x89\xcc\x81\xcd\x85\0" /* offset 5124 */ "\xcf\x89\xcd\x82\0" /* offset 5131 */ "\xcf\x89\xcd\x82\xcd\x85\0" /* offset 5136 */ "\xce\x9f\xcc\x80\0" /* offset 5143 */ "\xce\xa9\xcc\x80\0" /* offset 5148 */ "\xce\xa9\xcd\x85\0" /* offset 5153 */ "\xc2\xb4\0" /* offset 5158 */ "\x20\xcc\x94\0" /* offset 5161 */ "\xe2\x80\x82\0" /* offset 5165 */ "\xe2\x80\x83\0" /* offset 5169 */ "\xe2\x80\x90\0" /* offset 5173 */ "\x20\xcc\xb3\0" /* offset 5177 */ "\x2e\0" /* offset 5181 */ "\x2e\x2e\0" /* offset 5183 */ "\x2e\x2e\x2e\0" /* offset 5186 */ "\xe2\x80\xb2\xe2\x80\xb2\0" /* offset 5190 */ "\xe2\x80\xb2\xe2\x80\xb2\xe2\x80\xb2\0" /* offset 5197 */ "\xe2\x80\xb5\xe2\x80\xb5\0" /* offset 5207 */ "\xe2\x80\xb5\xe2\x80\xb5\xe2\x80\xb5\0" /* offset 5214 */ "\x21\x21\0" /* offset 5224 */ "\x20\xcc\x85\0" /* offset 5227 */ "\x3f\x3f\0" /* offset 5231 */ "\x3f\x21\0" /* offset 5234 */ "\x21\x3f\0" /* offset 5237 */ "\xe2\x80\xb2\xe2\x80\xb2\xe2\x80\xb2\xe2\x80\xb2\0" /* offset 5240 */ "\x30\0" /* offset 5253 */ "\x34\0" /* offset 5255 */ "\x35\0" /* offset 5257 */ "\x36\0" /* offset 5259 */ "\x37\0" /* offset 5261 */ "\x38\0" /* offset 5263 */ "\x39\0" /* offset 5265 */ "\x2b\0" /* offset 5267 */ "\xe2\x88\x92\0" /* offset 5269 */ "\x3d\0" /* offset 5273 */ "\x28\0" /* offset 5275 */ "\x29\0" /* offset 5277 */ "\x6e\0" /* offset 5279 */ "\x52\x73\0" /* offset 5281 */ "\x61\x2f\x63\0" /* offset 5284 */ "\x61\x2f\x73\0" /* offset 5288 */ "\x43\0" /* offset 5292 */ "\xc2\xb0\x43\0" /* offset 5294 */ "\x63\x2f\x6f\0" /* offset 5298 */ "\x63\x2f\x75\0" /* offset 5302 */ "\xc6\x90\0" /* offset 5306 */ "\xc2\xb0\x46\0" /* offset 5309 */ "\xc4\xa7\0" /* offset 5313 */ "\x4e\x6f\0" /* offset 5316 */ "\x51\0" /* offset 5319 */ "\x53\x4d\0" /* offset 5321 */ "\x54\x45\x4c\0" /* offset 5324 */ "\x54\x4d\0" /* offset 5328 */ "\x5a\0" /* offset 5331 */ "\xce\xa9\0" /* offset 5333 */ "\x46\0" /* offset 5336 */ "\xd7\x90\0" /* offset 5338 */ "\xd7\x91\0" /* offset 5341 */ "\xd7\x92\0" /* offset 5344 */ "\xd7\x93\0" /* offset 5347 */ "\x46\x41\x58\0" /* offset 5350 */ "\xce\x93\0" /* offset 5354 */ "\xce\xa0\0" /* offset 5357 */ "\xe2\x88\x91\0" /* offset 5360 */ "\x31\xe2\x81\x84\x37\0" /* offset 5364 */ "\x31\xe2\x81\x84\x39\0" /* offset 5370 */ "\x31\xe2\x81\x84\x31\x30\0" /* offset 5376 */ "\x31\xe2\x81\x84\x33\0" /* offset 5383 */ "\x32\xe2\x81\x84\x33\0" /* offset 5389 */ "\x31\xe2\x81\x84\x35\0" /* offset 5395 */ "\x32\xe2\x81\x84\x35\0" /* offset 5401 */ "\x33\xe2\x81\x84\x35\0" /* offset 5407 */ "\x34\xe2\x81\x84\x35\0" /* offset 5413 */ "\x31\xe2\x81\x84\x36\0" /* offset 5419 */ "\x35\xe2\x81\x84\x36\0" /* offset 5425 */ "\x31\xe2\x81\x84\x38\0" /* offset 5431 */ "\x33\xe2\x81\x84\x38\0" /* offset 5437 */ "\x35\xe2\x81\x84\x38\0" /* offset 5443 */ "\x37\xe2\x81\x84\x38\0" /* offset 5449 */ "\x31\xe2\x81\x84\0" /* offset 5455 */ "\x49\x49\0" /* offset 5460 */ "\x49\x49\x49\0" /* offset 5463 */ "\x49\x56\0" /* offset 5467 */ "\x56\0" /* offset 5470 */ "\x56\x49\0" /* offset 5472 */ "\x56\x49\x49\0" /* offset 5475 */ "\x56\x49\x49\x49\0" /* offset 5479 */ "\x49\x58\0" /* offset 5484 */ "\x58\0" /* offset 5487 */ "\x58\x49\0" /* offset 5489 */ "\x58\x49\x49\0" /* offset 5492 */ "\x69\x69\0" /* offset 5496 */ "\x69\x69\x69\0" /* offset 5499 */ "\x69\x76\0" /* offset 5503 */ "\x76\x69\0" /* offset 5506 */ "\x76\x69\x69\0" /* offset 5509 */ "\x76\x69\x69\x69\0" /* offset 5513 */ "\x69\x78\0" /* offset 5518 */ "\x78\x69\0" /* offset 5521 */ "\x78\x69\x69\0" /* offset 5524 */ "\x30\xe2\x81\x84\x33\0" /* offset 5528 */ "\xe2\x86\x90\xcc\xb8\0" /* offset 5534 */ "\xe2\x86\x92\xcc\xb8\0" /* offset 5540 */ "\xe2\x86\x94\xcc\xb8\0" /* offset 5546 */ "\xe2\x87\x90\xcc\xb8\0" /* offset 5552 */ "\xe2\x87\x94\xcc\xb8\0" /* offset 5558 */ "\xe2\x87\x92\xcc\xb8\0" /* offset 5564 */ "\xe2\x88\x83\xcc\xb8\0" /* offset 5570 */ "\xe2\x88\x88\xcc\xb8\0" /* offset 5576 */ "\xe2\x88\x8b\xcc\xb8\0" /* offset 5582 */ "\xe2\x88\xa3\xcc\xb8\0" /* offset 5588 */ "\xe2\x88\xa5\xcc\xb8\0" /* offset 5594 */ "\xe2\x88\xab\xe2\x88\xab\0" /* offset 5600 */ "\xe2\x88\xab\xe2\x88\xab\xe2\x88\xab\0" /* offset 5607 */ "\xe2\x88\xae\xe2\x88\xae\0" /* offset 5617 */ "\xe2\x88\xae\xe2\x88\xae\xe2\x88\xae\0" /* offset 5624 */ "\xe2\x88\xbc\xcc\xb8\0" /* offset 5634 */ "\xe2\x89\x83\xcc\xb8\0" /* offset 5640 */ "\xe2\x89\x85\xcc\xb8\0" /* offset 5646 */ "\xe2\x89\x88\xcc\xb8\0" /* offset 5652 */ "\x3d\xcc\xb8\0" /* offset 5658 */ "\xe2\x89\xa1\xcc\xb8\0" /* offset 5662 */ "\xe2\x89\x8d\xcc\xb8\0" /* offset 5668 */ "\x3c\xcc\xb8\0" /* offset 5674 */ "\x3e\xcc\xb8\0" /* offset 5678 */ "\xe2\x89\xa4\xcc\xb8\0" /* offset 5682 */ "\xe2\x89\xa5\xcc\xb8\0" /* offset 5688 */ "\xe2\x89\xb2\xcc\xb8\0" /* offset 5694 */ "\xe2\x89\xb3\xcc\xb8\0" /* offset 5700 */ "\xe2\x89\xb6\xcc\xb8\0" /* offset 5706 */ "\xe2\x89\xb7\xcc\xb8\0" /* offset 5712 */ "\xe2\x89\xba\xcc\xb8\0" /* offset 5718 */ "\xe2\x89\xbb\xcc\xb8\0" /* offset 5724 */ "\xe2\x8a\x82\xcc\xb8\0" /* offset 5730 */ "\xe2\x8a\x83\xcc\xb8\0" /* offset 5736 */ "\xe2\x8a\x86\xcc\xb8\0" /* offset 5742 */ "\xe2\x8a\x87\xcc\xb8\0" /* offset 5748 */ "\xe2\x8a\xa2\xcc\xb8\0" /* offset 5754 */ "\xe2\x8a\xa8\xcc\xb8\0" /* offset 5760 */ "\xe2\x8a\xa9\xcc\xb8\0" /* offset 5766 */ "\xe2\x8a\xab\xcc\xb8\0" /* offset 5772 */ "\xe2\x89\xbc\xcc\xb8\0" /* offset 5778 */ "\xe2\x89\xbd\xcc\xb8\0" /* offset 5784 */ "\xe2\x8a\x91\xcc\xb8\0" /* offset 5790 */ "\xe2\x8a\x92\xcc\xb8\0" /* offset 5796 */ "\xe2\x8a\xb2\xcc\xb8\0" /* offset 5802 */ "\xe2\x8a\xb3\xcc\xb8\0" /* offset 5808 */ "\xe2\x8a\xb4\xcc\xb8\0" /* offset 5814 */ "\xe2\x8a\xb5\xcc\xb8\0" /* offset 5820 */ "\xe3\x80\x88\0" /* offset 5826 */ "\xe3\x80\x89\0" /* offset 5830 */ "\x31\x30\0" /* offset 5834 */ "\x31\x31\0" /* offset 5837 */ "\x31\x32\0" /* offset 5840 */ "\x31\x33\0" /* offset 5843 */ "\x31\x34\0" /* offset 5846 */ "\x31\x35\0" /* offset 5849 */ "\x31\x36\0" /* offset 5852 */ "\x31\x37\0" /* offset 5855 */ "\x31\x38\0" /* offset 5858 */ "\x31\x39\0" /* offset 5861 */ "\x32\x30\0" /* offset 5864 */ "\x28\x31\x29\0" /* offset 5867 */ "\x28\x32\x29\0" /* offset 5871 */ "\x28\x33\x29\0" /* offset 5875 */ "\x28\x34\x29\0" /* offset 5879 */ "\x28\x35\x29\0" /* offset 5883 */ "\x28\x36\x29\0" /* offset 5887 */ "\x28\x37\x29\0" /* offset 5891 */ "\x28\x38\x29\0" /* offset 5895 */ "\x28\x39\x29\0" /* offset 5899 */ "\x28\x31\x30\x29\0" /* offset 5903 */ "\x28\x31\x31\x29\0" /* offset 5908 */ "\x28\x31\x32\x29\0" /* offset 5913 */ "\x28\x31\x33\x29\0" /* offset 5918 */ "\x28\x31\x34\x29\0" /* offset 5923 */ "\x28\x31\x35\x29\0" /* offset 5928 */ "\x28\x31\x36\x29\0" /* offset 5933 */ "\x28\x31\x37\x29\0" /* offset 5938 */ "\x28\x31\x38\x29\0" /* offset 5943 */ "\x28\x31\x39\x29\0" /* offset 5948 */ "\x28\x32\x30\x29\0" /* offset 5953 */ "\x31\x2e\0" /* offset 5958 */ "\x32\x2e\0" /* offset 5961 */ "\x33\x2e\0" /* offset 5964 */ "\x34\x2e\0" /* offset 5967 */ "\x35\x2e\0" /* offset 5970 */ "\x36\x2e\0" /* offset 5973 */ "\x37\x2e\0" /* offset 5976 */ "\x38\x2e\0" /* offset 5979 */ "\x39\x2e\0" /* offset 5982 */ "\x31\x30\x2e\0" /* offset 5985 */ "\x31\x31\x2e\0" /* offset 5989 */ "\x31\x32\x2e\0" /* offset 5993 */ "\x31\x33\x2e\0" /* offset 5997 */ "\x31\x34\x2e\0" /* offset 6001 */ "\x31\x35\x2e\0" /* offset 6005 */ "\x31\x36\x2e\0" /* offset 6009 */ "\x31\x37\x2e\0" /* offset 6013 */ "\x31\x38\x2e\0" /* offset 6017 */ "\x31\x39\x2e\0" /* offset 6021 */ "\x32\x30\x2e\0" /* offset 6025 */ "\x28\x61\x29\0" /* offset 6029 */ "\x28\x62\x29\0" /* offset 6033 */ "\x28\x63\x29\0" /* offset 6037 */ "\x28\x64\x29\0" /* offset 6041 */ "\x28\x65\x29\0" /* offset 6045 */ "\x28\x66\x29\0" /* offset 6049 */ "\x28\x67\x29\0" /* offset 6053 */ "\x28\x68\x29\0" /* offset 6057 */ "\x28\x69\x29\0" /* offset 6061 */ "\x28\x6a\x29\0" /* offset 6065 */ "\x28\x6b\x29\0" /* offset 6069 */ "\x28\x6c\x29\0" /* offset 6073 */ "\x28\x6d\x29\0" /* offset 6077 */ "\x28\x6e\x29\0" /* offset 6081 */ "\x28\x6f\x29\0" /* offset 6085 */ "\x28\x70\x29\0" /* offset 6089 */ "\x28\x71\x29\0" /* offset 6093 */ "\x28\x72\x29\0" /* offset 6097 */ "\x28\x73\x29\0" /* offset 6101 */ "\x28\x74\x29\0" /* offset 6105 */ "\x28\x75\x29\0" /* offset 6109 */ "\x28\x76\x29\0" /* offset 6113 */ "\x28\x77\x29\0" /* offset 6117 */ "\x28\x78\x29\0" /* offset 6121 */ "\x28\x79\x29\0" /* offset 6125 */ "\x28\x7a\x29\0" /* offset 6129 */ "\x53\0" /* offset 6133 */ "\x59\0" /* offset 6135 */ "\x71\0" /* offset 6137 */ "\xe2\x88\xab\xe2\x88\xab\xe2\x88\xab\xe2\x88\xab\0" /* offset 6139 */ "\x3a\x3a\x3d\0" /* offset 6152 */ "\x3d\x3d\0" /* offset 6156 */ "\x3d\x3d\x3d\0" /* offset 6159 */ "\xe2\xab\x9d\xcc\xb8\0" /* offset 6163 */ "\xe2\xb5\xa1\0" /* offset 6169 */ "\xe6\xaf\x8d\0" /* offset 6173 */ "\xe9\xbe\x9f\0" /* offset 6177 */ "\xe4\xb8\x80\0" /* offset 6181 */ "\xe4\xb8\xa8\0" /* offset 6185 */ "\xe4\xb8\xb6\0" /* offset 6189 */ "\xe4\xb8\xbf\0" /* offset 6193 */ "\xe4\xb9\x99\0" /* offset 6197 */ "\xe4\xba\x85\0" /* offset 6201 */ "\xe4\xba\x8c\0" /* offset 6205 */ "\xe4\xba\xa0\0" /* offset 6209 */ "\xe4\xba\xba\0" /* offset 6213 */ "\xe5\x84\xbf\0" /* offset 6217 */ "\xe5\x85\xa5\0" /* offset 6221 */ "\xe5\x85\xab\0" /* offset 6225 */ "\xe5\x86\x82\0" /* offset 6229 */ "\xe5\x86\x96\0" /* offset 6233 */ "\xe5\x86\xab\0" /* offset 6237 */ "\xe5\x87\xa0\0" /* offset 6241 */ "\xe5\x87\xb5\0" /* offset 6245 */ "\xe5\x88\x80\0" /* offset 6249 */ "\xe5\x8a\x9b\0" /* offset 6253 */ "\xe5\x8b\xb9\0" /* offset 6257 */ "\xe5\x8c\x95\0" /* offset 6261 */ "\xe5\x8c\x9a\0" /* offset 6265 */ "\xe5\x8c\xb8\0" /* offset 6269 */ "\xe5\x8d\x81\0" /* offset 6273 */ "\xe5\x8d\x9c\0" /* offset 6277 */ "\xe5\x8d\xa9\0" /* offset 6281 */ "\xe5\x8e\x82\0" /* offset 6285 */ "\xe5\x8e\xb6\0" /* offset 6289 */ "\xe5\x8f\x88\0" /* offset 6293 */ "\xe5\x8f\xa3\0" /* offset 6297 */ "\xe5\x9b\x97\0" /* offset 6301 */ "\xe5\x9c\x9f\0" /* offset 6305 */ "\xe5\xa3\xab\0" /* offset 6309 */ "\xe5\xa4\x82\0" /* offset 6313 */ "\xe5\xa4\x8a\0" /* offset 6317 */ "\xe5\xa4\x95\0" /* offset 6321 */ "\xe5\xa4\xa7\0" /* offset 6325 */ "\xe5\xa5\xb3\0" /* offset 6329 */ "\xe5\xad\x90\0" /* offset 6333 */ "\xe5\xae\x80\0" /* offset 6337 */ "\xe5\xaf\xb8\0" /* offset 6341 */ "\xe5\xb0\x8f\0" /* offset 6345 */ "\xe5\xb0\xa2\0" /* offset 6349 */ "\xe5\xb0\xb8\0" /* offset 6353 */ "\xe5\xb1\xae\0" /* offset 6357 */ "\xe5\xb1\xb1\0" /* offset 6361 */ "\xe5\xb7\x9b\0" /* offset 6365 */ "\xe5\xb7\xa5\0" /* offset 6369 */ "\xe5\xb7\xb1\0" /* offset 6373 */ "\xe5\xb7\xbe\0" /* offset 6377 */ "\xe5\xb9\xb2\0" /* offset 6381 */ "\xe5\xb9\xba\0" /* offset 6385 */ "\xe5\xb9\xbf\0" /* offset 6389 */ "\xe5\xbb\xb4\0" /* offset 6393 */ "\xe5\xbb\xbe\0" /* offset 6397 */ "\xe5\xbc\x8b\0" /* offset 6401 */ "\xe5\xbc\x93\0" /* offset 6405 */ "\xe5\xbd\x90\0" /* offset 6409 */ "\xe5\xbd\xa1\0" /* offset 6413 */ "\xe5\xbd\xb3\0" /* offset 6417 */ "\xe5\xbf\x83\0" /* offset 6421 */ "\xe6\x88\x88\0" /* offset 6425 */ "\xe6\x88\xb6\0" /* offset 6429 */ "\xe6\x89\x8b\0" /* offset 6433 */ "\xe6\x94\xaf\0" /* offset 6437 */ "\xe6\x94\xb4\0" /* offset 6441 */ "\xe6\x96\x87\0" /* offset 6445 */ "\xe6\x96\x97\0" /* offset 6449 */ "\xe6\x96\xa4\0" /* offset 6453 */ "\xe6\x96\xb9\0" /* offset 6457 */ "\xe6\x97\xa0\0" /* offset 6461 */ "\xe6\x97\xa5\0" /* offset 6465 */ "\xe6\x9b\xb0\0" /* offset 6469 */ "\xe6\x9c\x88\0" /* offset 6473 */ "\xe6\x9c\xa8\0" /* offset 6477 */ "\xe6\xac\xa0\0" /* offset 6481 */ "\xe6\xad\xa2\0" /* offset 6485 */ "\xe6\xad\xb9\0" /* offset 6489 */ "\xe6\xae\xb3\0" /* offset 6493 */ "\xe6\xaf\x8b\0" /* offset 6497 */ "\xe6\xaf\x94\0" /* offset 6501 */ "\xe6\xaf\x9b\0" /* offset 6505 */ "\xe6\xb0\x8f\0" /* offset 6509 */ "\xe6\xb0\x94\0" /* offset 6513 */ "\xe6\xb0\xb4\0" /* offset 6517 */ "\xe7\x81\xab\0" /* offset 6521 */ "\xe7\x88\xaa\0" /* offset 6525 */ "\xe7\x88\xb6\0" /* offset 6529 */ "\xe7\x88\xbb\0" /* offset 6533 */ "\xe7\x88\xbf\0" /* offset 6537 */ "\xe7\x89\x87\0" /* offset 6541 */ "\xe7\x89\x99\0" /* offset 6545 */ "\xe7\x89\x9b\0" /* offset 6549 */ "\xe7\x8a\xac\0" /* offset 6553 */ "\xe7\x8e\x84\0" /* offset 6557 */ "\xe7\x8e\x89\0" /* offset 6561 */ "\xe7\x93\x9c\0" /* offset 6565 */ "\xe7\x93\xa6\0" /* offset 6569 */ "\xe7\x94\x98\0" /* offset 6573 */ "\xe7\x94\x9f\0" /* offset 6577 */ "\xe7\x94\xa8\0" /* offset 6581 */ "\xe7\x94\xb0\0" /* offset 6585 */ "\xe7\x96\x8b\0" /* offset 6589 */ "\xe7\x96\x92\0" /* offset 6593 */ "\xe7\x99\xb6\0" /* offset 6597 */ "\xe7\x99\xbd\0" /* offset 6601 */ "\xe7\x9a\xae\0" /* offset 6605 */ "\xe7\x9a\xbf\0" /* offset 6609 */ "\xe7\x9b\xae\0" /* offset 6613 */ "\xe7\x9f\x9b\0" /* offset 6617 */ "\xe7\x9f\xa2\0" /* offset 6621 */ "\xe7\x9f\xb3\0" /* offset 6625 */ "\xe7\xa4\xba\0" /* offset 6629 */ "\xe7\xa6\xb8\0" /* offset 6633 */ "\xe7\xa6\xbe\0" /* offset 6637 */ "\xe7\xa9\xb4\0" /* offset 6641 */ "\xe7\xab\x8b\0" /* offset 6645 */ "\xe7\xab\xb9\0" /* offset 6649 */ "\xe7\xb1\xb3\0" /* offset 6653 */ "\xe7\xb3\xb8\0" /* offset 6657 */ "\xe7\xbc\xb6\0" /* offset 6661 */ "\xe7\xbd\x91\0" /* offset 6665 */ "\xe7\xbe\x8a\0" /* offset 6669 */ "\xe7\xbe\xbd\0" /* offset 6673 */ "\xe8\x80\x81\0" /* offset 6677 */ "\xe8\x80\x8c\0" /* offset 6681 */ "\xe8\x80\x92\0" /* offset 6685 */ "\xe8\x80\xb3\0" /* offset 6689 */ "\xe8\x81\xbf\0" /* offset 6693 */ "\xe8\x82\x89\0" /* offset 6697 */ "\xe8\x87\xa3\0" /* offset 6701 */ "\xe8\x87\xaa\0" /* offset 6705 */ "\xe8\x87\xb3\0" /* offset 6709 */ "\xe8\x87\xbc\0" /* offset 6713 */ "\xe8\x88\x8c\0" /* offset 6717 */ "\xe8\x88\x9b\0" /* offset 6721 */ "\xe8\x88\x9f\0" /* offset 6725 */ "\xe8\x89\xae\0" /* offset 6729 */ "\xe8\x89\xb2\0" /* offset 6733 */ "\xe8\x89\xb8\0" /* offset 6737 */ "\xe8\x99\x8d\0" /* offset 6741 */ "\xe8\x99\xab\0" /* offset 6745 */ "\xe8\xa1\x80\0" /* offset 6749 */ "\xe8\xa1\x8c\0" /* offset 6753 */ "\xe8\xa1\xa3\0" /* offset 6757 */ "\xe8\xa5\xbe\0" /* offset 6761 */ "\xe8\xa6\x8b\0" /* offset 6765 */ "\xe8\xa7\x92\0" /* offset 6769 */ "\xe8\xa8\x80\0" /* offset 6773 */ "\xe8\xb0\xb7\0" /* offset 6777 */ "\xe8\xb1\x86\0" /* offset 6781 */ "\xe8\xb1\x95\0" /* offset 6785 */ "\xe8\xb1\xb8\0" /* offset 6789 */ "\xe8\xb2\x9d\0" /* offset 6793 */ "\xe8\xb5\xa4\0" /* offset 6797 */ "\xe8\xb5\xb0\0" /* offset 6801 */ "\xe8\xb6\xb3\0" /* offset 6805 */ "\xe8\xba\xab\0" /* offset 6809 */ "\xe8\xbb\x8a\0" /* offset 6813 */ "\xe8\xbe\x9b\0" /* offset 6817 */ "\xe8\xbe\xb0\0" /* offset 6821 */ "\xe8\xbe\xb5\0" /* offset 6825 */ "\xe9\x82\x91\0" /* offset 6829 */ "\xe9\x85\x89\0" /* offset 6833 */ "\xe9\x87\x86\0" /* offset 6837 */ "\xe9\x87\x8c\0" /* offset 6841 */ "\xe9\x87\x91\0" /* offset 6845 */ "\xe9\x95\xb7\0" /* offset 6849 */ "\xe9\x96\x80\0" /* offset 6853 */ "\xe9\x98\x9c\0" /* offset 6857 */ "\xe9\x9a\xb6\0" /* offset 6861 */ "\xe9\x9a\xb9\0" /* offset 6865 */ "\xe9\x9b\xa8\0" /* offset 6869 */ "\xe9\x9d\x91\0" /* offset 6873 */ "\xe9\x9d\x9e\0" /* offset 6877 */ "\xe9\x9d\xa2\0" /* offset 6881 */ "\xe9\x9d\xa9\0" /* offset 6885 */ "\xe9\x9f\x8b\0" /* offset 6889 */ "\xe9\x9f\xad\0" /* offset 6893 */ "\xe9\x9f\xb3\0" /* offset 6897 */ "\xe9\xa0\x81\0" /* offset 6901 */ "\xe9\xa2\xa8\0" /* offset 6905 */ "\xe9\xa3\x9b\0" /* offset 6909 */ "\xe9\xa3\x9f\0" /* offset 6913 */ "\xe9\xa6\x96\0" /* offset 6917 */ "\xe9\xa6\x99\0" /* offset 6921 */ "\xe9\xa6\xac\0" /* offset 6925 */ "\xe9\xaa\xa8\0" /* offset 6929 */ "\xe9\xab\x98\0" /* offset 6933 */ "\xe9\xab\x9f\0" /* offset 6937 */ "\xe9\xac\xa5\0" /* offset 6941 */ "\xe9\xac\xaf\0" /* offset 6945 */ "\xe9\xac\xb2\0" /* offset 6949 */ "\xe9\xac\xbc\0" /* offset 6953 */ "\xe9\xad\x9a\0" /* offset 6957 */ "\xe9\xb3\xa5\0" /* offset 6961 */ "\xe9\xb9\xb5\0" /* offset 6965 */ "\xe9\xb9\xbf\0" /* offset 6969 */ "\xe9\xba\xa5\0" /* offset 6973 */ "\xe9\xba\xbb\0" /* offset 6977 */ "\xe9\xbb\x83\0" /* offset 6981 */ "\xe9\xbb\x8d\0" /* offset 6985 */ "\xe9\xbb\x91\0" /* offset 6989 */ "\xe9\xbb\xb9\0" /* offset 6993 */ "\xe9\xbb\xbd\0" /* offset 6997 */ "\xe9\xbc\x8e\0" /* offset 7001 */ "\xe9\xbc\x93\0" /* offset 7005 */ "\xe9\xbc\xa0\0" /* offset 7009 */ "\xe9\xbc\xbb\0" /* offset 7013 */ "\xe9\xbd\x8a\0" /* offset 7017 */ "\xe9\xbd\x92\0" /* offset 7021 */ "\xe9\xbe\x8d\0" /* offset 7025 */ "\xe9\xbe\x9c\0" /* offset 7029 */ "\xe9\xbe\xa0\0" /* offset 7033 */ "\xe3\x80\x92\0" /* offset 7037 */ "\xe5\x8d\x84\0" /* offset 7041 */ "\xe5\x8d\x85\0" /* offset 7045 */ "\xe3\x81\x8b\xe3\x82\x99\0" /* offset 7049 */ "\xe3\x81\x8d\xe3\x82\x99\0" /* offset 7056 */ "\xe3\x81\x8f\xe3\x82\x99\0" /* offset 7063 */ "\xe3\x81\x91\xe3\x82\x99\0" /* offset 7070 */ "\xe3\x81\x93\xe3\x82\x99\0" /* offset 7077 */ "\xe3\x81\x95\xe3\x82\x99\0" /* offset 7084 */ "\xe3\x81\x97\xe3\x82\x99\0" /* offset 7091 */ "\xe3\x81\x99\xe3\x82\x99\0" /* offset 7098 */ "\xe3\x81\x9b\xe3\x82\x99\0" /* offset 7105 */ "\xe3\x81\x9d\xe3\x82\x99\0" /* offset 7112 */ "\xe3\x81\x9f\xe3\x82\x99\0" /* offset 7119 */ "\xe3\x81\xa1\xe3\x82\x99\0" /* offset 7126 */ "\xe3\x81\xa4\xe3\x82\x99\0" /* offset 7133 */ "\xe3\x81\xa6\xe3\x82\x99\0" /* offset 7140 */ "\xe3\x81\xa8\xe3\x82\x99\0" /* offset 7147 */ "\xe3\x81\xaf\xe3\x82\x99\0" /* offset 7154 */ "\xe3\x81\xaf\xe3\x82\x9a\0" /* offset 7161 */ "\xe3\x81\xb2\xe3\x82\x99\0" /* offset 7168 */ "\xe3\x81\xb2\xe3\x82\x9a\0" /* offset 7175 */ "\xe3\x81\xb5\xe3\x82\x99\0" /* offset 7182 */ "\xe3\x81\xb5\xe3\x82\x9a\0" /* offset 7189 */ "\xe3\x81\xb8\xe3\x82\x99\0" /* offset 7196 */ "\xe3\x81\xb8\xe3\x82\x9a\0" /* offset 7203 */ "\xe3\x81\xbb\xe3\x82\x99\0" /* offset 7210 */ "\xe3\x81\xbb\xe3\x82\x9a\0" /* offset 7217 */ "\xe3\x81\x86\xe3\x82\x99\0" /* offset 7224 */ "\x20\xe3\x82\x99\0" /* offset 7231 */ "\x20\xe3\x82\x9a\0" /* offset 7236 */ "\xe3\x82\x9d\xe3\x82\x99\0" /* offset 7241 */ "\xe3\x82\x88\xe3\x82\x8a\0" /* offset 7248 */ "\xe3\x82\xab\xe3\x82\x99\0" /* offset 7255 */ "\xe3\x82\xad\xe3\x82\x99\0" /* offset 7262 */ "\xe3\x82\xaf\xe3\x82\x99\0" /* offset 7269 */ "\xe3\x82\xb1\xe3\x82\x99\0" /* offset 7276 */ "\xe3\x82\xb3\xe3\x82\x99\0" /* offset 7283 */ "\xe3\x82\xb5\xe3\x82\x99\0" /* offset 7290 */ "\xe3\x82\xb7\xe3\x82\x99\0" /* offset 7297 */ "\xe3\x82\xb9\xe3\x82\x99\0" /* offset 7304 */ "\xe3\x82\xbb\xe3\x82\x99\0" /* offset 7311 */ "\xe3\x82\xbd\xe3\x82\x99\0" /* offset 7318 */ "\xe3\x82\xbf\xe3\x82\x99\0" /* offset 7325 */ "\xe3\x83\x81\xe3\x82\x99\0" /* offset 7332 */ "\xe3\x83\x84\xe3\x82\x99\0" /* offset 7339 */ "\xe3\x83\x86\xe3\x82\x99\0" /* offset 7346 */ "\xe3\x83\x88\xe3\x82\x99\0" /* offset 7353 */ "\xe3\x83\x8f\xe3\x82\x99\0" /* offset 7360 */ "\xe3\x83\x8f\xe3\x82\x9a\0" /* offset 7367 */ "\xe3\x83\x92\xe3\x82\x99\0" /* offset 7374 */ "\xe3\x83\x92\xe3\x82\x9a\0" /* offset 7381 */ "\xe3\x83\x95\xe3\x82\x99\0" /* offset 7388 */ "\xe3\x83\x95\xe3\x82\x9a\0" /* offset 7395 */ "\xe3\x83\x98\xe3\x82\x99\0" /* offset 7402 */ "\xe3\x83\x98\xe3\x82\x9a\0" /* offset 7409 */ "\xe3\x83\x9b\xe3\x82\x99\0" /* offset 7416 */ "\xe3\x83\x9b\xe3\x82\x9a\0" /* offset 7423 */ "\xe3\x82\xa6\xe3\x82\x99\0" /* offset 7430 */ "\xe3\x83\xaf\xe3\x82\x99\0" /* offset 7437 */ "\xe3\x83\xb0\xe3\x82\x99\0" /* offset 7444 */ "\xe3\x83\xb1\xe3\x82\x99\0" /* offset 7451 */ "\xe3\x83\xb2\xe3\x82\x99\0" /* offset 7458 */ "\xe3\x83\xbd\xe3\x82\x99\0" /* offset 7465 */ "\xe3\x82\xb3\xe3\x83\x88\0" /* offset 7472 */ "\xe1\x84\x80\0" /* offset 7479 */ "\xe1\x84\x81\0" /* offset 7483 */ "\xe1\x86\xaa\0" /* offset 7487 */ "\xe1\x84\x82\0" /* offset 7491 */ "\xe1\x86\xac\0" /* offset 7495 */ "\xe1\x86\xad\0" /* offset 7499 */ "\xe1\x84\x83\0" /* offset 7503 */ "\xe1\x84\x84\0" /* offset 7507 */ "\xe1\x84\x85\0" /* offset 7511 */ "\xe1\x86\xb0\0" /* offset 7515 */ "\xe1\x86\xb1\0" /* offset 7519 */ "\xe1\x86\xb2\0" /* offset 7523 */ "\xe1\x86\xb3\0" /* offset 7527 */ "\xe1\x86\xb4\0" /* offset 7531 */ "\xe1\x86\xb5\0" /* offset 7535 */ "\xe1\x84\x9a\0" /* offset 7539 */ "\xe1\x84\x86\0" /* offset 7543 */ "\xe1\x84\x87\0" /* offset 7547 */ "\xe1\x84\x88\0" /* offset 7551 */ "\xe1\x84\xa1\0" /* offset 7555 */ "\xe1\x84\x89\0" /* offset 7559 */ "\xe1\x84\x8a\0" /* offset 7563 */ "\xe1\x84\x8b\0" /* offset 7567 */ "\xe1\x84\x8c\0" /* offset 7571 */ "\xe1\x84\x8d\0" /* offset 7575 */ "\xe1\x84\x8e\0" /* offset 7579 */ "\xe1\x84\x8f\0" /* offset 7583 */ "\xe1\x84\x90\0" /* offset 7587 */ "\xe1\x84\x91\0" /* offset 7591 */ "\xe1\x84\x92\0" /* offset 7595 */ "\xe1\x85\xa1\0" /* offset 7599 */ "\xe1\x85\xa2\0" /* offset 7603 */ "\xe1\x85\xa3\0" /* offset 7607 */ "\xe1\x85\xa4\0" /* offset 7611 */ "\xe1\x85\xa5\0" /* offset 7615 */ "\xe1\x85\xa6\0" /* offset 7619 */ "\xe1\x85\xa7\0" /* offset 7623 */ "\xe1\x85\xa8\0" /* offset 7627 */ "\xe1\x85\xa9\0" /* offset 7631 */ "\xe1\x85\xaa\0" /* offset 7635 */ "\xe1\x85\xab\0" /* offset 7639 */ "\xe1\x85\xac\0" /* offset 7643 */ "\xe1\x85\xad\0" /* offset 7647 */ "\xe1\x85\xae\0" /* offset 7651 */ "\xe1\x85\xaf\0" /* offset 7655 */ "\xe1\x85\xb0\0" /* offset 7659 */ "\xe1\x85\xb1\0" /* offset 7663 */ "\xe1\x85\xb2\0" /* offset 7667 */ "\xe1\x85\xb3\0" /* offset 7671 */ "\xe1\x85\xb4\0" /* offset 7675 */ "\xe1\x85\xb5\0" /* offset 7679 */ "\xe1\x85\xa0\0" /* offset 7683 */ "\xe1\x84\x94\0" /* offset 7687 */ "\xe1\x84\x95\0" /* offset 7691 */ "\xe1\x87\x87\0" /* offset 7695 */ "\xe1\x87\x88\0" /* offset 7699 */ "\xe1\x87\x8c\0" /* offset 7703 */ "\xe1\x87\x8e\0" /* offset 7707 */ "\xe1\x87\x93\0" /* offset 7711 */ "\xe1\x87\x97\0" /* offset 7715 */ "\xe1\x87\x99\0" /* offset 7719 */ "\xe1\x84\x9c\0" /* offset 7723 */ "\xe1\x87\x9d\0" /* offset 7727 */ "\xe1\x87\x9f\0" /* offset 7731 */ "\xe1\x84\x9d\0" /* offset 7735 */ "\xe1\x84\x9e\0" /* offset 7739 */ "\xe1\x84\xa0\0" /* offset 7743 */ "\xe1\x84\xa2\0" /* offset 7747 */ "\xe1\x84\xa3\0" /* offset 7751 */ "\xe1\x84\xa7\0" /* offset 7755 */ "\xe1\x84\xa9\0" /* offset 7759 */ "\xe1\x84\xab\0" /* offset 7763 */ "\xe1\x84\xac\0" /* offset 7767 */ "\xe1\x84\xad\0" /* offset 7771 */ "\xe1\x84\xae\0" /* offset 7775 */ "\xe1\x84\xaf\0" /* offset 7779 */ "\xe1\x84\xb2\0" /* offset 7783 */ "\xe1\x84\xb6\0" /* offset 7787 */ "\xe1\x85\x80\0" /* offset 7791 */ "\xe1\x85\x87\0" /* offset 7795 */ "\xe1\x85\x8c\0" /* offset 7799 */ "\xe1\x87\xb1\0" /* offset 7803 */ "\xe1\x87\xb2\0" /* offset 7807 */ "\xe1\x85\x97\0" /* offset 7811 */ "\xe1\x85\x98\0" /* offset 7815 */ "\xe1\x85\x99\0" /* offset 7819 */ "\xe1\x86\x84\0" /* offset 7823 */ "\xe1\x86\x85\0" /* offset 7827 */ "\xe1\x86\x88\0" /* offset 7831 */ "\xe1\x86\x91\0" /* offset 7835 */ "\xe1\x86\x92\0" /* offset 7839 */ "\xe1\x86\x94\0" /* offset 7843 */ "\xe1\x86\x9e\0" /* offset 7847 */ "\xe1\x86\xa1\0" /* offset 7851 */ "\xe4\xb8\x89\0" /* offset 7855 */ "\xe5\x9b\x9b\0" /* offset 7859 */ "\xe4\xb8\x8a\0" /* offset 7863 */ "\xe4\xb8\xad\0" /* offset 7867 */ "\xe4\xb8\x8b\0" /* offset 7871 */ "\xe7\x94\xb2\0" /* offset 7875 */ "\xe4\xb8\x99\0" /* offset 7879 */ "\xe4\xb8\x81\0" /* offset 7883 */ "\xe5\xa4\xa9\0" /* offset 7887 */ "\xe5\x9c\xb0\0" /* offset 7891 */ "\x28\xe1\x84\x80\x29\0" /* offset 7895 */ "\x28\xe1\x84\x82\x29\0" /* offset 7901 */ "\x28\xe1\x84\x83\x29\0" /* offset 7907 */ "\x28\xe1\x84\x85\x29\0" /* offset 7913 */ "\x28\xe1\x84\x86\x29\0" /* offset 7919 */ "\x28\xe1\x84\x87\x29\0" /* offset 7925 */ "\x28\xe1\x84\x89\x29\0" /* offset 7931 */ "\x28\xe1\x84\x8b\x29\0" /* offset 7937 */ "\x28\xe1\x84\x8c\x29\0" /* offset 7943 */ "\x28\xe1\x84\x8e\x29\0" /* offset 7949 */ "\x28\xe1\x84\x8f\x29\0" /* offset 7955 */ "\x28\xe1\x84\x90\x29\0" /* offset 7961 */ "\x28\xe1\x84\x91\x29\0" /* offset 7967 */ "\x28\xe1\x84\x92\x29\0" /* offset 7973 */ "\x28\xe1\x84\x80\xe1\x85\xa1\x29\0" /* offset 7979 */ "\x28\xe1\x84\x82\xe1\x85\xa1\x29\0" /* offset 7988 */ "\x28\xe1\x84\x83\xe1\x85\xa1\x29\0" /* offset 7997 */ "\x28\xe1\x84\x85\xe1\x85\xa1\x29\0" /* offset 8006 */ "\x28\xe1\x84\x86\xe1\x85\xa1\x29\0" /* offset 8015 */ "\x28\xe1\x84\x87\xe1\x85\xa1\x29\0" /* offset 8024 */ "\x28\xe1\x84\x89\xe1\x85\xa1\x29\0" /* offset 8033 */ "\x28\xe1\x84\x8b\xe1\x85\xa1\x29\0" /* offset 8042 */ "\x28\xe1\x84\x8c\xe1\x85\xa1\x29\0" /* offset 8051 */ "\x28\xe1\x84\x8e\xe1\x85\xa1\x29\0" /* offset 8060 */ "\x28\xe1\x84\x8f\xe1\x85\xa1\x29\0" /* offset 8069 */ "\x28\xe1\x84\x90\xe1\x85\xa1\x29\0" /* offset 8078 */ "\x28\xe1\x84\x91\xe1\x85\xa1\x29\0" /* offset 8087 */ "\x28\xe1\x84\x92\xe1\x85\xa1\x29\0" /* offset 8096 */ "\x28\xe1\x84\x8c\xe1\x85\xae\x29\0" /* offset 8105 */ "\x28\xe1\x84\x8b\xe1\x85\xa9\xe1\x84\x8c\xe1\x85\xa5\xe1\x86\xab\x29\0" /* offset 8114 */ "\x28\xe1\x84\x8b\xe1\x85\xa9\xe1\x84\x92\xe1\x85\xae\x29\0" /* offset 8132 */ "\x28\xe4\xb8\x80\x29\0" /* offset 8147 */ "\x28\xe4\xba\x8c\x29\0" /* offset 8153 */ "\x28\xe4\xb8\x89\x29\0" /* offset 8159 */ "\x28\xe5\x9b\x9b\x29\0" /* offset 8165 */ "\x28\xe4\xba\x94\x29\0" /* offset 8171 */ "\x28\xe5\x85\xad\x29\0" /* offset 8177 */ "\x28\xe4\xb8\x83\x29\0" /* offset 8183 */ "\x28\xe5\x85\xab\x29\0" /* offset 8189 */ "\x28\xe4\xb9\x9d\x29\0" /* offset 8195 */ "\x28\xe5\x8d\x81\x29\0" /* offset 8201 */ "\x28\xe6\x9c\x88\x29\0" /* offset 8207 */ "\x28\xe7\x81\xab\x29\0" /* offset 8213 */ "\x28\xe6\xb0\xb4\x29\0" /* offset 8219 */ "\x28\xe6\x9c\xa8\x29\0" /* offset 8225 */ "\x28\xe9\x87\x91\x29\0" /* offset 8231 */ "\x28\xe5\x9c\x9f\x29\0" /* offset 8237 */ "\x28\xe6\x97\xa5\x29\0" /* offset 8243 */ "\x28\xe6\xa0\xaa\x29\0" /* offset 8249 */ "\x28\xe6\x9c\x89\x29\0" /* offset 8255 */ "\x28\xe7\xa4\xbe\x29\0" /* offset 8261 */ "\x28\xe5\x90\x8d\x29\0" /* offset 8267 */ "\x28\xe7\x89\xb9\x29\0" /* offset 8273 */ "\x28\xe8\xb2\xa1\x29\0" /* offset 8279 */ "\x28\xe7\xa5\x9d\x29\0" /* offset 8285 */ "\x28\xe5\x8a\xb4\x29\0" /* offset 8291 */ "\x28\xe4\xbb\xa3\x29\0" /* offset 8297 */ "\x28\xe5\x91\xbc\x29\0" /* offset 8303 */ "\x28\xe5\xad\xa6\x29\0" /* offset 8309 */ "\x28\xe7\x9b\xa3\x29\0" /* offset 8315 */ "\x28\xe4\xbc\x81\x29\0" /* offset 8321 */ "\x28\xe8\xb3\x87\x29\0" /* offset 8327 */ "\x28\xe5\x8d\x94\x29\0" /* offset 8333 */ "\x28\xe7\xa5\xad\x29\0" /* offset 8339 */ "\x28\xe4\xbc\x91\x29\0" /* offset 8345 */ "\x28\xe8\x87\xaa\x29\0" /* offset 8351 */ "\x28\xe8\x87\xb3\x29\0" /* offset 8357 */ "\xe5\x95\x8f\0" /* offset 8363 */ "\xe5\xb9\xbc\0" /* offset 8367 */ "\xe7\xae\x8f\0" /* offset 8371 */ "\x50\x54\x45\0" /* offset 8375 */ "\x32\x31\0" /* offset 8379 */ "\x32\x32\0" /* offset 8382 */ "\x32\x33\0" /* offset 8385 */ "\x32\x34\0" /* offset 8388 */ "\x32\x35\0" /* offset 8391 */ "\x32\x36\0" /* offset 8394 */ "\x32\x37\0" /* offset 8397 */ "\x32\x38\0" /* offset 8400 */ "\x32\x39\0" /* offset 8403 */ "\x33\x30\0" /* offset 8406 */ "\x33\x31\0" /* offset 8409 */ "\x33\x32\0" /* offset 8412 */ "\x33\x33\0" /* offset 8415 */ "\x33\x34\0" /* offset 8418 */ "\x33\x35\0" /* offset 8421 */ "\xe1\x84\x80\xe1\x85\xa1\0" /* offset 8424 */ "\xe1\x84\x82\xe1\x85\xa1\0" /* offset 8431 */ "\xe1\x84\x83\xe1\x85\xa1\0" /* offset 8438 */ "\xe1\x84\x85\xe1\x85\xa1\0" /* offset 8445 */ "\xe1\x84\x86\xe1\x85\xa1\0" /* offset 8452 */ "\xe1\x84\x87\xe1\x85\xa1\0" /* offset 8459 */ "\xe1\x84\x89\xe1\x85\xa1\0" /* offset 8466 */ "\xe1\x84\x8b\xe1\x85\xa1\0" /* offset 8473 */ "\xe1\x84\x8c\xe1\x85\xa1\0" /* offset 8480 */ "\xe1\x84\x8e\xe1\x85\xa1\0" /* offset 8487 */ "\xe1\x84\x8f\xe1\x85\xa1\0" /* offset 8494 */ "\xe1\x84\x90\xe1\x85\xa1\0" /* offset 8501 */ "\xe1\x84\x91\xe1\x85\xa1\0" /* offset 8508 */ "\xe1\x84\x92\xe1\x85\xa1\0" /* offset 8515 */ "\xe1\x84\x8e\xe1\x85\xa1\xe1\x86\xb7\xe1\x84\x80\xe1\x85\xa9\0" /* offset 8522 */ "\xe1\x84\x8c\xe1\x85\xae\xe1\x84\x8b\xe1\x85\xb4\0" /* offset 8538 */ "\xe1\x84\x8b\xe1\x85\xae\0" /* offset 8551 */ "\xe4\xba\x94\0" /* offset 8558 */ "\xe5\x85\xad\0" /* offset 8562 */ "\xe4\xb8\x83\0" /* offset 8566 */ "\xe4\xb9\x9d\0" /* offset 8570 */ "\xe6\xa0\xaa\0" /* offset 8574 */ "\xe6\x9c\x89\0" /* offset 8578 */ "\xe7\xa4\xbe\0" /* offset 8582 */ "\xe5\x90\x8d\0" /* offset 8586 */ "\xe7\x89\xb9\0" /* offset 8590 */ "\xe8\xb2\xa1\0" /* offset 8594 */ "\xe7\xa5\x9d\0" /* offset 8598 */ "\xe5\x8a\xb4\0" /* offset 8602 */ "\xe7\xa7\x98\0" /* offset 8606 */ "\xe7\x94\xb7\0" /* offset 8610 */ "\xe9\x81\xa9\0" /* offset 8614 */ "\xe5\x84\xaa\0" /* offset 8618 */ "\xe5\x8d\xb0\0" /* offset 8622 */ "\xe6\xb3\xa8\0" /* offset 8626 */ "\xe9\xa0\x85\0" /* offset 8630 */ "\xe4\xbc\x91\0" /* offset 8634 */ "\xe5\x86\x99\0" /* offset 8638 */ "\xe6\xad\xa3\0" /* offset 8642 */ "\xe5\xb7\xa6\0" /* offset 8646 */ "\xe5\x8f\xb3\0" /* offset 8650 */ "\xe5\x8c\xbb\0" /* offset 8654 */ "\xe5\xae\x97\0" /* offset 8658 */ "\xe5\xad\xa6\0" /* offset 8662 */ "\xe7\x9b\xa3\0" /* offset 8666 */ "\xe4\xbc\x81\0" /* offset 8670 */ "\xe8\xb3\x87\0" /* offset 8674 */ "\xe5\x8d\x94\0" /* offset 8678 */ "\xe5\xa4\x9c\0" /* offset 8682 */ "\x33\x36\0" /* offset 8686 */ "\x33\x37\0" /* offset 8689 */ "\x33\x38\0" /* offset 8692 */ "\x33\x39\0" /* offset 8695 */ "\x34\x30\0" /* offset 8698 */ "\x34\x31\0" /* offset 8701 */ "\x34\x32\0" /* offset 8704 */ "\x34\x33\0" /* offset 8707 */ "\x34\x34\0" /* offset 8710 */ "\x34\x35\0" /* offset 8713 */ "\x34\x36\0" /* offset 8716 */ "\x34\x37\0" /* offset 8719 */ "\x34\x38\0" /* offset 8722 */ "\x34\x39\0" /* offset 8725 */ "\x35\x30\0" /* offset 8728 */ "\x31\xe6\x9c\x88\0" /* offset 8731 */ "\x32\xe6\x9c\x88\0" /* offset 8736 */ "\x33\xe6\x9c\x88\0" /* offset 8741 */ "\x34\xe6\x9c\x88\0" /* offset 8746 */ "\x35\xe6\x9c\x88\0" /* offset 8751 */ "\x36\xe6\x9c\x88\0" /* offset 8756 */ "\x37\xe6\x9c\x88\0" /* offset 8761 */ "\x38\xe6\x9c\x88\0" /* offset 8766 */ "\x39\xe6\x9c\x88\0" /* offset 8771 */ "\x31\x30\xe6\x9c\x88\0" /* offset 8776 */ "\x31\x31\xe6\x9c\x88\0" /* offset 8782 */ "\x31\x32\xe6\x9c\x88\0" /* offset 8788 */ "\x48\x67\0" /* offset 8794 */ "\x65\x72\x67\0" /* offset 8797 */ "\x65\x56\0" /* offset 8801 */ "\x4c\x54\x44\0" /* offset 8804 */ "\xe3\x82\xa2\0" /* offset 8808 */ "\xe3\x82\xa4\0" /* offset 8812 */ "\xe3\x82\xa6\0" /* offset 8816 */ "\xe3\x82\xa8\0" /* offset 8820 */ "\xe3\x82\xaa\0" /* offset 8824 */ "\xe3\x82\xab\0" /* offset 8828 */ "\xe3\x82\xad\0" /* offset 8832 */ "\xe3\x82\xaf\0" /* offset 8836 */ "\xe3\x82\xb1\0" /* offset 8840 */ "\xe3\x82\xb3\0" /* offset 8844 */ "\xe3\x82\xb5\0" /* offset 8848 */ "\xe3\x82\xb7\0" /* offset 8852 */ "\xe3\x82\xb9\0" /* offset 8856 */ "\xe3\x82\xbb\0" /* offset 8860 */ "\xe3\x82\xbd\0" /* offset 8864 */ "\xe3\x82\xbf\0" /* offset 8868 */ "\xe3\x83\x81\0" /* offset 8872 */ "\xe3\x83\x84\0" /* offset 8876 */ "\xe3\x83\x86\0" /* offset 8880 */ "\xe3\x83\x88\0" /* offset 8884 */ "\xe3\x83\x8a\0" /* offset 8888 */ "\xe3\x83\x8b\0" /* offset 8892 */ "\xe3\x83\x8c\0" /* offset 8896 */ "\xe3\x83\x8d\0" /* offset 8900 */ "\xe3\x83\x8e\0" /* offset 8904 */ "\xe3\x83\x8f\0" /* offset 8908 */ "\xe3\x83\x92\0" /* offset 8912 */ "\xe3\x83\x95\0" /* offset 8916 */ "\xe3\x83\x98\0" /* offset 8920 */ "\xe3\x83\x9b\0" /* offset 8924 */ "\xe3\x83\x9e\0" /* offset 8928 */ "\xe3\x83\x9f\0" /* offset 8932 */ "\xe3\x83\xa0\0" /* offset 8936 */ "\xe3\x83\xa1\0" /* offset 8940 */ "\xe3\x83\xa2\0" /* offset 8944 */ "\xe3\x83\xa4\0" /* offset 8948 */ "\xe3\x83\xa6\0" /* offset 8952 */ "\xe3\x83\xa8\0" /* offset 8956 */ "\xe3\x83\xa9\0" /* offset 8960 */ "\xe3\x83\xaa\0" /* offset 8964 */ "\xe3\x83\xab\0" /* offset 8968 */ "\xe3\x83\xac\0" /* offset 8972 */ "\xe3\x83\xad\0" /* offset 8976 */ "\xe3\x83\xaf\0" /* offset 8980 */ "\xe3\x83\xb0\0" /* offset 8984 */ "\xe3\x83\xb1\0" /* offset 8988 */ "\xe3\x83\xb2\0" /* offset 8992 */ "\xe3\x82\xa2\xe3\x83\x8f\xe3\x82\x9a\xe3\x83\xbc\xe3\x83\x88\0" /* offset 8996 */ "\xe3\x82\xa2\xe3\x83\xab\xe3\x83\x95\xe3\x82\xa1\0" /* offset 9012 */ "\xe3\x82\xa2\xe3\x83\xb3\xe3\x83\x98\xe3\x82\x9a\xe3\x82\xa2\0" /* offset 9025 */ "\xe3\x82\xa2\xe3\x83\xbc\xe3\x83\xab\0" /* offset 9041 */ "\xe3\x82\xa4\xe3\x83\x8b\xe3\x83\xb3\xe3\x82\xaf\xe3\x82\x99\0" /* offset 9051 */ "\xe3\x82\xa4\xe3\x83\xb3\xe3\x83\x81\0" /* offset 9067 */ "\xe3\x82\xa6\xe3\x82\xa9\xe3\x83\xb3\0" /* offset 9077 */ "\xe3\x82\xa8\xe3\x82\xb9\xe3\x82\xaf\xe3\x83\xbc\xe3\x83\x88\xe3\x82\x99\0" /* offset 9087 */ "\xe3\x82\xa8\xe3\x83\xbc\xe3\x82\xab\xe3\x83\xbc\0" /* offset 9106 */ "\xe3\x82\xaa\xe3\x83\xb3\xe3\x82\xb9\0" /* offset 9119 */ "\xe3\x82\xaa\xe3\x83\xbc\xe3\x83\xa0\0" /* offset 9129 */ "\xe3\x82\xab\xe3\x82\xa4\xe3\x83\xaa\0" /* offset 9139 */ "\xe3\x82\xab\xe3\x83\xa9\xe3\x83\x83\xe3\x83\x88\0" /* offset 9149 */ "\xe3\x82\xab\xe3\x83\xad\xe3\x83\xaa\xe3\x83\xbc\0" /* offset 9162 */ "\xe3\x82\xab\xe3\x82\x99\xe3\x83\xad\xe3\x83\xb3\0" /* offset 9175 */ "\xe3\x82\xab\xe3\x82\x99\xe3\x83\xb3\xe3\x83\x9e\0" /* offset 9188 */ "\xe3\x82\xad\xe3\x82\x99\xe3\x82\xab\xe3\x82\x99\0" /* offset 9201 */ "\xe3\x82\xad\xe3\x82\x99\xe3\x83\x8b\xe3\x83\xbc\0" /* offset 9214 */ "\xe3\x82\xad\xe3\x83\xa5\xe3\x83\xaa\xe3\x83\xbc\0" /* offset 9227 */ "\xe3\x82\xad\xe3\x82\x99\xe3\x83\xab\xe3\x82\xbf\xe3\x82\x99\xe3\x83\xbc\0" /* offset 9240 */ "\xe3\x82\xad\xe3\x83\xad\0" /* offset 9259 */ "\xe3\x82\xad\xe3\x83\xad\xe3\x82\xaf\xe3\x82\x99\xe3\x83\xa9\xe3\x83\xa0\0" /* offset 9266 */ "\xe3\x82\xad\xe3\x83\xad\xe3\x83\xa1\xe3\x83\xbc\xe3\x83\x88\xe3\x83\xab\0" /* offset 9285 */ "\xe3\x82\xad\xe3\x83\xad\xe3\x83\xaf\xe3\x83\x83\xe3\x83\x88\0" /* offset 9304 */ "\xe3\x82\xaf\xe3\x82\x99\xe3\x83\xa9\xe3\x83\xa0\0" /* offset 9320 */ "\xe3\x82\xaf\xe3\x82\x99\xe3\x83\xa9\xe3\x83\xa0\xe3\x83\x88\xe3\x83\xb3\0" /* offset 9333 */ "\xe3\x82\xaf\xe3\x83\xab\xe3\x82\xbb\xe3\x82\x99\xe3\x82\xa4\xe3\x83\xad\0" /* offset 9352 */ "\xe3\x82\xaf\xe3\x83\xad\xe3\x83\xbc\xe3\x83\x8d\0" /* offset 9371 */ "\xe3\x82\xb1\xe3\x83\xbc\xe3\x82\xb9\0" /* offset 9384 */ "\xe3\x82\xb3\xe3\x83\xab\xe3\x83\x8a\0" /* offset 9394 */ "\xe3\x82\xb3\xe3\x83\xbc\xe3\x83\x9b\xe3\x82\x9a\0" /* offset 9404 */ "\xe3\x82\xb5\xe3\x82\xa4\xe3\x82\xaf\xe3\x83\xab\0" /* offset 9417 */ "\xe3\x82\xb5\xe3\x83\xb3\xe3\x83\x81\xe3\x83\xbc\xe3\x83\xa0\0" /* offset 9430 */ "\xe3\x82\xb7\xe3\x83\xaa\xe3\x83\xb3\xe3\x82\xaf\xe3\x82\x99\0" /* offset 9446 */ "\xe3\x82\xbb\xe3\x83\xb3\xe3\x83\x81\0" /* offset 9462 */ "\xe3\x82\xbb\xe3\x83\xb3\xe3\x83\x88\0" /* offset 9472 */ "\xe3\x82\xbf\xe3\x82\x99\xe3\x83\xbc\xe3\x82\xb9\0" /* offset 9482 */ "\xe3\x83\x86\xe3\x82\x99\xe3\x82\xb7\0" /* offset 9495 */ "\xe3\x83\x88\xe3\x82\x99\xe3\x83\xab\0" /* offset 9505 */ "\xe3\x83\x88\xe3\x83\xb3\0" /* offset 9515 */ "\xe3\x83\x8a\xe3\x83\x8e\0" /* offset 9522 */ "\xe3\x83\x8e\xe3\x83\x83\xe3\x83\x88\0" /* offset 9529 */ "\xe3\x83\x8f\xe3\x82\xa4\xe3\x83\x84\0" /* offset 9539 */ "\xe3\x83\x8f\xe3\x82\x9a\xe3\x83\xbc\xe3\x82\xbb\xe3\x83\xb3\xe3\x83\x88\0" /* offset 9549 */ "\xe3\x83\x8f\xe3\x82\x9a\xe3\x83\xbc\xe3\x83\x84\0" /* offset 9568 */ "\xe3\x83\x8f\xe3\x82\x99\xe3\x83\xbc\xe3\x83\xac\xe3\x83\xab\0" /* offset 9581 */ "\xe3\x83\x92\xe3\x82\x9a\xe3\x82\xa2\xe3\x82\xb9\xe3\x83\x88\xe3\x83\xab\0" /* offset 9597 */ "\xe3\x83\x92\xe3\x82\x9a\xe3\x82\xaf\xe3\x83\xab\0" /* offset 9616 */ "\xe3\x83\x92\xe3\x82\x9a\xe3\x82\xb3\0" /* offset 9629 */ "\xe3\x83\x92\xe3\x82\x99\xe3\x83\xab\0" /* offset 9639 */ "\xe3\x83\x95\xe3\x82\xa1\xe3\x83\xa9\xe3\x83\x83\xe3\x83\x88\xe3\x82\x99\0" /* offset 9649 */ "\xe3\x83\x95\xe3\x82\xa3\xe3\x83\xbc\xe3\x83\x88\0" /* offset 9668 */ "\xe3\x83\x95\xe3\x82\x99\xe3\x83\x83\xe3\x82\xb7\xe3\x82\xa7\xe3\x83\xab\0" /* offset 9681 */ "\xe3\x83\x95\xe3\x83\xa9\xe3\x83\xb3\0" /* offset 9700 */ "\xe3\x83\x98\xe3\x82\xaf\xe3\x82\xbf\xe3\x83\xbc\xe3\x83\xab\0" /* offset 9710 */ "\xe3\x83\x98\xe3\x82\x9a\xe3\x82\xbd\0" /* offset 9726 */ "\xe3\x83\x98\xe3\x82\x9a\xe3\x83\x8b\xe3\x83\x92\0" /* offset 9736 */ "\xe3\x83\x98\xe3\x83\xab\xe3\x83\x84\0" /* offset 9749 */ "\xe3\x83\x98\xe3\x82\x9a\xe3\x83\xb3\xe3\x82\xb9\0" /* offset 9759 */ "\xe3\x83\x98\xe3\x82\x9a\xe3\x83\xbc\xe3\x82\xb7\xe3\x82\x99\0" /* offset 9772 */ "\xe3\x83\x98\xe3\x82\x99\xe3\x83\xbc\xe3\x82\xbf\0" /* offset 9788 */ "\xe3\x83\x9b\xe3\x82\x9a\xe3\x82\xa4\xe3\x83\xb3\xe3\x83\x88\0" /* offset 9801 */ "\xe3\x83\x9b\xe3\x82\x99\xe3\x83\xab\xe3\x83\x88\0" /* offset 9817 */ "\xe3\x83\x9b\xe3\x83\xb3\0" /* offset 9830 */ "\xe3\x83\x9b\xe3\x82\x9a\xe3\x83\xb3\xe3\x83\x88\xe3\x82\x99\0" /* offset 9837 */ "\xe3\x83\x9b\xe3\x83\xbc\xe3\x83\xab\0" /* offset 9853 */ "\xe3\x83\x9b\xe3\x83\xbc\xe3\x83\xb3\0" /* offset 9863 */ "\xe3\x83\x9e\xe3\x82\xa4\xe3\x82\xaf\xe3\x83\xad\0" /* offset 9873 */ "\xe3\x83\x9e\xe3\x82\xa4\xe3\x83\xab\0" /* offset 9886 */ "\xe3\x83\x9e\xe3\x83\x83\xe3\x83\x8f\0" /* offset 9896 */ "\xe3\x83\x9e\xe3\x83\xab\xe3\x82\xaf\0" /* offset 9906 */ "\xe3\x83\x9e\xe3\x83\xb3\xe3\x82\xb7\xe3\x83\xa7\xe3\x83\xb3\0" /* offset 9916 */ "\xe3\x83\x9f\xe3\x82\xaf\xe3\x83\xad\xe3\x83\xb3\0" /* offset 9932 */ "\xe3\x83\x9f\xe3\x83\xaa\0" /* offset 9945 */ "\xe3\x83\x9f\xe3\x83\xaa\xe3\x83\x8f\xe3\x82\x99\xe3\x83\xbc\xe3\x83\xab\0" /* offset 9952 */ "\xe3\x83\xa1\xe3\x82\xab\xe3\x82\x99\0" /* offset 9971 */ "\xe3\x83\xa1\xe3\x82\xab\xe3\x82\x99\xe3\x83\x88\xe3\x83\xb3\0" /* offset 9981 */ "\xe3\x83\xa1\xe3\x83\xbc\xe3\x83\x88\xe3\x83\xab\0" /* offset 9997 */ "\xe3\x83\xa4\xe3\x83\xbc\xe3\x83\x88\xe3\x82\x99\0" /* offset 10010 */ "\xe3\x83\xa4\xe3\x83\xbc\xe3\x83\xab\0" /* offset 10023 */ "\xe3\x83\xa6\xe3\x82\xa2\xe3\x83\xb3\0" /* offset 10033 */ "\xe3\x83\xaa\xe3\x83\x83\xe3\x83\x88\xe3\x83\xab\0" /* offset 10043 */ "\xe3\x83\xaa\xe3\x83\xa9\0" /* offset 10056 */ "\xe3\x83\xab\xe3\x83\x92\xe3\x82\x9a\xe3\x83\xbc\0" /* offset 10063 */ "\xe3\x83\xab\xe3\x83\xbc\xe3\x83\x95\xe3\x82\x99\xe3\x83\xab\0" /* offset 10076 */ "\xe3\x83\xac\xe3\x83\xa0\0" /* offset 10092 */ "\xe3\x83\xac\xe3\x83\xb3\xe3\x83\x88\xe3\x82\xb1\xe3\x82\x99\xe3\x83\xb3\0" /* offset 10099 */ "\xe3\x83\xaf\xe3\x83\x83\xe3\x83\x88\0" /* offset 10118 */ "\x30\xe7\x82\xb9\0" /* offset 10128 */ "\x31\xe7\x82\xb9\0" /* offset 10133 */ "\x32\xe7\x82\xb9\0" /* offset 10138 */ "\x33\xe7\x82\xb9\0" /* offset 10143 */ "\x34\xe7\x82\xb9\0" /* offset 10148 */ "\x35\xe7\x82\xb9\0" /* offset 10153 */ "\x36\xe7\x82\xb9\0" /* offset 10158 */ "\x37\xe7\x82\xb9\0" /* offset 10163 */ "\x38\xe7\x82\xb9\0" /* offset 10168 */ "\x39\xe7\x82\xb9\0" /* offset 10173 */ "\x31\x30\xe7\x82\xb9\0" /* offset 10178 */ "\x31\x31\xe7\x82\xb9\0" /* offset 10184 */ "\x31\x32\xe7\x82\xb9\0" /* offset 10190 */ "\x31\x33\xe7\x82\xb9\0" /* offset 10196 */ "\x31\x34\xe7\x82\xb9\0" /* offset 10202 */ "\x31\x35\xe7\x82\xb9\0" /* offset 10208 */ "\x31\x36\xe7\x82\xb9\0" /* offset 10214 */ "\x31\x37\xe7\x82\xb9\0" /* offset 10220 */ "\x31\x38\xe7\x82\xb9\0" /* offset 10226 */ "\x31\x39\xe7\x82\xb9\0" /* offset 10232 */ "\x32\x30\xe7\x82\xb9\0" /* offset 10238 */ "\x32\x31\xe7\x82\xb9\0" /* offset 10244 */ "\x32\x32\xe7\x82\xb9\0" /* offset 10250 */ "\x32\x33\xe7\x82\xb9\0" /* offset 10256 */ "\x32\x34\xe7\x82\xb9\0" /* offset 10262 */ "\x68\x50\x61\0" /* offset 10268 */ "\x64\x61\0" /* offset 10272 */ "\x41\x55\0" /* offset 10275 */ "\x62\x61\x72\0" /* offset 10278 */ "\x6f\x56\0" /* offset 10282 */ "\x70\x63\0" /* offset 10285 */ "\x64\x6d\0" /* offset 10288 */ "\x64\x6d\x32\0" /* offset 10291 */ "\x64\x6d\x33\0" /* offset 10295 */ "\x49\x55\0" /* offset 10299 */ "\xe5\xb9\xb3\xe6\x88\x90\0" /* offset 10302 */ "\xe6\x98\xad\xe5\x92\x8c\0" /* offset 10309 */ "\xe5\xa4\xa7\xe6\xad\xa3\0" /* offset 10316 */ "\xe6\x98\x8e\xe6\xb2\xbb\0" /* offset 10323 */ "\xe6\xa0\xaa\xe5\xbc\x8f\xe4\xbc\x9a\xe7\xa4\xbe\0" /* offset 10330 */ "\x70\x41\0" /* offset 10343 */ "\x6e\x41\0" /* offset 10346 */ "\xce\xbc\x41\0" /* offset 10349 */ "\x6d\x41\0" /* offset 10353 */ "\x6b\x41\0" /* offset 10356 */ "\x4b\x42\0" /* offset 10359 */ "\x4d\x42\0" /* offset 10362 */ "\x47\x42\0" /* offset 10365 */ "\x63\x61\x6c\0" /* offset 10368 */ "\x6b\x63\x61\x6c\0" /* offset 10372 */ "\x70\x46\0" /* offset 10377 */ "\x6e\x46\0" /* offset 10380 */ "\xce\xbc\x46\0" /* offset 10383 */ "\xce\xbc\x67\0" /* offset 10387 */ "\x6d\x67\0" /* offset 10391 */ "\x6b\x67\0" /* offset 10394 */ "\x48\x7a\0" /* offset 10397 */ "\x6b\x48\x7a\0" /* offset 10400 */ "\x4d\x48\x7a\0" /* offset 10404 */ "\x47\x48\x7a\0" /* offset 10408 */ "\x54\x48\x7a\0" /* offset 10412 */ "\xce\xbc\x6c\0" /* offset 10416 */ "\x6d\x6c\0" /* offset 10420 */ "\x64\x6c\0" /* offset 10423 */ "\x6b\x6c\0" /* offset 10426 */ "\x66\x6d\0" /* offset 10429 */ "\x6e\x6d\0" /* offset 10432 */ "\xce\xbc\x6d\0" /* offset 10435 */ "\x6d\x6d\0" /* offset 10439 */ "\x63\x6d\0" /* offset 10442 */ "\x6b\x6d\0" /* offset 10445 */ "\x6d\x6d\x32\0" /* offset 10448 */ "\x63\x6d\x32\0" /* offset 10452 */ "\x6d\x32\0" /* offset 10456 */ "\x6b\x6d\x32\0" /* offset 10459 */ "\x6d\x6d\x33\0" /* offset 10463 */ "\x63\x6d\x33\0" /* offset 10467 */ "\x6d\x33\0" /* offset 10471 */ "\x6b\x6d\x33\0" /* offset 10474 */ "\x6d\xe2\x88\x95\x73\0" /* offset 10478 */ "\x6d\xe2\x88\x95\x73\x32\0" /* offset 10484 */ "\x50\x61\0" /* offset 10491 */ "\x6b\x50\x61\0" /* offset 10494 */ "\x4d\x50\x61\0" /* offset 10498 */ "\x47\x50\x61\0" /* offset 10502 */ "\x72\x61\x64\0" /* offset 10506 */ "\x72\x61\x64\xe2\x88\x95\x73\0" /* offset 10510 */ "\x72\x61\x64\xe2\x88\x95\x73\x32\0" /* offset 10518 */ "\x70\x73\0" /* offset 10527 */ "\x6e\x73\0" /* offset 10530 */ "\xce\xbc\x73\0" /* offset 10533 */ "\x6d\x73\0" /* offset 10537 */ "\x70\x56\0" /* offset 10540 */ "\x6e\x56\0" /* offset 10543 */ "\xce\xbc\x56\0" /* offset 10546 */ "\x6d\x56\0" /* offset 10550 */ "\x6b\x56\0" /* offset 10553 */ "\x4d\x56\0" /* offset 10556 */ "\x70\x57\0" /* offset 10559 */ "\x6e\x57\0" /* offset 10562 */ "\xce\xbc\x57\0" /* offset 10565 */ "\x6d\x57\0" /* offset 10569 */ "\x6b\x57\0" /* offset 10572 */ "\x4d\x57\0" /* offset 10575 */ "\x6b\xce\xa9\0" /* offset 10578 */ "\x4d\xce\xa9\0" /* offset 10582 */ "\x61\x2e\x6d\x2e\0" /* offset 10586 */ "\x42\x71\0" /* offset 10591 */ "\x63\x63\0" /* offset 10594 */ "\x63\x64\0" /* offset 10597 */ "\x43\xe2\x88\x95\x6b\x67\0" /* offset 10600 */ "\x43\x6f\x2e\0" /* offset 10607 */ "\x64\x42\0" /* offset 10611 */ "\x47\x79\0" /* offset 10614 */ "\x68\x61\0" /* offset 10617 */ "\x48\x50\0" /* offset 10620 */ "\x69\x6e\0" /* offset 10623 */ "\x4b\x4b\0" /* offset 10626 */ "\x4b\x4d\0" /* offset 10629 */ "\x6b\x74\0" /* offset 10632 */ "\x6c\x6d\0" /* offset 10635 */ "\x6c\x6e\0" /* offset 10638 */ "\x6c\x6f\x67\0" /* offset 10641 */ "\x6c\x78\0" /* offset 10645 */ "\x6d\x62\0" /* offset 10648 */ "\x6d\x69\x6c\0" /* offset 10651 */ "\x6d\x6f\x6c\0" /* offset 10655 */ "\x50\x48\0" /* offset 10659 */ "\x70\x2e\x6d\x2e\0" /* offset 10662 */ "\x50\x50\x4d\0" /* offset 10667 */ "\x50\x52\0" /* offset 10671 */ "\x73\x72\0" /* offset 10674 */ "\x53\x76\0" /* offset 10677 */ "\x57\x62\0" /* offset 10680 */ "\x56\xe2\x88\x95\x6d\0" /* offset 10683 */ "\x41\xe2\x88\x95\x6d\0" /* offset 10689 */ "\x31\xe6\x97\xa5\0" /* offset 10695 */ "\x32\xe6\x97\xa5\0" /* offset 10700 */ "\x33\xe6\x97\xa5\0" /* offset 10705 */ "\x34\xe6\x97\xa5\0" /* offset 10710 */ "\x35\xe6\x97\xa5\0" /* offset 10715 */ "\x36\xe6\x97\xa5\0" /* offset 10720 */ "\x37\xe6\x97\xa5\0" /* offset 10725 */ "\x38\xe6\x97\xa5\0" /* offset 10730 */ "\x39\xe6\x97\xa5\0" /* offset 10735 */ "\x31\x30\xe6\x97\xa5\0" /* offset 10740 */ "\x31\x31\xe6\x97\xa5\0" /* offset 10746 */ "\x31\x32\xe6\x97\xa5\0" /* offset 10752 */ "\x31\x33\xe6\x97\xa5\0" /* offset 10758 */ "\x31\x34\xe6\x97\xa5\0" /* offset 10764 */ "\x31\x35\xe6\x97\xa5\0" /* offset 10770 */ "\x31\x36\xe6\x97\xa5\0" /* offset 10776 */ "\x31\x37\xe6\x97\xa5\0" /* offset 10782 */ "\x31\x38\xe6\x97\xa5\0" /* offset 10788 */ "\x31\x39\xe6\x97\xa5\0" /* offset 10794 */ "\x32\x30\xe6\x97\xa5\0" /* offset 10800 */ "\x32\x31\xe6\x97\xa5\0" /* offset 10806 */ "\x32\x32\xe6\x97\xa5\0" /* offset 10812 */ "\x32\x33\xe6\x97\xa5\0" /* offset 10818 */ "\x32\x34\xe6\x97\xa5\0" /* offset 10824 */ "\x32\x35\xe6\x97\xa5\0" /* offset 10830 */ "\x32\x36\xe6\x97\xa5\0" /* offset 10836 */ "\x32\x37\xe6\x97\xa5\0" /* offset 10842 */ "\x32\x38\xe6\x97\xa5\0" /* offset 10848 */ "\x32\x39\xe6\x97\xa5\0" /* offset 10854 */ "\x33\x30\xe6\x97\xa5\0" /* offset 10860 */ "\x33\x31\xe6\x97\xa5\0" /* offset 10866 */ "\x67\x61\x6c\0" /* offset 10872 */ "\xea\x9d\xaf\0" /* offset 10876 */ "\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 { gunichar ch; gunichar a; gunichar b; } decomposition_step; static const decomposition_step decomp_step_table[] = { { 0x000c0, 0x00041, 0x00300 }, { 0x000c1, 0x00041, 0x00301 }, { 0x000c2, 0x00041, 0x00302 }, { 0x000c3, 0x00041, 0x00303 }, { 0x000c4, 0x00041, 0x00308 }, { 0x000c5, 0x00041, 0x0030a }, { 0x000c7, 0x00043, 0x00327 }, { 0x000c8, 0x00045, 0x00300 }, { 0x000c9, 0x00045, 0x00301 }, { 0x000ca, 0x00045, 0x00302 }, { 0x000cb, 0x00045, 0x00308 }, { 0x000cc, 0x00049, 0x00300 }, { 0x000cd, 0x00049, 0x00301 }, { 0x000ce, 0x00049, 0x00302 }, { 0x000cf, 0x00049, 0x00308 }, { 0x000d1, 0x0004e, 0x00303 }, { 0x000d2, 0x0004f, 0x00300 }, { 0x000d3, 0x0004f, 0x00301 }, { 0x000d4, 0x0004f, 0x00302 }, { 0x000d5, 0x0004f, 0x00303 }, { 0x000d6, 0x0004f, 0x00308 }, { 0x000d9, 0x00055, 0x00300 }, { 0x000da, 0x00055, 0x00301 }, { 0x000db, 0x00055, 0x00302 }, { 0x000dc, 0x00055, 0x00308 }, { 0x000dd, 0x00059, 0x00301 }, { 0x000e0, 0x00061, 0x00300 }, { 0x000e1, 0x00061, 0x00301 }, { 0x000e2, 0x00061, 0x00302 }, { 0x000e3, 0x00061, 0x00303 }, { 0x000e4, 0x00061, 0x00308 }, { 0x000e5, 0x00061, 0x0030a }, { 0x000e7, 0x00063, 0x00327 }, { 0x000e8, 0x00065, 0x00300 }, { 0x000e9, 0x00065, 0x00301 }, { 0x000ea, 0x00065, 0x00302 }, { 0x000eb, 0x00065, 0x00308 }, { 0x000ec, 0x00069, 0x00300 }, { 0x000ed, 0x00069, 0x00301 }, { 0x000ee, 0x00069, 0x00302 }, { 0x000ef, 0x00069, 0x00308 }, { 0x000f1, 0x0006e, 0x00303 }, { 0x000f2, 0x0006f, 0x00300 }, { 0x000f3, 0x0006f, 0x00301 }, { 0x000f4, 0x0006f, 0x00302 }, { 0x000f5, 0x0006f, 0x00303 }, { 0x000f6, 0x0006f, 0x00308 }, { 0x000f9, 0x00075, 0x00300 }, { 0x000fa, 0x00075, 0x00301 }, { 0x000fb, 0x00075, 0x00302 }, { 0x000fc, 0x00075, 0x00308 }, { 0x000fd, 0x00079, 0x00301 }, { 0x000ff, 0x00079, 0x00308 }, { 0x00100, 0x00041, 0x00304 }, { 0x00101, 0x00061, 0x00304 }, { 0x00102, 0x00041, 0x00306 }, { 0x00103, 0x00061, 0x00306 }, { 0x00104, 0x00041, 0x00328 }, { 0x00105, 0x00061, 0x00328 }, { 0x00106, 0x00043, 0x00301 }, { 0x00107, 0x00063, 0x00301 }, { 0x00108, 0x00043, 0x00302 }, { 0x00109, 0x00063, 0x00302 }, { 0x0010a, 0x00043, 0x00307 }, { 0x0010b, 0x00063, 0x00307 }, { 0x0010c, 0x00043, 0x0030c }, { 0x0010d, 0x00063, 0x0030c }, { 0x0010e, 0x00044, 0x0030c }, { 0x0010f, 0x00064, 0x0030c }, { 0x00112, 0x00045, 0x00304 }, { 0x00113, 0x00065, 0x00304 }, { 0x00114, 0x00045, 0x00306 }, { 0x00115, 0x00065, 0x00306 }, { 0x00116, 0x00045, 0x00307 }, { 0x00117, 0x00065, 0x00307 }, { 0x00118, 0x00045, 0x00328 }, { 0x00119, 0x00065, 0x00328 }, { 0x0011a, 0x00045, 0x0030c }, { 0x0011b, 0x00065, 0x0030c }, { 0x0011c, 0x00047, 0x00302 }, { 0x0011d, 0x00067, 0x00302 }, { 0x0011e, 0x00047, 0x00306 }, { 0x0011f, 0x00067, 0x00306 }, { 0x00120, 0x00047, 0x00307 }, { 0x00121, 0x00067, 0x00307 }, { 0x00122, 0x00047, 0x00327 }, { 0x00123, 0x00067, 0x00327 }, { 0x00124, 0x00048, 0x00302 }, { 0x00125, 0x00068, 0x00302 }, { 0x00128, 0x00049, 0x00303 }, { 0x00129, 0x00069, 0x00303 }, { 0x0012a, 0x00049, 0x00304 }, { 0x0012b, 0x00069, 0x00304 }, { 0x0012c, 0x00049, 0x00306 }, { 0x0012d, 0x00069, 0x00306 }, { 0x0012e, 0x00049, 0x00328 }, { 0x0012f, 0x00069, 0x00328 }, { 0x00130, 0x00049, 0x00307 }, { 0x00134, 0x0004a, 0x00302 }, { 0x00135, 0x0006a, 0x00302 }, { 0x00136, 0x0004b, 0x00327 }, { 0x00137, 0x0006b, 0x00327 }, { 0x00139, 0x0004c, 0x00301 }, { 0x0013a, 0x0006c, 0x00301 }, { 0x0013b, 0x0004c, 0x00327 }, { 0x0013c, 0x0006c, 0x00327 }, { 0x0013d, 0x0004c, 0x0030c }, { 0x0013e, 0x0006c, 0x0030c }, { 0x00143, 0x0004e, 0x00301 }, { 0x00144, 0x0006e, 0x00301 }, { 0x00145, 0x0004e, 0x00327 }, { 0x00146, 0x0006e, 0x00327 }, { 0x00147, 0x0004e, 0x0030c }, { 0x00148, 0x0006e, 0x0030c }, { 0x0014c, 0x0004f, 0x00304 }, { 0x0014d, 0x0006f, 0x00304 }, { 0x0014e, 0x0004f, 0x00306 }, { 0x0014f, 0x0006f, 0x00306 }, { 0x00150, 0x0004f, 0x0030b }, { 0x00151, 0x0006f, 0x0030b }, { 0x00154, 0x00052, 0x00301 }, { 0x00155, 0x00072, 0x00301 }, { 0x00156, 0x00052, 0x00327 }, { 0x00157, 0x00072, 0x00327 }, { 0x00158, 0x00052, 0x0030c }, { 0x00159, 0x00072, 0x0030c }, { 0x0015a, 0x00053, 0x00301 }, { 0x0015b, 0x00073, 0x00301 }, { 0x0015c, 0x00053, 0x00302 }, { 0x0015d, 0x00073, 0x00302 }, { 0x0015e, 0x00053, 0x00327 }, { 0x0015f, 0x00073, 0x00327 }, { 0x00160, 0x00053, 0x0030c }, { 0x00161, 0x00073, 0x0030c }, { 0x00162, 0x00054, 0x00327 }, { 0x00163, 0x00074, 0x00327 }, { 0x00164, 0x00054, 0x0030c }, { 0x00165, 0x00074, 0x0030c }, { 0x00168, 0x00055, 0x00303 }, { 0x00169, 0x00075, 0x00303 }, { 0x0016a, 0x00055, 0x00304 }, { 0x0016b, 0x00075, 0x00304 }, { 0x0016c, 0x00055, 0x00306 }, { 0x0016d, 0x00075, 0x00306 }, { 0x0016e, 0x00055, 0x0030a }, { 0x0016f, 0x00075, 0x0030a }, { 0x00170, 0x00055, 0x0030b }, { 0x00171, 0x00075, 0x0030b }, { 0x00172, 0x00055, 0x00328 }, { 0x00173, 0x00075, 0x00328 }, { 0x00174, 0x00057, 0x00302 }, { 0x00175, 0x00077, 0x00302 }, { 0x00176, 0x00059, 0x00302 }, { 0x00177, 0x00079, 0x00302 }, { 0x00178, 0x00059, 0x00308 }, { 0x00179, 0x0005a, 0x00301 }, { 0x0017a, 0x0007a, 0x00301 }, { 0x0017b, 0x0005a, 0x00307 }, { 0x0017c, 0x0007a, 0x00307 }, { 0x0017d, 0x0005a, 0x0030c }, { 0x0017e, 0x0007a, 0x0030c }, { 0x001a0, 0x0004f, 0x0031b }, { 0x001a1, 0x0006f, 0x0031b }, { 0x001af, 0x00055, 0x0031b }, { 0x001b0, 0x00075, 0x0031b }, { 0x001cd, 0x00041, 0x0030c }, { 0x001ce, 0x00061, 0x0030c }, { 0x001cf, 0x00049, 0x0030c }, { 0x001d0, 0x00069, 0x0030c }, { 0x001d1, 0x0004f, 0x0030c }, { 0x001d2, 0x0006f, 0x0030c }, { 0x001d3, 0x00055, 0x0030c }, { 0x001d4, 0x00075, 0x0030c }, { 0x001d5, 0x000dc, 0x00304 }, { 0x001d6, 0x000fc, 0x00304 }, { 0x001d7, 0x000dc, 0x00301 }, { 0x001d8, 0x000fc, 0x00301 }, { 0x001d9, 0x000dc, 0x0030c }, { 0x001da, 0x000fc, 0x0030c }, { 0x001db, 0x000dc, 0x00300 }, { 0x001dc, 0x000fc, 0x00300 }, { 0x001de, 0x000c4, 0x00304 }, { 0x001df, 0x000e4, 0x00304 }, { 0x001e0, 0x00226, 0x00304 }, { 0x001e1, 0x00227, 0x00304 }, { 0x001e2, 0x000c6, 0x00304 }, { 0x001e3, 0x000e6, 0x00304 }, { 0x001e6, 0x00047, 0x0030c }, { 0x001e7, 0x00067, 0x0030c }, { 0x001e8, 0x0004b, 0x0030c }, { 0x001e9, 0x0006b, 0x0030c }, { 0x001ea, 0x0004f, 0x00328 }, { 0x001eb, 0x0006f, 0x00328 }, { 0x001ec, 0x001ea, 0x00304 }, { 0x001ed, 0x001eb, 0x00304 }, { 0x001ee, 0x001b7, 0x0030c }, { 0x001ef, 0x00292, 0x0030c }, { 0x001f0, 0x0006a, 0x0030c }, { 0x001f4, 0x00047, 0x00301 }, { 0x001f5, 0x00067, 0x00301 }, { 0x001f8, 0x0004e, 0x00300 }, { 0x001f9, 0x0006e, 0x00300 }, { 0x001fa, 0x000c5, 0x00301 }, { 0x001fb, 0x000e5, 0x00301 }, { 0x001fc, 0x000c6, 0x00301 }, { 0x001fd, 0x000e6, 0x00301 }, { 0x001fe, 0x000d8, 0x00301 }, { 0x001ff, 0x000f8, 0x00301 }, { 0x00200, 0x00041, 0x0030f }, { 0x00201, 0x00061, 0x0030f }, { 0x00202, 0x00041, 0x00311 }, { 0x00203, 0x00061, 0x00311 }, { 0x00204, 0x00045, 0x0030f }, { 0x00205, 0x00065, 0x0030f }, { 0x00206, 0x00045, 0x00311 }, { 0x00207, 0x00065, 0x00311 }, { 0x00208, 0x00049, 0x0030f }, { 0x00209, 0x00069, 0x0030f }, { 0x0020a, 0x00049, 0x00311 }, { 0x0020b, 0x00069, 0x00311 }, { 0x0020c, 0x0004f, 0x0030f }, { 0x0020d, 0x0006f, 0x0030f }, { 0x0020e, 0x0004f, 0x00311 }, { 0x0020f, 0x0006f, 0x00311 }, { 0x00210, 0x00052, 0x0030f }, { 0x00211, 0x00072, 0x0030f }, { 0x00212, 0x00052, 0x00311 }, { 0x00213, 0x00072, 0x00311 }, { 0x00214, 0x00055, 0x0030f }, { 0x00215, 0x00075, 0x0030f }, { 0x00216, 0x00055, 0x00311 }, { 0x00217, 0x00075, 0x00311 }, { 0x00218, 0x00053, 0x00326 }, { 0x00219, 0x00073, 0x00326 }, { 0x0021a, 0x00054, 0x00326 }, { 0x0021b, 0x00074, 0x00326 }, { 0x0021e, 0x00048, 0x0030c }, { 0x0021f, 0x00068, 0x0030c }, { 0x00226, 0x00041, 0x00307 }, { 0x00227, 0x00061, 0x00307 }, { 0x00228, 0x00045, 0x00327 }, { 0x00229, 0x00065, 0x00327 }, { 0x0022a, 0x000d6, 0x00304 }, { 0x0022b, 0x000f6, 0x00304 }, { 0x0022c, 0x000d5, 0x00304 }, { 0x0022d, 0x000f5, 0x00304 }, { 0x0022e, 0x0004f, 0x00307 }, { 0x0022f, 0x0006f, 0x00307 }, { 0x00230, 0x0022e, 0x00304 }, { 0x00231, 0x0022f, 0x00304 }, { 0x00232, 0x00059, 0x00304 }, { 0x00233, 0x00079, 0x00304 }, { 0x00340, 0x00300, 0x00000 }, { 0x00341, 0x00301, 0x00000 }, { 0x00343, 0x00313, 0x00000 }, { 0x00344, 0x00308, 0x00301 }, { 0x00374, 0x002b9, 0x00000 }, { 0x0037e, 0x0003b, 0x00000 }, { 0x00385, 0x000a8, 0x00301 }, { 0x00386, 0x00391, 0x00301 }, { 0x00387, 0x000b7, 0x00000 }, { 0x00388, 0x00395, 0x00301 }, { 0x00389, 0x00397, 0x00301 }, { 0x0038a, 0x00399, 0x00301 }, { 0x0038c, 0x0039f, 0x00301 }, { 0x0038e, 0x003a5, 0x00301 }, { 0x0038f, 0x003a9, 0x00301 }, { 0x00390, 0x003ca, 0x00301 }, { 0x003aa, 0x00399, 0x00308 }, { 0x003ab, 0x003a5, 0x00308 }, { 0x003ac, 0x003b1, 0x00301 }, { 0x003ad, 0x003b5, 0x00301 }, { 0x003ae, 0x003b7, 0x00301 }, { 0x003af, 0x003b9, 0x00301 }, { 0x003b0, 0x003cb, 0x00301 }, { 0x003ca, 0x003b9, 0x00308 }, { 0x003cb, 0x003c5, 0x00308 }, { 0x003cc, 0x003bf, 0x00301 }, { 0x003cd, 0x003c5, 0x00301 }, { 0x003ce, 0x003c9, 0x00301 }, { 0x003d3, 0x003d2, 0x00301 }, { 0x003d4, 0x003d2, 0x00308 }, { 0x00400, 0x00415, 0x00300 }, { 0x00401, 0x00415, 0x00308 }, { 0x00403, 0x00413, 0x00301 }, { 0x00407, 0x00406, 0x00308 }, { 0x0040c, 0x0041a, 0x00301 }, { 0x0040d, 0x00418, 0x00300 }, { 0x0040e, 0x00423, 0x00306 }, { 0x00419, 0x00418, 0x00306 }, { 0x00439, 0x00438, 0x00306 }, { 0x00450, 0x00435, 0x00300 }, { 0x00451, 0x00435, 0x00308 }, { 0x00453, 0x00433, 0x00301 }, { 0x00457, 0x00456, 0x00308 }, { 0x0045c, 0x0043a, 0x00301 }, { 0x0045d, 0x00438, 0x00300 }, { 0x0045e, 0x00443, 0x00306 }, { 0x00476, 0x00474, 0x0030f }, { 0x00477, 0x00475, 0x0030f }, { 0x004c1, 0x00416, 0x00306 }, { 0x004c2, 0x00436, 0x00306 }, { 0x004d0, 0x00410, 0x00306 }, { 0x004d1, 0x00430, 0x00306 }, { 0x004d2, 0x00410, 0x00308 }, { 0x004d3, 0x00430, 0x00308 }, { 0x004d6, 0x00415, 0x00306 }, { 0x004d7, 0x00435, 0x00306 }, { 0x004da, 0x004d8, 0x00308 }, { 0x004db, 0x004d9, 0x00308 }, { 0x004dc, 0x00416, 0x00308 }, { 0x004dd, 0x00436, 0x00308 }, { 0x004de, 0x00417, 0x00308 }, { 0x004df, 0x00437, 0x00308 }, { 0x004e2, 0x00418, 0x00304 }, { 0x004e3, 0x00438, 0x00304 }, { 0x004e4, 0x00418, 0x00308 }, { 0x004e5, 0x00438, 0x00308 }, { 0x004e6, 0x0041e, 0x00308 }, { 0x004e7, 0x0043e, 0x00308 }, { 0x004ea, 0x004e8, 0x00308 }, { 0x004eb, 0x004e9, 0x00308 }, { 0x004ec, 0x0042d, 0x00308 }, { 0x004ed, 0x0044d, 0x00308 }, { 0x004ee, 0x00423, 0x00304 }, { 0x004ef, 0x00443, 0x00304 }, { 0x004f0, 0x00423, 0x00308 }, { 0x004f1, 0x00443, 0x00308 }, { 0x004f2, 0x00423, 0x0030b }, { 0x004f3, 0x00443, 0x0030b }, { 0x004f4, 0x00427, 0x00308 }, { 0x004f5, 0x00447, 0x00308 }, { 0x004f8, 0x0042b, 0x00308 }, { 0x004f9, 0x0044b, 0x00308 }, { 0x00622, 0x00627, 0x00653 }, { 0x00623, 0x00627, 0x00654 }, { 0x00624, 0x00648, 0x00654 }, { 0x00625, 0x00627, 0x00655 }, { 0x00626, 0x0064a, 0x00654 }, { 0x006c0, 0x006d5, 0x00654 }, { 0x006c2, 0x006c1, 0x00654 }, { 0x006d3, 0x006d2, 0x00654 }, { 0x00929, 0x00928, 0x0093c }, { 0x00931, 0x00930, 0x0093c }, { 0x00934, 0x00933, 0x0093c }, { 0x00958, 0x00915, 0x0093c }, { 0x00959, 0x00916, 0x0093c }, { 0x0095a, 0x00917, 0x0093c }, { 0x0095b, 0x0091c, 0x0093c }, { 0x0095c, 0x00921, 0x0093c }, { 0x0095d, 0x00922, 0x0093c }, { 0x0095e, 0x0092b, 0x0093c }, { 0x0095f, 0x0092f, 0x0093c }, { 0x009cb, 0x009c7, 0x009be }, { 0x009cc, 0x009c7, 0x009d7 }, { 0x009dc, 0x009a1, 0x009bc }, { 0x009dd, 0x009a2, 0x009bc }, { 0x009df, 0x009af, 0x009bc }, { 0x00a33, 0x00a32, 0x00a3c }, { 0x00a36, 0x00a38, 0x00a3c }, { 0x00a59, 0x00a16, 0x00a3c }, { 0x00a5a, 0x00a17, 0x00a3c }, { 0x00a5b, 0x00a1c, 0x00a3c }, { 0x00a5e, 0x00a2b, 0x00a3c }, { 0x00b48, 0x00b47, 0x00b56 }, { 0x00b4b, 0x00b47, 0x00b3e }, { 0x00b4c, 0x00b47, 0x00b57 }, { 0x00b5c, 0x00b21, 0x00b3c }, { 0x00b5d, 0x00b22, 0x00b3c }, { 0x00b94, 0x00b92, 0x00bd7 }, { 0x00bca, 0x00bc6, 0x00bbe }, { 0x00bcb, 0x00bc7, 0x00bbe }, { 0x00bcc, 0x00bc6, 0x00bd7 }, { 0x00c48, 0x00c46, 0x00c56 }, { 0x00cc0, 0x00cbf, 0x00cd5 }, { 0x00cc7, 0x00cc6, 0x00cd5 }, { 0x00cc8, 0x00cc6, 0x00cd6 }, { 0x00cca, 0x00cc6, 0x00cc2 }, { 0x00ccb, 0x00cca, 0x00cd5 }, { 0x00d4a, 0x00d46, 0x00d3e }, { 0x00d4b, 0x00d47, 0x00d3e }, { 0x00d4c, 0x00d46, 0x00d57 }, { 0x00dda, 0x00dd9, 0x00dca }, { 0x00ddc, 0x00dd9, 0x00dcf }, { 0x00ddd, 0x00ddc, 0x00dca }, { 0x00dde, 0x00dd9, 0x00ddf }, { 0x00f43, 0x00f42, 0x00fb7 }, { 0x00f4d, 0x00f4c, 0x00fb7 }, { 0x00f52, 0x00f51, 0x00fb7 }, { 0x00f57, 0x00f56, 0x00fb7 }, { 0x00f5c, 0x00f5b, 0x00fb7 }, { 0x00f69, 0x00f40, 0x00fb5 }, { 0x00f73, 0x00f71, 0x00f72 }, { 0x00f75, 0x00f71, 0x00f74 }, { 0x00f76, 0x00fb2, 0x00f80 }, { 0x00f78, 0x00fb3, 0x00f80 }, { 0x00f81, 0x00f71, 0x00f80 }, { 0x00f93, 0x00f92, 0x00fb7 }, { 0x00f9d, 0x00f9c, 0x00fb7 }, { 0x00fa2, 0x00fa1, 0x00fb7 }, { 0x00fa7, 0x00fa6, 0x00fb7 }, { 0x00fac, 0x00fab, 0x00fb7 }, { 0x00fb9, 0x00f90, 0x00fb5 }, { 0x01026, 0x01025, 0x0102e }, { 0x01b06, 0x01b05, 0x01b35 }, { 0x01b08, 0x01b07, 0x01b35 }, { 0x01b0a, 0x01b09, 0x01b35 }, { 0x01b0c, 0x01b0b, 0x01b35 }, { 0x01b0e, 0x01b0d, 0x01b35 }, { 0x01b12, 0x01b11, 0x01b35 }, { 0x01b3b, 0x01b3a, 0x01b35 }, { 0x01b3d, 0x01b3c, 0x01b35 }, { 0x01b40, 0x01b3e, 0x01b35 }, { 0x01b41, 0x01b3f, 0x01b35 }, { 0x01b43, 0x01b42, 0x01b35 }, { 0x01e00, 0x00041, 0x00325 }, { 0x01e01, 0x00061, 0x00325 }, { 0x01e02, 0x00042, 0x00307 }, { 0x01e03, 0x00062, 0x00307 }, { 0x01e04, 0x00042, 0x00323 }, { 0x01e05, 0x00062, 0x00323 }, { 0x01e06, 0x00042, 0x00331 }, { 0x01e07, 0x00062, 0x00331 }, { 0x01e08, 0x000c7, 0x00301 }, { 0x01e09, 0x000e7, 0x00301 }, { 0x01e0a, 0x00044, 0x00307 }, { 0x01e0b, 0x00064, 0x00307 }, { 0x01e0c, 0x00044, 0x00323 }, { 0x01e0d, 0x00064, 0x00323 }, { 0x01e0e, 0x00044, 0x00331 }, { 0x01e0f, 0x00064, 0x00331 }, { 0x01e10, 0x00044, 0x00327 }, { 0x01e11, 0x00064, 0x00327 }, { 0x01e12, 0x00044, 0x0032d }, { 0x01e13, 0x00064, 0x0032d }, { 0x01e14, 0x00112, 0x00300 }, { 0x01e15, 0x00113, 0x00300 }, { 0x01e16, 0x00112, 0x00301 }, { 0x01e17, 0x00113, 0x00301 }, { 0x01e18, 0x00045, 0x0032d }, { 0x01e19, 0x00065, 0x0032d }, { 0x01e1a, 0x00045, 0x00330 }, { 0x01e1b, 0x00065, 0x00330 }, { 0x01e1c, 0x00228, 0x00306 }, { 0x01e1d, 0x00229, 0x00306 }, { 0x01e1e, 0x00046, 0x00307 }, { 0x01e1f, 0x00066, 0x00307 }, { 0x01e20, 0x00047, 0x00304 }, { 0x01e21, 0x00067, 0x00304 }, { 0x01e22, 0x00048, 0x00307 }, { 0x01e23, 0x00068, 0x00307 }, { 0x01e24, 0x00048, 0x00323 }, { 0x01e25, 0x00068, 0x00323 }, { 0x01e26, 0x00048, 0x00308 }, { 0x01e27, 0x00068, 0x00308 }, { 0x01e28, 0x00048, 0x00327 }, { 0x01e29, 0x00068, 0x00327 }, { 0x01e2a, 0x00048, 0x0032e }, { 0x01e2b, 0x00068, 0x0032e }, { 0x01e2c, 0x00049, 0x00330 }, { 0x01e2d, 0x00069, 0x00330 }, { 0x01e2e, 0x000cf, 0x00301 }, { 0x01e2f, 0x000ef, 0x00301 }, { 0x01e30, 0x0004b, 0x00301 }, { 0x01e31, 0x0006b, 0x00301 }, { 0x01e32, 0x0004b, 0x00323 }, { 0x01e33, 0x0006b, 0x00323 }, { 0x01e34, 0x0004b, 0x00331 }, { 0x01e35, 0x0006b, 0x00331 }, { 0x01e36, 0x0004c, 0x00323 }, { 0x01e37, 0x0006c, 0x00323 }, { 0x01e38, 0x01e36, 0x00304 }, { 0x01e39, 0x01e37, 0x00304 }, { 0x01e3a, 0x0004c, 0x00331 }, { 0x01e3b, 0x0006c, 0x00331 }, { 0x01e3c, 0x0004c, 0x0032d }, { 0x01e3d, 0x0006c, 0x0032d }, { 0x01e3e, 0x0004d, 0x00301 }, { 0x01e3f, 0x0006d, 0x00301 }, { 0x01e40, 0x0004d, 0x00307 }, { 0x01e41, 0x0006d, 0x00307 }, { 0x01e42, 0x0004d, 0x00323 }, { 0x01e43, 0x0006d, 0x00323 }, { 0x01e44, 0x0004e, 0x00307 }, { 0x01e45, 0x0006e, 0x00307 }, { 0x01e46, 0x0004e, 0x00323 }, { 0x01e47, 0x0006e, 0x00323 }, { 0x01e48, 0x0004e, 0x00331 }, { 0x01e49, 0x0006e, 0x00331 }, { 0x01e4a, 0x0004e, 0x0032d }, { 0x01e4b, 0x0006e, 0x0032d }, { 0x01e4c, 0x000d5, 0x00301 }, { 0x01e4d, 0x000f5, 0x00301 }, { 0x01e4e, 0x000d5, 0x00308 }, { 0x01e4f, 0x000f5, 0x00308 }, { 0x01e50, 0x0014c, 0x00300 }, { 0x01e51, 0x0014d, 0x00300 }, { 0x01e52, 0x0014c, 0x00301 }, { 0x01e53, 0x0014d, 0x00301 }, { 0x01e54, 0x00050, 0x00301 }, { 0x01e55, 0x00070, 0x00301 }, { 0x01e56, 0x00050, 0x00307 }, { 0x01e57, 0x00070, 0x00307 }, { 0x01e58, 0x00052, 0x00307 }, { 0x01e59, 0x00072, 0x00307 }, { 0x01e5a, 0x00052, 0x00323 }, { 0x01e5b, 0x00072, 0x00323 }, { 0x01e5c, 0x01e5a, 0x00304 }, { 0x01e5d, 0x01e5b, 0x00304 }, { 0x01e5e, 0x00052, 0x00331 }, { 0x01e5f, 0x00072, 0x00331 }, { 0x01e60, 0x00053, 0x00307 }, { 0x01e61, 0x00073, 0x00307 }, { 0x01e62, 0x00053, 0x00323 }, { 0x01e63, 0x00073, 0x00323 }, { 0x01e64, 0x0015a, 0x00307 }, { 0x01e65, 0x0015b, 0x00307 }, { 0x01e66, 0x00160, 0x00307 }, { 0x01e67, 0x00161, 0x00307 }, { 0x01e68, 0x01e62, 0x00307 }, { 0x01e69, 0x01e63, 0x00307 }, { 0x01e6a, 0x00054, 0x00307 }, { 0x01e6b, 0x00074, 0x00307 }, { 0x01e6c, 0x00054, 0x00323 }, { 0x01e6d, 0x00074, 0x00323 }, { 0x01e6e, 0x00054, 0x00331 }, { 0x01e6f, 0x00074, 0x00331 }, { 0x01e70, 0x00054, 0x0032d }, { 0x01e71, 0x00074, 0x0032d }, { 0x01e72, 0x00055, 0x00324 }, { 0x01e73, 0x00075, 0x00324 }, { 0x01e74, 0x00055, 0x00330 }, { 0x01e75, 0x00075, 0x00330 }, { 0x01e76, 0x00055, 0x0032d }, { 0x01e77, 0x00075, 0x0032d }, { 0x01e78, 0x00168, 0x00301 }, { 0x01e79, 0x00169, 0x00301 }, { 0x01e7a, 0x0016a, 0x00308 }, { 0x01e7b, 0x0016b, 0x00308 }, { 0x01e7c, 0x00056, 0x00303 }, { 0x01e7d, 0x00076, 0x00303 }, { 0x01e7e, 0x00056, 0x00323 }, { 0x01e7f, 0x00076, 0x00323 }, { 0x01e80, 0x00057, 0x00300 }, { 0x01e81, 0x00077, 0x00300 }, { 0x01e82, 0x00057, 0x00301 }, { 0x01e83, 0x00077, 0x00301 }, { 0x01e84, 0x00057, 0x00308 }, { 0x01e85, 0x00077, 0x00308 }, { 0x01e86, 0x00057, 0x00307 }, { 0x01e87, 0x00077, 0x00307 }, { 0x01e88, 0x00057, 0x00323 }, { 0x01e89, 0x00077, 0x00323 }, { 0x01e8a, 0x00058, 0x00307 }, { 0x01e8b, 0x00078, 0x00307 }, { 0x01e8c, 0x00058, 0x00308 }, { 0x01e8d, 0x00078, 0x00308 }, { 0x01e8e, 0x00059, 0x00307 }, { 0x01e8f, 0x00079, 0x00307 }, { 0x01e90, 0x0005a, 0x00302 }, { 0x01e91, 0x0007a, 0x00302 }, { 0x01e92, 0x0005a, 0x00323 }, { 0x01e93, 0x0007a, 0x00323 }, { 0x01e94, 0x0005a, 0x00331 }, { 0x01e95, 0x0007a, 0x00331 }, { 0x01e96, 0x00068, 0x00331 }, { 0x01e97, 0x00074, 0x00308 }, { 0x01e98, 0x00077, 0x0030a }, { 0x01e99, 0x00079, 0x0030a }, { 0x01e9b, 0x0017f, 0x00307 }, { 0x01ea0, 0x00041, 0x00323 }, { 0x01ea1, 0x00061, 0x00323 }, { 0x01ea2, 0x00041, 0x00309 }, { 0x01ea3, 0x00061, 0x00309 }, { 0x01ea4, 0x000c2, 0x00301 }, { 0x01ea5, 0x000e2, 0x00301 }, { 0x01ea6, 0x000c2, 0x00300 }, { 0x01ea7, 0x000e2, 0x00300 }, { 0x01ea8, 0x000c2, 0x00309 }, { 0x01ea9, 0x000e2, 0x00309 }, { 0x01eaa, 0x000c2, 0x00303 }, { 0x01eab, 0x000e2, 0x00303 }, { 0x01eac, 0x01ea0, 0x00302 }, { 0x01ead, 0x01ea1, 0x00302 }, { 0x01eae, 0x00102, 0x00301 }, { 0x01eaf, 0x00103, 0x00301 }, { 0x01eb0, 0x00102, 0x00300 }, { 0x01eb1, 0x00103, 0x00300 }, { 0x01eb2, 0x00102, 0x00309 }, { 0x01eb3, 0x00103, 0x00309 }, { 0x01eb4, 0x00102, 0x00303 }, { 0x01eb5, 0x00103, 0x00303 }, { 0x01eb6, 0x01ea0, 0x00306 }, { 0x01eb7, 0x01ea1, 0x00306 }, { 0x01eb8, 0x00045, 0x00323 }, { 0x01eb9, 0x00065, 0x00323 }, { 0x01eba, 0x00045, 0x00309 }, { 0x01ebb, 0x00065, 0x00309 }, { 0x01ebc, 0x00045, 0x00303 }, { 0x01ebd, 0x00065, 0x00303 }, { 0x01ebe, 0x000ca, 0x00301 }, { 0x01ebf, 0x000ea, 0x00301 }, { 0x01ec0, 0x000ca, 0x00300 }, { 0x01ec1, 0x000ea, 0x00300 }, { 0x01ec2, 0x000ca, 0x00309 }, { 0x01ec3, 0x000ea, 0x00309 }, { 0x01ec4, 0x000ca, 0x00303 }, { 0x01ec5, 0x000ea, 0x00303 }, { 0x01ec6, 0x01eb8, 0x00302 }, { 0x01ec7, 0x01eb9, 0x00302 }, { 0x01ec8, 0x00049, 0x00309 }, { 0x01ec9, 0x00069, 0x00309 }, { 0x01eca, 0x00049, 0x00323 }, { 0x01ecb, 0x00069, 0x00323 }, { 0x01ecc, 0x0004f, 0x00323 }, { 0x01ecd, 0x0006f, 0x00323 }, { 0x01ece, 0x0004f, 0x00309 }, { 0x01ecf, 0x0006f, 0x00309 }, { 0x01ed0, 0x000d4, 0x00301 }, { 0x01ed1, 0x000f4, 0x00301 }, { 0x01ed2, 0x000d4, 0x00300 }, { 0x01ed3, 0x000f4, 0x00300 }, { 0x01ed4, 0x000d4, 0x00309 }, { 0x01ed5, 0x000f4, 0x00309 }, { 0x01ed6, 0x000d4, 0x00303 }, { 0x01ed7, 0x000f4, 0x00303 }, { 0x01ed8, 0x01ecc, 0x00302 }, { 0x01ed9, 0x01ecd, 0x00302 }, { 0x01eda, 0x001a0, 0x00301 }, { 0x01edb, 0x001a1, 0x00301 }, { 0x01edc, 0x001a0, 0x00300 }, { 0x01edd, 0x001a1, 0x00300 }, { 0x01ede, 0x001a0, 0x00309 }, { 0x01edf, 0x001a1, 0x00309 }, { 0x01ee0, 0x001a0, 0x00303 }, { 0x01ee1, 0x001a1, 0x00303 }, { 0x01ee2, 0x001a0, 0x00323 }, { 0x01ee3, 0x001a1, 0x00323 }, { 0x01ee4, 0x00055, 0x00323 }, { 0x01ee5, 0x00075, 0x00323 }, { 0x01ee6, 0x00055, 0x00309 }, { 0x01ee7, 0x00075, 0x00309 }, { 0x01ee8, 0x001af, 0x00301 }, { 0x01ee9, 0x001b0, 0x00301 }, { 0x01eea, 0x001af, 0x00300 }, { 0x01eeb, 0x001b0, 0x00300 }, { 0x01eec, 0x001af, 0x00309 }, { 0x01eed, 0x001b0, 0x00309 }, { 0x01eee, 0x001af, 0x00303 }, { 0x01eef, 0x001b0, 0x00303 }, { 0x01ef0, 0x001af, 0x00323 }, { 0x01ef1, 0x001b0, 0x00323 }, { 0x01ef2, 0x00059, 0x00300 }, { 0x01ef3, 0x00079, 0x00300 }, { 0x01ef4, 0x00059, 0x00323 }, { 0x01ef5, 0x00079, 0x00323 }, { 0x01ef6, 0x00059, 0x00309 }, { 0x01ef7, 0x00079, 0x00309 }, { 0x01ef8, 0x00059, 0x00303 }, { 0x01ef9, 0x00079, 0x00303 }, { 0x01f00, 0x003b1, 0x00313 }, { 0x01f01, 0x003b1, 0x00314 }, { 0x01f02, 0x01f00, 0x00300 }, { 0x01f03, 0x01f01, 0x00300 }, { 0x01f04, 0x01f00, 0x00301 }, { 0x01f05, 0x01f01, 0x00301 }, { 0x01f06, 0x01f00, 0x00342 }, { 0x01f07, 0x01f01, 0x00342 }, { 0x01f08, 0x00391, 0x00313 }, { 0x01f09, 0x00391, 0x00314 }, { 0x01f0a, 0x01f08, 0x00300 }, { 0x01f0b, 0x01f09, 0x00300 }, { 0x01f0c, 0x01f08, 0x00301 }, { 0x01f0d, 0x01f09, 0x00301 }, { 0x01f0e, 0x01f08, 0x00342 }, { 0x01f0f, 0x01f09, 0x00342 }, { 0x01f10, 0x003b5, 0x00313 }, { 0x01f11, 0x003b5, 0x00314 }, { 0x01f12, 0x01f10, 0x00300 }, { 0x01f13, 0x01f11, 0x00300 }, { 0x01f14, 0x01f10, 0x00301 }, { 0x01f15, 0x01f11, 0x00301 }, { 0x01f18, 0x00395, 0x00313 }, { 0x01f19, 0x00395, 0x00314 }, { 0x01f1a, 0x01f18, 0x00300 }, { 0x01f1b, 0x01f19, 0x00300 }, { 0x01f1c, 0x01f18, 0x00301 }, { 0x01f1d, 0x01f19, 0x00301 }, { 0x01f20, 0x003b7, 0x00313 }, { 0x01f21, 0x003b7, 0x00314 }, { 0x01f22, 0x01f20, 0x00300 }, { 0x01f23, 0x01f21, 0x00300 }, { 0x01f24, 0x01f20, 0x00301 }, { 0x01f25, 0x01f21, 0x00301 }, { 0x01f26, 0x01f20, 0x00342 }, { 0x01f27, 0x01f21, 0x00342 }, { 0x01f28, 0x00397, 0x00313 }, { 0x01f29, 0x00397, 0x00314 }, { 0x01f2a, 0x01f28, 0x00300 }, { 0x01f2b, 0x01f29, 0x00300 }, { 0x01f2c, 0x01f28, 0x00301 }, { 0x01f2d, 0x01f29, 0x00301 }, { 0x01f2e, 0x01f28, 0x00342 }, { 0x01f2f, 0x01f29, 0x00342 }, { 0x01f30, 0x003b9, 0x00313 }, { 0x01f31, 0x003b9, 0x00314 }, { 0x01f32, 0x01f30, 0x00300 }, { 0x01f33, 0x01f31, 0x00300 }, { 0x01f34, 0x01f30, 0x00301 }, { 0x01f35, 0x01f31, 0x00301 }, { 0x01f36, 0x01f30, 0x00342 }, { 0x01f37, 0x01f31, 0x00342 }, { 0x01f38, 0x00399, 0x00313 }, { 0x01f39, 0x00399, 0x00314 }, { 0x01f3a, 0x01f38, 0x00300 }, { 0x01f3b, 0x01f39, 0x00300 }, { 0x01f3c, 0x01f38, 0x00301 }, { 0x01f3d, 0x01f39, 0x00301 }, { 0x01f3e, 0x01f38, 0x00342 }, { 0x01f3f, 0x01f39, 0x00342 }, { 0x01f40, 0x003bf, 0x00313 }, { 0x01f41, 0x003bf, 0x00314 }, { 0x01f42, 0x01f40, 0x00300 }, { 0x01f43, 0x01f41, 0x00300 }, { 0x01f44, 0x01f40, 0x00301 }, { 0x01f45, 0x01f41, 0x00301 }, { 0x01f48, 0x0039f, 0x00313 }, { 0x01f49, 0x0039f, 0x00314 }, { 0x01f4a, 0x01f48, 0x00300 }, { 0x01f4b, 0x01f49, 0x00300 }, { 0x01f4c, 0x01f48, 0x00301 }, { 0x01f4d, 0x01f49, 0x00301 }, { 0x01f50, 0x003c5, 0x00313 }, { 0x01f51, 0x003c5, 0x00314 }, { 0x01f52, 0x01f50, 0x00300 }, { 0x01f53, 0x01f51, 0x00300 }, { 0x01f54, 0x01f50, 0x00301 }, { 0x01f55, 0x01f51, 0x00301 }, { 0x01f56, 0x01f50, 0x00342 }, { 0x01f57, 0x01f51, 0x00342 }, { 0x01f59, 0x003a5, 0x00314 }, { 0x01f5b, 0x01f59, 0x00300 }, { 0x01f5d, 0x01f59, 0x00301 }, { 0x01f5f, 0x01f59, 0x00342 }, { 0x01f60, 0x003c9, 0x00313 }, { 0x01f61, 0x003c9, 0x00314 }, { 0x01f62, 0x01f60, 0x00300 }, { 0x01f63, 0x01f61, 0x00300 }, { 0x01f64, 0x01f60, 0x00301 }, { 0x01f65, 0x01f61, 0x00301 }, { 0x01f66, 0x01f60, 0x00342 }, { 0x01f67, 0x01f61, 0x00342 }, { 0x01f68, 0x003a9, 0x00313 }, { 0x01f69, 0x003a9, 0x00314 }, { 0x01f6a, 0x01f68, 0x00300 }, { 0x01f6b, 0x01f69, 0x00300 }, { 0x01f6c, 0x01f68, 0x00301 }, { 0x01f6d, 0x01f69, 0x00301 }, { 0x01f6e, 0x01f68, 0x00342 }, { 0x01f6f, 0x01f69, 0x00342 }, { 0x01f70, 0x003b1, 0x00300 }, { 0x01f71, 0x003ac, 0x00000 }, { 0x01f72, 0x003b5, 0x00300 }, { 0x01f73, 0x003ad, 0x00000 }, { 0x01f74, 0x003b7, 0x00300 }, { 0x01f75, 0x003ae, 0x00000 }, { 0x01f76, 0x003b9, 0x00300 }, { 0x01f77, 0x003af, 0x00000 }, { 0x01f78, 0x003bf, 0x00300 }, { 0x01f79, 0x003cc, 0x00000 }, { 0x01f7a, 0x003c5, 0x00300 }, { 0x01f7b, 0x003cd, 0x00000 }, { 0x01f7c, 0x003c9, 0x00300 }, { 0x01f7d, 0x003ce, 0x00000 }, { 0x01f80, 0x01f00, 0x00345 }, { 0x01f81, 0x01f01, 0x00345 }, { 0x01f82, 0x01f02, 0x00345 }, { 0x01f83, 0x01f03, 0x00345 }, { 0x01f84, 0x01f04, 0x00345 }, { 0x01f85, 0x01f05, 0x00345 }, { 0x01f86, 0x01f06, 0x00345 }, { 0x01f87, 0x01f07, 0x00345 }, { 0x01f88, 0x01f08, 0x00345 }, { 0x01f89, 0x01f09, 0x00345 }, { 0x01f8a, 0x01f0a, 0x00345 }, { 0x01f8b, 0x01f0b, 0x00345 }, { 0x01f8c, 0x01f0c, 0x00345 }, { 0x01f8d, 0x01f0d, 0x00345 }, { 0x01f8e, 0x01f0e, 0x00345 }, { 0x01f8f, 0x01f0f, 0x00345 }, { 0x01f90, 0x01f20, 0x00345 }, { 0x01f91, 0x01f21, 0x00345 }, { 0x01f92, 0x01f22, 0x00345 }, { 0x01f93, 0x01f23, 0x00345 }, { 0x01f94, 0x01f24, 0x00345 }, { 0x01f95, 0x01f25, 0x00345 }, { 0x01f96, 0x01f26, 0x00345 }, { 0x01f97, 0x01f27, 0x00345 }, { 0x01f98, 0x01f28, 0x00345 }, { 0x01f99, 0x01f29, 0x00345 }, { 0x01f9a, 0x01f2a, 0x00345 }, { 0x01f9b, 0x01f2b, 0x00345 }, { 0x01f9c, 0x01f2c, 0x00345 }, { 0x01f9d, 0x01f2d, 0x00345 }, { 0x01f9e, 0x01f2e, 0x00345 }, { 0x01f9f, 0x01f2f, 0x00345 }, { 0x01fa0, 0x01f60, 0x00345 }, { 0x01fa1, 0x01f61, 0x00345 }, { 0x01fa2, 0x01f62, 0x00345 }, { 0x01fa3, 0x01f63, 0x00345 }, { 0x01fa4, 0x01f64, 0x00345 }, { 0x01fa5, 0x01f65, 0x00345 }, { 0x01fa6, 0x01f66, 0x00345 }, { 0x01fa7, 0x01f67, 0x00345 }, { 0x01fa8, 0x01f68, 0x00345 }, { 0x01fa9, 0x01f69, 0x00345 }, { 0x01faa, 0x01f6a, 0x00345 }, { 0x01fab, 0x01f6b, 0x00345 }, { 0x01fac, 0x01f6c, 0x00345 }, { 0x01fad, 0x01f6d, 0x00345 }, { 0x01fae, 0x01f6e, 0x00345 }, { 0x01faf, 0x01f6f, 0x00345 }, { 0x01fb0, 0x003b1, 0x00306 }, { 0x01fb1, 0x003b1, 0x00304 }, { 0x01fb2, 0x01f70, 0x00345 }, { 0x01fb3, 0x003b1, 0x00345 }, { 0x01fb4, 0x003ac, 0x00345 }, { 0x01fb6, 0x003b1, 0x00342 }, { 0x01fb7, 0x01fb6, 0x00345 }, { 0x01fb8, 0x00391, 0x00306 }, { 0x01fb9, 0x00391, 0x00304 }, { 0x01fba, 0x00391, 0x00300 }, { 0x01fbb, 0x00386, 0x00000 }, { 0x01fbc, 0x00391, 0x00345 }, { 0x01fbe, 0x003b9, 0x00000 }, { 0x01fc1, 0x000a8, 0x00342 }, { 0x01fc2, 0x01f74, 0x00345 }, { 0x01fc3, 0x003b7, 0x00345 }, { 0x01fc4, 0x003ae, 0x00345 }, { 0x01fc6, 0x003b7, 0x00342 }, { 0x01fc7, 0x01fc6, 0x00345 }, { 0x01fc8, 0x00395, 0x00300 }, { 0x01fc9, 0x00388, 0x00000 }, { 0x01fca, 0x00397, 0x00300 }, { 0x01fcb, 0x00389, 0x00000 }, { 0x01fcc, 0x00397, 0x00345 }, { 0x01fcd, 0x01fbf, 0x00300 }, { 0x01fce, 0x01fbf, 0x00301 }, { 0x01fcf, 0x01fbf, 0x00342 }, { 0x01fd0, 0x003b9, 0x00306 }, { 0x01fd1, 0x003b9, 0x00304 }, { 0x01fd2, 0x003ca, 0x00300 }, { 0x01fd3, 0x00390, 0x00000 }, { 0x01fd6, 0x003b9, 0x00342 }, { 0x01fd7, 0x003ca, 0x00342 }, { 0x01fd8, 0x00399, 0x00306 }, { 0x01fd9, 0x00399, 0x00304 }, { 0x01fda, 0x00399, 0x00300 }, { 0x01fdb, 0x0038a, 0x00000 }, { 0x01fdd, 0x01ffe, 0x00300 }, { 0x01fde, 0x01ffe, 0x00301 }, { 0x01fdf, 0x01ffe, 0x00342 }, { 0x01fe0, 0x003c5, 0x00306 }, { 0x01fe1, 0x003c5, 0x00304 }, { 0x01fe2, 0x003cb, 0x00300 }, { 0x01fe3, 0x003b0, 0x00000 }, { 0x01fe4, 0x003c1, 0x00313 }, { 0x01fe5, 0x003c1, 0x00314 }, { 0x01fe6, 0x003c5, 0x00342 }, { 0x01fe7, 0x003cb, 0x00342 }, { 0x01fe8, 0x003a5, 0x00306 }, { 0x01fe9, 0x003a5, 0x00304 }, { 0x01fea, 0x003a5, 0x00300 }, { 0x01feb, 0x0038e, 0x00000 }, { 0x01fec, 0x003a1, 0x00314 }, { 0x01fed, 0x000a8, 0x00300 }, { 0x01fee, 0x00385, 0x00000 }, { 0x01fef, 0x00060, 0x00000 }, { 0x01ff2, 0x01f7c, 0x00345 }, { 0x01ff3, 0x003c9, 0x00345 }, { 0x01ff4, 0x003ce, 0x00345 }, { 0x01ff6, 0x003c9, 0x00342 }, { 0x01ff7, 0x01ff6, 0x00345 }, { 0x01ff8, 0x0039f, 0x00300 }, { 0x01ff9, 0x0038c, 0x00000 }, { 0x01ffa, 0x003a9, 0x00300 }, { 0x01ffb, 0x0038f, 0x00000 }, { 0x01ffc, 0x003a9, 0x00345 }, { 0x01ffd, 0x000b4, 0x00000 }, { 0x02000, 0x02002, 0x00000 }, { 0x02001, 0x02003, 0x00000 }, { 0x02126, 0x003a9, 0x00000 }, { 0x0212a, 0x0004b, 0x00000 }, { 0x0212b, 0x000c5, 0x00000 }, { 0x0219a, 0x02190, 0x00338 }, { 0x0219b, 0x02192, 0x00338 }, { 0x021ae, 0x02194, 0x00338 }, { 0x021cd, 0x021d0, 0x00338 }, { 0x021ce, 0x021d4, 0x00338 }, { 0x021cf, 0x021d2, 0x00338 }, { 0x02204, 0x02203, 0x00338 }, { 0x02209, 0x02208, 0x00338 }, { 0x0220c, 0x0220b, 0x00338 }, { 0x02224, 0x02223, 0x00338 }, { 0x02226, 0x02225, 0x00338 }, { 0x02241, 0x0223c, 0x00338 }, { 0x02244, 0x02243, 0x00338 }, { 0x02247, 0x02245, 0x00338 }, { 0x02249, 0x02248, 0x00338 }, { 0x02260, 0x0003d, 0x00338 }, { 0x02262, 0x02261, 0x00338 }, { 0x0226d, 0x0224d, 0x00338 }, { 0x0226e, 0x0003c, 0x00338 }, { 0x0226f, 0x0003e, 0x00338 }, { 0x02270, 0x02264, 0x00338 }, { 0x02271, 0x02265, 0x00338 }, { 0x02274, 0x02272, 0x00338 }, { 0x02275, 0x02273, 0x00338 }, { 0x02278, 0x02276, 0x00338 }, { 0x02279, 0x02277, 0x00338 }, { 0x02280, 0x0227a, 0x00338 }, { 0x02281, 0x0227b, 0x00338 }, { 0x02284, 0x02282, 0x00338 }, { 0x02285, 0x02283, 0x00338 }, { 0x02288, 0x02286, 0x00338 }, { 0x02289, 0x02287, 0x00338 }, { 0x022ac, 0x022a2, 0x00338 }, { 0x022ad, 0x022a8, 0x00338 }, { 0x022ae, 0x022a9, 0x00338 }, { 0x022af, 0x022ab, 0x00338 }, { 0x022e0, 0x0227c, 0x00338 }, { 0x022e1, 0x0227d, 0x00338 }, { 0x022e2, 0x02291, 0x00338 }, { 0x022e3, 0x02292, 0x00338 }, { 0x022ea, 0x022b2, 0x00338 }, { 0x022eb, 0x022b3, 0x00338 }, { 0x022ec, 0x022b4, 0x00338 }, { 0x022ed, 0x022b5, 0x00338 }, { 0x02329, 0x03008, 0x00000 }, { 0x0232a, 0x03009, 0x00000 }, { 0x02adc, 0x02add, 0x00338 }, { 0x0304c, 0x0304b, 0x03099 }, { 0x0304e, 0x0304d, 0x03099 }, { 0x03050, 0x0304f, 0x03099 }, { 0x03052, 0x03051, 0x03099 }, { 0x03054, 0x03053, 0x03099 }, { 0x03056, 0x03055, 0x03099 }, { 0x03058, 0x03057, 0x03099 }, { 0x0305a, 0x03059, 0x03099 }, { 0x0305c, 0x0305b, 0x03099 }, { 0x0305e, 0x0305d, 0x03099 }, { 0x03060, 0x0305f, 0x03099 }, { 0x03062, 0x03061, 0x03099 }, { 0x03065, 0x03064, 0x03099 }, { 0x03067, 0x03066, 0x03099 }, { 0x03069, 0x03068, 0x03099 }, { 0x03070, 0x0306f, 0x03099 }, { 0x03071, 0x0306f, 0x0309a }, { 0x03073, 0x03072, 0x03099 }, { 0x03074, 0x03072, 0x0309a }, { 0x03076, 0x03075, 0x03099 }, { 0x03077, 0x03075, 0x0309a }, { 0x03079, 0x03078, 0x03099 }, { 0x0307a, 0x03078, 0x0309a }, { 0x0307c, 0x0307b, 0x03099 }, { 0x0307d, 0x0307b, 0x0309a }, { 0x03094, 0x03046, 0x03099 }, { 0x0309e, 0x0309d, 0x03099 }, { 0x030ac, 0x030ab, 0x03099 }, { 0x030ae, 0x030ad, 0x03099 }, { 0x030b0, 0x030af, 0x03099 }, { 0x030b2, 0x030b1, 0x03099 }, { 0x030b4, 0x030b3, 0x03099 }, { 0x030b6, 0x030b5, 0x03099 }, { 0x030b8, 0x030b7, 0x03099 }, { 0x030ba, 0x030b9, 0x03099 }, { 0x030bc, 0x030bb, 0x03099 }, { 0x030be, 0x030bd, 0x03099 }, { 0x030c0, 0x030bf, 0x03099 }, { 0x030c2, 0x030c1, 0x03099 }, { 0x030c5, 0x030c4, 0x03099 }, { 0x030c7, 0x030c6, 0x03099 }, { 0x030c9, 0x030c8, 0x03099 }, { 0x030d0, 0x030cf, 0x03099 }, { 0x030d1, 0x030cf, 0x0309a }, { 0x030d3, 0x030d2, 0x03099 }, { 0x030d4, 0x030d2, 0x0309a }, { 0x030d6, 0x030d5, 0x03099 }, { 0x030d7, 0x030d5, 0x0309a }, { 0x030d9, 0x030d8, 0x03099 }, { 0x030da, 0x030d8, 0x0309a }, { 0x030dc, 0x030db, 0x03099 }, { 0x030dd, 0x030db, 0x0309a }, { 0x030f4, 0x030a6, 0x03099 }, { 0x030f7, 0x030ef, 0x03099 }, { 0x030f8, 0x030f0, 0x03099 }, { 0x030f9, 0x030f1, 0x03099 }, { 0x030fa, 0x030f2, 0x03099 }, { 0x030fe, 0x030fd, 0x03099 }, { 0x0f900, 0x08c48, 0x00000 }, { 0x0f901, 0x066f4, 0x00000 }, { 0x0f902, 0x08eca, 0x00000 }, { 0x0f903, 0x08cc8, 0x00000 }, { 0x0f904, 0x06ed1, 0x00000 }, { 0x0f905, 0x04e32, 0x00000 }, { 0x0f906, 0x053e5, 0x00000 }, { 0x0f907, 0x09f9c, 0x00000 }, { 0x0f908, 0x09f9c, 0x00000 }, { 0x0f909, 0x05951, 0x00000 }, { 0x0f90a, 0x091d1, 0x00000 }, { 0x0f90b, 0x05587, 0x00000 }, { 0x0f90c, 0x05948, 0x00000 }, { 0x0f90d, 0x061f6, 0x00000 }, { 0x0f90e, 0x07669, 0x00000 }, { 0x0f90f, 0x07f85, 0x00000 }, { 0x0f910, 0x0863f, 0x00000 }, { 0x0f911, 0x087ba, 0x00000 }, { 0x0f912, 0x088f8, 0x00000 }, { 0x0f913, 0x0908f, 0x00000 }, { 0x0f914, 0x06a02, 0x00000 }, { 0x0f915, 0x06d1b, 0x00000 }, { 0x0f916, 0x070d9, 0x00000 }, { 0x0f917, 0x073de, 0x00000 }, { 0x0f918, 0x0843d, 0x00000 }, { 0x0f919, 0x0916a, 0x00000 }, { 0x0f91a, 0x099f1, 0x00000 }, { 0x0f91b, 0x04e82, 0x00000 }, { 0x0f91c, 0x05375, 0x00000 }, { 0x0f91d, 0x06b04, 0x00000 }, { 0x0f91e, 0x0721b, 0x00000 }, { 0x0f91f, 0x0862d, 0x00000 }, { 0x0f920, 0x09e1e, 0x00000 }, { 0x0f921, 0x05d50, 0x00000 }, { 0x0f922, 0x06feb, 0x00000 }, { 0x0f923, 0x085cd, 0x00000 }, { 0x0f924, 0x08964, 0x00000 }, { 0x0f925, 0x062c9, 0x00000 }, { 0x0f926, 0x081d8, 0x00000 }, { 0x0f927, 0x0881f, 0x00000 }, { 0x0f928, 0x05eca, 0x00000 }, { 0x0f929, 0x06717, 0x00000 }, { 0x0f92a, 0x06d6a, 0x00000 }, { 0x0f92b, 0x072fc, 0x00000 }, { 0x0f92c, 0x090ce, 0x00000 }, { 0x0f92d, 0x04f86, 0x00000 }, { 0x0f92e, 0x051b7, 0x00000 }, { 0x0f92f, 0x052de, 0x00000 }, { 0x0f930, 0x064c4, 0x00000 }, { 0x0f931, 0x06ad3, 0x00000 }, { 0x0f932, 0x07210, 0x00000 }, { 0x0f933, 0x076e7, 0x00000 }, { 0x0f934, 0x08001, 0x00000 }, { 0x0f935, 0x08606, 0x00000 }, { 0x0f936, 0x0865c, 0x00000 }, { 0x0f937, 0x08def, 0x00000 }, { 0x0f938, 0x09732, 0x00000 }, { 0x0f939, 0x09b6f, 0x00000 }, { 0x0f93a, 0x09dfa, 0x00000 }, { 0x0f93b, 0x0788c, 0x00000 }, { 0x0f93c, 0x0797f, 0x00000 }, { 0x0f93d, 0x07da0, 0x00000 }, { 0x0f93e, 0x083c9, 0x00000 }, { 0x0f93f, 0x09304, 0x00000 }, { 0x0f940, 0x09e7f, 0x00000 }, { 0x0f941, 0x08ad6, 0x00000 }, { 0x0f942, 0x058df, 0x00000 }, { 0x0f943, 0x05f04, 0x00000 }, { 0x0f944, 0x07c60, 0x00000 }, { 0x0f945, 0x0807e, 0x00000 }, { 0x0f946, 0x07262, 0x00000 }, { 0x0f947, 0x078ca, 0x00000 }, { 0x0f948, 0x08cc2, 0x00000 }, { 0x0f949, 0x096f7, 0x00000 }, { 0x0f94a, 0x058d8, 0x00000 }, { 0x0f94b, 0x05c62, 0x00000 }, { 0x0f94c, 0x06a13, 0x00000 }, { 0x0f94d, 0x06dda, 0x00000 }, { 0x0f94e, 0x06f0f, 0x00000 }, { 0x0f94f, 0x07d2f, 0x00000 }, { 0x0f950, 0x07e37, 0x00000 }, { 0x0f951, 0x0964b, 0x00000 }, { 0x0f952, 0x052d2, 0x00000 }, { 0x0f953, 0x0808b, 0x00000 }, { 0x0f954, 0x051dc, 0x00000 }, { 0x0f955, 0x051cc, 0x00000 }, { 0x0f956, 0x07a1c, 0x00000 }, { 0x0f957, 0x07dbe, 0x00000 }, { 0x0f958, 0x083f1, 0x00000 }, { 0x0f959, 0x09675, 0x00000 }, { 0x0f95a, 0x08b80, 0x00000 }, { 0x0f95b, 0x062cf, 0x00000 }, { 0x0f95c, 0x06a02, 0x00000 }, { 0x0f95d, 0x08afe, 0x00000 }, { 0x0f95e, 0x04e39, 0x00000 }, { 0x0f95f, 0x05be7, 0x00000 }, { 0x0f960, 0x06012, 0x00000 }, { 0x0f961, 0x07387, 0x00000 }, { 0x0f962, 0x07570, 0x00000 }, { 0x0f963, 0x05317, 0x00000 }, { 0x0f964, 0x078fb, 0x00000 }, { 0x0f965, 0x04fbf, 0x00000 }, { 0x0f966, 0x05fa9, 0x00000 }, { 0x0f967, 0x04e0d, 0x00000 }, { 0x0f968, 0x06ccc, 0x00000 }, { 0x0f969, 0x06578, 0x00000 }, { 0x0f96a, 0x07d22, 0x00000 }, { 0x0f96b, 0x053c3, 0x00000 }, { 0x0f96c, 0x0585e, 0x00000 }, { 0x0f96d, 0x07701, 0x00000 }, { 0x0f96e, 0x08449, 0x00000 }, { 0x0f96f, 0x08aaa, 0x00000 }, { 0x0f970, 0x06bba, 0x00000 }, { 0x0f971, 0x08fb0, 0x00000 }, { 0x0f972, 0x06c88, 0x00000 }, { 0x0f973, 0x062fe, 0x00000 }, { 0x0f974, 0x082e5, 0x00000 }, { 0x0f975, 0x063a0, 0x00000 }, { 0x0f976, 0x07565, 0x00000 }, { 0x0f977, 0x04eae, 0x00000 }, { 0x0f978, 0x05169, 0x00000 }, { 0x0f979, 0x051c9, 0x00000 }, { 0x0f97a, 0x06881, 0x00000 }, { 0x0f97b, 0x07ce7, 0x00000 }, { 0x0f97c, 0x0826f, 0x00000 }, { 0x0f97d, 0x08ad2, 0x00000 }, { 0x0f97e, 0x091cf, 0x00000 }, { 0x0f97f, 0x052f5, 0x00000 }, { 0x0f980, 0x05442, 0x00000 }, { 0x0f981, 0x05973, 0x00000 }, { 0x0f982, 0x05eec, 0x00000 }, { 0x0f983, 0x065c5, 0x00000 }, { 0x0f984, 0x06ffe, 0x00000 }, { 0x0f985, 0x0792a, 0x00000 }, { 0x0f986, 0x095ad, 0x00000 }, { 0x0f987, 0x09a6a, 0x00000 }, { 0x0f988, 0x09e97, 0x00000 }, { 0x0f989, 0x09ece, 0x00000 }, { 0x0f98a, 0x0529b, 0x00000 }, { 0x0f98b, 0x066c6, 0x00000 }, { 0x0f98c, 0x06b77, 0x00000 }, { 0x0f98d, 0x08f62, 0x00000 }, { 0x0f98e, 0x05e74, 0x00000 }, { 0x0f98f, 0x06190, 0x00000 }, { 0x0f990, 0x06200, 0x00000 }, { 0x0f991, 0x0649a, 0x00000 }, { 0x0f992, 0x06f23, 0x00000 }, { 0x0f993, 0x07149, 0x00000 }, { 0x0f994, 0x07489, 0x00000 }, { 0x0f995, 0x079ca, 0x00000 }, { 0x0f996, 0x07df4, 0x00000 }, { 0x0f997, 0x0806f, 0x00000 }, { 0x0f998, 0x08f26, 0x00000 }, { 0x0f999, 0x084ee, 0x00000 }, { 0x0f99a, 0x09023, 0x00000 }, { 0x0f99b, 0x0934a, 0x00000 }, { 0x0f99c, 0x05217, 0x00000 }, { 0x0f99d, 0x052a3, 0x00000 }, { 0x0f99e, 0x054bd, 0x00000 }, { 0x0f99f, 0x070c8, 0x00000 }, { 0x0f9a0, 0x088c2, 0x00000 }, { 0x0f9a1, 0x08aaa, 0x00000 }, { 0x0f9a2, 0x05ec9, 0x00000 }, { 0x0f9a3, 0x05ff5, 0x00000 }, { 0x0f9a4, 0x0637b, 0x00000 }, { 0x0f9a5, 0x06bae, 0x00000 }, { 0x0f9a6, 0x07c3e, 0x00000 }, { 0x0f9a7, 0x07375, 0x00000 }, { 0x0f9a8, 0x04ee4, 0x00000 }, { 0x0f9a9, 0x056f9, 0x00000 }, { 0x0f9aa, 0x05be7, 0x00000 }, { 0x0f9ab, 0x05dba, 0x00000 }, { 0x0f9ac, 0x0601c, 0x00000 }, { 0x0f9ad, 0x073b2, 0x00000 }, { 0x0f9ae, 0x07469, 0x00000 }, { 0x0f9af, 0x07f9a, 0x00000 }, { 0x0f9b0, 0x08046, 0x00000 }, { 0x0f9b1, 0x09234, 0x00000 }, { 0x0f9b2, 0x096f6, 0x00000 }, { 0x0f9b3, 0x09748, 0x00000 }, { 0x0f9b4, 0x09818, 0x00000 }, { 0x0f9b5, 0x04f8b, 0x00000 }, { 0x0f9b6, 0x079ae, 0x00000 }, { 0x0f9b7, 0x091b4, 0x00000 }, { 0x0f9b8, 0x096b8, 0x00000 }, { 0x0f9b9, 0x060e1, 0x00000 }, { 0x0f9ba, 0x04e86, 0x00000 }, { 0x0f9bb, 0x050da, 0x00000 }, { 0x0f9bc, 0x05bee, 0x00000 }, { 0x0f9bd, 0x05c3f, 0x00000 }, { 0x0f9be, 0x06599, 0x00000 }, { 0x0f9bf, 0x06a02, 0x00000 }, { 0x0f9c0, 0x071ce, 0x00000 }, { 0x0f9c1, 0x07642, 0x00000 }, { 0x0f9c2, 0x084fc, 0x00000 }, { 0x0f9c3, 0x0907c, 0x00000 }, { 0x0f9c4, 0x09f8d, 0x00000 }, { 0x0f9c5, 0x06688, 0x00000 }, { 0x0f9c6, 0x0962e, 0x00000 }, { 0x0f9c7, 0x05289, 0x00000 }, { 0x0f9c8, 0x0677b, 0x00000 }, { 0x0f9c9, 0x067f3, 0x00000 }, { 0x0f9ca, 0x06d41, 0x00000 }, { 0x0f9cb, 0x06e9c, 0x00000 }, { 0x0f9cc, 0x07409, 0x00000 }, { 0x0f9cd, 0x07559, 0x00000 }, { 0x0f9ce, 0x0786b, 0x00000 }, { 0x0f9cf, 0x07d10, 0x00000 }, { 0x0f9d0, 0x0985e, 0x00000 }, { 0x0f9d1, 0x0516d, 0x00000 }, { 0x0f9d2, 0x0622e, 0x00000 }, { 0x0f9d3, 0x09678, 0x00000 }, { 0x0f9d4, 0x0502b, 0x00000 }, { 0x0f9d5, 0x05d19, 0x00000 }, { 0x0f9d6, 0x06dea, 0x00000 }, { 0x0f9d7, 0x08f2a, 0x00000 }, { 0x0f9d8, 0x05f8b, 0x00000 }, { 0x0f9d9, 0x06144, 0x00000 }, { 0x0f9da, 0x06817, 0x00000 }, { 0x0f9db, 0x07387, 0x00000 }, { 0x0f9dc, 0x09686, 0x00000 }, { 0x0f9dd, 0x05229, 0x00000 }, { 0x0f9de, 0x0540f, 0x00000 }, { 0x0f9df, 0x05c65, 0x00000 }, { 0x0f9e0, 0x06613, 0x00000 }, { 0x0f9e1, 0x0674e, 0x00000 }, { 0x0f9e2, 0x068a8, 0x00000 }, { 0x0f9e3, 0x06ce5, 0x00000 }, { 0x0f9e4, 0x07406, 0x00000 }, { 0x0f9e5, 0x075e2, 0x00000 }, { 0x0f9e6, 0x07f79, 0x00000 }, { 0x0f9e7, 0x088cf, 0x00000 }, { 0x0f9e8, 0x088e1, 0x00000 }, { 0x0f9e9, 0x091cc, 0x00000 }, { 0x0f9ea, 0x096e2, 0x00000 }, { 0x0f9eb, 0x0533f, 0x00000 }, { 0x0f9ec, 0x06eba, 0x00000 }, { 0x0f9ed, 0x0541d, 0x00000 }, { 0x0f9ee, 0x071d0, 0x00000 }, { 0x0f9ef, 0x07498, 0x00000 }, { 0x0f9f0, 0x085fa, 0x00000 }, { 0x0f9f1, 0x096a3, 0x00000 }, { 0x0f9f2, 0x09c57, 0x00000 }, { 0x0f9f3, 0x09e9f, 0x00000 }, { 0x0f9f4, 0x06797, 0x00000 }, { 0x0f9f5, 0x06dcb, 0x00000 }, { 0x0f9f6, 0x081e8, 0x00000 }, { 0x0f9f7, 0x07acb, 0x00000 }, { 0x0f9f8, 0x07b20, 0x00000 }, { 0x0f9f9, 0x07c92, 0x00000 }, { 0x0f9fa, 0x072c0, 0x00000 }, { 0x0f9fb, 0x07099, 0x00000 }, { 0x0f9fc, 0x08b58, 0x00000 }, { 0x0f9fd, 0x04ec0, 0x00000 }, { 0x0f9fe, 0x08336, 0x00000 }, { 0x0f9ff, 0x0523a, 0x00000 }, { 0x0fa00, 0x05207, 0x00000 }, { 0x0fa01, 0x05ea6, 0x00000 }, { 0x0fa02, 0x062d3, 0x00000 }, { 0x0fa03, 0x07cd6, 0x00000 }, { 0x0fa04, 0x05b85, 0x00000 }, { 0x0fa05, 0x06d1e, 0x00000 }, { 0x0fa06, 0x066b4, 0x00000 }, { 0x0fa07, 0x08f3b, 0x00000 }, { 0x0fa08, 0x0884c, 0x00000 }, { 0x0fa09, 0x0964d, 0x00000 }, { 0x0fa0a, 0x0898b, 0x00000 }, { 0x0fa0b, 0x05ed3, 0x00000 }, { 0x0fa0c, 0x05140, 0x00000 }, { 0x0fa0d, 0x055c0, 0x00000 }, { 0x0fa10, 0x0585a, 0x00000 }, { 0x0fa12, 0x06674, 0x00000 }, { 0x0fa15, 0x051de, 0x00000 }, { 0x0fa16, 0x0732a, 0x00000 }, { 0x0fa17, 0x076ca, 0x00000 }, { 0x0fa18, 0x0793c, 0x00000 }, { 0x0fa19, 0x0795e, 0x00000 }, { 0x0fa1a, 0x07965, 0x00000 }, { 0x0fa1b, 0x0798f, 0x00000 }, { 0x0fa1c, 0x09756, 0x00000 }, { 0x0fa1d, 0x07cbe, 0x00000 }, { 0x0fa1e, 0x07fbd, 0x00000 }, { 0x0fa20, 0x08612, 0x00000 }, { 0x0fa22, 0x08af8, 0x00000 }, { 0x0fa25, 0x09038, 0x00000 }, { 0x0fa26, 0x090fd, 0x00000 }, { 0x0fa2a, 0x098ef, 0x00000 }, { 0x0fa2b, 0x098fc, 0x00000 }, { 0x0fa2c, 0x09928, 0x00000 }, { 0x0fa2d, 0x09db4, 0x00000 }, { 0x0fa2e, 0x090de, 0x00000 }, { 0x0fa2f, 0x096b7, 0x00000 }, { 0x0fa30, 0x04fae, 0x00000 }, { 0x0fa31, 0x050e7, 0x00000 }, { 0x0fa32, 0x0514d, 0x00000 }, { 0x0fa33, 0x052c9, 0x00000 }, { 0x0fa34, 0x052e4, 0x00000 }, { 0x0fa35, 0x05351, 0x00000 }, { 0x0fa36, 0x0559d, 0x00000 }, { 0x0fa37, 0x05606, 0x00000 }, { 0x0fa38, 0x05668, 0x00000 }, { 0x0fa39, 0x05840, 0x00000 }, { 0x0fa3a, 0x058a8, 0x00000 }, { 0x0fa3b, 0x05c64, 0x00000 }, { 0x0fa3c, 0x05c6e, 0x00000 }, { 0x0fa3d, 0x06094, 0x00000 }, { 0x0fa3e, 0x06168, 0x00000 }, { 0x0fa3f, 0x0618e, 0x00000 }, { 0x0fa40, 0x061f2, 0x00000 }, { 0x0fa41, 0x0654f, 0x00000 }, { 0x0fa42, 0x065e2, 0x00000 }, { 0x0fa43, 0x06691, 0x00000 }, { 0x0fa44, 0x06885, 0x00000 }, { 0x0fa45, 0x06d77, 0x00000 }, { 0x0fa46, 0x06e1a, 0x00000 }, { 0x0fa47, 0x06f22, 0x00000 }, { 0x0fa48, 0x0716e, 0x00000 }, { 0x0fa49, 0x0722b, 0x00000 }, { 0x0fa4a, 0x07422, 0x00000 }, { 0x0fa4b, 0x07891, 0x00000 }, { 0x0fa4c, 0x0793e, 0x00000 }, { 0x0fa4d, 0x07949, 0x00000 }, { 0x0fa4e, 0x07948, 0x00000 }, { 0x0fa4f, 0x07950, 0x00000 }, { 0x0fa50, 0x07956, 0x00000 }, { 0x0fa51, 0x0795d, 0x00000 }, { 0x0fa52, 0x0798d, 0x00000 }, { 0x0fa53, 0x0798e, 0x00000 }, { 0x0fa54, 0x07a40, 0x00000 }, { 0x0fa55, 0x07a81, 0x00000 }, { 0x0fa56, 0x07bc0, 0x00000 }, { 0x0fa57, 0x07df4, 0x00000 }, { 0x0fa58, 0x07e09, 0x00000 }, { 0x0fa59, 0x07e41, 0x00000 }, { 0x0fa5a, 0x07f72, 0x00000 }, { 0x0fa5b, 0x08005, 0x00000 }, { 0x0fa5c, 0x081ed, 0x00000 }, { 0x0fa5d, 0x08279, 0x00000 }, { 0x0fa5e, 0x08279, 0x00000 }, { 0x0fa5f, 0x08457, 0x00000 }, { 0x0fa60, 0x08910, 0x00000 }, { 0x0fa61, 0x08996, 0x00000 }, { 0x0fa62, 0x08b01, 0x00000 }, { 0x0fa63, 0x08b39, 0x00000 }, { 0x0fa64, 0x08cd3, 0x00000 }, { 0x0fa65, 0x08d08, 0x00000 }, { 0x0fa66, 0x08fb6, 0x00000 }, { 0x0fa67, 0x09038, 0x00000 }, { 0x0fa68, 0x096e3, 0x00000 }, { 0x0fa69, 0x097ff, 0x00000 }, { 0x0fa6a, 0x0983b, 0x00000 }, { 0x0fa6b, 0x06075, 0x00000 }, { 0x0fa6c, 0x242ee, 0x00000 }, { 0x0fa6d, 0x08218, 0x00000 }, { 0x0fa70, 0x04e26, 0x00000 }, { 0x0fa71, 0x051b5, 0x00000 }, { 0x0fa72, 0x05168, 0x00000 }, { 0x0fa73, 0x04f80, 0x00000 }, { 0x0fa74, 0x05145, 0x00000 }, { 0x0fa75, 0x05180, 0x00000 }, { 0x0fa76, 0x052c7, 0x00000 }, { 0x0fa77, 0x052fa, 0x00000 }, { 0x0fa78, 0x0559d, 0x00000 }, { 0x0fa79, 0x05555, 0x00000 }, { 0x0fa7a, 0x05599, 0x00000 }, { 0x0fa7b, 0x055e2, 0x00000 }, { 0x0fa7c, 0x0585a, 0x00000 }, { 0x0fa7d, 0x058b3, 0x00000 }, { 0x0fa7e, 0x05944, 0x00000 }, { 0x0fa7f, 0x05954, 0x00000 }, { 0x0fa80, 0x05a62, 0x00000 }, { 0x0fa81, 0x05b28, 0x00000 }, { 0x0fa82, 0x05ed2, 0x00000 }, { 0x0fa83, 0x05ed9, 0x00000 }, { 0x0fa84, 0x05f69, 0x00000 }, { 0x0fa85, 0x05fad, 0x00000 }, { 0x0fa86, 0x060d8, 0x00000 }, { 0x0fa87, 0x0614e, 0x00000 }, { 0x0fa88, 0x06108, 0x00000 }, { 0x0fa89, 0x0618e, 0x00000 }, { 0x0fa8a, 0x06160, 0x00000 }, { 0x0fa8b, 0x061f2, 0x00000 }, { 0x0fa8c, 0x06234, 0x00000 }, { 0x0fa8d, 0x063c4, 0x00000 }, { 0x0fa8e, 0x0641c, 0x00000 }, { 0x0fa8f, 0x06452, 0x00000 }, { 0x0fa90, 0x06556, 0x00000 }, { 0x0fa91, 0x06674, 0x00000 }, { 0x0fa92, 0x06717, 0x00000 }, { 0x0fa93, 0x0671b, 0x00000 }, { 0x0fa94, 0x06756, 0x00000 }, { 0x0fa95, 0x06b79, 0x00000 }, { 0x0fa96, 0x06bba, 0x00000 }, { 0x0fa97, 0x06d41, 0x00000 }, { 0x0fa98, 0x06edb, 0x00000 }, { 0x0fa99, 0x06ecb, 0x00000 }, { 0x0fa9a, 0x06f22, 0x00000 }, { 0x0fa9b, 0x0701e, 0x00000 }, { 0x0fa9c, 0x0716e, 0x00000 }, { 0x0fa9d, 0x077a7, 0x00000 }, { 0x0fa9e, 0x07235, 0x00000 }, { 0x0fa9f, 0x072af, 0x00000 }, { 0x0faa0, 0x0732a, 0x00000 }, { 0x0faa1, 0x07471, 0x00000 }, { 0x0faa2, 0x07506, 0x00000 }, { 0x0faa3, 0x0753b, 0x00000 }, { 0x0faa4, 0x0761d, 0x00000 }, { 0x0faa5, 0x0761f, 0x00000 }, { 0x0faa6, 0x076ca, 0x00000 }, { 0x0faa7, 0x076db, 0x00000 }, { 0x0faa8, 0x076f4, 0x00000 }, { 0x0faa9, 0x0774a, 0x00000 }, { 0x0faaa, 0x07740, 0x00000 }, { 0x0faab, 0x078cc, 0x00000 }, { 0x0faac, 0x07ab1, 0x00000 }, { 0x0faad, 0x07bc0, 0x00000 }, { 0x0faae, 0x07c7b, 0x00000 }, { 0x0faaf, 0x07d5b, 0x00000 }, { 0x0fab0, 0x07df4, 0x00000 }, { 0x0fab1, 0x07f3e, 0x00000 }, { 0x0fab2, 0x08005, 0x00000 }, { 0x0fab3, 0x08352, 0x00000 }, { 0x0fab4, 0x083ef, 0x00000 }, { 0x0fab5, 0x08779, 0x00000 }, { 0x0fab6, 0x08941, 0x00000 }, { 0x0fab7, 0x08986, 0x00000 }, { 0x0fab8, 0x08996, 0x00000 }, { 0x0fab9, 0x08abf, 0x00000 }, { 0x0faba, 0x08af8, 0x00000 }, { 0x0fabb, 0x08acb, 0x00000 }, { 0x0fabc, 0x08b01, 0x00000 }, { 0x0fabd, 0x08afe, 0x00000 }, { 0x0fabe, 0x08aed, 0x00000 }, { 0x0fabf, 0x08b39, 0x00000 }, { 0x0fac0, 0x08b8a, 0x00000 }, { 0x0fac1, 0x08d08, 0x00000 }, { 0x0fac2, 0x08f38, 0x00000 }, { 0x0fac3, 0x09072, 0x00000 }, { 0x0fac4, 0x09199, 0x00000 }, { 0x0fac5, 0x09276, 0x00000 }, { 0x0fac6, 0x0967c, 0x00000 }, { 0x0fac7, 0x096e3, 0x00000 }, { 0x0fac8, 0x09756, 0x00000 }, { 0x0fac9, 0x097db, 0x00000 }, { 0x0faca, 0x097ff, 0x00000 }, { 0x0facb, 0x0980b, 0x00000 }, { 0x0facc, 0x0983b, 0x00000 }, { 0x0facd, 0x09b12, 0x00000 }, { 0x0face, 0x09f9c, 0x00000 }, { 0x0facf, 0x2284a, 0x00000 }, { 0x0fad0, 0x22844, 0x00000 }, { 0x0fad1, 0x233d5, 0x00000 }, { 0x0fad2, 0x03b9d, 0x00000 }, { 0x0fad3, 0x04018, 0x00000 }, { 0x0fad4, 0x04039, 0x00000 }, { 0x0fad5, 0x25249, 0x00000 }, { 0x0fad6, 0x25cd0, 0x00000 }, { 0x0fad7, 0x27ed3, 0x00000 }, { 0x0fad8, 0x09f43, 0x00000 }, { 0x0fad9, 0x09f8e, 0x00000 }, { 0x0fb1d, 0x005d9, 0x005b4 }, { 0x0fb1f, 0x005f2, 0x005b7 }, { 0x0fb2a, 0x005e9, 0x005c1 }, { 0x0fb2b, 0x005e9, 0x005c2 }, { 0x0fb2c, 0x0fb49, 0x005c1 }, { 0x0fb2d, 0x0fb49, 0x005c2 }, { 0x0fb2e, 0x005d0, 0x005b7 }, { 0x0fb2f, 0x005d0, 0x005b8 }, { 0x0fb30, 0x005d0, 0x005bc }, { 0x0fb31, 0x005d1, 0x005bc }, { 0x0fb32, 0x005d2, 0x005bc }, { 0x0fb33, 0x005d3, 0x005bc }, { 0x0fb34, 0x005d4, 0x005bc }, { 0x0fb35, 0x005d5, 0x005bc }, { 0x0fb36, 0x005d6, 0x005bc }, { 0x0fb38, 0x005d8, 0x005bc }, { 0x0fb39, 0x005d9, 0x005bc }, { 0x0fb3a, 0x005da, 0x005bc }, { 0x0fb3b, 0x005db, 0x005bc }, { 0x0fb3c, 0x005dc, 0x005bc }, { 0x0fb3e, 0x005de, 0x005bc }, { 0x0fb40, 0x005e0, 0x005bc }, { 0x0fb41, 0x005e1, 0x005bc }, { 0x0fb43, 0x005e3, 0x005bc }, { 0x0fb44, 0x005e4, 0x005bc }, { 0x0fb46, 0x005e6, 0x005bc }, { 0x0fb47, 0x005e7, 0x005bc }, { 0x0fb48, 0x005e8, 0x005bc }, { 0x0fb49, 0x005e9, 0x005bc }, { 0x0fb4a, 0x005ea, 0x005bc }, { 0x0fb4b, 0x005d5, 0x005b9 }, { 0x0fb4c, 0x005d1, 0x005bf }, { 0x0fb4d, 0x005db, 0x005bf }, { 0x0fb4e, 0x005e4, 0x005bf }, { 0x1109a, 0x11099, 0x110ba }, { 0x1109c, 0x1109b, 0x110ba }, { 0x110ab, 0x110a5, 0x110ba }, { 0x1112e, 0x11131, 0x11127 }, { 0x1112f, 0x11132, 0x11127 }, { 0x1d15e, 0x1d157, 0x1d165 }, { 0x1d15f, 0x1d158, 0x1d165 }, { 0x1d160, 0x1d15f, 0x1d16e }, { 0x1d161, 0x1d15f, 0x1d16f }, { 0x1d162, 0x1d15f, 0x1d170 }, { 0x1d163, 0x1d15f, 0x1d171 }, { 0x1d164, 0x1d15f, 0x1d172 }, { 0x1d1bb, 0x1d1b9, 0x1d165 }, { 0x1d1bc, 0x1d1ba, 0x1d165 }, { 0x1d1bd, 0x1d1bb, 0x1d16e }, { 0x1d1be, 0x1d1bc, 0x1d16e }, { 0x1d1bf, 0x1d1bb, 0x1d16f }, { 0x1d1c0, 0x1d1bc, 0x1d16f }, { 0x2f800, 0x04e3d, 0x00000 }, { 0x2f801, 0x04e38, 0x00000 }, { 0x2f802, 0x04e41, 0x00000 }, { 0x2f803, 0x20122, 0x00000 }, { 0x2f804, 0x04f60, 0x00000 }, { 0x2f805, 0x04fae, 0x00000 }, { 0x2f806, 0x04fbb, 0x00000 }, { 0x2f807, 0x05002, 0x00000 }, { 0x2f808, 0x0507a, 0x00000 }, { 0x2f809, 0x05099, 0x00000 }, { 0x2f80a, 0x050e7, 0x00000 }, { 0x2f80b, 0x050cf, 0x00000 }, { 0x2f80c, 0x0349e, 0x00000 }, { 0x2f80d, 0x2063a, 0x00000 }, { 0x2f80e, 0x0514d, 0x00000 }, { 0x2f80f, 0x05154, 0x00000 }, { 0x2f810, 0x05164, 0x00000 }, { 0x2f811, 0x05177, 0x00000 }, { 0x2f812, 0x2051c, 0x00000 }, { 0x2f813, 0x034b9, 0x00000 }, { 0x2f814, 0x05167, 0x00000 }, { 0x2f815, 0x0518d, 0x00000 }, { 0x2f816, 0x2054b, 0x00000 }, { 0x2f817, 0x05197, 0x00000 }, { 0x2f818, 0x051a4, 0x00000 }, { 0x2f819, 0x04ecc, 0x00000 }, { 0x2f81a, 0x051ac, 0x00000 }, { 0x2f81b, 0x051b5, 0x00000 }, { 0x2f81c, 0x291df, 0x00000 }, { 0x2f81d, 0x051f5, 0x00000 }, { 0x2f81e, 0x05203, 0x00000 }, { 0x2f81f, 0x034df, 0x00000 }, { 0x2f820, 0x0523b, 0x00000 }, { 0x2f821, 0x05246, 0x00000 }, { 0x2f822, 0x05272, 0x00000 }, { 0x2f823, 0x05277, 0x00000 }, { 0x2f824, 0x03515, 0x00000 }, { 0x2f825, 0x052c7, 0x00000 }, { 0x2f826, 0x052c9, 0x00000 }, { 0x2f827, 0x052e4, 0x00000 }, { 0x2f828, 0x052fa, 0x00000 }, { 0x2f829, 0x05305, 0x00000 }, { 0x2f82a, 0x05306, 0x00000 }, { 0x2f82b, 0x05317, 0x00000 }, { 0x2f82c, 0x05349, 0x00000 }, { 0x2f82d, 0x05351, 0x00000 }, { 0x2f82e, 0x0535a, 0x00000 }, { 0x2f82f, 0x05373, 0x00000 }, { 0x2f830, 0x0537d, 0x00000 }, { 0x2f831, 0x0537f, 0x00000 }, { 0x2f832, 0x0537f, 0x00000 }, { 0x2f833, 0x0537f, 0x00000 }, { 0x2f834, 0x20a2c, 0x00000 }, { 0x2f835, 0x07070, 0x00000 }, { 0x2f836, 0x053ca, 0x00000 }, { 0x2f837, 0x053df, 0x00000 }, { 0x2f838, 0x20b63, 0x00000 }, { 0x2f839, 0x053eb, 0x00000 }, { 0x2f83a, 0x053f1, 0x00000 }, { 0x2f83b, 0x05406, 0x00000 }, { 0x2f83c, 0x0549e, 0x00000 }, { 0x2f83d, 0x05438, 0x00000 }, { 0x2f83e, 0x05448, 0x00000 }, { 0x2f83f, 0x05468, 0x00000 }, { 0x2f840, 0x054a2, 0x00000 }, { 0x2f841, 0x054f6, 0x00000 }, { 0x2f842, 0x05510, 0x00000 }, { 0x2f843, 0x05553, 0x00000 }, { 0x2f844, 0x05563, 0x00000 }, { 0x2f845, 0x05584, 0x00000 }, { 0x2f846, 0x05584, 0x00000 }, { 0x2f847, 0x05599, 0x00000 }, { 0x2f848, 0x055ab, 0x00000 }, { 0x2f849, 0x055b3, 0x00000 }, { 0x2f84a, 0x055c2, 0x00000 }, { 0x2f84b, 0x05716, 0x00000 }, { 0x2f84c, 0x05606, 0x00000 }, { 0x2f84d, 0x05717, 0x00000 }, { 0x2f84e, 0x05651, 0x00000 }, { 0x2f84f, 0x05674, 0x00000 }, { 0x2f850, 0x05207, 0x00000 }, { 0x2f851, 0x058ee, 0x00000 }, { 0x2f852, 0x057ce, 0x00000 }, { 0x2f853, 0x057f4, 0x00000 }, { 0x2f854, 0x0580d, 0x00000 }, { 0x2f855, 0x0578b, 0x00000 }, { 0x2f856, 0x05832, 0x00000 }, { 0x2f857, 0x05831, 0x00000 }, { 0x2f858, 0x058ac, 0x00000 }, { 0x2f859, 0x214e4, 0x00000 }, { 0x2f85a, 0x058f2, 0x00000 }, { 0x2f85b, 0x058f7, 0x00000 }, { 0x2f85c, 0x05906, 0x00000 }, { 0x2f85d, 0x0591a, 0x00000 }, { 0x2f85e, 0x05922, 0x00000 }, { 0x2f85f, 0x05962, 0x00000 }, { 0x2f860, 0x216a8, 0x00000 }, { 0x2f861, 0x216ea, 0x00000 }, { 0x2f862, 0x059ec, 0x00000 }, { 0x2f863, 0x05a1b, 0x00000 }, { 0x2f864, 0x05a27, 0x00000 }, { 0x2f865, 0x059d8, 0x00000 }, { 0x2f866, 0x05a66, 0x00000 }, { 0x2f867, 0x036ee, 0x00000 }, { 0x2f868, 0x036fc, 0x00000 }, { 0x2f869, 0x05b08, 0x00000 }, { 0x2f86a, 0x05b3e, 0x00000 }, { 0x2f86b, 0x05b3e, 0x00000 }, { 0x2f86c, 0x219c8, 0x00000 }, { 0x2f86d, 0x05bc3, 0x00000 }, { 0x2f86e, 0x05bd8, 0x00000 }, { 0x2f86f, 0x05be7, 0x00000 }, { 0x2f870, 0x05bf3, 0x00000 }, { 0x2f871, 0x21b18, 0x00000 }, { 0x2f872, 0x05bff, 0x00000 }, { 0x2f873, 0x05c06, 0x00000 }, { 0x2f874, 0x05f53, 0x00000 }, { 0x2f875, 0x05c22, 0x00000 }, { 0x2f876, 0x03781, 0x00000 }, { 0x2f877, 0x05c60, 0x00000 }, { 0x2f878, 0x05c6e, 0x00000 }, { 0x2f879, 0x05cc0, 0x00000 }, { 0x2f87a, 0x05c8d, 0x00000 }, { 0x2f87b, 0x21de4, 0x00000 }, { 0x2f87c, 0x05d43, 0x00000 }, { 0x2f87d, 0x21de6, 0x00000 }, { 0x2f87e, 0x05d6e, 0x00000 }, { 0x2f87f, 0x05d6b, 0x00000 }, { 0x2f880, 0x05d7c, 0x00000 }, { 0x2f881, 0x05de1, 0x00000 }, { 0x2f882, 0x05de2, 0x00000 }, { 0x2f883, 0x0382f, 0x00000 }, { 0x2f884, 0x05dfd, 0x00000 }, { 0x2f885, 0x05e28, 0x00000 }, { 0x2f886, 0x05e3d, 0x00000 }, { 0x2f887, 0x05e69, 0x00000 }, { 0x2f888, 0x03862, 0x00000 }, { 0x2f889, 0x22183, 0x00000 }, { 0x2f88a, 0x0387c, 0x00000 }, { 0x2f88b, 0x05eb0, 0x00000 }, { 0x2f88c, 0x05eb3, 0x00000 }, { 0x2f88d, 0x05eb6, 0x00000 }, { 0x2f88e, 0x05eca, 0x00000 }, { 0x2f88f, 0x2a392, 0x00000 }, { 0x2f890, 0x05efe, 0x00000 }, { 0x2f891, 0x22331, 0x00000 }, { 0x2f892, 0x22331, 0x00000 }, { 0x2f893, 0x08201, 0x00000 }, { 0x2f894, 0x05f22, 0x00000 }, { 0x2f895, 0x05f22, 0x00000 }, { 0x2f896, 0x038c7, 0x00000 }, { 0x2f897, 0x232b8, 0x00000 }, { 0x2f898, 0x261da, 0x00000 }, { 0x2f899, 0x05f62, 0x00000 }, { 0x2f89a, 0x05f6b, 0x00000 }, { 0x2f89b, 0x038e3, 0x00000 }, { 0x2f89c, 0x05f9a, 0x00000 }, { 0x2f89d, 0x05fcd, 0x00000 }, { 0x2f89e, 0x05fd7, 0x00000 }, { 0x2f89f, 0x05ff9, 0x00000 }, { 0x2f8a0, 0x06081, 0x00000 }, { 0x2f8a1, 0x0393a, 0x00000 }, { 0x2f8a2, 0x0391c, 0x00000 }, { 0x2f8a3, 0x06094, 0x00000 }, { 0x2f8a4, 0x226d4, 0x00000 }, { 0x2f8a5, 0x060c7, 0x00000 }, { 0x2f8a6, 0x06148, 0x00000 }, { 0x2f8a7, 0x0614c, 0x00000 }, { 0x2f8a8, 0x0614e, 0x00000 }, { 0x2f8a9, 0x0614c, 0x00000 }, { 0x2f8aa, 0x0617a, 0x00000 }, { 0x2f8ab, 0x0618e, 0x00000 }, { 0x2f8ac, 0x061b2, 0x00000 }, { 0x2f8ad, 0x061a4, 0x00000 }, { 0x2f8ae, 0x061af, 0x00000 }, { 0x2f8af, 0x061de, 0x00000 }, { 0x2f8b0, 0x061f2, 0x00000 }, { 0x2f8b1, 0x061f6, 0x00000 }, { 0x2f8b2, 0x06210, 0x00000 }, { 0x2f8b3, 0x0621b, 0x00000 }, { 0x2f8b4, 0x0625d, 0x00000 }, { 0x2f8b5, 0x062b1, 0x00000 }, { 0x2f8b6, 0x062d4, 0x00000 }, { 0x2f8b7, 0x06350, 0x00000 }, { 0x2f8b8, 0x22b0c, 0x00000 }, { 0x2f8b9, 0x0633d, 0x00000 }, { 0x2f8ba, 0x062fc, 0x00000 }, { 0x2f8bb, 0x06368, 0x00000 }, { 0x2f8bc, 0x06383, 0x00000 }, { 0x2f8bd, 0x063e4, 0x00000 }, { 0x2f8be, 0x22bf1, 0x00000 }, { 0x2f8bf, 0x06422, 0x00000 }, { 0x2f8c0, 0x063c5, 0x00000 }, { 0x2f8c1, 0x063a9, 0x00000 }, { 0x2f8c2, 0x03a2e, 0x00000 }, { 0x2f8c3, 0x06469, 0x00000 }, { 0x2f8c4, 0x0647e, 0x00000 }, { 0x2f8c5, 0x0649d, 0x00000 }, { 0x2f8c6, 0x06477, 0x00000 }, { 0x2f8c7, 0x03a6c, 0x00000 }, { 0x2f8c8, 0x0654f, 0x00000 }, { 0x2f8c9, 0x0656c, 0x00000 }, { 0x2f8ca, 0x2300a, 0x00000 }, { 0x2f8cb, 0x065e3, 0x00000 }, { 0x2f8cc, 0x066f8, 0x00000 }, { 0x2f8cd, 0x06649, 0x00000 }, { 0x2f8ce, 0x03b19, 0x00000 }, { 0x2f8cf, 0x06691, 0x00000 }, { 0x2f8d0, 0x03b08, 0x00000 }, { 0x2f8d1, 0x03ae4, 0x00000 }, { 0x2f8d2, 0x05192, 0x00000 }, { 0x2f8d3, 0x05195, 0x00000 }, { 0x2f8d4, 0x06700, 0x00000 }, { 0x2f8d5, 0x0669c, 0x00000 }, { 0x2f8d6, 0x080ad, 0x00000 }, { 0x2f8d7, 0x043d9, 0x00000 }, { 0x2f8d8, 0x06717, 0x00000 }, { 0x2f8d9, 0x0671b, 0x00000 }, { 0x2f8da, 0x06721, 0x00000 }, { 0x2f8db, 0x0675e, 0x00000 }, { 0x2f8dc, 0x06753, 0x00000 }, { 0x2f8dd, 0x233c3, 0x00000 }, { 0x2f8de, 0x03b49, 0x00000 }, { 0x2f8df, 0x067fa, 0x00000 }, { 0x2f8e0, 0x06785, 0x00000 }, { 0x2f8e1, 0x06852, 0x00000 }, { 0x2f8e2, 0x06885, 0x00000 }, { 0x2f8e3, 0x2346d, 0x00000 }, { 0x2f8e4, 0x0688e, 0x00000 }, { 0x2f8e5, 0x0681f, 0x00000 }, { 0x2f8e6, 0x06914, 0x00000 }, { 0x2f8e7, 0x03b9d, 0x00000 }, { 0x2f8e8, 0x06942, 0x00000 }, { 0x2f8e9, 0x069a3, 0x00000 }, { 0x2f8ea, 0x069ea, 0x00000 }, { 0x2f8eb, 0x06aa8, 0x00000 }, { 0x2f8ec, 0x236a3, 0x00000 }, { 0x2f8ed, 0x06adb, 0x00000 }, { 0x2f8ee, 0x03c18, 0x00000 }, { 0x2f8ef, 0x06b21, 0x00000 }, { 0x2f8f0, 0x238a7, 0x00000 }, { 0x2f8f1, 0x06b54, 0x00000 }, { 0x2f8f2, 0x03c4e, 0x00000 }, { 0x2f8f3, 0x06b72, 0x00000 }, { 0x2f8f4, 0x06b9f, 0x00000 }, { 0x2f8f5, 0x06bba, 0x00000 }, { 0x2f8f6, 0x06bbb, 0x00000 }, { 0x2f8f7, 0x23a8d, 0x00000 }, { 0x2f8f8, 0x21d0b, 0x00000 }, { 0x2f8f9, 0x23afa, 0x00000 }, { 0x2f8fa, 0x06c4e, 0x00000 }, { 0x2f8fb, 0x23cbc, 0x00000 }, { 0x2f8fc, 0x06cbf, 0x00000 }, { 0x2f8fd, 0x06ccd, 0x00000 }, { 0x2f8fe, 0x06c67, 0x00000 }, { 0x2f8ff, 0x06d16, 0x00000 }, { 0x2f900, 0x06d3e, 0x00000 }, { 0x2f901, 0x06d77, 0x00000 }, { 0x2f902, 0x06d41, 0x00000 }, { 0x2f903, 0x06d69, 0x00000 }, { 0x2f904, 0x06d78, 0x00000 }, { 0x2f905, 0x06d85, 0x00000 }, { 0x2f906, 0x23d1e, 0x00000 }, { 0x2f907, 0x06d34, 0x00000 }, { 0x2f908, 0x06e2f, 0x00000 }, { 0x2f909, 0x06e6e, 0x00000 }, { 0x2f90a, 0x03d33, 0x00000 }, { 0x2f90b, 0x06ecb, 0x00000 }, { 0x2f90c, 0x06ec7, 0x00000 }, { 0x2f90d, 0x23ed1, 0x00000 }, { 0x2f90e, 0x06df9, 0x00000 }, { 0x2f90f, 0x06f6e, 0x00000 }, { 0x2f910, 0x23f5e, 0x00000 }, { 0x2f911, 0x23f8e, 0x00000 }, { 0x2f912, 0x06fc6, 0x00000 }, { 0x2f913, 0x07039, 0x00000 }, { 0x2f914, 0x0701e, 0x00000 }, { 0x2f915, 0x0701b, 0x00000 }, { 0x2f916, 0x03d96, 0x00000 }, { 0x2f917, 0x0704a, 0x00000 }, { 0x2f918, 0x0707d, 0x00000 }, { 0x2f919, 0x07077, 0x00000 }, { 0x2f91a, 0x070ad, 0x00000 }, { 0x2f91b, 0x20525, 0x00000 }, { 0x2f91c, 0x07145, 0x00000 }, { 0x2f91d, 0x24263, 0x00000 }, { 0x2f91e, 0x0719c, 0x00000 }, { 0x2f91f, 0x243ab, 0x00000 }, { 0x2f920, 0x07228, 0x00000 }, { 0x2f921, 0x07235, 0x00000 }, { 0x2f922, 0x07250, 0x00000 }, { 0x2f923, 0x24608, 0x00000 }, { 0x2f924, 0x07280, 0x00000 }, { 0x2f925, 0x07295, 0x00000 }, { 0x2f926, 0x24735, 0x00000 }, { 0x2f927, 0x24814, 0x00000 }, { 0x2f928, 0x0737a, 0x00000 }, { 0x2f929, 0x0738b, 0x00000 }, { 0x2f92a, 0x03eac, 0x00000 }, { 0x2f92b, 0x073a5, 0x00000 }, { 0x2f92c, 0x03eb8, 0x00000 }, { 0x2f92d, 0x03eb8, 0x00000 }, { 0x2f92e, 0x07447, 0x00000 }, { 0x2f92f, 0x0745c, 0x00000 }, { 0x2f930, 0x07471, 0x00000 }, { 0x2f931, 0x07485, 0x00000 }, { 0x2f932, 0x074ca, 0x00000 }, { 0x2f933, 0x03f1b, 0x00000 }, { 0x2f934, 0x07524, 0x00000 }, { 0x2f935, 0x24c36, 0x00000 }, { 0x2f936, 0x0753e, 0x00000 }, { 0x2f937, 0x24c92, 0x00000 }, { 0x2f938, 0x07570, 0x00000 }, { 0x2f939, 0x2219f, 0x00000 }, { 0x2f93a, 0x07610, 0x00000 }, { 0x2f93b, 0x24fa1, 0x00000 }, { 0x2f93c, 0x24fb8, 0x00000 }, { 0x2f93d, 0x25044, 0x00000 }, { 0x2f93e, 0x03ffc, 0x00000 }, { 0x2f93f, 0x04008, 0x00000 }, { 0x2f940, 0x076f4, 0x00000 }, { 0x2f941, 0x250f3, 0x00000 }, { 0x2f942, 0x250f2, 0x00000 }, { 0x2f943, 0x25119, 0x00000 }, { 0x2f944, 0x25133, 0x00000 }, { 0x2f945, 0x0771e, 0x00000 }, { 0x2f946, 0x0771f, 0x00000 }, { 0x2f947, 0x0771f, 0x00000 }, { 0x2f948, 0x0774a, 0x00000 }, { 0x2f949, 0x04039, 0x00000 }, { 0x2f94a, 0x0778b, 0x00000 }, { 0x2f94b, 0x04046, 0x00000 }, { 0x2f94c, 0x04096, 0x00000 }, { 0x2f94d, 0x2541d, 0x00000 }, { 0x2f94e, 0x0784e, 0x00000 }, { 0x2f94f, 0x0788c, 0x00000 }, { 0x2f950, 0x078cc, 0x00000 }, { 0x2f951, 0x040e3, 0x00000 }, { 0x2f952, 0x25626, 0x00000 }, { 0x2f953, 0x07956, 0x00000 }, { 0x2f954, 0x2569a, 0x00000 }, { 0x2f955, 0x256c5, 0x00000 }, { 0x2f956, 0x0798f, 0x00000 }, { 0x2f957, 0x079eb, 0x00000 }, { 0x2f958, 0x0412f, 0x00000 }, { 0x2f959, 0x07a40, 0x00000 }, { 0x2f95a, 0x07a4a, 0x00000 }, { 0x2f95b, 0x07a4f, 0x00000 }, { 0x2f95c, 0x2597c, 0x00000 }, { 0x2f95d, 0x25aa7, 0x00000 }, { 0x2f95e, 0x25aa7, 0x00000 }, { 0x2f95f, 0x07aee, 0x00000 }, { 0x2f960, 0x04202, 0x00000 }, { 0x2f961, 0x25bab, 0x00000 }, { 0x2f962, 0x07bc6, 0x00000 }, { 0x2f963, 0x07bc9, 0x00000 }, { 0x2f964, 0x04227, 0x00000 }, { 0x2f965, 0x25c80, 0x00000 }, { 0x2f966, 0x07cd2, 0x00000 }, { 0x2f967, 0x042a0, 0x00000 }, { 0x2f968, 0x07ce8, 0x00000 }, { 0x2f969, 0x07ce3, 0x00000 }, { 0x2f96a, 0x07d00, 0x00000 }, { 0x2f96b, 0x25f86, 0x00000 }, { 0x2f96c, 0x07d63, 0x00000 }, { 0x2f96d, 0x04301, 0x00000 }, { 0x2f96e, 0x07dc7, 0x00000 }, { 0x2f96f, 0x07e02, 0x00000 }, { 0x2f970, 0x07e45, 0x00000 }, { 0x2f971, 0x04334, 0x00000 }, { 0x2f972, 0x26228, 0x00000 }, { 0x2f973, 0x26247, 0x00000 }, { 0x2f974, 0x04359, 0x00000 }, { 0x2f975, 0x262d9, 0x00000 }, { 0x2f976, 0x07f7a, 0x00000 }, { 0x2f977, 0x2633e, 0x00000 }, { 0x2f978, 0x07f95, 0x00000 }, { 0x2f979, 0x07ffa, 0x00000 }, { 0x2f97a, 0x08005, 0x00000 }, { 0x2f97b, 0x264da, 0x00000 }, { 0x2f97c, 0x26523, 0x00000 }, { 0x2f97d, 0x08060, 0x00000 }, { 0x2f97e, 0x265a8, 0x00000 }, { 0x2f97f, 0x08070, 0x00000 }, { 0x2f980, 0x2335f, 0x00000 }, { 0x2f981, 0x043d5, 0x00000 }, { 0x2f982, 0x080b2, 0x00000 }, { 0x2f983, 0x08103, 0x00000 }, { 0x2f984, 0x0440b, 0x00000 }, { 0x2f985, 0x0813e, 0x00000 }, { 0x2f986, 0x05ab5, 0x00000 }, { 0x2f987, 0x267a7, 0x00000 }, { 0x2f988, 0x267b5, 0x00000 }, { 0x2f989, 0x23393, 0x00000 }, { 0x2f98a, 0x2339c, 0x00000 }, { 0x2f98b, 0x08201, 0x00000 }, { 0x2f98c, 0x08204, 0x00000 }, { 0x2f98d, 0x08f9e, 0x00000 }, { 0x2f98e, 0x0446b, 0x00000 }, { 0x2f98f, 0x08291, 0x00000 }, { 0x2f990, 0x0828b, 0x00000 }, { 0x2f991, 0x0829d, 0x00000 }, { 0x2f992, 0x052b3, 0x00000 }, { 0x2f993, 0x082b1, 0x00000 }, { 0x2f994, 0x082b3, 0x00000 }, { 0x2f995, 0x082bd, 0x00000 }, { 0x2f996, 0x082e6, 0x00000 }, { 0x2f997, 0x26b3c, 0x00000 }, { 0x2f998, 0x082e5, 0x00000 }, { 0x2f999, 0x0831d, 0x00000 }, { 0x2f99a, 0x08363, 0x00000 }, { 0x2f99b, 0x083ad, 0x00000 }, { 0x2f99c, 0x08323, 0x00000 }, { 0x2f99d, 0x083bd, 0x00000 }, { 0x2f99e, 0x083e7, 0x00000 }, { 0x2f99f, 0x08457, 0x00000 }, { 0x2f9a0, 0x08353, 0x00000 }, { 0x2f9a1, 0x083ca, 0x00000 }, { 0x2f9a2, 0x083cc, 0x00000 }, { 0x2f9a3, 0x083dc, 0x00000 }, { 0x2f9a4, 0x26c36, 0x00000 }, { 0x2f9a5, 0x26d6b, 0x00000 }, { 0x2f9a6, 0x26cd5, 0x00000 }, { 0x2f9a7, 0x0452b, 0x00000 }, { 0x2f9a8, 0x084f1, 0x00000 }, { 0x2f9a9, 0x084f3, 0x00000 }, { 0x2f9aa, 0x08516, 0x00000 }, { 0x2f9ab, 0x273ca, 0x00000 }, { 0x2f9ac, 0x08564, 0x00000 }, { 0x2f9ad, 0x26f2c, 0x00000 }, { 0x2f9ae, 0x0455d, 0x00000 }, { 0x2f9af, 0x04561, 0x00000 }, { 0x2f9b0, 0x26fb1, 0x00000 }, { 0x2f9b1, 0x270d2, 0x00000 }, { 0x2f9b2, 0x0456b, 0x00000 }, { 0x2f9b3, 0x08650, 0x00000 }, { 0x2f9b4, 0x0865c, 0x00000 }, { 0x2f9b5, 0x08667, 0x00000 }, { 0x2f9b6, 0x08669, 0x00000 }, { 0x2f9b7, 0x086a9, 0x00000 }, { 0x2f9b8, 0x08688, 0x00000 }, { 0x2f9b9, 0x0870e, 0x00000 }, { 0x2f9ba, 0x086e2, 0x00000 }, { 0x2f9bb, 0x08779, 0x00000 }, { 0x2f9bc, 0x08728, 0x00000 }, { 0x2f9bd, 0x0876b, 0x00000 }, { 0x2f9be, 0x08786, 0x00000 }, { 0x2f9bf, 0x045d7, 0x00000 }, { 0x2f9c0, 0x087e1, 0x00000 }, { 0x2f9c1, 0x08801, 0x00000 }, { 0x2f9c2, 0x045f9, 0x00000 }, { 0x2f9c3, 0x08860, 0x00000 }, { 0x2f9c4, 0x08863, 0x00000 }, { 0x2f9c5, 0x27667, 0x00000 }, { 0x2f9c6, 0x088d7, 0x00000 }, { 0x2f9c7, 0x088de, 0x00000 }, { 0x2f9c8, 0x04635, 0x00000 }, { 0x2f9c9, 0x088fa, 0x00000 }, { 0x2f9ca, 0x034bb, 0x00000 }, { 0x2f9cb, 0x278ae, 0x00000 }, { 0x2f9cc, 0x27966, 0x00000 }, { 0x2f9cd, 0x046be, 0x00000 }, { 0x2f9ce, 0x046c7, 0x00000 }, { 0x2f9cf, 0x08aa0, 0x00000 }, { 0x2f9d0, 0x08aed, 0x00000 }, { 0x2f9d1, 0x08b8a, 0x00000 }, { 0x2f9d2, 0x08c55, 0x00000 }, { 0x2f9d3, 0x27ca8, 0x00000 }, { 0x2f9d4, 0x08cab, 0x00000 }, { 0x2f9d5, 0x08cc1, 0x00000 }, { 0x2f9d6, 0x08d1b, 0x00000 }, { 0x2f9d7, 0x08d77, 0x00000 }, { 0x2f9d8, 0x27f2f, 0x00000 }, { 0x2f9d9, 0x20804, 0x00000 }, { 0x2f9da, 0x08dcb, 0x00000 }, { 0x2f9db, 0x08dbc, 0x00000 }, { 0x2f9dc, 0x08df0, 0x00000 }, { 0x2f9dd, 0x208de, 0x00000 }, { 0x2f9de, 0x08ed4, 0x00000 }, { 0x2f9df, 0x08f38, 0x00000 }, { 0x2f9e0, 0x285d2, 0x00000 }, { 0x2f9e1, 0x285ed, 0x00000 }, { 0x2f9e2, 0x09094, 0x00000 }, { 0x2f9e3, 0x090f1, 0x00000 }, { 0x2f9e4, 0x09111, 0x00000 }, { 0x2f9e5, 0x2872e, 0x00000 }, { 0x2f9e6, 0x0911b, 0x00000 }, { 0x2f9e7, 0x09238, 0x00000 }, { 0x2f9e8, 0x092d7, 0x00000 }, { 0x2f9e9, 0x092d8, 0x00000 }, { 0x2f9ea, 0x0927c, 0x00000 }, { 0x2f9eb, 0x093f9, 0x00000 }, { 0x2f9ec, 0x09415, 0x00000 }, { 0x2f9ed, 0x28bfa, 0x00000 }, { 0x2f9ee, 0x0958b, 0x00000 }, { 0x2f9ef, 0x04995, 0x00000 }, { 0x2f9f0, 0x095b7, 0x00000 }, { 0x2f9f1, 0x28d77, 0x00000 }, { 0x2f9f2, 0x049e6, 0x00000 }, { 0x2f9f3, 0x096c3, 0x00000 }, { 0x2f9f4, 0x05db2, 0x00000 }, { 0x2f9f5, 0x09723, 0x00000 }, { 0x2f9f6, 0x29145, 0x00000 }, { 0x2f9f7, 0x2921a, 0x00000 }, { 0x2f9f8, 0x04a6e, 0x00000 }, { 0x2f9f9, 0x04a76, 0x00000 }, { 0x2f9fa, 0x097e0, 0x00000 }, { 0x2f9fb, 0x2940a, 0x00000 }, { 0x2f9fc, 0x04ab2, 0x00000 }, { 0x2f9fd, 0x29496, 0x00000 }, { 0x2f9fe, 0x0980b, 0x00000 }, { 0x2f9ff, 0x0980b, 0x00000 }, { 0x2fa00, 0x09829, 0x00000 }, { 0x2fa01, 0x295b6, 0x00000 }, { 0x2fa02, 0x098e2, 0x00000 }, { 0x2fa03, 0x04b33, 0x00000 }, { 0x2fa04, 0x09929, 0x00000 }, { 0x2fa05, 0x099a7, 0x00000 }, { 0x2fa06, 0x099c2, 0x00000 }, { 0x2fa07, 0x099fe, 0x00000 }, { 0x2fa08, 0x04bce, 0x00000 }, { 0x2fa09, 0x29b30, 0x00000 }, { 0x2fa0a, 0x09b12, 0x00000 }, { 0x2fa0b, 0x09c40, 0x00000 }, { 0x2fa0c, 0x09cfd, 0x00000 }, { 0x2fa0d, 0x04cce, 0x00000 }, { 0x2fa0e, 0x04ced, 0x00000 }, { 0x2fa0f, 0x09d67, 0x00000 }, { 0x2fa10, 0x2a0ce, 0x00000 }, { 0x2fa11, 0x04cf8, 0x00000 }, { 0x2fa12, 0x2a105, 0x00000 }, { 0x2fa13, 0x2a20e, 0x00000 }, { 0x2fa14, 0x2a291, 0x00000 }, { 0x2fa15, 0x09ebb, 0x00000 }, { 0x2fa16, 0x04d56, 0x00000 }, { 0x2fa17, 0x09ef9, 0x00000 }, { 0x2fa18, 0x09efe, 0x00000 }, { 0x2fa19, 0x09f05, 0x00000 }, { 0x2fa1a, 0x09f0f, 0x00000 }, { 0x2fa1b, 0x09f16, 0x00000 }, { 0x2fa1c, 0x09f3b, 0x00000 }, { 0x2fa1d, 0x2a600, 0x00000 } }; #endif /* DECOMP_H */ pkg-config-0.29.1/glib/glib/gnulib/0000775000175000017500000000000012665370350013753 500000000000000pkg-config-0.29.1/glib/glib/gnulib/printf-parse.h0000664000175000017500000000420512275467762016472 00000000000000/* Parse printf format string. Copyright (C) 1999, 2002 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _PRINTF_PARSE_H #define _PRINTF_PARSE_H #include "printf-args.h" /* Private namespace for gnulib functions */ #define printf_parse _g_gnulib_printf_parse /* Flags */ #define FLAG_GROUP 1 /* ' flag */ #define FLAG_LEFT 2 /* - flag */ #define FLAG_SHOWSIGN 4 /* + flag */ #define FLAG_SPACE 8 /* space flag */ #define FLAG_ALT 16 /* # flag */ #define FLAG_ZERO 32 /* A parsed directive. */ typedef struct { const char* dir_start; const char* dir_end; int flags; const char* width_start; const char* width_end; int width_arg_index; const char* precision_start; const char* precision_end; int precision_arg_index; char conversion; /* d i o u x X f e E g G c s p n U % but not C S */ int arg_index; } char_directive; /* A parsed format string. */ typedef struct { unsigned int count; char_directive *dir; unsigned int max_width_length; unsigned int max_precision_length; } char_directives; /* Parses the format string. Fills in the number N of directives, and fills in directives[0], ..., directives[N-1], and sets directives[N].dir_start to the end of the format string. Also fills in the arg_type fields of the arguments and the needed count of arguments. */ #ifdef STATIC STATIC #else extern #endif int printf_parse (const char *format, char_directives *d, arguments *a); #endif /* _PRINTF_PARSE_H */ pkg-config-0.29.1/glib/glib/gnulib/g-gnulib.h0000664000175000017500000000272512275467762015571 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 2003 Matthias Clasen * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __G_GNULIB_H__ #include "config.h" #include #include "glib/glib.h" /* Private namespace for gnulib functions */ #define asnprintf _g_gnulib_asnprintf #define vasnprintf _g_gnulib_vasnprintf #define printf_parse _g_gnulib_printf_parse #define printf_fetchargs _g_gnulib_printf_fetchargs /* Use GLib memory allocation */ #undef malloc #undef realloc #undef free #define malloc g_malloc #define realloc g_realloc #define free g_free /* Ensure only C99 snprintf gets used */ #undef HAVE_SNPRINTF #ifdef HAVE_C99_SNPRINTF #define HAVE_SNPRINTF 1 #else #define HAVE_SNPRINTF 0 #endif #endif /* __G_GNULIB_H__ */ pkg-config-0.29.1/glib/glib/gnulib/printf-parse.c0000664000175000017500000002506512275467762016474 00000000000000/* Formatted output to strings. Copyright (C) 1999-2000, 2002-2003 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include "g-gnulib.h" /* Specification. */ #include "printf-parse.h" /* Get size_t, NULL. */ #include /* Get intmax_t. */ #if HAVE_STDINT_H_WITH_UINTMAX # include #endif #if HAVE_INTTYPES_H_WITH_UINTMAX # include #endif /* malloc(), realloc(), free(). */ #include #ifdef STATIC STATIC #endif int printf_parse (const char *format, char_directives *d, arguments *a) { const char *cp = format; /* pointer into format */ int arg_posn = 0; /* number of regular arguments consumed */ unsigned int d_allocated; /* allocated elements of d->dir */ unsigned int a_allocated; /* allocated elements of a->arg */ unsigned int max_width_length = 0; unsigned int max_precision_length = 0; d->count = 0; d_allocated = 1; d->dir = malloc (d_allocated * sizeof (char_directive)); if (d->dir == NULL) /* Out of memory. */ return -1; a->count = 0; a_allocated = 0; a->arg = NULL; #define REGISTER_ARG(_index_,_type_) \ { \ unsigned int n = (_index_); \ if (n >= a_allocated) \ { \ argument *memory; \ a_allocated = 2 * a_allocated; \ if (a_allocated <= n) \ a_allocated = n + 1; \ memory = (a->arg \ ? realloc (a->arg, a_allocated * sizeof (argument)) \ : malloc (a_allocated * sizeof (argument))); \ if (memory == NULL) \ /* Out of memory. */ \ goto error; \ a->arg = memory; \ } \ while (a->count <= n) \ a->arg[a->count++].type = TYPE_NONE; \ if (a->arg[n].type == TYPE_NONE) \ a->arg[n].type = (_type_); \ else if (a->arg[n].type != (_type_)) \ /* Ambiguous type for positional argument. */ \ goto error; \ } while (*cp != '\0') { char c = *cp++; if (c == '%') { int arg_index = -1; char_directive *dp = &d->dir[d->count];/* pointer to next directive */ /* Initialize the next directive. */ dp->dir_start = cp - 1; dp->flags = 0; dp->width_start = NULL; dp->width_end = NULL; dp->width_arg_index = -1; dp->precision_start = NULL; dp->precision_end = NULL; dp->precision_arg_index = -1; dp->arg_index = -1; /* Test for positional argument. */ if (*cp >= '0' && *cp <= '9') { const char *np; for (np = cp; *np >= '0' && *np <= '9'; np++) ; if (*np == '$') { unsigned int n = 0; for (np = cp; *np >= '0' && *np <= '9'; np++) n = 10 * n + (*np - '0'); if (n == 0) /* Positional argument 0. */ goto error; arg_index = n - 1; cp = np + 1; } } /* Read the flags. */ for (;;) { if (*cp == '\'') { dp->flags |= FLAG_GROUP; cp++; } else if (*cp == '-') { dp->flags |= FLAG_LEFT; cp++; } else if (*cp == '+') { dp->flags |= FLAG_SHOWSIGN; cp++; } else if (*cp == ' ') { dp->flags |= FLAG_SPACE; cp++; } else if (*cp == '#') { dp->flags |= FLAG_ALT; cp++; } else if (*cp == '0') { dp->flags |= FLAG_ZERO; cp++; } else break; } /* Parse the field width. */ if (*cp == '*') { dp->width_start = cp; cp++; dp->width_end = cp; if (max_width_length < 1) max_width_length = 1; /* Test for positional argument. */ if (*cp >= '0' && *cp <= '9') { const char *np; for (np = cp; *np >= '0' && *np <= '9'; np++) ; if (*np == '$') { unsigned int n = 0; for (np = cp; *np >= '0' && *np <= '9'; np++) n = 10 * n + (*np - '0'); if (n == 0) /* Positional argument 0. */ goto error; dp->width_arg_index = n - 1; cp = np + 1; } } if (dp->width_arg_index < 0) dp->width_arg_index = arg_posn++; REGISTER_ARG (dp->width_arg_index, TYPE_INT); } else if (*cp >= '0' && *cp <= '9') { unsigned int width_length; dp->width_start = cp; for (; *cp >= '0' && *cp <= '9'; cp++) ; dp->width_end = cp; width_length = dp->width_end - dp->width_start; if (max_width_length < width_length) max_width_length = width_length; } /* Parse the precision. */ if (*cp == '.') { cp++; if (*cp == '*') { dp->precision_start = cp - 1; cp++; dp->precision_end = cp; if (max_precision_length < 2) max_precision_length = 2; /* Test for positional argument. */ if (*cp >= '0' && *cp <= '9') { const char *np; for (np = cp; *np >= '0' && *np <= '9'; np++) ; if (*np == '$') { unsigned int n = 0; for (np = cp; *np >= '0' && *np <= '9'; np++) n = 10 * n + (*np - '0'); if (n == 0) /* Positional argument 0. */ goto error; dp->precision_arg_index = n - 1; cp = np + 1; } } if (dp->precision_arg_index < 0) dp->precision_arg_index = arg_posn++; REGISTER_ARG (dp->precision_arg_index, TYPE_INT); } else { unsigned int precision_length; dp->precision_start = cp - 1; for (; *cp >= '0' && *cp <= '9'; cp++) ; dp->precision_end = cp; precision_length = dp->precision_end - dp->precision_start; if (max_precision_length < precision_length) max_precision_length = precision_length; } } { arg_type type; /* Parse argument type/size specifiers. */ { int flags = 0; for (;;) { if (*cp == 'h') { flags |= (1 << (flags & 1)); cp++; } else if (*cp == 'L') { flags |= 4; cp++; } else if (*cp == 'l') { flags += 8; cp++; } #ifdef HAVE_INT64_AND_I64 else if (cp[0] == 'I' && cp[1] == '6' && cp[2] == '4') { flags = 64; cp += 3; } #endif #ifdef HAVE_INTMAX_T else if (*cp == 'j') { if (sizeof (intmax_t) > sizeof (long)) { /* intmax_t = long long */ flags += 16; } else if (sizeof (intmax_t) > sizeof (int)) { /* intmax_t = long */ flags += 8; } cp++; } #endif else if (*cp == 'z' || *cp == 'Z') { /* 'z' is standardized in ISO C 99, but glibc uses 'Z' because the warning facility in gcc-2.95.2 understands only 'Z' (see gcc-2.95.2/gcc/c-common.c:1784). */ if (sizeof (size_t) > sizeof (long)) { /* size_t = long long */ flags += 16; } else if (sizeof (size_t) > sizeof (int)) { /* size_t = long */ flags += 8; } cp++; } else if (*cp == 't') { if (sizeof (ptrdiff_t) > sizeof (long)) { /* ptrdiff_t = long long */ flags += 16; } else if (sizeof (ptrdiff_t) > sizeof (int)) { /* ptrdiff_t = long */ flags += 8; } cp++; } else break; } /* Read the conversion character. */ c = *cp++; switch (c) { case 'd': case 'i': #ifdef HAVE_INT64_AND_I64 if (flags == 64) type = TYPE_INT64; else #endif #ifdef HAVE_LONG_LONG if (flags >= 16 || (flags & 4)) type = TYPE_LONGLONGINT; else #endif if (flags >= 8) type = TYPE_LONGINT; else if (flags & 2) type = TYPE_SCHAR; else if (flags & 1) type = TYPE_SHORT; else type = TYPE_INT; break; case 'o': case 'u': case 'x': case 'X': #ifdef HAVE_INT64_AND_I64 if (flags == 64) type = TYPE_UINT64; else #endif #ifdef HAVE_LONG_LONG if (flags >= 16 || (flags & 4)) type = TYPE_ULONGLONGINT; else #endif if (flags >= 8) type = TYPE_ULONGINT; else if (flags & 2) type = TYPE_UCHAR; else if (flags & 1) type = TYPE_USHORT; else type = TYPE_UINT; break; case 'f': case 'F': case 'e': case 'E': case 'g': case 'G': case 'a': case 'A': #ifdef HAVE_LONG_DOUBLE if (flags >= 16 || (flags & 4)) type = TYPE_LONGDOUBLE; else #endif type = TYPE_DOUBLE; break; case 'c': if (flags >= 8) #ifdef HAVE_WINT_T type = TYPE_WIDE_CHAR; #else goto error; #endif else type = TYPE_CHAR; break; #ifdef HAVE_WINT_T case 'C': type = TYPE_WIDE_CHAR; c = 'c'; break; #endif case 's': if (flags >= 8) #ifdef HAVE_WCHAR_T type = TYPE_WIDE_STRING; #else goto error; #endif else type = TYPE_STRING; break; #ifdef HAVE_WCHAR_T case 'S': type = TYPE_WIDE_STRING; c = 's'; break; #endif case 'p': type = TYPE_POINTER; break; case 'n': #ifdef HAVE_LONG_LONG if (flags >= 16 || (flags & 4)) type = TYPE_COUNT_LONGLONGINT_POINTER; else #endif if (flags >= 8) type = TYPE_COUNT_LONGINT_POINTER; else if (flags & 2) type = TYPE_COUNT_SCHAR_POINTER; else if (flags & 1) type = TYPE_COUNT_SHORT_POINTER; else type = TYPE_COUNT_INT_POINTER; break; case '%': type = TYPE_NONE; break; default: /* Unknown conversion character. */ goto error; } } if (type != TYPE_NONE) { dp->arg_index = arg_index; if (dp->arg_index < 0) dp->arg_index = arg_posn++; REGISTER_ARG (dp->arg_index, type); } dp->conversion = c; dp->dir_end = cp; } d->count++; if (d->count >= d_allocated) { char_directive *memory; d_allocated = 2 * d_allocated; memory = realloc (d->dir, d_allocated * sizeof (char_directive)); if (memory == NULL) /* Out of memory. */ goto error; d->dir = memory; } } } d->dir[d->count].dir_start = cp; d->max_width_length = max_width_length; d->max_precision_length = max_precision_length; return 0; error: if (a->arg) free (a->arg); if (d->dir) free (d->dir); return -1; } pkg-config-0.29.1/glib/glib/gnulib/vasnprintf.h0000664000175000017500000000436012275467762016254 00000000000000/* vsprintf with automatic memory allocation. Copyright (C) 2002-2003 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _VASNPRINTF_H #define _VASNPRINTF_H /* Get va_list. */ #include /* Get size_t. */ #include #ifndef __attribute__ /* This feature is available in gcc versions 2.5 and later. */ # if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) || __STRICT_ANSI__ # define __attribute__(Spec) /* empty */ # endif /* The __-protected variants of `format' and `printf' attributes are accepted by gcc versions 2.6.4 (effectively 2.7) and later. */ # if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7) # define __format__ format # define __printf__ printf # endif #endif #ifdef __cplusplus extern "C" { #endif /* Write formatted output to a string dynamically allocated with malloc(). You can pass a preallocated buffer for the result in RESULTBUF and its size in *LENGTHP; otherwise you pass RESULTBUF = NULL. If successful, return the address of the string (this may be = RESULTBUF if no dynamic memory allocation was necessary) and set *LENGTHP to the number of resulting bytes, excluding the trailing NUL. Upon error, set errno and return NULL. */ extern char * asnprintf (char *resultbuf, size_t *lengthp, const char *format, ...) __attribute__ ((__format__ (__printf__, 3, 4))); extern char * vasnprintf (char *resultbuf, size_t *lengthp, const char *format, va_list args) __attribute__ ((__format__ (__printf__, 3, 0))); #ifdef __cplusplus } #endif #endif /* _VASNPRINTF_H */ pkg-config-0.29.1/glib/glib/gnulib/printf-args.c0000664000175000017500000000671012275467762016312 00000000000000/* Decomposed printf argument list. Copyright (C) 1999, 2002-2003 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include "g-gnulib.h" /* Specification. */ #include "printf-args.h" #ifdef STATIC STATIC #endif int printf_fetchargs (va_list args, arguments *a) { unsigned int i; argument *ap; for (i = 0, ap = &a->arg[0]; i < a->count; i++, ap++) switch (ap->type) { case TYPE_SCHAR: ap->a.a_schar = va_arg (args, /*signed char*/ int); break; case TYPE_UCHAR: ap->a.a_uchar = va_arg (args, /*unsigned char*/ int); break; case TYPE_SHORT: ap->a.a_short = va_arg (args, /*short*/ int); break; case TYPE_USHORT: ap->a.a_ushort = va_arg (args, /*unsigned short*/ int); break; case TYPE_INT: ap->a.a_int = va_arg (args, int); break; case TYPE_UINT: ap->a.a_uint = va_arg (args, unsigned int); break; case TYPE_LONGINT: ap->a.a_longint = va_arg (args, long int); break; case TYPE_ULONGINT: ap->a.a_ulongint = va_arg (args, unsigned long int); break; #ifdef HAVE_LONG_LONG case TYPE_LONGLONGINT: ap->a.a_longlongint = va_arg (args, long long int); break; case TYPE_ULONGLONGINT: ap->a.a_ulonglongint = va_arg (args, unsigned long long int); break; #endif #ifdef HAVE_INT64_AND_I64 case TYPE_INT64: ap->a.a_int64 = va_arg (args, __int64); break; case TYPE_UINT64: ap->a.a_uint64 = va_arg (args, unsigned __int64); break; #endif case TYPE_DOUBLE: ap->a.a_double = va_arg (args, double); break; #ifdef HAVE_LONG_DOUBLE case TYPE_LONGDOUBLE: ap->a.a_longdouble = va_arg (args, long double); break; #endif case TYPE_CHAR: ap->a.a_char = va_arg (args, int); break; #ifdef HAVE_WINT_T case TYPE_WIDE_CHAR: #ifdef _WIN32 ap->a.a_wide_char = va_arg (args, int); #else ap->a.a_wide_char = va_arg (args, wint_t); #endif break; #endif case TYPE_STRING: ap->a.a_string = va_arg (args, const char *); break; #ifdef HAVE_WCHAR_T case TYPE_WIDE_STRING: ap->a.a_wide_string = va_arg (args, const wchar_t *); break; #endif case TYPE_POINTER: ap->a.a_pointer = va_arg (args, void *); break; case TYPE_COUNT_SCHAR_POINTER: ap->a.a_count_schar_pointer = va_arg (args, signed char *); break; case TYPE_COUNT_SHORT_POINTER: ap->a.a_count_short_pointer = va_arg (args, short *); break; case TYPE_COUNT_INT_POINTER: ap->a.a_count_int_pointer = va_arg (args, int *); break; case TYPE_COUNT_LONGINT_POINTER: ap->a.a_count_longint_pointer = va_arg (args, long int *); break; #ifdef HAVE_LONG_LONG case TYPE_COUNT_LONGLONGINT_POINTER: ap->a.a_count_longlongint_pointer = va_arg (args, long long int *); break; #endif default: /* Unknown type. */ return -1; } return 0; } pkg-config-0.29.1/glib/glib/gnulib/printf-args.h0000664000175000017500000000572212275467762016321 00000000000000/* Decomposed printf argument list. Copyright (C) 1999, 2002-2003 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _PRINTF_ARGS_H #define _PRINTF_ARGS_H /* Get wchar_t. */ #ifdef HAVE_WCHAR_T # include #endif /* Get wint_t. */ #ifdef HAVE_WINT_T # include #endif /* Get va_list. */ #include /* Argument types */ typedef enum { TYPE_NONE, TYPE_SCHAR, TYPE_UCHAR, TYPE_SHORT, TYPE_USHORT, TYPE_INT, TYPE_UINT, TYPE_LONGINT, TYPE_ULONGINT, #ifdef HAVE_LONG_LONG TYPE_LONGLONGINT, TYPE_ULONGLONGINT, #endif #ifdef HAVE_INT64_AND_I64 TYPE_INT64, TYPE_UINT64, #endif TYPE_DOUBLE, #ifdef HAVE_LONG_DOUBLE TYPE_LONGDOUBLE, #endif TYPE_CHAR, #ifdef HAVE_WINT_T TYPE_WIDE_CHAR, #endif TYPE_STRING, #ifdef HAVE_WCHAR_T TYPE_WIDE_STRING, #endif TYPE_POINTER, TYPE_COUNT_SCHAR_POINTER, TYPE_COUNT_SHORT_POINTER, TYPE_COUNT_INT_POINTER, TYPE_COUNT_LONGINT_POINTER #ifdef HAVE_LONG_LONG , TYPE_COUNT_LONGLONGINT_POINTER #endif } arg_type; /* Polymorphic argument */ typedef struct { arg_type type; union { signed char a_schar; unsigned char a_uchar; short a_short; unsigned short a_ushort; int a_int; unsigned int a_uint; long int a_longint; unsigned long int a_ulongint; #ifdef HAVE_LONG_LONG long long int a_longlongint; unsigned long long int a_ulonglongint; #endif #ifdef HAVE_INT64_AND_I64 __int64 a_int64; unsigned __int64 a_uint64; #endif float a_float; double a_double; #ifdef HAVE_LONG_DOUBLE long double a_longdouble; #endif int a_char; #ifdef HAVE_WINT_T wint_t a_wide_char; #endif const char* a_string; #ifdef HAVE_WCHAR_T const wchar_t* a_wide_string; #endif void* a_pointer; signed char * a_count_schar_pointer; short * a_count_short_pointer; int * a_count_int_pointer; long int * a_count_longint_pointer; #ifdef HAVE_LONG_LONG long long int * a_count_longlongint_pointer; #endif } a; } argument; typedef struct { unsigned int count; argument *arg; } arguments; /* Fetch the arguments, putting them into a. */ #ifdef STATIC STATIC #else extern #endif int printf_fetchargs (va_list args, arguments *a); #endif /* _PRINTF_ARGS_H */ pkg-config-0.29.1/glib/glib/gnulib/asnprintf.c0000664000175000017500000000225112275467762016056 00000000000000/* Formatted output to strings. Copyright (C) 1999, 2002 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include "g-gnulib.h" /* Specification. */ #include "vasnprintf.h" #include char * asnprintf (char *resultbuf, size_t *lengthp, const char *format, ...) { va_list args; char *result; va_start (args, format); result = vasnprintf (resultbuf, lengthp, format, args); va_end (args); return result; } pkg-config-0.29.1/glib/glib/gnulib/printf.c0000664000175000017500000000643412275467762015363 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 2003 Matthias Clasen * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the GLib Team and others 2003. See the AUTHORS * file for a list of people on the GLib Team. See the ChangeLog * files for a list of changes. These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include "g-gnulib.h" #include "vasnprintf.h" #include "printf.h" int _g_gnulib_printf (char const *format, ...) { va_list args; int retval; va_start (args, format); retval = _g_gnulib_vprintf (format, args); va_end (args); return retval; } int _g_gnulib_fprintf (FILE *file, char const *format, ...) { va_list args; int retval; va_start (args, format); retval = _g_gnulib_vfprintf (file, format, args); va_end (args); return retval; } int _g_gnulib_sprintf (char *string, char const *format, ...) { va_list args; int retval; va_start (args, format); retval = _g_gnulib_vsprintf (string, format, args); va_end (args); return retval; } int _g_gnulib_snprintf (char *string, size_t n, char const *format, ...) { va_list args; int retval; va_start (args, format); retval = _g_gnulib_vsnprintf (string, n, format, args); va_end (args); return retval; } int _g_gnulib_vprintf (char const *format, va_list args) { return _g_gnulib_vfprintf (stdout, format, args); } int _g_gnulib_vfprintf (FILE *file, char const *format, va_list args) { char *result; size_t length; result = vasnprintf (NULL, &length, format, args); if (result == NULL) return -1; fwrite (result, 1, length, file); free (result); return length; } int _g_gnulib_vsprintf (char *string, char const *format, va_list args) { char *result; size_t length; result = vasnprintf (NULL, &length, format, args); if (result == NULL) return -1; memcpy (string, result, length + 1); free (result); return length; } int _g_gnulib_vsnprintf (char *string, size_t n, char const *format, va_list args) { char *result; size_t length; result = vasnprintf (NULL, &length, format, args); if (result == NULL) return -1; if (n > 0) { memcpy (string, result, MIN(length + 1, n)); string[n - 1] = 0; } free (result); return length; } int _g_gnulib_vasprintf (char **result, char const *format, va_list args) { size_t length; *result = vasnprintf (NULL, &length, format, args); if (*result == NULL) return -1; return length; } pkg-config-0.29.1/glib/glib/gnulib/Makefile.am0000664000175000017500000000076712651243552015737 00000000000000## Process this file with automake to produce Makefile.in include $(top_srcdir)/glib.mk AM_CPPFLAGS = \ $(glib_INCLUDES) \ -DG_LOG_DOMAIN=\"GLib\" \ $(GLIB_DEBUG_FLAGS) \ -DG_DISABLE_DEPRECATED \ -DGLIB_COMPILATION noinst_LTLIBRARIES += libgnulib.la libgnulib_la_CFLAGS = $(GLIB_HIDDEN_VISIBILITY_CFLAGS) libgnulib_la_SOURCES = \ asnprintf.c \ printf-args.c \ printf-args.h \ printf-parse.c \ printf-parse.h \ vasnprintf.c \ vasnprintf.h \ printf.c \ printf.h \ g-gnulib.h pkg-config-0.29.1/glib/glib/gnulib/printf.h0000664000175000017500000000334212275467762015363 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 2003 Matthias Clasen * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __GNULIB_PRINTF_H__ #define __GNULIB_PRINTF_H__ #include #include int _g_gnulib_printf (char const *format, ...); int _g_gnulib_fprintf (FILE *file, char const *format, ...); int _g_gnulib_sprintf (char *string, char const *format, ...); int _g_gnulib_snprintf (char *string, size_t n, char const *format, ...); int _g_gnulib_vprintf (char const *format, va_list args); int _g_gnulib_vfprintf (FILE *file, char const *format, va_list args); int _g_gnulib_vsprintf (char *string, char const *format, va_list args); int _g_gnulib_vsnprintf (char *string, size_t n, char const *format, va_list args); int _g_gnulib_vasprintf (char **result, char const *format, va_list args); #endif /* __GNULIB_PRINTF_H__ */ pkg-config-0.29.1/glib/glib/gnulib/vasnprintf.c0000664000175000017500000006037412651243552016241 00000000000000/* vsprintf with automatic memory allocation. Copyright (C) 1999, 2002-2003 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _WIN32 /* Tell glibc's to provide a prototype for snprintf(). This must come before because may include , and once has been included, it's too late. */ #ifndef _GNU_SOURCE # define _GNU_SOURCE 1 #endif #endif #ifdef HAVE_CONFIG_H # include #endif #include "glib/galloca.h" #include "g-gnulib.h" /* Specification. */ #include "vasnprintf.h" #include /* snprintf(), sprintf() */ #include /* abort(), malloc(), realloc(), free() */ #include /* memcpy(), strlen() */ #include /* errno */ #include /* CHAR_BIT */ #include /* DBL_MAX_EXP, LDBL_MAX_EXP */ #include "printf-parse.h" #ifdef HAVE_WCHAR_T # ifdef HAVE_WCSLEN # define local_wcslen wcslen # else /* Solaris 2.5.1 has wcslen() in a separate library libw.so. To avoid a dependency towards this library, here is a local substitute. Define this substitute only once, even if this file is included twice in the same compilation unit. */ # ifndef local_wcslen_defined # define local_wcslen_defined 1 static size_t local_wcslen (const wchar_t *s) { const wchar_t *ptr; for (ptr = s; *ptr != (wchar_t) 0; ptr++) ; return ptr - s; } # endif # endif #endif /* For those losing systems which don't have 'alloca' we have to add some additional code emulating it. */ #ifdef HAVE_ALLOCA # define freea(p) /* nothing */ #else # define alloca(n) malloc (n) # define freea(p) free (p) #endif #ifndef HAVE_LONG_LONG_FORMAT static int print_long_long (char *buf, int len, int width, int precision, unsigned long flags, char conversion, unsigned long long number) { int negative = FALSE; char buffer[128]; char *bufferend; char *pointer; int base; static const char *upper = "0123456789ABCDEFX"; static const char *lower = "0123456789abcdefx"; const char *digits; int i; char *p; int count; #define EMIT(c) \ if (p - buf == len - 1) \ { \ *p++ = '\0'; \ return len; \ } \ else \ *p++ = c; p = buf; switch (conversion) { case 'o': base = 8; digits = lower; negative = FALSE; break; case 'x': base = 16; digits = lower; negative = FALSE; break; case 'X': base = 16; digits = upper; negative = FALSE; break; default: base = 10; digits = lower; negative = (long long)number < 0; if (negative) number = -((long long)number); break; } /* Build number */ pointer = bufferend = &buffer[sizeof(buffer) - 1]; *pointer-- = '\0'; for (i = 1; i < (int)sizeof(buffer); i++) { *pointer-- = digits[number % base]; number /= base; if (number == 0) break; } /* Adjust width */ width -= (bufferend - pointer) - 1; /* Adjust precision */ if (precision != -1) { precision -= (bufferend - pointer) - 1; if (precision < 0) precision = 0; flags |= FLAG_ZERO; } /* Adjust width further */ if (negative || (flags & FLAG_SHOWSIGN) || (flags & FLAG_SPACE)) width--; if (flags & FLAG_ALT) { switch (base) { case 16: width -= 2; break; case 8: width--; break; default: break; } } /* Output prefixes spaces if needed */ if (! ((flags & FLAG_LEFT) || ((flags & FLAG_ZERO) && (precision == -1)))) { count = (precision == -1) ? 0 : precision; while (width-- > count) *p++ = ' '; } /* width has been adjusted for signs and alternatives */ if (negative) { EMIT ('-'); } else if (flags & FLAG_SHOWSIGN) { EMIT('+'); } else if (flags & FLAG_SPACE) { EMIT(' '); } if (flags & FLAG_ALT) { switch (base) { case 8: EMIT('0'); break; case 16: EMIT('0'); EMIT(digits[16]); break; default: break; } /* switch base */ } /* Output prefixed zero padding if needed */ if (flags & FLAG_ZERO) { if (precision == -1) precision = width; while (precision-- > 0) { EMIT('0'); width--; } } /* Output the number itself */ while (*(++pointer)) { EMIT(*pointer); } /* Output trailing spaces if needed */ if (flags & FLAG_LEFT) { while (width-- > 0) EMIT(' '); } EMIT('\0'); return p - buf - 1; } #endif char * vasnprintf (char *resultbuf, size_t *lengthp, const char *format, va_list args) { char_directives d; arguments a; if (printf_parse (format, &d, &a) < 0) { errno = EINVAL; return NULL; } #define CLEANUP() \ free (d.dir); \ if (a.arg) \ free (a.arg); if (printf_fetchargs (args, &a) < 0) { CLEANUP (); errno = EINVAL; return NULL; } { char *buf = (char *) alloca (7 + d.max_width_length + d.max_precision_length + 6); const char *cp; unsigned int i; char_directive *dp; /* Output string accumulator. */ char *result; size_t allocated; size_t length; if (resultbuf != NULL) { result = resultbuf; allocated = *lengthp; } else { result = NULL; allocated = 0; } length = 0; /* Invariants: result is either == resultbuf or == NULL or malloc-allocated. If length > 0, then result != NULL. */ #define ENSURE_ALLOCATION(needed) \ if ((needed) > allocated) \ { \ char *memory; \ \ allocated = (allocated > 0 ? 2 * allocated : 12); \ if ((needed) > allocated) \ allocated = (needed); \ if (result == resultbuf || result == NULL) \ memory = (char *) malloc (allocated); \ else \ memory = (char *) realloc (result, allocated); \ \ if (memory == NULL) \ { \ if (!(result == resultbuf || result == NULL)) \ free (result); \ freea (buf); \ CLEANUP (); \ errno = ENOMEM; \ return NULL; \ } \ if (result == resultbuf && length > 0) \ memcpy (memory, result, length); \ result = memory; \ } for (cp = format, i = 0, dp = &d.dir[0]; ; cp = dp->dir_end, i++, dp++) { if (cp != dp->dir_start) { size_t n = dp->dir_start - cp; ENSURE_ALLOCATION (length + n); memcpy (result + length, cp, n); length += n; } if (i == d.count) break; /* Execute a single directive. */ if (dp->conversion == '%') { if (!(dp->arg_index < 0)) abort (); ENSURE_ALLOCATION (length + 1); result[length] = '%'; length += 1; } else { if (!(dp->arg_index >= 0)) abort (); if (dp->conversion == 'n') { switch (a.arg[dp->arg_index].type) { case TYPE_COUNT_SCHAR_POINTER: *a.arg[dp->arg_index].a.a_count_schar_pointer = length; break; case TYPE_COUNT_SHORT_POINTER: *a.arg[dp->arg_index].a.a_count_short_pointer = length; break; case TYPE_COUNT_INT_POINTER: *a.arg[dp->arg_index].a.a_count_int_pointer = length; break; case TYPE_COUNT_LONGINT_POINTER: *a.arg[dp->arg_index].a.a_count_longint_pointer = length; break; #ifdef HAVE_LONG_LONG case TYPE_COUNT_LONGLONGINT_POINTER: *a.arg[dp->arg_index].a.a_count_longlongint_pointer = length; break; #endif default: abort (); } } else { arg_type type = a.arg[dp->arg_index].type; char *p; unsigned int prefix_count; int prefixes[2]; #if !HAVE_SNPRINTF unsigned int tmp_length; char tmpbuf[700]; char *tmp; /* Allocate a temporary buffer of sufficient size for calling sprintf. */ { unsigned int width; unsigned int precision; width = 0; if (dp->width_start != dp->width_end) { if (dp->width_arg_index >= 0) { int arg; if (!(a.arg[dp->width_arg_index].type == TYPE_INT)) abort (); arg = a.arg[dp->width_arg_index].a.a_int; width = (arg < 0 ? -arg : arg); } else { const char *digitp = dp->width_start; do width = width * 10 + (*digitp++ - '0'); while (digitp != dp->width_end); } } precision = 6; if (dp->precision_start != dp->precision_end) { if (dp->precision_arg_index >= 0) { int arg; if (!(a.arg[dp->precision_arg_index].type == TYPE_INT)) abort (); arg = a.arg[dp->precision_arg_index].a.a_int; precision = (arg < 0 ? 0 : arg); } else { const char *digitp = dp->precision_start + 1; precision = 0; while (digitp != dp->precision_end) precision = precision * 10 + (*digitp++ - '0'); } } switch (dp->conversion) { case 'd': case 'i': case 'u': # ifdef HAVE_LONG_LONG if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT) tmp_length = (unsigned int) (sizeof (unsigned long long) * CHAR_BIT * 0.30103 /* binary -> decimal */ * 2 /* estimate for FLAG_GROUP */ ) + 1 /* turn floor into ceil */ + 1; /* account for leading sign */ else # endif if (type == TYPE_LONGINT || type == TYPE_ULONGINT) tmp_length = (unsigned int) (sizeof (unsigned long) * CHAR_BIT * 0.30103 /* binary -> decimal */ * 2 /* estimate for FLAG_GROUP */ ) + 1 /* turn floor into ceil */ + 1; /* account for leading sign */ else tmp_length = (unsigned int) (sizeof (unsigned int) * CHAR_BIT * 0.30103 /* binary -> decimal */ * 2 /* estimate for FLAG_GROUP */ ) + 1 /* turn floor into ceil */ + 1; /* account for leading sign */ break; case 'o': # ifdef HAVE_LONG_LONG if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT) tmp_length = (unsigned int) (sizeof (unsigned long long) * CHAR_BIT * 0.333334 /* binary -> octal */ ) + 1 /* turn floor into ceil */ + 1; /* account for leading sign */ else # endif if (type == TYPE_LONGINT || type == TYPE_ULONGINT) tmp_length = (unsigned int) (sizeof (unsigned long) * CHAR_BIT * 0.333334 /* binary -> octal */ ) + 1 /* turn floor into ceil */ + 1; /* account for leading sign */ else tmp_length = (unsigned int) (sizeof (unsigned int) * CHAR_BIT * 0.333334 /* binary -> octal */ ) + 1 /* turn floor into ceil */ + 1; /* account for leading sign */ break; case 'x': case 'X': # ifdef HAVE_LONG_LONG if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT) tmp_length = (unsigned int) (sizeof (unsigned long long) * CHAR_BIT * 0.25 /* binary -> hexadecimal */ ) + 1 /* turn floor into ceil */ + 2; /* account for leading sign or alternate form */ else # endif # ifdef HAVE_INT64_AND_I64 if (type == TYPE_INT64 || type == TYPE_UINT64) tmp_length = (unsigned int) (sizeof (unsigned __int64) * CHAR_BIT * 0.25 /* binary -> hexadecimal */ ) + 1 /* turn floor into ceil */ + 2; /* account for leading sign or alternate form */ else # endif if (type == TYPE_LONGINT || type == TYPE_ULONGINT) tmp_length = (unsigned int) (sizeof (unsigned long) * CHAR_BIT * 0.25 /* binary -> hexadecimal */ ) + 1 /* turn floor into ceil */ + 2; /* account for leading sign or alternate form */ else tmp_length = (unsigned int) (sizeof (unsigned int) * CHAR_BIT * 0.25 /* binary -> hexadecimal */ ) + 1 /* turn floor into ceil */ + 2; /* account for leading sign or alternate form */ break; case 'f': case 'F': # ifdef HAVE_LONG_DOUBLE if (type == TYPE_LONGDOUBLE) tmp_length = (unsigned int) (LDBL_MAX_EXP * 0.30103 /* binary -> decimal */ * 2 /* estimate for FLAG_GROUP */ ) + 1 /* turn floor into ceil */ + precision + 10; /* sign, decimal point etc. */ else # endif tmp_length = (unsigned int) (DBL_MAX_EXP * 0.30103 /* binary -> decimal */ * 2 /* estimate for FLAG_GROUP */ ) + 1 /* turn floor into ceil */ + precision + 10; /* sign, decimal point etc. */ break; case 'e': case 'E': case 'g': case 'G': case 'a': case 'A': tmp_length = precision + 12; /* sign, decimal point, exponent etc. */ break; case 'c': # ifdef HAVE_WINT_T if (type == TYPE_WIDE_CHAR) tmp_length = MB_CUR_MAX; else # endif tmp_length = 1; break; case 's': # ifdef HAVE_WCHAR_T if (type == TYPE_WIDE_STRING) tmp_length = (a.arg[dp->arg_index].a.a_wide_string == NULL ? 6 /* wcslen(L"(null)") */ : local_wcslen (a.arg[dp->arg_index].a.a_wide_string)) * MB_CUR_MAX; else # endif tmp_length = a.arg[dp->arg_index].a.a_string == NULL ? 6 /* strlen("(null)") */ : strlen (a.arg[dp->arg_index].a.a_string); break; case 'p': tmp_length = (unsigned int) (sizeof (void *) * CHAR_BIT * 0.25 /* binary -> hexadecimal */ ) + 1 /* turn floor into ceil */ + 2; /* account for leading 0x */ break; default: abort (); } if (tmp_length < width) tmp_length = width; tmp_length++; /* account for trailing NUL */ } if (tmp_length <= sizeof (tmpbuf)) tmp = tmpbuf; else { tmp = (char *) malloc (tmp_length); if (tmp == NULL) { /* Out of memory. */ if (!(result == resultbuf || result == NULL)) free (result); freea (buf); CLEANUP (); errno = ENOMEM; return NULL; } } #endif /* Construct the format string for calling snprintf or sprintf. */ p = buf; *p++ = '%'; if (dp->flags & FLAG_GROUP) *p++ = '\''; if (dp->flags & FLAG_LEFT) *p++ = '-'; if (dp->flags & FLAG_SHOWSIGN) *p++ = '+'; if (dp->flags & FLAG_SPACE) *p++ = ' '; if (dp->flags & FLAG_ALT) *p++ = '#'; if (dp->flags & FLAG_ZERO) *p++ = '0'; if (dp->width_start != dp->width_end) { size_t n = dp->width_end - dp->width_start; memcpy (p, dp->width_start, n); p += n; } if (dp->precision_start != dp->precision_end) { size_t n = dp->precision_end - dp->precision_start; memcpy (p, dp->precision_start, n); p += n; } switch (type) { #ifdef HAVE_INT64_AND_I64 case TYPE_INT64: case TYPE_UINT64: *p++ = 'I'; *p++ = '6'; *p++ = '4'; break; #endif #ifdef HAVE_LONG_LONG case TYPE_LONGLONGINT: case TYPE_ULONGLONGINT: #ifdef HAVE_INT64_AND_I64 /* The system (sn)printf uses %I64. Also assume * that long long == __int64. */ *p++ = 'I'; *p++ = '6'; *p++ = '4'; break; #else *p++ = 'l'; /*FALLTHROUGH*/ #endif #endif case TYPE_LONGINT: case TYPE_ULONGINT: #ifdef HAVE_WINT_T case TYPE_WIDE_CHAR: #endif #ifdef HAVE_WCHAR_T case TYPE_WIDE_STRING: #endif *p++ = 'l'; break; #ifdef HAVE_LONG_DOUBLE case TYPE_LONGDOUBLE: *p++ = 'L'; break; #endif default: break; } *p = dp->conversion; #if HAVE_SNPRINTF p[1] = '%'; p[2] = 'n'; p[3] = '\0'; #else p[1] = '\0'; #endif /* Construct the arguments for calling snprintf or sprintf. */ prefix_count = 0; if (dp->width_arg_index >= 0) { if (!(a.arg[dp->width_arg_index].type == TYPE_INT)) abort (); prefixes[prefix_count++] = a.arg[dp->width_arg_index].a.a_int; } if (dp->precision_arg_index >= 0) { if (!(a.arg[dp->precision_arg_index].type == TYPE_INT)) abort (); prefixes[prefix_count++] = a.arg[dp->precision_arg_index].a.a_int; } #if HAVE_SNPRINTF /* Prepare checking whether snprintf returns the count via %n. */ ENSURE_ALLOCATION (length + 1); result[length] = '\0'; #endif for (;;) { size_t maxlen; int count; #if HAVE_SNPRINTF int retcount; #endif maxlen = allocated - length; count = -1; #if HAVE_SNPRINTF retcount = 0; #define SNPRINTF_BUF(arg) \ switch (prefix_count) \ { \ case 0: \ retcount = snprintf (result + length, maxlen, buf, \ arg, &count); \ break; \ case 1: \ retcount = snprintf (result + length, maxlen, buf, \ prefixes[0], arg, &count); \ break; \ case 2: \ retcount = snprintf (result + length, maxlen, buf, \ prefixes[0], prefixes[1], arg, \ &count); \ break; \ default: \ abort (); \ } #else #define SNPRINTF_BUF(arg) \ switch (prefix_count) \ { \ case 0: \ count = sprintf (tmp, buf, arg); \ break; \ case 1: \ count = sprintf (tmp, buf, prefixes[0], arg); \ break; \ case 2: \ count = sprintf (tmp, buf, prefixes[0], prefixes[1],\ arg); \ break; \ default: \ abort (); \ } #endif switch (type) { case TYPE_SCHAR: { int arg = a.arg[dp->arg_index].a.a_schar; SNPRINTF_BUF (arg); } break; case TYPE_UCHAR: { unsigned int arg = a.arg[dp->arg_index].a.a_uchar; SNPRINTF_BUF (arg); } break; case TYPE_SHORT: { int arg = a.arg[dp->arg_index].a.a_short; SNPRINTF_BUF (arg); } break; case TYPE_USHORT: { unsigned int arg = a.arg[dp->arg_index].a.a_ushort; SNPRINTF_BUF (arg); } break; case TYPE_INT: { int arg = a.arg[dp->arg_index].a.a_int; SNPRINTF_BUF (arg); } break; case TYPE_UINT: { unsigned int arg = a.arg[dp->arg_index].a.a_uint; SNPRINTF_BUF (arg); } break; case TYPE_LONGINT: { long int arg = a.arg[dp->arg_index].a.a_longint; SNPRINTF_BUF (arg); } break; case TYPE_ULONGINT: { unsigned long int arg = a.arg[dp->arg_index].a.a_ulongint; SNPRINTF_BUF (arg); } break; #ifdef HAVE_INT64_AND_I64 case TYPE_INT64: { __int64 arg = a.arg[dp->arg_index].a.a_int64; SNPRINTF_BUF (arg); } break; case TYPE_UINT64: { unsigned __int64 arg = a.arg[dp->arg_index].a.a_uint64; SNPRINTF_BUF (arg); } break; #endif #ifdef HAVE_LONG_LONG #ifndef HAVE_LONG_LONG_FORMAT case TYPE_LONGLONGINT: case TYPE_ULONGLONGINT: { unsigned long long int arg = a.arg[dp->arg_index].a.a_ulonglongint; int width; int precision; width = 0; if (dp->width_start != dp->width_end) { if (dp->width_arg_index >= 0) { int arg; if (!(a.arg[dp->width_arg_index].type == TYPE_INT)) abort (); arg = a.arg[dp->width_arg_index].a.a_int; width = (arg < 0 ? -arg : arg); } else { const char *digitp = dp->width_start; do width = width * 10 + (*digitp++ - '0'); while (digitp != dp->width_end); } } precision = -1; if (dp->precision_start != dp->precision_end) { if (dp->precision_arg_index >= 0) { int arg; if (!(a.arg[dp->precision_arg_index].type == TYPE_INT)) abort (); arg = a.arg[dp->precision_arg_index].a.a_int; precision = (arg < 0 ? 0 : arg); } else { const char *digitp = dp->precision_start + 1; precision = 0; do precision = precision * 10 + (*digitp++ - '0'); while (digitp != dp->precision_end); } } #if HAVE_SNPRINTF count = print_long_long (result + length, maxlen, width, precision, dp->flags, dp->conversion, arg); #else count = print_long_long (tmp, tmp_length, width, precision, dp->flags, dp->conversion, arg); #endif } break; #else case TYPE_LONGLONGINT: { long long int arg = a.arg[dp->arg_index].a.a_longlongint; SNPRINTF_BUF (arg); } break; case TYPE_ULONGLONGINT: { unsigned long long int arg = a.arg[dp->arg_index].a.a_ulonglongint; SNPRINTF_BUF (arg); } break; #endif #endif case TYPE_DOUBLE: { double arg = a.arg[dp->arg_index].a.a_double; SNPRINTF_BUF (arg); } break; #ifdef HAVE_LONG_DOUBLE case TYPE_LONGDOUBLE: { long double arg = a.arg[dp->arg_index].a.a_longdouble; SNPRINTF_BUF (arg); } break; #endif case TYPE_CHAR: { int arg = a.arg[dp->arg_index].a.a_char; SNPRINTF_BUF (arg); } break; #ifdef HAVE_WINT_T case TYPE_WIDE_CHAR: { wint_t arg = a.arg[dp->arg_index].a.a_wide_char; SNPRINTF_BUF (arg); } break; #endif case TYPE_STRING: { const char *arg = a.arg[dp->arg_index].a.a_string == NULL ? "(null)" : a.arg[dp->arg_index].a.a_string; SNPRINTF_BUF (arg); } break; #ifdef HAVE_WCHAR_T case TYPE_WIDE_STRING: { const wchar_t *arg = a.arg[dp->arg_index].a.a_wide_string == NULL ? L"(null)" : a.arg[dp->arg_index].a.a_wide_string; SNPRINTF_BUF (arg); } break; #endif case TYPE_POINTER: { void *arg = a.arg[dp->arg_index].a.a_pointer; SNPRINTF_BUF (arg); } break; default: abort (); } #if HAVE_SNPRINTF /* Portability: Not all implementations of snprintf() are ISO C 99 compliant. Determine the number of bytes that snprintf() has produced or would have produced. */ if (count >= 0) { /* Verify that snprintf() has NUL-terminated its result. */ if (count < maxlen && result[length + count] != '\0') abort (); /* Portability hack. */ if (retcount > count) count = retcount; } else { /* snprintf() doesn't understand the '%n' directive. */ if (p[1] != '\0') { /* Don't use the '%n' directive; instead, look at the snprintf() return value. */ p[1] = '\0'; continue; } count = retcount; } #endif /* Attempt to handle failure. */ if (count < 0) { if (!(result == resultbuf || result == NULL)) free (result); freea (buf); CLEANUP (); errno = EINVAL; return NULL; } #if !HAVE_SNPRINTF if (count >= tmp_length) /* tmp_length was incorrectly calculated - fix the code above! */ abort (); #endif /* Make room for the result. */ if (count >= maxlen) { /* Need at least count bytes. But allocate proportionally, to avoid looping eternally if snprintf() reports a too small count. */ size_t n = length + count; if (n < 2 * allocated) n = 2 * allocated; ENSURE_ALLOCATION (n); #if HAVE_SNPRINTF continue; #endif } #if HAVE_SNPRINTF /* The snprintf() result did fit. */ #else /* Append the sprintf() result. */ memcpy (result + length, tmp, count); if (tmp != tmpbuf) free (tmp); #endif length += count; break; } } } } /* Add the final NUL. */ ENSURE_ALLOCATION (length + 1); result[length] = '\0'; if (result != resultbuf && length + 1 < allocated) { /* Shrink the allocated memory if possible. */ char *memory; memory = (char *) realloc (result, length + 1); if (memory != NULL) result = memory; } freea (buf); CLEANUP (); *lengthp = length; return result; } } pkg-config-0.29.1/glib/glib/gnulib/README0000664000175000017500000000210612275467762014565 00000000000000The files asnprintf.c printf-args.c printf-args.h printf-parse.c printf-parse.h vasnprintf.c vasnprintf.h are taken from the vasnprintf module of the GNUlib package, which can be found at: http://www.gnu.org/software/gnulib/ All files have been modified to include g-gnulib.h. vasnprintf.c has also been modified to include support for long long printing if the system printf doesn't. This code is protected by #ifndef HAVE_LONG_LONG_FORMAT. Code has been added to printf-args.[ch], printf-parse.c and vasnprintf.c to support printing of __int64 values with the I64 format modifier. This is protected by #ifdef HAVE_INT64_AND_I64. The files printf.h printf.c g-gnulib.h have been written by me. printf.[hc] contain implementations of the remaining functions in the printf family based on vasnprintf. g-gnulib.h is included by all source files in order to move all exported functions to the _g_gnulib namespace, replace malloc by g_malloc and make sure that snprintf is only used if it implements C99 return value semantics. Matthias Clasen November 1, 2003 pkg-config-0.29.1/glib/glib/gnulib/Makefile.in0000664000175000017500000017130012665370333015743 00000000000000# Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # GLIB - Library of useful C routines VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ installed_test_PROGRAMS = $(am__EXEEXT_1) noinst_PROGRAMS = $(am__EXEEXT_3) check_PROGRAMS = $(am__EXEEXT_2) TESTS = $(am__EXEEXT_1) @OS_WIN32_TRUE@am__append_1 = $(test_programs) $(test_scripts) $(uninstalled_test_programs) $(uninstalled_test_scripts) \ @OS_WIN32_TRUE@ $(dist_test_scripts) $(dist_uninstalled_test_scripts) @ENABLE_ALWAYS_BUILD_TESTS_TRUE@am__append_2 = $(all_test_ltlibs) @ENABLE_ALWAYS_BUILD_TESTS_TRUE@am__append_3 = $(all_test_programs) @ENABLE_ALWAYS_BUILD_TESTS_TRUE@am__append_4 = $(all_test_scripts) @ENABLE_ALWAYS_BUILD_TESTS_TRUE@am__append_5 = $(all_test_data) @ENABLE_ALWAYS_BUILD_TESTS_FALSE@am__append_6 = $(all_test_ltlibs) @ENABLE_ALWAYS_BUILD_TESTS_FALSE@am__append_7 = $(all_test_programs) @ENABLE_ALWAYS_BUILD_TESTS_FALSE@am__append_8 = $(all_test_scripts) @ENABLE_ALWAYS_BUILD_TESTS_FALSE@am__append_9 = $(all_test_data) @ENABLE_INSTALLED_TESTS_TRUE@am__append_10 = $(test_programs) $(installed_test_programs) \ @ENABLE_INSTALLED_TESTS_TRUE@ $(test_extra_programs) $(installed_test_extra_programs) @ENABLE_INSTALLED_TESTS_TRUE@am__append_11 = $(test_scripts) \ @ENABLE_INSTALLED_TESTS_TRUE@ $(installed_test_scripts) \ @ENABLE_INSTALLED_TESTS_TRUE@ $(test_extra_scripts) \ @ENABLE_INSTALLED_TESTS_TRUE@ $(test_installed_extra_scripts) \ @ENABLE_INSTALLED_TESTS_TRUE@ $(dist_test_scripts) \ @ENABLE_INSTALLED_TESTS_TRUE@ $(dist_test_extra_scripts) \ @ENABLE_INSTALLED_TESTS_TRUE@ $(dist_installed_test_scripts) \ @ENABLE_INSTALLED_TESTS_TRUE@ $(dist_installed_test_extra_scripts) @ENABLE_INSTALLED_TESTS_TRUE@am__append_12 = $(test_data) \ @ENABLE_INSTALLED_TESTS_TRUE@ $(installed_test_data) \ @ENABLE_INSTALLED_TESTS_TRUE@ $(dist_test_data) \ @ENABLE_INSTALLED_TESTS_TRUE@ $(dist_installed_test_data) @ENABLE_INSTALLED_TESTS_TRUE@am__append_13 = $(test_ltlibraries) $(installed_test_ltlibraries) @ENABLE_INSTALLED_TESTS_TRUE@am__append_14 = $(installed_test_meta_DATA) subdir = glib/gnulib ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4macros/attributes.m4 \ $(top_srcdir)/m4macros/glibtests.m4 \ $(top_srcdir)/m4macros/libtool.m4 \ $(top_srcdir)/m4macros/ltoptions.m4 \ $(top_srcdir)/m4macros/ltsugar.m4 \ $(top_srcdir)/m4macros/ltversion.m4 \ $(top_srcdir)/m4macros/lt~obsolete.m4 \ $(top_srcdir)/acinclude.m4 $(top_srcdir)/acglib.m4 \ $(top_srcdir)/glib/libcharset/codeset.m4 \ $(top_srcdir)/glib/libcharset/glibc21.m4 \ $(top_srcdir)/m4macros/glib-gettext.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(installed_testdir)" \ "$(DESTDIR)$(installed_testdir)" \ "$(DESTDIR)$(installed_testdir)" \ "$(DESTDIR)$(installed_test_metadir)" \ "$(DESTDIR)$(installed_testdir)" LTLIBRARIES = $(installed_test_LTLIBRARIES) $(noinst_LTLIBRARIES) libgnulib_la_LIBADD = am_libgnulib_la_OBJECTS = libgnulib_la-asnprintf.lo \ libgnulib_la-printf-args.lo libgnulib_la-printf-parse.lo \ libgnulib_la-vasnprintf.lo libgnulib_la-printf.lo libgnulib_la_OBJECTS = $(am_libgnulib_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = libgnulib_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(libgnulib_la_CFLAGS) \ $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ am__EXEEXT_1 = @ENABLE_ALWAYS_BUILD_TESTS_FALSE@am__EXEEXT_2 = $(am__EXEEXT_1) @ENABLE_ALWAYS_BUILD_TESTS_TRUE@am__EXEEXT_3 = $(am__EXEEXT_1) PROGRAMS = $(installed_test_PROGRAMS) $(noinst_PROGRAMS) SCRIPTS = $(installed_test_SCRIPTS) $(noinst_SCRIPTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgnulib_la_SOURCES) DIST_SOURCES = $(libgnulib_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(installed_test_meta_DATA) $(nobase_installed_test_DATA) \ $(noinst_DATA) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ $(top_srcdir)/glib.mk $(top_srcdir)/test-driver README DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ABS_GLIB_RUNTIME_LIBDIR = @ABS_GLIB_RUNTIME_LIBDIR@ ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO = @GIO@ GIO_MODULE_DIR = @GIO_MODULE_DIR@ GLIBC21 = @GLIBC21@ GLIB_BINARY_AGE = @GLIB_BINARY_AGE@ GLIB_DEBUG_FLAGS = @GLIB_DEBUG_FLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_HIDDEN_VISIBILITY_CFLAGS = @GLIB_HIDDEN_VISIBILITY_CFLAGS@ GLIB_INTERFACE_AGE = @GLIB_INTERFACE_AGE@ GLIB_LINK_FLAGS = @GLIB_LINK_FLAGS@ GLIB_MAJOR_VERSION = @GLIB_MAJOR_VERSION@ GLIB_MICRO_VERSION = @GLIB_MICRO_VERSION@ GLIB_MINOR_VERSION = @GLIB_MINOR_VERSION@ GLIB_RUNTIME_LIBDIR = @GLIB_RUNTIME_LIBDIR@ GLIB_VERSION = @GLIB_VERSION@ GLIB_WARN_CFLAGS = @GLIB_WARN_CFLAGS@ GLIB_WIN32_STATIC_COMPILATION_DEFINE = @GLIB_WIN32_STATIC_COMPILATION_DEFINE@ GREP = @GREP@ GSPAWN = @GSPAWN@ GTHREAD_COMPILE_IMPL_DEFINES = @GTHREAD_COMPILE_IMPL_DEFINES@ G_LIBS_EXTRA = @G_LIBS_EXTRA@ G_MODULE_BROKEN_RTLD_GLOBAL = @G_MODULE_BROKEN_RTLD_GLOBAL@ G_MODULE_HAVE_DLERROR = @G_MODULE_HAVE_DLERROR@ G_MODULE_IMPL = @G_MODULE_IMPL@ G_MODULE_LDFLAGS = @G_MODULE_LDFLAGS@ G_MODULE_LIBS = @G_MODULE_LIBS@ G_MODULE_LIBS_EXTRA = @G_MODULE_LIBS_EXTRA@ G_MODULE_NEED_USCORE = @G_MODULE_NEED_USCORE@ G_MODULE_PLUGIN_LIBS = @G_MODULE_PLUGIN_LIBS@ G_MODULE_SUPPORTED = @G_MODULE_SUPPORTED@ G_THREAD_CFLAGS = @G_THREAD_CFLAGS@ G_THREAD_LIBS = @G_THREAD_LIBS@ G_THREAD_LIBS_EXTRA = @G_THREAD_LIBS_EXTRA@ G_THREAD_LIBS_FOR_GTHREAD = @G_THREAD_LIBS_FOR_GTHREAD@ ICONV_LIBS = @ICONV_LIBS@ INDENT = @INDENT@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIB_EXE_MACHINE_FLAG = @LIB_EXE_MACHINE_FLAG@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LTP = @LTP@ LTP_GENHTML = @LTP_GENHTML@ LT_AGE = @LT_AGE@ LT_CURRENT = @LT_CURRENT@ LT_CURRENT_MINUS_AGE = @LT_CURRENT_MINUS_AGE@ LT_RELEASE = @LT_RELEASE@ LT_REVISION = @LT_REVISION@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NAMESER_COMPAT_INCLUDE = @NAMESER_COMPAT_INCLUDE@ NETWORK_LIBS = @NETWORK_LIBS@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PERL = @PERL@ PERL_PATH = @PERL_PATH@ PLATFORMDEP = @PLATFORMDEP@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ REBUILD = @REBUILD@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHTOOL = @SHTOOL@ STRIP = @STRIP@ VERSION = @VERSION@ WINDRES = @WINDRES@ WSPIAPI_INCLUDE = @WSPIAPI_INCLUDE@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ config_h_INCLUDES = @config_h_INCLUDES@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gio_INCLUDES = @gio_INCLUDES@ glib_INCLUDES = @glib_INCLUDES@ gmodule_INCLUDES = @gmodule_INCLUDES@ gobject_INCLUDES = @gobject_INCLUDES@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ installed_test_metadir = @installed_test_metadir@ installed_testdir = @installed_testdir@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ ms_librarian = @ms_librarian@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ #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 $(am__append_14) DISTCLEANFILES = MAINTAINERCLEANFILES = EXTRA_DIST = $(all_dist_test_scripts) $(all_dist_test_data) # 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)) installed_test_LTLIBRARIES = $(am__append_13) installed_test_SCRIPTS = $(am__append_11) nobase_installed_test_DATA = $(am__append_12) noinst_LTLIBRARIES = $(am__append_2) libgnulib.la noinst_SCRIPTS = $(am__append_4) noinst_DATA = $(am__append_5) check_LTLIBRARIES = $(am__append_6) check_SCRIPTS = $(am__append_8) check_DATA = $(am__append_9) # 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) 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_data = $(test_data) $(uninstalled_test_data) \ $(installed_test_data) $(all_dist_test_data) all_dist_test_data = $(dist_test_data) $(dist_uninstalled_test_data) $(dist_installed_test_data) all_test_ltlibs = $(test_ltlibraries) $(uninstalled_test_ltlibraries) $(installed_test_ltlibraries) @ENABLE_INSTALLED_TESTS_TRUE@installed_testcases = $(test_programs) $(installed_test_programs) \ @ENABLE_INSTALLED_TESTS_TRUE@ $(test_scripts) $(installed_test_scripts) \ @ENABLE_INSTALLED_TESTS_TRUE@ $(dist_test_scripts) $(dist_installed_test_scripts) @ENABLE_INSTALLED_TESTS_TRUE@installed_test_meta_DATA = $(installed_testcases:=.test) AM_CPPFLAGS = \ $(glib_INCLUDES) \ -DG_LOG_DOMAIN=\"GLib\" \ $(GLIB_DEBUG_FLAGS) \ -DG_DISABLE_DEPRECATED \ -DGLIB_COMPILATION libgnulib_la_CFLAGS = $(GLIB_HIDDEN_VISIBILITY_CFLAGS) libgnulib_la_SOURCES = \ asnprintf.c \ printf-args.c \ printf-args.h \ printf-parse.c \ printf-parse.h \ vasnprintf.c \ vasnprintf.h \ printf.c \ printf.h \ g-gnulib.h all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/glib.mk $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign glib/gnulib/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign glib/gnulib/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_srcdir)/glib.mk $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-checkLTLIBRARIES: -test -z "$(check_LTLIBRARIES)" || rm -f $(check_LTLIBRARIES) @list='$(check_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } install-installed_testLTLIBRARIES: $(installed_test_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(installed_test_LTLIBRARIES)'; test -n "$(installed_testdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(installed_testdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(installed_testdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(installed_testdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(installed_testdir)"; \ } uninstall-installed_testLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(installed_test_LTLIBRARIES)'; test -n "$(installed_testdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(installed_testdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(installed_testdir)/$$f"; \ done clean-installed_testLTLIBRARIES: -test -z "$(installed_test_LTLIBRARIES)" || rm -f $(installed_test_LTLIBRARIES) @list='$(installed_test_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgnulib.la: $(libgnulib_la_OBJECTS) $(libgnulib_la_DEPENDENCIES) $(EXTRA_libgnulib_la_DEPENDENCIES) $(AM_V_CCLD)$(libgnulib_la_LINK) $(libgnulib_la_OBJECTS) $(libgnulib_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list install-installed_testPROGRAMS: $(installed_test_PROGRAMS) @$(NORMAL_INSTALL) @list='$(installed_test_PROGRAMS)'; test -n "$(installed_testdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(installed_testdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(installed_testdir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ || test -f $$p1 \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(installed_testdir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(installed_testdir)$$dir" || exit $$?; \ } \ ; done uninstall-installed_testPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(installed_test_PROGRAMS)'; test -n "$(installed_testdir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(installed_testdir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(installed_testdir)" && rm -f $$files clean-installed_testPROGRAMS: @list='$(installed_test_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list clean-noinstPROGRAMS: @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list install-installed_testSCRIPTS: $(installed_test_SCRIPTS) @$(NORMAL_INSTALL) @list='$(installed_test_SCRIPTS)'; test -n "$(installed_testdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(installed_testdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(installed_testdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) { files[d] = files[d] " " $$1; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$4, $$1 } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(installed_testdir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(installed_testdir)$$dir" || exit $$?; \ } \ ; done uninstall-installed_testSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(installed_test_SCRIPTS)'; test -n "$(installed_testdir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ dir='$(DESTDIR)$(installed_testdir)'; $(am__uninstall_files_from_dir) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgnulib_la-asnprintf.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgnulib_la-printf-args.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgnulib_la-printf-parse.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgnulib_la-printf.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgnulib_la-vasnprintf.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libgnulib_la-asnprintf.lo: asnprintf.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgnulib_la_CFLAGS) $(CFLAGS) -MT libgnulib_la-asnprintf.lo -MD -MP -MF $(DEPDIR)/libgnulib_la-asnprintf.Tpo -c -o libgnulib_la-asnprintf.lo `test -f 'asnprintf.c' || echo '$(srcdir)/'`asnprintf.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgnulib_la-asnprintf.Tpo $(DEPDIR)/libgnulib_la-asnprintf.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='asnprintf.c' object='libgnulib_la-asnprintf.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgnulib_la_CFLAGS) $(CFLAGS) -c -o libgnulib_la-asnprintf.lo `test -f 'asnprintf.c' || echo '$(srcdir)/'`asnprintf.c libgnulib_la-printf-args.lo: printf-args.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgnulib_la_CFLAGS) $(CFLAGS) -MT libgnulib_la-printf-args.lo -MD -MP -MF $(DEPDIR)/libgnulib_la-printf-args.Tpo -c -o libgnulib_la-printf-args.lo `test -f 'printf-args.c' || echo '$(srcdir)/'`printf-args.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgnulib_la-printf-args.Tpo $(DEPDIR)/libgnulib_la-printf-args.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='printf-args.c' object='libgnulib_la-printf-args.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgnulib_la_CFLAGS) $(CFLAGS) -c -o libgnulib_la-printf-args.lo `test -f 'printf-args.c' || echo '$(srcdir)/'`printf-args.c libgnulib_la-printf-parse.lo: printf-parse.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgnulib_la_CFLAGS) $(CFLAGS) -MT libgnulib_la-printf-parse.lo -MD -MP -MF $(DEPDIR)/libgnulib_la-printf-parse.Tpo -c -o libgnulib_la-printf-parse.lo `test -f 'printf-parse.c' || echo '$(srcdir)/'`printf-parse.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgnulib_la-printf-parse.Tpo $(DEPDIR)/libgnulib_la-printf-parse.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='printf-parse.c' object='libgnulib_la-printf-parse.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgnulib_la_CFLAGS) $(CFLAGS) -c -o libgnulib_la-printf-parse.lo `test -f 'printf-parse.c' || echo '$(srcdir)/'`printf-parse.c libgnulib_la-vasnprintf.lo: vasnprintf.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgnulib_la_CFLAGS) $(CFLAGS) -MT libgnulib_la-vasnprintf.lo -MD -MP -MF $(DEPDIR)/libgnulib_la-vasnprintf.Tpo -c -o libgnulib_la-vasnprintf.lo `test -f 'vasnprintf.c' || echo '$(srcdir)/'`vasnprintf.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgnulib_la-vasnprintf.Tpo $(DEPDIR)/libgnulib_la-vasnprintf.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='vasnprintf.c' object='libgnulib_la-vasnprintf.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgnulib_la_CFLAGS) $(CFLAGS) -c -o libgnulib_la-vasnprintf.lo `test -f 'vasnprintf.c' || echo '$(srcdir)/'`vasnprintf.c libgnulib_la-printf.lo: printf.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgnulib_la_CFLAGS) $(CFLAGS) -MT libgnulib_la-printf.lo -MD -MP -MF $(DEPDIR)/libgnulib_la-printf.Tpo -c -o libgnulib_la-printf.lo `test -f 'printf.c' || echo '$(srcdir)/'`printf.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgnulib_la-printf.Tpo $(DEPDIR)/libgnulib_la-printf.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='printf.c' object='libgnulib_la-printf.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgnulib_la_CFLAGS) $(CFLAGS) -c -o libgnulib_la-printf.lo `test -f 'printf.c' || echo '$(srcdir)/'`printf.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-installed_test_metaDATA: $(installed_test_meta_DATA) @$(NORMAL_INSTALL) @list='$(installed_test_meta_DATA)'; test -n "$(installed_test_metadir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(installed_test_metadir)'"; \ $(MKDIR_P) "$(DESTDIR)$(installed_test_metadir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(installed_test_metadir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(installed_test_metadir)" || exit $$?; \ done uninstall-installed_test_metaDATA: @$(NORMAL_UNINSTALL) @list='$(installed_test_meta_DATA)'; test -n "$(installed_test_metadir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(installed_test_metadir)'; $(am__uninstall_files_from_dir) install-nobase_installed_testDATA: $(nobase_installed_test_DATA) @$(NORMAL_INSTALL) @list='$(nobase_installed_test_DATA)'; test -n "$(installed_testdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(installed_testdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(installed_testdir)" || exit 1; \ fi; \ $(am__nobase_list) | while read dir files; do \ xfiles=; for file in $$files; do \ if test -f "$$file"; then xfiles="$$xfiles $$file"; \ else xfiles="$$xfiles $(srcdir)/$$file"; fi; done; \ test -z "$$xfiles" || { \ test "x$$dir" = x. || { \ echo " $(MKDIR_P) '$(DESTDIR)$(installed_testdir)/$$dir'"; \ $(MKDIR_P) "$(DESTDIR)$(installed_testdir)/$$dir"; }; \ echo " $(INSTALL_DATA) $$xfiles '$(DESTDIR)$(installed_testdir)/$$dir'"; \ $(INSTALL_DATA) $$xfiles "$(DESTDIR)$(installed_testdir)/$$dir" || exit $$?; }; \ done uninstall-nobase_installed_testDATA: @$(NORMAL_UNINSTALL) @list='$(nobase_installed_test_DATA)'; test -n "$(installed_testdir)" || list=; \ $(am__nobase_strip_setup); files=`$(am__nobase_strip)`; \ dir='$(DESTDIR)$(installed_testdir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ elif test -n "$$redo_logs"; then \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_LTLIBRARIES) $(check_PROGRAMS) $(check_SCRIPTS) $(check_DATA) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_LTLIBRARIES) $(check_PROGRAMS) \ $(check_SCRIPTS) $(check_DATA) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check-local check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(SCRIPTS) $(DATA) installdirs: for dir in "$(DESTDIR)$(installed_testdir)" "$(DESTDIR)$(installed_testdir)" "$(DESTDIR)$(installed_testdir)" "$(DESTDIR)$(installed_test_metadir)" "$(DESTDIR)$(installed_testdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-checkLTLIBRARIES clean-checkPROGRAMS clean-generic \ clean-installed_testLTLIBRARIES clean-installed_testPROGRAMS \ clean-libtool clean-noinstLTLIBRARIES clean-noinstPROGRAMS \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-installed_testLTLIBRARIES \ install-installed_testPROGRAMS install-installed_testSCRIPTS \ install-installed_test_metaDATA \ install-nobase_installed_testDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-installed_testLTLIBRARIES \ uninstall-installed_testPROGRAMS \ uninstall-installed_testSCRIPTS \ uninstall-installed_test_metaDATA \ uninstall-nobase_installed_testDATA .MAKE: all check check-am install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am \ check-local clean clean-checkLTLIBRARIES clean-checkPROGRAMS \ clean-generic clean-installed_testLTLIBRARIES \ clean-installed_testPROGRAMS clean-libtool \ clean-noinstLTLIBRARIES clean-noinstPROGRAMS cscopelist-am \ ctags ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-installed_testLTLIBRARIES \ install-installed_testPROGRAMS install-installed_testSCRIPTS \ install-installed_test_metaDATA install-man \ install-nobase_installed_testDATA install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am \ uninstall-installed_testLTLIBRARIES \ uninstall-installed_testPROGRAMS \ uninstall-installed_testSCRIPTS \ uninstall-installed_test_metaDATA \ uninstall-nobase_installed_testDATA .PRECIOUS: Makefile ### testing rules # test: run all tests in cwd and subdirs test: test-nonrecursive @OS_UNIX_TRUE@ @ for subdir in $(SUBDIRS) . ; do \ @OS_UNIX_TRUE@ test "$$subdir" = "." -o "$$subdir" = "po" || \ @OS_UNIX_TRUE@ ( cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $@ ) || exit $? ; \ @OS_UNIX_TRUE@ done # test-nonrecursive: run tests only in cwd @OS_UNIX_TRUE@test-nonrecursive: ${TEST_PROGS} @OS_UNIX_TRUE@ @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} @OS_UNIX_FALSE@test-nonrecursive: # 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 ; \ echo '' >> $@.xml ; \ echo '' >> $@.xml ; \ echo ' $(PACKAGE)' >> $@.xml ; \ echo ' $(VERSION)' >> $@.xml ; \ echo " $$REVISION" >> $@.xml ; \ echo '' >> $@.xml ; \ for lf in `ls -L "$$GTESTER_LOGDIR"/.` ; do \ sed '1,1s/^?]*?>//' <"$$GTESTER_LOGDIR"/"$$lf" >> $@.xml ; \ done ; \ echo >> $@.xml ; \ echo '' >> $@.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 @ENABLE_INSTALLED_TESTS_TRUE@%.test: %$(EXEEXT) Makefile @ENABLE_INSTALLED_TESTS_TRUE@ $(AM_V_GEN) (echo '[Test]' > $@.tmp; \ @ENABLE_INSTALLED_TESTS_TRUE@ echo 'Type=session' >> $@.tmp; \ @ENABLE_INSTALLED_TESTS_TRUE@ echo 'Exec=$(installed_testdir)/$<' >> $@.tmp; \ @ENABLE_INSTALLED_TESTS_TRUE@ mv $@.tmp $@) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: pkg-config-0.29.1/glib/glib/Makefile.in0000664000175000017500000052614712665370333014500 00000000000000# Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # GLIB - Library of useful C routines VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ installed_test_PROGRAMS = $(am__EXEEXT_1) noinst_PROGRAMS = $(am__EXEEXT_3) check_PROGRAMS = $(am__EXEEXT_2) TESTS = $(am__EXEEXT_1) @OS_WIN32_TRUE@am__append_1 = $(test_programs) $(test_scripts) $(uninstalled_test_programs) $(uninstalled_test_scripts) \ @OS_WIN32_TRUE@ $(dist_test_scripts) $(dist_uninstalled_test_scripts) @ENABLE_ALWAYS_BUILD_TESTS_TRUE@am__append_2 = $(all_test_ltlibs) @ENABLE_ALWAYS_BUILD_TESTS_TRUE@am__append_3 = $(all_test_programs) @ENABLE_ALWAYS_BUILD_TESTS_TRUE@am__append_4 = $(all_test_scripts) @ENABLE_ALWAYS_BUILD_TESTS_TRUE@am__append_5 = $(all_test_data) @ENABLE_ALWAYS_BUILD_TESTS_FALSE@am__append_6 = $(all_test_ltlibs) @ENABLE_ALWAYS_BUILD_TESTS_FALSE@am__append_7 = $(all_test_programs) @ENABLE_ALWAYS_BUILD_TESTS_FALSE@am__append_8 = $(all_test_scripts) @ENABLE_ALWAYS_BUILD_TESTS_FALSE@am__append_9 = $(all_test_data) @ENABLE_INSTALLED_TESTS_TRUE@am__append_10 = $(test_programs) $(installed_test_programs) \ @ENABLE_INSTALLED_TESTS_TRUE@ $(test_extra_programs) $(installed_test_extra_programs) @ENABLE_INSTALLED_TESTS_TRUE@am__append_11 = $(test_scripts) \ @ENABLE_INSTALLED_TESTS_TRUE@ $(installed_test_scripts) \ @ENABLE_INSTALLED_TESTS_TRUE@ $(test_extra_scripts) \ @ENABLE_INSTALLED_TESTS_TRUE@ $(test_installed_extra_scripts) \ @ENABLE_INSTALLED_TESTS_TRUE@ $(dist_test_scripts) \ @ENABLE_INSTALLED_TESTS_TRUE@ $(dist_test_extra_scripts) \ @ENABLE_INSTALLED_TESTS_TRUE@ $(dist_installed_test_scripts) \ @ENABLE_INSTALLED_TESTS_TRUE@ $(dist_installed_test_extra_scripts) @ENABLE_INSTALLED_TESTS_TRUE@am__append_12 = $(test_data) \ @ENABLE_INSTALLED_TESTS_TRUE@ $(installed_test_data) \ @ENABLE_INSTALLED_TESTS_TRUE@ $(dist_test_data) \ @ENABLE_INSTALLED_TESTS_TRUE@ $(dist_installed_test_data) @ENABLE_INSTALLED_TESTS_TRUE@am__append_13 = $(test_ltlibraries) $(installed_test_ltlibraries) @ENABLE_INSTALLED_TESTS_TRUE@am__append_14 = $(installed_test_meta_DATA) @MS_LIB_AVAILABLE_TRUE@@OS_WIN32_AND_DLL_COMPILATION_TRUE@am__append_15 = glib-2.0.lib @OS_UNIX_TRUE@am__append_16 = glib-unix.c @THREADS_WIN32_TRUE@am__append_17 = gthread-win32.c @THREADS_POSIX_TRUE@@THREADS_WIN32_FALSE@am__append_18 = gthread-posix.c @OS_UNIX_TRUE@am__append_19 = ${auto_config_binscripts} subdir = glib ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4macros/attributes.m4 \ $(top_srcdir)/m4macros/glibtests.m4 \ $(top_srcdir)/m4macros/libtool.m4 \ $(top_srcdir)/m4macros/ltoptions.m4 \ $(top_srcdir)/m4macros/ltsugar.m4 \ $(top_srcdir)/m4macros/ltversion.m4 \ $(top_srcdir)/m4macros/lt~obsolete.m4 \ $(top_srcdir)/acinclude.m4 $(top_srcdir)/acglib.m4 \ $(top_srcdir)/glib/libcharset/codeset.m4 \ $(top_srcdir)/glib/libcharset/glibc21.m4 \ $(top_srcdir)/m4macros/glib-gettext.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \ $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = glib.rc CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(installed_testdir)" \ "$(DESTDIR)$(installed_testdir)" \ "$(DESTDIR)$(installed_testdir)" \ "$(DESTDIR)$(installed_test_metadir)" \ "$(DESTDIR)$(installed_testdir)" LTLIBRARIES = $(installed_test_LTLIBRARIES) $(noinst_LTLIBRARIES) am__DEPENDENCIES_1 = am__libglib_2_0_la_SOURCES_DIST = deprecated/gallocator.c \ deprecated/gcache.c deprecated/gcompletion.c deprecated/grel.c \ deprecated/gthread-deprecated.c garray.c gasyncqueue.c \ gasyncqueueprivate.h gatomic.c gbacktrace.c gbase64.c \ gbitlock.c gbookmarkfile.c gbsearcharray.h gbytes.c gbytes.h \ gcharset.c gcharsetprivate.h gchecksum.c gconvert.c gdataset.c \ gdatasetprivate.h gdate.c gdatetime.c gdir.c genviron.c \ gerror.c gfileutils.c ggettext.c ghash.c ghmac.c ghook.c \ ghostutils.c giochannel.c gkeyfile.c glibintl.h glib_trace.h \ glib-init.h glib-init.c glib-private.h glib-private.c glist.c \ gmain-internal.h gmain.c gmappedfile.c gmarkup.c gmem.c \ gmessages.c gmessages-private.h gmirroringtable.h gnode.c \ goption.c gpattern.c gpoll.c gprimes.c gqsort.c gquark.c \ gqueue.c grand.c gscanner.c gscripttable.h gsequence.c \ gshell.c gslice.c gslist.c gstdio.c gstrfuncs.c gstring.c \ gstringchunk.c gtestutils.c gthread.c gthreadprivate.h \ gthreadpool.c gtimer.c gtimezone.c gtrashstack.c gtree.c \ guniprop.c gutf8.c gunibreak.h gunibreak.c gunichartables.h \ gunicollate.c gunicomp.h gunidecomp.h gunidecomp.c \ gunicodeprivate.h gurifuncs.c gutils.c gvariant.h gvariant.c \ gvariant-core.h gvariant-core.c gvariant-internal.h \ gvariant-parser.c gvariant-serialiser.h gvariant-serialiser.c \ gvarianttypeinfo.h gvarianttypeinfo.c gvarianttype.c \ gversion.c gwakeup.h gwakeup.c gprintf.c gprintfint.h \ valgrind.h glib-unix.c gthread-win32.c gthread-posix.c am__objects_1 = libglib_2_0_la-gallocator.lo libglib_2_0_la-gcache.lo \ libglib_2_0_la-gcompletion.lo libglib_2_0_la-grel.lo \ libglib_2_0_la-gthread-deprecated.lo @OS_UNIX_TRUE@am__objects_2 = libglib_2_0_la-glib-unix.lo @THREADS_WIN32_TRUE@am__objects_3 = libglib_2_0_la-gthread-win32.lo @THREADS_POSIX_TRUE@@THREADS_WIN32_FALSE@am__objects_4 = libglib_2_0_la-gthread-posix.lo am_libglib_2_0_la_OBJECTS = $(am__objects_1) libglib_2_0_la-garray.lo \ libglib_2_0_la-gasyncqueue.lo libglib_2_0_la-gatomic.lo \ libglib_2_0_la-gbacktrace.lo libglib_2_0_la-gbase64.lo \ libglib_2_0_la-gbitlock.lo libglib_2_0_la-gbookmarkfile.lo \ libglib_2_0_la-gbytes.lo libglib_2_0_la-gcharset.lo \ libglib_2_0_la-gchecksum.lo libglib_2_0_la-gconvert.lo \ libglib_2_0_la-gdataset.lo libglib_2_0_la-gdate.lo \ libglib_2_0_la-gdatetime.lo libglib_2_0_la-gdir.lo \ libglib_2_0_la-genviron.lo libglib_2_0_la-gerror.lo \ libglib_2_0_la-gfileutils.lo libglib_2_0_la-ggettext.lo \ libglib_2_0_la-ghash.lo libglib_2_0_la-ghmac.lo \ libglib_2_0_la-ghook.lo libglib_2_0_la-ghostutils.lo \ libglib_2_0_la-giochannel.lo libglib_2_0_la-gkeyfile.lo \ libglib_2_0_la-glib-init.lo libglib_2_0_la-glib-private.lo \ libglib_2_0_la-glist.lo libglib_2_0_la-gmain.lo \ libglib_2_0_la-gmappedfile.lo libglib_2_0_la-gmarkup.lo \ libglib_2_0_la-gmem.lo libglib_2_0_la-gmessages.lo \ libglib_2_0_la-gnode.lo libglib_2_0_la-goption.lo \ libglib_2_0_la-gpattern.lo libglib_2_0_la-gpoll.lo \ libglib_2_0_la-gprimes.lo libglib_2_0_la-gqsort.lo \ libglib_2_0_la-gquark.lo libglib_2_0_la-gqueue.lo \ libglib_2_0_la-grand.lo libglib_2_0_la-gscanner.lo \ libglib_2_0_la-gsequence.lo libglib_2_0_la-gshell.lo \ libglib_2_0_la-gslice.lo libglib_2_0_la-gslist.lo \ libglib_2_0_la-gstdio.lo libglib_2_0_la-gstrfuncs.lo \ libglib_2_0_la-gstring.lo libglib_2_0_la-gstringchunk.lo \ libglib_2_0_la-gtestutils.lo libglib_2_0_la-gthread.lo \ libglib_2_0_la-gthreadpool.lo libglib_2_0_la-gtimer.lo \ libglib_2_0_la-gtimezone.lo libglib_2_0_la-gtrashstack.lo \ libglib_2_0_la-gtree.lo libglib_2_0_la-guniprop.lo \ libglib_2_0_la-gutf8.lo libglib_2_0_la-gunibreak.lo \ libglib_2_0_la-gunicollate.lo libglib_2_0_la-gunidecomp.lo \ libglib_2_0_la-gurifuncs.lo libglib_2_0_la-gutils.lo \ libglib_2_0_la-gvariant.lo libglib_2_0_la-gvariant-core.lo \ libglib_2_0_la-gvariant-parser.lo \ libglib_2_0_la-gvariant-serialiser.lo \ libglib_2_0_la-gvarianttypeinfo.lo \ libglib_2_0_la-gvarianttype.lo libglib_2_0_la-gversion.lo \ libglib_2_0_la-gwakeup.lo libglib_2_0_la-gprintf.lo \ $(am__objects_2) $(am__objects_3) $(am__objects_4) libglib_2_0_la_OBJECTS = $(am_libglib_2_0_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = libglib_2_0_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(libglib_2_0_la_CFLAGS) $(CFLAGS) $(libglib_2_0_la_LDFLAGS) \ $(LDFLAGS) -o $@ am__EXEEXT_1 = @ENABLE_ALWAYS_BUILD_TESTS_FALSE@am__EXEEXT_2 = $(am__EXEEXT_1) @ENABLE_ALWAYS_BUILD_TESTS_TRUE@am__EXEEXT_3 = $(am__EXEEXT_1) PROGRAMS = $(installed_test_PROGRAMS) $(noinst_PROGRAMS) SCRIPTS = $(installed_test_SCRIPTS) $(noinst_SCRIPTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libglib_2_0_la_SOURCES) $(EXTRA_libglib_2_0_la_SOURCES) DIST_SOURCES = $(am__libglib_2_0_la_SOURCES_DIST) \ $(EXTRA_libglib_2_0_la_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(installed_test_meta_DATA) $(nobase_installed_test_DATA) \ $(noinst_DATA) HEADERS = $(nodist_noinst_HEADERS) $(noinst_HEADERS) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ check recheck distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/glib.rc.in \ $(top_srcdir)/depcomp $(top_srcdir)/glib.mk \ $(top_srcdir)/test-driver DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ABS_GLIB_RUNTIME_LIBDIR = @ABS_GLIB_RUNTIME_LIBDIR@ ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO = @GIO@ GIO_MODULE_DIR = @GIO_MODULE_DIR@ GLIBC21 = @GLIBC21@ GLIB_BINARY_AGE = @GLIB_BINARY_AGE@ GLIB_DEBUG_FLAGS = @GLIB_DEBUG_FLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_HIDDEN_VISIBILITY_CFLAGS = @GLIB_HIDDEN_VISIBILITY_CFLAGS@ GLIB_INTERFACE_AGE = @GLIB_INTERFACE_AGE@ GLIB_LINK_FLAGS = @GLIB_LINK_FLAGS@ GLIB_MAJOR_VERSION = @GLIB_MAJOR_VERSION@ GLIB_MICRO_VERSION = @GLIB_MICRO_VERSION@ GLIB_MINOR_VERSION = @GLIB_MINOR_VERSION@ GLIB_RUNTIME_LIBDIR = @GLIB_RUNTIME_LIBDIR@ GLIB_VERSION = @GLIB_VERSION@ GLIB_WARN_CFLAGS = @GLIB_WARN_CFLAGS@ GLIB_WIN32_STATIC_COMPILATION_DEFINE = @GLIB_WIN32_STATIC_COMPILATION_DEFINE@ GREP = @GREP@ GSPAWN = @GSPAWN@ GTHREAD_COMPILE_IMPL_DEFINES = @GTHREAD_COMPILE_IMPL_DEFINES@ G_LIBS_EXTRA = @G_LIBS_EXTRA@ G_MODULE_BROKEN_RTLD_GLOBAL = @G_MODULE_BROKEN_RTLD_GLOBAL@ G_MODULE_HAVE_DLERROR = @G_MODULE_HAVE_DLERROR@ G_MODULE_IMPL = @G_MODULE_IMPL@ G_MODULE_LDFLAGS = @G_MODULE_LDFLAGS@ G_MODULE_LIBS = @G_MODULE_LIBS@ G_MODULE_LIBS_EXTRA = @G_MODULE_LIBS_EXTRA@ G_MODULE_NEED_USCORE = @G_MODULE_NEED_USCORE@ G_MODULE_PLUGIN_LIBS = @G_MODULE_PLUGIN_LIBS@ G_MODULE_SUPPORTED = @G_MODULE_SUPPORTED@ G_THREAD_CFLAGS = @G_THREAD_CFLAGS@ G_THREAD_LIBS = @G_THREAD_LIBS@ G_THREAD_LIBS_EXTRA = @G_THREAD_LIBS_EXTRA@ G_THREAD_LIBS_FOR_GTHREAD = @G_THREAD_LIBS_FOR_GTHREAD@ ICONV_LIBS = @ICONV_LIBS@ INDENT = @INDENT@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIB_EXE_MACHINE_FLAG = @LIB_EXE_MACHINE_FLAG@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LTP = @LTP@ LTP_GENHTML = @LTP_GENHTML@ LT_AGE = @LT_AGE@ LT_CURRENT = @LT_CURRENT@ LT_CURRENT_MINUS_AGE = @LT_CURRENT_MINUS_AGE@ LT_RELEASE = @LT_RELEASE@ LT_REVISION = @LT_REVISION@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NAMESER_COMPAT_INCLUDE = @NAMESER_COMPAT_INCLUDE@ NETWORK_LIBS = @NETWORK_LIBS@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PERL = @PERL@ PERL_PATH = @PERL_PATH@ PLATFORMDEP = @PLATFORMDEP@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ REBUILD = @REBUILD@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHTOOL = @SHTOOL@ STRIP = @STRIP@ VERSION = @VERSION@ WINDRES = @WINDRES@ WSPIAPI_INCLUDE = @WSPIAPI_INCLUDE@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ config_h_INCLUDES = @config_h_INCLUDES@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gio_INCLUDES = @gio_INCLUDES@ glib_INCLUDES = @glib_INCLUDES@ gmodule_INCLUDES = @gmodule_INCLUDES@ gobject_INCLUDES = @gobject_INCLUDES@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ installed_test_metadir = @installed_test_metadir@ installed_testdir = @installed_testdir@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ ms_librarian = @ms_librarian@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ #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 = glibconfig-stamp # These may be in the builddir too BUILT_EXTRA_DIST = glib.rc CLEANFILES = *.log *.trs $(am__append_14) glib-public-headers.txt # # Generate glibconfig.h # # The timestamp of the stamp file is used to indicate if glibconfig.h is # up to date with respect to config.status. In the usual case, changes # to config.status will not result in changes to glibconfig.h so we # avoid touching its timestamp (in order not to rebuild the whole tree). # DISTCLEANFILES = glibconfig-stamp glibconfig.h MAINTAINERCLEANFILES = EXTRA_DIST = $(all_dist_test_scripts) $(all_dist_test_data) glib.rc.in \ gen-iswide-table.py gen-unicode-tables.pl gen-script-table.pl \ win_iconv.c docs.c gconstructor.h $(MIRRORING_TAB_SOURCE) \ $(am__append_19) # 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)) installed_test_LTLIBRARIES = $(am__append_13) installed_test_SCRIPTS = $(am__append_11) nobase_installed_test_DATA = $(am__append_12) noinst_LTLIBRARIES = $(am__append_2) libglib-2.0.la noinst_SCRIPTS = $(am__append_4) noinst_DATA = $(am__append_5) $(am__append_15) check_LTLIBRARIES = $(am__append_6) check_SCRIPTS = $(am__append_8) check_DATA = $(am__append_9) # 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) 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_data = $(test_data) $(uninstalled_test_data) \ $(installed_test_data) $(all_dist_test_data) all_dist_test_data = $(dist_test_data) $(dist_uninstalled_test_data) $(dist_installed_test_data) all_test_ltlibs = $(test_ltlibraries) $(uninstalled_test_ltlibraries) $(installed_test_ltlibraries) @ENABLE_INSTALLED_TESTS_TRUE@installed_testcases = $(test_programs) $(installed_test_programs) \ @ENABLE_INSTALLED_TESTS_TRUE@ $(test_scripts) $(installed_test_scripts) \ @ENABLE_INSTALLED_TESTS_TRUE@ $(dist_test_scripts) $(dist_installed_test_scripts) @ENABLE_INSTALLED_TESTS_TRUE@installed_test_meta_DATA = $(installed_testcases:=.test) configexecincludedir = $(libdir)/glib-2.0/include nodist_noinst_HEADERS = glibconfig.h @HAVE_GOOD_PRINTF_FALSE@PRINTF_SUBDIR = gnulib @HAVE_GOOD_PRINTF_FALSE@printf_la = gnulib/libgnulib.la SUBDIRS = libcharset $(PRINTF_SUBDIR) . DIST_SUBDIRS = libcharset gnulib AM_CPPFLAGS = \ $(glib_INCLUDES) \ $(pcre_inc) \ -DG_LOG_DOMAIN=\"GLib\" \ $(GLIB_DEBUG_FLAGS) \ -DGLIB_COMPILATION \ -DPCRE_STATIC AM_CFLAGS = $(GLIB_WARN_CFLAGS) MIRRORING_TAB_SOURCE = \ glib-mirroring-tab/Makefile \ glib-mirroring-tab/gen-mirroring-tab.c \ glib-mirroring-tab/packtab.h \ glib-mirroring-tab/packtab.c @MS_LIB_AVAILABLE_TRUE@@OS_WIN32_AND_DLL_COMPILATION_TRUE@install_ms_lib_cmd = $(INSTALL) glib-2.0.lib $(DESTDIR)$(libdir) @MS_LIB_AVAILABLE_TRUE@@OS_WIN32_AND_DLL_COMPILATION_TRUE@uninstall_ms_lib_cmd = -rm $(DESTDIR)$(libdir)/glib-2.0.lib deprecated_sources = \ deprecated/gallocator.c \ deprecated/gcache.c \ deprecated/gcompletion.c \ deprecated/grel.c \ deprecated/gthread-deprecated.c libglib_2_0_la_SOURCES = $(deprecated_sources) garray.c gasyncqueue.c \ gasyncqueueprivate.h gatomic.c gbacktrace.c gbase64.c \ gbitlock.c gbookmarkfile.c gbsearcharray.h gbytes.c gbytes.h \ gcharset.c gcharsetprivate.h gchecksum.c gconvert.c gdataset.c \ gdatasetprivate.h gdate.c gdatetime.c gdir.c genviron.c \ gerror.c gfileutils.c ggettext.c ghash.c ghmac.c ghook.c \ ghostutils.c giochannel.c gkeyfile.c glibintl.h glib_trace.h \ glib-init.h glib-init.c glib-private.h glib-private.c glist.c \ gmain-internal.h gmain.c gmappedfile.c gmarkup.c gmem.c \ gmessages.c gmessages-private.h gmirroringtable.h gnode.c \ goption.c gpattern.c gpoll.c gprimes.c gqsort.c gquark.c \ gqueue.c grand.c gscanner.c gscripttable.h gsequence.c \ gshell.c gslice.c gslist.c gstdio.c gstrfuncs.c gstring.c \ gstringchunk.c gtestutils.c gthread.c gthreadprivate.h \ gthreadpool.c gtimer.c gtimezone.c gtrashstack.c gtree.c \ guniprop.c gutf8.c gunibreak.h gunibreak.c gunichartables.h \ gunicollate.c gunicomp.h gunidecomp.h gunidecomp.c \ gunicodeprivate.h gurifuncs.c gutils.c gvariant.h gvariant.c \ gvariant-core.h gvariant-core.c gvariant-internal.h \ gvariant-parser.c gvariant-serialiser.h gvariant-serialiser.c \ gvarianttypeinfo.h gvarianttypeinfo.c gvarianttype.c \ gversion.c gwakeup.h gwakeup.c gprintf.c gprintfint.h \ valgrind.h $(am__append_16) $(am__append_17) $(am__append_18) EXTRA_libglib_2_0_la_SOURCES = \ giounix.c \ giowin32.c \ gspawn.c \ gspawn-win32.c \ gwin32.c glibincludedir = $(includedir)/glib-2.0 noinst_HEADERS = glib-unix.h glib-object.h glib.h \ deprecated/gallocator.h deprecated/gcache.h \ deprecated/gcompletion.h deprecated/gmain.h deprecated/grel.h \ deprecated/gthread.h galloca.h garray.h gasyncqueue.h \ gatomic.h gbacktrace.h gbase64.h gbitlock.h gbookmarkfile.h \ gbytes.h gcharset.h gchecksum.h gconvert.h gdataset.h gdate.h \ gdatetime.h gdir.h genviron.h gerror.h gfileutils.h ggettext.h \ ghash.h ghmac.h ghook.h ghostutils.h gi18n.h gi18n-lib.h \ giochannel.h gkeyfile.h glist.h gmacros.h gmain.h \ gmappedfile.h gmarkup.h gmem.h gmessages.h gnode.h goption.h \ gpattern.h gpoll.h gprimes.h gqsort.h gquark.h gqueue.h \ grand.h gscanner.h gsequence.h gshell.h gslice.h gslist.h \ gspawn.h gstdio.h gstrfuncs.h gtestutils.h gstring.h \ gstringchunk.h gthread.h gthreadpool.h gtimer.h gtimezone.h \ gtrashstack.h gtree.h gtypes.h gunicode.h gurifuncs.h gutils.h \ gvarianttype.h gvariant.h gversion.h gversionmacros.h gwin32.h \ gprintf.h deprecatedincludedir = $(includedir)/glib-2.0/glib/deprecated glibsubincludedir = $(includedir)/glib-2.0/glib @PLATFORM_WIN32_TRUE@no_undefined = -no-undefined @OS_WIN32_AND_DLL_COMPILATION_TRUE@glib_win32_res = glib-win32-res.o @OS_WIN32_AND_DLL_COMPILATION_TRUE@glib_win32_res_ldflag = -Wl,$(glib_win32_res) 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) @OS_UNIX_TRUE@auto_config_binscripts = gtester-report @OS_UNIX_TRUE@CONFIGVARS = \ @OS_UNIX_TRUE@ "bindir" : "${bindir}", \ @OS_UNIX_TRUE@ "glib-version" : "${GLIB_VERSION}" all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-recursive .SUFFIXES: .SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/glib.mk $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign glib/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign glib/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_srcdir)/glib.mk $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): glib.rc: $(top_builddir)/config.status $(srcdir)/glib.rc.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ clean-checkLTLIBRARIES: -test -z "$(check_LTLIBRARIES)" || rm -f $(check_LTLIBRARIES) @list='$(check_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } install-installed_testLTLIBRARIES: $(installed_test_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(installed_test_LTLIBRARIES)'; test -n "$(installed_testdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(installed_testdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(installed_testdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(installed_testdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(installed_testdir)"; \ } uninstall-installed_testLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(installed_test_LTLIBRARIES)'; test -n "$(installed_testdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(installed_testdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(installed_testdir)/$$f"; \ done clean-installed_testLTLIBRARIES: -test -z "$(installed_test_LTLIBRARIES)" || rm -f $(installed_test_LTLIBRARIES) @list='$(installed_test_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libglib-2.0.la: $(libglib_2_0_la_OBJECTS) $(libglib_2_0_la_DEPENDENCIES) $(EXTRA_libglib_2_0_la_DEPENDENCIES) $(AM_V_CCLD)$(libglib_2_0_la_LINK) $(libglib_2_0_la_OBJECTS) $(libglib_2_0_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list install-installed_testPROGRAMS: $(installed_test_PROGRAMS) @$(NORMAL_INSTALL) @list='$(installed_test_PROGRAMS)'; test -n "$(installed_testdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(installed_testdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(installed_testdir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ || test -f $$p1 \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(installed_testdir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(installed_testdir)$$dir" || exit $$?; \ } \ ; done uninstall-installed_testPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(installed_test_PROGRAMS)'; test -n "$(installed_testdir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(installed_testdir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(installed_testdir)" && rm -f $$files clean-installed_testPROGRAMS: @list='$(installed_test_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list clean-noinstPROGRAMS: @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list install-installed_testSCRIPTS: $(installed_test_SCRIPTS) @$(NORMAL_INSTALL) @list='$(installed_test_SCRIPTS)'; test -n "$(installed_testdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(installed_testdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(installed_testdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) { files[d] = files[d] " " $$1; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$4, $$1 } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(installed_testdir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(installed_testdir)$$dir" || exit $$?; \ } \ ; done uninstall-installed_testSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(installed_test_SCRIPTS)'; test -n "$(installed_testdir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ dir='$(DESTDIR)$(installed_testdir)'; $(am__uninstall_files_from_dir) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-gallocator.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-garray.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-gasyncqueue.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-gatomic.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-gbacktrace.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-gbase64.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-gbitlock.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-gbookmarkfile.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-gbytes.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-gcache.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-gcharset.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-gchecksum.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-gcompletion.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-gconvert.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-gdataset.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-gdate.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-gdatetime.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-gdir.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-genviron.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-gerror.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-gfileutils.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-ggettext.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-ghash.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-ghmac.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-ghook.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-ghostutils.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-giochannel.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-giounix.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-giowin32.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-gkeyfile.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-glib-init.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-glib-private.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-glib-unix.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-glist.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-gmain.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-gmappedfile.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-gmarkup.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-gmem.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-gmessages.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-gnode.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-goption.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-gpattern.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-gpoll.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-gprimes.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-gprintf.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-gqsort.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-gquark.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-gqueue.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-grand.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-grel.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-gscanner.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-gsequence.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-gshell.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-gslice.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-gslist.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-gspawn-win32.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-gspawn.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-gstdio.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-gstrfuncs.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-gstring.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-gstringchunk.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-gtestutils.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-gthread-deprecated.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-gthread-posix.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-gthread-win32.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-gthread.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-gthreadpool.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-gtimer.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-gtimezone.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-gtrashstack.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-gtree.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-gunibreak.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-gunicollate.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-gunidecomp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-guniprop.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-gurifuncs.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-gutf8.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-gutils.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-gvariant-core.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-gvariant-parser.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-gvariant-serialiser.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-gvariant.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-gvarianttype.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-gvarianttypeinfo.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-gversion.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-gwakeup.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglib_2_0_la-gwin32.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libglib_2_0_la-gallocator.lo: deprecated/gallocator.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-gallocator.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-gallocator.Tpo -c -o libglib_2_0_la-gallocator.lo `test -f 'deprecated/gallocator.c' || echo '$(srcdir)/'`deprecated/gallocator.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-gallocator.Tpo $(DEPDIR)/libglib_2_0_la-gallocator.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='deprecated/gallocator.c' object='libglib_2_0_la-gallocator.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-gallocator.lo `test -f 'deprecated/gallocator.c' || echo '$(srcdir)/'`deprecated/gallocator.c libglib_2_0_la-gcache.lo: deprecated/gcache.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-gcache.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-gcache.Tpo -c -o libglib_2_0_la-gcache.lo `test -f 'deprecated/gcache.c' || echo '$(srcdir)/'`deprecated/gcache.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-gcache.Tpo $(DEPDIR)/libglib_2_0_la-gcache.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='deprecated/gcache.c' object='libglib_2_0_la-gcache.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-gcache.lo `test -f 'deprecated/gcache.c' || echo '$(srcdir)/'`deprecated/gcache.c libglib_2_0_la-gcompletion.lo: deprecated/gcompletion.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-gcompletion.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-gcompletion.Tpo -c -o libglib_2_0_la-gcompletion.lo `test -f 'deprecated/gcompletion.c' || echo '$(srcdir)/'`deprecated/gcompletion.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-gcompletion.Tpo $(DEPDIR)/libglib_2_0_la-gcompletion.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='deprecated/gcompletion.c' object='libglib_2_0_la-gcompletion.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-gcompletion.lo `test -f 'deprecated/gcompletion.c' || echo '$(srcdir)/'`deprecated/gcompletion.c libglib_2_0_la-grel.lo: deprecated/grel.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-grel.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-grel.Tpo -c -o libglib_2_0_la-grel.lo `test -f 'deprecated/grel.c' || echo '$(srcdir)/'`deprecated/grel.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-grel.Tpo $(DEPDIR)/libglib_2_0_la-grel.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='deprecated/grel.c' object='libglib_2_0_la-grel.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-grel.lo `test -f 'deprecated/grel.c' || echo '$(srcdir)/'`deprecated/grel.c libglib_2_0_la-gthread-deprecated.lo: deprecated/gthread-deprecated.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-gthread-deprecated.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-gthread-deprecated.Tpo -c -o libglib_2_0_la-gthread-deprecated.lo `test -f 'deprecated/gthread-deprecated.c' || echo '$(srcdir)/'`deprecated/gthread-deprecated.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-gthread-deprecated.Tpo $(DEPDIR)/libglib_2_0_la-gthread-deprecated.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='deprecated/gthread-deprecated.c' object='libglib_2_0_la-gthread-deprecated.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-gthread-deprecated.lo `test -f 'deprecated/gthread-deprecated.c' || echo '$(srcdir)/'`deprecated/gthread-deprecated.c libglib_2_0_la-garray.lo: garray.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-garray.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-garray.Tpo -c -o libglib_2_0_la-garray.lo `test -f 'garray.c' || echo '$(srcdir)/'`garray.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-garray.Tpo $(DEPDIR)/libglib_2_0_la-garray.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='garray.c' object='libglib_2_0_la-garray.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-garray.lo `test -f 'garray.c' || echo '$(srcdir)/'`garray.c libglib_2_0_la-gasyncqueue.lo: gasyncqueue.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-gasyncqueue.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-gasyncqueue.Tpo -c -o libglib_2_0_la-gasyncqueue.lo `test -f 'gasyncqueue.c' || echo '$(srcdir)/'`gasyncqueue.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-gasyncqueue.Tpo $(DEPDIR)/libglib_2_0_la-gasyncqueue.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gasyncqueue.c' object='libglib_2_0_la-gasyncqueue.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-gasyncqueue.lo `test -f 'gasyncqueue.c' || echo '$(srcdir)/'`gasyncqueue.c libglib_2_0_la-gatomic.lo: gatomic.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-gatomic.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-gatomic.Tpo -c -o libglib_2_0_la-gatomic.lo `test -f 'gatomic.c' || echo '$(srcdir)/'`gatomic.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-gatomic.Tpo $(DEPDIR)/libglib_2_0_la-gatomic.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gatomic.c' object='libglib_2_0_la-gatomic.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-gatomic.lo `test -f 'gatomic.c' || echo '$(srcdir)/'`gatomic.c libglib_2_0_la-gbacktrace.lo: gbacktrace.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-gbacktrace.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-gbacktrace.Tpo -c -o libglib_2_0_la-gbacktrace.lo `test -f 'gbacktrace.c' || echo '$(srcdir)/'`gbacktrace.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-gbacktrace.Tpo $(DEPDIR)/libglib_2_0_la-gbacktrace.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gbacktrace.c' object='libglib_2_0_la-gbacktrace.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-gbacktrace.lo `test -f 'gbacktrace.c' || echo '$(srcdir)/'`gbacktrace.c libglib_2_0_la-gbase64.lo: gbase64.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-gbase64.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-gbase64.Tpo -c -o libglib_2_0_la-gbase64.lo `test -f 'gbase64.c' || echo '$(srcdir)/'`gbase64.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-gbase64.Tpo $(DEPDIR)/libglib_2_0_la-gbase64.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gbase64.c' object='libglib_2_0_la-gbase64.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-gbase64.lo `test -f 'gbase64.c' || echo '$(srcdir)/'`gbase64.c libglib_2_0_la-gbitlock.lo: gbitlock.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-gbitlock.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-gbitlock.Tpo -c -o libglib_2_0_la-gbitlock.lo `test -f 'gbitlock.c' || echo '$(srcdir)/'`gbitlock.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-gbitlock.Tpo $(DEPDIR)/libglib_2_0_la-gbitlock.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gbitlock.c' object='libglib_2_0_la-gbitlock.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-gbitlock.lo `test -f 'gbitlock.c' || echo '$(srcdir)/'`gbitlock.c libglib_2_0_la-gbookmarkfile.lo: gbookmarkfile.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-gbookmarkfile.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-gbookmarkfile.Tpo -c -o libglib_2_0_la-gbookmarkfile.lo `test -f 'gbookmarkfile.c' || echo '$(srcdir)/'`gbookmarkfile.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-gbookmarkfile.Tpo $(DEPDIR)/libglib_2_0_la-gbookmarkfile.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gbookmarkfile.c' object='libglib_2_0_la-gbookmarkfile.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-gbookmarkfile.lo `test -f 'gbookmarkfile.c' || echo '$(srcdir)/'`gbookmarkfile.c libglib_2_0_la-gbytes.lo: gbytes.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-gbytes.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-gbytes.Tpo -c -o libglib_2_0_la-gbytes.lo `test -f 'gbytes.c' || echo '$(srcdir)/'`gbytes.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-gbytes.Tpo $(DEPDIR)/libglib_2_0_la-gbytes.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gbytes.c' object='libglib_2_0_la-gbytes.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-gbytes.lo `test -f 'gbytes.c' || echo '$(srcdir)/'`gbytes.c libglib_2_0_la-gcharset.lo: gcharset.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-gcharset.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-gcharset.Tpo -c -o libglib_2_0_la-gcharset.lo `test -f 'gcharset.c' || echo '$(srcdir)/'`gcharset.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-gcharset.Tpo $(DEPDIR)/libglib_2_0_la-gcharset.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gcharset.c' object='libglib_2_0_la-gcharset.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-gcharset.lo `test -f 'gcharset.c' || echo '$(srcdir)/'`gcharset.c libglib_2_0_la-gchecksum.lo: gchecksum.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-gchecksum.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-gchecksum.Tpo -c -o libglib_2_0_la-gchecksum.lo `test -f 'gchecksum.c' || echo '$(srcdir)/'`gchecksum.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-gchecksum.Tpo $(DEPDIR)/libglib_2_0_la-gchecksum.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gchecksum.c' object='libglib_2_0_la-gchecksum.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-gchecksum.lo `test -f 'gchecksum.c' || echo '$(srcdir)/'`gchecksum.c libglib_2_0_la-gconvert.lo: gconvert.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-gconvert.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-gconvert.Tpo -c -o libglib_2_0_la-gconvert.lo `test -f 'gconvert.c' || echo '$(srcdir)/'`gconvert.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-gconvert.Tpo $(DEPDIR)/libglib_2_0_la-gconvert.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gconvert.c' object='libglib_2_0_la-gconvert.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-gconvert.lo `test -f 'gconvert.c' || echo '$(srcdir)/'`gconvert.c libglib_2_0_la-gdataset.lo: gdataset.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-gdataset.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-gdataset.Tpo -c -o libglib_2_0_la-gdataset.lo `test -f 'gdataset.c' || echo '$(srcdir)/'`gdataset.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-gdataset.Tpo $(DEPDIR)/libglib_2_0_la-gdataset.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gdataset.c' object='libglib_2_0_la-gdataset.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-gdataset.lo `test -f 'gdataset.c' || echo '$(srcdir)/'`gdataset.c libglib_2_0_la-gdate.lo: gdate.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-gdate.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-gdate.Tpo -c -o libglib_2_0_la-gdate.lo `test -f 'gdate.c' || echo '$(srcdir)/'`gdate.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-gdate.Tpo $(DEPDIR)/libglib_2_0_la-gdate.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gdate.c' object='libglib_2_0_la-gdate.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-gdate.lo `test -f 'gdate.c' || echo '$(srcdir)/'`gdate.c libglib_2_0_la-gdatetime.lo: gdatetime.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-gdatetime.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-gdatetime.Tpo -c -o libglib_2_0_la-gdatetime.lo `test -f 'gdatetime.c' || echo '$(srcdir)/'`gdatetime.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-gdatetime.Tpo $(DEPDIR)/libglib_2_0_la-gdatetime.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gdatetime.c' object='libglib_2_0_la-gdatetime.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-gdatetime.lo `test -f 'gdatetime.c' || echo '$(srcdir)/'`gdatetime.c libglib_2_0_la-gdir.lo: gdir.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-gdir.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-gdir.Tpo -c -o libglib_2_0_la-gdir.lo `test -f 'gdir.c' || echo '$(srcdir)/'`gdir.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-gdir.Tpo $(DEPDIR)/libglib_2_0_la-gdir.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gdir.c' object='libglib_2_0_la-gdir.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-gdir.lo `test -f 'gdir.c' || echo '$(srcdir)/'`gdir.c libglib_2_0_la-genviron.lo: genviron.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-genviron.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-genviron.Tpo -c -o libglib_2_0_la-genviron.lo `test -f 'genviron.c' || echo '$(srcdir)/'`genviron.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-genviron.Tpo $(DEPDIR)/libglib_2_0_la-genviron.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='genviron.c' object='libglib_2_0_la-genviron.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-genviron.lo `test -f 'genviron.c' || echo '$(srcdir)/'`genviron.c libglib_2_0_la-gerror.lo: gerror.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-gerror.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-gerror.Tpo -c -o libglib_2_0_la-gerror.lo `test -f 'gerror.c' || echo '$(srcdir)/'`gerror.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-gerror.Tpo $(DEPDIR)/libglib_2_0_la-gerror.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gerror.c' object='libglib_2_0_la-gerror.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-gerror.lo `test -f 'gerror.c' || echo '$(srcdir)/'`gerror.c libglib_2_0_la-gfileutils.lo: gfileutils.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-gfileutils.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-gfileutils.Tpo -c -o libglib_2_0_la-gfileutils.lo `test -f 'gfileutils.c' || echo '$(srcdir)/'`gfileutils.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-gfileutils.Tpo $(DEPDIR)/libglib_2_0_la-gfileutils.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gfileutils.c' object='libglib_2_0_la-gfileutils.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-gfileutils.lo `test -f 'gfileutils.c' || echo '$(srcdir)/'`gfileutils.c libglib_2_0_la-ggettext.lo: ggettext.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-ggettext.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-ggettext.Tpo -c -o libglib_2_0_la-ggettext.lo `test -f 'ggettext.c' || echo '$(srcdir)/'`ggettext.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-ggettext.Tpo $(DEPDIR)/libglib_2_0_la-ggettext.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ggettext.c' object='libglib_2_0_la-ggettext.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-ggettext.lo `test -f 'ggettext.c' || echo '$(srcdir)/'`ggettext.c libglib_2_0_la-ghash.lo: ghash.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-ghash.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-ghash.Tpo -c -o libglib_2_0_la-ghash.lo `test -f 'ghash.c' || echo '$(srcdir)/'`ghash.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-ghash.Tpo $(DEPDIR)/libglib_2_0_la-ghash.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ghash.c' object='libglib_2_0_la-ghash.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-ghash.lo `test -f 'ghash.c' || echo '$(srcdir)/'`ghash.c libglib_2_0_la-ghmac.lo: ghmac.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-ghmac.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-ghmac.Tpo -c -o libglib_2_0_la-ghmac.lo `test -f 'ghmac.c' || echo '$(srcdir)/'`ghmac.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-ghmac.Tpo $(DEPDIR)/libglib_2_0_la-ghmac.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ghmac.c' object='libglib_2_0_la-ghmac.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-ghmac.lo `test -f 'ghmac.c' || echo '$(srcdir)/'`ghmac.c libglib_2_0_la-ghook.lo: ghook.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-ghook.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-ghook.Tpo -c -o libglib_2_0_la-ghook.lo `test -f 'ghook.c' || echo '$(srcdir)/'`ghook.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-ghook.Tpo $(DEPDIR)/libglib_2_0_la-ghook.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ghook.c' object='libglib_2_0_la-ghook.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-ghook.lo `test -f 'ghook.c' || echo '$(srcdir)/'`ghook.c libglib_2_0_la-ghostutils.lo: ghostutils.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-ghostutils.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-ghostutils.Tpo -c -o libglib_2_0_la-ghostutils.lo `test -f 'ghostutils.c' || echo '$(srcdir)/'`ghostutils.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-ghostutils.Tpo $(DEPDIR)/libglib_2_0_la-ghostutils.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ghostutils.c' object='libglib_2_0_la-ghostutils.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-ghostutils.lo `test -f 'ghostutils.c' || echo '$(srcdir)/'`ghostutils.c libglib_2_0_la-giochannel.lo: giochannel.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-giochannel.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-giochannel.Tpo -c -o libglib_2_0_la-giochannel.lo `test -f 'giochannel.c' || echo '$(srcdir)/'`giochannel.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-giochannel.Tpo $(DEPDIR)/libglib_2_0_la-giochannel.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='giochannel.c' object='libglib_2_0_la-giochannel.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-giochannel.lo `test -f 'giochannel.c' || echo '$(srcdir)/'`giochannel.c libglib_2_0_la-gkeyfile.lo: gkeyfile.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-gkeyfile.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-gkeyfile.Tpo -c -o libglib_2_0_la-gkeyfile.lo `test -f 'gkeyfile.c' || echo '$(srcdir)/'`gkeyfile.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-gkeyfile.Tpo $(DEPDIR)/libglib_2_0_la-gkeyfile.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gkeyfile.c' object='libglib_2_0_la-gkeyfile.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-gkeyfile.lo `test -f 'gkeyfile.c' || echo '$(srcdir)/'`gkeyfile.c libglib_2_0_la-glib-init.lo: glib-init.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-glib-init.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-glib-init.Tpo -c -o libglib_2_0_la-glib-init.lo `test -f 'glib-init.c' || echo '$(srcdir)/'`glib-init.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-glib-init.Tpo $(DEPDIR)/libglib_2_0_la-glib-init.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='glib-init.c' object='libglib_2_0_la-glib-init.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-glib-init.lo `test -f 'glib-init.c' || echo '$(srcdir)/'`glib-init.c libglib_2_0_la-glib-private.lo: glib-private.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-glib-private.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-glib-private.Tpo -c -o libglib_2_0_la-glib-private.lo `test -f 'glib-private.c' || echo '$(srcdir)/'`glib-private.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-glib-private.Tpo $(DEPDIR)/libglib_2_0_la-glib-private.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='glib-private.c' object='libglib_2_0_la-glib-private.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-glib-private.lo `test -f 'glib-private.c' || echo '$(srcdir)/'`glib-private.c libglib_2_0_la-glist.lo: glist.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-glist.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-glist.Tpo -c -o libglib_2_0_la-glist.lo `test -f 'glist.c' || echo '$(srcdir)/'`glist.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-glist.Tpo $(DEPDIR)/libglib_2_0_la-glist.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='glist.c' object='libglib_2_0_la-glist.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-glist.lo `test -f 'glist.c' || echo '$(srcdir)/'`glist.c libglib_2_0_la-gmain.lo: gmain.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-gmain.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-gmain.Tpo -c -o libglib_2_0_la-gmain.lo `test -f 'gmain.c' || echo '$(srcdir)/'`gmain.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-gmain.Tpo $(DEPDIR)/libglib_2_0_la-gmain.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gmain.c' object='libglib_2_0_la-gmain.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-gmain.lo `test -f 'gmain.c' || echo '$(srcdir)/'`gmain.c libglib_2_0_la-gmappedfile.lo: gmappedfile.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-gmappedfile.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-gmappedfile.Tpo -c -o libglib_2_0_la-gmappedfile.lo `test -f 'gmappedfile.c' || echo '$(srcdir)/'`gmappedfile.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-gmappedfile.Tpo $(DEPDIR)/libglib_2_0_la-gmappedfile.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gmappedfile.c' object='libglib_2_0_la-gmappedfile.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-gmappedfile.lo `test -f 'gmappedfile.c' || echo '$(srcdir)/'`gmappedfile.c libglib_2_0_la-gmarkup.lo: gmarkup.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-gmarkup.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-gmarkup.Tpo -c -o libglib_2_0_la-gmarkup.lo `test -f 'gmarkup.c' || echo '$(srcdir)/'`gmarkup.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-gmarkup.Tpo $(DEPDIR)/libglib_2_0_la-gmarkup.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gmarkup.c' object='libglib_2_0_la-gmarkup.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-gmarkup.lo `test -f 'gmarkup.c' || echo '$(srcdir)/'`gmarkup.c libglib_2_0_la-gmem.lo: gmem.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-gmem.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-gmem.Tpo -c -o libglib_2_0_la-gmem.lo `test -f 'gmem.c' || echo '$(srcdir)/'`gmem.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-gmem.Tpo $(DEPDIR)/libglib_2_0_la-gmem.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gmem.c' object='libglib_2_0_la-gmem.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-gmem.lo `test -f 'gmem.c' || echo '$(srcdir)/'`gmem.c libglib_2_0_la-gmessages.lo: gmessages.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-gmessages.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-gmessages.Tpo -c -o libglib_2_0_la-gmessages.lo `test -f 'gmessages.c' || echo '$(srcdir)/'`gmessages.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-gmessages.Tpo $(DEPDIR)/libglib_2_0_la-gmessages.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gmessages.c' object='libglib_2_0_la-gmessages.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-gmessages.lo `test -f 'gmessages.c' || echo '$(srcdir)/'`gmessages.c libglib_2_0_la-gnode.lo: gnode.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-gnode.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-gnode.Tpo -c -o libglib_2_0_la-gnode.lo `test -f 'gnode.c' || echo '$(srcdir)/'`gnode.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-gnode.Tpo $(DEPDIR)/libglib_2_0_la-gnode.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gnode.c' object='libglib_2_0_la-gnode.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-gnode.lo `test -f 'gnode.c' || echo '$(srcdir)/'`gnode.c libglib_2_0_la-goption.lo: goption.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-goption.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-goption.Tpo -c -o libglib_2_0_la-goption.lo `test -f 'goption.c' || echo '$(srcdir)/'`goption.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-goption.Tpo $(DEPDIR)/libglib_2_0_la-goption.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='goption.c' object='libglib_2_0_la-goption.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-goption.lo `test -f 'goption.c' || echo '$(srcdir)/'`goption.c libglib_2_0_la-gpattern.lo: gpattern.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-gpattern.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-gpattern.Tpo -c -o libglib_2_0_la-gpattern.lo `test -f 'gpattern.c' || echo '$(srcdir)/'`gpattern.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-gpattern.Tpo $(DEPDIR)/libglib_2_0_la-gpattern.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gpattern.c' object='libglib_2_0_la-gpattern.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-gpattern.lo `test -f 'gpattern.c' || echo '$(srcdir)/'`gpattern.c libglib_2_0_la-gpoll.lo: gpoll.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-gpoll.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-gpoll.Tpo -c -o libglib_2_0_la-gpoll.lo `test -f 'gpoll.c' || echo '$(srcdir)/'`gpoll.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-gpoll.Tpo $(DEPDIR)/libglib_2_0_la-gpoll.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gpoll.c' object='libglib_2_0_la-gpoll.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-gpoll.lo `test -f 'gpoll.c' || echo '$(srcdir)/'`gpoll.c libglib_2_0_la-gprimes.lo: gprimes.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-gprimes.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-gprimes.Tpo -c -o libglib_2_0_la-gprimes.lo `test -f 'gprimes.c' || echo '$(srcdir)/'`gprimes.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-gprimes.Tpo $(DEPDIR)/libglib_2_0_la-gprimes.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gprimes.c' object='libglib_2_0_la-gprimes.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-gprimes.lo `test -f 'gprimes.c' || echo '$(srcdir)/'`gprimes.c libglib_2_0_la-gqsort.lo: gqsort.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-gqsort.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-gqsort.Tpo -c -o libglib_2_0_la-gqsort.lo `test -f 'gqsort.c' || echo '$(srcdir)/'`gqsort.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-gqsort.Tpo $(DEPDIR)/libglib_2_0_la-gqsort.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gqsort.c' object='libglib_2_0_la-gqsort.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-gqsort.lo `test -f 'gqsort.c' || echo '$(srcdir)/'`gqsort.c libglib_2_0_la-gquark.lo: gquark.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-gquark.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-gquark.Tpo -c -o libglib_2_0_la-gquark.lo `test -f 'gquark.c' || echo '$(srcdir)/'`gquark.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-gquark.Tpo $(DEPDIR)/libglib_2_0_la-gquark.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gquark.c' object='libglib_2_0_la-gquark.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-gquark.lo `test -f 'gquark.c' || echo '$(srcdir)/'`gquark.c libglib_2_0_la-gqueue.lo: gqueue.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-gqueue.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-gqueue.Tpo -c -o libglib_2_0_la-gqueue.lo `test -f 'gqueue.c' || echo '$(srcdir)/'`gqueue.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-gqueue.Tpo $(DEPDIR)/libglib_2_0_la-gqueue.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gqueue.c' object='libglib_2_0_la-gqueue.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-gqueue.lo `test -f 'gqueue.c' || echo '$(srcdir)/'`gqueue.c libglib_2_0_la-grand.lo: grand.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-grand.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-grand.Tpo -c -o libglib_2_0_la-grand.lo `test -f 'grand.c' || echo '$(srcdir)/'`grand.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-grand.Tpo $(DEPDIR)/libglib_2_0_la-grand.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grand.c' object='libglib_2_0_la-grand.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-grand.lo `test -f 'grand.c' || echo '$(srcdir)/'`grand.c libglib_2_0_la-gscanner.lo: gscanner.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-gscanner.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-gscanner.Tpo -c -o libglib_2_0_la-gscanner.lo `test -f 'gscanner.c' || echo '$(srcdir)/'`gscanner.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-gscanner.Tpo $(DEPDIR)/libglib_2_0_la-gscanner.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gscanner.c' object='libglib_2_0_la-gscanner.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-gscanner.lo `test -f 'gscanner.c' || echo '$(srcdir)/'`gscanner.c libglib_2_0_la-gsequence.lo: gsequence.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-gsequence.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-gsequence.Tpo -c -o libglib_2_0_la-gsequence.lo `test -f 'gsequence.c' || echo '$(srcdir)/'`gsequence.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-gsequence.Tpo $(DEPDIR)/libglib_2_0_la-gsequence.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gsequence.c' object='libglib_2_0_la-gsequence.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-gsequence.lo `test -f 'gsequence.c' || echo '$(srcdir)/'`gsequence.c libglib_2_0_la-gshell.lo: gshell.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-gshell.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-gshell.Tpo -c -o libglib_2_0_la-gshell.lo `test -f 'gshell.c' || echo '$(srcdir)/'`gshell.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-gshell.Tpo $(DEPDIR)/libglib_2_0_la-gshell.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gshell.c' object='libglib_2_0_la-gshell.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-gshell.lo `test -f 'gshell.c' || echo '$(srcdir)/'`gshell.c libglib_2_0_la-gslice.lo: gslice.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-gslice.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-gslice.Tpo -c -o libglib_2_0_la-gslice.lo `test -f 'gslice.c' || echo '$(srcdir)/'`gslice.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-gslice.Tpo $(DEPDIR)/libglib_2_0_la-gslice.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gslice.c' object='libglib_2_0_la-gslice.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-gslice.lo `test -f 'gslice.c' || echo '$(srcdir)/'`gslice.c libglib_2_0_la-gslist.lo: gslist.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-gslist.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-gslist.Tpo -c -o libglib_2_0_la-gslist.lo `test -f 'gslist.c' || echo '$(srcdir)/'`gslist.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-gslist.Tpo $(DEPDIR)/libglib_2_0_la-gslist.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gslist.c' object='libglib_2_0_la-gslist.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-gslist.lo `test -f 'gslist.c' || echo '$(srcdir)/'`gslist.c libglib_2_0_la-gstdio.lo: gstdio.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-gstdio.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-gstdio.Tpo -c -o libglib_2_0_la-gstdio.lo `test -f 'gstdio.c' || echo '$(srcdir)/'`gstdio.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-gstdio.Tpo $(DEPDIR)/libglib_2_0_la-gstdio.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstdio.c' object='libglib_2_0_la-gstdio.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-gstdio.lo `test -f 'gstdio.c' || echo '$(srcdir)/'`gstdio.c libglib_2_0_la-gstrfuncs.lo: gstrfuncs.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-gstrfuncs.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-gstrfuncs.Tpo -c -o libglib_2_0_la-gstrfuncs.lo `test -f 'gstrfuncs.c' || echo '$(srcdir)/'`gstrfuncs.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-gstrfuncs.Tpo $(DEPDIR)/libglib_2_0_la-gstrfuncs.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrfuncs.c' object='libglib_2_0_la-gstrfuncs.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-gstrfuncs.lo `test -f 'gstrfuncs.c' || echo '$(srcdir)/'`gstrfuncs.c libglib_2_0_la-gstring.lo: gstring.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-gstring.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-gstring.Tpo -c -o libglib_2_0_la-gstring.lo `test -f 'gstring.c' || echo '$(srcdir)/'`gstring.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-gstring.Tpo $(DEPDIR)/libglib_2_0_la-gstring.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstring.c' object='libglib_2_0_la-gstring.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-gstring.lo `test -f 'gstring.c' || echo '$(srcdir)/'`gstring.c libglib_2_0_la-gstringchunk.lo: gstringchunk.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-gstringchunk.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-gstringchunk.Tpo -c -o libglib_2_0_la-gstringchunk.lo `test -f 'gstringchunk.c' || echo '$(srcdir)/'`gstringchunk.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-gstringchunk.Tpo $(DEPDIR)/libglib_2_0_la-gstringchunk.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstringchunk.c' object='libglib_2_0_la-gstringchunk.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-gstringchunk.lo `test -f 'gstringchunk.c' || echo '$(srcdir)/'`gstringchunk.c libglib_2_0_la-gtestutils.lo: gtestutils.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-gtestutils.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-gtestutils.Tpo -c -o libglib_2_0_la-gtestutils.lo `test -f 'gtestutils.c' || echo '$(srcdir)/'`gtestutils.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-gtestutils.Tpo $(DEPDIR)/libglib_2_0_la-gtestutils.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gtestutils.c' object='libglib_2_0_la-gtestutils.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-gtestutils.lo `test -f 'gtestutils.c' || echo '$(srcdir)/'`gtestutils.c libglib_2_0_la-gthread.lo: gthread.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-gthread.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-gthread.Tpo -c -o libglib_2_0_la-gthread.lo `test -f 'gthread.c' || echo '$(srcdir)/'`gthread.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-gthread.Tpo $(DEPDIR)/libglib_2_0_la-gthread.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gthread.c' object='libglib_2_0_la-gthread.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-gthread.lo `test -f 'gthread.c' || echo '$(srcdir)/'`gthread.c libglib_2_0_la-gthreadpool.lo: gthreadpool.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-gthreadpool.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-gthreadpool.Tpo -c -o libglib_2_0_la-gthreadpool.lo `test -f 'gthreadpool.c' || echo '$(srcdir)/'`gthreadpool.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-gthreadpool.Tpo $(DEPDIR)/libglib_2_0_la-gthreadpool.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gthreadpool.c' object='libglib_2_0_la-gthreadpool.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-gthreadpool.lo `test -f 'gthreadpool.c' || echo '$(srcdir)/'`gthreadpool.c libglib_2_0_la-gtimer.lo: gtimer.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-gtimer.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-gtimer.Tpo -c -o libglib_2_0_la-gtimer.lo `test -f 'gtimer.c' || echo '$(srcdir)/'`gtimer.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-gtimer.Tpo $(DEPDIR)/libglib_2_0_la-gtimer.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gtimer.c' object='libglib_2_0_la-gtimer.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-gtimer.lo `test -f 'gtimer.c' || echo '$(srcdir)/'`gtimer.c libglib_2_0_la-gtimezone.lo: gtimezone.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-gtimezone.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-gtimezone.Tpo -c -o libglib_2_0_la-gtimezone.lo `test -f 'gtimezone.c' || echo '$(srcdir)/'`gtimezone.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-gtimezone.Tpo $(DEPDIR)/libglib_2_0_la-gtimezone.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gtimezone.c' object='libglib_2_0_la-gtimezone.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-gtimezone.lo `test -f 'gtimezone.c' || echo '$(srcdir)/'`gtimezone.c libglib_2_0_la-gtrashstack.lo: gtrashstack.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-gtrashstack.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-gtrashstack.Tpo -c -o libglib_2_0_la-gtrashstack.lo `test -f 'gtrashstack.c' || echo '$(srcdir)/'`gtrashstack.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-gtrashstack.Tpo $(DEPDIR)/libglib_2_0_la-gtrashstack.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gtrashstack.c' object='libglib_2_0_la-gtrashstack.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-gtrashstack.lo `test -f 'gtrashstack.c' || echo '$(srcdir)/'`gtrashstack.c libglib_2_0_la-gtree.lo: gtree.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-gtree.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-gtree.Tpo -c -o libglib_2_0_la-gtree.lo `test -f 'gtree.c' || echo '$(srcdir)/'`gtree.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-gtree.Tpo $(DEPDIR)/libglib_2_0_la-gtree.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gtree.c' object='libglib_2_0_la-gtree.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-gtree.lo `test -f 'gtree.c' || echo '$(srcdir)/'`gtree.c libglib_2_0_la-guniprop.lo: guniprop.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-guniprop.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-guniprop.Tpo -c -o libglib_2_0_la-guniprop.lo `test -f 'guniprop.c' || echo '$(srcdir)/'`guniprop.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-guniprop.Tpo $(DEPDIR)/libglib_2_0_la-guniprop.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='guniprop.c' object='libglib_2_0_la-guniprop.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-guniprop.lo `test -f 'guniprop.c' || echo '$(srcdir)/'`guniprop.c libglib_2_0_la-gutf8.lo: gutf8.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-gutf8.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-gutf8.Tpo -c -o libglib_2_0_la-gutf8.lo `test -f 'gutf8.c' || echo '$(srcdir)/'`gutf8.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-gutf8.Tpo $(DEPDIR)/libglib_2_0_la-gutf8.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gutf8.c' object='libglib_2_0_la-gutf8.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-gutf8.lo `test -f 'gutf8.c' || echo '$(srcdir)/'`gutf8.c libglib_2_0_la-gunibreak.lo: gunibreak.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-gunibreak.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-gunibreak.Tpo -c -o libglib_2_0_la-gunibreak.lo `test -f 'gunibreak.c' || echo '$(srcdir)/'`gunibreak.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-gunibreak.Tpo $(DEPDIR)/libglib_2_0_la-gunibreak.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gunibreak.c' object='libglib_2_0_la-gunibreak.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-gunibreak.lo `test -f 'gunibreak.c' || echo '$(srcdir)/'`gunibreak.c libglib_2_0_la-gunicollate.lo: gunicollate.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-gunicollate.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-gunicollate.Tpo -c -o libglib_2_0_la-gunicollate.lo `test -f 'gunicollate.c' || echo '$(srcdir)/'`gunicollate.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-gunicollate.Tpo $(DEPDIR)/libglib_2_0_la-gunicollate.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gunicollate.c' object='libglib_2_0_la-gunicollate.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-gunicollate.lo `test -f 'gunicollate.c' || echo '$(srcdir)/'`gunicollate.c libglib_2_0_la-gunidecomp.lo: gunidecomp.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-gunidecomp.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-gunidecomp.Tpo -c -o libglib_2_0_la-gunidecomp.lo `test -f 'gunidecomp.c' || echo '$(srcdir)/'`gunidecomp.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-gunidecomp.Tpo $(DEPDIR)/libglib_2_0_la-gunidecomp.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gunidecomp.c' object='libglib_2_0_la-gunidecomp.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-gunidecomp.lo `test -f 'gunidecomp.c' || echo '$(srcdir)/'`gunidecomp.c libglib_2_0_la-gurifuncs.lo: gurifuncs.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-gurifuncs.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-gurifuncs.Tpo -c -o libglib_2_0_la-gurifuncs.lo `test -f 'gurifuncs.c' || echo '$(srcdir)/'`gurifuncs.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-gurifuncs.Tpo $(DEPDIR)/libglib_2_0_la-gurifuncs.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gurifuncs.c' object='libglib_2_0_la-gurifuncs.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-gurifuncs.lo `test -f 'gurifuncs.c' || echo '$(srcdir)/'`gurifuncs.c libglib_2_0_la-gutils.lo: gutils.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-gutils.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-gutils.Tpo -c -o libglib_2_0_la-gutils.lo `test -f 'gutils.c' || echo '$(srcdir)/'`gutils.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-gutils.Tpo $(DEPDIR)/libglib_2_0_la-gutils.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gutils.c' object='libglib_2_0_la-gutils.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-gutils.lo `test -f 'gutils.c' || echo '$(srcdir)/'`gutils.c libglib_2_0_la-gvariant.lo: gvariant.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-gvariant.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-gvariant.Tpo -c -o libglib_2_0_la-gvariant.lo `test -f 'gvariant.c' || echo '$(srcdir)/'`gvariant.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-gvariant.Tpo $(DEPDIR)/libglib_2_0_la-gvariant.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gvariant.c' object='libglib_2_0_la-gvariant.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-gvariant.lo `test -f 'gvariant.c' || echo '$(srcdir)/'`gvariant.c libglib_2_0_la-gvariant-core.lo: gvariant-core.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-gvariant-core.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-gvariant-core.Tpo -c -o libglib_2_0_la-gvariant-core.lo `test -f 'gvariant-core.c' || echo '$(srcdir)/'`gvariant-core.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-gvariant-core.Tpo $(DEPDIR)/libglib_2_0_la-gvariant-core.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gvariant-core.c' object='libglib_2_0_la-gvariant-core.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-gvariant-core.lo `test -f 'gvariant-core.c' || echo '$(srcdir)/'`gvariant-core.c libglib_2_0_la-gvariant-parser.lo: gvariant-parser.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-gvariant-parser.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-gvariant-parser.Tpo -c -o libglib_2_0_la-gvariant-parser.lo `test -f 'gvariant-parser.c' || echo '$(srcdir)/'`gvariant-parser.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-gvariant-parser.Tpo $(DEPDIR)/libglib_2_0_la-gvariant-parser.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gvariant-parser.c' object='libglib_2_0_la-gvariant-parser.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-gvariant-parser.lo `test -f 'gvariant-parser.c' || echo '$(srcdir)/'`gvariant-parser.c libglib_2_0_la-gvariant-serialiser.lo: gvariant-serialiser.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-gvariant-serialiser.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-gvariant-serialiser.Tpo -c -o libglib_2_0_la-gvariant-serialiser.lo `test -f 'gvariant-serialiser.c' || echo '$(srcdir)/'`gvariant-serialiser.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-gvariant-serialiser.Tpo $(DEPDIR)/libglib_2_0_la-gvariant-serialiser.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gvariant-serialiser.c' object='libglib_2_0_la-gvariant-serialiser.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-gvariant-serialiser.lo `test -f 'gvariant-serialiser.c' || echo '$(srcdir)/'`gvariant-serialiser.c libglib_2_0_la-gvarianttypeinfo.lo: gvarianttypeinfo.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-gvarianttypeinfo.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-gvarianttypeinfo.Tpo -c -o libglib_2_0_la-gvarianttypeinfo.lo `test -f 'gvarianttypeinfo.c' || echo '$(srcdir)/'`gvarianttypeinfo.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-gvarianttypeinfo.Tpo $(DEPDIR)/libglib_2_0_la-gvarianttypeinfo.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gvarianttypeinfo.c' object='libglib_2_0_la-gvarianttypeinfo.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-gvarianttypeinfo.lo `test -f 'gvarianttypeinfo.c' || echo '$(srcdir)/'`gvarianttypeinfo.c libglib_2_0_la-gvarianttype.lo: gvarianttype.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-gvarianttype.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-gvarianttype.Tpo -c -o libglib_2_0_la-gvarianttype.lo `test -f 'gvarianttype.c' || echo '$(srcdir)/'`gvarianttype.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-gvarianttype.Tpo $(DEPDIR)/libglib_2_0_la-gvarianttype.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gvarianttype.c' object='libglib_2_0_la-gvarianttype.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-gvarianttype.lo `test -f 'gvarianttype.c' || echo '$(srcdir)/'`gvarianttype.c libglib_2_0_la-gversion.lo: gversion.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-gversion.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-gversion.Tpo -c -o libglib_2_0_la-gversion.lo `test -f 'gversion.c' || echo '$(srcdir)/'`gversion.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-gversion.Tpo $(DEPDIR)/libglib_2_0_la-gversion.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gversion.c' object='libglib_2_0_la-gversion.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-gversion.lo `test -f 'gversion.c' || echo '$(srcdir)/'`gversion.c libglib_2_0_la-gwakeup.lo: gwakeup.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-gwakeup.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-gwakeup.Tpo -c -o libglib_2_0_la-gwakeup.lo `test -f 'gwakeup.c' || echo '$(srcdir)/'`gwakeup.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-gwakeup.Tpo $(DEPDIR)/libglib_2_0_la-gwakeup.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gwakeup.c' object='libglib_2_0_la-gwakeup.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-gwakeup.lo `test -f 'gwakeup.c' || echo '$(srcdir)/'`gwakeup.c libglib_2_0_la-gprintf.lo: gprintf.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-gprintf.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-gprintf.Tpo -c -o libglib_2_0_la-gprintf.lo `test -f 'gprintf.c' || echo '$(srcdir)/'`gprintf.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-gprintf.Tpo $(DEPDIR)/libglib_2_0_la-gprintf.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gprintf.c' object='libglib_2_0_la-gprintf.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-gprintf.lo `test -f 'gprintf.c' || echo '$(srcdir)/'`gprintf.c libglib_2_0_la-glib-unix.lo: glib-unix.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-glib-unix.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-glib-unix.Tpo -c -o libglib_2_0_la-glib-unix.lo `test -f 'glib-unix.c' || echo '$(srcdir)/'`glib-unix.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-glib-unix.Tpo $(DEPDIR)/libglib_2_0_la-glib-unix.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='glib-unix.c' object='libglib_2_0_la-glib-unix.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-glib-unix.lo `test -f 'glib-unix.c' || echo '$(srcdir)/'`glib-unix.c libglib_2_0_la-gthread-win32.lo: gthread-win32.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-gthread-win32.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-gthread-win32.Tpo -c -o libglib_2_0_la-gthread-win32.lo `test -f 'gthread-win32.c' || echo '$(srcdir)/'`gthread-win32.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-gthread-win32.Tpo $(DEPDIR)/libglib_2_0_la-gthread-win32.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gthread-win32.c' object='libglib_2_0_la-gthread-win32.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-gthread-win32.lo `test -f 'gthread-win32.c' || echo '$(srcdir)/'`gthread-win32.c libglib_2_0_la-gthread-posix.lo: gthread-posix.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-gthread-posix.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-gthread-posix.Tpo -c -o libglib_2_0_la-gthread-posix.lo `test -f 'gthread-posix.c' || echo '$(srcdir)/'`gthread-posix.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-gthread-posix.Tpo $(DEPDIR)/libglib_2_0_la-gthread-posix.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gthread-posix.c' object='libglib_2_0_la-gthread-posix.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-gthread-posix.lo `test -f 'gthread-posix.c' || echo '$(srcdir)/'`gthread-posix.c libglib_2_0_la-giounix.lo: giounix.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-giounix.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-giounix.Tpo -c -o libglib_2_0_la-giounix.lo `test -f 'giounix.c' || echo '$(srcdir)/'`giounix.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-giounix.Tpo $(DEPDIR)/libglib_2_0_la-giounix.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='giounix.c' object='libglib_2_0_la-giounix.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-giounix.lo `test -f 'giounix.c' || echo '$(srcdir)/'`giounix.c libglib_2_0_la-giowin32.lo: giowin32.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-giowin32.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-giowin32.Tpo -c -o libglib_2_0_la-giowin32.lo `test -f 'giowin32.c' || echo '$(srcdir)/'`giowin32.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-giowin32.Tpo $(DEPDIR)/libglib_2_0_la-giowin32.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='giowin32.c' object='libglib_2_0_la-giowin32.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-giowin32.lo `test -f 'giowin32.c' || echo '$(srcdir)/'`giowin32.c libglib_2_0_la-gspawn.lo: gspawn.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-gspawn.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-gspawn.Tpo -c -o libglib_2_0_la-gspawn.lo `test -f 'gspawn.c' || echo '$(srcdir)/'`gspawn.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-gspawn.Tpo $(DEPDIR)/libglib_2_0_la-gspawn.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gspawn.c' object='libglib_2_0_la-gspawn.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-gspawn.lo `test -f 'gspawn.c' || echo '$(srcdir)/'`gspawn.c libglib_2_0_la-gspawn-win32.lo: gspawn-win32.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-gspawn-win32.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-gspawn-win32.Tpo -c -o libglib_2_0_la-gspawn-win32.lo `test -f 'gspawn-win32.c' || echo '$(srcdir)/'`gspawn-win32.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-gspawn-win32.Tpo $(DEPDIR)/libglib_2_0_la-gspawn-win32.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gspawn-win32.c' object='libglib_2_0_la-gspawn-win32.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-gspawn-win32.lo `test -f 'gspawn-win32.c' || echo '$(srcdir)/'`gspawn-win32.c libglib_2_0_la-gwin32.lo: gwin32.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -MT libglib_2_0_la-gwin32.lo -MD -MP -MF $(DEPDIR)/libglib_2_0_la-gwin32.Tpo -c -o libglib_2_0_la-gwin32.lo `test -f 'gwin32.c' || echo '$(srcdir)/'`gwin32.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libglib_2_0_la-gwin32.Tpo $(DEPDIR)/libglib_2_0_la-gwin32.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gwin32.c' object='libglib_2_0_la-gwin32.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libglib_2_0_la_CFLAGS) $(CFLAGS) -c -o libglib_2_0_la-gwin32.lo `test -f 'gwin32.c' || echo '$(srcdir)/'`gwin32.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-installed_test_metaDATA: $(installed_test_meta_DATA) @$(NORMAL_INSTALL) @list='$(installed_test_meta_DATA)'; test -n "$(installed_test_metadir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(installed_test_metadir)'"; \ $(MKDIR_P) "$(DESTDIR)$(installed_test_metadir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(installed_test_metadir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(installed_test_metadir)" || exit $$?; \ done uninstall-installed_test_metaDATA: @$(NORMAL_UNINSTALL) @list='$(installed_test_meta_DATA)'; test -n "$(installed_test_metadir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(installed_test_metadir)'; $(am__uninstall_files_from_dir) install-nobase_installed_testDATA: $(nobase_installed_test_DATA) @$(NORMAL_INSTALL) @list='$(nobase_installed_test_DATA)'; test -n "$(installed_testdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(installed_testdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(installed_testdir)" || exit 1; \ fi; \ $(am__nobase_list) | while read dir files; do \ xfiles=; for file in $$files; do \ if test -f "$$file"; then xfiles="$$xfiles $$file"; \ else xfiles="$$xfiles $(srcdir)/$$file"; fi; done; \ test -z "$$xfiles" || { \ test "x$$dir" = x. || { \ echo " $(MKDIR_P) '$(DESTDIR)$(installed_testdir)/$$dir'"; \ $(MKDIR_P) "$(DESTDIR)$(installed_testdir)/$$dir"; }; \ echo " $(INSTALL_DATA) $$xfiles '$(DESTDIR)$(installed_testdir)/$$dir'"; \ $(INSTALL_DATA) $$xfiles "$(DESTDIR)$(installed_testdir)/$$dir" || exit $$?; }; \ done uninstall-nobase_installed_testDATA: @$(NORMAL_UNINSTALL) @list='$(nobase_installed_test_DATA)'; test -n "$(installed_testdir)" || list=; \ $(am__nobase_strip_setup); files=`$(am__nobase_strip)`; \ dir='$(DESTDIR)$(installed_testdir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ elif test -n "$$redo_logs"; then \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_LTLIBRARIES) $(check_PROGRAMS) $(check_SCRIPTS) $(check_DATA) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$(top_distdir)" distdir="$(distdir)" \ dist-hook check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_LTLIBRARIES) $(check_PROGRAMS) \ $(check_SCRIPTS) $(check_DATA) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check-local check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-recursive all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(SCRIPTS) $(DATA) \ $(HEADERS) all-local installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(installed_testdir)" "$(DESTDIR)$(installed_testdir)" "$(DESTDIR)$(installed_testdir)" "$(DESTDIR)$(installed_test_metadir)" "$(DESTDIR)$(installed_testdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-recursive clean-am: clean-checkLTLIBRARIES clean-checkPROGRAMS clean-generic \ clean-installed_testLTLIBRARIES clean-installed_testPROGRAMS \ clean-libtool clean-noinstLTLIBRARIES clean-noinstPROGRAMS \ mostlyclean-am distclean: distclean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-installed_testLTLIBRARIES \ install-installed_testPROGRAMS install-installed_testSCRIPTS \ install-installed_test_metaDATA \ install-nobase_installed_testDATA install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-installed_testLTLIBRARIES \ uninstall-installed_testPROGRAMS \ uninstall-installed_testSCRIPTS \ uninstall-installed_test_metaDATA \ uninstall-nobase_installed_testDATA .MAKE: $(am__recursive_targets) all check check-am install install-am \ install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am all-local \ check check-TESTS check-am check-local clean \ clean-checkLTLIBRARIES clean-checkPROGRAMS clean-generic \ clean-installed_testLTLIBRARIES clean-installed_testPROGRAMS \ clean-libtool clean-noinstLTLIBRARIES clean-noinstPROGRAMS \ cscopelist-am ctags ctags-am dist-hook distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am \ install-installed_testLTLIBRARIES \ install-installed_testPROGRAMS install-installed_testSCRIPTS \ install-installed_test_metaDATA install-man \ install-nobase_installed_testDATA install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am \ uninstall-installed_testLTLIBRARIES \ uninstall-installed_testPROGRAMS \ uninstall-installed_testSCRIPTS \ uninstall-installed_test_metaDATA \ uninstall-nobase_installed_testDATA .PRECIOUS: Makefile ### testing rules # test: run all tests in cwd and subdirs test: test-nonrecursive @OS_UNIX_TRUE@ @ for subdir in $(SUBDIRS) . ; do \ @OS_UNIX_TRUE@ test "$$subdir" = "." -o "$$subdir" = "po" || \ @OS_UNIX_TRUE@ ( cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $@ ) || exit $? ; \ @OS_UNIX_TRUE@ done # test-nonrecursive: run tests only in cwd @OS_UNIX_TRUE@test-nonrecursive: ${TEST_PROGS} @OS_UNIX_TRUE@ @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} @OS_UNIX_FALSE@test-nonrecursive: # 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 ; \ echo '' >> $@.xml ; \ echo '' >> $@.xml ; \ echo ' $(PACKAGE)' >> $@.xml ; \ echo ' $(VERSION)' >> $@.xml ; \ echo " $$REVISION" >> $@.xml ; \ echo '' >> $@.xml ; \ for lf in `ls -L "$$GTESTER_LOGDIR"/.` ; do \ sed '1,1s/^?]*?>//' <"$$GTESTER_LOGDIR"/"$$lf" >> $@.xml ; \ done ; \ echo >> $@.xml ; \ echo '' >> $@.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 @ENABLE_INSTALLED_TESTS_TRUE@%.test: %$(EXEEXT) Makefile @ENABLE_INSTALLED_TESTS_TRUE@ $(AM_V_GEN) (echo '[Test]' > $@.tmp; \ @ENABLE_INSTALLED_TESTS_TRUE@ echo 'Type=session' >> $@.tmp; \ @ENABLE_INSTALLED_TESTS_TRUE@ echo 'Exec=$(installed_testdir)/$<' >> $@.tmp; \ @ENABLE_INSTALLED_TESTS_TRUE@ mv $@.tmp $@) glibconfig-stamp: ../config.status $(AM_V_GEN) cd $(top_builddir) && \ $(SHELL) ./config.status glib/glibconfig.h @touch glibconfig-stamp install-ms-lib: $(install_ms_lib_cmd) uninstall-ms-lib: $(uninstall_ms_lib_cmd) # This is read by gobject-introspection/misc/ and gtk-doc glib-public-headers.txt: Makefile echo $(glibinclude_HEADERS) $(glibsubinclude_HEADERS) > $@.tmp && mv $@.tmp $@ all-local: glib-public-headers.txt gspawn-win32-helper-console.c: echo '#define HELPER_CONSOLE' >$@ echo '#include "gspawn-win32-helper.c"' >>$@ gspawn-win64-helper.c: echo '#include "gspawn-win32-helper.c"' >$@ gspawn-win64-helper-console.c: echo '#define HELPER_CONSOLE' >$@ echo '#include "gspawn-win32-helper.c"' >>$@ glib-win32-res.o: glib.rc $(WINDRES) glib.rc $@ glib-2.0.lib: libglib-2.0.la glib.def lib -machine:@LIB_EXE_MACHINE_FLAG@ -name:libglib-2.0-$(LT_CURRENT_MINUS_AGE).dll -def:$(builddir)/glib.def -out:$@ dist-hook: $(BUILT_EXTRA_DIST) files='$(BUILT_EXTRA_DIST)'; \ for f in $$files; do \ if test -f $$f; then d=.; else d=$(srcdir); fi; \ cp $$d/$$f $(distdir) || exit 1; done ../build/win32/vs9/glib.vcproj: $(top_srcdir)/build/win32/vs9/glib.vcprojin for F in `echo $(libglib_2_0_la_SOURCES) | tr '/' '\\'`; do \ case $$F in \ *-unix.c|gthread-*.c) \ ;; \ *.c) echo ' ' \ ;; \ esac; \ done >libglib.sourcefiles $(CPP) -P - <$(top_srcdir)/build/win32/vs9/glib.vcprojin >$@ rm libglib.sourcefiles ../build/win32/vs10/glib.vcxproj: $(top_srcdir)/build/win32/vs10/glib.vcxprojin for F in `echo $(libglib_2_0_la_SOURCES) | tr '/' '\\'`; do \ case $$F in \ *-unix.c|gthread-*.c) \ ;; \ *.c) echo ' ' \ ;; \ esac; \ done >libglib.vs10.sourcefiles $(CPP) -P - <$(top_srcdir)/build/win32/vs10/glib.vcxprojin >$@ rm libglib.vs10.sourcefiles ../build/win32/vs10/glib.vcxproj.filters: $(top_srcdir)/build/win32/vs10/glib.vcxproj.filtersin for F in `echo $(libglib_2_0_la_SOURCES) | tr '/' '\\'`; do \ case $$F in \ *-unix.c|gthread-*.c) \ ;; \ *.c) echo ' Source Files' \ ;; \ esac; \ done >libglib.vs10.sourcefiles.filters $(CPP) -P - <$(top_srcdir)/build/win32/vs10/glib.vcxproj.filtersin >$@ rm libglib.vs10.sourcefiles.filters # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: pkg-config-0.29.1/glib/glib/gslice.c0000664000175000017500000016551412651243552014037 00000000000000/* GLIB sliced memory - fast concurrent memory chunk allocator * Copyright (C) 2005 Tim Janik * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* MT safe */ #include "config.h" #include "glibconfig.h" #if defined HAVE_POSIX_MEMALIGN && defined POSIX_MEMALIGN_WITH_COMPLIANT_ALLOCS # define HAVE_COMPLIANT_POSIX_MEMALIGN 1 #endif #if defined(HAVE_COMPLIANT_POSIX_MEMALIGN) && !defined(_XOPEN_SOURCE) #define _XOPEN_SOURCE 600 /* posix_memalign() */ #endif #include /* posix_memalign() */ #include #include #ifdef HAVE_UNISTD_H #include /* sysconf() */ #endif #ifdef G_OS_WIN32 #include #include #endif #include /* fputs/fprintf */ #include "gslice.h" #include "gmain.h" #include "gmem.h" /* gslice.h */ #include "gstrfuncs.h" #include "gutils.h" #include "gtrashstack.h" #include "gtestutils.h" #include "gthread.h" #include "glib_trace.h" #include "valgrind.h" /** * SECTION:memory_slices * @title: Memory Slices * @short_description: efficient way to allocate groups of equal-sized * chunks of memory * * Memory slices provide a space-efficient and multi-processing scalable * way to allocate equal-sized pieces of memory, just like the original * #GMemChunks (from GLib 2.8), while avoiding their excessive * memory-waste, scalability and performance problems. * * To achieve these goals, the slice allocator uses a sophisticated, * layered design that has been inspired by Bonwick's slab allocator * * [Bonwick94] Jeff Bonwick, The slab allocator: An object-caching kernel * memory allocator. USENIX 1994, and * [Bonwick01] Bonwick and Jonathan Adams, Magazines and vmem: Extending the * slab allocator to many cpu's and arbitrary resources. USENIX 2001 * . * It uses posix_memalign() to optimize allocations of many equally-sized * chunks, and has per-thread free lists (the so-called magazine layer) * to quickly satisfy allocation requests of already known structure sizes. * This is accompanied by extra caching logic to keep freed memory around * for some time before returning it to the system. Memory that is unused * due to alignment constraints is used for cache colorization (random * distribution of chunk addresses) to improve CPU cache utilization. The * caching layer of the slice allocator adapts itself to high lock contention * to improve scalability. * * The slice allocator can allocate blocks as small as two pointers, and * unlike malloc(), it does not reserve extra space per block. For large block * sizes, g_slice_new() and g_slice_alloc() will automatically delegate to the * system malloc() implementation. For newly written code it is recommended * to use the new g_slice API instead of g_malloc() and * friends, as long as objects are not resized during their lifetime and the * object size used at allocation time is still available when freeing. * * * Using the slice allocator * * gchar *mem[10000]; * gint i; * * /* Allocate 10000 blocks. */ * for (i = 0; i < 10000; i++) * { * mem[i] = g_slice_alloc (50); * * /* Fill in the memory with some junk. */ * for (j = 0; j < 50; j++) * mem[i][j] = i * j; * } * * /* Now free all of the blocks. */ * for (i = 0; i < 10000; i++) * { * g_slice_free1 (50, mem[i]); * } * * * * Using the slice allocator with data structures * * GRealArray *array; * * /* Allocate one block, using the g_slice_new() macro. */ * array = g_slice_new (GRealArray); * /* We can now use array just like a normal pointer to a structure. */ * array->data = NULL; * array->len = 0; * array->alloc = 0; * array->zero_terminated = (zero_terminated ? 1 : 0); * array->clear = (clear ? 1 : 0); * array->elt_size = elt_size; * * /* We can free the block, so it can be reused. */ * g_slice_free (GRealArray, array); * */ /* the GSlice allocator is split up into 4 layers, roughly modelled after the slab * allocator and magazine extensions as outlined in: * + [Bonwick94] Jeff Bonwick, The slab allocator: An object-caching kernel * memory allocator. USENIX 1994, http://citeseer.ist.psu.edu/bonwick94slab.html * + [Bonwick01] Bonwick and Jonathan Adams, Magazines and vmem: Extending the * slab allocator to many cpu's and arbitrary resources. * USENIX 2001, http://citeseer.ist.psu.edu/bonwick01magazines.html * the layers are: * - the thread magazines. for each (aligned) chunk size, a magazine (a list) * of recently freed and soon to be allocated chunks is maintained per thread. * this way, most alloc/free requests can be quickly satisfied from per-thread * free lists which only require one g_private_get() call to retrive the * thread handle. * - the magazine cache. allocating and freeing chunks to/from threads only * occours at magazine sizes from a global depot of magazines. the depot * maintaines a 15 second working set of allocated magazines, so full * magazines are not allocated and released too often. * the chunk size dependent magazine sizes automatically adapt (within limits, * see [3]) to lock contention to properly scale performance across a variety * of SMP systems. * - the slab allocator. this allocator allocates slabs (blocks of memory) close * to the system page size or multiples thereof which have to be page aligned. * the blocks are divided into smaller chunks which are used to satisfy * allocations from the upper layers. the space provided by the reminder of * the chunk size division is used for cache colorization (random distribution * of chunk addresses) to improve processor cache utilization. multiple slabs * with the same chunk size are kept in a partially sorted ring to allow O(1) * freeing and allocation of chunks (as long as the allocation of an entirely * new slab can be avoided). * - the page allocator. on most modern systems, posix_memalign(3) or * memalign(3) should be available, so this is used to allocate blocks with * system page size based alignments and sizes or multiples thereof. * if no memalign variant is provided, valloc() is used instead and * block sizes are limited to the system page size (no multiples thereof). * as a fallback, on system without even valloc(), a malloc(3)-based page * allocator with alloc-only behaviour is used. * * NOTES: * [1] some systems memalign(3) implementations may rely on boundary tagging for * the handed out memory chunks. to avoid excessive page-wise fragmentation, * we reserve 2 * sizeof (void*) per block size for the systems memalign(3), * specified in NATIVE_MALLOC_PADDING. * [2] using the slab allocator alone already provides for a fast and efficient * allocator, it doesn't properly scale beyond single-threaded uses though. * also, the slab allocator implements eager free(3)-ing, i.e. does not * provide any form of caching or working set maintenance. so if used alone, * it's vulnerable to trashing for sequences of balanced (alloc, free) pairs * at certain thresholds. * [3] magazine sizes are bound by an implementation specific minimum size and * a chunk size specific maximum to limit magazine storage sizes to roughly * 16KB. * [4] allocating ca. 8 chunks per block/page keeps a good balance between * external and internal fragmentation (<= 12.5%). [Bonwick94] */ /* --- macros and constants --- */ #define LARGEALIGNMENT (256) #define P2ALIGNMENT (2 * sizeof (gsize)) /* fits 2 pointers (assumed to be 2 * GLIB_SIZEOF_SIZE_T below) */ #define ALIGN(size, base) ((base) * (gsize) (((size) + (base) - 1) / (base))) #define NATIVE_MALLOC_PADDING P2ALIGNMENT /* per-page padding left for native malloc(3) see [1] */ #define SLAB_INFO_SIZE P2ALIGN (sizeof (SlabInfo) + NATIVE_MALLOC_PADDING) #define MAX_MAGAZINE_SIZE (256) /* see [3] and allocator_get_magazine_threshold() for this */ #define MIN_MAGAZINE_SIZE (4) #define MAX_STAMP_COUNTER (7) /* distributes the load of gettimeofday() */ #define MAX_SLAB_CHUNK_SIZE(al) (((al)->max_page_size - SLAB_INFO_SIZE) / 8) /* we want at last 8 chunks per page, see [4] */ #define MAX_SLAB_INDEX(al) (SLAB_INDEX (al, MAX_SLAB_CHUNK_SIZE (al)) + 1) #define SLAB_INDEX(al, asize) ((asize) / P2ALIGNMENT - 1) /* asize must be P2ALIGNMENT aligned */ #define SLAB_CHUNK_SIZE(al, ix) (((ix) + 1) * P2ALIGNMENT) #define SLAB_BPAGE_SIZE(al,csz) (8 * (csz) + SLAB_INFO_SIZE) /* optimized version of ALIGN (size, P2ALIGNMENT) */ #if GLIB_SIZEOF_SIZE_T * 2 == 8 /* P2ALIGNMENT */ #define P2ALIGN(size) (((size) + 0x7) & ~(gsize) 0x7) #elif GLIB_SIZEOF_SIZE_T * 2 == 16 /* P2ALIGNMENT */ #define P2ALIGN(size) (((size) + 0xf) & ~(gsize) 0xf) #else #define P2ALIGN(size) ALIGN (size, P2ALIGNMENT) #endif /* special helpers to avoid gmessage.c dependency */ static void mem_error (const char *format, ...) G_GNUC_PRINTF (1,2); #define mem_assert(cond) do { if (G_LIKELY (cond)) ; else mem_error ("assertion failed: %s", #cond); } while (0) /* --- structures --- */ typedef struct _ChunkLink ChunkLink; typedef struct _SlabInfo SlabInfo; typedef struct _CachedMagazine CachedMagazine; struct _ChunkLink { ChunkLink *next; ChunkLink *data; }; struct _SlabInfo { ChunkLink *chunks; guint n_allocated; SlabInfo *next, *prev; }; typedef struct { ChunkLink *chunks; gsize count; /* approximative chunks list length */ } Magazine; typedef struct { Magazine *magazine1; /* array of MAX_SLAB_INDEX (allocator) */ Magazine *magazine2; /* array of MAX_SLAB_INDEX (allocator) */ } ThreadMemory; typedef struct { gboolean always_malloc; gboolean bypass_magazines; gboolean debug_blocks; gsize working_set_msecs; guint color_increment; } SliceConfig; typedef struct { /* const after initialization */ gsize min_page_size, max_page_size; SliceConfig config; gsize max_slab_chunk_size_for_magazine_cache; /* magazine cache */ GMutex magazine_mutex; ChunkLink **magazines; /* array of MAX_SLAB_INDEX (allocator) */ guint *contention_counters; /* array of MAX_SLAB_INDEX (allocator) */ gint mutex_counter; guint stamp_counter; guint last_stamp; /* slab allocator */ GMutex slab_mutex; SlabInfo **slab_stack; /* array of MAX_SLAB_INDEX (allocator) */ guint color_accu; } Allocator; /* --- g-slice prototypes --- */ static gpointer slab_allocator_alloc_chunk (gsize chunk_size); static void slab_allocator_free_chunk (gsize chunk_size, gpointer mem); static void private_thread_memory_cleanup (gpointer data); static gpointer allocator_memalign (gsize alignment, gsize memsize); static void allocator_memfree (gsize memsize, gpointer mem); static inline void magazine_cache_update_stamp (void); static inline gsize allocator_get_magazine_threshold (Allocator *allocator, guint ix); /* --- g-slice memory checker --- */ static void smc_notify_alloc (void *pointer, size_t size); static int smc_notify_free (void *pointer, size_t size); /* --- variables --- */ static GPrivate private_thread_memory = G_PRIVATE_INIT (private_thread_memory_cleanup); static gsize sys_page_size = 0; static Allocator allocator[1] = { { 0, }, }; static SliceConfig slice_config = { FALSE, /* always_malloc */ FALSE, /* bypass_magazines */ FALSE, /* debug_blocks */ 15 * 1000, /* working_set_msecs */ 1, /* color increment, alt: 0x7fffffff */ }; static GMutex smc_tree_mutex; /* mutex for G_SLICE=debug-blocks */ /* --- auxiliary funcitons --- */ void g_slice_set_config (GSliceConfig ckey, gint64 value) { g_return_if_fail (sys_page_size == 0); switch (ckey) { case G_SLICE_CONFIG_ALWAYS_MALLOC: slice_config.always_malloc = value != 0; break; case G_SLICE_CONFIG_BYPASS_MAGAZINES: slice_config.bypass_magazines = value != 0; break; case G_SLICE_CONFIG_WORKING_SET_MSECS: slice_config.working_set_msecs = value; break; case G_SLICE_CONFIG_COLOR_INCREMENT: slice_config.color_increment = value; default: ; } } gint64 g_slice_get_config (GSliceConfig ckey) { switch (ckey) { case G_SLICE_CONFIG_ALWAYS_MALLOC: return slice_config.always_malloc; case G_SLICE_CONFIG_BYPASS_MAGAZINES: return slice_config.bypass_magazines; case G_SLICE_CONFIG_WORKING_SET_MSECS: return slice_config.working_set_msecs; case G_SLICE_CONFIG_CHUNK_SIZES: return MAX_SLAB_INDEX (allocator); case G_SLICE_CONFIG_COLOR_INCREMENT: return slice_config.color_increment; default: return 0; } } gint64* g_slice_get_config_state (GSliceConfig ckey, gint64 address, guint *n_values) { guint i = 0; g_return_val_if_fail (n_values != NULL, NULL); *n_values = 0; switch (ckey) { gint64 array[64]; case G_SLICE_CONFIG_CONTENTION_COUNTER: array[i++] = SLAB_CHUNK_SIZE (allocator, address); array[i++] = allocator->contention_counters[address]; array[i++] = allocator_get_magazine_threshold (allocator, address); *n_values = i; return g_memdup (array, sizeof (array[0]) * *n_values); default: return NULL; } } static void slice_config_init (SliceConfig *config) { const gchar *val; *config = slice_config; val = getenv ("G_SLICE"); if (val != NULL) { gint flags; const GDebugKey keys[] = { { "always-malloc", 1 << 0 }, { "debug-blocks", 1 << 1 }, }; flags = g_parse_debug_string (val, keys, G_N_ELEMENTS (keys)); if (flags & (1 << 0)) config->always_malloc = TRUE; 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 g_slice_init_nomessage (void) { /* we may not use g_error() or friends here */ mem_assert (sys_page_size == 0); mem_assert (MIN_MAGAZINE_SIZE >= 4); #ifdef G_OS_WIN32 { SYSTEM_INFO system_info; GetSystemInfo (&system_info); sys_page_size = system_info.dwPageSize; } #else sys_page_size = sysconf (_SC_PAGESIZE); /* = sysconf (_SC_PAGE_SIZE); = getpagesize(); */ #endif mem_assert (sys_page_size >= 2 * LARGEALIGNMENT); mem_assert ((sys_page_size & (sys_page_size - 1)) == 0); slice_config_init (&allocator->config); allocator->min_page_size = sys_page_size; #if HAVE_COMPLIANT_POSIX_MEMALIGN || HAVE_MEMALIGN /* allow allocation of pages up to 8KB (with 8KB alignment). * this is useful because many medium to large sized structures * fit less than 8 times (see [4]) into 4KB pages. * we allow very small page sizes here, to reduce wastage in * threads if only small allocations are required (this does * bear the risk of increasing allocation times and fragmentation * though). */ allocator->min_page_size = MAX (allocator->min_page_size, 4096); allocator->max_page_size = MAX (allocator->min_page_size, 8192); allocator->min_page_size = MIN (allocator->min_page_size, 128); #else /* we can only align to system page size */ allocator->max_page_size = sys_page_size; #endif if (allocator->config.always_malloc) { allocator->contention_counters = NULL; allocator->magazines = NULL; allocator->slab_stack = NULL; } else { allocator->contention_counters = g_new0 (guint, MAX_SLAB_INDEX (allocator)); allocator->magazines = g_new0 (ChunkLink*, MAX_SLAB_INDEX (allocator)); allocator->slab_stack = g_new0 (SlabInfo*, MAX_SLAB_INDEX (allocator)); } g_mutex_init (&allocator->magazine_mutex); allocator->mutex_counter = 0; allocator->stamp_counter = MAX_STAMP_COUNTER; /* force initial update */ allocator->last_stamp = 0; g_mutex_init (&allocator->slab_mutex); allocator->color_accu = 0; magazine_cache_update_stamp(); /* values cached for performance reasons */ allocator->max_slab_chunk_size_for_magazine_cache = MAX_SLAB_CHUNK_SIZE (allocator); if (allocator->config.always_malloc || allocator->config.bypass_magazines) allocator->max_slab_chunk_size_for_magazine_cache = 0; /* non-optimized cases */ } static inline guint allocator_categorize (gsize aligned_chunk_size) { /* speed up the likely path */ if (G_LIKELY (aligned_chunk_size && aligned_chunk_size <= allocator->max_slab_chunk_size_for_magazine_cache)) return 1; /* use magazine cache */ if (!allocator->config.always_malloc && aligned_chunk_size && aligned_chunk_size <= MAX_SLAB_CHUNK_SIZE (allocator)) { if (allocator->config.bypass_magazines) return 2; /* use slab allocator, see [2] */ return 1; /* use magazine cache */ } return 0; /* use malloc() */ } static inline void g_mutex_lock_a (GMutex *mutex, guint *contention_counter) { gboolean contention = FALSE; if (!g_mutex_trylock (mutex)) { g_mutex_lock (mutex); contention = TRUE; } if (contention) { allocator->mutex_counter++; if (allocator->mutex_counter >= 1) /* quickly adapt to contention */ { allocator->mutex_counter = 0; *contention_counter = MIN (*contention_counter + 1, MAX_MAGAZINE_SIZE); } } else /* !contention */ { allocator->mutex_counter--; if (allocator->mutex_counter < -11) /* moderately recover magazine sizes */ { allocator->mutex_counter = 0; *contention_counter = MAX (*contention_counter, 1) - 1; } } } static inline ThreadMemory* thread_memory_from_self (void) { ThreadMemory *tmem = g_private_get (&private_thread_memory); if (G_UNLIKELY (!tmem)) { static GMutex init_mutex; guint n_magazines; g_mutex_lock (&init_mutex); if G_UNLIKELY (sys_page_size == 0) g_slice_init_nomessage (); g_mutex_unlock (&init_mutex); n_magazines = MAX_SLAB_INDEX (allocator); tmem = g_malloc0 (sizeof (ThreadMemory) + sizeof (Magazine) * 2 * n_magazines); tmem->magazine1 = (Magazine*) (tmem + 1); tmem->magazine2 = &tmem->magazine1[n_magazines]; g_private_set (&private_thread_memory, tmem); } return tmem; } static inline ChunkLink* magazine_chain_pop_head (ChunkLink **magazine_chunks) { /* magazine chains are linked via ChunkLink->next. * each ChunkLink->data of the toplevel chain may point to a subchain, * linked via ChunkLink->next. ChunkLink->data of the subchains just * contains uninitialized junk. */ ChunkLink *chunk = (*magazine_chunks)->data; if (G_UNLIKELY (chunk)) { /* allocating from freed list */ (*magazine_chunks)->data = chunk->next; } else { chunk = *magazine_chunks; *magazine_chunks = chunk->next; } return chunk; } #if 0 /* useful for debugging */ static guint magazine_count (ChunkLink *head) { guint count = 0; if (!head) return 0; while (head) { ChunkLink *child = head->data; count += 1; for (child = head->data; child; child = child->next) count += 1; head = head->next; } return count; } #endif static inline gsize allocator_get_magazine_threshold (Allocator *allocator, guint ix) { /* the magazine size calculated here has a lower bound of MIN_MAGAZINE_SIZE, * which is required by the implementation. also, for moderately sized chunks * (say >= 64 bytes), magazine sizes shouldn't be much smaller then the number * of chunks available per page/2 to avoid excessive traffic in the magazine * cache for small to medium sized structures. * the upper bound of the magazine size is effectively provided by * MAX_MAGAZINE_SIZE. for larger chunks, this number is scaled down so that * the content of a single magazine doesn't exceed ca. 16KB. */ gsize chunk_size = SLAB_CHUNK_SIZE (allocator, ix); guint threshold = MAX (MIN_MAGAZINE_SIZE, allocator->max_page_size / MAX (5 * chunk_size, 5 * 32)); guint contention_counter = allocator->contention_counters[ix]; if (G_UNLIKELY (contention_counter)) /* single CPU bias */ { /* adapt contention counter thresholds to chunk sizes */ contention_counter = contention_counter * 64 / chunk_size; threshold = MAX (threshold, contention_counter); } return threshold; } /* --- magazine cache --- */ static inline void magazine_cache_update_stamp (void) { if (allocator->stamp_counter >= MAX_STAMP_COUNTER) { GTimeVal tv; g_get_current_time (&tv); allocator->last_stamp = tv.tv_sec * 1000 + tv.tv_usec / 1000; /* milli seconds */ allocator->stamp_counter = 0; } else allocator->stamp_counter++; } static inline ChunkLink* magazine_chain_prepare_fields (ChunkLink *magazine_chunks) { ChunkLink *chunk1; ChunkLink *chunk2; ChunkLink *chunk3; ChunkLink *chunk4; /* checked upon initialization: mem_assert (MIN_MAGAZINE_SIZE >= 4); */ /* ensure a magazine with at least 4 unused data pointers */ chunk1 = magazine_chain_pop_head (&magazine_chunks); chunk2 = magazine_chain_pop_head (&magazine_chunks); chunk3 = magazine_chain_pop_head (&magazine_chunks); chunk4 = magazine_chain_pop_head (&magazine_chunks); chunk4->next = magazine_chunks; chunk3->next = chunk4; chunk2->next = chunk3; chunk1->next = chunk2; return chunk1; } /* access the first 3 fields of a specially prepared magazine chain */ #define magazine_chain_prev(mc) ((mc)->data) #define magazine_chain_stamp(mc) ((mc)->next->data) #define magazine_chain_uint_stamp(mc) GPOINTER_TO_UINT ((mc)->next->data) #define magazine_chain_next(mc) ((mc)->next->next->data) #define magazine_chain_count(mc) ((mc)->next->next->next->data) static void magazine_cache_trim (Allocator *allocator, guint ix, guint stamp) { /* g_mutex_lock (allocator->mutex); done by caller */ /* trim magazine cache from tail */ ChunkLink *current = magazine_chain_prev (allocator->magazines[ix]); ChunkLink *trash = NULL; while (ABS (stamp - magazine_chain_uint_stamp (current)) >= allocator->config.working_set_msecs) { /* unlink */ ChunkLink *prev = magazine_chain_prev (current); ChunkLink *next = magazine_chain_next (current); magazine_chain_next (prev) = next; magazine_chain_prev (next) = prev; /* clear special fields, put on trash stack */ magazine_chain_next (current) = NULL; magazine_chain_count (current) = NULL; magazine_chain_stamp (current) = NULL; magazine_chain_prev (current) = trash; trash = current; /* fixup list head if required */ if (current == allocator->magazines[ix]) { allocator->magazines[ix] = NULL; break; } current = prev; } g_mutex_unlock (&allocator->magazine_mutex); /* free trash */ if (trash) { const gsize chunk_size = SLAB_CHUNK_SIZE (allocator, ix); g_mutex_lock (&allocator->slab_mutex); while (trash) { current = trash; trash = magazine_chain_prev (current); magazine_chain_prev (current) = NULL; /* clear special field */ while (current) { ChunkLink *chunk = magazine_chain_pop_head (¤t); slab_allocator_free_chunk (chunk_size, chunk); } } g_mutex_unlock (&allocator->slab_mutex); } } static void magazine_cache_push_magazine (guint ix, ChunkLink *magazine_chunks, gsize count) /* must be >= MIN_MAGAZINE_SIZE */ { ChunkLink *current = magazine_chain_prepare_fields (magazine_chunks); ChunkLink *next, *prev; g_mutex_lock (&allocator->magazine_mutex); /* add magazine at head */ next = allocator->magazines[ix]; if (next) prev = magazine_chain_prev (next); else next = prev = current; magazine_chain_next (prev) = current; magazine_chain_prev (next) = current; magazine_chain_prev (current) = prev; magazine_chain_next (current) = next; magazine_chain_count (current) = (gpointer) count; /* stamp magazine */ magazine_cache_update_stamp(); magazine_chain_stamp (current) = GUINT_TO_POINTER (allocator->last_stamp); allocator->magazines[ix] = current; /* free old magazines beyond a certain threshold */ magazine_cache_trim (allocator, ix, allocator->last_stamp); /* g_mutex_unlock (allocator->mutex); was done by magazine_cache_trim() */ } static ChunkLink* magazine_cache_pop_magazine (guint ix, gsize *countp) { g_mutex_lock_a (&allocator->magazine_mutex, &allocator->contention_counters[ix]); if (!allocator->magazines[ix]) { guint magazine_threshold = allocator_get_magazine_threshold (allocator, ix); gsize i, chunk_size = SLAB_CHUNK_SIZE (allocator, ix); ChunkLink *chunk, *head; g_mutex_unlock (&allocator->magazine_mutex); g_mutex_lock (&allocator->slab_mutex); head = slab_allocator_alloc_chunk (chunk_size); head->data = NULL; chunk = head; for (i = 1; i < magazine_threshold; i++) { chunk->next = slab_allocator_alloc_chunk (chunk_size); chunk = chunk->next; chunk->data = NULL; } chunk->next = NULL; g_mutex_unlock (&allocator->slab_mutex); *countp = i; return head; } else { ChunkLink *current = allocator->magazines[ix]; ChunkLink *prev = magazine_chain_prev (current); ChunkLink *next = magazine_chain_next (current); /* unlink */ magazine_chain_next (prev) = next; magazine_chain_prev (next) = prev; allocator->magazines[ix] = next == current ? NULL : next; g_mutex_unlock (&allocator->magazine_mutex); /* clear special fields and hand out */ *countp = (gsize) magazine_chain_count (current); magazine_chain_prev (current) = NULL; magazine_chain_next (current) = NULL; magazine_chain_count (current) = NULL; magazine_chain_stamp (current) = NULL; return current; } } /* --- thread magazines --- */ static void private_thread_memory_cleanup (gpointer data) { ThreadMemory *tmem = data; const guint n_magazines = MAX_SLAB_INDEX (allocator); guint ix; for (ix = 0; ix < n_magazines; ix++) { Magazine *mags[2]; guint j; mags[0] = &tmem->magazine1[ix]; mags[1] = &tmem->magazine2[ix]; for (j = 0; j < 2; j++) { Magazine *mag = mags[j]; if (mag->count >= MIN_MAGAZINE_SIZE) magazine_cache_push_magazine (ix, mag->chunks, mag->count); else { const gsize chunk_size = SLAB_CHUNK_SIZE (allocator, ix); g_mutex_lock (&allocator->slab_mutex); while (mag->chunks) { ChunkLink *chunk = magazine_chain_pop_head (&mag->chunks); slab_allocator_free_chunk (chunk_size, chunk); } g_mutex_unlock (&allocator->slab_mutex); } } } g_free (tmem); } static void thread_memory_magazine1_reload (ThreadMemory *tmem, guint ix) { Magazine *mag = &tmem->magazine1[ix]; mem_assert (mag->chunks == NULL); /* ensure that we may reset mag->count */ mag->count = 0; mag->chunks = magazine_cache_pop_magazine (ix, &mag->count); } static void thread_memory_magazine2_unload (ThreadMemory *tmem, guint ix) { Magazine *mag = &tmem->magazine2[ix]; magazine_cache_push_magazine (ix, mag->chunks, mag->count); mag->chunks = NULL; mag->count = 0; } static inline void thread_memory_swap_magazines (ThreadMemory *tmem, guint ix) { Magazine xmag = tmem->magazine1[ix]; tmem->magazine1[ix] = tmem->magazine2[ix]; tmem->magazine2[ix] = xmag; } static inline gboolean thread_memory_magazine1_is_empty (ThreadMemory *tmem, guint ix) { return tmem->magazine1[ix].chunks == NULL; } static inline gboolean thread_memory_magazine2_is_full (ThreadMemory *tmem, guint ix) { return tmem->magazine2[ix].count >= allocator_get_magazine_threshold (allocator, ix); } static inline gpointer thread_memory_magazine1_alloc (ThreadMemory *tmem, guint ix) { Magazine *mag = &tmem->magazine1[ix]; ChunkLink *chunk = magazine_chain_pop_head (&mag->chunks); if (G_LIKELY (mag->count > 0)) mag->count--; return chunk; } static inline void thread_memory_magazine2_free (ThreadMemory *tmem, guint ix, gpointer mem) { Magazine *mag = &tmem->magazine2[ix]; ChunkLink *chunk = mem; chunk->data = NULL; chunk->next = mag->chunks; mag->chunks = chunk; mag->count++; } /* --- API functions --- */ /** * g_slice_new: * @type: the type to allocate, typically a structure name * * A convenience macro to allocate a block of memory from the * slice allocator. * * It calls g_slice_alloc() with sizeof (@type) * and casts the returned pointer to a pointer of the given type, * avoiding a type cast in the source code. * Note that the underlying slice allocation mechanism can * be changed with the G_SLICE=always-malloc * environment variable. * * Returns: a pointer to the allocated block, cast to a pointer to @type * * Since: 2.10 */ /** * g_slice_new0: * @type: the type to allocate, typically a structure name * * A convenience macro to allocate a block of memory from the * slice allocator and set the memory to 0. * * It calls g_slice_alloc0() with sizeof (@type) * and casts the returned pointer to a pointer of the given type, * avoiding a type cast in the source code. * Note that the underlying slice allocation mechanism can * be changed with the G_SLICE=always-malloc * environment variable. * * Since: 2.10 */ /** * g_slice_dup: * @type: the type to duplicate, typically a structure name * @mem: the memory to copy into the allocated block * * A convenience macro to duplicate a block of memory using * the slice allocator. * * It calls g_slice_copy() with sizeof (@type) * and casts the returned pointer to a pointer of the given type, * avoiding a type cast in the source code. * Note that the underlying slice allocation mechanism can * be changed with the G_SLICE=always-malloc * environment variable. * * Returns: a pointer to the allocated block, cast to a pointer to @type * * Since: 2.14 */ /** * g_slice_free: * @type: the type of the block to free, typically a structure name * @mem: a pointer to the block to free * * A convenience macro to free a block of memory that has * been allocated from the slice allocator. * * It calls g_slice_free1() using sizeof (type) * as the block size. * Note that the exact release behaviour can be changed with the * G_DEBUG=gc-friendly environment * variable, also see G_SLICE for * related debugging options. * * Since: 2.10 */ /** * g_slice_free_chain: * @type: the type of the @mem_chain blocks * @mem_chain: a pointer to the first block of the chain * @next: the field name of the next pointer in @type * * Frees a linked list of memory blocks of structure type @type. * The memory blocks must be equal-sized, allocated via * g_slice_alloc() or g_slice_alloc0() and linked together by * a @next pointer (similar to #GSList). The name of the * @next field in @type is passed as third argument. * Note that the exact release behaviour can be changed with the * G_DEBUG=gc-friendly environment * variable, also see G_SLICE for * related debugging options. * * Since: 2.10 */ /** * g_slice_alloc: * @block_size: the number of bytes to allocate * * Allocates a block of memory from the slice allocator. * The block adress handed out can be expected to be aligned * to at least 1 * sizeof (void*), * though in general slices are 2 * sizeof (void*) bytes aligned, * if a malloc() fallback implementation is used instead, * the alignment may be reduced in a libc dependent fashion. * Note that the underlying slice allocation mechanism can * be changed with the G_SLICE=always-malloc * environment variable. * * Returns: a pointer to the allocated memory block * * Since: 2.10 */ gpointer g_slice_alloc (gsize mem_size) { ThreadMemory *tmem; gsize chunk_size; gpointer mem; guint acat; /* This gets the private structure for this thread. If the private * structure does not yet exist, it is created. * * This has a side effect of causing GSlice to be initialised, so it * must come first. */ tmem = thread_memory_from_self (); chunk_size = P2ALIGN (mem_size); acat = allocator_categorize (chunk_size); if (G_LIKELY (acat == 1)) /* allocate through magazine layer */ { guint ix = SLAB_INDEX (allocator, chunk_size); if (G_UNLIKELY (thread_memory_magazine1_is_empty (tmem, ix))) { thread_memory_swap_magazines (tmem, ix); if (G_UNLIKELY (thread_memory_magazine1_is_empty (tmem, ix))) thread_memory_magazine1_reload (tmem, ix); } mem = thread_memory_magazine1_alloc (tmem, ix); } else if (acat == 2) /* allocate through slab allocator */ { g_mutex_lock (&allocator->slab_mutex); mem = slab_allocator_alloc_chunk (chunk_size); g_mutex_unlock (&allocator->slab_mutex); } else /* delegate to system malloc */ mem = g_malloc (mem_size); if (G_UNLIKELY (allocator->config.debug_blocks)) smc_notify_alloc (mem, mem_size); TRACE (GLIB_SLICE_ALLOC((void*)mem, mem_size)); return mem; } /** * g_slice_alloc0: * @block_size: the number of bytes to allocate * * Allocates a block of memory via g_slice_alloc() and initializes * the returned memory to 0. Note that the underlying slice allocation * mechanism can be changed with the * G_SLICE=always-malloc * environment variable. * * Returns: a pointer to the allocated block * * Since: 2.10 */ gpointer g_slice_alloc0 (gsize mem_size) { gpointer mem = g_slice_alloc (mem_size); if (mem) memset (mem, 0, mem_size); return mem; } /** * g_slice_copy: * @block_size: the number of bytes to allocate * @mem_block: the memory to copy * * Allocates a block of memory from the slice allocator * and copies @block_size bytes into it from @mem_block. * * Returns: a pointer to the allocated memory block * * Since: 2.14 */ gpointer g_slice_copy (gsize mem_size, gconstpointer mem_block) { gpointer mem = g_slice_alloc (mem_size); if (mem) memcpy (mem, mem_block, mem_size); return mem; } /** * g_slice_free1: * @block_size: the size of the block * @mem_block: a pointer to the block to free * * Frees a block of memory. * * The memory must have been allocated via g_slice_alloc() or * g_slice_alloc0() and the @block_size has to match the size * specified upon allocation. Note that the exact release behaviour * can be changed with the * G_DEBUG=gc-friendly environment * variable, also see G_SLICE for * related debugging options. * * Since: 2.10 */ void g_slice_free1 (gsize mem_size, gpointer mem_block) { gsize chunk_size = P2ALIGN (mem_size); guint acat = allocator_categorize (chunk_size); if (G_UNLIKELY (!mem_block)) return; if (G_UNLIKELY (allocator->config.debug_blocks) && !smc_notify_free (mem_block, mem_size)) abort(); if (G_LIKELY (acat == 1)) /* allocate through magazine layer */ { ThreadMemory *tmem = thread_memory_from_self(); guint ix = SLAB_INDEX (allocator, chunk_size); if (G_UNLIKELY (thread_memory_magazine2_is_full (tmem, ix))) { thread_memory_swap_magazines (tmem, ix); if (G_UNLIKELY (thread_memory_magazine2_is_full (tmem, ix))) thread_memory_magazine2_unload (tmem, ix); } if (G_UNLIKELY (g_mem_gc_friendly)) memset (mem_block, 0, chunk_size); thread_memory_magazine2_free (tmem, ix, mem_block); } else if (acat == 2) /* allocate through slab allocator */ { if (G_UNLIKELY (g_mem_gc_friendly)) memset (mem_block, 0, chunk_size); g_mutex_lock (&allocator->slab_mutex); slab_allocator_free_chunk (chunk_size, mem_block); g_mutex_unlock (&allocator->slab_mutex); } else /* delegate to system malloc */ { if (G_UNLIKELY (g_mem_gc_friendly)) memset (mem_block, 0, mem_size); g_free (mem_block); } TRACE (GLIB_SLICE_FREE((void*)mem_block, mem_size)); } /** * g_slice_free_chain_with_offset: * @block_size: the size of the blocks * @mem_chain: a pointer to the first block of the chain * @next_offset: the offset of the @next field in the blocks * * Frees a linked list of memory blocks of structure type @type. * * The memory blocks must be equal-sized, allocated via * g_slice_alloc() or g_slice_alloc0() and linked together by a * @next pointer (similar to #GSList). The offset of the @next * field in each block is passed as third argument. * Note that the exact release behaviour can be changed with the * G_DEBUG=gc-friendly environment * variable, also see G_SLICE for * related debugging options. * * Since: 2.10 */ void g_slice_free_chain_with_offset (gsize mem_size, gpointer mem_chain, gsize next_offset) { gpointer slice = mem_chain; /* while the thread magazines and the magazine cache are implemented so that * they can easily be extended to allow for free lists containing more free * lists for the first level nodes, which would allow O(1) freeing in this * function, the benefit of such an extension is questionable, because: * - the magazine size counts will become mere lower bounds which confuses * the code adapting to lock contention; * - freeing a single node to the thread magazines is very fast, so this * O(list_length) operation is multiplied by a fairly small factor; * - memory usage histograms on larger applications seem to indicate that * the amount of released multi node lists is negligible in comparison * to single node releases. * - the major performance bottle neck, namely g_private_get() or * g_mutex_lock()/g_mutex_unlock() has already been moved out of the * inner loop for freeing chained slices. */ gsize chunk_size = P2ALIGN (mem_size); guint acat = allocator_categorize (chunk_size); if (G_LIKELY (acat == 1)) /* allocate through magazine layer */ { ThreadMemory *tmem = thread_memory_from_self(); guint ix = SLAB_INDEX (allocator, chunk_size); while (slice) { guint8 *current = slice; slice = *(gpointer*) (current + next_offset); if (G_UNLIKELY (allocator->config.debug_blocks) && !smc_notify_free (current, mem_size)) abort(); if (G_UNLIKELY (thread_memory_magazine2_is_full (tmem, ix))) { thread_memory_swap_magazines (tmem, ix); if (G_UNLIKELY (thread_memory_magazine2_is_full (tmem, ix))) thread_memory_magazine2_unload (tmem, ix); } if (G_UNLIKELY (g_mem_gc_friendly)) memset (current, 0, chunk_size); thread_memory_magazine2_free (tmem, ix, current); } } else if (acat == 2) /* allocate through slab allocator */ { g_mutex_lock (&allocator->slab_mutex); while (slice) { guint8 *current = slice; slice = *(gpointer*) (current + next_offset); if (G_UNLIKELY (allocator->config.debug_blocks) && !smc_notify_free (current, mem_size)) abort(); if (G_UNLIKELY (g_mem_gc_friendly)) memset (current, 0, chunk_size); slab_allocator_free_chunk (chunk_size, current); } g_mutex_unlock (&allocator->slab_mutex); } else /* delegate to system malloc */ while (slice) { guint8 *current = slice; slice = *(gpointer*) (current + next_offset); if (G_UNLIKELY (allocator->config.debug_blocks) && !smc_notify_free (current, mem_size)) abort(); if (G_UNLIKELY (g_mem_gc_friendly)) memset (current, 0, mem_size); g_free (current); } } /* --- single page allocator --- */ static void allocator_slab_stack_push (Allocator *allocator, guint ix, SlabInfo *sinfo) { /* insert slab at slab ring head */ if (!allocator->slab_stack[ix]) { sinfo->next = sinfo; sinfo->prev = sinfo; } else { SlabInfo *next = allocator->slab_stack[ix], *prev = next->prev; next->prev = sinfo; prev->next = sinfo; sinfo->next = next; sinfo->prev = prev; } allocator->slab_stack[ix] = sinfo; } static gsize allocator_aligned_page_size (Allocator *allocator, gsize n_bytes) { gsize val = 1 << g_bit_storage (n_bytes - 1); val = MAX (val, allocator->min_page_size); return val; } static void allocator_add_slab (Allocator *allocator, guint ix, gsize chunk_size) { ChunkLink *chunk; SlabInfo *sinfo; gsize addr, padding, n_chunks, color = 0; gsize page_size = allocator_aligned_page_size (allocator, SLAB_BPAGE_SIZE (allocator, chunk_size)); /* allocate 1 page for the chunks and the slab */ gpointer aligned_memory = allocator_memalign (page_size, page_size - NATIVE_MALLOC_PADDING); guint8 *mem = aligned_memory; guint i; if (!mem) { const gchar *syserr = "unknown error"; #if HAVE_STRERROR syserr = strerror (errno); #endif mem_error ("failed to allocate %u bytes (alignment: %u): %s\n", (guint) (page_size - NATIVE_MALLOC_PADDING), (guint) page_size, syserr); } /* mask page address */ addr = ((gsize) mem / page_size) * page_size; /* assert alignment */ mem_assert (aligned_memory == (gpointer) addr); /* basic slab info setup */ sinfo = (SlabInfo*) (mem + page_size - SLAB_INFO_SIZE); sinfo->n_allocated = 0; sinfo->chunks = NULL; /* figure cache colorization */ n_chunks = ((guint8*) sinfo - mem) / chunk_size; padding = ((guint8*) sinfo - mem) - n_chunks * chunk_size; if (padding) { color = (allocator->color_accu * P2ALIGNMENT) % padding; allocator->color_accu += allocator->config.color_increment; } /* add chunks to free list */ chunk = (ChunkLink*) (mem + color); sinfo->chunks = chunk; for (i = 0; i < n_chunks - 1; i++) { chunk->next = (ChunkLink*) ((guint8*) chunk + chunk_size); chunk = chunk->next; } chunk->next = NULL; /* last chunk */ /* add slab to slab ring */ allocator_slab_stack_push (allocator, ix, sinfo); } static gpointer slab_allocator_alloc_chunk (gsize chunk_size) { ChunkLink *chunk; guint ix = SLAB_INDEX (allocator, chunk_size); /* ensure non-empty slab */ if (!allocator->slab_stack[ix] || !allocator->slab_stack[ix]->chunks) allocator_add_slab (allocator, ix, chunk_size); /* allocate chunk */ chunk = allocator->slab_stack[ix]->chunks; allocator->slab_stack[ix]->chunks = chunk->next; allocator->slab_stack[ix]->n_allocated++; /* rotate empty slabs */ if (!allocator->slab_stack[ix]->chunks) allocator->slab_stack[ix] = allocator->slab_stack[ix]->next; return chunk; } static void slab_allocator_free_chunk (gsize chunk_size, gpointer mem) { ChunkLink *chunk; gboolean was_empty; guint ix = SLAB_INDEX (allocator, chunk_size); gsize page_size = allocator_aligned_page_size (allocator, SLAB_BPAGE_SIZE (allocator, chunk_size)); gsize addr = ((gsize) mem / page_size) * page_size; /* mask page address */ guint8 *page = (guint8*) addr; SlabInfo *sinfo = (SlabInfo*) (page + page_size - SLAB_INFO_SIZE); /* assert valid chunk count */ mem_assert (sinfo->n_allocated > 0); /* add chunk to free list */ was_empty = sinfo->chunks == NULL; chunk = (ChunkLink*) mem; chunk->next = sinfo->chunks; sinfo->chunks = chunk; sinfo->n_allocated--; /* keep slab ring partially sorted, empty slabs at end */ if (was_empty) { /* unlink slab */ SlabInfo *next = sinfo->next, *prev = sinfo->prev; next->prev = prev; prev->next = next; if (allocator->slab_stack[ix] == sinfo) allocator->slab_stack[ix] = next == sinfo ? NULL : next; /* insert slab at head */ allocator_slab_stack_push (allocator, ix, sinfo); } /* eagerly free complete unused slabs */ if (!sinfo->n_allocated) { /* unlink slab */ SlabInfo *next = sinfo->next, *prev = sinfo->prev; next->prev = prev; prev->next = next; if (allocator->slab_stack[ix] == sinfo) allocator->slab_stack[ix] = next == sinfo ? NULL : next; /* free slab */ allocator_memfree (page_size, page); } } /* --- memalign implementation --- */ #ifdef HAVE_MALLOC_H #include /* memalign() */ #endif /* from config.h: * define HAVE_POSIX_MEMALIGN 1 // if free(posix_memalign(3)) works, * define HAVE_COMPLIANT_POSIX_MEMALIGN 1 // if free(posix_memalign(3)) works for sizes != 2^n, * define HAVE_MEMALIGN 1 // if free(memalign(3)) works, * define HAVE_VALLOC 1 // if free(valloc(3)) works, or * if none is provided, we implement malloc(3)-based alloc-only page alignment */ #if !(HAVE_COMPLIANT_POSIX_MEMALIGN || HAVE_MEMALIGN || HAVE_VALLOC) static GTrashStack *compat_valloc_trash = NULL; #endif static gpointer allocator_memalign (gsize alignment, gsize memsize) { gpointer aligned_memory = NULL; gint err = ENOMEM; #if HAVE_COMPLIANT_POSIX_MEMALIGN err = posix_memalign (&aligned_memory, alignment, memsize); #elif HAVE_MEMALIGN errno = 0; aligned_memory = memalign (alignment, memsize); err = errno; #elif HAVE_VALLOC errno = 0; aligned_memory = valloc (memsize); err = errno; #else /* simplistic non-freeing page allocator */ mem_assert (alignment == sys_page_size); mem_assert (memsize <= sys_page_size); if (!compat_valloc_trash) { const guint n_pages = 16; guint8 *mem = malloc (n_pages * sys_page_size); err = errno; if (mem) { gint i = n_pages; guint8 *amem = (guint8*) ALIGN ((gsize) mem, sys_page_size); if (amem != mem) i--; /* mem wasn't page aligned */ while (--i >= 0) g_trash_stack_push (&compat_valloc_trash, amem + i * sys_page_size); } } aligned_memory = g_trash_stack_pop (&compat_valloc_trash); #endif if (!aligned_memory) errno = err; return aligned_memory; } static void allocator_memfree (gsize memsize, gpointer mem) { #if HAVE_COMPLIANT_POSIX_MEMALIGN || HAVE_MEMALIGN || HAVE_VALLOC free (mem); #else mem_assert (memsize <= sys_page_size); g_trash_stack_push (&compat_valloc_trash, mem); #endif } static void mem_error (const char *format, ...) { const char *pname; va_list args; /* at least, put out "MEMORY-ERROR", in case we segfault during the rest of the function */ fputs ("\n***MEMORY-ERROR***: ", stderr); pname = g_get_prgname(); fprintf (stderr, "%s[%ld]: GSlice: ", pname ? pname : "", (long)getpid()); va_start (args, format); vfprintf (stderr, format, args); va_end (args); fputs ("\n", stderr); abort(); _exit (1); } /* --- g-slice memory checker tree --- */ typedef size_t SmcKType; /* key type */ typedef size_t SmcVType; /* value type */ typedef struct { SmcKType key; SmcVType value; } SmcEntry; static void smc_tree_insert (SmcKType key, SmcVType value); static gboolean smc_tree_lookup (SmcKType key, SmcVType *value_p); static gboolean smc_tree_remove (SmcKType key); /* --- g-slice memory checker implementation --- */ static void smc_notify_alloc (void *pointer, size_t size) { size_t adress = (size_t) pointer; if (pointer) smc_tree_insert (adress, size); } #if 0 static void smc_notify_ignore (void *pointer) { size_t adress = (size_t) pointer; if (pointer) smc_tree_remove (adress); } #endif static int smc_notify_free (void *pointer, size_t size) { size_t adress = (size_t) pointer; SmcVType real_size; gboolean found_one; if (!pointer) return 1; /* ignore */ found_one = smc_tree_lookup (adress, &real_size); if (!found_one) { fprintf (stderr, "GSlice: MemChecker: attempt to release non-allocated block: %p size=%" G_GSIZE_FORMAT "\n", pointer, size); return 0; } if (real_size != size && (real_size || size)) { fprintf (stderr, "GSlice: MemChecker: attempt to release block with invalid size: %p size=%" G_GSIZE_FORMAT " invalid-size=%" G_GSIZE_FORMAT "\n", pointer, real_size, size); return 0; } if (!smc_tree_remove (adress)) { fprintf (stderr, "GSlice: MemChecker: attempt to release non-allocated block: %p size=%" G_GSIZE_FORMAT "\n", pointer, size); return 0; } return 1; /* all fine */ } /* --- g-slice memory checker tree implementation --- */ #define SMC_TRUNK_COUNT (4093 /* 16381 */) /* prime, to distribute trunk collisions (big, allocated just once) */ #define SMC_BRANCH_COUNT (511) /* prime, to distribute branch collisions */ #define SMC_TRUNK_EXTENT (SMC_BRANCH_COUNT * 2039) /* key address space per trunk, should distribute uniformly across BRANCH_COUNT */ #define SMC_TRUNK_HASH(k) ((k / SMC_TRUNK_EXTENT) % SMC_TRUNK_COUNT) /* generate new trunk hash per megabyte (roughly) */ #define SMC_BRANCH_HASH(k) (k % SMC_BRANCH_COUNT) typedef struct { SmcEntry *entries; unsigned int n_entries; } SmcBranch; static SmcBranch **smc_tree_root = NULL; static void smc_tree_abort (int errval) { const char *syserr = "unknown error"; #if HAVE_STRERROR syserr = strerror (errval); #endif mem_error ("MemChecker: failure in debugging tree: %s", syserr); } static inline SmcEntry* smc_tree_branch_grow_L (SmcBranch *branch, unsigned int index) { unsigned int old_size = branch->n_entries * sizeof (branch->entries[0]); unsigned int new_size = old_size + sizeof (branch->entries[0]); SmcEntry *entry; mem_assert (index <= branch->n_entries); branch->entries = (SmcEntry*) realloc (branch->entries, new_size); if (!branch->entries) smc_tree_abort (errno); entry = branch->entries + index; g_memmove (entry + 1, entry, (branch->n_entries - index) * sizeof (entry[0])); branch->n_entries += 1; return entry; } static inline SmcEntry* smc_tree_branch_lookup_nearest_L (SmcBranch *branch, SmcKType key) { unsigned int n_nodes = branch->n_entries, offs = 0; SmcEntry *check = branch->entries; int cmp = 0; while (offs < n_nodes) { unsigned int i = (offs + n_nodes) >> 1; check = branch->entries + i; cmp = key < check->key ? -1 : key != check->key; if (cmp == 0) return check; /* return exact match */ else if (cmp < 0) n_nodes = i; else /* (cmp > 0) */ offs = i + 1; } /* check points at last mismatch, cmp > 0 indicates greater key */ return cmp > 0 ? check + 1 : check; /* return insertion position for inexact match */ } static void smc_tree_insert (SmcKType key, SmcVType value) { unsigned int ix0, ix1; SmcEntry *entry; g_mutex_lock (&smc_tree_mutex); ix0 = SMC_TRUNK_HASH (key); ix1 = SMC_BRANCH_HASH (key); if (!smc_tree_root) { smc_tree_root = calloc (SMC_TRUNK_COUNT, sizeof (smc_tree_root[0])); if (!smc_tree_root) smc_tree_abort (errno); } if (!smc_tree_root[ix0]) { smc_tree_root[ix0] = calloc (SMC_BRANCH_COUNT, sizeof (smc_tree_root[0][0])); if (!smc_tree_root[ix0]) smc_tree_abort (errno); } entry = smc_tree_branch_lookup_nearest_L (&smc_tree_root[ix0][ix1], key); if (!entry || /* need create */ entry >= smc_tree_root[ix0][ix1].entries + smc_tree_root[ix0][ix1].n_entries || /* need append */ entry->key != key) /* need insert */ entry = smc_tree_branch_grow_L (&smc_tree_root[ix0][ix1], entry - smc_tree_root[ix0][ix1].entries); entry->key = key; entry->value = value; g_mutex_unlock (&smc_tree_mutex); } static gboolean smc_tree_lookup (SmcKType key, SmcVType *value_p) { SmcEntry *entry = NULL; unsigned int ix0 = SMC_TRUNK_HASH (key), ix1 = SMC_BRANCH_HASH (key); gboolean found_one = FALSE; *value_p = 0; g_mutex_lock (&smc_tree_mutex); if (smc_tree_root && smc_tree_root[ix0]) { entry = smc_tree_branch_lookup_nearest_L (&smc_tree_root[ix0][ix1], key); if (entry && entry < smc_tree_root[ix0][ix1].entries + smc_tree_root[ix0][ix1].n_entries && entry->key == key) { found_one = TRUE; *value_p = entry->value; } } g_mutex_unlock (&smc_tree_mutex); return found_one; } static gboolean smc_tree_remove (SmcKType key) { unsigned int ix0 = SMC_TRUNK_HASH (key), ix1 = SMC_BRANCH_HASH (key); gboolean found_one = FALSE; g_mutex_lock (&smc_tree_mutex); if (smc_tree_root && smc_tree_root[ix0]) { SmcEntry *entry = smc_tree_branch_lookup_nearest_L (&smc_tree_root[ix0][ix1], key); if (entry && entry < smc_tree_root[ix0][ix1].entries + smc_tree_root[ix0][ix1].n_entries && entry->key == key) { unsigned int i = entry - smc_tree_root[ix0][ix1].entries; smc_tree_root[ix0][ix1].n_entries -= 1; g_memmove (entry, entry + 1, (smc_tree_root[ix0][ix1].n_entries - i) * sizeof (entry[0])); if (!smc_tree_root[ix0][ix1].n_entries) { /* avoid useless pressure on the memory system */ free (smc_tree_root[ix0][ix1].entries); smc_tree_root[ix0][ix1].entries = NULL; } found_one = TRUE; } } g_mutex_unlock (&smc_tree_mutex); return found_one; } #ifdef G_ENABLE_DEBUG void g_slice_debug_tree_statistics (void) { g_mutex_lock (&smc_tree_mutex); if (smc_tree_root) { unsigned int i, j, t = 0, o = 0, b = 0, su = 0, ex = 0, en = 4294967295u; double tf, bf; for (i = 0; i < SMC_TRUNK_COUNT; i++) if (smc_tree_root[i]) { t++; for (j = 0; j < SMC_BRANCH_COUNT; j++) if (smc_tree_root[i][j].n_entries) { b++; su += smc_tree_root[i][j].n_entries; en = MIN (en, smc_tree_root[i][j].n_entries); ex = MAX (ex, smc_tree_root[i][j].n_entries); } else if (smc_tree_root[i][j].entries) o++; /* formerly used, now empty */ } en = b ? en : 0; tf = MAX (t, 1.0); /* max(1) to be a valid divisor */ bf = MAX (b, 1.0); /* max(1) to be a valid divisor */ fprintf (stderr, "GSlice: MemChecker: %u trunks, %u branches, %u old branches\n", t, b, o); fprintf (stderr, "GSlice: MemChecker: %f branches per trunk, %.2f%% utilization\n", b / tf, 100.0 - (SMC_BRANCH_COUNT - b / tf) / (0.01 * SMC_BRANCH_COUNT)); fprintf (stderr, "GSlice: MemChecker: %f entries per branch, %u minimum, %u maximum\n", su / bf, en, ex); } else fprintf (stderr, "GSlice: MemChecker: root=NULL\n"); g_mutex_unlock (&smc_tree_mutex); /* sample statistics (beast + GSLice + 24h scripted core & GUI activity): * PID %CPU %MEM VSZ RSS COMMAND * 8887 30.3 45.8 456068 414856 beast-0.7.1 empty.bse * $ cat /proc/8887/statm # total-program-size resident-set-size shared-pages text/code data/stack library dirty-pages * 114017 103714 2354 344 0 108676 0 * $ cat /proc/8887/status * Name: beast-0.7.1 * VmSize: 456068 kB * VmLck: 0 kB * VmRSS: 414856 kB * VmData: 434620 kB * VmStk: 84 kB * VmExe: 1376 kB * VmLib: 13036 kB * VmPTE: 456 kB * Threads: 3 * (gdb) print g_slice_debug_tree_statistics () * GSlice: MemChecker: 422 trunks, 213068 branches, 0 old branches * GSlice: MemChecker: 504.900474 branches per trunk, 98.81% utilization * GSlice: MemChecker: 4.965039 entries per branch, 1 minimum, 37 maximum */ } #endif /* G_ENABLE_DEBUG */ pkg-config-0.29.1/glib/glib/gscanner.c0000664000175000017500000016306212651243552014365 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * GScanner: Flexible lexical scanner for general purpose. * Copyright (C) 1997, 1998 Tim Janik * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the GLib Team and others 1997-2000. See the AUTHORS * file for a list of people on the GLib Team. See the ChangeLog * files for a list of changes. These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/. */ /* * MT safe */ #include "config.h" #include #include #include #include #include #ifdef HAVE_UNISTD_H #include #endif #include "gscanner.h" #include "gprintfint.h" #include "gstrfuncs.h" #include "gstring.h" #include "gtestutils.h" #ifdef G_OS_WIN32 #include /* For _read() */ #endif /** * SECTION:scanner * @title: Lexical Scanner * @short_description: a general purpose lexical scanner * * The #GScanner and its associated functions provide a * general purpose lexical scanner. */ /** * GScannerMsgFunc: * @scanner: a #GScanner * @message: the message * @error: %TRUE if the message signals an error, * %FALSE if it signals a warning. * * Specifies the type of the message handler function. */ /** * G_CSET_a_2_z: * * The set of lowercase ASCII alphabet characters. * Used for specifying valid identifier characters * in #GScannerConfig. */ /** * G_CSET_A_2_Z: * * The set of uppercase ASCII alphabet characters. * Used for specifying valid identifier characters * in #GScannerConfig. */ /** * G_CSET_LATINC: * * The set of uppercase ISO 8859-1 alphabet characters * which are not ASCII characters. * Used for specifying valid identifier characters * in #GScannerConfig. */ /** * G_CSET_LATINS: * * The set of lowercase ISO 8859-1 alphabet characters * which are not ASCII characters. * Used for specifying valid identifier characters * in #GScannerConfig. */ /** * GTokenType: * @G_TOKEN_EOF: the end of the file * @G_TOKEN_LEFT_PAREN: a '(' character * @G_TOKEN_LEFT_CURLY: a '{' character * @G_TOKEN_LEFT_BRACE: a '[' character * @G_TOKEN_RIGHT_CURLY: a '}' character * @G_TOKEN_RIGHT_PAREN: a ')' character * @G_TOKEN_RIGHT_BRACE: a ']' character * @G_TOKEN_EQUAL_SIGN: a '=' character * @G_TOKEN_COMMA: a ',' character * @G_TOKEN_NONE: not a token * @G_TOKEN_ERROR: an error occurred * @G_TOKEN_CHAR: a character * @G_TOKEN_BINARY: a binary integer * @G_TOKEN_OCTAL: an octal integer * @G_TOKEN_INT: an integer * @G_TOKEN_HEX: a hex integer * @G_TOKEN_FLOAT: a floating point number * @G_TOKEN_STRING: a string * @G_TOKEN_SYMBOL: a symbol * @G_TOKEN_IDENTIFIER: an identifier * @G_TOKEN_IDENTIFIER_NULL: a null identifier * @G_TOKEN_COMMENT_SINGLE: one line comment * @G_TOKEN_COMMENT_MULTI: multi line comment * * The possible types of token returned from each * g_scanner_get_next_token() call. */ /** * GTokenValue: * @v_symbol: token symbol value * @v_identifier: token identifier value * @v_binary: token binary integer value * @v_octal: octal integer value * @v_int: integer value * @v_int64: 64-bit integer value * @v_float: floating point value * @v_hex: hex integer value * @v_string: string value * @v_comment: comment value * @v_char: character value * @v_error: error value * * A union holding the value of the token. */ /** * GErrorType: * @G_ERR_UNKNOWN: unknown error * @G_ERR_UNEXP_EOF: unexpected end of file * @G_ERR_UNEXP_EOF_IN_STRING: unterminated string constant * @G_ERR_UNEXP_EOF_IN_COMMENT: unterminated comment * @G_ERR_NON_DIGIT_IN_CONST: non-digit character in a number * @G_ERR_DIGIT_RADIX: digit beyond radix in a number * @G_ERR_FLOAT_RADIX: non-decimal floating point number * @G_ERR_FLOAT_MALFORMED: malformed floating point number * * The possible errors, used in the @v_error field * of #GTokenValue, when the token is a %G_TOKEN_ERROR. */ /** * GScanner: * @user_data: unused * @max_parse_errors: unused * @parse_errors: g_scanner_error() increments this field * @input_name: name of input stream, featured by the default message handler * @qdata: quarked data * @config: link into the scanner configuration * @token: token parsed by the last g_scanner_get_next_token() * @value: value of the last token from g_scanner_get_next_token() * @line: line number of the last token from g_scanner_get_next_token() * @position: char number of the last token from g_scanner_get_next_token() * @next_token: token parsed by the last g_scanner_peek_next_token() * @next_value: value of the last token from g_scanner_peek_next_token() * @next_line: line number of the last token from g_scanner_peek_next_token() * @next_position: char number of the last token from g_scanner_peek_next_token() * @msg_handler: handler function for _warn and _error * * The data structure representing a lexical scanner. * * You should set @input_name after creating the scanner, since * it is used by the default message handler when displaying * warnings and errors. If you are scanning a file, the filename * would be a good choice. * * The @user_data and @max_parse_errors fields are not used. * If you need to associate extra data with the scanner you * can place them here. * * If you want to use your own message handler you can set the * @msg_handler field. The type of the message handler function * is declared by #GScannerMsgFunc. */ /** * GScannerConfig: * @cset_skip_characters: specifies which characters should be skipped * by the scanner (the default is the whitespace characters: space, * tab, carriage-return and line-feed). * @cset_identifier_first: specifies the characters which can start * identifiers (the default is #G_CSET_a_2_z, "_", and #G_CSET_A_2_Z). * @cset_identifier_nth: specifies the characters which can be used * in identifiers, after the first character (the default is * #G_CSET_a_2_z, "_0123456789", #G_CSET_A_2_Z, #G_CSET_LATINS, * #G_CSET_LATINC). * @cpair_comment_single: specifies the characters at the start and * end of single-line comments. The default is "#\n" which means * that single-line comments start with a '#' and continue until * a '\n' (end of line). * @case_sensitive: specifies if symbols are case sensitive (the * default is %FALSE). * @skip_comment_multi: specifies if multi-line comments are skipped * and not returned as tokens (the default is %TRUE). * @skip_comment_single: specifies if single-line comments are skipped * and not returned as tokens (the default is %TRUE). * @scan_comment_multi: specifies if multi-line comments are recognized * (the default is %TRUE). * @scan_identifier: specifies if identifiers are recognized (the * default is %TRUE). * @scan_identifier_1char: specifies if single-character * identifiers are recognized (the default is %FALSE). * @scan_identifier_NULL: specifies if %NULL is reported as * %G_TOKEN_IDENTIFIER_NULL (the default is %FALSE). * @scan_symbols: specifies if symbols are recognized (the default * is %TRUE). * @scan_binary: specifies if binary numbers are recognized (the * default is %FALSE). * @scan_octal: specifies if octal numbers are recognized (the * default is %TRUE). * @scan_float: specifies if floating point numbers are recognized * (the default is %TRUE). * @scan_hex: specifies if hexadecimal numbers are recognized (the * default is %TRUE). * @scan_hex_dollar: specifies if '$' is recognized as a prefix for * hexadecimal numbers (the default is %FALSE). * @scan_string_sq: specifies if strings can be enclosed in single * quotes (the default is %TRUE). * @scan_string_dq: specifies if strings can be enclosed in double * quotes (the default is %TRUE). * @numbers_2_int: specifies if binary, octal and hexadecimal numbers * are reported as #G_TOKEN_INT (the default is %TRUE). * @int_2_float: specifies if all numbers are reported as %G_TOKEN_FLOAT * (the default is %FALSE). * @identifier_2_string: specifies if identifiers are reported as strings * (the default is %FALSE). * @char_2_token: specifies if characters are reported by setting * token = ch or as %G_TOKEN_CHAR (the default * is %TRUE). * @symbol_2_token: specifies if symbols are reported by setting * token = v_symbol or as %G_TOKEN_SYMBOL (the * default is %FALSE). * @scope_0_fallback: specifies if a symbol is searched for in the * default scope in addition to the current scope (the default is %FALSE). * @store_int64: use value.v_int64 rather than v_int * * Specifies the #GScanner parser configuration. Most settings can * be changed during the parsing phase and will affect the lexical * parsing of the next unpeeked token. */ /* --- defines --- */ #define to_lower(c) ( \ (guchar) ( \ ( (((guchar)(c))>='A' && ((guchar)(c))<='Z') * ('a'-'A') ) | \ ( (((guchar)(c))>=192 && ((guchar)(c))<=214) * (224-192) ) | \ ( (((guchar)(c))>=216 && ((guchar)(c))<=222) * (248-216) ) | \ ((guchar)(c)) \ ) \ ) #define READ_BUFFER_SIZE (4000) /* --- typedefs --- */ typedef struct _GScannerKey GScannerKey; struct _GScannerKey { guint scope_id; gchar *symbol; gpointer value; }; /* --- variables --- */ static const GScannerConfig g_scanner_config_template = { ( " \t\r\n" ) /* cset_skip_characters */, ( G_CSET_a_2_z "_" G_CSET_A_2_Z ) /* cset_identifier_first */, ( G_CSET_a_2_z "_" G_CSET_A_2_Z G_CSET_DIGITS G_CSET_LATINS G_CSET_LATINC ) /* cset_identifier_nth */, ( "#\n" ) /* cpair_comment_single */, FALSE /* case_sensitive */, TRUE /* skip_comment_multi */, TRUE /* skip_comment_single */, TRUE /* scan_comment_multi */, TRUE /* scan_identifier */, FALSE /* scan_identifier_1char */, FALSE /* scan_identifier_NULL */, TRUE /* scan_symbols */, FALSE /* scan_binary */, TRUE /* scan_octal */, TRUE /* scan_float */, TRUE /* scan_hex */, FALSE /* scan_hex_dollar */, TRUE /* scan_string_sq */, TRUE /* scan_string_dq */, TRUE /* numbers_2_int */, FALSE /* int_2_float */, FALSE /* identifier_2_string */, TRUE /* char_2_token */, FALSE /* symbol_2_token */, FALSE /* scope_0_fallback */, FALSE /* store_int64 */, }; /* --- prototypes --- */ static inline GScannerKey* g_scanner_lookup_internal (GScanner *scanner, guint scope_id, const gchar *symbol); static gboolean g_scanner_key_equal (gconstpointer v1, gconstpointer v2); static guint g_scanner_key_hash (gconstpointer v); static void g_scanner_get_token_ll (GScanner *scanner, GTokenType *token_p, GTokenValue *value_p, guint *line_p, guint *position_p); static void g_scanner_get_token_i (GScanner *scanner, GTokenType *token_p, GTokenValue *value_p, guint *line_p, guint *position_p); static guchar g_scanner_peek_next_char (GScanner *scanner); static guchar g_scanner_get_char (GScanner *scanner, guint *line_p, guint *position_p); static void g_scanner_msg_handler (GScanner *scanner, gchar *message, gboolean is_error); /* --- functions --- */ static inline gint g_scanner_char_2_num (guchar c, guchar base) { if (c >= '0' && c <= '9') c -= '0'; else if (c >= 'A' && c <= 'Z') c -= 'A' - 10; else if (c >= 'a' && c <= 'z') c -= 'a' - 10; else return -1; if (c < base) return c; return -1; } /** * g_scanner_new: * @config_templ: the initial scanner settings * * Creates a new #GScanner. * * The @config_templ structure specifies the initial settings * of the scanner, which are copied into the #GScanner * @config field. If you pass %NULL then the default settings * are used. * * Returns: the new #GScanner */ GScanner * g_scanner_new (const GScannerConfig *config_templ) { GScanner *scanner; if (!config_templ) config_templ = &g_scanner_config_template; scanner = g_new0 (GScanner, 1); scanner->user_data = NULL; scanner->max_parse_errors = 1; scanner->parse_errors = 0; scanner->input_name = NULL; g_datalist_init (&scanner->qdata); scanner->config = g_new0 (GScannerConfig, 1); scanner->config->case_sensitive = config_templ->case_sensitive; scanner->config->cset_skip_characters = config_templ->cset_skip_characters; if (!scanner->config->cset_skip_characters) scanner->config->cset_skip_characters = ""; scanner->config->cset_identifier_first = config_templ->cset_identifier_first; scanner->config->cset_identifier_nth = config_templ->cset_identifier_nth; scanner->config->cpair_comment_single = config_templ->cpair_comment_single; scanner->config->skip_comment_multi = config_templ->skip_comment_multi; scanner->config->skip_comment_single = config_templ->skip_comment_single; scanner->config->scan_comment_multi = config_templ->scan_comment_multi; scanner->config->scan_identifier = config_templ->scan_identifier; scanner->config->scan_identifier_1char = config_templ->scan_identifier_1char; scanner->config->scan_identifier_NULL = config_templ->scan_identifier_NULL; scanner->config->scan_symbols = config_templ->scan_symbols; scanner->config->scan_binary = config_templ->scan_binary; scanner->config->scan_octal = config_templ->scan_octal; scanner->config->scan_float = config_templ->scan_float; scanner->config->scan_hex = config_templ->scan_hex; scanner->config->scan_hex_dollar = config_templ->scan_hex_dollar; scanner->config->scan_string_sq = config_templ->scan_string_sq; scanner->config->scan_string_dq = config_templ->scan_string_dq; scanner->config->numbers_2_int = config_templ->numbers_2_int; scanner->config->int_2_float = config_templ->int_2_float; scanner->config->identifier_2_string = config_templ->identifier_2_string; scanner->config->char_2_token = config_templ->char_2_token; scanner->config->symbol_2_token = config_templ->symbol_2_token; scanner->config->scope_0_fallback = config_templ->scope_0_fallback; scanner->config->store_int64 = config_templ->store_int64; scanner->token = G_TOKEN_NONE; scanner->value.v_int64 = 0; scanner->line = 1; scanner->position = 0; scanner->next_token = G_TOKEN_NONE; scanner->next_value.v_int64 = 0; scanner->next_line = 1; scanner->next_position = 0; scanner->symbol_table = g_hash_table_new (g_scanner_key_hash, g_scanner_key_equal); scanner->input_fd = -1; scanner->text = NULL; scanner->text_end = NULL; scanner->buffer = NULL; scanner->scope_id = 0; scanner->msg_handler = g_scanner_msg_handler; return scanner; } static inline void g_scanner_free_value (GTokenType *token_p, GTokenValue *value_p) { switch (*token_p) { case G_TOKEN_STRING: case G_TOKEN_IDENTIFIER: case G_TOKEN_IDENTIFIER_NULL: case G_TOKEN_COMMENT_SINGLE: case G_TOKEN_COMMENT_MULTI: g_free (value_p->v_string); break; default: break; } *token_p = G_TOKEN_NONE; } static void g_scanner_destroy_symbol_table_entry (gpointer _key, gpointer _value, gpointer _data) { GScannerKey *key = _key; g_free (key->symbol); g_free (key); } /** * g_scanner_destroy: * @scanner: a #GScanner * * Frees all memory used by the #GScanner. */ void g_scanner_destroy (GScanner *scanner) { g_return_if_fail (scanner != NULL); g_datalist_clear (&scanner->qdata); g_hash_table_foreach (scanner->symbol_table, g_scanner_destroy_symbol_table_entry, NULL); g_hash_table_destroy (scanner->symbol_table); g_scanner_free_value (&scanner->token, &scanner->value); g_scanner_free_value (&scanner->next_token, &scanner->next_value); g_free (scanner->config); g_free (scanner->buffer); g_free (scanner); } static void g_scanner_msg_handler (GScanner *scanner, gchar *message, gboolean is_error) { g_return_if_fail (scanner != NULL); _g_fprintf (stderr, "%s:%d: ", scanner->input_name ? scanner->input_name : "", scanner->line); if (is_error) _g_fprintf (stderr, "error: "); _g_fprintf (stderr, "%s\n", message); } /** * g_scanner_error: * @scanner: a #GScanner * @format: the message format. See the printf() documentation * @...: the parameters to insert into the format string * * Outputs an error message, via the #GScanner message handler. */ void g_scanner_error (GScanner *scanner, const gchar *format, ...) { g_return_if_fail (scanner != NULL); g_return_if_fail (format != NULL); scanner->parse_errors++; if (scanner->msg_handler) { va_list args; gchar *string; va_start (args, format); string = g_strdup_vprintf (format, args); va_end (args); scanner->msg_handler (scanner, string, TRUE); g_free (string); } } /** * g_scanner_warn: * @scanner: a #GScanner * @format: the message format. See the printf() documentation * @...: the parameters to insert into the format string * * Outputs a warning message, via the #GScanner message handler. */ void g_scanner_warn (GScanner *scanner, const gchar *format, ...) { g_return_if_fail (scanner != NULL); g_return_if_fail (format != NULL); if (scanner->msg_handler) { va_list args; gchar *string; va_start (args, format); string = g_strdup_vprintf (format, args); va_end (args); scanner->msg_handler (scanner, string, FALSE); g_free (string); } } static gboolean g_scanner_key_equal (gconstpointer v1, gconstpointer v2) { const GScannerKey *key1 = v1; const GScannerKey *key2 = v2; return (key1->scope_id == key2->scope_id) && (strcmp (key1->symbol, key2->symbol) == 0); } static guint g_scanner_key_hash (gconstpointer v) { const GScannerKey *key = v; gchar *c; guint h; h = key->scope_id; for (c = key->symbol; *c; c++) h = (h << 5) - h + *c; return h; } static inline GScannerKey* g_scanner_lookup_internal (GScanner *scanner, guint scope_id, const gchar *symbol) { GScannerKey *key_p; GScannerKey key; key.scope_id = scope_id; if (!scanner->config->case_sensitive) { gchar *d; const gchar *c; key.symbol = g_new (gchar, strlen (symbol) + 1); for (d = key.symbol, c = symbol; *c; c++, d++) *d = to_lower (*c); *d = 0; key_p = g_hash_table_lookup (scanner->symbol_table, &key); g_free (key.symbol); } else { key.symbol = (gchar*) symbol; key_p = g_hash_table_lookup (scanner->symbol_table, &key); } return key_p; } /** * g_scanner_add_symbol: * @scanner: a #GScanner * @symbol: the symbol to add * @value: the value of the symbol * * Adds a symbol to the default scope. * * Deprecated: 2.2: Use g_scanner_scope_add_symbol() instead. */ /** * g_scanner_scope_add_symbol: * @scanner: a #GScanner * @scope_id: the scope id * @symbol: the symbol to add * @value: the value of the symbol * * Adds a symbol to the given scope. */ void g_scanner_scope_add_symbol (GScanner *scanner, guint scope_id, const gchar *symbol, gpointer value) { GScannerKey *key; g_return_if_fail (scanner != NULL); g_return_if_fail (symbol != NULL); key = g_scanner_lookup_internal (scanner, scope_id, symbol); if (!key) { key = g_new (GScannerKey, 1); key->scope_id = scope_id; key->symbol = g_strdup (symbol); key->value = value; if (!scanner->config->case_sensitive) { gchar *c; c = key->symbol; while (*c != 0) { *c = to_lower (*c); c++; } } g_hash_table_insert (scanner->symbol_table, key, key); } else key->value = value; } /** * g_scanner_remove_symbol: * @scanner: a #GScanner * @symbol: the symbol to remove * * Removes a symbol from the default scope. * * Deprecated: 2.2: Use g_scanner_scope_remove_symbol() instead. */ /** * g_scanner_scope_remove_symbol: * @scanner: a #GScanner * @scope_id: the scope id * @symbol: the symbol to remove * * Removes a symbol from a scope. */ void g_scanner_scope_remove_symbol (GScanner *scanner, guint scope_id, const gchar *symbol) { GScannerKey *key; g_return_if_fail (scanner != NULL); g_return_if_fail (symbol != NULL); key = g_scanner_lookup_internal (scanner, scope_id, symbol); if (key) { g_hash_table_remove (scanner->symbol_table, key); g_free (key->symbol); g_free (key); } } /** * g_scanner_freeze_symbol_table: * @scanner: a #GScanner * * There is no reason to use this macro, since it does nothing. * * Deprecated: 2.2: This macro does nothing. */ /** * g_scanner_thaw_symbol_table: * @scanner: a #GScanner * * There is no reason to use this macro, since it does nothing. * * Deprecated: 2.2: This macro does nothing. */ /** * g_scanner_lookup_symbol: * @scanner: a #GScanner * @symbol: the symbol to look up * * Looks up a symbol in the current scope and return its value. * If the symbol is not bound in the current scope, %NULL is * returned. * * Returns: the value of @symbol in the current scope, or %NULL * if @symbol is not bound in the current scope */ gpointer g_scanner_lookup_symbol (GScanner *scanner, const gchar *symbol) { GScannerKey *key; guint scope_id; g_return_val_if_fail (scanner != NULL, NULL); if (!symbol) return NULL; scope_id = scanner->scope_id; key = g_scanner_lookup_internal (scanner, scope_id, symbol); if (!key && scope_id && scanner->config->scope_0_fallback) key = g_scanner_lookup_internal (scanner, 0, symbol); if (key) return key->value; else return NULL; } /** * g_scanner_scope_lookup_symbol: * @scanner: a #GScanner * @scope_id: the scope id * @symbol: the symbol to look up * * Looks up a symbol in a scope and return its value. If the * symbol is not bound in the scope, %NULL is returned. * * Returns: the value of @symbol in the given scope, or %NULL * if @symbol is not bound in the given scope. * */ gpointer g_scanner_scope_lookup_symbol (GScanner *scanner, guint scope_id, const gchar *symbol) { GScannerKey *key; g_return_val_if_fail (scanner != NULL, NULL); if (!symbol) return NULL; key = g_scanner_lookup_internal (scanner, scope_id, symbol); if (key) return key->value; else return NULL; } /** * g_scanner_set_scope: * @scanner: a #GScanner * @scope_id: the new scope id * * Sets the current scope. * * Returns: the old scope id */ guint g_scanner_set_scope (GScanner *scanner, guint scope_id) { guint old_scope_id; g_return_val_if_fail (scanner != NULL, 0); old_scope_id = scanner->scope_id; scanner->scope_id = scope_id; return old_scope_id; } static void g_scanner_foreach_internal (gpointer _key, gpointer _value, gpointer _user_data) { GScannerKey *key; gpointer *d; GHFunc func; gpointer user_data; guint *scope_id; d = _user_data; func = (GHFunc) d[0]; user_data = d[1]; scope_id = d[2]; key = _value; if (key->scope_id == *scope_id) func (key->symbol, key->value, user_data); } /** * g_scanner_foreach_symbol: * @scanner: a #GScanner * @func: the function to call with each symbol * @data: data to pass to the function * * Calls a function for each symbol in the default scope. * * Deprecated: 2.2: Use g_scanner_scope_foreach_symbol() instead. */ /** * g_scanner_scope_foreach_symbol: * @scanner: a #GScanner * @scope_id: the scope id * @func: the function to call for each symbol/value pair * @user_data: user data to pass to the function * * Calls the given function for each of the symbol/value pairs * in the given scope of the #GScanner. The function is passed * the symbol and value of each pair, and the given @user_data * parameter. */ void g_scanner_scope_foreach_symbol (GScanner *scanner, guint scope_id, GHFunc func, gpointer user_data) { gpointer d[3]; g_return_if_fail (scanner != NULL); d[0] = (gpointer) func; d[1] = user_data; d[2] = &scope_id; g_hash_table_foreach (scanner->symbol_table, g_scanner_foreach_internal, d); } /** * g_scanner_peek_next_token: * @scanner: a #GScanner * * Parses the next token, without removing it from the input stream. * The token data is placed in the @next_token, @next_value, @next_line, * and @next_position fields of the #GScanner structure. * * Note that, while the token is not removed from the input stream * (i.e. the next call to g_scanner_get_next_token() will return the * same token), it will not be reevaluated. This can lead to surprising * results when changing scope or the scanner configuration after peeking * the next token. Getting the next token after switching the scope or * configuration will return whatever was peeked before, regardless of * any symbols that may have been added or removed in the new scope. * * Returns: the type of the token */ GTokenType g_scanner_peek_next_token (GScanner *scanner) { g_return_val_if_fail (scanner != NULL, G_TOKEN_EOF); if (scanner->next_token == G_TOKEN_NONE) { scanner->next_line = scanner->line; scanner->next_position = scanner->position; g_scanner_get_token_i (scanner, &scanner->next_token, &scanner->next_value, &scanner->next_line, &scanner->next_position); } return scanner->next_token; } /** * g_scanner_get_next_token: * @scanner: a #GScanner * * Parses the next token just like g_scanner_peek_next_token() * and also removes it from the input stream. The token data is * placed in the @token, @value, @line, and @position fields of * the #GScanner structure. * * Returns: the type of the token */ GTokenType g_scanner_get_next_token (GScanner *scanner) { g_return_val_if_fail (scanner != NULL, G_TOKEN_EOF); if (scanner->next_token != G_TOKEN_NONE) { g_scanner_free_value (&scanner->token, &scanner->value); scanner->token = scanner->next_token; scanner->value = scanner->next_value; scanner->line = scanner->next_line; scanner->position = scanner->next_position; scanner->next_token = G_TOKEN_NONE; } else g_scanner_get_token_i (scanner, &scanner->token, &scanner->value, &scanner->line, &scanner->position); return scanner->token; } /** * g_scanner_cur_token: * @scanner: a #GScanner * * Gets the current token type. This is simply the @token * field in the #GScanner structure. * * Returns: the current token type */ GTokenType g_scanner_cur_token (GScanner *scanner) { g_return_val_if_fail (scanner != NULL, G_TOKEN_EOF); return scanner->token; } /** * g_scanner_cur_value: * @scanner: a #GScanner * * Gets the current token value. This is simply the @value * field in the #GScanner structure. * * Returns: the current token value */ GTokenValue g_scanner_cur_value (GScanner *scanner) { GTokenValue v; v.v_int64 = 0; g_return_val_if_fail (scanner != NULL, v); /* MSC isn't capable of handling return scanner->value; ? */ v = scanner->value; return v; } /** * g_scanner_cur_line: * @scanner: a #GScanner * * Returns the current line in the input stream (counting * from 1). This is the line of the last token parsed via * g_scanner_get_next_token(). * * Returns: the current line */ guint g_scanner_cur_line (GScanner *scanner) { g_return_val_if_fail (scanner != NULL, 0); return scanner->line; } /** * g_scanner_cur_position: * @scanner: a #GScanner * * Returns the current position in the current line (counting * from 0). This is the position of the last token parsed via * g_scanner_get_next_token(). * * Returns: the current position on the line */ guint g_scanner_cur_position (GScanner *scanner) { g_return_val_if_fail (scanner != NULL, 0); return scanner->position; } /** * g_scanner_eof: * @scanner: a #GScanner * * Returns %TRUE if the scanner has reached the end of * the file or text buffer. * * Returns: %TRUE if the scanner has reached the end of * the file or text buffer */ gboolean g_scanner_eof (GScanner *scanner) { g_return_val_if_fail (scanner != NULL, TRUE); return scanner->token == G_TOKEN_EOF || scanner->token == G_TOKEN_ERROR; } /** * g_scanner_input_file: * @scanner: a #GScanner * @input_fd: a file descriptor * * Prepares to scan a file. */ void g_scanner_input_file (GScanner *scanner, gint input_fd) { g_return_if_fail (scanner != NULL); g_return_if_fail (input_fd >= 0); if (scanner->input_fd >= 0) g_scanner_sync_file_offset (scanner); scanner->token = G_TOKEN_NONE; scanner->value.v_int64 = 0; scanner->line = 1; scanner->position = 0; scanner->next_token = G_TOKEN_NONE; scanner->input_fd = input_fd; scanner->text = NULL; scanner->text_end = NULL; if (!scanner->buffer) scanner->buffer = g_new (gchar, READ_BUFFER_SIZE + 1); } /** * g_scanner_input_text: * @scanner: a #GScanner * @text: the text buffer to scan * @text_len: the length of the text buffer * * Prepares to scan a text buffer. */ void g_scanner_input_text (GScanner *scanner, const gchar *text, guint text_len) { g_return_if_fail (scanner != NULL); if (text_len) g_return_if_fail (text != NULL); else text = NULL; if (scanner->input_fd >= 0) g_scanner_sync_file_offset (scanner); scanner->token = G_TOKEN_NONE; scanner->value.v_int64 = 0; scanner->line = 1; scanner->position = 0; scanner->next_token = G_TOKEN_NONE; scanner->input_fd = -1; scanner->text = text; scanner->text_end = text + text_len; if (scanner->buffer) { g_free (scanner->buffer); scanner->buffer = NULL; } } static guchar g_scanner_peek_next_char (GScanner *scanner) { if (scanner->text < scanner->text_end) { return *scanner->text; } else if (scanner->input_fd >= 0) { gint count; gchar *buffer; buffer = scanner->buffer; do { count = read (scanner->input_fd, buffer, READ_BUFFER_SIZE); } while (count == -1 && (errno == EINTR || errno == EAGAIN)); if (count < 1) { scanner->input_fd = -1; return 0; } else { scanner->text = buffer; scanner->text_end = buffer + count; return *buffer; } } else return 0; } /** * g_scanner_sync_file_offset: * @scanner: a #GScanner * * Rewinds the filedescriptor to the current buffer position * and blows the file read ahead buffer. This is useful for * third party uses of the scanners filedescriptor, which hooks * onto the current scanning position. */ void g_scanner_sync_file_offset (GScanner *scanner) { g_return_if_fail (scanner != NULL); /* for file input, rewind the filedescriptor to the current * buffer position and blow the file read ahead buffer. useful * for third party uses of our file descriptor, which hooks * onto the current scanning position. */ if (scanner->input_fd >= 0 && scanner->text_end > scanner->text) { gint buffered; buffered = scanner->text_end - scanner->text; if (lseek (scanner->input_fd, - buffered, SEEK_CUR) >= 0) { /* we succeeded, blow our buffer's contents now */ scanner->text = NULL; scanner->text_end = NULL; } else errno = 0; } } static guchar g_scanner_get_char (GScanner *scanner, guint *line_p, guint *position_p) { guchar fchar; if (scanner->text < scanner->text_end) fchar = *(scanner->text++); else if (scanner->input_fd >= 0) { gint count; gchar *buffer; buffer = scanner->buffer; do { count = read (scanner->input_fd, buffer, READ_BUFFER_SIZE); } while (count == -1 && (errno == EINTR || errno == EAGAIN)); if (count < 1) { scanner->input_fd = -1; fchar = 0; } else { scanner->text = buffer + 1; scanner->text_end = buffer + count; fchar = *buffer; if (!fchar) { g_scanner_sync_file_offset (scanner); scanner->text_end = scanner->text; scanner->input_fd = -1; } } } else fchar = 0; if (fchar == '\n') { (*position_p) = 0; (*line_p)++; } else if (fchar) { (*position_p)++; } return fchar; } /** * g_scanner_unexp_token: * @scanner: a #GScanner * @expected_token: the expected token * @identifier_spec: a string describing how the scanner's user * refers to identifiers (%NULL defaults to "identifier"). * This is used if @expected_token is %G_TOKEN_IDENTIFIER or * %G_TOKEN_IDENTIFIER_NULL. * @symbol_spec: a string describing how the scanner's user refers * to symbols (%NULL defaults to "symbol"). This is used if * @expected_token is %G_TOKEN_SYMBOL or any token value greater * than %G_TOKEN_LAST. * @symbol_name: the name of the symbol, if the scanner's current * token is a symbol. * @message: a message string to output at the end of the * warning/error, or %NULL. * @is_error: if %TRUE it is output as an error. If %FALSE it is * output as a warning. * * Outputs a message through the scanner's msg_handler, * resulting from an unexpected token in the input stream. * Note that you should not call g_scanner_peek_next_token() * followed by g_scanner_unexp_token() without an intermediate * call to g_scanner_get_next_token(), as g_scanner_unexp_token() * evaluates the scanner's current token (not the peeked token) * to construct part of the message. */ void g_scanner_unexp_token (GScanner *scanner, GTokenType expected_token, const gchar *identifier_spec, const gchar *symbol_spec, const gchar *symbol_name, const gchar *message, gint is_error) { gchar *token_string; guint token_string_len; gchar *expected_string; guint expected_string_len; gchar *message_prefix; gboolean print_unexp; void (*msg_handler) (GScanner*, const gchar*, ...); g_return_if_fail (scanner != NULL); if (is_error) msg_handler = g_scanner_error; else msg_handler = g_scanner_warn; if (!identifier_spec) identifier_spec = "identifier"; if (!symbol_spec) symbol_spec = "symbol"; token_string_len = 56; token_string = g_new (gchar, token_string_len + 1); expected_string_len = 64; expected_string = g_new (gchar, expected_string_len + 1); print_unexp = TRUE; switch (scanner->token) { case G_TOKEN_EOF: _g_snprintf (token_string, token_string_len, "end of file"); break; default: if (scanner->token >= 1 && scanner->token <= 255) { if ((scanner->token >= ' ' && scanner->token <= '~') || strchr (scanner->config->cset_identifier_first, scanner->token) || strchr (scanner->config->cset_identifier_nth, scanner->token)) _g_snprintf (token_string, token_string_len, "character '%c'", scanner->token); else _g_snprintf (token_string, token_string_len, "character '\\%o'", scanner->token); break; } else if (!scanner->config->symbol_2_token) { _g_snprintf (token_string, token_string_len, "(unknown) token <%d>", scanner->token); break; } /* fall through */ case G_TOKEN_SYMBOL: if (expected_token == G_TOKEN_SYMBOL || (scanner->config->symbol_2_token && expected_token > G_TOKEN_LAST)) print_unexp = FALSE; if (symbol_name) _g_snprintf (token_string, token_string_len, "%s%s '%s'", print_unexp ? "" : "invalid ", symbol_spec, symbol_name); else _g_snprintf (token_string, token_string_len, "%s%s", print_unexp ? "" : "invalid ", symbol_spec); break; case G_TOKEN_ERROR: print_unexp = FALSE; expected_token = G_TOKEN_NONE; switch (scanner->value.v_error) { case G_ERR_UNEXP_EOF: _g_snprintf (token_string, token_string_len, "scanner: unexpected end of file"); break; case G_ERR_UNEXP_EOF_IN_STRING: _g_snprintf (token_string, token_string_len, "scanner: unterminated string constant"); break; case G_ERR_UNEXP_EOF_IN_COMMENT: _g_snprintf (token_string, token_string_len, "scanner: unterminated comment"); break; case G_ERR_NON_DIGIT_IN_CONST: _g_snprintf (token_string, token_string_len, "scanner: non digit in constant"); break; case G_ERR_FLOAT_RADIX: _g_snprintf (token_string, token_string_len, "scanner: invalid radix for floating constant"); break; case G_ERR_FLOAT_MALFORMED: _g_snprintf (token_string, token_string_len, "scanner: malformed floating constant"); break; case G_ERR_DIGIT_RADIX: _g_snprintf (token_string, token_string_len, "scanner: digit is beyond radix"); break; case G_ERR_UNKNOWN: default: _g_snprintf (token_string, token_string_len, "scanner: unknown error"); break; } break; case G_TOKEN_CHAR: _g_snprintf (token_string, token_string_len, "character '%c'", scanner->value.v_char); break; case G_TOKEN_IDENTIFIER: case G_TOKEN_IDENTIFIER_NULL: if (expected_token == G_TOKEN_IDENTIFIER || expected_token == G_TOKEN_IDENTIFIER_NULL) print_unexp = FALSE; _g_snprintf (token_string, token_string_len, "%s%s '%s'", print_unexp ? "" : "invalid ", identifier_spec, scanner->token == G_TOKEN_IDENTIFIER ? scanner->value.v_string : "null"); break; case G_TOKEN_BINARY: case G_TOKEN_OCTAL: case G_TOKEN_INT: case G_TOKEN_HEX: if (scanner->config->store_int64) _g_snprintf (token_string, token_string_len, "number '%" G_GUINT64_FORMAT "'", scanner->value.v_int64); else _g_snprintf (token_string, token_string_len, "number '%lu'", scanner->value.v_int); break; case G_TOKEN_FLOAT: _g_snprintf (token_string, token_string_len, "number '%.3f'", scanner->value.v_float); break; case G_TOKEN_STRING: if (expected_token == G_TOKEN_STRING) print_unexp = FALSE; _g_snprintf (token_string, token_string_len, "%s%sstring constant \"%s\"", print_unexp ? "" : "invalid ", scanner->value.v_string[0] == 0 ? "empty " : "", scanner->value.v_string); token_string[token_string_len - 2] = '"'; token_string[token_string_len - 1] = 0; break; case G_TOKEN_COMMENT_SINGLE: case G_TOKEN_COMMENT_MULTI: _g_snprintf (token_string, token_string_len, "comment"); break; case G_TOKEN_NONE: /* somehow the user's parsing code is screwed, there isn't much * we can do about it. * Note, a common case to trigger this is * g_scanner_peek_next_token(); g_scanner_unexp_token(); * without an intermediate g_scanner_get_next_token(). */ g_assert_not_reached (); break; } switch (expected_token) { gboolean need_valid; gchar *tstring; case G_TOKEN_EOF: _g_snprintf (expected_string, expected_string_len, "end of file"); break; default: if (expected_token >= 1 && expected_token <= 255) { if ((expected_token >= ' ' && expected_token <= '~') || strchr (scanner->config->cset_identifier_first, expected_token) || strchr (scanner->config->cset_identifier_nth, expected_token)) _g_snprintf (expected_string, expected_string_len, "character '%c'", expected_token); else _g_snprintf (expected_string, expected_string_len, "character '\\%o'", expected_token); break; } else if (!scanner->config->symbol_2_token) { _g_snprintf (expected_string, expected_string_len, "(unknown) token <%d>", expected_token); break; } /* fall through */ case G_TOKEN_SYMBOL: need_valid = (scanner->token == G_TOKEN_SYMBOL || (scanner->config->symbol_2_token && scanner->token > G_TOKEN_LAST)); _g_snprintf (expected_string, expected_string_len, "%s%s", need_valid ? "valid " : "", symbol_spec); /* FIXME: should we attempt to lookup the symbol_name for symbol_2_token? */ break; case G_TOKEN_CHAR: _g_snprintf (expected_string, expected_string_len, "%scharacter", scanner->token == G_TOKEN_CHAR ? "valid " : ""); break; case G_TOKEN_BINARY: tstring = "binary"; _g_snprintf (expected_string, expected_string_len, "%snumber (%s)", scanner->token == expected_token ? "valid " : "", tstring); break; case G_TOKEN_OCTAL: tstring = "octal"; _g_snprintf (expected_string, expected_string_len, "%snumber (%s)", scanner->token == expected_token ? "valid " : "", tstring); break; case G_TOKEN_INT: tstring = "integer"; _g_snprintf (expected_string, expected_string_len, "%snumber (%s)", scanner->token == expected_token ? "valid " : "", tstring); break; case G_TOKEN_HEX: tstring = "hexadecimal"; _g_snprintf (expected_string, expected_string_len, "%snumber (%s)", scanner->token == expected_token ? "valid " : "", tstring); break; case G_TOKEN_FLOAT: tstring = "float"; _g_snprintf (expected_string, expected_string_len, "%snumber (%s)", scanner->token == expected_token ? "valid " : "", tstring); break; case G_TOKEN_STRING: _g_snprintf (expected_string, expected_string_len, "%sstring constant", scanner->token == G_TOKEN_STRING ? "valid " : ""); break; case G_TOKEN_IDENTIFIER: case G_TOKEN_IDENTIFIER_NULL: need_valid = (scanner->token == G_TOKEN_IDENTIFIER_NULL || scanner->token == G_TOKEN_IDENTIFIER); _g_snprintf (expected_string, expected_string_len, "%s%s", need_valid ? "valid " : "", identifier_spec); break; case G_TOKEN_COMMENT_SINGLE: tstring = "single-line"; _g_snprintf (expected_string, expected_string_len, "%scomment (%s)", scanner->token == expected_token ? "valid " : "", tstring); break; case G_TOKEN_COMMENT_MULTI: tstring = "multi-line"; _g_snprintf (expected_string, expected_string_len, "%scomment (%s)", scanner->token == expected_token ? "valid " : "", tstring); break; case G_TOKEN_NONE: case G_TOKEN_ERROR: /* this is handled upon printout */ break; } if (message && message[0] != 0) message_prefix = " - "; else { message_prefix = ""; message = ""; } if (expected_token == G_TOKEN_ERROR) { msg_handler (scanner, "failure around %s%s%s", token_string, message_prefix, message); } else if (expected_token == G_TOKEN_NONE) { if (print_unexp) msg_handler (scanner, "unexpected %s%s%s", token_string, message_prefix, message); else msg_handler (scanner, "%s%s%s", token_string, message_prefix, message); } else { if (print_unexp) msg_handler (scanner, "unexpected %s, expected %s%s%s", token_string, expected_string, message_prefix, message); else msg_handler (scanner, "%s, expected %s%s%s", token_string, expected_string, message_prefix, message); } g_free (token_string); g_free (expected_string); } static void g_scanner_get_token_i (GScanner *scanner, GTokenType *token_p, GTokenValue *value_p, guint *line_p, guint *position_p) { do { g_scanner_free_value (token_p, value_p); g_scanner_get_token_ll (scanner, token_p, value_p, line_p, position_p); } while (((*token_p > 0 && *token_p < 256) && strchr (scanner->config->cset_skip_characters, *token_p)) || (*token_p == G_TOKEN_CHAR && strchr (scanner->config->cset_skip_characters, value_p->v_char)) || (*token_p == G_TOKEN_COMMENT_MULTI && scanner->config->skip_comment_multi) || (*token_p == G_TOKEN_COMMENT_SINGLE && scanner->config->skip_comment_single)); switch (*token_p) { case G_TOKEN_IDENTIFIER: if (scanner->config->identifier_2_string) *token_p = G_TOKEN_STRING; break; case G_TOKEN_SYMBOL: if (scanner->config->symbol_2_token) *token_p = (GTokenType) value_p->v_symbol; break; case G_TOKEN_BINARY: case G_TOKEN_OCTAL: case G_TOKEN_HEX: if (scanner->config->numbers_2_int) *token_p = G_TOKEN_INT; break; default: break; } if (*token_p == G_TOKEN_INT && scanner->config->int_2_float) { *token_p = G_TOKEN_FLOAT; if (scanner->config->store_int64) { #ifdef _MSC_VER /* work around error C2520, see gvaluetransform.c */ value_p->v_float = (__int64)value_p->v_int64; #else value_p->v_float = value_p->v_int64; #endif } else value_p->v_float = value_p->v_int; } errno = 0; } static void g_scanner_get_token_ll (GScanner *scanner, GTokenType *token_p, GTokenValue *value_p, guint *line_p, guint *position_p) { GScannerConfig *config; GTokenType token; gboolean in_comment_multi; gboolean in_comment_single; gboolean in_string_sq; gboolean in_string_dq; GString *gstring; GTokenValue value; guchar ch; config = scanner->config; (*value_p).v_int64 = 0; if ((scanner->text >= scanner->text_end && scanner->input_fd < 0) || scanner->token == G_TOKEN_EOF) { *token_p = G_TOKEN_EOF; return; } in_comment_multi = FALSE; in_comment_single = FALSE; in_string_sq = FALSE; in_string_dq = FALSE; gstring = NULL; do /* while (ch != 0) */ { gboolean dotted_float = FALSE; ch = g_scanner_get_char (scanner, line_p, position_p); value.v_int64 = 0; token = G_TOKEN_NONE; /* this is *evil*, but needed ;( * we first check for identifier first character, because it * might interfere with other key chars like slashes or numbers */ if (config->scan_identifier && ch && strchr (config->cset_identifier_first, ch)) goto identifier_precedence; switch (ch) { case 0: token = G_TOKEN_EOF; (*position_p)++; /* ch = 0; */ break; case '/': if (!config->scan_comment_multi || g_scanner_peek_next_char (scanner) != '*') goto default_case; g_scanner_get_char (scanner, line_p, position_p); token = G_TOKEN_COMMENT_MULTI; in_comment_multi = TRUE; gstring = g_string_new (NULL); while ((ch = g_scanner_get_char (scanner, line_p, position_p)) != 0) { if (ch == '*' && g_scanner_peek_next_char (scanner) == '/') { g_scanner_get_char (scanner, line_p, position_p); in_comment_multi = FALSE; break; } else gstring = g_string_append_c (gstring, ch); } ch = 0; break; case '\'': if (!config->scan_string_sq) goto default_case; token = G_TOKEN_STRING; in_string_sq = TRUE; gstring = g_string_new (NULL); while ((ch = g_scanner_get_char (scanner, line_p, position_p)) != 0) { if (ch == '\'') { in_string_sq = FALSE; break; } else gstring = g_string_append_c (gstring, ch); } ch = 0; break; case '"': if (!config->scan_string_dq) goto default_case; token = G_TOKEN_STRING; in_string_dq = TRUE; gstring = g_string_new (NULL); while ((ch = g_scanner_get_char (scanner, line_p, position_p)) != 0) { if (ch == '"') { in_string_dq = FALSE; break; } else { if (ch == '\\') { ch = g_scanner_get_char (scanner, line_p, position_p); switch (ch) { guint i; guint fchar; case 0: break; case '\\': gstring = g_string_append_c (gstring, '\\'); break; case 'n': gstring = g_string_append_c (gstring, '\n'); break; case 't': gstring = g_string_append_c (gstring, '\t'); break; case 'r': gstring = g_string_append_c (gstring, '\r'); break; case 'b': gstring = g_string_append_c (gstring, '\b'); break; case 'f': gstring = g_string_append_c (gstring, '\f'); break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': i = ch - '0'; fchar = g_scanner_peek_next_char (scanner); if (fchar >= '0' && fchar <= '7') { ch = g_scanner_get_char (scanner, line_p, position_p); i = i * 8 + ch - '0'; fchar = g_scanner_peek_next_char (scanner); if (fchar >= '0' && fchar <= '7') { ch = g_scanner_get_char (scanner, line_p, position_p); i = i * 8 + ch - '0'; } } gstring = g_string_append_c (gstring, i); break; default: gstring = g_string_append_c (gstring, ch); break; } } else gstring = g_string_append_c (gstring, ch); } } ch = 0; break; case '.': if (!config->scan_float) goto default_case; token = G_TOKEN_FLOAT; dotted_float = TRUE; ch = g_scanner_get_char (scanner, line_p, position_p); goto number_parsing; case '$': if (!config->scan_hex_dollar) goto default_case; token = G_TOKEN_HEX; ch = g_scanner_get_char (scanner, line_p, position_p); goto number_parsing; case '0': if (config->scan_octal) token = G_TOKEN_OCTAL; else token = G_TOKEN_INT; ch = g_scanner_peek_next_char (scanner); if (config->scan_hex && (ch == 'x' || ch == 'X')) { token = G_TOKEN_HEX; g_scanner_get_char (scanner, line_p, position_p); ch = g_scanner_get_char (scanner, line_p, position_p); if (ch == 0) { token = G_TOKEN_ERROR; value.v_error = G_ERR_UNEXP_EOF; (*position_p)++; break; } if (g_scanner_char_2_num (ch, 16) < 0) { token = G_TOKEN_ERROR; value.v_error = G_ERR_DIGIT_RADIX; ch = 0; break; } } else if (config->scan_binary && (ch == 'b' || ch == 'B')) { token = G_TOKEN_BINARY; g_scanner_get_char (scanner, line_p, position_p); ch = g_scanner_get_char (scanner, line_p, position_p); if (ch == 0) { token = G_TOKEN_ERROR; value.v_error = G_ERR_UNEXP_EOF; (*position_p)++; break; } if (g_scanner_char_2_num (ch, 10) < 0) { token = G_TOKEN_ERROR; value.v_error = G_ERR_NON_DIGIT_IN_CONST; ch = 0; break; } } else ch = '0'; /* fall through */ case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': number_parsing: { gboolean in_number = TRUE; gchar *endptr; if (token == G_TOKEN_NONE) token = G_TOKEN_INT; gstring = g_string_new (dotted_float ? "0." : ""); gstring = g_string_append_c (gstring, ch); do /* while (in_number) */ { gboolean is_E; is_E = token == G_TOKEN_FLOAT && (ch == 'e' || ch == 'E'); ch = g_scanner_peek_next_char (scanner); if (g_scanner_char_2_num (ch, 36) >= 0 || (config->scan_float && ch == '.') || (is_E && (ch == '+' || ch == '-'))) { ch = g_scanner_get_char (scanner, line_p, position_p); switch (ch) { case '.': if (token != G_TOKEN_INT && token != G_TOKEN_OCTAL) { value.v_error = token == G_TOKEN_FLOAT ? G_ERR_FLOAT_MALFORMED : G_ERR_FLOAT_RADIX; token = G_TOKEN_ERROR; in_number = FALSE; } else { token = G_TOKEN_FLOAT; gstring = g_string_append_c (gstring, ch); } break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': gstring = g_string_append_c (gstring, ch); break; case '-': case '+': if (token != G_TOKEN_FLOAT) { token = G_TOKEN_ERROR; value.v_error = G_ERR_NON_DIGIT_IN_CONST; in_number = FALSE; } else gstring = g_string_append_c (gstring, ch); break; case 'e': case 'E': if ((token != G_TOKEN_HEX && !config->scan_float) || (token != G_TOKEN_HEX && token != G_TOKEN_OCTAL && token != G_TOKEN_FLOAT && token != G_TOKEN_INT)) { token = G_TOKEN_ERROR; value.v_error = G_ERR_NON_DIGIT_IN_CONST; in_number = FALSE; } else { if (token != G_TOKEN_HEX) token = G_TOKEN_FLOAT; gstring = g_string_append_c (gstring, ch); } break; default: if (token != G_TOKEN_HEX) { token = G_TOKEN_ERROR; value.v_error = G_ERR_NON_DIGIT_IN_CONST; in_number = FALSE; } else gstring = g_string_append_c (gstring, ch); break; } } else in_number = FALSE; } while (in_number); endptr = NULL; if (token == G_TOKEN_FLOAT) value.v_float = g_strtod (gstring->str, &endptr); else { guint64 ui64 = 0; switch (token) { case G_TOKEN_BINARY: ui64 = g_ascii_strtoull (gstring->str, &endptr, 2); break; case G_TOKEN_OCTAL: ui64 = g_ascii_strtoull (gstring->str, &endptr, 8); break; case G_TOKEN_INT: ui64 = g_ascii_strtoull (gstring->str, &endptr, 10); break; case G_TOKEN_HEX: ui64 = g_ascii_strtoull (gstring->str, &endptr, 16); break; default: ; } if (scanner->config->store_int64) value.v_int64 = ui64; else value.v_int = ui64; } if (endptr && *endptr) { token = G_TOKEN_ERROR; if (*endptr == 'e' || *endptr == 'E') value.v_error = G_ERR_NON_DIGIT_IN_CONST; else value.v_error = G_ERR_DIGIT_RADIX; } g_string_free (gstring, TRUE); gstring = NULL; ch = 0; } /* number_parsing:... */ break; default: default_case: { if (config->cpair_comment_single && ch == config->cpair_comment_single[0]) { token = G_TOKEN_COMMENT_SINGLE; in_comment_single = TRUE; gstring = g_string_new (NULL); ch = g_scanner_get_char (scanner, line_p, position_p); while (ch != 0) { if (ch == config->cpair_comment_single[1]) { in_comment_single = FALSE; ch = 0; break; } gstring = g_string_append_c (gstring, ch); ch = g_scanner_get_char (scanner, line_p, position_p); } /* ignore a missing newline at EOF for single line comments */ if (in_comment_single && config->cpair_comment_single[1] == '\n') in_comment_single = FALSE; } else if (config->scan_identifier && ch && strchr (config->cset_identifier_first, ch)) { identifier_precedence: if (config->cset_identifier_nth && ch && strchr (config->cset_identifier_nth, g_scanner_peek_next_char (scanner))) { token = G_TOKEN_IDENTIFIER; gstring = g_string_new (NULL); gstring = g_string_append_c (gstring, ch); do { ch = g_scanner_get_char (scanner, line_p, position_p); gstring = g_string_append_c (gstring, ch); ch = g_scanner_peek_next_char (scanner); } while (ch && strchr (config->cset_identifier_nth, ch)); ch = 0; } else if (config->scan_identifier_1char) { token = G_TOKEN_IDENTIFIER; value.v_identifier = g_new0 (gchar, 2); value.v_identifier[0] = ch; ch = 0; } } if (ch) { if (config->char_2_token) token = ch; else { token = G_TOKEN_CHAR; value.v_char = ch; } ch = 0; } } /* default_case:... */ break; } g_assert (ch == 0 && token != G_TOKEN_NONE); /* paranoid */ } while (ch != 0); if (in_comment_multi || in_comment_single || in_string_sq || in_string_dq) { token = G_TOKEN_ERROR; if (gstring) { g_string_free (gstring, TRUE); gstring = NULL; } (*position_p)++; if (in_comment_multi || in_comment_single) value.v_error = G_ERR_UNEXP_EOF_IN_COMMENT; else /* (in_string_sq || in_string_dq) */ value.v_error = G_ERR_UNEXP_EOF_IN_STRING; } if (gstring) { value.v_string = g_string_free (gstring, FALSE); gstring = NULL; } if (token == G_TOKEN_IDENTIFIER) { if (config->scan_symbols) { GScannerKey *key; guint scope_id; scope_id = scanner->scope_id; key = g_scanner_lookup_internal (scanner, scope_id, value.v_identifier); if (!key && scope_id && scanner->config->scope_0_fallback) key = g_scanner_lookup_internal (scanner, 0, value.v_identifier); if (key) { g_free (value.v_identifier); token = G_TOKEN_SYMBOL; value.v_symbol = key->value; } } if (token == G_TOKEN_IDENTIFIER && config->scan_identifier_NULL && strlen (value.v_identifier) == 4) { gchar *null_upper = "NULL"; gchar *null_lower = "null"; if (scanner->config->case_sensitive) { if (value.v_identifier[0] == null_upper[0] && value.v_identifier[1] == null_upper[1] && value.v_identifier[2] == null_upper[2] && value.v_identifier[3] == null_upper[3]) token = G_TOKEN_IDENTIFIER_NULL; } else { if ((value.v_identifier[0] == null_upper[0] || value.v_identifier[0] == null_lower[0]) && (value.v_identifier[1] == null_upper[1] || value.v_identifier[1] == null_lower[1]) && (value.v_identifier[2] == null_upper[2] || value.v_identifier[2] == null_lower[2]) && (value.v_identifier[3] == null_upper[3] || value.v_identifier[3] == null_lower[3])) token = G_TOKEN_IDENTIFIER_NULL; } } } *token_p = token; *value_p = value; } pkg-config-0.29.1/glib/glib/garray.c0000664000175000017500000013623312651243552014052 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the GLib Team and others 1997-2000. See the AUTHORS * file for a list of people on the GLib Team. See the ChangeLog * files for a list of changes. These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/. */ /* * MT safe */ #include "config.h" #include #include #include "garray.h" #include "gbytes.h" #include "gslice.h" #include "gmem.h" #include "gtestutils.h" #include "gthread.h" #include "gmessages.h" #include "gqsort.h" /** * SECTION:arrays * @title: Arrays * @short_description: arrays of arbitrary elements which grow * automatically as elements are added * * Arrays are similar to standard C arrays, except that they grow * automatically as elements are added. * * Array elements can be of any size (though all elements of one array * are the same size), and the array can be automatically cleared to * '0's and zero-terminated. * * To create a new array use g_array_new(). * * To add elements to an array, use g_array_append_val(), * g_array_append_vals(), g_array_prepend_val(), and * g_array_prepend_vals(). * * To access an element of an array, use g_array_index(). * * To set the size of an array, use g_array_set_size(). * * To free an array, use g_array_free(). * * * Using a #GArray to store #gint values * * GArray *garray; * gint i; * /* We create a new array to store gint values. * We don't want it zero-terminated or cleared to 0's. */ * garray = g_array_new (FALSE, FALSE, sizeof (gint)); * for (i = 0; i < 10000; i++) * g_array_append_val (garray, i); * for (i = 0; i < 10000; i++) * if (g_array_index (garray, gint, i) != i) * g_print ("ERROR: got %d instead of %d\n", * g_array_index (garray, gint, i), i); * g_array_free (garray, TRUE); * * **/ #define MIN_ARRAY_SIZE 16 typedef struct _GRealArray GRealArray; /** * GArray: * @data: a pointer to the element data. The data may be moved as * elements are added to the #GArray. * @len: the number of elements in the #GArray not including the * possible terminating zero element. * * Contains the public fields of an Array. **/ struct _GRealArray { guint8 *data; guint len; guint alloc; guint elt_size; guint zero_terminated : 1; guint clear : 1; gint ref_count; GDestroyNotify clear_func; }; /** * g_array_index: * @a: a #GArray. * @t: the type of the elements. * @i: the index of the element to return. * * Returns the element of a #GArray at the given index. The return * value is cast to the given type. * * * Getting a pointer to an element in a #GArray * * EDayViewEvent *event; * /* This gets a pointer to the 4th element * in the array of EDayViewEvent structs. */ * event = &g_array_index (events, EDayViewEvent, 3); * * * * Returns: the element of the #GArray at the index given by @i. **/ #define g_array_elt_len(array,i) ((array)->elt_size * (i)) #define g_array_elt_pos(array,i) ((array)->data + g_array_elt_len((array),(i))) #define g_array_elt_zero(array, pos, len) \ (memset (g_array_elt_pos ((array), pos), 0, g_array_elt_len ((array), len))) #define g_array_zero_terminate(array) G_STMT_START{ \ if ((array)->zero_terminated) \ g_array_elt_zero ((array), (array)->len, 1); \ }G_STMT_END static guint g_nearest_pow (gint num) G_GNUC_CONST; static void g_array_maybe_expand (GRealArray *array, gint len); /** * g_array_new: * @zero_terminated: %TRUE if the array should have an extra element at * the end which is set to 0. * @clear_: %TRUE if #GArray elements should be automatically cleared * to 0 when they are allocated. * @element_size: the size of each element in bytes. * * Creates a new #GArray with a reference count of 1. * * Returns: the new #GArray. **/ GArray* g_array_new (gboolean zero_terminated, gboolean clear, guint elt_size) { g_return_val_if_fail (elt_size > 0, NULL); return g_array_sized_new (zero_terminated, clear, elt_size, 0); } /** * g_array_sized_new: * @zero_terminated: %TRUE if the array should have an extra element at * the end with all bits cleared. * @clear_: %TRUE if all bits in the array should be cleared to 0 on * allocation. * @element_size: size of each element in the array. * @reserved_size: number of elements preallocated. * * 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, guint elt_size, guint reserved_size) { GRealArray *array; g_return_val_if_fail (elt_size > 0, NULL); array = g_slice_new (GRealArray); array->data = NULL; array->len = 0; array->alloc = 0; array->zero_terminated = (zero_terminated ? 1 : 0); array->clear = (clear ? 1 : 0); array->elt_size = elt_size; array->ref_count = 1; array->clear_func = NULL; if (array->zero_terminated || reserved_size != 0) { g_array_maybe_expand (array, reserved_size); g_array_zero_terminate(array); } return (GArray*) array; } /** * g_array_set_clear_func: * @array: A #GArray * @clear_func: a function to clear an element of @array * * Sets a function to clear an element of @array. * * The @clear_func will be called when an element in the array * data segment is removed and when the array is freed and data * segment is deallocated as well. * * Note that in contrast with other uses of #GDestroyNotify * functions, @clear_func is expected to clear the contents of * the array element it is given, but not free the element itself. * * Since: 2.32 */ void g_array_set_clear_func (GArray *array, GDestroyNotify clear_func) { GRealArray *rarray = (GRealArray *) array; g_return_if_fail (array != NULL); rarray->clear_func = clear_func; } /** * g_array_ref: * @array: A #GArray. * * Atomically increments the reference count of @array by one. This * function is MT-safe and may be called from any thread. * * Returns: The passed in #GArray. * * Since: 2.22 **/ GArray * g_array_ref (GArray *array) { GRealArray *rarray = (GRealArray*) array; g_return_val_if_fail (array, NULL); g_atomic_int_inc (&rarray->ref_count); return array; } typedef enum { FREE_SEGMENT = 1 << 0, PRESERVE_WRAPPER = 1 << 1 } ArrayFreeFlags; static gchar *array_free (GRealArray *, ArrayFreeFlags); /** * g_array_unref: * @array: A #GArray. * * Atomically decrements the reference count of @array by one. If the * reference count drops to 0, all memory allocated by the array is * released. This function is MT-safe and may be called from any * thread. * * Since: 2.22 **/ void g_array_unref (GArray *array) { GRealArray *rarray = (GRealArray*) array; g_return_if_fail (array); if (g_atomic_int_dec_and_test (&rarray->ref_count)) array_free (rarray, FREE_SEGMENT); } /** * g_array_get_element_size: * @array: A #GArray. * * Gets the size of the elements in @array. * * Returns: Size of each element, in bytes. * * Since: 2.22 **/ guint g_array_get_element_size (GArray *array) { GRealArray *rarray = (GRealArray*) array; g_return_val_if_fail (array, 0); return rarray->elt_size; } /** * g_array_free: * @array: a #GArray. * @free_segment: if %TRUE the actual element data is freed as well. * * Frees the memory allocated for the #GArray. If @free_segment is * %TRUE it frees the memory block holding the elements as well and * also each element if @array has a @element_free_func set. Pass * %FALSE if you want to free the #GArray wrapper but preserve the * underlying array for use elsewhere. If the reference count of @array * is greater than one, the #GArray wrapper is preserved but the size * of @array will be set to zero. * * If array elements contain dynamically-allocated memory, * they should be freed separately. * * 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, gboolean free_segment) { GRealArray *array = (GRealArray*) farray; ArrayFreeFlags flags; g_return_val_if_fail (array, NULL); flags = (free_segment ? FREE_SEGMENT : 0); /* if others are holding a reference, preserve the wrapper but do free/return the data */ if (!g_atomic_int_dec_and_test (&array->ref_count)) flags |= PRESERVE_WRAPPER; return array_free (array, flags); } static gchar * array_free (GRealArray *array, ArrayFreeFlags flags) { gchar *segment; if (flags & FREE_SEGMENT) { if (array->clear_func != NULL) { guint i; for (i = 0; i < array->len; i++) array->clear_func (g_array_elt_pos (array, i)); } g_free (array->data); segment = NULL; } else segment = (gchar*) array->data; if (flags & PRESERVE_WRAPPER) { array->data = NULL; array->len = 0; array->alloc = 0; } else { g_slice_free1 (sizeof (GRealArray), array); } return segment; } /** * g_array_append_vals: * @array: a #GArray. * @data: a pointer to the elements to append to the end of the array. * @len: the number of elements to append. * * 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. * * Adds the value on to the end of the array. The array will grow in * size automatically if necessary. * * 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. * * Returns: the #GArray. **/ GArray* g_array_append_vals (GArray *farray, gconstpointer data, guint len) { GRealArray *array = (GRealArray*) farray; g_return_val_if_fail (array, NULL); g_array_maybe_expand (array, len); memcpy (g_array_elt_pos (array, array->len), data, g_array_elt_len (array, len)); array->len += len; g_array_zero_terminate (array); return farray; } /** * g_array_prepend_vals: * @array: a #GArray. * @data: a pointer to the elements to prepend to the start of the * array. * @len: the number of elements to prepend. * * 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. * * Adds the value on to the start of the array. The array will grow in * size automatically if necessary. * * This operation is slower than g_array_append_val() since the * existing elements in the array have to be moved to make space for * the new element. * * 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. * * Returns: the #GArray. **/ GArray* g_array_prepend_vals (GArray *farray, gconstpointer data, guint len) { GRealArray *array = (GRealArray*) farray; g_return_val_if_fail (array, NULL); g_array_maybe_expand (array, len); g_memmove (g_array_elt_pos (array, len), g_array_elt_pos (array, 0), g_array_elt_len (array, array->len)); memcpy (g_array_elt_pos (array, 0), data, g_array_elt_len (array, len)); array->len += len; g_array_zero_terminate (array); return farray; } /** * g_array_insert_vals: * @array: a #GArray. * @index_: the index to place the elements at. * @data: a pointer to the elements to insert. * @len: the number of elements to insert. * * 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. * * Inserts an element into an array at the given index. * * 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. * * Returns: the #GArray. **/ GArray* g_array_insert_vals (GArray *farray, guint index_, gconstpointer data, guint len) { GRealArray *array = (GRealArray*) farray; g_return_val_if_fail (array, NULL); g_array_maybe_expand (array, len); g_memmove (g_array_elt_pos (array, len + index_), g_array_elt_pos (array, index_), g_array_elt_len (array, array->len - index_)); memcpy (g_array_elt_pos (array, index_), data, g_array_elt_len (array, len)); array->len += len; g_array_zero_terminate (array); return farray; } /** * g_array_set_size: * @array: a #GArray. * @length: the new size of 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, guint length) { GRealArray *array = (GRealArray*) farray; g_return_val_if_fail (array, NULL); if (length > array->len) { g_array_maybe_expand (array, length - array->len); if (array->clear) g_array_elt_zero (array, array->len, length - array->len); } else if (length < array->len) g_array_remove_range (farray, length, array->len - length); array->len = length; g_array_zero_terminate (array); return farray; } /** * g_array_remove_index: * @array: a #GArray. * @index_: the index of the element to remove. * * 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, guint index_) { GRealArray* array = (GRealArray*) farray; g_return_val_if_fail (array, NULL); g_return_val_if_fail (index_ < array->len, NULL); if (array->clear_func != NULL) array->clear_func (g_array_elt_pos (array, index_)); if (index_ != array->len - 1) g_memmove (g_array_elt_pos (array, index_), g_array_elt_pos (array, index_ + 1), g_array_elt_len (array, array->len - index_ - 1)); array->len -= 1; if (G_UNLIKELY (g_mem_gc_friendly)) g_array_elt_zero (array, array->len, 1); else g_array_zero_terminate (array); return farray; } /** * g_array_remove_index_fast: * @array: a @GArray. * @index_: the index of the element to remove. * * 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, guint index_) { GRealArray* array = (GRealArray*) farray; g_return_val_if_fail (array, NULL); g_return_val_if_fail (index_ < array->len, NULL); if (array->clear_func != NULL) array->clear_func (g_array_elt_pos (array, index_)); if (index_ != array->len - 1) memcpy (g_array_elt_pos (array, index_), g_array_elt_pos (array, array->len - 1), g_array_elt_len (array, 1)); array->len -= 1; if (G_UNLIKELY (g_mem_gc_friendly)) g_array_elt_zero (array, array->len, 1); else g_array_zero_terminate (array); return farray; } /** * g_array_remove_range: * @array: a @GArray. * @index_: the index of the first element to remove. * @length: the number of elements to remove. * * 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* g_array_remove_range (GArray *farray, guint index_, guint length) { GRealArray *array = (GRealArray*) farray; g_return_val_if_fail (array, NULL); g_return_val_if_fail (index_ < array->len, NULL); g_return_val_if_fail (index_ + length <= array->len, NULL); if (array->clear_func != NULL) { guint i; for (i = 0; i < length; i++) array->clear_func (g_array_elt_pos (array, index_ + i)); } if (index_ + length != array->len) g_memmove (g_array_elt_pos (array, index_), g_array_elt_pos (array, index_ + length), (array->len - (index_ + length)) * array->elt_size); array->len -= length; if (G_UNLIKELY (g_mem_gc_friendly)) g_array_elt_zero (array, array->len, length); else g_array_zero_terminate (array); return farray; } /** * g_array_sort: * @array: a #GArray. * @compare_func: comparison function. * * Sorts a #GArray using @compare_func which should be a qsort()-style * comparison function (returns less than zero for first arg is less * than second arg, zero for equal, greater zero if first arg is * greater than second arg). * * This is guaranteed to be a stable sort since version 2.32. **/ void g_array_sort (GArray *farray, GCompareFunc compare_func) { GRealArray *array = (GRealArray*) farray; g_return_if_fail (array != NULL); /* Don't use qsort as we want a guaranteed stable sort */ g_qsort_with_data (array->data, array->len, array->elt_size, (GCompareDataFunc)compare_func, NULL); } /** * g_array_sort_with_data: * @array: a #GArray. * @compare_func: comparison function. * @user_data: data to pass to @compare_func. * * Like g_array_sort(), but the comparison function receives an extra * user data argument. * * This is guaranteed to be a stable sort since version 2.32. * * There used to be a comment here about making the sort stable by * using the addresses of the elements in the comparison function. * This did not actually work, so any such code should be removed. **/ void g_array_sort_with_data (GArray *farray, GCompareDataFunc compare_func, gpointer user_data) { GRealArray *array = (GRealArray*) farray; g_return_if_fail (array != NULL); g_qsort_with_data (array->data, array->len, array->elt_size, compare_func, user_data); } /* Returns the smallest power of 2 greater than n, or n if * such power does not fit in a guint */ static guint g_nearest_pow (gint num) { guint n = 1; while (n < num && n > 0) n <<= 1; return n ? n : num; } static void g_array_maybe_expand (GRealArray *array, gint len) { guint want_alloc = g_array_elt_len (array, array->len + len + array->zero_terminated); if (want_alloc > array->alloc) { want_alloc = g_nearest_pow (want_alloc); want_alloc = MAX (want_alloc, MIN_ARRAY_SIZE); array->data = g_realloc (array->data, want_alloc); if (G_UNLIKELY (g_mem_gc_friendly)) memset (array->data + array->alloc, 0, want_alloc - array->alloc); array->alloc = want_alloc; } } /** * SECTION:arrays_pointer * @title: Pointer Arrays * @short_description: arrays of pointers to any type of data, which * grow automatically as new elements are added * * Pointer Arrays are similar to Arrays but are used only for storing * pointers. * * If you remove elements from the array, elements at the * end of the array are moved into the space previously occupied by the * removed element. This means that you should not rely on the index of * particular elements remaining the same. You should also be careful * when deleting elements while iterating over the array. * * To create a pointer array, use g_ptr_array_new(). * * To add elements to a pointer array, use g_ptr_array_add(). * * To remove elements from a pointer array, use g_ptr_array_remove(), * g_ptr_array_remove_index() or g_ptr_array_remove_index_fast(). * * To access an element of a pointer array, use g_ptr_array_index(). * * To set the size of a pointer array, use g_ptr_array_set_size(). * * To free a pointer array, use g_ptr_array_free(). * * * Using a #GPtrArray * * GPtrArray *gparray; * gchar *string1 = "one", *string2 = "two", *string3 = "three"; * * gparray = g_ptr_array_new (); * g_ptr_array_add (gparray, (gpointer) string1); * g_ptr_array_add (gparray, (gpointer) string2); * g_ptr_array_add (gparray, (gpointer) string3); * * if (g_ptr_array_index (gparray, 0) != (gpointer) string1) * g_print ("ERROR: got %p instead of %p\n", * g_ptr_array_index (gparray, 0), string1); * * g_ptr_array_free (gparray, TRUE); * * **/ typedef struct _GRealPtrArray GRealPtrArray; /** * GPtrArray: * @pdata: points to the array of pointers, which may be moved when the * array grows. * @len: number of pointers in the array. * * Contains the public fields of a pointer array. **/ struct _GRealPtrArray { gpointer *pdata; guint len; guint alloc; gint ref_count; GDestroyNotify element_free_func; }; /** * g_ptr_array_index: * @array: a #GPtrArray. * @index_: the index of the pointer to return. * * 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, gint len); /** * g_ptr_array_new: * * Creates a new #GPtrArray with a reference count of 1. * * Returns: the new #GPtrArray. **/ GPtrArray* g_ptr_array_new (void) { return g_ptr_array_sized_new (0); } /** * g_ptr_array_sized_new: * @reserved_size: number of pointers preallocated. * * 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) { GRealPtrArray *array = g_slice_new (GRealPtrArray); array->pdata = NULL; array->len = 0; array->alloc = 0; array->ref_count = 1; array->element_free_func = NULL; if (reserved_size != 0) g_ptr_array_maybe_expand (array, reserved_size); return (GPtrArray*) array; } /** * g_ptr_array_new_with_free_func: * @element_free_func: (allow-none): A function to free elements with destroy @array or %NULL. * * Creates a new #GPtrArray with a reference count of 1 and use @element_free_func * for freeing each element when the array is destroyed either via * g_ptr_array_unref(), when g_ptr_array_free() is called with @free_segment * set to %TRUE or when removing elements. * * Returns: A new #GPtrArray. * * Since: 2.22 **/ GPtrArray * g_ptr_array_new_with_free_func (GDestroyNotify element_free_func) { GPtrArray *array; array = g_ptr_array_new (); g_ptr_array_set_free_func (array, element_free_func); return array; } /** * g_ptr_array_new_full: * @reserved_size: number of pointers preallocated. * @element_free_func: (allow-none): A function to free elements with destroy @array or %NULL. * * 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. It also set @element_free_func * for freeing each element when the array is destroyed either via * g_ptr_array_unref(), when g_ptr_array_free() is called with @free_segment * set to %TRUE or when removing elements. * * Returns: A new #GPtrArray. * * Since: 2.30 **/ GPtrArray * g_ptr_array_new_full (guint reserved_size, GDestroyNotify element_free_func) { GPtrArray *array; array = g_ptr_array_sized_new (reserved_size); g_ptr_array_set_free_func (array, element_free_func); return array; } /** * g_ptr_array_set_free_func: * @array: A #GPtrArray. * @element_free_func: (allow-none): A function to free elements with destroy @array or %NULL. * * Sets a function for freeing each element when @array is destroyed * either via g_ptr_array_unref(), when g_ptr_array_free() is called * with @free_segment set to %TRUE or when removing elements. * * Since: 2.22 **/ void g_ptr_array_set_free_func (GPtrArray *array, GDestroyNotify element_free_func) { GRealPtrArray* rarray = (GRealPtrArray*) array; g_return_if_fail (array); rarray->element_free_func = element_free_func; } /** * g_ptr_array_ref: * @array: a #GPtrArray * * 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 * * Since: 2.22 */ GPtrArray * g_ptr_array_ref (GPtrArray *array) { GRealPtrArray *rarray = (GRealPtrArray*) array; g_return_val_if_fail (array, NULL); g_atomic_int_inc (&rarray->ref_count); return array; } static gpointer *ptr_array_free (GPtrArray *, ArrayFreeFlags); /** * g_ptr_array_unref: * @array: A #GPtrArray. * * Atomically decrements the reference count of @array by one. If the * reference count drops to 0, the effect is the same as calling * g_ptr_array_free() with @free_segment set to %TRUE. This function * is MT-safe and may be called from any thread. * * Since: 2.22 **/ void g_ptr_array_unref (GPtrArray *array) { GRealPtrArray *rarray = (GRealPtrArray*) array; g_return_if_fail (array); if (g_atomic_int_dec_and_test (&rarray->ref_count)) ptr_array_free (array, FREE_SEGMENT); } /** * g_ptr_array_free: * @array: a #GPtrArray. * @free_seg: if %TRUE the actual pointer array is freed as well. * * Frees the memory allocated for the #GPtrArray. If @free_seg is %TRUE * it frees the memory block holding the elements as well. Pass %FALSE * if you want to free the #GPtrArray wrapper but preserve the * underlying array for use elsewhere. If the reference count of @array * is greater than one, the #GPtrArray wrapper is preserved but the * size of @array will be set to zero. * * 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. * * 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, gboolean free_segment) { GRealPtrArray *array = (GRealPtrArray*) farray; ArrayFreeFlags flags; g_return_val_if_fail (array, NULL); flags = (free_segment ? FREE_SEGMENT : 0); /* if others are holding a reference, preserve the wrapper but do free/return the data */ if (!g_atomic_int_dec_and_test (&array->ref_count)) flags |= PRESERVE_WRAPPER; return ptr_array_free (farray, flags); } static gpointer * ptr_array_free (GPtrArray *farray, ArrayFreeFlags flags) { GRealPtrArray *array = (GRealPtrArray*) farray; gpointer *segment; if (flags & FREE_SEGMENT) { if (array->element_free_func != NULL) g_ptr_array_foreach (farray, (GFunc) array->element_free_func, NULL); g_free (array->pdata); segment = NULL; } else segment = array->pdata; if (flags & PRESERVE_WRAPPER) { array->pdata = NULL; array->len = 0; array->alloc = 0; } else { g_slice_free1 (sizeof (GRealPtrArray), array); } return segment; } static void g_ptr_array_maybe_expand (GRealPtrArray *array, gint len) { if ((array->len + len) > array->alloc) { guint old_alloc = array->alloc; array->alloc = g_nearest_pow (array->len + len); array->alloc = MAX (array->alloc, MIN_ARRAY_SIZE); array->pdata = g_realloc (array->pdata, sizeof (gpointer) * array->alloc); if (G_UNLIKELY (g_mem_gc_friendly)) for ( ; old_alloc < array->alloc; old_alloc++) array->pdata [old_alloc] = NULL; } } /** * g_ptr_array_set_size: * @array: a #GPtrArray. * @length: the new length of the pointer array. * * Sets the size of the array. When making the array larger, * newly-added elements will be set to %NULL. When making it smaller, * if @array has a non-%NULL #GDestroyNotify function then it will be * called for the removed elements. **/ void g_ptr_array_set_size (GPtrArray *farray, gint length) { GRealPtrArray* array = (GRealPtrArray*) farray; g_return_if_fail (array); if (length > array->len) { int i; g_ptr_array_maybe_expand (array, (length - array->len)); /* This is not * memset (array->pdata + array->len, 0, * sizeof (gpointer) * (length - array->len)); * to make it really portable. Remember (void*)NULL needn't be * bitwise zero. It of course is silly not to use memset (..,0,..). */ for (i = array->len; i < length; i++) array->pdata[i] = NULL; } else if (length < array->len) g_ptr_array_remove_range (farray, length, array->len - length); array->len = length; } /** * g_ptr_array_remove_index: * @array: a #GPtrArray. * @index_: the index of the pointer to remove. * * 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, guint index_) { GRealPtrArray* array = (GRealPtrArray*) farray; gpointer result; g_return_val_if_fail (array, NULL); g_return_val_if_fail (index_ < array->len, NULL); result = array->pdata[index_]; if (array->element_free_func != NULL) array->element_free_func (array->pdata[index_]); if (index_ != array->len - 1) g_memmove (array->pdata + index_, array->pdata + index_ + 1, sizeof (gpointer) * (array->len - index_ - 1)); array->len -= 1; if (G_UNLIKELY (g_mem_gc_friendly)) array->pdata[array->len] = NULL; return result; } /** * g_ptr_array_remove_index_fast: * @array: a #GPtrArray. * @index_: the index of the pointer to remove. * * 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, guint index_) { GRealPtrArray* array = (GRealPtrArray*) farray; gpointer result; g_return_val_if_fail (array, NULL); g_return_val_if_fail (index_ < array->len, NULL); result = array->pdata[index_]; if (array->element_free_func != NULL) array->element_free_func (array->pdata[index_]); if (index_ != array->len - 1) array->pdata[index_] = array->pdata[array->len - 1]; array->len -= 1; if (G_UNLIKELY (g_mem_gc_friendly)) array->pdata[array->len] = NULL; return result; } /** * g_ptr_array_remove_range: * @array: a @GPtrArray. * @index_: the index of the first pointer to remove. * @length: the number of pointers to remove. * * Removes the given number of pointers starting at the given index * from a #GPtrArray. The following elements are moved to close the * gap. If @array has a non-%NULL #GDestroyNotify function it is called * for the removed elements. * * Since: 2.4 **/ void g_ptr_array_remove_range (GPtrArray *farray, guint index_, guint length) { GRealPtrArray* array = (GRealPtrArray*) farray; guint n; g_return_if_fail (array); g_return_if_fail (index_ < array->len); g_return_if_fail (index_ + length <= array->len); if (array->element_free_func != NULL) { for (n = index_; n < index_ + length; n++) array->element_free_func (array->pdata[n]); } if (index_ + length != array->len) { g_memmove (&array->pdata[index_], &array->pdata[index_ + length], (array->len - (index_ + length)) * sizeof (gpointer)); } array->len -= length; if (G_UNLIKELY (g_mem_gc_friendly)) { guint i; for (i = 0; i < length; i++) array->pdata[array->len + i] = NULL; } } /** * g_ptr_array_remove: * @array: a #GPtrArray. * @data: the pointer to remove. * * Removes the first occurrence of the given pointer 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. * * 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, gpointer data) { GRealPtrArray* array = (GRealPtrArray*) farray; guint i; g_return_val_if_fail (array, FALSE); for (i = 0; i < array->len; i += 1) { if (array->pdata[i] == data) { g_ptr_array_remove_index (farray, i); return TRUE; } } return FALSE; } /** * g_ptr_array_remove_fast: * @array: a #GPtrArray. * @data: the pointer to remove. * * Removes the first occurrence of the given pointer from the pointer * array. The last element in the array is used to fill in the space, * so this function does not preserve the order of the array. But it is * faster than g_ptr_array_remove(). If @array has a non-%NULL * #GDestroyNotify function it is called for the removed element. * * 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, gpointer data) { GRealPtrArray* array = (GRealPtrArray*) farray; guint i; g_return_val_if_fail (array, FALSE); for (i = 0; i < array->len; i += 1) { if (array->pdata[i] == data) { g_ptr_array_remove_index_fast (farray, i); return TRUE; } } return FALSE; } /** * g_ptr_array_add: * @array: a #GPtrArray. * @data: the pointer to add. * * Adds a pointer to the end of the pointer array. The array will grow * in size automatically if necessary. **/ void g_ptr_array_add (GPtrArray *farray, gpointer data) { GRealPtrArray* array = (GRealPtrArray*) farray; g_return_if_fail (array); g_ptr_array_maybe_expand (array, 1); array->pdata[array->len++] = data; } /** * g_ptr_array_sort: * @array: a #GPtrArray. * @compare_func: comparison function. * * Sorts the array, using @compare_func which should be a qsort()-style * comparison function (returns less than zero for first arg is less * than second arg, zero for equal, greater than zero if irst arg is * greater than second arg). * * The comparison function for g_ptr_array_sort() doesn't * take the pointers from the array as arguments, it takes pointers to * the pointers in the array. * * This is guaranteed to be a stable sort since version 2.32. **/ void g_ptr_array_sort (GPtrArray *array, GCompareFunc compare_func) { g_return_if_fail (array != NULL); /* Don't use qsort as we want a guaranteed stable sort */ g_qsort_with_data (array->pdata, array->len, sizeof (gpointer), (GCompareDataFunc)compare_func, NULL); } /** * g_ptr_array_sort_with_data: * @array: a #GPtrArray. * @compare_func: comparison function. * @user_data: data to pass to @compare_func. * * Like g_ptr_array_sort(), but the comparison function has an extra * user data argument. * * The comparison function for g_ptr_array_sort_with_data() * doesn't take the pointers from the array as arguments, it takes * pointers to the pointers in the array. * * This is guaranteed to be a stable sort since version 2.32. **/ void g_ptr_array_sort_with_data (GPtrArray *array, GCompareDataFunc compare_func, gpointer user_data) { g_return_if_fail (array != NULL); g_qsort_with_data (array->pdata, array->len, sizeof (gpointer), compare_func, user_data); } /** * g_ptr_array_foreach: * @array: a #GPtrArray * @func: the function to call for each array element * @user_data: user data to pass to the function * * Calls a function for each element of a #GPtrArray. * * Since: 2.4 **/ void g_ptr_array_foreach (GPtrArray *array, GFunc func, gpointer user_data) { guint i; g_return_if_fail (array); for (i = 0; i < array->len; i++) (*func) (array->pdata[i], user_data); } /** * SECTION:arrays_byte * @title: Byte Arrays * @short_description: arrays of bytes * * #GByteArray is a mutable array of bytes based on #GArray, to provide arrays * of bytes which grow automatically as elements are added. * * To create a new #GByteArray use g_byte_array_new(). To add elements to a * #GByteArray, use g_byte_array_append(), and g_byte_array_prepend(). * * To set the size of a #GByteArray, use g_byte_array_set_size(). * * To free a #GByteArray, use g_byte_array_free(). * * * Using a #GByteArray * * GByteArray *gbarray; * gint i; * * gbarray = g_byte_array_new (); * for (i = 0; i < 10000; i++) * g_byte_array_append (gbarray, (guint8*) "abcd", 4); * * for (i = 0; i < 10000; i++) * { * g_assert (gbarray->data[4*i] == 'a'); * g_assert (gbarray->data[4*i+1] == 'b'); * g_assert (gbarray->data[4*i+2] == 'c'); * g_assert (gbarray->data[4*i+3] == 'd'); * } * * g_byte_array_free (gbarray, TRUE); * * * * See #GBytes if you are interested in an immutable object representing a * sequence of bytes. **/ /** * GByteArray: * @data: a pointer to the element data. The data may be moved as * elements are added to the #GByteArray. * @len: the number of elements in the #GByteArray. * * The GByteArray struct allows access to the * public fields of a GByteArray. **/ /** * g_byte_array_new: * * Creates a new #GByteArray with a reference count of 1. * * Returns: (transfer full): the new #GByteArray. **/ GByteArray* g_byte_array_new (void) { return (GByteArray*) g_array_sized_new (FALSE, FALSE, 1, 0); } /** * g_byte_array_new_take: * @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 * and will be freed with g_free(), i.e. it could be allocated using g_strdup(). * * Since: 2.32 * * Returns: (transfer full): a new #GByteArray */ GByteArray * g_byte_array_new_take (guint8 *data, gsize len) { GByteArray *array; GRealArray *real; array = g_byte_array_new (); real = (GRealArray *)array; g_assert (real->data == NULL); g_assert (real->len == 0); real->data = data; real->len = len; return array; } /** * g_byte_array_sized_new: * @reserved_size: number of bytes preallocated. * * 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) { return (GByteArray*) g_array_sized_new (FALSE, FALSE, 1, reserved_size); } /** * g_byte_array_free: * @array: a #GByteArray. * @free_segment: if %TRUE the actual byte data is freed as well. * * 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) { return (guint8*) g_array_free ((GArray*) array, free_segment); } /** * g_byte_array_free_to_bytes: * @array: (transfer full): a #GByteArray * * Transfers the data from the #GByteArray into a new immutable #GBytes. * * The #GByteArray is freed unless the reference count of @array is greater * than one, the #GByteArray wrapper is preserved but the size of @array * will be set to zero. * * This is identical to using g_bytes_new_take() and g_byte_array_free() * together. * * Since: 2.32 * * Returns: (transfer full): a new immutable #GBytes representing same byte * data that was in the array */ GBytes * g_byte_array_free_to_bytes (GByteArray *array) { gsize length; g_return_val_if_fail (array != NULL, NULL); length = array->len; return g_bytes_new_take (g_byte_array_free (array, FALSE), length); } /** * g_byte_array_ref: * @array: A #GByteArray. * * Atomically increments the reference count of @array by one. This * function is MT-safe and may be called from any thread. * * Returns: The passed in #GByteArray. * * Since: 2.22 **/ GByteArray * g_byte_array_ref (GByteArray *array) { return (GByteArray *) g_array_ref ((GArray *) array); } /** * g_byte_array_unref: * @array: A #GByteArray. * * Atomically decrements the reference count of @array by one. If the * reference count drops to 0, all memory allocated by the array is * released. This function is MT-safe and may be called from any * thread. * * Since: 2.22 **/ void g_byte_array_unref (GByteArray *array) { g_array_unref ((GArray *) array); } /** * g_byte_array_append: * @array: a #GByteArray. * @data: the byte data to be added. * @len: the number of bytes to add. * * 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, guint len) { g_array_append_vals ((GArray*) array, (guint8*)data, len); return array; } /** * g_byte_array_prepend: * @array: a #GByteArray. * @data: the byte data to be added. * @len: the number of bytes to add. * * 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, guint len) { g_array_prepend_vals ((GArray*) array, (guint8*)data, len); return array; } /** * g_byte_array_set_size: * @array: a #GByteArray. * @length: the new size of 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) { g_array_set_size ((GArray*) array, length); return array; } /** * g_byte_array_remove_index: * @array: a #GByteArray. * @index_: the index of the byte to remove. * * 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_) { g_array_remove_index ((GArray*) array, index_); return array; } /** * g_byte_array_remove_index_fast: * @array: a #GByteArray. * @index_: the index of the byte to remove. * * 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_) { g_array_remove_index_fast ((GArray*) array, index_); return array; } /** * g_byte_array_remove_range: * @array: a @GByteArray. * @index_: the index of the first byte to remove. * @length: the number of bytes to remove. * * 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* g_byte_array_remove_range (GByteArray *array, guint index_, guint length) { g_return_val_if_fail (array, NULL); g_return_val_if_fail (index_ < array->len, NULL); g_return_val_if_fail (index_ + length <= array->len, NULL); return (GByteArray *)g_array_remove_range ((GArray*) array, index_, length); } /** * g_byte_array_sort: * @array: a #GByteArray. * @compare_func: comparison function. * * Sorts a byte array, using @compare_func which should be a * qsort()-style comparison function (returns less than zero for first * arg is less than second arg, zero for equal, greater than zero if * first arg is greater than second arg). * * If two array elements compare equal, their order in the sorted array * is undefined. If you want equal elements to keep their order (i.e. * you want a stable sort) you can write a comparison function that, * if two elements would otherwise compare equal, compares them by * their addresses. **/ void g_byte_array_sort (GByteArray *array, GCompareFunc compare_func) { g_array_sort ((GArray *) array, compare_func); } /** * g_byte_array_sort_with_data: * @array: a #GByteArray. * @compare_func: comparison function. * @user_data: data to pass to @compare_func. * * Like g_byte_array_sort(), but the comparison function takes an extra * user data argument. **/ void g_byte_array_sort_with_data (GByteArray *array, GCompareDataFunc compare_func, gpointer user_data) { g_array_sort_with_data ((GArray *) array, compare_func, user_data); } pkg-config-0.29.1/glib/glib/gtrashstack.c0000664000175000017500000000543112275467762015113 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1998 Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the GLib Team and others 1997-2000. See the AUTHORS * file for a list of people on the GLib Team. See the ChangeLog * files for a list of changes. These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/. */ #include "config.h" /** * SECTION:trash_stack * @title: Trash Stacks * @short_description: maintain a stack of unused allocated memory chunks * * A #GTrashStack is an efficient way to keep a stack of unused allocated * memory chunks. Each memory chunk is required to be large enough to hold * a #gpointer. This allows the stack to be maintained without any space * overhead, since the stack pointers can be stored inside the memory chunks. * * There is no function to create a #GTrashStack. A %NULL #GTrashStack* * is a perfectly valid empty stack. */ /** * GTrashStack: * @next: pointer to the previous element of the stack, * gets stored in the first sizeof (gpointer) * bytes of the element * * Each piece of memory that is pushed onto the stack * is cast to a GTrashStack*. */ /** * g_trash_stack_push: * @stack_p: a #GTrashStack * @data_p: the piece of memory to push on the stack * * Pushes a piece of memory onto a #GTrashStack. */ /** * g_trash_stack_pop: * @stack_p: a #GTrashStack * * Pops a piece of memory off a #GTrashStack. * * Returns: the element at the top of the stack */ /** * g_trash_stack_peek: * @stack_p: a #GTrashStack * * Returns the element at the top of a #GTrashStack * which may be %NULL. * * Returns: the element at the top of the stack */ /** * g_trash_stack_height: * @stack_p: a #GTrashStack * * Returns the height of a #GTrashStack. * * Note that execution of this function is of O(N) complexity * where N denotes the number of items on the stack. * * Returns: the height of the stack */ #define G_IMPLEMENT_INLINES 1 #define __G_TRASH_STACK_C__ #include "gtrashstack.h" pkg-config-0.29.1/glib/glib/gutf8.c0000664000175000017500000012606512651243552013624 00000000000000/* gutf8.c - Operations on UTF-8 strings. * * Copyright (C) 1999 Tom Tromey * Copyright (C) 2000 Red Hat, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "config.h" #include #ifdef HAVE_CODESET #include #endif #include #ifdef G_PLATFORM_WIN32 #include #define STRICT #include #undef STRICT #endif #include "gconvert.h" #include "ghash.h" #include "gstrfuncs.h" #include "gtestutils.h" #include "gtypes.h" #include "gthread.h" #include "glibintl.h" #define UTF8_COMPUTE(Char, Mask, Len) \ if (Char < 128) \ { \ Len = 1; \ Mask = 0x7f; \ } \ else if ((Char & 0xe0) == 0xc0) \ { \ Len = 2; \ Mask = 0x1f; \ } \ else if ((Char & 0xf0) == 0xe0) \ { \ Len = 3; \ Mask = 0x0f; \ } \ else if ((Char & 0xf8) == 0xf0) \ { \ Len = 4; \ Mask = 0x07; \ } \ else if ((Char & 0xfc) == 0xf8) \ { \ Len = 5; \ Mask = 0x03; \ } \ else if ((Char & 0xfe) == 0xfc) \ { \ Len = 6; \ Mask = 0x01; \ } \ else \ Len = -1; #define UTF8_LENGTH(Char) \ ((Char) < 0x80 ? 1 : \ ((Char) < 0x800 ? 2 : \ ((Char) < 0x10000 ? 3 : \ ((Char) < 0x200000 ? 4 : \ ((Char) < 0x4000000 ? 5 : 6))))) #define UTF8_GET(Result, Chars, Count, Mask, Len) \ (Result) = (Chars)[0] & (Mask); \ for ((Count) = 1; (Count) < (Len); ++(Count)) \ { \ if (((Chars)[(Count)] & 0xc0) != 0x80) \ { \ (Result) = -1; \ break; \ } \ (Result) <<= 6; \ (Result) |= ((Chars)[(Count)] & 0x3f); \ } /* * Check whether a Unicode (5.2) char is in a valid range. * * The first check comes from the Unicode guarantee to never encode * a point above 0x0010ffff, since UTF-16 couldn't represent it. * * The second check covers surrogate pairs (category Cs). * * @param Char the character */ #define UNICODE_VALID(Char) \ ((Char) < 0x110000 && \ (((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, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,6,6,1,1 }; const gchar * const g_utf8_skip = utf8_skip_data; /** * g_utf8_find_prev_char: * @str: pointer to the beginning of a UTF-8 encoded string * @p: pointer to some position within @str * * Given a position @p with a UTF-8 encoded string @str, find the start * of the previous UTF-8 character starting before @p. Returns %NULL if no * UTF-8 characters are present in @str before @p. * * @p does not have to be at the beginning of a UTF-8 character. No check * is made to see if the character found is actually valid other than * it starts with an appropriate byte. * * Return value: a pointer to the found character or %NULL. **/ gchar * g_utf8_find_prev_char (const char *str, const char *p) { for (--p; p >= str; --p) { if ((*p & 0xc0) != 0x80) return (gchar *)p; } return NULL; } /** * g_utf8_find_next_char: * @p: a pointer to a position within a UTF-8 encoded string * @end: a pointer to the byte following the end of the string, * or %NULL to indicate that the string is nul-terminated. * * Finds the start of the next UTF-8 character in the string after @p. * * @p does not have to be at the beginning of a UTF-8 character. No check * is made to see if the character found is actually valid other than * it starts with an appropriate byte. * * Return value: a pointer to the found character or %NULL **/ gchar * g_utf8_find_next_char (const gchar *p, const gchar *end) { if (*p) { if (end) for (++p; p < end && (*p & 0xc0) == 0x80; ++p) ; else for (++p; (*p & 0xc0) == 0x80; ++p) ; } return (p == end) ? NULL : (gchar *)p; } /** * g_utf8_prev_char: * @p: a pointer to a position within a UTF-8 encoded string * * Finds the previous UTF-8 character in the string before @p. * * @p does not have to be at the beginning of a UTF-8 character. No check * is made to see if the character found is actually valid other than * it starts with an appropriate byte. If @p might be the first * character of the string, you must use g_utf8_find_prev_char() instead. * * Return value: a pointer to the found character. **/ gchar * g_utf8_prev_char (const gchar *p) { while (TRUE) { p--; if ((*p & 0xc0) != 0x80) return (gchar *)p; } } /** * g_utf8_strlen: * @p: pointer to the start of a UTF-8 encoded string * @max: the maximum number of bytes to examine. If @max * is less than 0, then the string is assumed to be * nul-terminated. If @max is 0, @p will not be examined and * may be %NULL. If @max is greater than 0, up to @max * bytes are examined * * Computes the length of the string in characters, not including * the terminating nul character. If the @max'th byte falls in the * middle of a character, the last (partial) character is not counted. * * Return value: the length of the string in characters **/ glong g_utf8_strlen (const gchar *p, gssize max) { glong len = 0; const gchar *start = p; g_return_val_if_fail (p != NULL || max == 0, 0); if (max < 0) { while (*p) { p = g_utf8_next_char (p); ++len; } } else { if (max == 0 || !*p) return 0; p = g_utf8_next_char (p); while (p - start < max && *p) { ++len; p = g_utf8_next_char (p); } /* only do the last len increment if we got a complete * char (don't count partial chars) */ if (p - start <= max) ++len; } return len; } /** * g_utf8_substring: * @str: a UTF-8 encoded string * @start_pos: a character offset within @str * @end_pos: another character offset within @str * * Copies a substring out of a UTF-8 encoded string. * The substring will contain @end_pos - @start_pos * characters. * * Returns: a newly allocated copy of the requested * substring. Free with g_free() when no longer needed. * * Since: 2.30 */ gchar * g_utf8_substring (const gchar *str, glong start_pos, glong end_pos) { gchar *start, *end, *out; start = g_utf8_offset_to_pointer (str, start_pos); end = g_utf8_offset_to_pointer (start, end_pos - start_pos); out = g_malloc (end - start + 1); memcpy (out, start, end - start); out[end - start] = 0; return out; } /** * g_utf8_get_char: * @p: a pointer to Unicode character encoded as UTF-8 * * Converts a sequence of bytes encoded as UTF-8 to a Unicode character. * If @p does not point to a valid UTF-8 encoded character, results are * undefined. If you are not sure that the bytes are complete * valid Unicode characters, you should use g_utf8_get_char_validated() * instead. * * Return value: the resulting character **/ gunichar g_utf8_get_char (const gchar *p) { int i, mask = 0, len; gunichar result; unsigned char c = (unsigned char) *p; UTF8_COMPUTE (c, mask, len); if (len == -1) return (gunichar)-1; UTF8_GET (result, p, i, mask, len); return result; } /** * g_utf8_offset_to_pointer: * @str: a UTF-8 encoded string * @offset: a character offset within @str * * Converts from an integer character offset to a pointer to a position * within the string. * * Since 2.10, this function allows to pass a negative @offset to * step backwards. It is usually worth stepping backwards from the end * instead of forwards if @offset is in the last fourth of the string, * since moving forward is about 3 times faster than moving backward. * * * This function doesn't abort when reaching the end of @str. Therefore * you should be sure that @offset is within string boundaries before * calling that function. Call g_utf8_strlen() when unsure. * * This limitation exists as this function is called frequently during * text rendering and therefore has to be as fast as possible. * * * Return value: the resulting pointer **/ gchar * g_utf8_offset_to_pointer (const gchar *str, glong offset) { const gchar *s = str; if (offset > 0) while (offset--) s = g_utf8_next_char (s); else { const char *s1; /* This nice technique for fast backwards stepping * through a UTF-8 string was dubbed "stutter stepping" * by its inventor, Larry Ewing. */ while (offset) { s1 = s; s += offset; while ((*s & 0xc0) == 0x80) s--; offset += g_utf8_pointer_to_offset (s, s1); } } return (gchar *)s; } /** * g_utf8_pointer_to_offset: * @str: a UTF-8 encoded string * @pos: a pointer to a position within @str * * Converts from a pointer to position within a string to a integer * character offset. * * Since 2.10, this function allows @pos to be before @str, and returns * a negative offset in this case. * * Return value: the resulting character offset **/ glong g_utf8_pointer_to_offset (const gchar *str, const gchar *pos) { const gchar *s = str; glong offset = 0; if (pos < str) offset = - g_utf8_pointer_to_offset (pos, str); else while (s < pos) { s = g_utf8_next_char (s); offset++; } return offset; } /** * g_utf8_strncpy: * @dest: buffer to fill with characters from @src * @src: UTF-8 encoded string * @n: character count * * Like the standard C strncpy() function, but * copies a given number of characters instead of a given number of * bytes. The @src string must be valid UTF-8 encoded text. * (Use g_utf8_validate() on all text before trying to use UTF-8 * utility functions with it.) * * Return value: @dest **/ gchar * g_utf8_strncpy (gchar *dest, const gchar *src, gsize n) { const gchar *s = src; while (n && *s) { s = g_utf8_next_char(s); n--; } strncpy(dest, src, s - src); dest[s - src] = 0; return dest; } /* unicode_strchr */ /** * g_unichar_to_utf8: * @c: a Unicode character code * @outbuf: output buffer, must have at least 6 bytes of space. * If %NULL, the length will be computed and returned * and nothing will be written to @outbuf. * * Converts a single character to UTF-8. * * Return value: number of bytes written **/ int g_unichar_to_utf8 (gunichar c, gchar *outbuf) { /* If this gets modified, also update the copy in g_string_insert_unichar() */ guint len = 0; int first; int i; if (c < 0x80) { first = 0; len = 1; } else if (c < 0x800) { first = 0xc0; len = 2; } else if (c < 0x10000) { first = 0xe0; len = 3; } else if (c < 0x200000) { first = 0xf0; len = 4; } else if (c < 0x4000000) { first = 0xf8; len = 5; } else { first = 0xfc; len = 6; } if (outbuf) { for (i = len - 1; i > 0; --i) { outbuf[i] = (c & 0x3f) | 0x80; c >>= 6; } outbuf[0] = c | first; } return len; } /** * g_utf8_strchr: * @p: a nul-terminated UTF-8 encoded string * @len: the maximum length of @p * @c: a Unicode character * * Finds the leftmost occurrence of the given Unicode character * in a UTF-8 encoded string, while limiting the search to @len bytes. * If @len is -1, allow unbounded search. * * Return value: %NULL if the string does not contain the character, * otherwise, a pointer to the start of the leftmost occurrence of * the character in the string. **/ gchar * g_utf8_strchr (const char *p, gssize len, gunichar c) { gchar ch[10]; gint charlen = g_unichar_to_utf8 (c, ch); ch[charlen] = '\0'; return g_strstr_len (p, len, ch); } /** * g_utf8_strrchr: * @p: a nul-terminated UTF-8 encoded string * @len: the maximum length of @p * @c: a Unicode character * * Find the rightmost occurrence of the given Unicode character * in a UTF-8 encoded string, while limiting the search to @len bytes. * If @len is -1, allow unbounded search. * * Return value: %NULL if the string does not contain the character, * otherwise, a pointer to the start of the rightmost occurrence of the * character in the string. **/ gchar * g_utf8_strrchr (const char *p, gssize len, gunichar c) { gchar ch[10]; gint charlen = g_unichar_to_utf8 (c, ch); ch[charlen] = '\0'; return g_strrstr_len (p, len, ch); } /* Like g_utf8_get_char, but take a maximum length * and return (gunichar)-2 on incomplete trailing character; * also check for malformed or overlong sequences * and return (gunichar)-1 in this case. */ static inline gunichar g_utf8_get_char_extended (const gchar *p, gssize max_len) { guint i, len; gunichar min_code; gunichar wc = (guchar) *p; if (wc < 0x80) { return wc; } else if (G_UNLIKELY (wc < 0xc0)) { return (gunichar)-1; } else if (wc < 0xe0) { len = 2; wc &= 0x1f; min_code = 1 << 7; } else if (wc < 0xf0) { len = 3; wc &= 0x0f; min_code = 1 << 11; } else if (wc < 0xf8) { len = 4; wc &= 0x07; min_code = 1 << 16; } else if (wc < 0xfc) { len = 5; wc &= 0x03; min_code = 1 << 21; } else if (wc < 0xfe) { len = 6; wc &= 0x01; min_code = 1 << 26; } else { return (gunichar)-1; } if (G_UNLIKELY (max_len >= 0 && len > max_len)) { for (i = 1; i < max_len; i++) { if ((((guchar *)p)[i] & 0xc0) != 0x80) return (gunichar)-1; } return (gunichar)-2; } for (i = 1; i < len; ++i) { gunichar ch = ((guchar *)p)[i]; if (G_UNLIKELY ((ch & 0xc0) != 0x80)) { if (ch) return (gunichar)-1; else return (gunichar)-2; } wc <<= 6; wc |= (ch & 0x3f); } if (G_UNLIKELY (wc < min_code)) return (gunichar)-1; return wc; } /** * g_utf8_get_char_validated: * @p: a pointer to Unicode character encoded as UTF-8 * @max_len: the maximum number of bytes to read, or -1, for no maximum or * if @p is nul-terminated * * Convert a sequence of bytes encoded as UTF-8 to a Unicode character. * This function checks for incomplete characters, for invalid characters * such as characters that are out of the range of Unicode, and for * overlong encodings of valid characters. * * Return value: the resulting character. If @p points to a partial * sequence at the end of a string that could begin a valid * character (or if @max_len is zero), returns (gunichar)-2; * otherwise, if @p does not point to a valid UTF-8 encoded * Unicode character, returns (gunichar)-1. **/ gunichar g_utf8_get_char_validated (const gchar *p, gssize max_len) { gunichar result; if (max_len == 0) return (gunichar)-2; result = g_utf8_get_char_extended (p, max_len); if (result & 0x80000000) return result; else if (!UNICODE_VALID (result)) return (gunichar)-1; else return result; } /** * g_utf8_to_ucs4_fast: * @str: a UTF-8 encoded string * @len: the maximum length of @str to use, in bytes. If @len < 0, * then the string is nul-terminated. * @items_written: (allow-none): location to store the number of characters in the * result, or %NULL. * * Convert a string from UTF-8 to a 32-bit fixed width * representation as UCS-4, assuming valid UTF-8 input. * This function is roughly twice as fast as g_utf8_to_ucs4() * but does no error checking on the input. A trailing 0 character * will be added to the string after the converted text. * * Return value: a pointer to a newly allocated UCS-4 string. * This value must be freed with g_free(). **/ gunichar * g_utf8_to_ucs4_fast (const gchar *str, glong len, glong *items_written) { gunichar *result; gint n_chars, i; const gchar *p; g_return_val_if_fail (str != NULL, NULL); p = str; n_chars = 0; if (len < 0) { while (*p) { p = g_utf8_next_char (p); ++n_chars; } } else { while (p < str + len && *p) { p = g_utf8_next_char (p); ++n_chars; } } result = g_new (gunichar, n_chars + 1); p = str; for (i=0; i < n_chars; i++) { gunichar wc = (guchar)*p++; if (wc < 0x80) { result[i] = wc; } else { gunichar mask = 0x40; if (G_UNLIKELY ((wc & mask) == 0)) { /* It's an out-of-sequence 10xxxxxxx byte. * Rather than making an ugly hash of this and the next byte * and overrunning the buffer, it's more useful to treat it * with a replacement character */ result[i] = 0xfffd; continue; } do { wc <<= 6; wc |= (guchar)(*p++) & 0x3f; mask <<= 5; } while((wc & mask) != 0); wc &= mask - 1; result[i] = wc; } } result[i] = 0; if (items_written) *items_written = i; return result; } /** * g_utf8_to_ucs4: * @str: a UTF-8 encoded string * @len: the maximum length of @str to use, in bytes. If @len < 0, * then the string is nul-terminated. * @items_read: (allow-none): location to store number of bytes read, or %NULL. * If %NULL, then %G_CONVERT_ERROR_PARTIAL_INPUT will be * returned in case @str contains a trailing partial * character. If an error occurs then the index of the * invalid input is stored here. * @items_written: (allow-none): location to store number of characters written or %NULL. * The value here stored does not include the trailing 0 * character. * @error: location to store the error occurring, or %NULL to ignore * errors. Any of the errors in #GConvertError other than * %G_CONVERT_ERROR_NO_CONVERSION may occur. * * Convert a string from UTF-8 to a 32-bit fixed width * representation as UCS-4. A trailing 0 character will be added to the * string after the converted text. * * Return value: a pointer to a newly allocated UCS-4 string. * This value must be freed with g_free(). If an * error occurs, %NULL will be returned and * @error set. **/ gunichar * g_utf8_to_ucs4 (const gchar *str, glong len, glong *items_read, glong *items_written, GError **error) { gunichar *result = NULL; gint n_chars, i; const gchar *in; in = str; n_chars = 0; while ((len < 0 || str + len - in > 0) && *in) { gunichar wc = g_utf8_get_char_extended (in, len < 0 ? 6 : str + len - in); if (wc & 0x80000000) { if (wc == (gunichar)-2) { if (items_read) break; else g_set_error_literal (error, G_CONVERT_ERROR, G_CONVERT_ERROR_PARTIAL_INPUT, _("Partial character sequence at end of input")); } else g_set_error_literal (error, G_CONVERT_ERROR, G_CONVERT_ERROR_ILLEGAL_SEQUENCE, _("Invalid byte sequence in conversion input")); goto err_out; } n_chars++; in = g_utf8_next_char (in); } result = g_new (gunichar, n_chars + 1); in = str; for (i=0; i < n_chars; i++) { result[i] = g_utf8_get_char (in); in = g_utf8_next_char (in); } result[i] = 0; if (items_written) *items_written = n_chars; err_out: if (items_read) *items_read = in - str; return result; } /** * g_ucs4_to_utf8: * @str: a UCS-4 encoded string * @len: the maximum length (number of characters) of @str to use. * If @len < 0, then the string is nul-terminated. * @items_read: (allow-none): location to store number of characters read, or %NULL. * @items_written: (allow-none): location to store number of bytes written or %NULL. * The value here stored does not include the trailing 0 * byte. * @error: location to store the error occurring, or %NULL to ignore * errors. Any of the errors in #GConvertError other than * %G_CONVERT_ERROR_NO_CONVERSION may occur. * * Convert a string from a 32-bit fixed width representation as UCS-4. * to UTF-8. The result will be terminated with a 0 byte. * * Return value: a pointer to a newly allocated UTF-8 string. * This value must be freed with g_free(). If an * error occurs, %NULL will be returned and * @error set. In that case, @items_read will be * set to the position of the first invalid input * character. **/ gchar * g_ucs4_to_utf8 (const gunichar *str, glong len, glong *items_read, glong *items_written, GError **error) { gint result_length; gchar *result = NULL; gchar *p; gint i; result_length = 0; for (i = 0; len < 0 || i < len ; i++) { if (!str[i]) break; if (str[i] >= 0x80000000) { g_set_error_literal (error, G_CONVERT_ERROR, G_CONVERT_ERROR_ILLEGAL_SEQUENCE, _("Character out of range for UTF-8")); goto err_out; } result_length += UTF8_LENGTH (str[i]); } result = g_malloc (result_length + 1); p = result; i = 0; while (p < result + result_length) p += g_unichar_to_utf8 (str[i++], p); *p = '\0'; if (items_written) *items_written = p - result; err_out: if (items_read) *items_read = i; return result; } #define SURROGATE_VALUE(h,l) (((h) - 0xd800) * 0x400 + (l) - 0xdc00 + 0x10000) /** * g_utf16_to_utf8: * @str: a UTF-16 encoded string * @len: the maximum length (number of gunichar2) of @str to use. * If @len < 0, then the string is nul-terminated. * @items_read: (allow-none): location to store number of words read, or %NULL. * If %NULL, then %G_CONVERT_ERROR_PARTIAL_INPUT will be * returned in case @str contains a trailing partial * character. If an error occurs then the index of the * invalid input is stored here. * @items_written: (allow-none): location to store number of bytes written, or %NULL. * The value stored here does not include the trailing * 0 byte. * @error: location to store the error occurring, or %NULL to ignore * errors. Any of the errors in #GConvertError other than * %G_CONVERT_ERROR_NO_CONVERSION may occur. * * Convert a string from UTF-16 to UTF-8. The result will be * terminated with a 0 byte. * * Note that the input is expected to be already in native endianness, * an initial byte-order-mark character is not handled specially. * g_convert() can be used to convert a byte buffer of UTF-16 data of * ambiguous endianess. * * Further note that this function does not validate the result * string; it may e.g. include embedded NUL characters. The only * validation done by this function is to ensure that the input can * be correctly interpreted as UTF-16, i.e. it doesn't contain * things unpaired surrogates. * * Return value: a pointer to a newly allocated UTF-8 string. * This value must be freed with g_free(). If an * error occurs, %NULL will be returned and * @error set. **/ gchar * g_utf16_to_utf8 (const gunichar2 *str, glong len, glong *items_read, glong *items_written, GError **error) { /* This function and g_utf16_to_ucs4 are almost exactly identical - The lines that differ * are marked. */ const gunichar2 *in; gchar *out; gchar *result = NULL; gint n_bytes; gunichar high_surrogate; g_return_val_if_fail (str != NULL, NULL); n_bytes = 0; in = str; high_surrogate = 0; while ((len < 0 || in - str < len) && *in) { gunichar2 c = *in; gunichar wc; if (c >= 0xdc00 && c < 0xe000) /* low surrogate */ { if (high_surrogate) { wc = SURROGATE_VALUE (high_surrogate, c); high_surrogate = 0; } else { g_set_error_literal (error, G_CONVERT_ERROR, G_CONVERT_ERROR_ILLEGAL_SEQUENCE, _("Invalid sequence in conversion input")); goto err_out; } } else { if (high_surrogate) { g_set_error_literal (error, G_CONVERT_ERROR, G_CONVERT_ERROR_ILLEGAL_SEQUENCE, _("Invalid sequence in conversion input")); goto err_out; } if (c >= 0xd800 && c < 0xdc00) /* high surrogate */ { high_surrogate = c; goto next1; } else wc = c; } /********** DIFFERENT for UTF8/UCS4 **********/ n_bytes += UTF8_LENGTH (wc); next1: in++; } if (high_surrogate && !items_read) { g_set_error_literal (error, G_CONVERT_ERROR, G_CONVERT_ERROR_PARTIAL_INPUT, _("Partial character sequence at end of input")); goto err_out; } /* At this point, everything is valid, and we just need to convert */ /********** DIFFERENT for UTF8/UCS4 **********/ result = g_malloc (n_bytes + 1); high_surrogate = 0; out = result; in = str; while (out < result + n_bytes) { gunichar2 c = *in; gunichar wc; if (c >= 0xdc00 && c < 0xe000) /* low surrogate */ { wc = SURROGATE_VALUE (high_surrogate, c); high_surrogate = 0; } else if (c >= 0xd800 && c < 0xdc00) /* high surrogate */ { high_surrogate = c; goto next2; } else wc = c; /********** DIFFERENT for UTF8/UCS4 **********/ out += g_unichar_to_utf8 (wc, out); next2: in++; } /********** DIFFERENT for UTF8/UCS4 **********/ *out = '\0'; if (items_written) /********** DIFFERENT for UTF8/UCS4 **********/ *items_written = out - result; err_out: if (items_read) *items_read = in - str; return result; } /** * g_utf16_to_ucs4: * @str: a UTF-16 encoded string * @len: the maximum length (number of gunichar2) of @str to use. * If @len < 0, then the string is nul-terminated. * @items_read: (allow-none): location to store number of words read, or %NULL. * If %NULL, then %G_CONVERT_ERROR_PARTIAL_INPUT will be * returned in case @str contains a trailing partial * character. If an error occurs then the index of the * invalid input is stored here. * @items_written: (allow-none): location to store number of characters written, or %NULL. * The value stored here does not include the trailing * 0 character. * @error: location to store the error occurring, or %NULL to ignore * errors. Any of the errors in #GConvertError other than * %G_CONVERT_ERROR_NO_CONVERSION may occur. * * Convert a string from UTF-16 to UCS-4. The result will be * nul-terminated. * * Return value: a pointer to a newly allocated UCS-4 string. * This value must be freed with g_free(). If an * error occurs, %NULL will be returned and * @error set. **/ gunichar * g_utf16_to_ucs4 (const gunichar2 *str, glong len, glong *items_read, glong *items_written, GError **error) { const gunichar2 *in; gchar *out; gchar *result = NULL; gint n_bytes; gunichar high_surrogate; g_return_val_if_fail (str != NULL, NULL); n_bytes = 0; in = str; high_surrogate = 0; while ((len < 0 || in - str < len) && *in) { gunichar2 c = *in; if (c >= 0xdc00 && c < 0xe000) /* low surrogate */ { if (high_surrogate) { high_surrogate = 0; } else { g_set_error_literal (error, G_CONVERT_ERROR, G_CONVERT_ERROR_ILLEGAL_SEQUENCE, _("Invalid sequence in conversion input")); goto err_out; } } else { if (high_surrogate) { g_set_error_literal (error, G_CONVERT_ERROR, G_CONVERT_ERROR_ILLEGAL_SEQUENCE, _("Invalid sequence in conversion input")); goto err_out; } if (c >= 0xd800 && c < 0xdc00) /* high surrogate */ { high_surrogate = c; goto next1; } } /********** DIFFERENT for UTF8/UCS4 **********/ n_bytes += sizeof (gunichar); next1: in++; } if (high_surrogate && !items_read) { g_set_error_literal (error, G_CONVERT_ERROR, G_CONVERT_ERROR_PARTIAL_INPUT, _("Partial character sequence at end of input")); goto err_out; } /* At this point, everything is valid, and we just need to convert */ /********** DIFFERENT for UTF8/UCS4 **********/ result = g_malloc (n_bytes + 4); high_surrogate = 0; out = result; in = str; while (out < result + n_bytes) { gunichar2 c = *in; gunichar wc; if (c >= 0xdc00 && c < 0xe000) /* low surrogate */ { wc = SURROGATE_VALUE (high_surrogate, c); high_surrogate = 0; } else if (c >= 0xd800 && c < 0xdc00) /* high surrogate */ { high_surrogate = c; goto next2; } else wc = c; /********** DIFFERENT for UTF8/UCS4 **********/ *(gunichar *)out = wc; out += sizeof (gunichar); next2: in++; } /********** DIFFERENT for UTF8/UCS4 **********/ *(gunichar *)out = 0; if (items_written) /********** DIFFERENT for UTF8/UCS4 **********/ *items_written = (out - result) / sizeof (gunichar); err_out: if (items_read) *items_read = in - str; return (gunichar *)result; } /** * g_utf8_to_utf16: * @str: a UTF-8 encoded string * @len: the maximum length (number of bytes) of @str to use. * If @len < 0, then the string is nul-terminated. * @items_read: (allow-none): location to store number of bytes read, or %NULL. * If %NULL, then %G_CONVERT_ERROR_PARTIAL_INPUT will be * returned in case @str contains a trailing partial * character. If an error occurs then the index of the * invalid input is stored here. * @items_written: (allow-none): location to store number of gunichar2 written, * or %NULL. * The value stored here does not include the trailing 0. * @error: location to store the error occurring, or %NULL to ignore * errors. Any of the errors in #GConvertError other than * %G_CONVERT_ERROR_NO_CONVERSION may occur. * * Convert a string from UTF-8 to UTF-16. A 0 character will be * added to the result after the converted text. * * Return value: a pointer to a newly allocated UTF-16 string. * This value must be freed with g_free(). If an * error occurs, %NULL will be returned and * @error set. **/ gunichar2 * g_utf8_to_utf16 (const gchar *str, glong len, glong *items_read, glong *items_written, GError **error) { gunichar2 *result = NULL; gint n16; const gchar *in; gint i; g_return_val_if_fail (str != NULL, NULL); in = str; n16 = 0; while ((len < 0 || str + len - in > 0) && *in) { gunichar wc = g_utf8_get_char_extended (in, len < 0 ? 6 : str + len - in); if (wc & 0x80000000) { if (wc == (gunichar)-2) { if (items_read) break; else g_set_error_literal (error, G_CONVERT_ERROR, G_CONVERT_ERROR_PARTIAL_INPUT, _("Partial character sequence at end of input")); } else g_set_error_literal (error, G_CONVERT_ERROR, G_CONVERT_ERROR_ILLEGAL_SEQUENCE, _("Invalid byte sequence in conversion input")); goto err_out; } if (wc < 0xd800) n16 += 1; else if (wc < 0xe000) { g_set_error_literal (error, G_CONVERT_ERROR, G_CONVERT_ERROR_ILLEGAL_SEQUENCE, _("Invalid sequence in conversion input")); goto err_out; } else if (wc < 0x10000) n16 += 1; else if (wc < 0x110000) n16 += 2; else { g_set_error_literal (error, G_CONVERT_ERROR, G_CONVERT_ERROR_ILLEGAL_SEQUENCE, _("Character out of range for UTF-16")); goto err_out; } in = g_utf8_next_char (in); } result = g_new (gunichar2, n16 + 1); in = str; for (i = 0; i < n16;) { gunichar wc = g_utf8_get_char (in); if (wc < 0x10000) { result[i++] = wc; } else { result[i++] = (wc - 0x10000) / 0x400 + 0xd800; result[i++] = (wc - 0x10000) % 0x400 + 0xdc00; } in = g_utf8_next_char (in); } result[i] = 0; if (items_written) *items_written = n16; err_out: if (items_read) *items_read = in - str; return result; } /** * g_ucs4_to_utf16: * @str: a UCS-4 encoded string * @len: the maximum length (number of characters) of @str to use. * If @len < 0, then the string is nul-terminated. * @items_read: (allow-none): location to store number of bytes read, or %NULL. * If an error occurs then the index of the invalid input * is stored here. * @items_written: (allow-none): location to store number of gunichar2 * written, or %NULL. The value stored here does not * include the trailing 0. * @error: location to store the error occurring, or %NULL to ignore * errors. Any of the errors in #GConvertError other than * %G_CONVERT_ERROR_NO_CONVERSION may occur. * * Convert a string from UCS-4 to UTF-16. A 0 character will be * added to the result after the converted text. * * Return value: a pointer to a newly allocated UTF-16 string. * This value must be freed with g_free(). If an * error occurs, %NULL will be returned and * @error set. **/ gunichar2 * g_ucs4_to_utf16 (const gunichar *str, glong len, glong *items_read, glong *items_written, GError **error) { gunichar2 *result = NULL; gint n16; gint i, j; n16 = 0; i = 0; while ((len < 0 || i < len) && str[i]) { gunichar wc = str[i]; if (wc < 0xd800) n16 += 1; else if (wc < 0xe000) { g_set_error_literal (error, G_CONVERT_ERROR, G_CONVERT_ERROR_ILLEGAL_SEQUENCE, _("Invalid sequence in conversion input")); goto err_out; } else if (wc < 0x10000) n16 += 1; else if (wc < 0x110000) n16 += 2; else { g_set_error_literal (error, G_CONVERT_ERROR, G_CONVERT_ERROR_ILLEGAL_SEQUENCE, _("Character out of range for UTF-16")); goto err_out; } i++; } result = g_new (gunichar2, n16 + 1); for (i = 0, j = 0; j < n16; i++) { gunichar wc = str[i]; if (wc < 0x10000) { result[j++] = wc; } else { result[j++] = (wc - 0x10000) / 0x400 + 0xd800; result[j++] = (wc - 0x10000) % 0x400 + 0xdc00; } } result[j] = 0; if (items_written) *items_written = n16; err_out: if (items_read) *items_read = i; return result; } #define CONTINUATION_CHAR \ G_STMT_START { \ if ((*(guchar *)p & 0xc0) != 0x80) /* 10xxxxxx */ \ goto error; \ val <<= 6; \ val |= (*(guchar *)p) & 0x3f; \ } G_STMT_END static const gchar * fast_validate (const char *str) { gunichar val = 0; gunichar min = 0; const gchar *p; for (p = str; *p; p++) { if (*(guchar *)p < 128) /* done */; else { const gchar *last; last = p; if ((*(guchar *)p & 0xe0) == 0xc0) /* 110xxxxx */ { if (G_UNLIKELY ((*(guchar *)p & 0x1e) == 0)) goto error; p++; if (G_UNLIKELY ((*(guchar *)p & 0xc0) != 0x80)) /* 10xxxxxx */ goto error; } else { if ((*(guchar *)p & 0xf0) == 0xe0) /* 1110xxxx */ { min = (1 << 11); val = *(guchar *)p & 0x0f; goto TWO_REMAINING; } else if ((*(guchar *)p & 0xf8) == 0xf0) /* 11110xxx */ { min = (1 << 16); val = *(guchar *)p & 0x07; } else goto error; p++; CONTINUATION_CHAR; TWO_REMAINING: p++; CONTINUATION_CHAR; p++; CONTINUATION_CHAR; if (G_UNLIKELY (val < min)) goto error; if (G_UNLIKELY (!UNICODE_VALID(val))) goto error; } continue; error: return last; } } return p; } static const gchar * fast_validate_len (const char *str, gssize max_len) { gunichar val = 0; gunichar min = 0; const gchar *p; g_assert (max_len >= 0); for (p = str; ((p - str) < max_len) && *p; p++) { if (*(guchar *)p < 128) /* done */; else { const gchar *last; last = p; if ((*(guchar *)p & 0xe0) == 0xc0) /* 110xxxxx */ { if (G_UNLIKELY (max_len - (p - str) < 2)) goto error; if (G_UNLIKELY ((*(guchar *)p & 0x1e) == 0)) goto error; p++; if (G_UNLIKELY ((*(guchar *)p & 0xc0) != 0x80)) /* 10xxxxxx */ goto error; } else { if ((*(guchar *)p & 0xf0) == 0xe0) /* 1110xxxx */ { if (G_UNLIKELY (max_len - (p - str) < 3)) goto error; min = (1 << 11); val = *(guchar *)p & 0x0f; goto TWO_REMAINING; } else if ((*(guchar *)p & 0xf8) == 0xf0) /* 11110xxx */ { if (G_UNLIKELY (max_len - (p - str) < 4)) goto error; min = (1 << 16); val = *(guchar *)p & 0x07; } else goto error; p++; CONTINUATION_CHAR; TWO_REMAINING: p++; CONTINUATION_CHAR; p++; CONTINUATION_CHAR; if (G_UNLIKELY (val < min)) goto error; if (G_UNLIKELY (!UNICODE_VALID(val))) goto error; } continue; error: return last; } } return p; } /** * g_utf8_validate: * @str: (array length=max_len) (element-type guint8): a pointer to character data * @max_len: max bytes to validate, or -1 to go until NUL * @end: (allow-none) (out) (transfer none): return location for end of valid data * * Validates UTF-8 encoded text. @str is the text to validate; * if @str is nul-terminated, then @max_len can be -1, otherwise * @max_len should be the number of bytes to validate. * If @end is non-%NULL, then the end of the valid range * will be stored there (i.e. the start of the first invalid * character if some bytes were invalid, or the end of the text * being validated otherwise). * * Note that g_utf8_validate() returns %FALSE if @max_len is * positive and any of the @max_len bytes are NUL. * * Returns %TRUE if all of @str was valid. Many GLib and GTK+ * routines require valid UTF-8 as input; * so data read from a file or the network should be checked * with g_utf8_validate() before doing anything else with it. * * Return value: %TRUE if the text was valid UTF-8 **/ gboolean g_utf8_validate (const char *str, gssize max_len, const gchar **end) { const gchar *p; if (max_len < 0) p = fast_validate (str); else p = fast_validate_len (str, max_len); if (end) *end = p; if ((max_len >= 0 && p != str + max_len) || (max_len < 0 && *p != '\0')) return FALSE; else return TRUE; } /** * g_unichar_validate: * @ch: a Unicode character * * Checks whether @ch is a valid Unicode character. Some possible * integer values of @ch will not be valid. 0 is considered a valid * character, though it's normally a string terminator. * * Return value: %TRUE if @ch is a valid Unicode character **/ gboolean g_unichar_validate (gunichar ch) { return UNICODE_VALID (ch); } /** * g_utf8_strreverse: * @str: a UTF-8 encoded string * @len: the maximum length of @str to use, in bytes. If @len < 0, * then the string is nul-terminated. * * Reverses a UTF-8 string. @str must be valid UTF-8 encoded text. * (Use g_utf8_validate() on all text before trying to use UTF-8 * utility functions with it.) * * This function is intended for programmatic uses of reversed strings. * It pays no attention to decomposed characters, combining marks, byte * order marks, directional indicators (LRM, LRO, etc) and similar * characters which might need special handling when reversing a string * for display purposes. * * Note that unlike g_strreverse(), this function returns * newly-allocated memory, which should be freed with g_free() when * no longer needed. * * Returns: a newly-allocated string which is the reverse of @str. * * Since: 2.2 */ gchar * g_utf8_strreverse (const gchar *str, gssize len) { gchar *r, *result; const gchar *p; if (len < 0) len = strlen (str); result = g_new (gchar, len + 1); r = result + len; p = str; while (r > result) { gchar *m, skip = g_utf8_skip[*(guchar*) p]; r -= skip; for (m = r; skip; skip--) *m++ = *p++; } result[len] = 0; return result; } gchar * _g_utf8_make_valid (const gchar *name) { GString *string; const gchar *remainder, *invalid; gint remaining_bytes, valid_bytes; g_return_val_if_fail (name != NULL, NULL); string = NULL; remainder = name; remaining_bytes = strlen (name); while (remaining_bytes != 0) { if (g_utf8_validate (remainder, remaining_bytes, &invalid)) break; valid_bytes = invalid - remainder; if (string == NULL) string = g_string_sized_new (remaining_bytes); g_string_append_len (string, remainder, valid_bytes); /* append U+FFFD REPLACEMENT CHARACTER */ g_string_append (string, "\357\277\275"); remaining_bytes -= valid_bytes + 1; remainder = invalid + 1; } if (string == NULL) return g_strdup (name); g_string_append (string, remainder); g_assert (g_utf8_validate (string->str, -1, NULL)); return g_string_free (string, FALSE); } pkg-config-0.29.1/glib/glib/gprintf.h0000664000175000017500000000400612651243552014233 00000000000000/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997, 2002 Peter Mattis, Red Hat, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __G_PRINTF_H__ #define __G_PRINTF_H__ #include #include #include 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) G_GNUC_PRINTF(1, 0); GLIB_AVAILABLE_IN_ALL gint g_vfprintf (FILE *file, gchar const *format, va_list args) G_GNUC_PRINTF(2, 0); GLIB_AVAILABLE_IN_ALL gint g_vsprintf (gchar *string, gchar const *format, va_list args) G_GNUC_PRINTF(2, 0); GLIB_AVAILABLE_IN_ALL gint g_vasprintf (gchar **string, gchar const *format, va_list args) G_GNUC_PRINTF(2, 0); G_END_DECLS #endif /* __G_PRINTF_H__ */ pkg-config-0.29.1/glib/glib/gatomic.c0000664000175000017500000005504112651243552014205 00000000000000/* * Copyright © 2011 Ryan Lortie * * This library is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2 of the * licence, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, * USA. * * Author: Ryan Lortie */ #include "config.h" #include "gatomic.h" /** * SECTION:atomic_operations * @title: Atomic Operations * @short_description: basic atomic integer and pointer operations * @see_also: #GMutex * * The following is a collection of compiler macros to provide atomic * access to integer and pointer-sized values. * * The macros that have 'int' in the name will operate on pointers to * #gint and #guint. The macros with 'pointer' in the name will operate * on pointers to any pointer-sized value, including #gsize. There is * no support for 64bit operations on platforms with 32bit pointers * because it is not generally possible to perform these operations * atomically. * * The get, set and exchange operations for integers and pointers * nominally operate on #gint and #gpointer, respectively. Of the * arithmetic operations, the 'add' operation operates on (and returns) * signed integer values (#gint and #gssize) and the 'and', 'or', and * 'xor' operations operate on (and return) unsigned integer values * (#guint and #gsize). * * All of the operations act as a full compiler and (where appropriate) * hardware memory barrier. Acquire and release or producer and * consumer barrier semantics are not available through this API. * * It is very important that all accesses to a particular integer or * pointer be performed using only this API and that different sizes of * operation are not mixed or used on overlapping memory regions. Never * read or assign directly from or to a value -- always use this API. * * For simple reference counting purposes you should use * g_atomic_int_inc() and g_atomic_int_dec_and_test(). Other uses that * fall outside of simple reference counting patterns are prone to * subtle bugs and occasionally undefined behaviour. It is also worth * noting that since all of these operations require global * synchronisation of the entire machine, they can be quite slow. In * the case of performing multiple atomic operations it can often be * faster to simply acquire a mutex lock around the critical area, * perform the operations normally and then release the lock. **/ /** * G_ATOMIC_LOCK_FREE: * * This macro is defined if the atomic operations of GLib are * implemented using real hardware atomic operations. This means that * the GLib atomic API can be used between processes and safely mixed * with other (hardware) atomic APIs. * * If this macro is not defined, the atomic operations may be * emulated using a mutex. In that case, the GLib atomic operations are * only atomic relative to themselves and within a single process. **/ /* NOTE CAREFULLY: * * This file is the lowest-level part of GLib. * * Other lowlevel parts of GLib (threads, slice allocator, g_malloc, * messages, etc) call into these functions and macros to get work done. * * As such, these functions can not call back into any part of GLib * without risking recursion. */ #ifdef G_ATOMIC_LOCK_FREE /* if G_ATOMIC_LOCK_FREE was defined by ./configure then we MUST * implement the atomic operations in a lock-free manner. */ #if defined (__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4) /** * g_atomic_int_get: * @atomic: a pointer to a #gint or #guint * * Gets the current value of @atomic. * * This call acts as a full compiler and hardware * memory barrier (before the get). * * Returns: the value of the integer * * Since: 2.4 **/ gint (g_atomic_int_get) (const volatile gint *atomic) { return g_atomic_int_get (atomic); } /** * g_atomic_int_set: * @atomic: a pointer to a #gint or #guint * @newval: a new value to store * * Sets the value of @atomic to @newval. * * This call acts as a full compiler and hardware * memory barrier (after the set). * * Since: 2.4 */ void (g_atomic_int_set) (volatile gint *atomic, gint newval) { g_atomic_int_set (atomic, newval); } /** * g_atomic_int_inc: * @atomic: a pointer to a #gint or #guint * * Increments the value of @atomic by 1. * * Think of this operation as an atomic version of * { *@atomic += 1; } * * This call acts as a full compiler and hardware memory barrier. * * Since: 2.4 **/ void (g_atomic_int_inc) (volatile gint *atomic) { g_atomic_int_inc (atomic); } /** * g_atomic_int_dec_and_test: * @atomic: a pointer to a #gint or #guint * * Decrements the value of @atomic by 1. * * Think of this operation as an atomic version of * { *@atomic -= 1; return (*@atomic == 0); } * * This call acts as a full compiler and hardware memory barrier. * * Returns: %TRUE if the resultant value is zero * * Since: 2.4 **/ gboolean (g_atomic_int_dec_and_test) (volatile gint *atomic) { return g_atomic_int_dec_and_test (atomic); } /** * g_atomic_int_compare_and_exchange: * @atomic: a pointer to a #gint or #guint * @oldval: the value to compare with * @newval: the value to conditionally replace with * * Compares @atomic to @oldval and, if equal, sets it to @newval. * If @atomic was not equal to @oldval then no change occurs. * * This compare and exchange is done atomically. * * Think of this operation as an atomic version of * { if (*@atomic == @oldval) { *@atomic = @newval; return TRUE; } else return FALSE; } * * This call acts as a full compiler and hardware memory barrier. * * Returns: %TRUE if the exchange took place * * Since: 2.4 **/ gboolean (g_atomic_int_compare_and_exchange) (volatile gint *atomic, gint oldval, gint newval) { return g_atomic_int_compare_and_exchange (atomic, oldval, newval); } /** * g_atomic_int_add: * @atomic: a pointer to a #gint or #guint * @val: the value to add * * Atomically adds @val to the value of @atomic. * * Think of this operation as an atomic version of * { tmp = *atomic; *@atomic += @val; return tmp; } * * This call acts as a full compiler and hardware memory barrier. * * Before version 2.30, this function did not return a value * (but g_atomic_int_exchange_and_add() did, and had the same meaning). * * Returns: the value of @atomic before the add, signed * * Since: 2.4 **/ gint (g_atomic_int_add) (volatile gint *atomic, gint val) { return g_atomic_int_add (atomic, val); } /** * g_atomic_int_and: * @atomic: a pointer to a #gint or #guint * @val: the value to 'and' * * Performs an atomic bitwise 'and' of the value of @atomic and @val, * storing the result back in @atomic. * * This call acts as a full compiler and hardware memory barrier. * * Think of this operation as an atomic version of * { tmp = *atomic; *@atomic &= @val; return tmp; } * * Returns: the value of @atomic before the operation, unsigned * * Since: 2.30 **/ guint (g_atomic_int_and) (volatile guint *atomic, guint val) { return g_atomic_int_and (atomic, val); } /** * g_atomic_int_or: * @atomic: a pointer to a #gint or #guint * @val: the value to 'or' * * Performs an atomic bitwise 'or' of the value of @atomic and @val, * storing the result back in @atomic. * * Think of this operation as an atomic version of * { tmp = *atomic; *@atomic |= @val; return tmp; } * * This call acts as a full compiler and hardware memory barrier. * * Returns: the value of @atomic before the operation, unsigned * * Since: 2.30 **/ guint (g_atomic_int_or) (volatile guint *atomic, guint val) { return g_atomic_int_or (atomic, val); } /** * g_atomic_int_xor: * @atomic: a pointer to a #gint or #guint * @val: the value to 'xor' * * Performs an atomic bitwise 'xor' of the value of @atomic and @val, * storing the result back in @atomic. * * Think of this operation as an atomic version of * { tmp = *atomic; *@atomic ^= @val; return tmp; } * * This call acts as a full compiler and hardware memory barrier. * * Returns: the value of @atomic before the operation, unsigned * * Since: 2.30 **/ guint (g_atomic_int_xor) (volatile guint *atomic, guint val) { return g_atomic_int_xor (atomic, val); } /** * g_atomic_pointer_get: * @atomic: a pointer to a #gpointer-sized value * * Gets the current value of @atomic. * * This call acts as a full compiler and hardware * memory barrier (before the get). * * Returns: the value of the pointer * * Since: 2.4 **/ gpointer (g_atomic_pointer_get) (const volatile void *atomic) { return g_atomic_pointer_get ((const volatile gpointer *) atomic); } /** * g_atomic_pointer_set: * @atomic: a pointer to a #gpointer-sized value * @newval: a new value to store * * Sets the value of @atomic to @newval. * * This call acts as a full compiler and hardware * memory barrier (after the set). * * Since: 2.4 **/ void (g_atomic_pointer_set) (volatile void *atomic, gpointer newval) { g_atomic_pointer_set ((volatile gpointer *) atomic, newval); } /** * g_atomic_pointer_compare_and_exchange: * @atomic: a pointer to a #gpointer-sized value * @oldval: the value to compare with * @newval: the value to conditionally replace with * * Compares @atomic to @oldval and, if equal, sets it to @newval. * If @atomic was not equal to @oldval then no change occurs. * * This compare and exchange is done atomically. * * Think of this operation as an atomic version of * { if (*@atomic == @oldval) { *@atomic = @newval; return TRUE; } else return FALSE; } * * This call acts as a full compiler and hardware memory barrier. * * Returns: %TRUE if the exchange took place * * Since: 2.4 **/ gboolean (g_atomic_pointer_compare_and_exchange) (volatile void *atomic, gpointer oldval, gpointer newval) { return g_atomic_pointer_compare_and_exchange ((volatile gpointer *) atomic, oldval, newval); } /** * g_atomic_pointer_add: * @atomic: a pointer to a #gpointer-sized value * @val: the value to add * * Atomically adds @val to the value of @atomic. * * Think of this operation as an atomic version of * { tmp = *atomic; *@atomic += @val; return tmp; } * * This call acts as a full compiler and hardware memory barrier. * * Returns: the value of @atomic before the add, signed * * Since: 2.30 **/ gssize (g_atomic_pointer_add) (volatile void *atomic, gssize val) { return g_atomic_pointer_add ((volatile gpointer *) atomic, val); } /** * g_atomic_pointer_and: * @atomic: a pointer to a #gpointer-sized value * @val: the value to 'and' * * Performs an atomic bitwise 'and' of the value of @atomic and @val, * storing the result back in @atomic. * * Think of this operation as an atomic version of * { tmp = *atomic; *@atomic &= @val; return tmp; } * * This call acts as a full compiler and hardware memory barrier. * * Returns: the value of @atomic before the operation, unsigned * * Since: 2.30 **/ gsize (g_atomic_pointer_and) (volatile void *atomic, gsize val) { return g_atomic_pointer_and ((volatile gpointer *) atomic, val); } /** * g_atomic_pointer_or: * @atomic: a pointer to a #gpointer-sized value * @val: the value to 'or' * * Performs an atomic bitwise 'or' of the value of @atomic and @val, * storing the result back in @atomic. * * Think of this operation as an atomic version of * { tmp = *atomic; *@atomic |= @val; return tmp; } * * This call acts as a full compiler and hardware memory barrier. * * Returns: the value of @atomic before the operation, unsigned * * Since: 2.30 **/ gsize (g_atomic_pointer_or) (volatile void *atomic, gsize val) { return g_atomic_pointer_or ((volatile gpointer *) atomic, val); } /** * g_atomic_pointer_xor: * @atomic: a pointer to a #gpointer-sized value * @val: the value to 'xor' * * Performs an atomic bitwise 'xor' of the value of @atomic and @val, * storing the result back in @atomic. * * Think of this operation as an atomic version of * { tmp = *atomic; *@atomic ^= @val; return tmp; } * * This call acts as a full compiler and hardware memory barrier. * * Returns: the value of @atomic before the operation, unsigned * * Since: 2.30 **/ gsize (g_atomic_pointer_xor) (volatile void *atomic, gsize val) { return g_atomic_pointer_xor ((volatile gpointer *) atomic, val); } #elif defined (G_PLATFORM_WIN32) #include #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) (const volatile gint *atomic) { MemoryBarrier (); return *atomic; } void (g_atomic_int_set) (volatile gint *atomic, gint newval) { *atomic = newval; MemoryBarrier (); } void (g_atomic_int_inc) (volatile gint *atomic) { InterlockedIncrement (atomic); } gboolean (g_atomic_int_dec_and_test) (volatile gint *atomic) { return InterlockedDecrement (atomic) == 0; } gboolean (g_atomic_int_compare_and_exchange) (volatile gint *atomic, gint oldval, gint newval) { return InterlockedCompareExchange (atomic, newval, oldval) == oldval; } gint (g_atomic_int_add) (volatile gint *atomic, gint val) { return InterlockedExchangeAdd (atomic, val); } guint (g_atomic_int_and) (volatile guint *atomic, guint val) { return InterlockedAnd (atomic, val); } guint (g_atomic_int_or) (volatile guint *atomic, guint val) { return InterlockedOr (atomic, val); } guint (g_atomic_int_xor) (volatile guint *atomic, guint val) { return InterlockedXor (atomic, val); } gpointer (g_atomic_pointer_get) (const volatile void *atomic) { const volatile gpointer *ptr = atomic; MemoryBarrier (); return *ptr; } void (g_atomic_pointer_set) (volatile void *atomic, gpointer newval) { volatile gpointer *ptr = atomic; *ptr = newval; MemoryBarrier (); } gboolean (g_atomic_pointer_compare_and_exchange) (volatile void *atomic, gpointer oldval, gpointer newval) { return InterlockedCompareExchangePointer (atomic, newval, oldval) == oldval; } gssize (g_atomic_pointer_add) (volatile void *atomic, gssize val) { #if GLIB_SIZEOF_VOID_P == 8 return InterlockedExchangeAdd64 (atomic, val); #else return InterlockedExchangeAdd (atomic, val); #endif } gsize (g_atomic_pointer_and) (volatile void *atomic, gsize val) { #if GLIB_SIZEOF_VOID_P == 8 return InterlockedAnd64 (atomic, val); #else return InterlockedAnd (atomic, val); #endif } gsize (g_atomic_pointer_or) (volatile void *atomic, gsize val) { #if GLIB_SIZEOF_VOID_P == 8 return InterlockedOr64 (atomic, val); #else return InterlockedOr (atomic, val); #endif } gsize (g_atomic_pointer_xor) (volatile void *atomic, gsize val) { #if GLIB_SIZEOF_VOID_P == 8 return InterlockedXor64 (atomic, val); #else return InterlockedXor (atomic, val); #endif } #else /* This error occurs when ./configure decided that we should be capable * of lock-free atomics but we find at compile-time that we are not. */ #error G_ATOMIC_LOCK_FREE defined, but incapable of lock-free atomics. #endif /* defined (__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4) */ #else /* G_ATOMIC_LOCK_FREE */ /* We are not permitted to call into any GLib functions from here, so we * can not use GMutex. * * Fortunately, we already take care of the Windows case above, and all * non-Windows platforms on which glib runs have pthreads. Use those. */ #include static pthread_mutex_t g_atomic_lock = PTHREAD_MUTEX_INITIALIZER; gint (g_atomic_int_get) (const volatile gint *atomic) { gint value; pthread_mutex_lock (&g_atomic_lock); value = *atomic; pthread_mutex_unlock (&g_atomic_lock); return value; } void (g_atomic_int_set) (volatile gint *atomic, gint value) { pthread_mutex_lock (&g_atomic_lock); *atomic = value; pthread_mutex_unlock (&g_atomic_lock); } void (g_atomic_int_inc) (volatile gint *atomic) { pthread_mutex_lock (&g_atomic_lock); (*atomic)++; pthread_mutex_unlock (&g_atomic_lock); } gboolean (g_atomic_int_dec_and_test) (volatile gint *atomic) { gboolean is_zero; pthread_mutex_lock (&g_atomic_lock); is_zero = --(*atomic) == 0; pthread_mutex_unlock (&g_atomic_lock); return is_zero; } gboolean (g_atomic_int_compare_and_exchange) (volatile gint *atomic, gint oldval, gint newval) { gboolean success; pthread_mutex_lock (&g_atomic_lock); if ((success = (*atomic == oldval))) *atomic = newval; pthread_mutex_unlock (&g_atomic_lock); return success; } gint (g_atomic_int_add) (volatile gint *atomic, gint val) { gint oldval; pthread_mutex_lock (&g_atomic_lock); oldval = *atomic; *atomic = oldval + val; pthread_mutex_unlock (&g_atomic_lock); return oldval; } guint (g_atomic_int_and) (volatile guint *atomic, guint val) { guint oldval; pthread_mutex_lock (&g_atomic_lock); oldval = *atomic; *atomic = oldval & val; pthread_mutex_unlock (&g_atomic_lock); return oldval; } guint (g_atomic_int_or) (volatile guint *atomic, guint val) { guint oldval; pthread_mutex_lock (&g_atomic_lock); oldval = *atomic; *atomic = oldval | val; pthread_mutex_unlock (&g_atomic_lock); return oldval; } guint (g_atomic_int_xor) (volatile guint *atomic, guint val) { guint oldval; pthread_mutex_lock (&g_atomic_lock); oldval = *atomic; *atomic = oldval ^ val; pthread_mutex_unlock (&g_atomic_lock); return oldval; } gpointer (g_atomic_pointer_get) (const volatile void *atomic) { const volatile gpointer *ptr = atomic; gpointer value; pthread_mutex_lock (&g_atomic_lock); value = *ptr; pthread_mutex_unlock (&g_atomic_lock); return value; } void (g_atomic_pointer_set) (volatile void *atomic, gpointer newval) { volatile gpointer *ptr = atomic; pthread_mutex_lock (&g_atomic_lock); *ptr = newval; pthread_mutex_unlock (&g_atomic_lock); } gboolean (g_atomic_pointer_compare_and_exchange) (volatile void *atomic, gpointer oldval, gpointer newval) { volatile gpointer *ptr = atomic; gboolean success; pthread_mutex_lock (&g_atomic_lock); if ((success = (*ptr == oldval))) *ptr = newval; pthread_mutex_unlock (&g_atomic_lock); return success; } gssize (g_atomic_pointer_add) (volatile void *atomic, gssize val) { volatile gssize *ptr = atomic; gssize oldval; pthread_mutex_lock (&g_atomic_lock); oldval = *ptr; *ptr = oldval + val; pthread_mutex_unlock (&g_atomic_lock); return oldval; } gsize (g_atomic_pointer_and) (volatile void *atomic, gsize val) { volatile gsize *ptr = atomic; gsize oldval; pthread_mutex_lock (&g_atomic_lock); oldval = *ptr; *ptr = oldval & val; pthread_mutex_unlock (&g_atomic_lock); return oldval; } gsize (g_atomic_pointer_or) (volatile void *atomic, gsize val) { volatile gsize *ptr = atomic; gsize oldval; pthread_mutex_lock (&g_atomic_lock); oldval = *ptr; *ptr = oldval | val; pthread_mutex_unlock (&g_atomic_lock); return oldval; } gsize (g_atomic_pointer_xor) (volatile void *atomic, gsize val) { volatile gsize *ptr = atomic; gsize oldval; pthread_mutex_lock (&g_atomic_lock); oldval = *ptr; *ptr = oldval ^ val; pthread_mutex_unlock (&g_atomic_lock); return oldval; } #endif /** * g_atomic_int_exchange_and_add: * @atomic: a pointer to a #gint * @val: the value to add * * This function existed before g_atomic_int_add() returned the prior * value of the integer (which it now does). It is retained only for * compatibility reasons. Don't use this function in new code. * * Returns: the value of @atomic before the add, signed * Since: 2.4 * Deprecated: 2.30: Use g_atomic_int_add() instead. **/ gint g_atomic_int_exchange_and_add (volatile gint *atomic, gint val) { return (g_atomic_int_add) (atomic, val); } pkg-config-0.29.1/glib/configure0000775000175000017500000333053312665370332013417 00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for glib 2.38.2. # # Report bugs to . # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1 test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org and $0: http://bugzilla.gnome.org/enter_bug.cgi?product=glib $0: about your system, including any error possibly output $0: before this message. Then install a modern shell, or $0: manually run the script under such a shell if you do $0: have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" SHELL=${CONFIG_SHELL-/bin/sh} test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='glib' PACKAGE_TARNAME='glib' PACKAGE_VERSION='2.38.2' PACKAGE_STRING='glib 2.38.2' PACKAGE_BUGREPORT='http://bugzilla.gnome.org/enter_bug.cgi?product=glib' PACKAGE_URL='' ac_unique_file="glib/glib.h" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS LIBOBJS gio_INCLUDES gmodule_INCLUDES gobject_INCLUDES glib_INCLUDES config_h_INCLUDES GLIB_WARN_CFLAGS GLIB_HIDDEN_VISIBILITY_CFLAGS GLIB_LINK_FLAGS LTP_GENHTML LTP SHTOOL G_LIBS_EXTRA HAVE_EVENTFD_FALSE HAVE_EVENTFD_TRUE G_THREAD_LIBS_EXTRA G_THREAD_LIBS_FOR_GTHREAD G_THREAD_LIBS G_THREAD_CFLAGS THREADS_NONE_FALSE THREADS_NONE_TRUE THREADS_WIN32_FALSE THREADS_WIN32_TRUE THREADS_POSIX_FALSE THREADS_POSIX_TRUE GTHREAD_COMPILE_IMPL_DEFINES PLATFORM_WIN32_FALSE PLATFORM_WIN32_TRUE ENABLE_TIMELOOP_FALSE ENABLE_TIMELOOP_TRUE PLATFORMDEP HAVE_FEN_FALSE HAVE_FEN_TRUE HAVE_KQUEUE_FALSE HAVE_KQUEUE_TRUE HAVE_INOTIFY_FALSE HAVE_INOTIFY_TRUE GIO_MODULE_DIR GIO GSPAWN GLIB_DEBUG_FLAGS G_MODULE_NEED_USCORE G_MODULE_BROKEN_RTLD_GLOBAL G_MODULE_HAVE_DLERROR G_MODULE_LDFLAGS G_MODULE_PLUGIN_LIBS G_MODULE_LIBS_EXTRA G_MODULE_LIBS G_MODULE_IMPL G_MODULE_SUPPORTED HAVE_GOOD_PRINTF_FALSE HAVE_GOOD_PRINTF_TRUE HAVE_NETLINK_FALSE HAVE_NETLINK_TRUE NETWORK_LIBS NAMESER_COMPAT_INCLUDE WSPIAPI_INCLUDE GLIBC21 HAVE_SUNSTUDIO_VISIBILITY_FALSE HAVE_SUNSTUDIO_VISIBILITY_TRUE HAVE_GNUC_VISIBILITY_FALSE HAVE_GNUC_VISIBILITY_TRUE ALLOCA OS_WIN32_AND_DLL_COMPILATION_FALSE OS_WIN32_AND_DLL_COMPILATION_TRUE GLIB_WIN32_STATIC_COMPILATION_DEFINE CXXCPP LT_SYS_LIBRARY_PATH OTOOL64 OTOOL LIPO NMEDIT DSYMUTIL MANIFEST_TOOL ac_ct_AR AR LN_S ac_ct_DUMPBIN DUMPBIN LD FGREP SED LIBTOOL OBJDUMP AS ICONV_LIBS GETTEXT_PACKAGE pkgpyexecdir pyexecdir pkgpythondir pythondir PYTHON_PLATFORM PYTHON_EXEC_PREFIX PYTHON_PREFIX PYTHON_VERSION PYTHON PERL_PATH REBUILD INDENT PERL GLIB_EXTRA_CFLAGS HAVE_CXX_FALSE HAVE_CXX_TRUE am__fastdepCXX_FALSE am__fastdepCXX_TRUE CXXDEPMODE CXXFLAGS ac_ct_CXX CXX HAVE_GLIB_RUNTIME_LIBDIR_FALSE HAVE_GLIB_RUNTIME_LIBDIR_TRUE ABS_GLIB_RUNTIME_LIBDIR GLIB_RUNTIME_LIBDIR installed_testdir installed_test_metadir ENABLE_ALWAYS_BUILD_TESTS_FALSE ENABLE_ALWAYS_BUILD_TESTS_TRUE ENABLE_INSTALLED_TESTS_FALSE ENABLE_INSTALLED_TESTS_TRUE MS_LIB_AVAILABLE_FALSE MS_LIB_AVAILABLE_TRUE ms_librarian DLLTOOL RANLIB NM WINDRES OS_COCOA_FALSE OS_COCOA_TRUE OS_CARBON_FALSE OS_CARBON_TRUE OS_LINUX_FALSE OS_LINUX_TRUE OS_UNIX_FALSE OS_UNIX_TRUE OS_WIN32_X64_FALSE OS_WIN32_X64_TRUE OS_WIN32_FALSE OS_WIN32_TRUE LIB_EXE_MACHINE_FLAG host_os host_vendor host_cpu host build_os build_vendor build_cpu build HAVE_GCC_FALSE HAVE_GCC_TRUE EGREP GREP CPP am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC LT_CURRENT_MINUS_AGE LT_AGE LT_REVISION LT_CURRENT LT_RELEASE GLIB_BINARY_AGE GLIB_INTERFACE_AGE GLIB_VERSION GLIB_MICRO_VERSION GLIB_MINOR_VERSION GLIB_MAJOR_VERSION MAINT MAINTAINER_MODE_FALSE MAINTAINER_MODE_TRUE AM_BACKSLASH AM_DEFAULT_VERBOSITY AM_DEFAULT_V AM_V am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_silent_rules enable_maintainer_mode enable_dependency_tracking enable_debug enable_gc_friendly enable_mem_pools enable_rebuilds enable_installed_tests enable_always_build_tests with_runtime_libdir enable_largefile with_python with_libiconv enable_static enable_shared with_pic enable_fast_install with_aix_soname with_gnu_ld with_sysroot enable_libtool_lock enable_included_printf with_gio_module_dir with_threads enable_gcov enable_Bsymbolic enable_compile_warnings ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP CXX CXXFLAGS CCC PYTHON LT_SYS_LIBRARY_PATH CXXCPP' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures glib 2.38.2 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/glib] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of glib 2.38.2:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-silent-rules less verbose build output (undo: "make V=1") --disable-silent-rules verbose build output (undo: "make V=0") --disable-maintainer-mode disable make rules and dependencies not useful (and sometimes confusing) to the casual installer --enable-dependency-tracking do not reject slow dependency extractors --disable-dependency-tracking speeds up one-time build --enable-debug=[no/minimum/yes] turn on debugging [default=minimum] --enable-gc-friendly turn on garbage collector friendliness [default=no] --disable-mem-pools disable all glib memory pools --disable-rebuilds disable all source autogeneration rules --enable-installed-tests Enable installation of some test cases --enable-always-build-tests Enable always building tests during 'make all' --disable-largefile omit support for large files --enable-static[=PKGS] build static libraries [default=no] --enable-shared[=PKGS] build shared libraries [default=yes] --enable-fast-install[=PKGS] optimize for fast installation [default=yes] --disable-libtool-lock avoid locking (might break parallel builds) --enable-included-printf use included printf [default=auto] --enable-gcov enable coverage testing with gcov --disable-Bsymbolic avoid linking with -Bsymbolic --disable-compile-warnings Don't use builtin compiler warnings Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-runtime-libdir=RELPATH install runtime libraries relative to libdir --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" --with-libiconv=[no/gnu/native] use the libiconv library --with-pic[=PKGS] try to use only PIC/non-PIC objects [default=use both] --with-aix-soname=aix|svr4|both shared library versioning (aka "SONAME") variant to provide on AIX, [default=aix]. --with-gnu-ld assume the C compiler uses GNU ld [default=no] --with-sysroot[=DIR] Search for dependent libraries within DIR (or the compiler's sysroot if not specified). --with-gio-module-dir=DIR load gio modules from this directory [LIBDIR/gio/modules] --with-threads=[posix/win32] specify a thread implementation to use Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor CXX C++ compiler command CXXFLAGS C++ compiler flags PYTHON the Python interpreter LT_SYS_LIBRARY_PATH User-defined run-time library search path. CXXCPP C++ preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF glib configure 2.38.2 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ( $as_echo "## ------------------------------------------------------------------- ## ## Report this to http://bugzilla.gnome.org/enter_bug.cgi?product=glib ## ## ------------------------------------------------------------------- ##" ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_cxx_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func # ac_fn_cxx_try_cpp LINENO # ------------------------ # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_cpp # ac_fn_cxx_try_link LINENO # ------------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_link # ac_fn_c_check_type LINENO TYPE VAR INCLUDES # ------------------------------------------- # Tests whether TYPE exists after having included INCLUDES, setting cache # variable VAR accordingly. ac_fn_c_check_type () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof ($2)) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof (($2))) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else eval "$3=yes" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_type # ac_fn_c_compute_int LINENO EXPR VAR INCLUDES # -------------------------------------------- # Tries to find the compile-time value of EXPR in a program that includes # INCLUDES, setting VAR accordingly. Returns whether the value could be # computed ac_fn_c_compute_int () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if test "$cross_compiling" = yes; then # Depending upon the size, compute the lo and hi bounds. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) >= 0)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_lo=0 ac_mid=0 while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) <= $ac_mid)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_hi=$ac_mid; break else as_fn_arith $ac_mid + 1 && ac_lo=$as_val if test $ac_lo -le $ac_mid; then ac_lo= ac_hi= break fi as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) < 0)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_hi=-1 ac_mid=-1 while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) >= $ac_mid)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_lo=$ac_mid; break else as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val if test $ac_mid -le $ac_hi; then ac_lo= ac_hi= break fi as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done else ac_lo= ac_hi= fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext # Binary search between lo and hi bounds. while test "x$ac_lo" != "x$ac_hi"; do as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) <= $ac_mid)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_hi=$ac_mid else as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done case $ac_lo in #(( ?*) eval "$3=\$ac_lo"; ac_retval=0 ;; '') ac_retval=1 ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 static long int longval () { return $2; } static unsigned long int ulongval () { return $2; } #include #include int main () { FILE *f = fopen ("conftest.val", "w"); if (! f) return 1; if (($2) < 0) { long int i = longval (); if (i != ($2)) return 1; fprintf (f, "%ld", i); } else { unsigned long int i = ulongval (); if (i != ($2)) return 1; fprintf (f, "%lu", i); } /* Do not output a trailing newline, as this causes \r\n confusion on some platforms. */ return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : echo >>conftest.val; read $3 &5 $as_echo_n "checking for $2.$3... " >&6; } if eval \${$4+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int main () { static $2 ac_aggr; if (ac_aggr.$3) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$4=yes" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int main () { static $2 ac_aggr; if (sizeof ac_aggr.$3) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$4=yes" else eval "$4=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$4 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_member cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by glib $as_me 2.38.2, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_config_headers="$ac_config_headers config.h" # Save this value here, since automake will set cflags later cflags_set=${CFLAGS+set} am__api_version='1.15' ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi if test "$2" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi rm -f conftest.file test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # Expand $ac_aux_dir to an absolute path. am_aux_dir=`cd "$ac_aux_dir" && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null # Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi case $enable_silent_rules in # ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=1;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 $as_echo_n "checking whether $am_make supports nested variables... " >&6; } if ${am_cv_make_support_nested_variables+:} false; then : $as_echo_n "(cached) " >&6 else if $as_echo 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 $as_echo "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='glib' VERSION='2.38.2' # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # mkdir_p='$(MKDIR_P)' # We need awk for the "check" target (and possibly the TAP driver). The # system "awk" is bad on some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar plaintar pax cpio none' # The POSIX 1988 'ustar' format is defined with fixed-size fields. # There is notably a 21 bits limit for the UID and the GID. In fact, # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 # and bug#13588). am_max_uid=2097151 # 2^21 - 1 am_max_gid=$am_max_uid # The $UID and $GID variables are not portable, so we need to resort # to the POSIX-mandated id(1) utility. Errors in the 'id' calls # below are definitely unexpected, so allow the users to see them # (that is, avoid stderr redirection). am_uid=`id -u || echo unknown` am_gid=`id -g || echo unknown` { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether UID '$am_uid' is supported by ustar format" >&5 $as_echo_n "checking whether UID '$am_uid' is supported by ustar format... " >&6; } if test $am_uid -le $am_max_uid; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } _am_tools=none fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether GID '$am_gid' is supported by ustar format" >&5 $as_echo_n "checking whether GID '$am_gid' is supported by ustar format... " >&6; } if test $am_gid -le $am_max_gid; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } _am_tools=none fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to create a ustar tar archive" >&5 $as_echo_n "checking how to create a ustar tar archive... " >&6; } # Go ahead even if we have the value already cached. We do so because we # need to set the values for the 'am__tar' and 'am__untar' variables. _am_tools=${am_cv_prog_tar_ustar-$_am_tools} for _am_tool in $_am_tools; do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do { echo "$as_me:$LINENO: $_am_tar --version" >&5 ($_am_tar --version) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && break done am__tar="$_am_tar --format=ustar -chf - "'"$$tardir"' am__tar_="$_am_tar --format=ustar -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x ustar -w "$$tardir"' am__tar_='pax -L -x ustar -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H ustar -L' am__tar_='find "$tardir" -print | cpio -o -H ustar -L' am__untar='cpio -i -H ustar -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_ustar}" && break # tar/untar a dummy directory, and stop if the command works. rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file { echo "$as_me:$LINENO: tardir=conftest.dir && eval $am__tar_ >conftest.tar" >&5 (tardir=conftest.dir && eval $am__tar_ >conftest.tar) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } rm -rf conftest.dir if test -s conftest.tar; then { echo "$as_me:$LINENO: $am__untar &5 ($am__untar &5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { echo "$as_me:$LINENO: cat conftest.dir/file" >&5 (cat conftest.dir/file) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } grep GrepMe conftest.dir/file >/dev/null 2>&1 && break fi done rm -rf conftest.dir if ${am_cv_prog_tar_ustar+:} false; then : $as_echo_n "(cached) " >&6 else am_cv_prog_tar_ustar=$_am_tool fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_tar_ustar" >&5 $as_echo "$am_cv_prog_tar_ustar" >&6; } # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5 $as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; } # Check whether --enable-maintainer-mode was given. if test "${enable_maintainer_mode+set}" = set; then : enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval else USE_MAINTAINER_MODE=yes fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5 $as_echo "$USE_MAINTAINER_MODE" >&6; } if test $USE_MAINTAINER_MODE = yes; then MAINTAINER_MODE_TRUE= MAINTAINER_MODE_FALSE='#' else MAINTAINER_MODE_TRUE='#' MAINTAINER_MODE_FALSE= fi MAINT=$MAINTAINER_MODE_TRUE # Support silent build rules. Disable # by either passing --disable-silent-rules to configure or passing V=1 # to make # Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi case $enable_silent_rules in # ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=0;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 $as_echo_n "checking whether $am_make supports nested variables... " >&6; } if ${am_cv_make_support_nested_variables+:} false; then : $as_echo_n "(cached) " >&6 else if $as_echo 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 $as_echo "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' GLIB_MAJOR_VERSION=2 GLIB_MINOR_VERSION=38 GLIB_MICRO_VERSION=2 GLIB_INTERFACE_AGE=2 GLIB_BINARY_AGE=3802 GLIB_VERSION=2.38.2 $as_echo "#define GLIB_MAJOR_VERSION 2" >>confdefs.h $as_echo "#define GLIB_MINOR_VERSION 38" >>confdefs.h $as_echo "#define GLIB_MICRO_VERSION 2" >>confdefs.h $as_echo "#define GLIB_INTERFACE_AGE 2" >>confdefs.h $as_echo "#define GLIB_BINARY_AGE 3802" >>confdefs.h # libtool versioning LT_RELEASE=2.38 LT_CURRENT=3800 LT_REVISION=2 LT_AGE=3800 LT_CURRENT_MINUS_AGE=0 ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 $as_echo_n "checking whether $CC understands -c and -o together... " >&6; } if ${am_cv_prog_cc_c_o+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 $as_echo "$am_cv_prog_cc_c_o" >&6; } if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf # Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done ac_fn_c_check_header_mongrel "$LINENO" "minix/config.h" "ac_cv_header_minix_config_h" "$ac_includes_default" if test "x$ac_cv_header_minix_config_h" = xyes; then : MINIX=yes else MINIX= fi if test "$MINIX" = yes; then $as_echo "#define _POSIX_SOURCE 1" >>confdefs.h $as_echo "#define _POSIX_1_SOURCE 2" >>confdefs.h $as_echo "#define _MINIX 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether it is safe to define __EXTENSIONS__" >&5 $as_echo_n "checking whether it is safe to define __EXTENSIONS__... " >&6; } if ${ac_cv_safe_to_define___extensions__+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ # define __EXTENSIONS__ 1 $ac_includes_default int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_safe_to_define___extensions__=yes else ac_cv_safe_to_define___extensions__=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_safe_to_define___extensions__" >&5 $as_echo "$ac_cv_safe_to_define___extensions__" >&6; } test $ac_cv_safe_to_define___extensions__ = yes && $as_echo "#define __EXTENSIONS__ 1" >>confdefs.h $as_echo "#define _ALL_SOURCE 1" >>confdefs.h $as_echo "#define _GNU_SOURCE 1" >>confdefs.h $as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h $as_echo "#define _TANDEM_SOURCE 1" >>confdefs.h if test "$GCC" = "yes"; then HAVE_GCC_TRUE= HAVE_GCC_FALSE='#' else HAVE_GCC_TRUE='#' HAVE_GCC_FALSE= fi # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the BeOS" >&5 $as_echo_n "checking for the BeOS... " >&6; } case $host in *-*-beos*) glib_native_beos="yes" ;; *) glib_native_beos="no" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glib_native_beos" >&5 $as_echo "$glib_native_beos" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Win32" >&5 $as_echo_n "checking for Win32... " >&6; } LIB_EXE_MACHINE_FLAG=X86 case "$host" in *-*-mingw*) glib_native_win32=yes glib_pid_type='void *' glib_cv_stack_grows=no # Unfortunately the mingw implementations of C99-style snprintf and vsnprintf # don't seem to be quite good enough, at least not in mingw-runtime-3.14. # (Sorry, I don't know exactly what is the problem, but it is related to # floating point formatting and decimal point vs. comma.) # The simple tests in AC_FUNC_VSNPRINTF_C99 and AC_FUNC_SNPRINTF_C99 aren't # rigorous enough to notice, though. # So preset the autoconf cache variables. ac_cv_func_vsnprintf_c99=no ac_cv_func_snprintf_c99=no case "$host" in x86_64-*-*) LIB_EXE_MACHINE_FLAG=X64 ;; esac $as_echo "#define _WIN32_WINNT 0x0501" >>confdefs.h ;; *) glib_native_win32=no glib_pid_type=int ;; esac case $host in *-*-linux*) glib_os_linux=yes ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glib_native_win32" >&5 $as_echo "$glib_native_win32" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the Android" >&5 $as_echo_n "checking for the Android... " >&6; } case $host in *android*) glib_native_android="yes" ;; *) glib_native_android="no" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glib_native_android" >&5 $as_echo "$glib_native_android" >&6; } glib_have_carbon=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Mac OS X Carbon support" >&5 $as_echo_n "checking for Mac OS X Carbon support... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : glib_have_carbon=yes fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glib_have_carbon" >&5 $as_echo "$glib_have_carbon" >&6; } glib_have_cocoa=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Mac OS X Cocoa support" >&5 $as_echo_n "checking for Mac OS X Cocoa support... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef GNUSTEP_BASE_VERSION #error "Detected GNUstep, not Cocoa" #endif _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : glib_have_cocoa=yes fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glib_have_cocoa" >&5 $as_echo "$glib_have_cocoa" >&6; } if test "$glib_native_win32" = "yes"; then OS_WIN32_TRUE= OS_WIN32_FALSE='#' else OS_WIN32_TRUE='#' OS_WIN32_FALSE= fi if test "$LIB_EXE_MACHINE_FLAG" = "X64"; then OS_WIN32_X64_TRUE= OS_WIN32_X64_FALSE='#' else OS_WIN32_X64_TRUE='#' OS_WIN32_X64_FALSE= fi if test "$glib_native_win32" != "yes"; then OS_UNIX_TRUE= OS_UNIX_FALSE='#' else OS_UNIX_TRUE='#' OS_UNIX_FALSE= fi if test "$glib_os_linux" = "yes"; then OS_LINUX_TRUE= OS_LINUX_FALSE='#' else OS_LINUX_TRUE='#' OS_LINUX_FALSE= fi if test "$glib_have_carbon" = "yes"; then OS_CARBON_TRUE= OS_CARBON_FALSE='#' else OS_CARBON_TRUE='#' OS_CARBON_FALSE= fi if test "$glib_have_cocoa" = "yes"; then OS_COCOA_TRUE= OS_COCOA_FALSE='#' else OS_COCOA_TRUE='#' OS_COCOA_FALSE= fi if test "$glib_native_win32" = "yes"; then : if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}windres", so it can be a program name with args. set dummy ${ac_tool_prefix}windres; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_WINDRES+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$WINDRES"; then ac_cv_prog_WINDRES="$WINDRES" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_WINDRES="${ac_tool_prefix}windres" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi WINDRES=$ac_cv_prog_WINDRES if test -n "$WINDRES"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $WINDRES" >&5 $as_echo "$WINDRES" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_WINDRES"; then ac_ct_WINDRES=$WINDRES # Extract the first word of "windres", so it can be a program name with args. set dummy windres; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_WINDRES+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_WINDRES"; then ac_cv_prog_ac_ct_WINDRES="$ac_ct_WINDRES" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_WINDRES="windres" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_WINDRES=$ac_cv_prog_ac_ct_WINDRES if test -n "$ac_ct_WINDRES"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_WINDRES" >&5 $as_echo "$ac_ct_WINDRES" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_WINDRES" = x; then WINDRES="no" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac WINDRES=$ac_ct_WINDRES fi else WINDRES="$ac_cv_prog_WINDRES" fi if test "$WINDRES" = no; then as_fn_error $? "*** Could not find an implementation of windres in your PATH." "$LINENO" 5 fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}nm", so it can be a program name with args. set dummy ${ac_tool_prefix}nm; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_NM+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NM"; then ac_cv_prog_NM="$NM" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_NM="${ac_tool_prefix}nm" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi NM=$ac_cv_prog_NM if test -n "$NM"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NM" >&5 $as_echo "$NM" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_NM"; then ac_ct_NM=$NM # Extract the first word of "nm", so it can be a program name with args. set dummy nm; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_NM+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_NM"; then ac_cv_prog_ac_ct_NM="$ac_ct_NM" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_NM="nm" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_NM=$ac_cv_prog_ac_ct_NM if test -n "$ac_ct_NM"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NM" >&5 $as_echo "$ac_ct_NM" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_NM" = x; then NM="no" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac NM=$ac_ct_NM fi else NM="$ac_cv_prog_NM" fi if test "$NM" = no; then as_fn_error $? "*** Could not find an implementation of nm in your PATH." "$LINENO" 5 fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. set dummy ${ac_tool_prefix}dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DLLTOOL"; then ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DLLTOOL=$ac_cv_prog_DLLTOOL if test -n "$DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 $as_echo "$DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DLLTOOL"; then ac_ct_DLLTOOL=$DLLTOOL # Extract the first word of "dlltool", so it can be a program name with args. set dummy dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DLLTOOL"; then ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DLLTOOL="dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL if test -n "$ac_ct_DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 $as_echo "$ac_ct_DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DLLTOOL" = x; then DLLTOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DLLTOOL=$ac_ct_DLLTOOL fi else DLLTOOL="$ac_cv_prog_DLLTOOL" fi # Extract the first word of "lib.exe", so it can be a program name with args. set dummy lib.exe; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ms_librarian+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ms_librarian"; then ac_cv_prog_ms_librarian="$ms_librarian" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ms_librarian="yes" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_ms_librarian" && ac_cv_prog_ms_librarian="no" fi fi ms_librarian=$ac_cv_prog_ms_librarian if test -n "$ms_librarian"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ms_librarian" >&5 $as_echo "$ms_librarian" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test x$ms_librarian = xyes; then MS_LIB_AVAILABLE_TRUE= MS_LIB_AVAILABLE_FALSE='#' else MS_LIB_AVAILABLE_TRUE='#' MS_LIB_AVAILABLE_FALSE= fi if test "x$glib_have_carbon" = "xyes"; then : $as_echo "#define HAVE_CARBON 1" >>confdefs.h LDFLAGS="$LDFLAGS -framework Carbon" fi if test "x$glib_have_cocoa" = "xyes"; then $as_echo "#define HAVE_COCOA 1" >>confdefs.h LDFLAGS="$LDFLAGS -framework Foundation" fi # Check whether --enable-debug was given. if test "${enable_debug+set}" = set; then : enableval=$enable_debug; else enable_debug=minimum fi # Check whether --enable-gc_friendly was given. if test "${enable_gc_friendly+set}" = set; then : enableval=$enable_gc_friendly; else enable_gc_friendly=no fi # Check whether --enable-mem_pools was given. if test "${enable_mem_pools+set}" = set; then : enableval=$enable_mem_pools; else disable_mem_pools=no fi # Check whether --enable-rebuilds was given. if test "${enable_rebuilds+set}" = set; then : enableval=$enable_rebuilds; else enable_rebuilds=yes fi # Check whether --enable-installed-tests was given. if test "${enable_installed_tests+set}" = set; then : enableval=$enable_installed_tests; case ${enableval} in yes) ENABLE_INSTALLED_TESTS="1" ;; no) ENABLE_INSTALLED_TESTS="" ;; *) as_fn_error $? "bad value ${enableval} for --enable-installed-tests" "$LINENO" 5 ;; esac fi if test "$ENABLE_INSTALLED_TESTS" = "1"; then ENABLE_INSTALLED_TESTS_TRUE= ENABLE_INSTALLED_TESTS_FALSE='#' else ENABLE_INSTALLED_TESTS_TRUE='#' ENABLE_INSTALLED_TESTS_FALSE= fi # Check whether --enable-always-build-tests was given. if test "${enable_always_build_tests+set}" = set; then : enableval=$enable_always_build_tests; case ${enableval} in yes) ENABLE_ALWAYS_BUILD_TESTS="1" ;; no) ENABLE_ALWAYS_BUILD_TESTS="" ;; *) as_fn_error $? "bad value ${enableval} for --enable-always-build-tests" "$LINENO" 5 ;; esac fi if test "$ENABLE_ALWAYS_BUILD_TESTS" = "1"; then ENABLE_ALWAYS_BUILD_TESTS_TRUE= ENABLE_ALWAYS_BUILD_TESTS_FALSE='#' else ENABLE_ALWAYS_BUILD_TESTS_TRUE='#' ENABLE_ALWAYS_BUILD_TESTS_FALSE= fi if test "$ENABLE_INSTALLED_TESTS" == "1"; then installed_test_metadir=${datadir}/installed-tests/glib installed_testdir=${libexecdir}/installed-tests/glib fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable garbage collector friendliness" >&5 $as_echo_n "checking whether to enable garbage collector friendliness... " >&6; } if test "x$enable_gc_friendly" = "xyes"; then : $as_echo "#define ENABLE_GC_FRIENDLY_DEFAULT 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to disable memory pools" >&5 $as_echo_n "checking whether to disable memory pools... " >&6; } if test "x$disable_mem_pools" = "xno"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } else $as_echo "#define DISABLE_MEM_POOLS 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi # Check whether --with-runtime-libdir was given. if test "${with_runtime_libdir+set}" = set; then : withval=$with_runtime_libdir; else with_runtime_libdir="" fi GLIB_RUNTIME_LIBDIR="$with_runtime_libdir" ABS_GLIB_RUNTIME_LIBDIR="`readlink -f $libdir/$with_runtime_libdir`" if test "x$with_runtime_libdir" != "x"; then HAVE_GLIB_RUNTIME_LIBDIR_TRUE= HAVE_GLIB_RUNTIME_LIBDIR_FALSE='#' else HAVE_GLIB_RUNTIME_LIBDIR_TRUE='#' HAVE_GLIB_RUNTIME_LIBDIR_FALSE= fi if test -n "$ac_tool_prefix"; then for ac_prog in $CCC c++ g++ gcc CC cxx cc++ cl do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in $CCC c++ g++ gcc CC cxx cc++ cl do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="gcc" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if ${ac_cv_cxx_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if ${ac_cv_prog_cxx_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu depcc="$CXX" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CXX_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CXX_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CXX_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CXX_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 $as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then am__fastdepCXX_TRUE= am__fastdepCXX_FALSE='#' else am__fastdepCXX_TRUE='#' am__fastdepCXX_FALSE= fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { class a { int b; } c; ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else CXX= fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test "$CXX" != ""; then HAVE_CXX_TRUE= HAVE_CXX_FALSE='#' else HAVE_CXX_TRUE='#' HAVE_CXX_FALSE= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Check whether --enable-largefile was given. if test "${enable_largefile+set}" = set; then : enableval=$enable_largefile; fi if test "$enable_largefile" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for special C compiler options needed for large files" >&5 $as_echo_n "checking for special C compiler options needed for large files... " >&6; } if ${ac_cv_sys_largefile_CC+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_sys_largefile_CC=no if test "$GCC" != yes; then ac_save_CC=$CC while :; do # IRIX 6.2 and later do not support large files by default, # so use the C compiler's -n32 option if that helps. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : break fi rm -f core conftest.err conftest.$ac_objext CC="$CC -n32" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_largefile_CC=' -n32'; break fi rm -f core conftest.err conftest.$ac_objext break done CC=$ac_save_CC rm -f conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_CC" >&5 $as_echo "$ac_cv_sys_largefile_CC" >&6; } if test "$ac_cv_sys_largefile_CC" != no; then CC=$CC$ac_cv_sys_largefile_CC fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _FILE_OFFSET_BITS value needed for large files" >&5 $as_echo_n "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; } if ${ac_cv_sys_file_offset_bits+:} false; then : $as_echo_n "(cached) " >&6 else while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_file_offset_bits=no; break fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _FILE_OFFSET_BITS 64 #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_file_offset_bits=64; break fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_sys_file_offset_bits=unknown break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_file_offset_bits" >&5 $as_echo "$ac_cv_sys_file_offset_bits" >&6; } case $ac_cv_sys_file_offset_bits in #( no | unknown) ;; *) cat >>confdefs.h <<_ACEOF #define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits _ACEOF ;; esac rm -rf conftest* if test $ac_cv_sys_file_offset_bits = unknown; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGE_FILES value needed for large files" >&5 $as_echo_n "checking for _LARGE_FILES value needed for large files... " >&6; } if ${ac_cv_sys_large_files+:} false; then : $as_echo_n "(cached) " >&6 else while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_large_files=no; break fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _LARGE_FILES 1 #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_large_files=1; break fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_sys_large_files=unknown break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_large_files" >&5 $as_echo "$ac_cv_sys_large_files" >&6; } case $ac_cv_sys_large_files in #( no | unknown) ;; *) cat >>confdefs.h <<_ACEOF #define _LARGE_FILES $ac_cv_sys_large_files _ACEOF ;; esac rm -rf conftest* fi fi if test "x$enable_debug" = "xyes"; then if test x$cflags_set != xset ; then case " $CFLAGS " in *[\ \ ]-g[\ \ ]*) ;; *) CFLAGS="$CFLAGS -g" ;; esac fi GLIB_DEBUG_FLAGS="-DG_ENABLE_DEBUG" else GLIB_DEBUG_FLAGS="-DG_DISABLE_CAST_CHECKS" if test "x$enable_debug" = "xno"; then GLIB_DEBUG_FLAGS="$GLIB_DEBUG_FLAGS -DG_DISABLE_ASSERT -DG_DISABLE_CHECKS" fi fi # Ensure MSVC-compatible struct packing convention is used when # compiling for Win32 with gcc. # What flag to depends on gcc version: gcc3 uses "-mms-bitfields", while # gcc2 uses "-fnative-struct". if test x"$glib_native_win32" = xyes; then if test x"$GCC" = xyes; then msnative_struct='' { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to get MSVC-compatible struct packing" >&5 $as_echo_n "checking how to get MSVC-compatible struct packing... " >&6; } if test -z "$ac_cv_prog_CC"; then our_gcc="$CC" else our_gcc="$ac_cv_prog_CC" fi case `$our_gcc --version | sed -e 's,\..*,.,' -e q` in 2.) if $our_gcc -v --help 2>/dev/null | grep fnative-struct >/dev/null; then msnative_struct='-fnative-struct' fi ;; *) if $our_gcc -v --help 2>/dev/null | grep ms-bitfields >/dev/null; then msnative_struct='-mms-bitfields' fi ;; esac if test x"$msnative_struct" = x ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no way" >&5 $as_echo "no way" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: produced libraries might be incompatible with MSVC-compiled code" >&5 $as_echo "$as_me: WARNING: produced libraries might be incompatible with MSVC-compiled code" >&2;} else CFLAGS="$CFLAGS $msnative_struct" { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${msnative_struct}" >&5 $as_echo "${msnative_struct}" >&6; } fi fi fi GLIB_EXTRA_CFLAGS="${msnative_struct}" # define a MAINT-like variable REBUILD which is set if Perl # and awk are found, so autogenerated sources can be rebuilt for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done for ac_prog in perl5 perl do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_PERL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$PERL"; then ac_cv_prog_PERL="$PERL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_PERL="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi PERL=$ac_cv_prog_PERL if test -n "$PERL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PERL" >&5 $as_echo "$PERL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$PERL" && break done # We would like indent, but don't require it. # Extract the first word of "indent", so it can be a program name with args. set dummy indent; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_INDENT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$INDENT"; then ac_cv_prog_INDENT="$INDENT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_INDENT="indent" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi INDENT=$ac_cv_prog_INDENT if test -n "$INDENT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INDENT" >&5 $as_echo "$INDENT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi REBUILD=\# if test "x$enable_rebuilds" = "xyes" && \ test -n "$PERL" && \ $PERL -e 'exit !($] >= 5.002)' > /dev/null 2>&1 && \ test -n "$AWK" ; then REBUILD= fi # Need full path to Perl for glib-mkenums # if test "x$PERL" != x ; then # Extract the first word of "$PERL", so it can be a program name with args. set dummy $PERL; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PERL_PATH+:} false; then : $as_echo_n "(cached) " >&6 else case $PERL_PATH in [\\/]* | ?:[\\/]*) ac_cv_path_PERL_PATH="$PERL_PATH" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PERL_PATH="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PERL_PATH=$ac_cv_path_PERL_PATH if test -n "$PERL_PATH"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PERL_PATH" >&5 $as_echo "$PERL_PATH" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test "x$PERL_PATH" = x ; then PERL_PATH="/usr/bin/env perl" fi # 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 # Check whether --with-python was given. if test "${with_python+set}" = set; then : withval=$with_python; PYTHON="$withval" fi if test x"$PYTHON" = xyes; then as_fn_error $? "--with-python option requires a path or program argument" "$LINENO" 5 fi if test -n "$PYTHON"; then # If the user set $PYTHON, use it and don't search something else. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $PYTHON version is >= 2.5" >&5 $as_echo_n "checking whether $PYTHON version is >= 2.5... " >&6; } prog="import sys # split strings by '.' and convert to numeric. Append some zeros # because we need at least 4 digits for the hex conversion. # map returns an iterator in Python 3.0 and a list in 2.x minver = list(map(int, '2.5'.split('.'))) + [0, 0, 0] minverhex = 0 # xrange is not present in Python 3.0 and range returns an iterator for i in list(range(0, 4)): minverhex = (minverhex << 8) + minver[i] sys.exit(sys.hexversion < minverhex)" if { echo "$as_me:$LINENO: $PYTHON -c "$prog"" >&5 ($PYTHON -c "$prog") >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } as_fn_error $? "Python interpreter is too old" "$LINENO" 5 fi am_display_PYTHON=$PYTHON else # Otherwise, try each interpreter until we find one that satisfies # VERSION. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a Python interpreter with version >= 2.5" >&5 $as_echo_n "checking for a Python interpreter with version >= 2.5... " >&6; } if ${am_cv_pathless_PYTHON+:} false; then : $as_echo_n "(cached) " >&6 else for am_cv_pathless_PYTHON in python python2 python3 python3.3 python3.2 python3.1 python3.0 python2.7 python2.6 python2.5 python2.4 python2.3 python2.2 python2.1 python2.0 none; do test "$am_cv_pathless_PYTHON" = none && break prog="import sys # split strings by '.' and convert to numeric. Append some zeros # because we need at least 4 digits for the hex conversion. # map returns an iterator in Python 3.0 and a list in 2.x minver = list(map(int, '2.5'.split('.'))) + [0, 0, 0] minverhex = 0 # xrange is not present in Python 3.0 and range returns an iterator for i in list(range(0, 4)): minverhex = (minverhex << 8) + minver[i] sys.exit(sys.hexversion < minverhex)" if { echo "$as_me:$LINENO: $am_cv_pathless_PYTHON -c "$prog"" >&5 ($am_cv_pathless_PYTHON -c "$prog") >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then : break fi done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_pathless_PYTHON" >&5 $as_echo "$am_cv_pathless_PYTHON" >&6; } # Set $PYTHON to the absolute path of $am_cv_pathless_PYTHON. if test "$am_cv_pathless_PYTHON" = none; then PYTHON=: else # Extract the first word of "$am_cv_pathless_PYTHON", so it can be a program name with args. set dummy $am_cv_pathless_PYTHON; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PYTHON+:} false; then : $as_echo_n "(cached) " >&6 else case $PYTHON in [\\/]* | ?:[\\/]*) ac_cv_path_PYTHON="$PYTHON" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PYTHON="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PYTHON=$ac_cv_path_PYTHON if test -n "$PYTHON"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON" >&5 $as_echo "$PYTHON" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi am_display_PYTHON=$am_cv_pathless_PYTHON fi if test "$PYTHON" = :; then PYTHON="/usr/bin/env python2.5" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON version" >&5 $as_echo_n "checking for $am_display_PYTHON version... " >&6; } if ${am_cv_python_version+:} false; then : $as_echo_n "(cached) " >&6 else am_cv_python_version=`$PYTHON -c "import sys; sys.stdout.write(sys.version[:3])"` fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_version" >&5 $as_echo "$am_cv_python_version" >&6; } PYTHON_VERSION=$am_cv_python_version PYTHON_PREFIX='${prefix}' PYTHON_EXEC_PREFIX='${exec_prefix}' { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON platform" >&5 $as_echo_n "checking for $am_display_PYTHON platform... " >&6; } if ${am_cv_python_platform+:} false; then : $as_echo_n "(cached) " >&6 else am_cv_python_platform=`$PYTHON -c "import sys; sys.stdout.write(sys.platform)"` fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_platform" >&5 $as_echo "$am_cv_python_platform" >&6; } PYTHON_PLATFORM=$am_cv_python_platform # Just factor out some code duplication. am_python_setup_sysconfig="\ import sys # Prefer sysconfig over distutils.sysconfig, for better compatibility # with python 3.x. See automake bug#10227. try: import sysconfig except ImportError: can_use_sysconfig = 0 else: can_use_sysconfig = 1 # Can't use sysconfig in CPython 2.7, since it's broken in virtualenvs: # try: from platform import python_implementation if python_implementation() == 'CPython' and sys.version[:3] == '2.7': can_use_sysconfig = 0 except ImportError: pass" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON script directory" >&5 $as_echo_n "checking for $am_display_PYTHON script directory... " >&6; } if ${am_cv_python_pythondir+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$prefix" = xNONE then am_py_prefix=$ac_default_prefix else am_py_prefix=$prefix fi am_cv_python_pythondir=`$PYTHON -c " $am_python_setup_sysconfig if can_use_sysconfig: sitedir = sysconfig.get_path('purelib', vars={'base':'$am_py_prefix'}) else: from distutils import sysconfig sitedir = sysconfig.get_python_lib(0, 0, prefix='$am_py_prefix') sys.stdout.write(sitedir)"` case $am_cv_python_pythondir in $am_py_prefix*) am__strip_prefix=`echo "$am_py_prefix" | sed 's|.|.|g'` am_cv_python_pythondir=`echo "$am_cv_python_pythondir" | sed "s,^$am__strip_prefix,$PYTHON_PREFIX,"` ;; *) case $am_py_prefix in /usr|/System*) ;; *) am_cv_python_pythondir=$PYTHON_PREFIX/lib/python$PYTHON_VERSION/site-packages ;; esac ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_pythondir" >&5 $as_echo "$am_cv_python_pythondir" >&6; } pythondir=$am_cv_python_pythondir pkgpythondir=\${pythondir}/$PACKAGE { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON extension module directory" >&5 $as_echo_n "checking for $am_display_PYTHON extension module directory... " >&6; } if ${am_cv_python_pyexecdir+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$exec_prefix" = xNONE then am_py_exec_prefix=$am_py_prefix else am_py_exec_prefix=$exec_prefix fi am_cv_python_pyexecdir=`$PYTHON -c " $am_python_setup_sysconfig if can_use_sysconfig: sitedir = sysconfig.get_path('platlib', vars={'platbase':'$am_py_prefix'}) else: from distutils import sysconfig sitedir = sysconfig.get_python_lib(1, 0, prefix='$am_py_prefix') sys.stdout.write(sitedir)"` case $am_cv_python_pyexecdir in $am_py_exec_prefix*) am__strip_prefix=`echo "$am_py_exec_prefix" | sed 's|.|.|g'` am_cv_python_pyexecdir=`echo "$am_cv_python_pyexecdir" | sed "s,^$am__strip_prefix,$PYTHON_EXEC_PREFIX,"` ;; *) case $am_py_exec_prefix in /usr|/System*) ;; *) am_cv_python_pyexecdir=$PYTHON_EXEC_PREFIX/lib/python$PYTHON_VERSION/site-packages ;; esac ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_pyexecdir" >&5 $as_echo "$am_cv_python_pyexecdir" >&6; } pyexecdir=$am_cv_python_pyexecdir pkgpyexecdir=\${pyexecdir}/$PACKAGE fi if test x"$glib_native_win32" = xyes; then : with_libiconv=native else # Check whether --with-libiconv was given. if test "${with_libiconv+set}" = set; then : withval=$with_libiconv; else with_libiconv=maybe fi found_iconv=no case $with_libiconv in maybe) # Check in the C library first ac_fn_c_check_func "$LINENO" "iconv_open" "ac_cv_func_iconv_open" if test "x$ac_cv_func_iconv_open" = xyes; then : with_libiconv=no; found_iconv=yes fi # Check if we have GNU libiconv if test $found_iconv = "no"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libiconv_open in -liconv" >&5 $as_echo_n "checking for libiconv_open in -liconv... " >&6; } if ${ac_cv_lib_iconv_libiconv_open+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-liconv $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char libiconv_open (); int main () { return libiconv_open (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_iconv_libiconv_open=yes else ac_cv_lib_iconv_libiconv_open=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_iconv_libiconv_open" >&5 $as_echo "$ac_cv_lib_iconv_libiconv_open" >&6; } if test "x$ac_cv_lib_iconv_libiconv_open" = xyes; then : with_libiconv=gnu; found_iconv=yes fi fi # Check if we have a iconv in -liconv, possibly from vendor if test $found_iconv = "no"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv_open in -liconv" >&5 $as_echo_n "checking for iconv_open in -liconv... " >&6; } if ${ac_cv_lib_iconv_iconv_open+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-liconv $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char iconv_open (); int main () { return iconv_open (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_iconv_iconv_open=yes else ac_cv_lib_iconv_iconv_open=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_iconv_iconv_open" >&5 $as_echo "$ac_cv_lib_iconv_iconv_open" >&6; } if test "x$ac_cv_lib_iconv_iconv_open" = xyes; then : with_libiconv=native; found_iconv=yes fi fi ;; no) ac_fn_c_check_func "$LINENO" "iconv_open" "ac_cv_func_iconv_open" if test "x$ac_cv_func_iconv_open" = xyes; then : with_libiconv=no; found_iconv=yes fi ;; gnu|yes) { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libiconv_open in -liconv" >&5 $as_echo_n "checking for libiconv_open in -liconv... " >&6; } if ${ac_cv_lib_iconv_libiconv_open+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-liconv $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char libiconv_open (); int main () { return libiconv_open (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_iconv_libiconv_open=yes else ac_cv_lib_iconv_libiconv_open=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_iconv_libiconv_open" >&5 $as_echo "$ac_cv_lib_iconv_libiconv_open" >&6; } if test "x$ac_cv_lib_iconv_libiconv_open" = xyes; then : with_libiconv=gnu; found_iconv=yes fi ;; native) { $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv_open in -liconv" >&5 $as_echo_n "checking for iconv_open in -liconv... " >&6; } if ${ac_cv_lib_iconv_iconv_open+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-liconv $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char iconv_open (); int main () { return iconv_open (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_iconv_iconv_open=yes else ac_cv_lib_iconv_iconv_open=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_iconv_iconv_open" >&5 $as_echo "$ac_cv_lib_iconv_iconv_open" >&6; } if test "x$ac_cv_lib_iconv_iconv_open" = xyes; then : with_libiconv=native; found_iconv=yes fi ;; esac if test "x$found_iconv" = "xno" ; then as_fn_error $? "*** No iconv() implementation found in C library or libiconv" "$LINENO" 5 fi fi GETTEXT_PACKAGE=glib20 cat >>confdefs.h <<_ACEOF #define GETTEXT_PACKAGE "$GETTEXT_PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define GLIB_LOCALE_DIR "" _ACEOF if test x"$glib_native_win32" != xyes; then : if test x$with_libiconv != xno ; then case " $INTLLIBS " in *[\ \ ]-liconv[\ \ ]*) ;; *) ICONV_LIBS="-liconv" ;; esac fi fi case $with_libiconv in gnu) $as_echo "#define USE_LIBICONV_GNU 1" >>confdefs.h ;; native) $as_echo "#define USE_LIBICONV_NATIVE 1" >>confdefs.h ;; esac enable_static=yes enable_shared=no case `pwd` in *\ * | *\ *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 $as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; esac macro_version='2.4.6' macro_revision='2.4.6' ltmain=$ac_aux_dir/ltmain.sh # Backslashify metacharacters that are still active within # double-quoted strings. sed_quote_subst='s/\(["`$\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 $as_echo_n "checking how to print strings... " >&6; } # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "" } case $ECHO in printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 $as_echo "printf" >&6; } ;; print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 $as_echo "print -r" >&6; } ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 $as_echo "cat" >&6; } ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 $as_echo_n "checking for a sed that does not truncate output... " >&6; } if ${ac_cv_path_SED+:} false; then : $as_echo_n "(cached) " >&6 else ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for ac_i in 1 2 3 4 5 6 7; do ac_script="$ac_script$as_nl$ac_script" done echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed { ac_script=; unset ac_script;} if test -z "$SED"; then ac_path_SED_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_SED" || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED case `"$ac_path_SED" --version 2>&1` in *GNU*) ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo '' >> "conftest.nl" "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_SED_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_SED="$ac_path_SED" ac_path_SED_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_SED_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_SED"; then as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 fi else ac_cv_path_SED=$SED fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 $as_echo "$ac_cv_path_SED" >&6; } SED="$ac_cv_path_SED" rm -f conftest.sed test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 $as_echo_n "checking for fgrep... " >&6; } if ${ac_cv_path_FGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 then ac_cv_path_FGREP="$GREP -F" else if test -z "$FGREP"; then ac_path_FGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in fgrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_FGREP" || continue # Check for GNU ac_path_FGREP and select it if it is found. # Check for GNU $ac_path_FGREP case `"$ac_path_FGREP" --version 2>&1` in *GNU*) ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'FGREP' >> "conftest.nl" "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_FGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_FGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_FGREP"; then as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_FGREP=$FGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 $as_echo "$ac_cv_path_FGREP" >&6; } FGREP="$ac_cv_path_FGREP" test -z "$GREP" && GREP=grep # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes else with_gnu_ld=no fi ac_prog=ld if test yes = "$GCC"; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 $as_echo_n "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return, which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD=$ac_prog ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test yes = "$with_gnu_ld"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if ${lt_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD=$ac_dir/$ac_prog # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if ${lt_cv_prog_gnu_ld+:} false; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 $as_echo "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld { $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 $as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } if ${lt_cv_path_NM+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM=$NM else lt_nm_to_check=${ac_tool_prefix}nm if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. tmp_nm=$ac_dir/$lt_tmp_nm if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then # Check to see if the nm accepts a BSD-compat flag. # Adding the 'sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty case $build_os in mingw*) lt_bad_file=conftest.nm/nofile ;; *) lt_bad_file=/dev/null ;; esac case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in *$lt_bad_file* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break 2 ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break 2 ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS=$lt_save_ifs done : ${lt_cv_path_NM=no} fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 $as_echo "$lt_cv_path_NM" >&6; } if test no != "$lt_cv_path_NM"; then NM=$lt_cv_path_NM else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else if test -n "$ac_tool_prefix"; then for ac_prog in dumpbin "link -dump" do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DUMPBIN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DUMPBIN"; then ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DUMPBIN=$ac_cv_prog_DUMPBIN if test -n "$DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 $as_echo "$DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$DUMPBIN" && break done fi if test -z "$DUMPBIN"; then ac_ct_DUMPBIN=$DUMPBIN for ac_prog in dumpbin "link -dump" do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DUMPBIN"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN if test -n "$ac_ct_DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 $as_echo "$ac_ct_DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_DUMPBIN" && break done if test "x$ac_ct_DUMPBIN" = x; then DUMPBIN=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DUMPBIN=$ac_ct_DUMPBIN fi fi case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols -headers" ;; *) DUMPBIN=: ;; esac fi if test : != "$DUMPBIN"; then NM=$DUMPBIN fi fi test -z "$NM" && NM=nm { $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 $as_echo_n "checking the name lister ($NM) interface... " >&6; } if ${lt_cv_nm_interface+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: output\"" >&5) cat conftest.out >&5 if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 $as_echo "$lt_cv_nm_interface" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 $as_echo_n "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 $as_echo "no, using $LN_S" >&6; } fi # find the maximum length of command line arguments { $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 $as_echo_n "checking the maximum length of command line arguments... " >&6; } if ${lt_cv_sys_max_cmd_len+:} false; then : $as_echo_n "(cached) " >&6 else i=0 teststring=ABCD case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; os2*) # The test takes a long time on OS/2. lt_cv_sys_max_cmd_len=8192 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len" && \ test undefined != "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test X`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test 17 != "$i" # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac fi if test -n "$lt_cv_sys_max_cmd_len"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 $as_echo "$lt_cv_sys_max_cmd_len" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 $as_echo "none" >&6; } fi max_cmd_len=$lt_cv_sys_max_cmd_len : ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 $as_echo_n "checking how to convert $build file names to $host format... " >&6; } if ${lt_cv_to_host_file_cmd+:} false; then : $as_echo_n "(cached) " >&6 else case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac fi to_host_file_cmd=$lt_cv_to_host_file_cmd { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 $as_echo "$lt_cv_to_host_file_cmd" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 $as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } if ${lt_cv_to_tool_file_cmd+:} false; then : $as_echo_n "(cached) " >&6 else #assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac fi to_tool_file_cmd=$lt_cv_to_tool_file_cmd { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 $as_echo "$lt_cv_to_tool_file_cmd" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 $as_echo_n "checking for $LD option to reload object files... " >&6; } if ${lt_cv_ld_reload_flag+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_reload_flag='-r' fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 $as_echo "$lt_cv_ld_reload_flag" >&6; } reload_flag=$lt_cv_ld_reload_flag case $reload_flag in "" | " "*) ;; *) reload_flag=" $reload_flag" ;; esac reload_cmds='$LD$reload_flag -o $output$reload_objs' case $host_os in cygwin* | mingw* | pw32* | cegcc*) if test yes != "$GCC"; then reload_cmds=false fi ;; darwin*) if test yes = "$GCC"; then reload_cmds='$LTCC $LTCFLAGS -nostdlib $wl-r -o $output$reload_objs' else reload_cmds='$LD$reload_flag -o $output$reload_objs' fi ;; esac if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. set dummy ${ac_tool_prefix}objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OBJDUMP"; then ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OBJDUMP=$ac_cv_prog_OBJDUMP if test -n "$OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 $as_echo "$OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OBJDUMP"; then ac_ct_OBJDUMP=$OBJDUMP # Extract the first word of "objdump", so it can be a program name with args. set dummy objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OBJDUMP"; then ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OBJDUMP="objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP if test -n "$ac_ct_OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 $as_echo "$ac_ct_OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OBJDUMP" = x; then OBJDUMP="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OBJDUMP=$ac_ct_OBJDUMP fi else OBJDUMP="$ac_cv_prog_OBJDUMP" fi test -z "$OBJDUMP" && OBJDUMP=objdump { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 $as_echo_n "checking how to recognize dependent libraries... " >&6; } if ${lt_cv_deplibs_check_method+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_file_magic_cmd='$MAGIC_CMD' lt_cv_file_magic_test_file= lt_cv_deplibs_check_method='unknown' # Need to set the preceding variable on all platforms that support # interlibrary dependencies. # 'none' -- dependencies not supported. # 'unknown' -- same as none, but documents that we really don't know. # 'pass_all' -- all dependencies passed with no checks. # 'test_compile' -- check by making test program. # 'file_magic [[regex]]' -- check by looking for files in library path # that responds to the $file_magic_cmd with a given extended regex. # If you have 'file' or equivalent on your system and you're not sure # whether 'pass_all' will *always* work, you probably want this one. case $host_os in aix[4-9]*) lt_cv_deplibs_check_method=pass_all ;; beos*) lt_cv_deplibs_check_method=pass_all ;; bsdi[45]*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' lt_cv_file_magic_cmd='/usr/bin/file -L' lt_cv_file_magic_test_file=/shlib/libc.so ;; cygwin*) # func_win32_libid is a shell function defined in ltmain.sh lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' ;; mingw* | pw32*) # Base MSYS/MinGW do not provide the 'file' command needed by # func_win32_libid shell function, so use a weaker test based on 'objdump', # unless we find 'file', for example because we are cross-compiling. if ( file / ) >/dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[3-9]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) lt_cv_deplibs_check_method=pass_all ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd* | bitrig*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; os2*) lt_cv_deplibs_check_method=pass_all ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 $as_echo "$lt_cv_deplibs_check_method" >&6; } file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. set dummy ${ac_tool_prefix}dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DLLTOOL"; then ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DLLTOOL=$ac_cv_prog_DLLTOOL if test -n "$DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 $as_echo "$DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DLLTOOL"; then ac_ct_DLLTOOL=$DLLTOOL # Extract the first word of "dlltool", so it can be a program name with args. set dummy dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DLLTOOL"; then ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DLLTOOL="dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL if test -n "$ac_ct_DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 $as_echo "$ac_ct_DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DLLTOOL" = x; then DLLTOOL="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DLLTOOL=$ac_ct_DLLTOOL fi else DLLTOOL="$ac_cv_prog_DLLTOOL" fi test -z "$DLLTOOL" && DLLTOOL=dlltool { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 $as_echo_n "checking how to associate runtime and link libraries... " >&6; } if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh; # decide which one to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd=$ECHO ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 $as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO if test -n "$ac_tool_prefix"; then for ac_prog in ar do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AR="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 $as_echo "$AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AR" && break done fi if test -z "$AR"; then ac_ct_AR=$AR for ac_prog in ar do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AR="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 $as_echo "$ac_ct_AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_AR" && break done if test "x$ac_ct_AR" = x; then AR="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR fi fi : ${AR=ar} : ${AR_FLAGS=cru} { $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 $as_echo_n "checking for archiver @FILE support... " >&6; } if ${lt_cv_ar_at_file+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ar_at_file=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test 0 -eq "$ac_status"; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test 0 -ne "$ac_status"; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 $as_echo "$lt_cv_ar_at_file" >&6; } if test no = "$lt_cv_ar_at_file"; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi test -z "$STRIP" && STRIP=: if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi test -z "$RANLIB" && RANLIB=: # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in bitrig* | openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Check for command to grab the raw symbol name followed by C symbol from nm. { $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 $as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } if ${lt_cv_sys_global_symbol_pipe+:} false; then : $as_echo_n "(cached) " >&6 else # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[BCDEGRST]' # Regexp to match symbols that can be accessed directly from C. sympat='\([_A-Za-z][_A-Za-z0-9]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[BCDT]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[ABCDGISTW]' ;; hpux*) if test ia64 = "$host_cpu"; then symcode='[ABCDEGRST]' fi ;; irix* | nonstopux*) symcode='[BCDEGRST]' ;; osf*) symcode='[BCDEGQRST]' ;; solaris*) symcode='[BDRT]' ;; sco3.2v5*) symcode='[DT]' ;; sysv4.2uw2*) symcode='[DT]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[ABDT]' ;; sysv4) symcode='[DFNSTU]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[ABCDGIRSTW]' ;; esac if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Gets list of data symbols to import. lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'" # Adjust the below global symbol transforms to fixup imported variables. lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'" lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'" lt_c_name_lib_hook="\ -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\ -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'" else # Disable hooks by default. lt_cv_sys_global_symbol_to_import= lt_cdecl_hook= lt_c_name_hook= lt_c_name_lib_hook= fi # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n"\ $lt_cdecl_hook\ " -e 's/^T .* \(.*\)$/extern int \1();/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n"\ $lt_c_name_hook\ " -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'" # Transform an extracted symbol line into symbol name with lib prefix and # symbol address. lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\ $lt_c_name_lib_hook\ " -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ " -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function, # D for any global variable and I for any imported variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK '"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\ " /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\ " /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\ " {split(\$ 0,a,/\||\r/); split(a[2],s)};"\ " s[1]~/^[@?]/{print f,s[1],s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Now try to grab the symbols. nlist=conftest.nm if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5 (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE /* DATA imports from DLLs on WIN32 can't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined __osf__ /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS=conftstm.$ac_objext CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest$ac_exeext; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&5 fi else echo "cannot find nm_test_var in $nlist" >&5 fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 fi else echo "$progname: failed program was:" >&5 cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test yes = "$pipe_works"; then break else lt_cv_sys_global_symbol_pipe= fi done fi if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 $as_echo "failed" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 $as_echo "ok" >&6; } fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then nm_file_list_spec='@' fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 $as_echo_n "checking for sysroot... " >&6; } # Check whether --with-sysroot was given. if test "${with_sysroot+set}" = set; then : withval=$with_sysroot; else with_sysroot=no fi lt_sysroot= case $with_sysroot in #( yes) if test yes = "$GCC"; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_sysroot" >&5 $as_echo "$with_sysroot" >&6; } as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 $as_echo "${lt_sysroot:-no}" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a working dd" >&5 $as_echo_n "checking for a working dd... " >&6; } if ${ac_cv_path_lt_DD+:} false; then : $as_echo_n "(cached) " >&6 else printf 0123456789abcdef0123456789abcdef >conftest.i cat conftest.i conftest.i >conftest2.i : ${lt_DD:=$DD} if test -z "$lt_DD"; then ac_path_lt_DD_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in dd; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_lt_DD="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_lt_DD" || continue if "$ac_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then cmp -s conftest.i conftest.out \ && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=: fi $ac_path_lt_DD_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_lt_DD"; then : fi else ac_cv_path_lt_DD=$lt_DD fi rm -f conftest.i conftest2.i conftest.out fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_lt_DD" >&5 $as_echo "$ac_cv_path_lt_DD" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to truncate binary pipes" >&5 $as_echo_n "checking how to truncate binary pipes... " >&6; } if ${lt_cv_truncate_bin+:} false; then : $as_echo_n "(cached) " >&6 else printf 0123456789abcdef0123456789abcdef >conftest.i cat conftest.i conftest.i >conftest2.i lt_cv_truncate_bin= if "$ac_cv_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then cmp -s conftest.i conftest.out \ && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1" fi rm -f conftest.i conftest2.i conftest.out test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_truncate_bin" >&5 $as_echo "$lt_cv_truncate_bin" >&6; } # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. func_cc_basename () { for cc_temp in $*""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` } # Check whether --enable-libtool-lock was given. if test "${enable_libtool_lock+set}" = set; then : enableval=$enable_libtool_lock; fi test no = "$enable_libtool_lock" || enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out what ABI is being produced by ac_compile, and set mode # options accordingly. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE=32 ;; *ELF-64*) HPUX_IA64_MODE=64 ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. echo '#line '$LINENO' "configure"' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then if test yes = "$lt_cv_prog_gnu_ld"; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; mips64*-*linux*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. echo '#line '$LINENO' "configure"' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then emul=elf case `/usr/bin/file conftest.$ac_objext` in *32-bit*) emul="${emul}32" ;; *64-bit*) emul="${emul}64" ;; esac case `/usr/bin/file conftest.$ac_objext` in *MSB*) emul="${emul}btsmip" ;; *LSB*) emul="${emul}ltsmip" ;; esac case `/usr/bin/file conftest.$ac_objext` in *N32*) emul="${emul}n32" ;; esac LD="${LD-ld} -m $emul" fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. Note that the listed cases only cover the # situations where additional linker options are needed (such as when # doing 32-bit compilation for a host where ld defaults to 64-bit, or # vice versa); the common cases where no linker options are needed do # not appear in the list. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) case `/usr/bin/file conftest.o` in *x86-64*) LD="${LD-ld} -m elf32_x86_64" ;; *) LD="${LD-ld} -m elf_i386" ;; esac ;; powerpc64le-*linux*) LD="${LD-ld} -m elf32lppclinux" ;; powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; powerpcle-*linux*) LD="${LD-ld} -m elf64lppc" ;; powerpc-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS=$CFLAGS CFLAGS="$CFLAGS -belf" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 $as_echo_n "checking whether the C compiler needs -belf... " >&6; } if ${lt_cv_cc_needs_belf+:} false; then : $as_echo_n "(cached) " >&6 else ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_cc_needs_belf=yes else lt_cv_cc_needs_belf=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 $as_echo "$lt_cv_cc_needs_belf" >&6; } if test yes != "$lt_cv_cc_needs_belf"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS=$SAVE_CFLAGS fi ;; *-*solaris*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) case $host in i?86-*-solaris*|x86_64-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) LD="${LD-ld} -m elf64_sparc" ;; esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then LD=${LD-ld}_sol2 fi ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks=$enable_libtool_lock if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. set dummy ${ac_tool_prefix}mt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$MANIFEST_TOOL"; then ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL if test -n "$MANIFEST_TOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 $as_echo "$MANIFEST_TOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_MANIFEST_TOOL"; then ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL # Extract the first word of "mt", so it can be a program name with args. set dummy mt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_MANIFEST_TOOL"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL if test -n "$ac_ct_MANIFEST_TOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 $as_echo "$ac_ct_MANIFEST_TOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_MANIFEST_TOOL" = x; then MANIFEST_TOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL fi else MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" fi test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 $as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } if ${lt_cv_path_mainfest_tool+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&5 if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 $as_echo "$lt_cv_path_mainfest_tool" >&6; } if test yes != "$lt_cv_path_mainfest_tool"; then MANIFEST_TOOL=: fi case $host_os in rhapsody* | darwin*) if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DSYMUTIL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DSYMUTIL"; then ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DSYMUTIL=$ac_cv_prog_DSYMUTIL if test -n "$DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 $as_echo "$DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DSYMUTIL"; then ac_ct_DSYMUTIL=$DSYMUTIL # Extract the first word of "dsymutil", so it can be a program name with args. set dummy dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DSYMUTIL"; then ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL if test -n "$ac_ct_DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 $as_echo "$ac_ct_DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DSYMUTIL" = x; then DSYMUTIL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DSYMUTIL=$ac_ct_DSYMUTIL fi else DSYMUTIL="$ac_cv_prog_DSYMUTIL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. set dummy ${ac_tool_prefix}nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_NMEDIT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NMEDIT"; then ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi NMEDIT=$ac_cv_prog_NMEDIT if test -n "$NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 $as_echo "$NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_NMEDIT"; then ac_ct_NMEDIT=$NMEDIT # Extract the first word of "nmedit", so it can be a program name with args. set dummy nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_NMEDIT"; then ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_NMEDIT="nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT if test -n "$ac_ct_NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 $as_echo "$ac_ct_NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_NMEDIT" = x; then NMEDIT=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac NMEDIT=$ac_ct_NMEDIT fi else NMEDIT="$ac_cv_prog_NMEDIT" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. set dummy ${ac_tool_prefix}lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_LIPO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$LIPO"; then ac_cv_prog_LIPO="$LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_LIPO="${ac_tool_prefix}lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi LIPO=$ac_cv_prog_LIPO if test -n "$LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 $as_echo "$LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_LIPO"; then ac_ct_LIPO=$LIPO # Extract the first word of "lipo", so it can be a program name with args. set dummy lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_LIPO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_LIPO"; then ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_LIPO="lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO if test -n "$ac_ct_LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 $as_echo "$ac_ct_LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_LIPO" = x; then LIPO=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac LIPO=$ac_ct_LIPO fi else LIPO="$ac_cv_prog_LIPO" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. set dummy ${ac_tool_prefix}otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL"; then ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL="${ac_tool_prefix}otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL=$ac_cv_prog_OTOOL if test -n "$OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 $as_echo "$OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL"; then ac_ct_OTOOL=$OTOOL # Extract the first word of "otool", so it can be a program name with args. set dummy otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL"; then ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL="otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL if test -n "$ac_ct_OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 $as_echo "$ac_ct_OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL" = x; then OTOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL=$ac_ct_OTOOL fi else OTOOL="$ac_cv_prog_OTOOL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. set dummy ${ac_tool_prefix}otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OTOOL64+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL64"; then ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL64=$ac_cv_prog_OTOOL64 if test -n "$OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 $as_echo "$OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL64"; then ac_ct_OTOOL64=$OTOOL64 # Extract the first word of "otool64", so it can be a program name with args. set dummy otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL64"; then ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL64="otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 if test -n "$ac_ct_OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 $as_echo "$ac_ct_OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL64" = x; then OTOOL64=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL64=$ac_ct_OTOOL64 fi else OTOOL64="$ac_cv_prog_OTOOL64" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 $as_echo_n "checking for -single_module linker flag... " >&6; } if ${lt_cv_apple_cc_single_mod+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_apple_cc_single_mod=no if test -z "$LT_MULTI_MODULE"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&5 $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? # If there is a non-empty error log, and "single_module" # appears in it, assume the flag caused a linker warning if test -s conftest.err && $GREP single_module conftest.err; then cat conftest.err >&5 # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. elif test -f libconftest.dylib && test 0 = "$_lt_result"; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&5 fi rm -rf libconftest.dylib* rm -f conftest.* fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 $as_echo "$lt_cv_apple_cc_single_mod" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 $as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } if ${lt_cv_ld_exported_symbols_list+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_ld_exported_symbols_list=yes else lt_cv_ld_exported_symbols_list=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 $as_echo "$lt_cv_ld_exported_symbols_list" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 $as_echo_n "checking for -force_load linker flag... " >&6; } if ${lt_cv_ld_force_load+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 echo "$AR cru libconftest.a conftest.o" >&5 $AR cru libconftest.a conftest.o 2>&5 echo "$RANLIB libconftest.a" >&5 $RANLIB libconftest.a 2>&5 cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&5 elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then lt_cv_ld_force_load=yes else cat conftest.err >&5 fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 $as_echo "$lt_cv_ld_force_load" >&6; } case $host_os in rhapsody* | darwin1.[012]) _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[91]*) _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; 10.[012][,.]*) _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test yes = "$lt_cv_apple_cc_single_mod"; then _lt_dar_single_mod='$single_module' fi if test yes = "$lt_cv_ld_exported_symbols_list"; then _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib' fi if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac # func_munge_path_list VARIABLE PATH # ----------------------------------- # VARIABLE is name of variable containing _space_ separated list of # directories to be munged by the contents of PATH, which is string # having a format: # "DIR[:DIR]:" # string "DIR[ DIR]" will be prepended to VARIABLE # ":DIR[:DIR]" # string "DIR[ DIR]" will be appended to VARIABLE # "DIRP[:DIRP]::[DIRA:]DIRA" # string "DIRP[ DIRP]" will be prepended to VARIABLE and string # "DIRA[ DIRA]" will be appended to VARIABLE # "DIR[:DIR]" # VARIABLE will be replaced by "DIR[ DIR]" func_munge_path_list () { case x$2 in x) ;; *:) eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\" ;; x:*) eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\" ;; *::*) eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\" ;; *) eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\" ;; esac } for ac_header in dlfcn.h do : ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default " if test "x$ac_cv_header_dlfcn_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_DLFCN_H 1 _ACEOF fi done func_stripname_cnf () { case $2 in .*) func_stripname_result=`$ECHO "$3" | $SED "s%^$1%%; s%\\\\$2\$%%"`;; *) func_stripname_result=`$ECHO "$3" | $SED "s%^$1%%; s%$2\$%%"`;; esac } # func_stripname_cnf # Set options # Check whether --enable-static was given. if test "${enable_static+set}" = set; then : enableval=$enable_static; p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS=$lt_save_ifs ;; esac else enable_static=no fi enable_win32_dll=yes case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args. set dummy ${ac_tool_prefix}as; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AS+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AS"; then ac_cv_prog_AS="$AS" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AS="${ac_tool_prefix}as" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AS=$ac_cv_prog_AS if test -n "$AS"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AS" >&5 $as_echo "$AS" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_AS"; then ac_ct_AS=$AS # Extract the first word of "as", so it can be a program name with args. set dummy as; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_AS+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AS"; then ac_cv_prog_ac_ct_AS="$ac_ct_AS" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AS="as" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AS=$ac_cv_prog_ac_ct_AS if test -n "$ac_ct_AS"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AS" >&5 $as_echo "$ac_ct_AS" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_AS" = x; then AS="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AS=$ac_ct_AS fi else AS="$ac_cv_prog_AS" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. set dummy ${ac_tool_prefix}dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DLLTOOL"; then ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DLLTOOL=$ac_cv_prog_DLLTOOL if test -n "$DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 $as_echo "$DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DLLTOOL"; then ac_ct_DLLTOOL=$DLLTOOL # Extract the first word of "dlltool", so it can be a program name with args. set dummy dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DLLTOOL"; then ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DLLTOOL="dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL if test -n "$ac_ct_DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 $as_echo "$ac_ct_DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DLLTOOL" = x; then DLLTOOL="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DLLTOOL=$ac_ct_DLLTOOL fi else DLLTOOL="$ac_cv_prog_DLLTOOL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. set dummy ${ac_tool_prefix}objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OBJDUMP"; then ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OBJDUMP=$ac_cv_prog_OBJDUMP if test -n "$OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 $as_echo "$OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OBJDUMP"; then ac_ct_OBJDUMP=$OBJDUMP # Extract the first word of "objdump", so it can be a program name with args. set dummy objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OBJDUMP"; then ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OBJDUMP="objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP if test -n "$ac_ct_OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 $as_echo "$ac_ct_OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OBJDUMP" = x; then OBJDUMP="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OBJDUMP=$ac_ct_OBJDUMP fi else OBJDUMP="$ac_cv_prog_OBJDUMP" fi ;; esac test -z "$AS" && AS=as test -z "$DLLTOOL" && DLLTOOL=dlltool test -z "$OBJDUMP" && OBJDUMP=objdump enable_dlopen=no # Check whether --enable-shared was given. if test "${enable_shared+set}" = set; then : enableval=$enable_shared; p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS=$lt_save_ifs ;; esac else enable_shared=yes fi # Check whether --with-pic was given. if test "${with_pic+set}" = set; then : withval=$with_pic; lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for lt_pkg in $withval; do IFS=$lt_save_ifs if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS=$lt_save_ifs ;; esac else pic_mode=default fi # Check whether --enable-fast-install was given. if test "${enable_fast_install+set}" = set; then : enableval=$enable_fast_install; p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS=$lt_save_ifs ;; esac else enable_fast_install=yes fi shared_archive_member_spec= case $host,$enable_shared in power*-*-aix[5-9]*,yes) { $as_echo "$as_me:${as_lineno-$LINENO}: checking which variant of shared library versioning to provide" >&5 $as_echo_n "checking which variant of shared library versioning to provide... " >&6; } # Check whether --with-aix-soname was given. if test "${with_aix_soname+set}" = set; then : withval=$with_aix_soname; case $withval in aix|svr4|both) ;; *) as_fn_error $? "Unknown argument to --with-aix-soname" "$LINENO" 5 ;; esac lt_cv_with_aix_soname=$with_aix_soname else if ${lt_cv_with_aix_soname+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_with_aix_soname=aix fi with_aix_soname=$lt_cv_with_aix_soname fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_aix_soname" >&5 $as_echo "$with_aix_soname" >&6; } if test aix != "$with_aix_soname"; then # For the AIX way of multilib, we name the shared archive member # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o', # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File. # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag, # the AIX toolchain works better with OBJECT_MODE set (default 32). if test 64 = "${OBJECT_MODE-32}"; then shared_archive_member_spec=shr_64 else shared_archive_member_spec=shr fi fi ;; *) with_aix_soname=aix ;; esac # This can be used to rebuild libtool when needed LIBTOOL_DEPS=$ltmain # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' test -z "$LN_S" && LN_S="ln -s" if test -n "${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 $as_echo_n "checking for objdir... " >&6; } if ${lt_cv_objdir+:} false; then : $as_echo_n "(cached) " >&6 else rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 $as_echo "$lt_cv_objdir" >&6; } objdir=$lt_cv_objdir cat >>confdefs.h <<_ACEOF #define LT_OBJDIR "$lt_cv_objdir/" _ACEOF case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test set != "${COLLECT_NAMES+set}"; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a '.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld=$lt_cv_prog_gnu_ld old_CC=$CC old_CFLAGS=$CFLAGS # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o func_cc_basename $compiler cc_basename=$func_cc_basename_result # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 $as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } if ${lt_cv_path_MAGIC_CMD+:} false; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD=$MAGIC_CMD lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/${ac_tool_prefix}file"; then lt_cv_path_MAGIC_CMD=$ac_dir/"${ac_tool_prefix}file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD=$lt_cv_path_MAGIC_CMD if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS=$lt_save_ifs MAGIC_CMD=$lt_save_MAGIC_CMD ;; esac fi MAGIC_CMD=$lt_cv_path_MAGIC_CMD if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 $as_echo_n "checking for file... " >&6; } if ${lt_cv_path_MAGIC_CMD+:} false; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD=$MAGIC_CMD lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/file"; then lt_cv_path_MAGIC_CMD=$ac_dir/"file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD=$lt_cv_path_MAGIC_CMD if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS=$lt_save_ifs MAGIC_CMD=$lt_save_MAGIC_CMD ;; esac fi MAGIC_CMD=$lt_cv_path_MAGIC_CMD if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi else MAGIC_CMD=: fi fi fi ;; esac # Use C for the default configuration in the libtool script lt_save_CC=$CC ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o objext=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then lt_prog_compiler_no_builtin_flag= if test yes = "$GCC"; then case $cc_basename in nvcc*) lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; *) lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 $as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_rtti_exceptions=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-fno-rtti -fno-exceptions" ## exclude from sc_useless_quotes_in_assignment # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_rtti_exceptions=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 $as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } if test yes = "$lt_cv_prog_compiler_rtti_exceptions"; then lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" else : fi fi lt_prog_compiler_wl= lt_prog_compiler_pic= lt_prog_compiler_static= if test yes = "$GCC"; then lt_prog_compiler_wl='-Wl,' lt_prog_compiler_static='-static' case $host_os in aix*) # All AIX code is PIC. if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' fi lt_prog_compiler_pic='-fPIC' ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the '-m68020' flag to GCC prevents building anything better, # like '-m68040'. lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic='-DDLL_EXPORT' case $host_os in os2*) lt_prog_compiler_static='$wl-static' ;; esac ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. lt_prog_compiler_static= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) lt_prog_compiler_pic='-fPIC' ;; esac ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. lt_prog_compiler_can_build_shared=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic=-Kconform_pic fi ;; *) lt_prog_compiler_pic='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 lt_prog_compiler_wl='-Xlinker ' if test -n "$lt_prog_compiler_pic"; then lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) lt_prog_compiler_wl='-Wl,' if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' else lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' fi ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic='-fno-common' case $cc_basename in nagfor*) # NAG Fortran compiler lt_prog_compiler_wl='-Wl,-Wl,,' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; esac ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic='-DDLL_EXPORT' case $host_os in os2*) lt_prog_compiler_static='$wl-static' ;; esac ;; hpux9* | hpux10* | hpux11*) lt_prog_compiler_wl='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? lt_prog_compiler_static='$wl-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) lt_prog_compiler_wl='-Wl,' # PIC (with -KPIC) is the default. lt_prog_compiler_static='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in # old Intel for x86_64, which still supported -KPIC. ecc*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; # Lahey Fortran 8.1. lf95*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='--shared' lt_prog_compiler_static='--static' ;; nagfor*) # NAG Fortran compiler lt_prog_compiler_wl='-Wl,-Wl,,' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; tcc*) # Fabrice Bellard et al's Tiny C Compiler lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; ccc*) lt_prog_compiler_wl='-Wl,' # All Alpha code is PIC. lt_prog_compiler_static='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-qpic' lt_prog_compiler_static='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='' ;; *Sun\ F* | *Sun*Fortran*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Wl,' ;; *Intel*\ [CF]*Compiler*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; *Portland\ Group*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; esac ;; esac ;; newsos6) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static='-non_shared' ;; rdos*) lt_prog_compiler_static='-non_shared' ;; solaris*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) lt_prog_compiler_wl='-Qoption ld ';; *) lt_prog_compiler_wl='-Wl,';; esac ;; sunos4*) lt_prog_compiler_wl='-Qoption ld ' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic='-Kconform_pic' lt_prog_compiler_static='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; unicos*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_can_build_shared=no ;; uts4*) lt_prog_compiler_pic='-pic' lt_prog_compiler_static='-Bstatic' ;; *) lt_prog_compiler_can_build_shared=no ;; esac fi case $host_os in # For platforms that do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic= ;; *) lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 $as_echo_n "checking for $compiler option to produce PIC... " >&6; } if ${lt_cv_prog_compiler_pic+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic=$lt_prog_compiler_pic fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 $as_echo "$lt_cv_prog_compiler_pic" >&6; } lt_prog_compiler_pic=$lt_cv_prog_compiler_pic # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } if ${lt_cv_prog_compiler_pic_works+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_works=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic -DPIC" ## exclude from sc_useless_quotes_in_assignment # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 $as_echo "$lt_cv_prog_compiler_pic_works" >&6; } if test yes = "$lt_cv_prog_compiler_pic_works"; then case $lt_prog_compiler_pic in "" | " "*) ;; *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; esac else lt_prog_compiler_pic= lt_prog_compiler_can_build_shared=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 $as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if ${lt_cv_prog_compiler_static_works+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_static_works=no save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works=yes fi else lt_cv_prog_compiler_static_works=yes fi fi $RM -r conftest* LDFLAGS=$save_LDFLAGS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 $as_echo "$lt_cv_prog_compiler_static_works" >&6; } if test yes = "$lt_cv_prog_compiler_static_works"; then : else lt_prog_compiler_static= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } hard_links=nottested if test no = "$lt_cv_prog_compiler_c_o" && test no != "$need_locks"; then # do not overwrite the value of need_locks provided by the user { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 $as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 $as_echo "$hard_links" >&6; } if test no = "$hard_links"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5 $as_echo "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } runpath_var= allow_undefined_flag= always_export_symbols=no archive_cmds= archive_expsym_cmds= compiler_needs_object=no enable_shared_with_static_runtimes=no export_dynamic_flag_spec= export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' hardcode_automatic=no hardcode_direct=no hardcode_direct_absolute=no hardcode_libdir_flag_spec= hardcode_libdir_separator= hardcode_minus_L=no hardcode_shlibpath_var=unsupported inherit_rpath=no link_all_deplibs=unknown module_cmds= module_expsym_cmds= old_archive_from_new_cmds= old_archive_from_expsyms_cmds= thread_safe_flag_spec= whole_archive_flag_spec= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list include_expsyms= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ' (' and ')$', so one must not match beginning or # end of line. Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc', # as well as any symbol that contains 'd'. exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test yes != "$GCC"; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd* | bitrig*) with_gnu_ld=no ;; esac ld_shlibs=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test yes = "$with_gnu_ld"; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; *\ \(GNU\ Binutils\)\ [3-9]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test yes = "$lt_use_gnu_ld_interface"; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='$wl' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' export_dynamic_flag_spec='$wl--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then whole_archive_flag_spec=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' else whole_archive_flag_spec= fi supports_anon_versioning=no case `$LD -v | $SED -e 's/(^)\+)\s\+//' 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[3-9]*) # On AIX/PPC, the GNU linker is very broken if test ia64 != "$host_cpu"; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' else ld_shlibs=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec='-L$libdir' export_dynamic_flag_spec='$wl--export-all-symbols' allow_undefined_flag=unsupported always_export_symbols=no enable_shared_with_static_runtimes=yes export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file, use it as # is; otherwise, prepend EXPORTS... archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs=no fi ;; haiku*) archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' link_all_deplibs=yes ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes allow_undefined_flag=unsupported shrext_cmds=.dll archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' enable_shared_with_static_runtimes=yes ;; interix[3-9]*) hardcode_direct=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='$wl-rpath,$libdir' export_dynamic_flag_spec='$wl-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test linux-dietlibc = "$host_os"; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test no = "$tmp_diet" then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 whole_archive_flag_spec= tmp_sharedflag='--shared' ;; nagfor*) # NAGFOR 5.3 tmp_sharedflag='-Wl,-shared' ;; xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' compiler_needs_object=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 whole_archive_flag_spec='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' compiler_needs_object=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' if test yes = "$supports_anon_versioning"; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' fi case $cc_basename in tcc*) export_dynamic_flag_spec='-rdynamic' ;; xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test yes = "$supports_anon_versioning"; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else ld_shlibs=no fi ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac ;; sunos4*) archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= hardcode_direct=yes hardcode_shlibpath_var=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac if test no = "$ld_shlibs"; then runpath_var= hardcode_libdir_flag_spec= export_dynamic_flag_spec= whole_archive_flag_spec= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) allow_undefined_flag=unsupported always_export_symbols=yes archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L=yes if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct=unsupported fi ;; aix[4-9]*) if test ia64 = "$host_cpu"; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag= else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to GNU nm, but means don't demangle to AIX nm. # Without the "-l" option, or with the "-B" option, AIX nm treats # weak defined symbols like other global defined symbols, whereas # GNU nm marks them as "W". # While the 'weak' keyword is ignored in the Export File, we need # it in the Import File for the 'aix-soname' feature, so we have # to replace the "-B" option with "-P" for AIX nm. if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' else export_symbols_cmds='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # have runtime linking enabled, and use it for executables. # For shared libraries, we enable/disable runtime linking # depending on the kind of the shared library created - # when "with_aix_soname,aix_use_runtimelinking" is: # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables # "aix,yes" lib.so shared, rtl:yes, for executables # lib.a static archive # "both,no" lib.so.V(shr.o) shared, rtl:yes # lib.a(lib.so.V) shared, rtl:no, for executables # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a(lib.so.V) shared, rtl:no # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a static archive case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then aix_use_runtimelinking=yes break fi done if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then # With aix-soname=svr4, we create the lib.so.V shared archives only, # so we don't have lib.a shared libs to link our executables. # We have to force runtime linking in this case. aix_use_runtimelinking=yes LDFLAGS="$LDFLAGS -Wl,-brtl" fi ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds='' hardcode_direct=yes hardcode_direct_absolute=yes hardcode_libdir_separator=':' link_all_deplibs=yes file_list_spec='$wl-f,' case $with_aix_soname,$aix_use_runtimelinking in aix,*) ;; # traditional, no import file svr4,* | *,yes) # use import file # The Import File defines what to hardcode. hardcode_direct=no hardcode_direct_absolute=no ;; esac if test yes = "$GCC"; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`$CC -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L=yes hardcode_libdir_flag_spec='-L$libdir' hardcode_libdir_separator= fi ;; esac shared_flag='-shared' if test yes = "$aix_use_runtimelinking"; then shared_flag="$shared_flag "'$wl-G' fi # Need to ensure runtime linking is disabled for the traditional # shared library, or the linker may eventually find shared libraries # /with/ Import File - we do not want to mix them. shared_flag_aix='-shared' shared_flag_svr4='-shared $wl-G' else # not using gcc if test ia64 = "$host_cpu"; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test yes = "$aix_use_runtimelinking"; then shared_flag='$wl-G' else shared_flag='$wl-bM:SRE' fi shared_flag_aix='$wl-bM:SRE' shared_flag_svr4='$wl-G' fi fi export_dynamic_flag_spec='$wl-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols=yes if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag='-berok' # Determine the default libpath from the value encoded in an # empty executable. if test set = "${lt_cv_aix_libpath+set}"; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath_+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=/usr/lib:/lib fi fi aix_libpath=$lt_cv_aix_libpath_ fi hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag else if test ia64 = "$host_cpu"; then hardcode_libdir_flag_spec='$wl-R $libdir:/usr/lib:/lib' allow_undefined_flag="-z nodefs" archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. if test set = "${lt_cv_aix_libpath+set}"; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath_+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=/usr/lib:/lib fi fi aix_libpath=$lt_cv_aix_libpath_ fi hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag=' $wl-bernotok' allow_undefined_flag=' $wl-berok' if test yes = "$with_gnu_ld"; then # We only use this code for GNU lds that support --whole-archive. whole_archive_flag_spec='$wl--whole-archive$convenience $wl--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec='$convenience' fi archive_cmds_need_lc=yes archive_expsym_cmds='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' # -brtl affects multiple linker settings, -berok does not and is overridden later compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`' if test svr4 != "$with_aix_soname"; then # This is similar to how AIX traditionally builds its shared libraries. archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' fi if test aix != "$with_aix_soname"; then archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' else # used by -dlpreopen to get the symbols archive_expsym_cmds="$archive_expsym_cmds"'~$MV $output_objdir/$realname.d/$soname $output_objdir' fi archive_expsym_cmds="$archive_expsym_cmds"'~$RM -r $output_objdir/$realname.d' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; bsdi[45]*) export_dynamic_flag_spec=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl*) # Native MSVC hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported always_export_symbols=yes file_list_spec='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then cp "$export_symbols" "$output_objdir/$soname.def"; echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; else $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, )='true' enable_shared_with_static_runtimes=yes exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib old_postinstall_cmds='chmod 644 $oldlib' postlink_cmds='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile=$lt_outputfile.exe lt_tool_outputfile=$lt_tool_outputfile.exe ;; esac~ if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. old_archive_from_new_cmds='true' # FIXME: Should let the user specify the lib program. old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' enable_shared_with_static_runtimes=yes ;; esac ;; darwin* | rhapsody*) archive_cmds_need_lc=no hardcode_direct=no hardcode_automatic=yes hardcode_shlibpath_var=unsupported if test yes = "$lt_cv_ld_force_load"; then whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' else whole_archive_flag_spec='' fi link_all_deplibs=yes allow_undefined_flag=$_lt_dar_allow_undefined case $cc_basename in ifort*|nagfor*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test yes = "$_lt_dar_can_shared"; then output_verbose_link_cmd=func_echo_all archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" archive_expsym_cmds="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" module_expsym_cmds="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" else ld_shlibs=no fi ;; dgux*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; hpux9*) if test yes = "$GCC"; then archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' else archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' fi hardcode_libdir_flag_spec='$wl+b $wl$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes export_dynamic_flag_spec='$wl-E' ;; hpux10*) if test yes,no = "$GCC,$with_gnu_ld"; then archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test no = "$with_gnu_ld"; then hardcode_libdir_flag_spec='$wl+b $wl$libdir' hardcode_libdir_separator=: hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='$wl-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes fi ;; hpux11*) if test yes,no = "$GCC,$with_gnu_ld"; then case $host_cpu in hppa*64*) archive_cmds='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) archive_cmds='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 $as_echo_n "checking if $CC understands -b... " >&6; } if ${lt_cv_prog_compiler__b+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler__b=no save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS -b" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler__b=yes fi else lt_cv_prog_compiler__b=yes fi fi $RM -r conftest* LDFLAGS=$save_LDFLAGS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 $as_echo "$lt_cv_prog_compiler__b" >&6; } if test yes = "$lt_cv_prog_compiler__b"; then archive_cmds='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi ;; esac fi if test no = "$with_gnu_ld"; then hardcode_libdir_flag_spec='$wl+b $wl$libdir' hardcode_libdir_separator=: case $host_cpu in hppa*64*|ia64*) hardcode_direct=no hardcode_shlibpath_var=no ;; *) hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='$wl-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test yes = "$GCC"; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 $as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } if ${lt_cv_irix_exported_symbol+:} false; then : $as_echo_n "(cached) " >&6 else save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int foo (void) { return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_irix_exported_symbol=yes else lt_cv_irix_exported_symbol=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 $as_echo "$lt_cv_irix_exported_symbol" >&6; } if test yes = "$lt_cv_irix_exported_symbol"; then archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib' fi else archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' hardcode_libdir_separator=: inherit_rpath=yes link_all_deplibs=yes ;; linux*) case $cc_basename in tcc*) # Fabrice Bellard et al's Tiny C Compiler ld_shlibs=yes archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; newsos6) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' hardcode_libdir_separator=: hardcode_shlibpath_var=no ;; *nto* | *qnx*) ;; openbsd* | bitrig*) if test -f /usr/libexec/ld.so; then hardcode_direct=yes hardcode_shlibpath_var=no hardcode_direct_absolute=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols' hardcode_libdir_flag_spec='$wl-rpath,$libdir' export_dynamic_flag_spec='$wl-E' else archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='$wl-rpath,$libdir' fi else ld_shlibs=no fi ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes allow_undefined_flag=unsupported shrext_cmds=.dll archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' enable_shared_with_static_runtimes=yes ;; osf3*) if test yes = "$GCC"; then allow_undefined_flag=' $wl-expect_unresolved $wl\*' archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' hardcode_libdir_separator=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test yes = "$GCC"; then allow_undefined_flag=' $wl-expect_unresolved $wl\*' archive_cmds='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec='-rpath $libdir' fi archive_cmds_need_lc='no' hardcode_libdir_separator=: ;; solaris*) no_undefined_flag=' -z defs' if test yes = "$GCC"; then wlarc='$wl' archive_cmds='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' archive_cmds='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='$wl' archive_cmds='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi hardcode_libdir_flag_spec='-R$libdir' hardcode_shlibpath_var=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands '-z linker_flag'. GCC discards it without '$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test yes = "$GCC"; then whole_archive_flag_spec='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' else whole_archive_flag_spec='-z allextract$convenience -z defaultextract' fi ;; esac link_all_deplibs=yes ;; sunos4*) if test sequent = "$host_vendor"; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. archive_cmds='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; sysv4) case $host_vendor in sni) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' reload_cmds='$CC -r -o $output$reload_objs' hardcode_direct=no ;; motorola) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' hardcode_shlibpath_var=no ;; sysv4.3*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no export_dynamic_flag_spec='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ld_shlibs=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag='$wl-z,text' archive_cmds_need_lc=no hardcode_shlibpath_var=no runpath_var='LD_RUN_PATH' if test yes = "$GCC"; then archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We CANNOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag='$wl-z,text' allow_undefined_flag='$wl-z,nodefs' archive_cmds_need_lc=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='$wl-R,$libdir' hardcode_libdir_separator=':' link_all_deplibs=yes export_dynamic_flag_spec='$wl-Bexport' runpath_var='LD_RUN_PATH' if test yes = "$GCC"; then archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; *) ld_shlibs=no ;; esac if test sni = "$host_vendor"; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) export_dynamic_flag_spec='$wl-Blargedynsym' ;; esac fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 $as_echo "$ld_shlibs" >&6; } test no = "$ld_shlibs" && can_build_shared=no with_gnu_ld=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc" in x|xyes) # Assume -lc should be added archive_cmds_need_lc=yes if test yes,yes = "$GCC,$enable_shared"; then case $archive_cmds in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } if ${lt_cv_archive_cmds_need_lc+:} false; then : $as_echo_n "(cached) " >&6 else $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl pic_flag=$lt_prog_compiler_pic compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag allow_undefined_flag= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc=no else lt_cv_archive_cmds_need_lc=yes fi allow_undefined_flag=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 $as_echo "$lt_cv_archive_cmds_need_lc" >&6; } archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc ;; esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } if test yes = "$GCC"; then case $host_os in darwin*) lt_awk_arg='/^libraries:/,/LR/' ;; *) lt_awk_arg='/^libraries:/' ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq='s|=\([A-Za-z]:\)|\1|g' ;; *) lt_sed_strip_eq='s|=/|/|g' ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary... lt_tmp_lt_search_path_spec= lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` # ...but if some path component already ends with the multilib dir we assume # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer). case "$lt_multi_os_dir; $lt_search_path_spec " in "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*) lt_multi_os_dir= ;; esac for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir" elif test -n "$lt_multi_os_dir"; then test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS = " "; FS = "/|\n";} { lt_foo = ""; lt_count = 0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo = "/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[lt_foo]++; } if (lt_freq[lt_foo] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's|/\([A-Za-z]:\)|\1|g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=.so postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='$libname$release$shared_ext$major' ;; aix[4-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test ia64 = "$host_cpu"; then # AIX 5 supports IA64 library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line '#! .'. This would cause the generated library to # depend on '.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # Using Import Files as archive members, it is possible to support # filename-based versioning of shared library archives on AIX. While # this would work for both with and without runtime linking, it will # prevent static linking of such archives. So we do filename-based # shared library versioning with .so extension only, which is used # when both runtime linking and shared linking is enabled. # Unfortunately, runtime linking may impact performance, so we do # not want this to be the default eventually. Also, we use the # versioned .so libs for executables only if there is the -brtl # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. # To allow for filename-based versioning support, we need to create # libNAME.so.V as an archive file, containing: # *) an Import File, referring to the versioned filename of the # archive as well as the shared archive member, telling the # bitwidth (32 or 64) of that shared object, and providing the # list of exported symbols of that shared object, eventually # decorated with the 'weak' keyword # *) the shared object with the F_LOADONLY flag set, to really avoid # it being seen by the linker. # At run time we better use the real file rather than another symlink, # but for link time we create the symlink libNAME.so -> libNAME.so.V case $with_aix_soname,$aix_use_runtimelinking in # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. aix,yes) # traditional libtool dynamic_linker='AIX unversionable lib.so' # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' ;; aix,no) # traditional AIX only dynamic_linker='AIX lib.a(lib.so.V)' # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='$libname$release.a $libname.a' soname_spec='$libname$release$shared_ext$major' ;; svr4,*) # full svr4 only dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,yes) # both, prefer svr4 dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # unpreferred sharedlib libNAME.a needs extra handling postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,no) # both, prefer aix dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)" library_names_spec='$libname$release.a $libname.a' soname_spec='$libname$release$shared_ext$major' # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' ;; esac shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='$libname$shared_ext' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=.dll need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' library_names_spec='$libname.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec=$LIB if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' soname_spec='$libname$release$major$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[23].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=no sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' if test 32 = "$HPUX_IA64_MODE"; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" sys_lib_dlsearch_path_spec=/usr/lib/hpux32 else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" sys_lib_dlsearch_path_spec=/usr/lib/hpux64 fi ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[3-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test yes = "$lt_cv_prog_gnu_ld"; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='$libname$release$shared_ext$major' library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; linux*android*) version_type=none # Android doesn't support versioned libraries. need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext' soname_spec='$libname$release$shared_ext' finish_cmds= shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes dynamic_linker='Android linker' # Don't embed -rpath directories since the linker doesn't support them. hardcode_libdir_flag_spec='-L$libdir' ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH if ${lt_cv_shlibpath_overrides_runpath+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : lt_cv_shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir fi shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Add ABI-specific directories to the system library path. sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib" # Ideally, we could use ldconfig to report *all* directores which are # searched for libraries, however this is still not possible. Aside from not # being certain /sbin/ldconfig is available, command # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, # even though it is searched at run-time. Try to do the best guess by # appending ld.so.conf contents (and includes) to the search path. if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd* | bitrig*) version_type=sunos sys_lib_dlsearch_path_spec=/usr/lib need_lib_prefix=no if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then need_version=no else need_version=yes fi library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; os2*) libname_spec='$name' version_type=windows shrext_cmds=.dll need_version=no need_lib_prefix=no # OS/2 can only load a DLL with a base name of 8 characters or less. soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; v=$($ECHO $release$versuffix | tr -d .-); n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); $ECHO $n$v`$shared_ext' library_names_spec='${libname}_dll.$libext' dynamic_linker='OS/2 ld.exe' shlibpath_var=BEGINLIBPATH sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='$libname$release$shared_ext$major' library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test yes = "$with_gnu_ld"; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec; then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' soname_spec='$libname$shared_ext.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=sco need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test yes = "$with_gnu_ld"; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 $as_echo "$dynamic_linker" >&6; } test no = "$dynamic_linker" && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test yes = "$GCC"; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec fi if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec fi # remember unaugmented sys_lib_dlsearch_path content for libtool script decls... configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec # ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" # to be used as default LT_SYS_LIBRARY_PATH value in generated libtool configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 $as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action= if test -n "$hardcode_libdir_flag_spec" || test -n "$runpath_var" || test yes = "$hardcode_automatic"; then # We can hardcode non-existent directories. if test no != "$hardcode_direct" && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, )" && test no != "$hardcode_minus_L"; then # Linking always hardcodes the temporary library directory. hardcode_action=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action=unsupported fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 $as_echo "$hardcode_action" >&6; } if test relink = "$hardcode_action" || test yes = "$inherit_rpath"; then # Fast installation is not supported enable_fast_install=no elif test yes = "$shlibpath_overrides_runpath" || test no = "$enable_shared"; then # Fast installation is not necessary enable_fast_install=needless fi if test yes != "$enable_dlopen"; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen=load_add_on lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen=LoadLibrary lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen=dlopen lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl else lt_cv_dlopen=dyld lt_cv_dlopen_libs= lt_cv_dlopen_self=yes fi ;; tpf*) # Don't try to run any link tests for TPF. We know it's impossible # because TPF is a cross-compiler, and we know how we open DSOs. lt_cv_dlopen=dlopen lt_cv_dlopen_libs= lt_cv_dlopen_self=no ;; *) ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" if test "x$ac_cv_func_shl_load" = xyes; then : lt_cv_dlopen=shl_load else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 $as_echo_n "checking for shl_load in -ldld... " >&6; } if ${ac_cv_lib_dld_shl_load+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char shl_load (); int main () { return shl_load (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_shl_load=yes else ac_cv_lib_dld_shl_load=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 $as_echo "$ac_cv_lib_dld_shl_load" >&6; } if test "x$ac_cv_lib_dld_shl_load" = xyes; then : lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld else ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" if test "x$ac_cv_func_dlopen" = xyes; then : lt_cv_dlopen=dlopen else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 $as_echo_n "checking for dlopen in -lsvld... " >&6; } if ${ac_cv_lib_svld_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsvld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_svld_dlopen=yes else ac_cv_lib_svld_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 $as_echo "$ac_cv_lib_svld_dlopen" >&6; } if test "x$ac_cv_lib_svld_dlopen" = xyes; then : lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 $as_echo_n "checking for dld_link in -ldld... " >&6; } if ${ac_cv_lib_dld_dld_link+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dld_link (); int main () { return dld_link (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_dld_link=yes else ac_cv_lib_dld_dld_link=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 $as_echo "$ac_cv_lib_dld_dld_link" >&6; } if test "x$ac_cv_lib_dld_dld_link" = xyes; then : lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld fi fi fi fi fi fi ;; esac if test no = "$lt_cv_dlopen"; then enable_dlopen=no else enable_dlopen=yes fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS=$CPPFLAGS test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS=$LDFLAGS wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS=$LIBS LIBS="$lt_cv_dlopen_libs $LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 $as_echo_n "checking whether a program can dlopen itself... " >&6; } if ${lt_cv_dlopen_self+:} false; then : $as_echo_n "(cached) " >&6 else if test yes = "$cross_compiling"; then : lt_cv_dlopen_self=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisibility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; esac else : # compilation failed lt_cv_dlopen_self=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 $as_echo "$lt_cv_dlopen_self" >&6; } if test yes = "$lt_cv_dlopen_self"; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 $as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } if ${lt_cv_dlopen_self_static+:} false; then : $as_echo_n "(cached) " >&6 else if test yes = "$cross_compiling"; then : lt_cv_dlopen_self_static=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisibility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; esac else : # compilation failed lt_cv_dlopen_self_static=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 $as_echo "$lt_cv_dlopen_self_static" >&6; } fi CPPFLAGS=$save_CPPFLAGS LDFLAGS=$save_LDFLAGS LIBS=$save_LIBS ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi striplib= old_striplib= { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 $as_echo_n "checking whether stripping libraries is possible... " >&6; } if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP"; then striplib="$STRIP -x" old_striplib="$STRIP -S" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ;; esac fi # Report what library types will actually be built { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 $as_echo_n "checking if libtool supports shared libraries... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 $as_echo "$can_build_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 $as_echo_n "checking whether to build shared libraries... " >&6; } test no = "$can_build_shared" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test yes = "$enable_shared" && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[4-9]*) if test ia64 != "$host_cpu"; then case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in yes,aix,yes) ;; # shared object as lib.so file only yes,svr4,*) ;; # shared object as lib.so archive member only yes,*) enable_static=no ;; # shared object in lib.a archive as well esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 $as_echo "$enable_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 $as_echo_n "checking whether to build static libraries... " >&6; } # Make sure either enable_shared or enable_static is yes. test yes = "$enable_shared" || enable_static=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 $as_echo "$enable_static" >&6; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CC=$lt_save_CC if test -n "$CXX" && ( test no != "$CXX" && ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) || (test g++ != "$CXX"))); then ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 $as_echo_n "checking how to run the C++ preprocessor... " >&6; } if test -z "$CXXCPP"; then if ${ac_cv_prog_CXXCPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CXXCPP needs to be expanded for CXXCPP in "$CXX -E" "/lib/cpp" do ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CXXCPP=$CXXCPP fi CXXCPP=$ac_cv_prog_CXXCPP else ac_cv_prog_CXXCPP=$CXXCPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 $as_echo "$CXXCPP" >&6; } ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu else _lt_caught_CXX_error=yes fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu archive_cmds_need_lc_CXX=no allow_undefined_flag_CXX= always_export_symbols_CXX=no archive_expsym_cmds_CXX= compiler_needs_object_CXX=no export_dynamic_flag_spec_CXX= hardcode_direct_CXX=no hardcode_direct_absolute_CXX=no hardcode_libdir_flag_spec_CXX= hardcode_libdir_separator_CXX= hardcode_minus_L_CXX=no hardcode_shlibpath_var_CXX=unsupported hardcode_automatic_CXX=no inherit_rpath_CXX=no module_cmds_CXX= module_expsym_cmds_CXX= link_all_deplibs_CXX=unknown old_archive_cmds_CXX=$old_archive_cmds reload_flag_CXX=$reload_flag reload_cmds_CXX=$reload_cmds no_undefined_flag_CXX= whole_archive_flag_spec_CXX= enable_shared_with_static_runtimes_CXX=no # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o objext_CXX=$objext # No sense in running all these tests if we already determined that # the CXX compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test yes != "$_lt_caught_CXX_error"; then # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} CFLAGS=$CXXFLAGS compiler=$CC compiler_CXX=$CC func_cc_basename $compiler cc_basename=$func_cc_basename_result if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately if test yes = "$GXX"; then lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' else lt_prog_compiler_no_builtin_flag_CXX= fi if test yes = "$GXX"; then # Set up default GNU C++ configuration # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes else with_gnu_ld=no fi ac_prog=ld if test yes = "$GCC"; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 $as_echo_n "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return, which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD=$ac_prog ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test yes = "$with_gnu_ld"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if ${lt_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD=$ac_dir/$ac_prog # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if ${lt_cv_prog_gnu_ld+:} false; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 $as_echo "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test yes = "$with_gnu_ld"; then archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' export_dynamic_flag_spec_CXX='$wl--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='$wl' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | $GREP 'no-whole-archive' > /dev/null; then whole_archive_flag_spec_CXX=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' else whole_archive_flag_spec_CXX= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } ld_shlibs_CXX=yes case $host_os in aix3*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aix[4-9]*) if test ia64 = "$host_cpu"; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag= else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # have runtime linking enabled, and use it for executables. # For shared libraries, we enable/disable runtime linking # depending on the kind of the shared library created - # when "with_aix_soname,aix_use_runtimelinking" is: # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables # "aix,yes" lib.so shared, rtl:yes, for executables # lib.a static archive # "both,no" lib.so.V(shr.o) shared, rtl:yes # lib.a(lib.so.V) shared, rtl:no, for executables # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a(lib.so.V) shared, rtl:no # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a static archive case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then # With aix-soname=svr4, we create the lib.so.V shared archives only, # so we don't have lib.a shared libs to link our executables. # We have to force runtime linking in this case. aix_use_runtimelinking=yes LDFLAGS="$LDFLAGS -Wl,-brtl" fi ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds_CXX='' hardcode_direct_CXX=yes hardcode_direct_absolute_CXX=yes hardcode_libdir_separator_CXX=':' link_all_deplibs_CXX=yes file_list_spec_CXX='$wl-f,' case $with_aix_soname,$aix_use_runtimelinking in aix,*) ;; # no import file svr4,* | *,yes) # use import file # The Import File defines what to hardcode. hardcode_direct_CXX=no hardcode_direct_absolute_CXX=no ;; esac if test yes = "$GXX"; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`$CC -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct_CXX=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L_CXX=yes hardcode_libdir_flag_spec_CXX='-L$libdir' hardcode_libdir_separator_CXX= fi esac shared_flag='-shared' if test yes = "$aix_use_runtimelinking"; then shared_flag=$shared_flag' $wl-G' fi # Need to ensure runtime linking is disabled for the traditional # shared library, or the linker may eventually find shared libraries # /with/ Import File - we do not want to mix them. shared_flag_aix='-shared' shared_flag_svr4='-shared $wl-G' else # not using gcc if test ia64 = "$host_cpu"; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test yes = "$aix_use_runtimelinking"; then shared_flag='$wl-G' else shared_flag='$wl-bM:SRE' fi shared_flag_aix='$wl-bM:SRE' shared_flag_svr4='$wl-G' fi fi export_dynamic_flag_spec_CXX='$wl-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to # export. always_export_symbols_CXX=yes if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. # The "-G" linker flag allows undefined symbols. no_undefined_flag_CXX='-bernotok' # Determine the default libpath from the value encoded in an empty # executable. if test set = "${lt_cv_aix_libpath+set}"; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath__CXX+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX=/usr/lib:/lib fi fi aix_libpath=$lt_cv_aix_libpath__CXX fi hardcode_libdir_flag_spec_CXX='$wl-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag else if test ia64 = "$host_cpu"; then hardcode_libdir_flag_spec_CXX='$wl-R $libdir:/usr/lib:/lib' allow_undefined_flag_CXX="-z nodefs" archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. if test set = "${lt_cv_aix_libpath+set}"; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath__CXX+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX=/usr/lib:/lib fi fi aix_libpath=$lt_cv_aix_libpath__CXX fi hardcode_libdir_flag_spec_CXX='$wl-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag_CXX=' $wl-bernotok' allow_undefined_flag_CXX=' $wl-berok' if test yes = "$with_gnu_ld"; then # We only use this code for GNU lds that support --whole-archive. whole_archive_flag_spec_CXX='$wl--whole-archive$convenience $wl--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec_CXX='$convenience' fi archive_cmds_need_lc_CXX=yes archive_expsym_cmds_CXX='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' # -brtl affects multiple linker settings, -berok does not and is overridden later compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`' if test svr4 != "$with_aix_soname"; then # This is similar to how AIX traditionally builds its shared # libraries. Need -bnortl late, we may have -brtl in LDFLAGS. archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' fi if test aix != "$with_aix_soname"; then archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' else # used by -dlpreopen to get the symbols archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$MV $output_objdir/$realname.d/$soname $output_objdir' fi archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$RM -r $output_objdir/$realname.d' fi fi ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag_CXX=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' else ld_shlibs_CXX=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; cygwin* | mingw* | pw32* | cegcc*) case $GXX,$cc_basename in ,cl* | no,cl*) # Native MSVC # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec_CXX=' ' allow_undefined_flag_CXX=unsupported always_export_symbols_CXX=yes file_list_spec_CXX='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' archive_expsym_cmds_CXX='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then cp "$export_symbols" "$output_objdir/$soname.def"; echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; else $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true' enable_shared_with_static_runtimes_CXX=yes # Don't use ranlib old_postinstall_cmds_CXX='chmod 644 $oldlib' postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile=$lt_outputfile.exe lt_tool_outputfile=$lt_tool_outputfile.exe ;; esac~ func_to_tool_file "$lt_outputfile"~ if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # g++ # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec_CXX='-L$libdir' export_dynamic_flag_spec_CXX='$wl--export-all-symbols' allow_undefined_flag_CXX=unsupported always_export_symbols_CXX=no enable_shared_with_static_runtimes_CXX=yes if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file, use it as # is; otherwise, prepend EXPORTS... archive_expsym_cmds_CXX='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs_CXX=no fi ;; esac ;; darwin* | rhapsody*) archive_cmds_need_lc_CXX=no hardcode_direct_CXX=no hardcode_automatic_CXX=yes hardcode_shlibpath_var_CXX=unsupported if test yes = "$lt_cv_ld_force_load"; then whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' else whole_archive_flag_spec_CXX='' fi link_all_deplibs_CXX=yes allow_undefined_flag_CXX=$_lt_dar_allow_undefined case $cc_basename in ifort*|nagfor*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test yes = "$_lt_dar_can_shared"; then output_verbose_link_cmd=func_echo_all archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" archive_expsym_cmds_CXX="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" module_expsym_cmds_CXX="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" if test yes != "$lt_cv_apple_cc_single_mod"; then archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil" archive_expsym_cmds_CXX="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil" fi else ld_shlibs_CXX=no fi ;; os2*) hardcode_libdir_flag_spec_CXX='-L$libdir' hardcode_minus_L_CXX=yes allow_undefined_flag_CXX=unsupported shrext_cmds=.dll archive_cmds_CXX='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' archive_expsym_cmds_CXX='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' old_archive_From_new_cmds_CXX='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' enable_shared_with_static_runtimes_CXX=yes ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; freebsd2.*) # C++ shared libraries reported to be fairly broken before # switch to ELF ld_shlibs_CXX=no ;; freebsd-elf*) archive_cmds_need_lc_CXX=no ;; freebsd* | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions ld_shlibs_CXX=yes ;; haiku*) archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' link_all_deplibs_CXX=yes ;; hpux9*) hardcode_libdir_flag_spec_CXX='$wl+b $wl$libdir' hardcode_libdir_separator_CXX=: export_dynamic_flag_spec_CXX='$wl-E' hardcode_direct_CXX=yes hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aCC*) archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test yes = "$GXX"; then archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; hpux10*|hpux11*) if test no = "$with_gnu_ld"; then hardcode_libdir_flag_spec_CXX='$wl+b $wl$libdir' hardcode_libdir_separator_CXX=: case $host_cpu in hppa*64*|ia64*) ;; *) export_dynamic_flag_spec_CXX='$wl-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) hardcode_direct_CXX=no hardcode_shlibpath_var_CXX=no ;; *) hardcode_direct_CXX=yes hardcode_direct_absolute_CXX=yes hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aCC*) case $host_cpu in hppa*64*) archive_cmds_CXX='$CC -b $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) archive_cmds_CXX='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) archive_cmds_CXX='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test yes = "$GXX"; then if test no = "$with_gnu_ld"; then case $host_cpu in hppa*64*) archive_cmds_CXX='$CC -shared -nostdlib -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) archive_cmds_CXX='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) archive_cmds_CXX='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; interix[3-9]*) hardcode_direct_CXX=no hardcode_shlibpath_var_CXX=no hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' export_dynamic_flag_spec_CXX='$wl-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds_CXX='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test yes = "$GXX"; then if test no = "$with_gnu_ld"; then archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' else archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` -o $lib' fi fi link_all_deplibs_CXX=yes ;; esac hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' hardcode_libdir_separator_CXX=: inherit_rpath_CXX=yes ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib $wl-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' export_dynamic_flag_spec_CXX='$wl--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc* | ecpc* ) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; esac archive_cmds_need_lc_CXX=no hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' export_dynamic_flag_spec_CXX='$wl--export-dynamic' whole_archive_flag_spec_CXX='$wl--whole-archive$convenience $wl--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in *pgCC\ [1-5].* | *pgcpp\ [1-5].*) prelink_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' old_archive_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ $RANLIB $oldlib' archive_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 6 and above use weak symbols archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; esac hardcode_libdir_flag_spec_CXX='$wl--rpath $wl$libdir' export_dynamic_flag_spec_CXX='$wl--export-dynamic' whole_archive_flag_spec_CXX='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' ;; cxx*) # Compaq C++ archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib $wl-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec_CXX='-rpath $libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' ;; xl* | mpixl* | bgxl*) # IBM XL 8.0 on PPC, with GNU ld hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' export_dynamic_flag_spec_CXX='$wl--export-dynamic' archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' if test yes = "$supports_anon_versioning"; then archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' fi ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 no_undefined_flag_CXX=' -zdefs' archive_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' archive_expsym_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file $wl$export_symbols' hardcode_libdir_flag_spec_CXX='-R$libdir' whole_archive_flag_spec_CXX='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' compiler_needs_object_CXX=yes # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; m88k*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= hardcode_libdir_flag_spec_CXX='-R$libdir' hardcode_direct_CXX=yes hardcode_shlibpath_var_CXX=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; *nto* | *qnx*) ld_shlibs_CXX=yes ;; openbsd* | bitrig*) if test -f /usr/libexec/ld.so; then hardcode_direct_CXX=yes hardcode_shlibpath_var_CXX=no hardcode_direct_absolute_CXX=yes archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`"; then archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file,$export_symbols -o $lib' export_dynamic_flag_spec_CXX='$wl-E' whole_archive_flag_spec_CXX=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' fi output_verbose_link_cmd=func_echo_all else ld_shlibs_CXX=no fi ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' hardcode_libdir_separator_CXX=: # Archives containing C++ object files must be created using # the KAI C++ compiler. case $host in osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;; esac ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; cxx*) case $host in osf3*) allow_undefined_flag_CXX=' $wl-expect_unresolved $wl\*' archive_cmds_CXX='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $soname `test -n "$verstring" && func_echo_all "$wl-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' ;; *) allow_undefined_flag_CXX=' -expect_unresolved \*' archive_cmds_CXX='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname $wl-input $wl$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~ $RM $lib.exp' hardcode_libdir_flag_spec_CXX='-rpath $libdir' ;; esac hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test yes,no = "$GXX,$with_gnu_ld"; then allow_undefined_flag_CXX=' $wl-expect_unresolved $wl\*' case $host in osf3*) archive_cmds_CXX='$CC -shared -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' ;; *) archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' ;; esac hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ archive_cmds_need_lc_CXX=yes no_undefined_flag_CXX=' -zdefs' archive_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G$allow_undefined_flag $wl-M $wl$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' hardcode_libdir_flag_spec_CXX='-R$libdir' hardcode_shlibpath_var_CXX=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands '-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract' ;; esac link_all_deplibs_CXX=yes output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test yes,no = "$GXX,$with_gnu_ld"; then no_undefined_flag_CXX=' $wl-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # g++ 2.7 appears to require '-G' NOT '-shared' on this # platform. archive_cmds_CXX='$CC -G -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' fi hardcode_libdir_flag_spec_CXX='$wl-R $wl$libdir' case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) whole_archive_flag_spec_CXX='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag_CXX='$wl-z,text' archive_cmds_need_lc_CXX=no hardcode_shlibpath_var_CXX=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) archive_cmds_CXX='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_CXX='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We CANNOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag_CXX='$wl-z,text' allow_undefined_flag_CXX='$wl-z,nodefs' archive_cmds_need_lc_CXX=no hardcode_shlibpath_var_CXX=no hardcode_libdir_flag_spec_CXX='$wl-R,$libdir' hardcode_libdir_separator_CXX=':' link_all_deplibs_CXX=yes export_dynamic_flag_spec_CXX='$wl-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) archive_cmds_CXX='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~ '"$old_archive_cmds_CXX" reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~ '"$reload_cmds_CXX" ;; *) archive_cmds_CXX='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 $as_echo "$ld_shlibs_CXX" >&6; } test no = "$ld_shlibs_CXX" && can_build_shared=no GCC_CXX=$GXX LD_CXX=$LD ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... # Dependencies to place before and after the object being linked: predep_objects_CXX= postdep_objects_CXX= predeps_CXX= postdeps_CXX= compiler_lib_search_path_CXX= cat > conftest.$ac_ext <<_LT_EOF class Foo { public: Foo (void) { a = 0; } private: int a; }; _LT_EOF _lt_libdeps_save_CFLAGS=$CFLAGS case "$CC $CFLAGS " in #( *\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; *\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; *\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; esac if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do case $prev$p in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test x-L = "$p" || test x-R = "$p"; then prev=$p continue fi # Expand the sysroot to ease extracting the directories later. if test -z "$prev"; then case $p in -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; esac fi case $p in =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; esac if test no = "$pre_test_object_deps_done"; then case $prev in -L | -R) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$compiler_lib_search_path_CXX"; then compiler_lib_search_path_CXX=$prev$p else compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} $prev$p" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$postdeps_CXX"; then postdeps_CXX=$prev$p else postdeps_CXX="${postdeps_CXX} $prev$p" fi fi prev= ;; *.lto.$objext) ;; # Ignore GCC LTO objects *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test no = "$pre_test_object_deps_done"; then if test -z "$predep_objects_CXX"; then predep_objects_CXX=$p else predep_objects_CXX="$predep_objects_CXX $p" fi else if test -z "$postdep_objects_CXX"; then postdep_objects_CXX=$p else postdep_objects_CXX="$postdep_objects_CXX $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling CXX test program" fi $RM -f confest.$objext CFLAGS=$_lt_libdeps_save_CFLAGS # PORTME: override above test on systems where it is broken case $host_os in interix[3-9]*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. predep_objects_CXX= postdep_objects_CXX= postdeps_CXX= ;; esac case " $postdeps_CXX " in *" -lc "*) archive_cmds_need_lc_CXX=no ;; esac compiler_lib_search_dirs_CXX= if test -n "${compiler_lib_search_path_CXX}"; then compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | $SED -e 's! -L! !g' -e 's!^ !!'` fi lt_prog_compiler_wl_CXX= lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX= # C++ specific cases for pic, static, wl, etc. if test yes = "$GXX"; then lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='-static' case $host_os in aix*) # All AIX code is PIC. if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' fi lt_prog_compiler_pic_CXX='-fPIC' ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic_CXX='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the '-m68020' flag to GCC prevents building anything better, # like '-m68040'. lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic_CXX='-DDLL_EXPORT' case $host_os in os2*) lt_prog_compiler_static_CXX='$wl-static' ;; esac ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic_CXX='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all lt_prog_compiler_pic_CXX= ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. lt_prog_compiler_static_CXX= ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic_CXX=-Kconform_pic fi ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) ;; *) lt_prog_compiler_pic_CXX='-fPIC' ;; esac ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic_CXX='-fPIC -shared' ;; *) lt_prog_compiler_pic_CXX='-fPIC' ;; esac else case $host_os in aix[4-9]*) # All AIX code is PIC. if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' else lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic_CXX='-DDLL_EXPORT' ;; dgux*) case $cc_basename in ec++*) lt_prog_compiler_pic_CXX='-KPIC' ;; ghcx*) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-pic' ;; *) ;; esac ;; freebsd* | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='$wl-a ${wl}archive' if test ia64 != "$host_cpu"; then lt_prog_compiler_pic_CXX='+Z' fi ;; aCC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='$wl-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_CXX='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # KAI C++ Compiler lt_prog_compiler_wl_CXX='--backend -Wl,' lt_prog_compiler_pic_CXX='-fPIC' ;; ecpc* ) # old Intel C++ for x86_64, which still supported -KPIC. lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-static' ;; icpc* ) # Intel C++, used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-fPIC' lt_prog_compiler_static_CXX='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-fpic' lt_prog_compiler_static_CXX='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX='-non_shared' ;; xlc* | xlC* | bgxl[cC]* | mpixl[cC]*) # IBM XL 8.0, 9.0 on PPC and BlueGene lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-qpic' lt_prog_compiler_static_CXX='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' lt_prog_compiler_wl_CXX='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) lt_prog_compiler_pic_CXX='-W c,exportall' ;; *) ;; esac ;; netbsd*) ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic_CXX='-fPIC -shared' ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) lt_prog_compiler_wl_CXX='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 lt_prog_compiler_pic_CXX='-pic' ;; cxx*) # Digital/Compaq C++ lt_prog_compiler_wl_CXX='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' lt_prog_compiler_wl_CXX='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x lt_prog_compiler_pic_CXX='-pic' lt_prog_compiler_static_CXX='-Bstatic' ;; lcc*) # Lucid lt_prog_compiler_pic_CXX='-pic' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 lt_prog_compiler_pic_CXX='-KPIC' ;; *) ;; esac ;; vxworks*) ;; *) lt_prog_compiler_can_build_shared_CXX=no ;; esac fi case $host_os in # For platforms that do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic_CXX= ;; *) lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 $as_echo_n "checking for $compiler option to produce PIC... " >&6; } if ${lt_cv_prog_compiler_pic_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5 $as_echo "$lt_cv_prog_compiler_pic_CXX" >&6; } lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; } if ${lt_cv_prog_compiler_pic_works_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_works_CXX=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" ## exclude from sc_useless_quotes_in_assignment # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works_CXX=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5 $as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; } if test yes = "$lt_cv_prog_compiler_pic_works_CXX"; then case $lt_prog_compiler_pic_CXX in "" | " "*) ;; *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; esac else lt_prog_compiler_pic_CXX= lt_prog_compiler_can_build_shared_CXX=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 $as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if ${lt_cv_prog_compiler_static_works_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_static_works_CXX=no save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works_CXX=yes fi else lt_cv_prog_compiler_static_works_CXX=yes fi fi $RM -r conftest* LDFLAGS=$save_LDFLAGS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5 $as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; } if test yes = "$lt_cv_prog_compiler_static_works_CXX"; then : else lt_prog_compiler_static_CXX= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o_CXX=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_CXX=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 $as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o_CXX=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_CXX=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 $as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } hard_links=nottested if test no = "$lt_cv_prog_compiler_c_o_CXX" && test no != "$need_locks"; then # do not overwrite the value of need_locks provided by the user { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 $as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 $as_echo "$hard_links" >&6; } if test no = "$hard_links"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5 $as_echo "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' case $host_os in aix[4-9]*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to GNU nm, but means don't demangle to AIX nm. # Without the "-l" option, or with the "-B" option, AIX nm treats # weak defined symbols like other global defined symbols, whereas # GNU nm marks them as "W". # While the 'weak' keyword is ignored in the Export File, we need # it in the Import File for the 'aix-soname' feature, so we have # to replace the "-B" option with "-P" for AIX nm. if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' else export_symbols_cmds_CXX='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' fi ;; pw32*) export_symbols_cmds_CXX=$ltdll_cmds ;; cygwin* | mingw* | cegcc*) case $cc_basename in cl*) exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' ;; *) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' ;; esac ;; *) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 $as_echo "$ld_shlibs_CXX" >&6; } test no = "$ld_shlibs_CXX" && can_build_shared=no with_gnu_ld_CXX=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc_CXX" in x|xyes) # Assume -lc should be added archive_cmds_need_lc_CXX=yes if test yes,yes = "$GCC,$enable_shared"; then case $archive_cmds_CXX in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } if ${lt_cv_archive_cmds_need_lc_CXX+:} false; then : $as_echo_n "(cached) " >&6 else $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl_CXX pic_flag=$lt_prog_compiler_pic_CXX compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag_CXX allow_undefined_flag_CXX= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc_CXX=no else lt_cv_archive_cmds_need_lc_CXX=yes fi allow_undefined_flag_CXX=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5 $as_echo "$lt_cv_archive_cmds_need_lc_CXX" >&6; } archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX ;; esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=.so postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='$libname$release$shared_ext$major' ;; aix[4-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test ia64 = "$host_cpu"; then # AIX 5 supports IA64 library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line '#! .'. This would cause the generated library to # depend on '.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # Using Import Files as archive members, it is possible to support # filename-based versioning of shared library archives on AIX. While # this would work for both with and without runtime linking, it will # prevent static linking of such archives. So we do filename-based # shared library versioning with .so extension only, which is used # when both runtime linking and shared linking is enabled. # Unfortunately, runtime linking may impact performance, so we do # not want this to be the default eventually. Also, we use the # versioned .so libs for executables only if there is the -brtl # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. # To allow for filename-based versioning support, we need to create # libNAME.so.V as an archive file, containing: # *) an Import File, referring to the versioned filename of the # archive as well as the shared archive member, telling the # bitwidth (32 or 64) of that shared object, and providing the # list of exported symbols of that shared object, eventually # decorated with the 'weak' keyword # *) the shared object with the F_LOADONLY flag set, to really avoid # it being seen by the linker. # At run time we better use the real file rather than another symlink, # but for link time we create the symlink libNAME.so -> libNAME.so.V case $with_aix_soname,$aix_use_runtimelinking in # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. aix,yes) # traditional libtool dynamic_linker='AIX unversionable lib.so' # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' ;; aix,no) # traditional AIX only dynamic_linker='AIX lib.a(lib.so.V)' # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='$libname$release.a $libname.a' soname_spec='$libname$release$shared_ext$major' ;; svr4,*) # full svr4 only dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,yes) # both, prefer svr4 dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # unpreferred sharedlib libNAME.a needs extra handling postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,no) # both, prefer aix dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)" library_names_spec='$libname$release.a $libname.a' soname_spec='$libname$release$shared_ext$major' # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' ;; esac shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='$libname$shared_ext' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=.dll need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' library_names_spec='$libname.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec=$LIB if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' soname_spec='$libname$release$major$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[23].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=no sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' if test 32 = "$HPUX_IA64_MODE"; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" sys_lib_dlsearch_path_spec=/usr/lib/hpux32 else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" sys_lib_dlsearch_path_spec=/usr/lib/hpux64 fi ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[3-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test yes = "$lt_cv_prog_gnu_ld"; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='$libname$release$shared_ext$major' library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; linux*android*) version_type=none # Android doesn't support versioned libraries. need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext' soname_spec='$libname$release$shared_ext' finish_cmds= shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes dynamic_linker='Android linker' # Don't embed -rpath directories since the linker doesn't support them. hardcode_libdir_flag_spec_CXX='-L$libdir' ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH if ${lt_cv_shlibpath_overrides_runpath+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\"" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : lt_cv_shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir fi shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Add ABI-specific directories to the system library path. sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib" # Ideally, we could use ldconfig to report *all* directores which are # searched for libraries, however this is still not possible. Aside from not # being certain /sbin/ldconfig is available, command # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, # even though it is searched at run-time. Try to do the best guess by # appending ld.so.conf contents (and includes) to the search path. if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd* | bitrig*) version_type=sunos sys_lib_dlsearch_path_spec=/usr/lib need_lib_prefix=no if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then need_version=no else need_version=yes fi library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; os2*) libname_spec='$name' version_type=windows shrext_cmds=.dll need_version=no need_lib_prefix=no # OS/2 can only load a DLL with a base name of 8 characters or less. soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; v=$($ECHO $release$versuffix | tr -d .-); n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); $ECHO $n$v`$shared_ext' library_names_spec='${libname}_dll.$libext' dynamic_linker='OS/2 ld.exe' shlibpath_var=BEGINLIBPATH sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='$libname$release$shared_ext$major' library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test yes = "$with_gnu_ld"; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec; then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' soname_spec='$libname$shared_ext.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=sco need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test yes = "$with_gnu_ld"; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 $as_echo "$dynamic_linker" >&6; } test no = "$dynamic_linker" && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test yes = "$GCC"; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec fi if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec fi # remember unaugmented sys_lib_dlsearch_path content for libtool script decls... configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec # ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" # to be used as default LT_SYS_LIBRARY_PATH value in generated libtool configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 $as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action_CXX= if test -n "$hardcode_libdir_flag_spec_CXX" || test -n "$runpath_var_CXX" || test yes = "$hardcode_automatic_CXX"; then # We can hardcode non-existent directories. if test no != "$hardcode_direct_CXX" && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" && test no != "$hardcode_minus_L_CXX"; then # Linking always hardcodes the temporary library directory. hardcode_action_CXX=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action_CXX=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action_CXX=unsupported fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5 $as_echo "$hardcode_action_CXX" >&6; } if test relink = "$hardcode_action_CXX" || test yes = "$inherit_rpath_CXX"; then # Fast installation is not supported enable_fast_install=no elif test yes = "$shlibpath_overrides_runpath" || test no = "$enable_shared"; then # Fast installation is not necessary enable_fast_install=needless fi fi # test -n "$compiler" CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld fi # test yes != "$_lt_caught_CXX_error" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_config_commands="$ac_config_commands libtool" # Only expand once: : ${CONFIG_LT=./config.lt} { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_LT" >&5 $as_echo "$as_me: creating $CONFIG_LT" >&6;} as_write_fail=0 cat >"$CONFIG_LT" <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate a libtool stub with the current configuration. SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>"$CONFIG_LT" <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## --------------------------------- ## ## Main body of "$CONFIG_LT" script. ## ## --------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x "$CONFIG_LT" cat >>"$CONFIG_LT" <<\_LTEOF lt_cl_silent=false exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX } >&5 lt_cl_help="\ '$as_me' creates a local libtool stub from the current configuration, for use in further configure time tests before the real libtool is generated. Usage: $0 [OPTIONS] -h, --help print this help, then exit -V, --version print version number, then exit -q, --quiet do not print progress messages -d, --debug don't remove temporary files Report bugs to ." lt_cl_version="\ glib config.lt 2.38.2 configured by $0, generated by GNU Autoconf 2.69. Copyright (C) 2011 Free Software Foundation, Inc. This config.lt script is free software; the Free Software Foundation gives unlimited permision to copy, distribute and modify it." while test 0 != $# do case $1 in --version | --v* | -V ) echo "$lt_cl_version"; exit 0 ;; --help | --h* | -h ) echo "$lt_cl_help"; exit 0 ;; --debug | --d* | -d ) debug=: ;; --quiet | --q* | --silent | --s* | -q ) lt_cl_silent=: ;; -*) as_fn_error $? "unrecognized option: $1 Try '$0 --help' for more information." "$LINENO" 5 ;; *) as_fn_error $? "unrecognized argument: $1 Try '$0 --help' for more information." "$LINENO" 5 ;; esac shift done if $lt_cl_silent; then exec 6>/dev/null fi _LTEOF cat >>"$CONFIG_LT" <<_LTEOF # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' AS='`$ECHO "$AS" | $SED "$delay_single_quote_subst"`' DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' shared_archive_member_spec='`$ECHO "$shared_archive_member_spec" | $SED "$delay_single_quote_subst"`' SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_import='`$ECHO "$lt_cv_sys_global_symbol_to_import" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' lt_cv_nm_interface='`$ECHO "$lt_cv_nm_interface" | $SED "$delay_single_quote_subst"`' nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' lt_cv_truncate_bin='`$ECHO "$lt_cv_truncate_bin" | $SED "$delay_single_quote_subst"`' objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' configure_time_dlsearch_path='`$ECHO "$configure_time_dlsearch_path" | $SED "$delay_single_quote_subst"`' configure_time_lt_sys_library_path='`$ECHO "$configure_time_lt_sys_library_path" | $SED "$delay_single_quote_subst"`' hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`' predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`' postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`' predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`' postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`' compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`' LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`' reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`' reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`' old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`' GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`' archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`' enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`' export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`' old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`' archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`' module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`' allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`' hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`' hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`' hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`' hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`' inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`' link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`' always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`' export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`' exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`' include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`' prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`' postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`' file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`' hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`' compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`' predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`' postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`' predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`' postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`' compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`' LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } # Quote evaled strings. for var in AS \ DLLTOOL \ OBJDUMP \ SHELL \ ECHO \ PATH_SEPARATOR \ SED \ GREP \ EGREP \ FGREP \ LD \ NM \ LN_S \ lt_SP2NL \ lt_NL2SP \ reload_flag \ deplibs_check_method \ file_magic_cmd \ file_magic_glob \ want_nocaseglob \ sharedlib_from_linklib_cmd \ AR \ AR_FLAGS \ archiver_list_spec \ STRIP \ RANLIB \ CC \ CFLAGS \ compiler \ lt_cv_sys_global_symbol_pipe \ lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_import \ lt_cv_sys_global_symbol_to_c_name_address \ lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ lt_cv_nm_interface \ nm_file_list_spec \ lt_cv_truncate_bin \ lt_prog_compiler_no_builtin_flag \ lt_prog_compiler_pic \ lt_prog_compiler_wl \ lt_prog_compiler_static \ lt_cv_prog_compiler_c_o \ need_locks \ MANIFEST_TOOL \ DSYMUTIL \ NMEDIT \ LIPO \ OTOOL \ OTOOL64 \ shrext_cmds \ export_dynamic_flag_spec \ whole_archive_flag_spec \ compiler_needs_object \ with_gnu_ld \ allow_undefined_flag \ no_undefined_flag \ hardcode_libdir_flag_spec \ hardcode_libdir_separator \ exclude_expsyms \ include_expsyms \ file_list_spec \ variables_saved_for_relink \ libname_spec \ library_names_spec \ soname_spec \ install_override_mode \ finish_eval \ old_striplib \ striplib \ compiler_lib_search_dirs \ predep_objects \ postdep_objects \ predeps \ postdeps \ compiler_lib_search_path \ LD_CXX \ reload_flag_CXX \ compiler_CXX \ lt_prog_compiler_no_builtin_flag_CXX \ lt_prog_compiler_pic_CXX \ lt_prog_compiler_wl_CXX \ lt_prog_compiler_static_CXX \ lt_cv_prog_compiler_c_o_CXX \ export_dynamic_flag_spec_CXX \ whole_archive_flag_spec_CXX \ compiler_needs_object_CXX \ with_gnu_ld_CXX \ allow_undefined_flag_CXX \ no_undefined_flag_CXX \ hardcode_libdir_flag_spec_CXX \ hardcode_libdir_separator_CXX \ exclude_expsyms_CXX \ include_expsyms_CXX \ file_list_spec_CXX \ compiler_lib_search_dirs_CXX \ predep_objects_CXX \ postdep_objects_CXX \ predeps_CXX \ postdeps_CXX \ compiler_lib_search_path_CXX; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in reload_cmds \ old_postinstall_cmds \ old_postuninstall_cmds \ old_archive_cmds \ extract_expsyms_cmds \ old_archive_from_new_cmds \ old_archive_from_expsyms_cmds \ archive_cmds \ archive_expsym_cmds \ module_cmds \ module_expsym_cmds \ export_symbols_cmds \ prelink_cmds \ postlink_cmds \ postinstall_cmds \ postuninstall_cmds \ finish_cmds \ sys_lib_search_path_spec \ configure_time_dlsearch_path \ configure_time_lt_sys_library_path \ reload_cmds_CXX \ old_archive_cmds_CXX \ old_archive_from_new_cmds_CXX \ old_archive_from_expsyms_cmds_CXX \ archive_cmds_CXX \ archive_expsym_cmds_CXX \ module_cmds_CXX \ module_expsym_cmds_CXX \ export_symbols_cmds_CXX \ prelink_cmds_CXX \ postlink_cmds_CXX; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done ac_aux_dir='$ac_aux_dir' # See if we are running on zsh, and set the options that allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi PACKAGE='$PACKAGE' VERSION='$VERSION' RM='$RM' ofile='$ofile' _LTEOF cat >>"$CONFIG_LT" <<\_LTEOF { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ofile" >&5 $as_echo "$as_me: creating $ofile" >&6;} # See if we are running on zsh, and set the options that allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi cfgfile=${ofile}T trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # Generated automatically by $as_me ($PACKAGE) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # Provide generalized library-building support services. # Written by Gordon Matzigkeit, 1996 # Copyright (C) 2014 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. # GNU Libtool 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 of of the License, or # (at your option) any later version. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program or library that is built # using GNU Libtool, you may include this file under the same # distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that 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, see . # The names of the tagged configurations supported by this script. available_tags='CXX ' # Configured defaults for sys_lib_dlsearch_path munging. : \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"} # ### BEGIN LIBTOOL CONFIG # Which release of libtool.m4 was used? macro_version=$macro_version macro_revision=$macro_revision # Whether or not to build static libraries. build_old_libs=$enable_static # Assembler program. AS=$lt_AS # DLL creation program. DLLTOOL=$lt_DLLTOOL # Object dumper program. OBJDUMP=$lt_OBJDUMP # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # What type of objects to build. pic_mode=$pic_mode # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # Shared archive member basename,for filename based shared library versioning on AIX. shared_archive_member_spec=$shared_archive_member_spec # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # An echo program that protects backslashes. ECHO=$lt_ECHO # The PATH separator for the build system. PATH_SEPARATOR=$lt_PATH_SEPARATOR # The host system. host_alias=$host_alias host=$host host_os=$host_os # The build system. build_alias=$build_alias build=$build build_os=$build_os # A sed program that does not truncate output. SED=$lt_SED # Sed that helps us avoid accidentally triggering echo(1) options like -n. Xsed="\$SED -e 1s/^X//" # A grep program that handles long lines. GREP=$lt_GREP # An ERE matcher. EGREP=$lt_EGREP # A literal string matcher. FGREP=$lt_FGREP # A BSD- or MS-compatible name lister. NM=$lt_NM # Whether we need soft or hard links. LN_S=$lt_LN_S # What is the maximum length of a command? max_cmd_len=$max_cmd_len # Object file suffix (normally "o"). objext=$ac_objext # Executable file suffix (normally ""). exeext=$exeext # whether the shell understands "unset". lt_unset=$lt_unset # turn spaces into newlines. SP2NL=$lt_lt_SP2NL # turn newlines into spaces. NL2SP=$lt_lt_NL2SP # convert \$build file names to \$host format. to_host_file_cmd=$lt_cv_to_host_file_cmd # convert \$build files to toolchain format. to_tool_file_cmd=$lt_cv_to_tool_file_cmd # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method = "file_magic". file_magic_cmd=$lt_file_magic_cmd # How to find potential files when deplibs_check_method = "file_magic". file_magic_glob=$lt_file_magic_glob # Find potential files using nocaseglob when deplibs_check_method = "file_magic". want_nocaseglob=$lt_want_nocaseglob # Command to associate shared and link libraries. sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd # The archiver. AR=$lt_AR # Flags to create an archive. AR_FLAGS=$lt_AR_FLAGS # How to feed a file listing to the archiver. archiver_list_spec=$lt_archiver_list_spec # A symbol stripping program. STRIP=$lt_STRIP # Commands used to install an old-style archive. RANLIB=$lt_RANLIB old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Whether to use a lock for old archive extraction. lock_old_archive_extraction=$lock_old_archive_extraction # A C compiler. LTCC=$lt_CC # LTCC compiler flags. LTCFLAGS=$lt_CFLAGS # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration. global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm into a list of symbols to manually relocate. global_symbol_to_import=$lt_lt_cv_sys_global_symbol_to_import # Transform the output of nm in a C name address pair. global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # Transform the output of nm in a C name address pair when lib prefix is needed. global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix # The name lister interface. nm_interface=$lt_lt_cv_nm_interface # Specify filename containing input files for \$NM. nm_file_list_spec=$lt_nm_file_list_spec # The root where to search for dependent libraries,and where our libraries should be installed. lt_sysroot=$lt_sysroot # Command to truncate a binary pipe. lt_truncate_bin=$lt_lt_cv_truncate_bin # The name of the directory that contains temporary libtool files. objdir=$objdir # Used to examine libraries when file_magic_cmd begins with "file". MAGIC_CMD=$MAGIC_CMD # Must we lock files when doing compilation? need_locks=$lt_need_locks # Manifest tool. MANIFEST_TOOL=$lt_MANIFEST_TOOL # Tool to manipulate archived DWARF debug symbol files on Mac OS X. DSYMUTIL=$lt_DSYMUTIL # Tool to change global to local symbols on Mac OS X. NMEDIT=$lt_NMEDIT # Tool to manipulate fat objects and archives on Mac OS X. LIPO=$lt_LIPO # ldd/readelf like tool for Mach-O binaries on Mac OS X. OTOOL=$lt_OTOOL # ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. OTOOL64=$lt_OTOOL64 # Old archive suffix (normally "a"). libext=$libext # Shared library suffix (normally ".so"). shrext_cmds=$lt_shrext_cmds # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Variables whose values should be saved in libtool wrapper scripts and # restored at link time. variables_saved_for_relink=$lt_variables_saved_for_relink # Do we need the "lib" prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Library versioning type. version_type=$version_type # Shared library runtime path variable. runpath_var=$runpath_var # Shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Permission mode override for installation of shared libraries. install_override_mode=$lt_install_override_mode # Command to use after installation of a shared archive. postinstall_cmds=$lt_postinstall_cmds # Command to use after uninstallation of a shared archive. postuninstall_cmds=$lt_postuninstall_cmds # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # As "finish_cmds", except a single script fragment to be evaled but # not shown. finish_eval=$lt_finish_eval # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Compile-time system search path for libraries. sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Detected run-time system search path for libraries. sys_lib_dlsearch_path_spec=$lt_configure_time_dlsearch_path # Explicit LT_SYS_LIBRARY_PATH set during ./configure time. configure_time_lt_sys_library_path=$lt_configure_time_lt_sys_library_path # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # The linker used to build libraries. LD=$lt_LD # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds # A language specific compiler. CC=$lt_compiler # Is the compiler the GNU compiler? with_gcc=$GCC # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds archive_expsym_cmds=$lt_archive_expsym_cmds # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds module_expsym_cmds=$lt_module_expsym_cmds # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator # Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct # Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \$shlibpath_var if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms # Symbols that must always be exported. include_expsyms=$lt_include_expsyms # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds # Specify filename containing input files. file_list_spec=$lt_file_list_spec # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action # The directories searched by this compiler when creating a shared library. compiler_lib_search_dirs=$lt_compiler_lib_search_dirs # Dependencies to place before and after the objects being linked to # create a shared library. predep_objects=$lt_predep_objects postdep_objects=$lt_postdep_objects predeps=$lt_predeps postdeps=$lt_postdeps # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path # ### END LIBTOOL CONFIG _LT_EOF cat <<'_LT_EOF' >> "$cfgfile" # ### BEGIN FUNCTIONS SHARED WITH CONFIGURE # func_munge_path_list VARIABLE PATH # ----------------------------------- # VARIABLE is name of variable containing _space_ separated list of # directories to be munged by the contents of PATH, which is string # having a format: # "DIR[:DIR]:" # string "DIR[ DIR]" will be prepended to VARIABLE # ":DIR[:DIR]" # string "DIR[ DIR]" will be appended to VARIABLE # "DIRP[:DIRP]::[DIRA:]DIRA" # string "DIRP[ DIRP]" will be prepended to VARIABLE and string # "DIRA[ DIRA]" will be appended to VARIABLE # "DIR[:DIR]" # VARIABLE will be replaced by "DIR[ DIR]" func_munge_path_list () { case x$2 in x) ;; *:) eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\" ;; x:*) eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\" ;; *::*) eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\" ;; *) eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\" ;; esac } # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. func_cc_basename () { for cc_temp in $*""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` } # ### END FUNCTIONS SHARED WITH CONFIGURE _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test set != "${COLLECT_NAMES+set}"; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac ltmain=$ac_aux_dir/ltmain.sh # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" cat <<_LT_EOF >> "$ofile" # ### BEGIN LIBTOOL TAG CONFIG: CXX # The linker used to build libraries. LD=$lt_LD_CXX # How to create reloadable object files. reload_flag=$lt_reload_flag_CXX reload_cmds=$lt_reload_cmds_CXX # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds_CXX # A language specific compiler. CC=$lt_compiler_CXX # Is the compiler the GNU compiler? with_gcc=$GCC_CXX # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic_CXX # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl_CXX # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static_CXX # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc_CXX # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object_CXX # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds_CXX archive_expsym_cmds=$lt_archive_expsym_cmds_CXX # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds_CXX module_expsym_cmds=$lt_module_expsym_cmds_CXX # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld_CXX # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag_CXX # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag_CXX # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX # Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct_CXX # Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \$shlibpath_var if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute_CXX # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L_CXX # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic_CXX # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath_CXX # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs_CXX # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols_CXX # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds_CXX # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms_CXX # Symbols that must always be exported. include_expsyms=$lt_include_expsyms_CXX # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds_CXX # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds_CXX # Specify filename containing input files. file_list_spec=$lt_file_list_spec_CXX # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action_CXX # The directories searched by this compiler when creating a shared library. compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX # Dependencies to place before and after the objects being linked to # create a shared library. predep_objects=$lt_predep_objects_CXX postdep_objects=$lt_postdep_objects_CXX predeps=$lt_predeps_CXX postdeps=$lt_postdeps_CXX # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path_CXX # ### END LIBTOOL TAG CONFIG: CXX _LT_EOF as_fn_exit 0 _LTEOF chmod +x "$CONFIG_LT" # configure is writing to config.log, but config.lt does its own redirection, # appending to config.log, which fails on DOS, as config.log is still kept # open by configure. Here we exec the FD to /dev/null, effectively closing # config.log, so it can be properly (re)opened and appended to by config.lt. lt_cl_success=: test yes = "$silent" && lt_config_lt_args="$lt_config_lt_args --quiet" exec 5>/dev/null $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false exec 5>>config.log $lt_cl_success || as_fn_exit 1 if test "$glib_native_win32" = "yes"; then : if test x$enable_static = xyes -a x$enable_shared = xyes; then as_fn_error $? "Can not build both shared and static at the same time on Windows." "$LINENO" 5 fi if test x$enable_static = xyes; then glib_win32_static_compilation=yes GLIB_WIN32_STATIC_COMPILATION_DEFINE="#define GLIB_STATIC_COMPILATION 1 #define GOBJECT_STATIC_COMPILATION 1" fi fi if test x$glib_native_win32 = xyes -a x$glib_win32_static_compilation != xyes; then OS_WIN32_AND_DLL_COMPILATION_TRUE= OS_WIN32_AND_DLL_COMPILATION_FALSE='#' else OS_WIN32_AND_DLL_COMPILATION_TRUE='#' OS_WIN32_AND_DLL_COMPILATION_FALSE= fi if test $cross_compiling != yes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for extra flags to get ANSI library prototypes" >&5 $as_echo_n "checking for extra flags to get ANSI library prototypes... " >&6; } glib_save_LIBS=$LIBS LIBS="$LIBS -lm" if test "$cross_compiling" = yes; then : { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run test program while cross compiling See \`config.log' for more details" "$LINENO" 5; } else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { return (log(1) != log(1.)); } _ACEOF if ac_fn_c_try_run "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } else glib_save_CFLAGS=$CFLAGS CFLAGS="$CFLAGS -std1" if test "$cross_compiling" = yes; then : { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run test program while cross compiling See \`config.log' for more details" "$LINENO" 5; } else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { return (log(1) != log(1.)); } _ACEOF if ac_fn_c_try_run "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: -std1" >&5 $as_echo "-std1" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 $as_echo "" >&6; } CFLAGS=$glib_save_CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: No ANSI prototypes found in library. (-std1 didn't work.)" >&5 $as_echo "$as_me: WARNING: No ANSI prototypes found in library. (-std1 didn't work.)" >&2;} fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi LIBS=$glib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for extra flags for POSIX compliance" >&5 $as_echo_n "checking for extra flags for POSIX compliance... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { DIR *dir; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } else glib_save_CFLAGS=$CFLAGS CFLAGS="$CFLAGS -posix" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { DIR *dir; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: -posix" >&5 $as_echo "-posix" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 $as_echo "" >&6; } CFLAGS=$glib_save_CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Could not determine POSIX flag. (-posix didn't work.)" >&5 $as_echo "$as_me: WARNING: Could not determine POSIX flag. (-posix didn't work.)" >&2;} fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext # Checks for library functions. for ac_func in vprintf do : ac_fn_c_check_func "$LINENO" "vprintf" "ac_cv_func_vprintf" if test "x$ac_cv_func_vprintf" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_VPRINTF 1 _ACEOF ac_fn_c_check_func "$LINENO" "_doprnt" "ac_cv_func__doprnt" if test "x$ac_cv_func__doprnt" = xyes; then : $as_echo "#define HAVE_DOPRNT 1" >>confdefs.h fi fi done ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" if test "x$ac_cv_type_size_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define size_t unsigned int _ACEOF fi # The Ultrix 4.2 mips builtin alloca declared by alloca.h only works # for constant arguments. Useless! { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working alloca.h" >&5 $as_echo_n "checking for working alloca.h... " >&6; } if ${ac_cv_working_alloca_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { char *p = (char *) alloca (2 * sizeof (int)); if (p) return 0; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_working_alloca_h=yes else ac_cv_working_alloca_h=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_working_alloca_h" >&5 $as_echo "$ac_cv_working_alloca_h" >&6; } if test $ac_cv_working_alloca_h = yes; then $as_echo "#define HAVE_ALLOCA_H 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for alloca" >&5 $as_echo_n "checking for alloca... " >&6; } if ${ac_cv_func_alloca_works+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __GNUC__ # define alloca __builtin_alloca #else # ifdef _MSC_VER # include # define alloca _alloca # else # ifdef HAVE_ALLOCA_H # include # else # ifdef _AIX #pragma alloca # else # ifndef alloca /* predefined by HP cc +Olibcalls */ void *alloca (size_t); # endif # endif # endif # endif #endif int main () { char *p = (char *) alloca (1); if (p) return 0; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_func_alloca_works=yes else ac_cv_func_alloca_works=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_alloca_works" >&5 $as_echo "$ac_cv_func_alloca_works" >&6; } if test $ac_cv_func_alloca_works = yes; then $as_echo "#define HAVE_ALLOCA 1" >>confdefs.h else # The SVR3 libPW and SVR4 libucb both contain incompatible functions # that cause trouble. Some versions do not even contain alloca or # contain a buggy version. If you still want to use their alloca, # use ar to extract alloca.o from them instead of compiling alloca.c. ALLOCA=\${LIBOBJDIR}alloca.$ac_objext $as_echo "#define C_ALLOCA 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether \`alloca.c' needs Cray hooks" >&5 $as_echo_n "checking whether \`alloca.c' needs Cray hooks... " >&6; } if ${ac_cv_os_cray+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined CRAY && ! defined CRAY2 webecray #else wenotbecray #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "webecray" >/dev/null 2>&1; then : ac_cv_os_cray=yes else ac_cv_os_cray=no fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_os_cray" >&5 $as_echo "$ac_cv_os_cray" >&6; } if test $ac_cv_os_cray = yes; then for ac_func in _getb67 GETB67 getb67; do as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define CRAY_STACKSEG_END $ac_func _ACEOF break fi done fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking stack direction for C alloca" >&5 $as_echo_n "checking stack direction for C alloca... " >&6; } if ${ac_cv_c_stack_direction+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_c_stack_direction=0 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int find_stack_direction (int *addr, int depth) { int dir, dummy = 0; if (! addr) addr = &dummy; *addr = addr < &dummy ? 1 : addr == &dummy ? 0 : -1; dir = depth ? find_stack_direction (addr, depth - 1) : 0; return dir + dummy; } int main (int argc, char **argv) { return find_stack_direction (0, argc + !argv + 20) < 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_c_stack_direction=1 else ac_cv_c_stack_direction=-1 fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_stack_direction" >&5 $as_echo "$ac_cv_c_stack_direction" >&6; } cat >>confdefs.h <<_ACEOF #define STACK_DIRECTION $ac_cv_c_stack_direction _ACEOF fi for ac_func in mmap posix_memalign memalign valloc fsync pipe2 issetugid do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done for ac_func in atexit on_exit timegm gmtime_r do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __libc_enable_secure" >&5 $as_echo_n "checking for __libc_enable_secure... " >&6; } if ${glib_cv_have_libc_enable_secure+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include extern int __libc_enable_secure; int main () { return __libc_enable_secure; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : glib_cv_have_libc_enable_secure=yes else glib_cv_have_libc_enable_secure=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glib_cv_have_libc_enable_secure" >&5 $as_echo "$glib_cv_have_libc_enable_secure" >&6; } if test x$glib_cv_have_libc_enable_secure = xyes; then : $as_echo "#define HAVE_LIBC_ENABLE_SECURE 1" >>confdefs.h fi # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of char" >&5 $as_echo_n "checking size of char... " >&6; } if ${ac_cv_sizeof_char+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (char))" "ac_cv_sizeof_char" "$ac_includes_default"; then : else if test "$ac_cv_type_char" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (char) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_char=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_char" >&5 $as_echo "$ac_cv_sizeof_char" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_CHAR $ac_cv_sizeof_char _ACEOF # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of short" >&5 $as_echo_n "checking size of short... " >&6; } if ${ac_cv_sizeof_short+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (short))" "ac_cv_sizeof_short" "$ac_includes_default"; then : else if test "$ac_cv_type_short" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (short) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_short=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_short" >&5 $as_echo "$ac_cv_sizeof_short" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_SHORT $ac_cv_sizeof_short _ACEOF # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long" >&5 $as_echo_n "checking size of long... " >&6; } if ${ac_cv_sizeof_long+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long))" "ac_cv_sizeof_long" "$ac_includes_default"; then : else if test "$ac_cv_type_long" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (long) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_long=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long" >&5 $as_echo "$ac_cv_sizeof_long" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_LONG $ac_cv_sizeof_long _ACEOF # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of int" >&5 $as_echo_n "checking size of int... " >&6; } if ${ac_cv_sizeof_int+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (int))" "ac_cv_sizeof_int" "$ac_includes_default"; then : else if test "$ac_cv_type_int" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (int) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_int=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_int" >&5 $as_echo "$ac_cv_sizeof_int" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_INT $ac_cv_sizeof_int _ACEOF # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of void *" >&5 $as_echo_n "checking size of void *... " >&6; } if ${ac_cv_sizeof_void_p+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void *))" "ac_cv_sizeof_void_p" "$ac_includes_default"; then : else if test "$ac_cv_type_void_p" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (void *) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_void_p=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_void_p" >&5 $as_echo "$ac_cv_sizeof_void_p" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_VOID_P $ac_cv_sizeof_void_p _ACEOF # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long long" >&5 $as_echo_n "checking size of long long... " >&6; } if ${ac_cv_sizeof_long_long+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long long))" "ac_cv_sizeof_long_long" "$ac_includes_default"; then : else if test "$ac_cv_type_long_long" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (long long) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_long_long=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long_long" >&5 $as_echo "$ac_cv_sizeof_long_long" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_LONG_LONG $ac_cv_sizeof_long_long _ACEOF # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of __int64" >&5 $as_echo_n "checking size of __int64... " >&6; } if ${ac_cv_sizeof___int64+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (__int64))" "ac_cv_sizeof___int64" "$ac_includes_default"; then : else if test "$ac_cv_type___int64" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (__int64) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof___int64=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof___int64" >&5 $as_echo "$ac_cv_sizeof___int64" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF___INT64 $ac_cv_sizeof___int64 _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sig_atomic_t" >&5 $as_echo_n "checking for sig_atomic_t... " >&6; } if ${ac_cv_type_sig_atomic_t+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include sig_atomic_t val = 42; int main () { return val == 42 ? 0 : 1 ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_type_sig_atomic_t=yes else ac_cv_type_sig_atomic_t=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_sig_atomic_t" >&5 $as_echo "$ac_cv_type_sig_atomic_t" >&6; } if test x$ac_cv_type_sig_atomic_t = xyes; then $as_echo "#define HAVE_SIG_ATOMIC_T 1" >>confdefs.h fi if test x$ac_cv_sizeof_long = x8 || test x$ac_cv_sizeof_long_long = x8 || test x$ac_cv_sizeof___int64 = x8 ; then : else as_fn_error $? " *** GLib requires a 64 bit type. You might want to consider *** using the GNU C compiler. " "$LINENO" 5 fi if test x$glib_native_win32 != xyes && test x$ac_cv_sizeof_long_long = x8; then : # long long is a 64 bit integer. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for format to printf and scanf a guint64" >&5 $as_echo_n "checking for format to printf and scanf a guint64... " >&6; } if ${glib_cv_long_long_format+:} false; then : $as_echo_n "(cached) " >&6 else for format in ll q I64; do if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main() { long long b, a = -0x3AFAFAFAFAFAFAFALL; char buffer[1000]; sprintf (buffer, "%${format}u", a); sscanf (buffer, "%${format}u", &b); exit (b!=a); } _ACEOF if ac_fn_c_try_run "$LINENO"; then : glib_cv_long_long_format=${format} break fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi done fi if test -n "$glib_cv_long_long_format"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: %${glib_cv_long_long_format}u" >&5 $as_echo "%${glib_cv_long_long_format}u" >&6; } $as_echo "#define HAVE_LONG_LONG_FORMAT 1" >>confdefs.h if test x"$glib_cv_long_long_format" = xI64; then $as_echo "#define HAVE_INT64_AND_I64 1" >>confdefs.h fi else { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 $as_echo "none" >&6; } fi elif test x$ac_cv_sizeof___int64 = x8; then : # __int64 is a 64 bit integer. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for format to printf and scanf a guint64" >&5 $as_echo_n "checking for format to printf and scanf a guint64... " >&6; } # We know this is MSVCRT.DLL, and what the formats are glib_cv_long_long_format=I64 { $as_echo "$as_me:${as_lineno-$LINENO}: result: %${glib_cv_long_long_format}u" >&5 $as_echo "%${glib_cv_long_long_format}u" >&6; } $as_echo "#define HAVE_LONG_LONG_FORMAT 1" >>confdefs.h $as_echo "#define HAVE_INT64_AND_I64 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 $as_echo_n "checking for an ANSI C-conforming const... " >&6; } if ${ac_cv_c_const+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __cplusplus /* Ultrix mips cc rejects this sort of thing. */ typedef int charset[2]; const charset cs = { 0, 0 }; /* SunOS 4.1.1 cc rejects this. */ char const *const *pcpcc; char **ppc; /* NEC SVR4.0.2 mips cc rejects this. */ struct point {int x, y;}; static struct point const zero = {0,0}; /* AIX XL C 1.02.0.0 rejects this. It does not let you subtract one const X* pointer from another in an arm of an if-expression whose if-part is not a constant expression */ const char *g = "string"; pcpcc = &g + (g ? g-g : 0); /* HPUX 7.0 cc rejects these. */ ++pcpcc; ppc = (char**) pcpcc; pcpcc = (char const *const *) ppc; { /* SCO 3.2v4 cc rejects this sort of thing. */ char tx; char *t = &tx; char const *s = 0 ? (char *) 0 : (char const *) 0; *t++ = 0; if (s) return 0; } { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ int x[] = {25, 17}; const int *foo = &x[0]; ++foo; } { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ typedef const int *iptr; iptr p = 0; ++p; } { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ struct s { int j; const int *ap[3]; } bx; struct s *b = &bx; b->j = 5; } { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ const int foo = 10; if (!foo) return 0; } return !cs[0] && !zero.x; #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_const=yes else ac_cv_c_const=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 $as_echo "$ac_cv_c_const" >&6; } if test $ac_cv_c_const = no; then $as_echo "#define const /**/" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for growing stack pointer" >&5 $as_echo_n "checking for growing stack pointer... " >&6; } if ${glib_cv_stack_grows+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run test program while cross compiling See \`config.log' for more details" "$LINENO" 5; } else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ volatile int *a = 0, *b = 0; void foo (void); int main () { volatile int y = 7; a = &y; foo (); return b > a; } void foo (void) { volatile int x = 5; b = &x; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : glib_cv_stack_grows=no else glib_cv_stack_grows=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glib_cv_stack_grows" >&5 $as_echo "$glib_cv_stack_grows" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __inline" >&5 $as_echo_n "checking for __inline... " >&6; } if ${glib_cv_has__inline+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ __inline int foo () { return 0; } int main () { return foo (); } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : glib_cv_has__inline=yes else glib_cv_has__inline=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glib_cv_has__inline" >&5 $as_echo "$glib_cv_has__inline" >&6; } case x$glib_cv_has__inline in xyes) $as_echo "#define G_HAVE___INLINE 1" >>confdefs.h esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __inline__" >&5 $as_echo_n "checking for __inline__... " >&6; } if ${glib_cv_has__inline__+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ __inline__ int foo () { return 0; } int main () { return foo (); } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : glib_cv_has__inline__=yes else glib_cv_has__inline__=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glib_cv_has__inline__" >&5 $as_echo "$glib_cv_has__inline__" >&6; } case x$glib_cv_has__inline__ in xyes) $as_echo "#define G_HAVE___INLINE__ 1" >>confdefs.h esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 $as_echo_n "checking for inline... " >&6; } if ${glib_cv_hasinline+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #undef inline inline int foo () { return 0; } int main () { return foo (); } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : glib_cv_hasinline=yes else glib_cv_hasinline=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glib_cv_hasinline" >&5 $as_echo "$glib_cv_hasinline" >&6; } case x$glib_cv_hasinline in xyes) $as_echo "#define G_HAVE_INLINE 1" >>confdefs.h esac # if we can use inline functions in headers { $as_echo "$as_me:${as_lineno-$LINENO}: checking if inline functions in headers work" >&5 $as_echo_n "checking if inline functions in headers work... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined (G_HAVE_INLINE) && defined (__GNUC__) && defined (__STRICT_ANSI__) # undef inline # define inline __inline__ #elif !defined (G_HAVE_INLINE) # undef inline # if defined (G_HAVE___INLINE__) # define inline __inline__ # elif defined (G_HAVE___INLINE) # define inline __inline # endif #endif int glib_test_func2 (int); static inline int glib_test_func1 (void) { return glib_test_func2 (1); } int main (void) { int i = 1; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : g_can_inline=yes else g_can_inline=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $g_can_inline" >&5 $as_echo "$g_can_inline" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working do while(0) macros" >&5 $as_echo_n "checking for working do while(0) macros... " >&6; } if ${g_cv_support_dowhile_macros+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #define STMT_START do #define STMT_END while(0) #define STMT_TEST STMT_START { i = 0; } STMT_END int main(void) { int i = 1; STMT_TEST; return i; } ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : g_cv_support_dowhile_macros=yes else g_cv_support_dowhile_macros=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $g_cv_support_dowhile_macros" >&5 $as_echo "$g_cv_support_dowhile_macros" >&6; } if test x$g_cv_support_dowhile_macros = xyes; then $as_echo "#define HAVE_DOWHILE_MACROS 1" >>confdefs.h fi # check for flavours of varargs macros { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ISO C99 varargs macros in C" >&5 $as_echo_n "checking for ISO C99 varargs macros in C... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { int a(int p1, int p2, int p3); #define call_a(...) a(1,__VA_ARGS__) call_a(2,3); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : g_have_iso_c_varargs=yes else g_have_iso_c_varargs=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $g_have_iso_c_varargs" >&5 $as_echo "$g_have_iso_c_varargs" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ISO C99 varargs macros in C++" >&5 $as_echo_n "checking for ISO C99 varargs macros in C++... " >&6; } if test "$CXX" = ""; then : g_have_iso_cxx_varargs=no else ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { int a(int p1, int p2, int p3); #define call_a(...) a(1,__VA_ARGS__) call_a(2,3); ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : g_have_iso_cxx_varargs=yes else g_have_iso_cxx_varargs=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $g_have_iso_cxx_varargs" >&5 $as_echo "$g_have_iso_cxx_varargs" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNUC varargs macros" >&5 $as_echo_n "checking for GNUC varargs macros... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { int a(int p1, int p2, int p3); #define call_a(params...) a(1,params) call_a(2,3); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : g_have_gnuc_varargs=yes else g_have_gnuc_varargs=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $g_have_gnuc_varargs" >&5 $as_echo "$g_have_gnuc_varargs" >&6; } # check for GNUC visibility support { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNUC visibility attribute" >&5 $as_echo_n "checking for GNUC visibility attribute... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ void __attribute__ ((visibility ("hidden"))) f_hidden (void) { } void __attribute__ ((visibility ("internal"))) f_internal (void) { } void __attribute__ ((visibility ("protected"))) f_protected (void) { } void __attribute__ ((visibility ("default"))) f_default (void) { } int main (void) { f_hidden(); f_internal(); f_protected(); f_default(); return 0; } _ACEOF rm -f conftest.$ac_objext glib_ac_compile_save="$ac_compile" ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext' if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='(if test -s conftest.err; then false ; else true; fi)' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 (eval $ac_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : g_have_gnuc_visibility=yes else echo "$as_me: failed program was:" >&5 cat conftest.$ac_ext >&5 g_have_gnuc_visibility=no fi ac_compile="$glib_ac_compile_save" rm -f conftest.$ac_objext conftest.err conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $g_have_gnuc_visibility" >&5 $as_echo "$g_have_gnuc_visibility" >&6; } if test x$g_have_gnuc_visibility = xyes; then HAVE_GNUC_VISIBILITY_TRUE= HAVE_GNUC_VISIBILITY_FALSE='#' else HAVE_GNUC_VISIBILITY_TRUE='#' HAVE_GNUC_VISIBILITY_FALSE= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether using Sun Studio C compiler" >&5 $as_echo_n "checking whether using Sun Studio C compiler... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined(__SUNPRO_C) || (__SUNPRO_C >= 0x550) #else # include "error: this is not Sun Studio." #endif int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : g_have_sunstudio_visibility=yes else g_have_sunstudio_visibility=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $g_have_sunstudio_visibility" >&5 $as_echo "$g_have_sunstudio_visibility" >&6; } if test x$g_have_sunstudio_visibility = xyes; then HAVE_SUNSTUDIO_VISIBILITY_TRUE= HAVE_SUNSTUDIO_VISIBILITY_FALSE='#' else HAVE_SUNSTUDIO_VISIBILITY_TRUE='#' HAVE_SUNSTUDIO_VISIBILITY_FALSE= fi # check for bytesex stuff { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 $as_echo_n "checking whether byte ordering is bigendian... " >&6; } if ${ac_cv_c_bigendian+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_c_bigendian=unknown # See if we're dealing with a universal compiler. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __APPLE_CC__ not a universal capable compiler #endif typedef int dummy; _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # Check for potential -arch flags. It is not universal unless # there are at least two -arch flags with different values. ac_arch= ac_prev= for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do if test -n "$ac_prev"; then case $ac_word in i?86 | x86_64 | ppc | ppc64) if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then ac_arch=$ac_word else ac_cv_c_bigendian=universal break fi ;; esac ac_prev= elif test "x$ac_word" = "x-arch"; then ac_prev=arch fi done fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_c_bigendian = unknown; then # See if sys/param.h defines the BYTE_ORDER macro. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { #if ! (defined BYTE_ORDER && defined BIG_ENDIAN \ && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \ && LITTLE_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # It does; now see whether it defined to BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { #if BYTE_ORDER != BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_bigendian=yes else ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # See if defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris). cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # It does; now see whether it defined to _BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #ifndef _BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_bigendian=yes else ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # Compile a test program. if test "$cross_compiling" = yes; then : # Try to guess by grepping values from an object file. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ short int ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; short int ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; int use_ascii (int i) { return ascii_mm[i] + ascii_ii[i]; } short int ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; short int ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; int use_ebcdic (int i) { return ebcdic_mm[i] + ebcdic_ii[i]; } extern int foo; int main () { return use_ascii (foo) == use_ebcdic (foo); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then ac_cv_c_bigendian=yes fi if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then if test "$ac_cv_c_bigendian" = unknown; then ac_cv_c_bigendian=no else # finding both strings is unlikely to happen, but who knows? ac_cv_c_bigendian=unknown fi fi fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { /* Are we little or big endian? From Harbison&Steele. */ union { long int l; char c[sizeof (long int)]; } u; u.l = 1; return u.c[sizeof (long int) - 1] == 1; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_c_bigendian=no else ac_cv_c_bigendian=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5 $as_echo "$ac_cv_c_bigendian" >&6; } case $ac_cv_c_bigendian in #( yes) $as_echo "#define WORDS_BIGENDIAN 1" >>confdefs.h ;; #( no) ;; #( universal) $as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h ;; #( *) as_fn_error $? "unknown endianness presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;; esac if test x$ac_cv_c_bigendian = xuniversal ; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #if __BYTE_ORDER == __BIG_ENDIAN #else #error Not a big endian. #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_bigendian=yes else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #if __BYTE_ORDER == __LITTLE_ENDIAN #else #error Not a little endian. #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_bigendian=no else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Could not determine endianness." >&5 $as_echo "$as_me: WARNING: Could not determine endianness." >&2;} fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi # check for header files for ac_header in dirent.h float.h limits.h pwd.h grp.h sys/param.h sys/poll.h sys/resource.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in sys/time.h sys/times.h sys/wait.h unistd.h values.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in sys/select.h sys/types.h stdint.h inttypes.h sched.h malloc.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in sys/vfs.h sys/vmount.h sys/statfs.h sys/statvfs.h sys/filio.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in mntent.h sys/mnttab.h sys/vfstab.h sys/mntctl.h fstab.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in sys/uio.h sys/mkdev.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in linux/magic.h do : ac_fn_c_check_header_mongrel "$LINENO" "linux/magic.h" "ac_cv_header_linux_magic_h" "$ac_includes_default" if test "x$ac_cv_header_linux_magic_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LINUX_MAGIC_H 1 _ACEOF fi done for ac_header in sys/prctl.h do : ac_fn_c_check_header_mongrel "$LINENO" "sys/prctl.h" "ac_cv_header_sys_prctl_h" "$ac_includes_default" if test "x$ac_cv_header_sys_prctl_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SYS_PRCTL_H 1 _ACEOF fi done for ac_header in sys/mount.h sys/sysctl.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "#if HAVE_SYS_PARAM_H #include #endif " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_func in sysctlbyname do : ac_fn_c_check_func "$LINENO" "sysctlbyname" "ac_cv_func_sysctlbyname" if test "x$ac_cv_func_sysctlbyname" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SYSCTLBYNAME 1 _ACEOF fi done for ac_header in xlocale.h do : ac_fn_c_check_header_mongrel "$LINENO" "xlocale.h" "ac_cv_header_xlocale_h" "$ac_includes_default" if test "x$ac_cv_header_xlocale_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_XLOCALE_H 1 _ACEOF fi done # check for structure fields ac_fn_c_check_member "$LINENO" "struct stat" "st_mtimensec" "ac_cv_member_struct_stat_st_mtimensec" "$ac_includes_default" if test "x$ac_cv_member_struct_stat_st_mtimensec" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_STAT_ST_MTIMENSEC 1 _ACEOF fi ac_fn_c_check_member "$LINENO" "struct stat" "st_mtim.tv_nsec" "ac_cv_member_struct_stat_st_mtim_tv_nsec" "$ac_includes_default" if test "x$ac_cv_member_struct_stat_st_mtim_tv_nsec" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC 1 _ACEOF fi ac_fn_c_check_member "$LINENO" "struct stat" "st_atimensec" "ac_cv_member_struct_stat_st_atimensec" "$ac_includes_default" if test "x$ac_cv_member_struct_stat_st_atimensec" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_STAT_ST_ATIMENSEC 1 _ACEOF fi ac_fn_c_check_member "$LINENO" "struct stat" "st_atim.tv_nsec" "ac_cv_member_struct_stat_st_atim_tv_nsec" "$ac_includes_default" if test "x$ac_cv_member_struct_stat_st_atim_tv_nsec" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_STAT_ST_ATIM_TV_NSEC 1 _ACEOF fi ac_fn_c_check_member "$LINENO" "struct stat" "st_ctimensec" "ac_cv_member_struct_stat_st_ctimensec" "$ac_includes_default" if test "x$ac_cv_member_struct_stat_st_ctimensec" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_STAT_ST_CTIMENSEC 1 _ACEOF fi ac_fn_c_check_member "$LINENO" "struct stat" "st_ctim.tv_nsec" "ac_cv_member_struct_stat_st_ctim_tv_nsec" "$ac_includes_default" if test "x$ac_cv_member_struct_stat_st_ctim_tv_nsec" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_STAT_ST_CTIM_TV_NSEC 1 _ACEOF fi ac_fn_c_check_member "$LINENO" "struct stat" "st_blksize" "ac_cv_member_struct_stat_st_blksize" "#include #include #include #ifdef HAVE_SYS_STATFS_H #include #endif #ifdef HAVE_SYS_PARAM_H #include #endif #ifdef HAVE_SYS_MOUNT_H #include #endif " if test "x$ac_cv_member_struct_stat_st_blksize" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_STAT_ST_BLKSIZE 1 _ACEOF fi ac_fn_c_check_member "$LINENO" "struct stat" "st_blocks" "ac_cv_member_struct_stat_st_blocks" "#include #include #include #ifdef HAVE_SYS_STATFS_H #include #endif #ifdef HAVE_SYS_PARAM_H #include #endif #ifdef HAVE_SYS_MOUNT_H #include #endif " if test "x$ac_cv_member_struct_stat_st_blocks" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_STAT_ST_BLOCKS 1 _ACEOF fi ac_fn_c_check_member "$LINENO" "struct statfs" "f_fstypename" "ac_cv_member_struct_statfs_f_fstypename" "#include #include #include #ifdef HAVE_SYS_STATFS_H #include #endif #ifdef HAVE_SYS_PARAM_H #include #endif #ifdef HAVE_SYS_MOUNT_H #include #endif " if test "x$ac_cv_member_struct_statfs_f_fstypename" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_STATFS_F_FSTYPENAME 1 _ACEOF fi ac_fn_c_check_member "$LINENO" "struct statfs" "f_bavail" "ac_cv_member_struct_statfs_f_bavail" "#include #include #include #ifdef HAVE_SYS_STATFS_H #include #endif #ifdef HAVE_SYS_PARAM_H #include #endif #ifdef HAVE_SYS_MOUNT_H #include #endif " if test "x$ac_cv_member_struct_statfs_f_bavail" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_STATFS_F_BAVAIL 1 _ACEOF fi # struct statvfs.f_basetype is available on Solaris but not for Linux. ac_fn_c_check_member "$LINENO" "struct statvfs" "f_basetype" "ac_cv_member_struct_statvfs_f_basetype" "#include " if test "x$ac_cv_member_struct_statvfs_f_basetype" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_STATVFS_F_BASETYPE 1 _ACEOF fi ac_fn_c_check_member "$LINENO" "struct statvfs" "f_fstypename" "ac_cv_member_struct_statvfs_f_fstypename" "#include " if test "x$ac_cv_member_struct_statvfs_f_fstypename" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_STATVFS_F_FSTYPENAME 1 _ACEOF fi ac_fn_c_check_member "$LINENO" "struct tm" "tm_gmtoff" "ac_cv_member_struct_tm_tm_gmtoff" "#include " if test "x$ac_cv_member_struct_tm_tm_gmtoff" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_TM_TM_GMTOFF 1 _ACEOF fi ac_fn_c_check_member "$LINENO" "struct tm" "__tm_gmtoff" "ac_cv_member_struct_tm___tm_gmtoff" "#include " if test "x$ac_cv_member_struct_tm___tm_gmtoff" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_TM___TM_GMTOFF 1 _ACEOF fi ac_header_dirent=no for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do as_ac_Header=`$as_echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_hdr that defines DIR" >&5 $as_echo_n "checking for $ac_hdr that defines DIR... " >&6; } if eval \${$as_ac_Header+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include <$ac_hdr> int main () { if ((DIR *) 0) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$as_ac_Header=yes" else eval "$as_ac_Header=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$as_ac_Header { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_hdr" | $as_tr_cpp` 1 _ACEOF ac_header_dirent=$ac_hdr; break fi done # Two versions of opendir et al. are in -ldir and -lx on SCO Xenix. if test $ac_header_dirent = dirent.h; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 $as_echo_n "checking for library containing opendir... " >&6; } if ${ac_cv_search_opendir+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char opendir (); int main () { return opendir (); ; return 0; } _ACEOF for ac_lib in '' dir; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_opendir=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_opendir+:} false; then : break fi done if ${ac_cv_search_opendir+:} false; then : else ac_cv_search_opendir=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 $as_echo "$ac_cv_search_opendir" >&6; } ac_res=$ac_cv_search_opendir if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 $as_echo_n "checking for library containing opendir... " >&6; } if ${ac_cv_search_opendir+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char opendir (); int main () { return opendir (); ; return 0; } _ACEOF for ac_lib in '' x; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_opendir=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_opendir+:} false; then : break fi done if ${ac_cv_search_opendir+:} false; then : else ac_cv_search_opendir=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 $as_echo "$ac_cv_search_opendir" >&6; } ac_res=$ac_cv_search_opendir if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi fi ac_fn_c_check_member "$LINENO" "struct dirent" "d_type" "ac_cv_member_struct_dirent_d_type" " #include #ifdef HAVE_DIRENT_H # include #else # define dirent direct # ifdef HAVE_SYS_NDIR_H # include # endif # ifdef HAVE_SYS_DIR_H # include # endif # ifdef HAVE_NDIR_H # include # endif #endif " if test "x$ac_cv_member_struct_dirent_d_type" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_DIRENT_D_TYPE 1 _ACEOF fi # Checks for libcharset { $as_echo "$as_me:${as_lineno-$LINENO}: checking for nl_langinfo and CODESET" >&5 $as_echo_n "checking for nl_langinfo and CODESET... " >&6; } if ${am_cv_langinfo_codeset+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { char* cs = nl_langinfo(CODESET); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : am_cv_langinfo_codeset=yes else am_cv_langinfo_codeset=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_langinfo_codeset" >&5 $as_echo "$am_cv_langinfo_codeset" >&6; } if test $am_cv_langinfo_codeset = yes; then $as_echo "#define HAVE_LANGINFO_CODESET 1" >>confdefs.h fi for ac_header in stddef.h stdlib.h string.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_func in setlocale do : ac_fn_c_check_func "$LINENO" "setlocale" "ac_cv_func_setlocale" if test "x$ac_cv_func_setlocale" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SETLOCALE 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C Library 2.1 or newer" >&5 $as_echo_n "checking whether we are using the GNU C Library 2.1 or newer... " >&6; } if ${ac_cv_gnu_library_2_1+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef __GNU_LIBRARY__ #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1) || (__GLIBC__ > 2) Lucky GNU user #endif #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "Lucky GNU user" >/dev/null 2>&1; then : ac_cv_gnu_library_2_1=yes else ac_cv_gnu_library_2_1=no fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gnu_library_2_1" >&5 $as_echo "$ac_cv_gnu_library_2_1" >&6; } GLIBC21="$ac_cv_gnu_library_2_1" # check additional type sizes # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of size_t" >&5 $as_echo_n "checking size of size_t... " >&6; } if ${ac_cv_sizeof_size_t+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (size_t))" "ac_cv_sizeof_size_t" "$ac_includes_default"; then : else if test "$ac_cv_type_size_t" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (size_t) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_size_t=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_size_t" >&5 $as_echo "$ac_cv_sizeof_size_t" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_SIZE_T $ac_cv_sizeof_size_t _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the appropriate definition for size_t" >&5 $as_echo_n "checking for the appropriate definition for size_t... " >&6; } case $ac_cv_sizeof_size_t in $ac_cv_sizeof_short) glib_size_type=short ;; $ac_cv_sizeof_int) glib_size_type=int ;; $ac_cv_sizeof_long) glib_size_type=long ;; $ac_cv_sizeof_long_long) glib_size_type='long long' ;; $ac_cv_sizeof__int64) glib_size_type='__int64' ;; *) as_fn_error $? "No type matching size_t in size" "$LINENO" 5 ;; esac if test $ac_cv_sizeof_size_t = $ac_cv_sizeof_int && test $ac_cv_sizeof_size_t = $ac_cv_sizeof_long; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined(_AIX) && !defined(__GNUC__) #pragma options langlvl=stdc89 #endif #include int main () { size_t s = 1; unsigned int *size_int = &s; return (int)*size_int; } _ACEOF rm -f conftest.$ac_objext glib_ac_compile_save="$ac_compile" ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext' if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='(if test -s conftest.err; then false ; else true; fi)' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 (eval $ac_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : glib_size_type=int else echo "$as_me: failed program was:" >&5 cat conftest.$ac_ext >&5 cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined(_AIX) && !defined(__GNUC__) #pragma options langlvl=stdc89 #endif #include int main () { size_t s = 1; unsigned long *size_long = &s; return (int)*size_long; } _ACEOF rm -f conftest.$ac_objext glib_ac_compile_save="$ac_compile" ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext' if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='(if test -s conftest.err; then false ; else true; fi)' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 (eval $ac_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : glib_size_type=long else echo "$as_me: failed program was:" >&5 cat conftest.$ac_ext >&5 fi ac_compile="$glib_ac_compile_save" rm -f conftest.$ac_objext conftest.err conftest.$ac_ext fi ac_compile="$glib_ac_compile_save" rm -f conftest.$ac_objext conftest.err conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsigned $glib_size_type" >&5 $as_echo "unsigned $glib_size_type" >&6; } # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of ssize_t" >&5 $as_echo_n "checking size of ssize_t... " >&6; } if ${ac_cv_sizeof_ssize_t+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (ssize_t))" "ac_cv_sizeof_ssize_t" "$ac_includes_default"; then : else if test "$ac_cv_type_ssize_t" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (ssize_t) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_ssize_t=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_ssize_t" >&5 $as_echo "$ac_cv_sizeof_ssize_t" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_SSIZE_T $ac_cv_sizeof_ssize_t _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the appropriate definition for ssize_t" >&5 $as_echo_n "checking for the appropriate definition for ssize_t... " >&6; } 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' ;; *) as_fn_error $? "No type matching ssize_t in size" "$LINENO" 5 ;; esac if test $ac_cv_sizeof_ssize_t = $ac_cv_sizeof_int && test $ac_cv_sizeof_ssize_t = $ac_cv_sizeof_long; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined(_AIX) && !defined(__GNUC__) #pragma options langlvl=stdc89 #endif #include #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif #ifdef HAVE_SYS_TYPES_H # include #endif int main () { ssize_t s = 1; int *size_int = &s; return (int)*size_int; } _ACEOF rm -f conftest.$ac_objext glib_ac_compile_save="$ac_compile" ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext' if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='(if test -s conftest.err; then false ; else true; fi)' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 (eval $ac_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : glib_ssize_type=int else echo "$as_me: failed program was:" >&5 cat conftest.$ac_ext >&5 cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined(_AIX) && !defined(__GNUC__) #pragma options langlvl=stdc89 #endif #include #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif #ifdef HAVE_SYS_TYPES_H # include #endif int main () { ssize_t s = 1; long *size_long = &s; return (int)*size_long; } _ACEOF rm -f conftest.$ac_objext glib_ac_compile_save="$ac_compile" ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext' if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='(if test -s conftest.err; then false ; else true; fi)' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 (eval $ac_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : glib_ssize_type=long else echo "$as_me: failed program was:" >&5 cat conftest.$ac_ext >&5 fi ac_compile="$glib_ac_compile_save" rm -f conftest.$ac_objext conftest.err conftest.$ac_ext fi ac_compile="$glib_ac_compile_save" rm -f conftest.$ac_objext conftest.err conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glib_ssize_type" >&5 $as_echo "$glib_ssize_type" >&6; } # Check for some functions for ac_func in lstat strerror strsignal memmove vsnprintf stpcpy strcasecmp strncasecmp poll getcwd vasprintf setenv unsetenv getc_unlocked readlink symlink fdwalk memmem do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done for ac_func in chown lchmod lchown fchmod fchown link utimes getgrgid getpwuid getresuid do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done for ac_func in getmntent_r setmntent endmntent hasmntopt getfsstat getvfsstat fallocate do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done # Check for high-resolution sleep functions for ac_func in splice do : ac_fn_c_check_func "$LINENO" "splice" "ac_cv_func_splice" if test "x$ac_cv_func_splice" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SPLICE 1 _ACEOF fi done for ac_func in prlimit do : ac_fn_c_check_func "$LINENO" "prlimit" "ac_cv_func_prlimit" if test "x$ac_cv_func_prlimit" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_PRLIMIT 1 _ACEOF fi done # To avoid finding a compatibility unusable statfs, which typically # successfully compiles, but warns to use the newer statvfs interface: if test $ac_cv_header_sys_statvfs_h = yes; then : for ac_func in statvfs do : ac_fn_c_check_func "$LINENO" "statvfs" "ac_cv_func_statvfs" if test "x$ac_cv_func_statvfs" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STATVFS 1 _ACEOF fi done fi if test $ac_cv_header_sys_statfs_h = yes -o $ac_cv_header_sys_mount_h = yes; then : for ac_func in statfs do : ac_fn_c_check_func "$LINENO" "statfs" "ac_cv_func_statfs" if test "x$ac_cv_func_statfs" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STATFS 1 _ACEOF fi done fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to use statfs or statvfs" >&5 $as_echo_n "checking whether to use statfs or statvfs... " >&6; } # Some systems have both statfs and statvfs, pick the most "native" for these if test x$ac_cv_func_statfs = xyes && test x$ac_cv_func_statvfs = xyes; then : # on solaris and irix, statfs doesn't even have the f_bavail field if test x$ac_cv_member_struct_statfs_f_bavail = xno; then : ac_cv_func_statfs=no else # else, at least on linux, statfs is the actual syscall ac_cv_func_statvfs=no fi fi if test x$ac_cv_func_statfs = xyes; then : $as_echo "#define USE_STATFS 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: result: statfs" >&5 $as_echo "statfs" >&6; } elif test x$ac_cv_func_statvfs = xyes; then : $as_echo "#define USE_STATVFS 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: result: statvfs" >&5 $as_echo "statvfs" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: neither" >&5 $as_echo "neither" >&6; } fi for ac_header in crt_externs.h do : ac_fn_c_check_header_mongrel "$LINENO" "crt_externs.h" "ac_cv_header_crt_externs_h" "$ac_includes_default" if test "x$ac_cv_header_crt_externs_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_CRT_EXTERNS_H 1 _ACEOF fi done for ac_func in _NSGetEnviron do : ac_fn_c_check_func "$LINENO" "_NSGetEnviron" "ac_cv_func__NSGetEnviron" if test "x$ac_cv_func__NSGetEnviron" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE__NSGETENVIRON 1 _ACEOF fi done for ac_func in newlocale uselocale strtod_l strtoll_l strtoull_l do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C99 vsnprintf" >&5 $as_echo_n "checking for C99 vsnprintf... " >&6; } if ${ac_cv_func_vsnprintf_c99+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_vsnprintf_c99=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int doit(char * s, ...) { char buffer[32]; va_list args; int r; va_start(args, s); r = vsnprintf(buffer, 5, s, args); va_end(args); if (r != 7) exit(1); /* AIX 5.1 and Solaris seems to have a half-baked vsnprintf() implementation. The above will return 7 but if you replace the size of the buffer with 0, it borks! */ va_start(args, s); r = vsnprintf(buffer, 0, s, args); va_end(args); if (r != 7) exit(1); exit(0); } int main(void) { doit("1234567"); exit(1); } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_vsnprintf_c99=yes else ac_cv_func_vsnprintf_c99=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_vsnprintf_c99" >&5 $as_echo "$ac_cv_func_vsnprintf_c99" >&6; } if test $ac_cv_func_vsnprintf_c99 = yes; then $as_echo "#define HAVE_C99_VSNPRINTF 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether printf supports positional parameters" >&5 $as_echo_n "checking whether printf supports positional parameters... " >&6; } if ${ac_cv_func_printf_unix98+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_printf_unix98=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { char buffer[128]; sprintf (buffer, "%2\$d %3\$d %1\$d", 1, 2, 3); if (strcmp ("2 3 1", buffer) == 0) exit (0); exit (1); } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_printf_unix98=yes else ac_cv_func_printf_unix98=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_printf_unix98" >&5 $as_echo "$ac_cv_func_printf_unix98" >&6; } if test $ac_cv_func_printf_unix98 = yes; then $as_echo "#define HAVE_UNIX98_PRINTF 1" >>confdefs.h fi # Internet address families if test $glib_native_win32 = yes; then glib_inet_includes=" #include " else glib_inet_includes=" #include #include " fi glib_failed=false { $as_echo "$as_me:${as_lineno-$LINENO}: checking value of AF_INET" >&5 $as_echo_n "checking value of AF_INET... " >&6; } if ${glib_cv_value_AF_INET+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "AF_INET" "glib_cv_value_AF_INET" "$glib_inet_includes"; then : else glib_failed=true fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glib_cv_value_AF_INET" >&5 $as_echo "$glib_cv_value_AF_INET" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking value of AF_INET6" >&5 $as_echo_n "checking value of AF_INET6... " >&6; } if ${glib_cv_value_AF_INET6+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "AF_INET6" "glib_cv_value_AF_INET6" "$glib_inet_includes"; then : else glib_failed=true fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glib_cv_value_AF_INET6" >&5 $as_echo "$glib_cv_value_AF_INET6" >&6; } # winsock defines this even though it doesn't support it { $as_echo "$as_me:${as_lineno-$LINENO}: checking value of AF_UNIX" >&5 $as_echo_n "checking value of AF_UNIX... " >&6; } if ${glib_cv_value_AF_UNIX+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "AF_UNIX" "glib_cv_value_AF_UNIX" "$glib_inet_includes"; then : else glib_failed=true fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glib_cv_value_AF_UNIX" >&5 $as_echo "$glib_cv_value_AF_UNIX" >&6; } if $glib_failed ; then as_fn_error $? "Could not determine values for AF_INET* constants" "$LINENO" 5 fi glib_failed=false { $as_echo "$as_me:${as_lineno-$LINENO}: checking value of MSG_PEEK" >&5 $as_echo_n "checking value of MSG_PEEK... " >&6; } if ${glib_cv_value_MSG_PEEK+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "MSG_PEEK" "glib_cv_value_MSG_PEEK" "$glib_inet_includes"; then : else glib_failed=true fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glib_cv_value_MSG_PEEK" >&5 $as_echo "$glib_cv_value_MSG_PEEK" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking value of MSG_OOB" >&5 $as_echo_n "checking value of MSG_OOB... " >&6; } if ${glib_cv_value_MSG_OOB+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "MSG_OOB" "glib_cv_value_MSG_OOB" "$glib_inet_includes"; then : else glib_failed=true fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glib_cv_value_MSG_OOB" >&5 $as_echo "$glib_cv_value_MSG_OOB" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking value of MSG_DONTROUTE" >&5 $as_echo_n "checking value of MSG_DONTROUTE... " >&6; } if ${glib_cv_value_MSG_DONTROUTE+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "MSG_DONTROUTE" "glib_cv_value_MSG_DONTROUTE" "$glib_inet_includes"; then : else glib_failed=true fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glib_cv_value_MSG_DONTROUTE" >&5 $as_echo "$glib_cv_value_MSG_DONTROUTE" >&6; } if $glib_failed ; then as_fn_error $? "Could not determine values for MSG_* constants" "$LINENO" 5 fi for ac_func in getprotobyname_r endservent if_nametoindex if_indextoname do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done if test $glib_native_win32 = yes; then : # 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_fn_c_check_header_mongrel "$LINENO" "wspiapi.h" "ac_cv_header_wspiapi_h" "$ac_includes_default" if test "x$ac_cv_header_wspiapi_h" = xyes; then : WSPIAPI_INCLUDE="#include " fi else # Android does not have C_IN in public headers, we define it wherever necessary if test $glib_native_android != yes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking if arpa/nameser_compat.h is needed" >&5 $as_echo_n "checking if arpa/nameser_compat.h is needed... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { int qclass = C_IN; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { int qclass = C_IN; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } NAMESER_COMPAT_INCLUDE="#include " else as_fn_error $? "could not compile test program either way" "$LINENO" 5 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi # We can't just use AC_CHECK_FUNC/AC_CHECK_LIB here. Bug 586150 NETWORK_LIBS="" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for res_query" >&5 $as_echo_n "checking for res_query... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { res_query("test", 0, 0, (void *)0, 0); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else save_libs="$LIBS" LIBS="-lresolv $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { res_query("test", 0, 0, (void *)0, 0); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: in -lresolv" >&5 $as_echo "in -lresolv" >&6; } NETWORK_LIBS="-lresolv $NETWORK_LIBS" else LIBS="-lbind $save_libs" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { res_query("test", 0, 0, (void *)0, 0); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: in -lbind" >&5 $as_echo "in -lbind" >&6; } NETWORK_LIBS="-lbind $NETWORK_LIBS" else as_fn_error $? "not found" "$LINENO" 5 fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$save_libs" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ac_fn_c_check_func "$LINENO" "socket" "ac_cv_func_socket" if test "x$ac_cv_func_socket" = xyes; then : : else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for socket in -lsocket" >&5 $as_echo_n "checking for socket in -lsocket... " >&6; } if ${ac_cv_lib_socket_socket+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsocket $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char socket (); int main () { return socket (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_socket_socket=yes else ac_cv_lib_socket_socket=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_socket" >&5 $as_echo "$ac_cv_lib_socket_socket" >&6; } if test "x$ac_cv_lib_socket_socket" = xyes; then : NETWORK_LIBS="-lsocket $NETWORK_LIBS" else as_fn_error $? "Could not find socket()" "$LINENO" 5 fi fi save_libs="$LIBS" LIBS="$LIBS $NETWORK_LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for res_init" >&5 $as_echo_n "checking for res_init... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { res_init(); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "#define HAVE_RES_INIT 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$save_libs" fi ac_fn_c_check_header_compile "$LINENO" "linux/netlink.h" "ac_cv_header_linux_netlink_h" "#include " if test "x$ac_cv_header_linux_netlink_h" = xyes; then : $as_echo "#define HAVE_NETLINK 1" >>confdefs.h fi if test "$ac_cv_header_linux_netlink_h" = "yes"; then HAVE_NETLINK_TRUE= HAVE_NETLINK_FALSE='#' else HAVE_NETLINK_TRUE='#' HAVE_NETLINK_FALSE= fi ac_fn_c_check_type "$LINENO" "struct ip_mreqn" "ac_cv_type_struct_ip_mreqn" "#include " if test "x$ac_cv_type_struct_ip_mreqn" = xyes; then : $as_echo "#define HAVE_IP_MREQN /**/" >>confdefs.h fi case $host in *-*-solaris* ) $as_echo "#define _XOPEN_SOURCE_EXTENDED 1" >>confdefs.h $as_echo "#define _XOPEN_SOURCE 2" >>confdefs.h $as_echo "#define __EXTENSIONS__ 1" >>confdefs.h ;; esac if test "$ac_cv_func_statfs" = yes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking number of arguments to statfs()" >&5 $as_echo_n "checking number of arguments to statfs()... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef HAVE_SYS_PARAM_H #include #endif #ifdef HAVE_SYS_VFS_H #include #endif #ifdef HAVE_SYS_MOUNT_H #include #endif #ifdef HAVE_SYS_STATFS_H #include #endif int main () { struct statfs st; statfs(NULL, &st); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: 2" >&5 $as_echo "2" >&6; } $as_echo "#define STATFS_ARGS 2" >>confdefs.h else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef HAVE_SYS_PARAM_H #include #endif #ifdef HAVE_SYS_VFS_H #include #endif #ifdef HAVE_SYS_MOUNT_H #include #endif #ifdef HAVE_SYS_STATFS_H #include #endif int main () { struct statfs st; statfs(NULL, &st, sizeof (st), 0); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: 4" >&5 $as_echo "4" >&6; } $as_echo "#define STATFS_ARGS 4" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: result: unknown" >&5 $as_echo "unknown" >&6; } as_fn_error $? "unable to determine number of arguments to statfs()" "$LINENO" 5 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi # # Check whether to use an included printf # # Check whether --enable-included-printf was given. if test "${enable_included_printf+set}" = set; then : enableval=$enable_included_printf; enable_included_printf="$enableval" fi need_included_printf=no if test "x$enable_included_printf" = "xyes" ; then need_included_printf=yes fi if test "$ac_cv_func_vsnprintf_c99" != "yes" ; then need_included_printf=yes fi if test "$ac_cv_func_printf_unix98" != "yes" ; then need_included_printf=yes fi if test "x$ac_cv_sizeof_long_long" = "x8" && test -z "$glib_cv_long_long_format" ; then need_included_printf=yes fi if test "x$enable_included_printf" = "xno" && test "x$need_included_printf" = "xyes" ; then as_fn_error $? " *** Your C library's printf doesn't appear to have the features that *** GLib needs, but you specified --enable-included-printf=no." "$LINENO" 5 fi enable_included_printf=$need_included_printf if test "$enable_included_printf" != "yes"; then HAVE_GOOD_PRINTF_TRUE= HAVE_GOOD_PRINTF_FALSE='#' else HAVE_GOOD_PRINTF_TRUE='#' HAVE_GOOD_PRINTF_FALSE= fi if test "$enable_included_printf" != "yes"; then : $as_echo "#define HAVE_GOOD_PRINTF 1" >>confdefs.h else if test -z "$glib_cv_long_long_format" ; then glib_cv_long_long_format="ll" fi $as_echo "#define HAVE_VASPRINTF 1" >>confdefs.h fi # Checks needed for gnulib vasnprintf { $as_echo "$as_me:${as_lineno-$LINENO}: checking for signed" >&5 $as_echo_n "checking for signed... " >&6; } if ${bh_cv_c_signed+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { signed char x; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : bh_cv_c_signed=yes else bh_cv_c_signed=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $bh_cv_c_signed" >&5 $as_echo "$bh_cv_c_signed" >&6; } if test $bh_cv_c_signed = no; then $as_echo "#define signed /**/" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for long long" >&5 $as_echo_n "checking for long long... " >&6; } if ${ac_cv_type_long_long+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ long long ll = 1LL; int i = 63; int main () { long long llmax = (long long) -1; return ll << i | ll >> i | llmax / ll | llmax % ll; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_type_long_long=yes else ac_cv_type_long_long=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_long_long" >&5 $as_echo "$ac_cv_type_long_long" >&6; } if test $ac_cv_type_long_long = yes; then $as_echo "#define HAVE_LONG_LONG 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for long double" >&5 $as_echo_n "checking for long double... " >&6; } if ${gt_cv_c_long_double+:} false; then : $as_echo_n "(cached) " >&6 else if test "$GCC" = yes; then gt_cv_c_long_double=yes else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* The Stardent Vistra knows sizeof(long double), but does not support it. */ long double foo = 0.0; /* On Ultrix 4.3 cc, long double is 4 and double is 8. */ int array [2*(sizeof(long double) >= sizeof(double)) - 1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gt_cv_c_long_double=yes else gt_cv_c_long_double=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_c_long_double" >&5 $as_echo "$gt_cv_c_long_double" >&6; } if test $gt_cv_c_long_double = yes; then $as_echo "#define HAVE_LONG_DOUBLE 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wchar_t" >&5 $as_echo_n "checking for wchar_t... " >&6; } if ${gt_cv_c_wchar_t+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include wchar_t foo = (wchar_t)'\0'; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gt_cv_c_wchar_t=yes else gt_cv_c_wchar_t=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_c_wchar_t" >&5 $as_echo "$gt_cv_c_wchar_t" >&6; } if test $gt_cv_c_wchar_t = yes; then $as_echo "#define HAVE_WCHAR_T 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wint_t" >&5 $as_echo_n "checking for wint_t... " >&6; } if ${gt_cv_c_wint_t+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include wint_t foo = (wchar_t)'\0'; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gt_cv_c_wint_t=yes else gt_cv_c_wint_t=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_c_wint_t" >&5 $as_echo "$gt_cv_c_wint_t" >&6; } if test $gt_cv_c_wint_t = yes; then $as_echo "#define HAVE_WINT_T 1" >>confdefs.h fi ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" if test "x$ac_cv_type_size_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define size_t unsigned int _ACEOF fi ac_fn_c_check_type "$LINENO" "ptrdiff_t" "ac_cv_type_ptrdiff_t" "$ac_includes_default" if test "x$ac_cv_type_ptrdiff_t" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_PTRDIFF_T 1 _ACEOF fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inttypes.h" >&5 $as_echo_n "checking for inttypes.h... " >&6; } if ${jm_ac_cv_header_inttypes_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { uintmax_t i = (uintmax_t) -1; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : jm_ac_cv_header_inttypes_h=yes else jm_ac_cv_header_inttypes_h=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $jm_ac_cv_header_inttypes_h" >&5 $as_echo "$jm_ac_cv_header_inttypes_h" >&6; } if test $jm_ac_cv_header_inttypes_h = yes; then cat >>confdefs.h <<_ACEOF #define HAVE_INTTYPES_H_WITH_UINTMAX 1 _ACEOF fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdint.h" >&5 $as_echo_n "checking for stdint.h... " >&6; } if ${jm_ac_cv_header_stdint_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { uintmax_t i = (uintmax_t) -1; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : jm_ac_cv_header_stdint_h=yes else jm_ac_cv_header_stdint_h=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $jm_ac_cv_header_stdint_h" >&5 $as_echo "$jm_ac_cv_header_stdint_h" >&6; } if test $jm_ac_cv_header_stdint_h = yes; then cat >>confdefs.h <<_ACEOF #define HAVE_STDINT_H_WITH_UINTMAX 1 _ACEOF fi if test $jm_ac_cv_header_inttypes_h = no && test $jm_ac_cv_header_stdint_h = no; then test $ac_cv_type_long_long = yes \ && ac_type='long long' \ || ac_type='long' cat >>confdefs.h <<_ACEOF #define intmax_t $ac_type _ACEOF else $as_echo "#define HAVE_INTMAX_T 1" >>confdefs.h fi for ac_func in snprintf wcslen do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C99 snprintf" >&5 $as_echo_n "checking for C99 snprintf... " >&6; } if ${ac_cv_func_snprintf_c99+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_snprintf_c99=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int doit() { char buffer[32]; va_list args; int r; r = snprintf(buffer, 5, "1234567"); if (r != 7) exit(1); r = snprintf(buffer, 0, "1234567"); if (r != 7) exit(1); r = snprintf(NULL, 0, "1234567"); if (r != 7) exit(1); exit(0); } int main(void) { doit(); exit(1); } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_snprintf_c99=yes else ac_cv_func_snprintf_c99=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_snprintf_c99" >&5 $as_echo "$ac_cv_func_snprintf_c99" >&6; } if test $ac_cv_func_snprintf_c99 = yes; then $as_echo "#define HAVE_C99_SNPRINTF 1" >>confdefs.h fi # 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_echo "$as_me:${as_lineno-$LINENO}: checking whether bcopy can handle overlapping copies" >&5 $as_echo_n "checking whether bcopy can handle overlapping copies... " >&6; } if ${glib_cv_working_bcopy+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run test program while cross compiling See \`config.log' for more details" "$LINENO" 5; } else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main() { char buf[128], abc[128], *b; int len, off, align; bcopy("abcdefghijklmnopqrstuvwxyz0123456789", abc, 36); for (align = 7; align >= 0; align--) { for (len = 36; len; len--) { b = buf+align; bcopy(abc, b, len); for (off = 1; off <= len; off++) { bcopy(b, b+off, len); bcopy(b+off, b, len); if (bcmp(b, abc, len)) return(1); } } } return(0); } _ACEOF if ac_fn_c_try_run "$LINENO"; then : glib_cv_working_bcopy=yes else glib_cv_working_bcopy=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glib_cv_working_bcopy" >&5 $as_echo "$glib_cv_working_bcopy" >&6; } if test "x${glib_cv_working_bcopy+set}" != "xset" ; then as_fn_error $? "glib_cv_working_bcopy must be set in cache file when cross-compiling." "$LINENO" 5 fi if test "$glib_cv_working_bcopy" = "yes"; then $as_echo "#define HAVE_WORKING_BCOPY 1" >>confdefs.h fi fi # Check if needs to be included for fd_set { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fd_set" >&5 $as_echo_n "checking for fd_set... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { fd_set readMask, writeMask; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gtk_ok=yes else gtk_ok=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test "$gtk_ok" = "yes"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes, found in sys/types.h" >&5 $as_echo "yes, found in sys/types.h" >&6; } else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "fd_set" >/dev/null 2>&1; then : gtk_ok=yes fi rm -f conftest* if test "$gtk_ok" = "yes"; then # *** FIXME: give it a different name $as_echo "#define HAVE_SYS_SELECT_H 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes, found in sys/select.h" >&5 $as_echo "yes, found in sys/select.h" >&6; } else $as_echo "#define NO_FD_SET 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for nl_langinfo (CODESET)" >&5 $as_echo_n "checking for nl_langinfo (CODESET)... " >&6; } if ${glib_cv_langinfo_codeset+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { char *codeset = nl_langinfo (CODESET); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : glib_cv_langinfo_codeset=yes else glib_cv_langinfo_codeset=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glib_cv_langinfo_codeset" >&5 $as_echo "$glib_cv_langinfo_codeset" >&6; } if test x$glib_cv_langinfo_codeset = xyes; then $as_echo "#define HAVE_CODESET 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for nl_langinfo (PM_STR)" >&5 $as_echo_n "checking for nl_langinfo (PM_STR)... " >&6; } if ${glib_cv_langinfo_time+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { char *str; str = nl_langinfo (PM_STR); str = nl_langinfo (D_T_FMT); str = nl_langinfo (D_FMT); str = nl_langinfo (T_FMT); str = nl_langinfo (T_FMT_AMPM); str = nl_langinfo (MON_1); str = nl_langinfo (ABMON_12); str = nl_langinfo (DAY_1); str = nl_langinfo (ABDAY_7); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : glib_cv_langinfo_time=yes else glib_cv_langinfo_time=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glib_cv_langinfo_time" >&5 $as_echo "$glib_cv_langinfo_time" >&6; } if test x$glib_cv_langinfo_time = xyes; then $as_echo "#define HAVE_LANGINFO_TIME 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for nl_langinfo (_NL_CTYPE_OUTDIGITn_MB)" >&5 $as_echo_n "checking for nl_langinfo (_NL_CTYPE_OUTDIGITn_MB)... " >&6; } if ${glib_cv_langinfo_outdigit+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { char *str; str = nl_langinfo (_NL_CTYPE_OUTDIGIT0_MB); str = nl_langinfo (_NL_CTYPE_OUTDIGIT1_MB); str = nl_langinfo (_NL_CTYPE_OUTDIGIT2_MB); str = nl_langinfo (_NL_CTYPE_OUTDIGIT3_MB); str = nl_langinfo (_NL_CTYPE_OUTDIGIT4_MB); str = nl_langinfo (_NL_CTYPE_OUTDIGIT5_MB); 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); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : glib_cv_langinfo_outdigit=yes else glib_cv_langinfo_outdigit=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glib_cv_langinfo_outdigit" >&5 $as_echo "$glib_cv_langinfo_outdigit" >&6; } if test x$glib_cv_langinfo_outdigit = xyes; then $as_echo "#define HAVE_LANGINFO_OUTDIGIT 1" >>confdefs.h fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a compliant posix_memalign() implementation" >&5 $as_echo_n "checking for a compliant posix_memalign() implementation... " >&6; } if ${glib_cv_compliant_posix_memalign+:} false; then : $as_echo_n "(cached) " >&6 else glib_cv_compliant_posix_memalign=0 if test "$ac_cv_func_posix_memalign" = "yes" ; then if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _XOPEN_SOURCE 600 #include /* posix_memalign() should be defined here */ /* some systems break if #include used */ static void test_memalign (size_t boundary, size_t size) { void *mem = 0; if (posix_memalign (&mem, boundary, size) != 0 || !mem) exit (1); else free (mem); } int main() { test_memalign ( 128, 128 - 2 * sizeof (void*)); test_memalign ( 256, 256 - 2 * sizeof (void*)); test_memalign ( 512, 512 - 2 * sizeof (void*)); test_memalign ( 1024, 1024 - 2 * sizeof (void*)); test_memalign ( 2048, 2048 - 2 * sizeof (void*)); test_memalign ( 4096, 4096 - 2 * sizeof (void*)); test_memalign ( 8192, 8192 - 2 * sizeof (void*)); test_memalign (16384, 16384 - 2 * sizeof (void*)); test_memalign (32768, 32768 - 2 * sizeof (void*)); exit (0); /* success */ } _ACEOF if ac_fn_c_try_run "$LINENO"; then : glib_cv_compliant_posix_memalign=1 fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi : fi fi if test "$glib_cv_compliant_posix_memalign" = "1"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "#define POSIX_MEMALIGN_WITH_COMPLIANT_ALLOCS 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Check for strlcpy { $as_echo "$as_me:${as_lineno-$LINENO}: checking for OpenBSD strlcpy/strlcat" >&5 $as_echo_n "checking for OpenBSD strlcpy/strlcat... " >&6; } if ${glib_cv_have_strlcpy+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : glib_cv_have_strlcpy=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main() { char p[10]; (void) strlcpy (p, "hi", 10); if (strlcat (p, "bye", 0) != 3) return 1; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : glib_cv_have_strlcpy=yes else glib_cv_have_strlcpy=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glib_cv_have_strlcpy" >&5 $as_echo "$glib_cv_have_strlcpy" >&6; } if test "$glib_cv_have_strlcpy" = "yes"; then $as_echo "#define HAVE_STRLCPY 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for an implementation of va_copy()" >&5 $as_echo_n "checking for an implementation of va_copy()... " >&6; } if ${glib_cv_va_copy+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include void f (int i, ...) { va_list args1, args2; va_start (args1, i); va_copy (args2, args1); if (va_arg (args2, int) != 42 || va_arg (args1, int) != 42) exit (1); va_end (args1); va_end (args2); } int main() { f (0, 42); return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : glib_cv_va_copy=yes else glib_cv_va_copy=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glib_cv_va_copy" >&5 $as_echo "$glib_cv_va_copy" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for an implementation of __va_copy()" >&5 $as_echo_n "checking for an implementation of __va_copy()... " >&6; } if ${glib_cv___va_copy+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include void f (int i, ...) { va_list args1, args2; va_start (args1, i); __va_copy (args2, args1); if (va_arg (args2, int) != 42 || va_arg (args1, int) != 42) exit (1); va_end (args1); va_end (args2); } int main() { f (0, 42); return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : glib_cv___va_copy=yes else glib_cv___va_copy=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glib_cv___va_copy" >&5 $as_echo "$glib_cv___va_copy" >&6; } if test "x$glib_cv_va_copy" = "xyes"; then g_va_copy_func=va_copy else if test "x$glib_cv___va_copy" = "xyes"; then g_va_copy_func=__va_copy fi fi if test -n "$g_va_copy_func"; then cat >>confdefs.h <<_ACEOF #define G_VA_COPY $g_va_copy_func _ACEOF fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether va_lists can be copied by value" >&5 $as_echo_n "checking whether va_lists can be copied by value... " >&6; } if ${glib_cv_va_val_copy+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : glib_cv_va_val_copy=yes else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include void f (int i, ...) { va_list args1, args2; va_start (args1, i); args2 = args1; if (va_arg (args2, int) != 42 || va_arg (args1, int) != 42) exit (1); va_end (args1); va_end (args2); } int main() { f (0, 42); return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : glib_cv_va_val_copy=yes else glib_cv_va_val_copy=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glib_cv_va_val_copy" >&5 $as_echo "$glib_cv_va_val_copy" >&6; } if test "x$glib_cv_va_val_copy" = "xno"; then : $as_echo "#define G_VA_COPY_AS_ARRAY 1" >>confdefs.h fi G_MODULE_LIBS= G_MODULE_LIBS_EXTRA= G_MODULE_PLUGIN_LIBS= if test x"$glib_native_win32" = xyes; then G_MODULE_LDFLAGS= else export SED G_MODULE_LDFLAGS=`(./libtool --config; echo eval echo \\$export_dynamic_flag_spec) | sh` fi G_MODULE_NEED_USCORE=0 G_MODULE_BROKEN_RTLD_GLOBAL=0 G_MODULE_HAVE_DLERROR=0 if test -z "$G_MODULE_IMPL"; then case "$host" in *-*-mingw*|*-*-cygwin*) G_MODULE_IMPL=G_MODULE_IMPL_WIN32 ;; esac fi if test -z "$G_MODULE_IMPL"; then case "$host" in *-*-aix*) G_MODULE_IMPL=G_MODULE_IMPL_AR ;; esac fi if test -z "$G_MODULE_IMPL"; then : ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" if test "x$ac_cv_func_dlopen" = xyes; then : ac_fn_c_check_func "$LINENO" "dlsym" "ac_cv_func_dlsym" if test "x$ac_cv_func_dlsym" = xyes; then : G_MODULE_IMPL=G_MODULE_IMPL_DL fi fi fi if test -z "$G_MODULE_IMPL" && test "x$glib_native_beos" = "xyes"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for load_image in -lroot" >&5 $as_echo_n "checking for load_image in -lroot... " >&6; } if ${ac_cv_lib_root_load_image+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lroot $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char load_image (); int main () { return load_image (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_root_load_image=yes else ac_cv_lib_root_load_image=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_root_load_image" >&5 $as_echo "$ac_cv_lib_root_load_image" >&6; } if test "x$ac_cv_lib_root_load_image" = xyes; then : 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 fi if test -z "$G_MODULE_IMPL" ; then : ac_fn_c_check_func "$LINENO" "NSLinkModule" "ac_cv_func_NSLinkModule" if test "x$ac_cv_func_NSLinkModule" = xyes; then : G_MODULE_IMPL=G_MODULE_IMPL_DYLD G_MODULE_NEED_USCORE=1 fi fi if test -z "$G_MODULE_IMPL"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlsym in -ldl" >&5 $as_echo_n "checking for dlsym in -ldl... " >&6; } if ${ac_cv_lib_dl_dlsym+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlsym (); int main () { return dlsym (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlsym=yes else ac_cv_lib_dl_dlsym=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlsym" >&5 $as_echo "$ac_cv_lib_dl_dlsym" >&6; } if test "x$ac_cv_lib_dl_dlsym" = xyes; then : G_MODULE_LIBS=-ldl G_MODULE_IMPL=G_MODULE_IMPL_DL fi fi fi if test -z "$G_MODULE_IMPL"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 $as_echo_n "checking for shl_load in -ldld... " >&6; } if ${ac_cv_lib_dld_shl_load+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char shl_load (); int main () { return shl_load (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_shl_load=yes else ac_cv_lib_dld_shl_load=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 $as_echo "$ac_cv_lib_dld_shl_load" >&6; } if test "x$ac_cv_lib_dld_shl_load" = xyes; then : G_MODULE_LIBS=-ldld G_MODULE_IMPL=G_MODULE_IMPL_DLD fi fi if test "$G_MODULE_IMPL" = "G_MODULE_IMPL_DL" ; then : LIBS_orig="$LIBS" LDFLAGS_orig="$LDFLAGS" LIBS="$G_MODULE_LIBS $LIBS" LDFLAGS="$LDFLAGS $G_MODULE_LDFLAGS" echo "void glib_plugin_test(void) { }" > plugin.c ${SHELL} ./libtool --mode=compile --tag=CC ${CC} ${CFLAGS} \ ${CPPFLAGS} -c -o plugin.lo plugin.c >/dev/null 2>&1 ${SHELL} ./libtool --mode=link --tag=CC ${CC} ${CFLAGS} \ ${LDFLAGS} -module -o plugin.la -export-dynamic \ -shrext ".o" -avoid-version plugin.lo \ -rpath /dont/care >/dev/null 2>&1 eval `./libtool --config | grep ^objdir` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for RTLD_GLOBAL brokenness" >&5 $as_echo_n "checking for RTLD_GLOBAL brokenness... " >&6; } if ${glib_cv_rtldglobal_broken+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : glib_cv_rtldglobal_broken=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifndef RTLD_GLOBAL # define RTLD_GLOBAL 0 #endif #ifndef RTLD_LAZY # define RTLD_LAZY 0 #endif int glib_plugin_test; int main () { void *handle, *global, *local; global = &glib_plugin_test; handle = dlopen ("./$objdir/plugin.o", RTLD_GLOBAL | RTLD_LAZY); if (!handle) return 0; local = dlsym (handle, "glib_plugin_test"); return global == local; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : glib_cv_rtldglobal_broken=no else glib_cv_rtldglobal_broken=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f plugin.c plugin.o plugin.lo plugin.la ${objdir}/plugin.* rmdir ${objdir} 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glib_cv_rtldglobal_broken" >&5 $as_echo "$glib_cv_rtldglobal_broken" >&6; } if test "x$glib_cv_rtldglobal_broken" = "xyes"; then G_MODULE_BROKEN_RTLD_GLOBAL=1 else G_MODULE_BROKEN_RTLD_GLOBAL=0 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for preceeding underscore in symbols" >&5 $as_echo_n "checking for preceeding underscore in symbols... " >&6; } if ${glib_cv_uscore+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run test program while cross compiling See \`config.log' for more details" "$LINENO" 5; } else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int glib_underscore_test (void) { return 42; } int main() { void *f1 = (void*)0, *f2 = (void*)0, *handle; handle = dlopen ((void*)0, 0); if (handle) { f1 = dlsym (handle, "glib_underscore_test"); f2 = dlsym (handle, "_glib_underscore_test"); } return (!f2 || f1); } _ACEOF if ac_fn_c_try_run "$LINENO"; then : glib_cv_uscore=yes else glib_cv_uscore=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f plugin.c plugin.$ac_objext plugin.lo fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glib_cv_uscore" >&5 $as_echo "$glib_cv_uscore" >&6; } if test "x${glib_cv_uscore+set}" != "xset" ; then as_fn_error $? "glib_cv_uscore must be set in cache file when cross-compiling." "$LINENO" 5 fi if test "x$glib_cv_uscore" = "xyes"; then G_MODULE_NEED_USCORE=1 else G_MODULE_NEED_USCORE=0 fi LDFLAGS="$LDFLAGS_orig" ac_fn_c_check_func "$LINENO" "dlerror" "ac_cv_func_dlerror" if test "x$ac_cv_func_dlerror" = xyes; then : G_MODULE_HAVE_DLERROR=1 else G_MODULE_HAVE_DLERROR=0 fi LIBS="$LIBS_orig" fi if test -z "$G_MODULE_IMPL"; then G_MODULE_IMPL=0 G_MODULE_SUPPORTED=false else G_MODULE_SUPPORTED=true fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the suffix of module shared libraries" >&5 $as_echo_n "checking for the suffix of module shared libraries... " >&6; } export SED shrext_cmds=`./libtool --config | grep '^shrext_cmds='` eval $shrext_cmds module=yes eval std_shrext=$shrext_cmds # chop the initial dot glib_gmodule_suffix=`echo $std_shrext | sed 's/^\.//'` { $as_echo "$as_me:${as_lineno-$LINENO}: result: .$glib_gmodule_suffix" >&5 $as_echo ".$glib_gmodule_suffix" >&6; } # any reason it may fail? if test "x$glib_gmodule_suffix" = x; then as_fn_error $? "Cannot determine shared library suffix from libtool" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gspawn implementation" >&5 $as_echo_n "checking for gspawn implementation... " >&6; } case "$host" in *-*-mingw*) GSPAWN=gspawn-win32.lo ;; *) GSPAWN=gspawn.lo ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GSPAWN" >&5 $as_echo "$GSPAWN" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GIOChannel implementation" >&5 $as_echo_n "checking for GIOChannel implementation... " >&6; } case "$host" in *-*-mingw*) GIO=giowin32.lo ;; *) GIO=giounix.lo ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GIO" >&5 $as_echo "$GIO" >&6; } # Check whether --with-gio-module-dir was given. if test "${with_gio_module_dir+set}" = set; then : withval=$with_gio_module_dir; else with_gio_module_dir='${libdir}/gio/modules' fi GIO_MODULE_DIR=$with_gio_module_dir inotify_support=no for ac_header in sys/inotify.h do : ac_fn_c_check_header_mongrel "$LINENO" "sys/inotify.h" "ac_cv_header_sys_inotify_h" "$ac_includes_default" if test "x$ac_cv_header_sys_inotify_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SYS_INOTIFY_H 1 _ACEOF inotify_support=yes for ac_func in inotify_init1 do : ac_fn_c_check_func "$LINENO" "inotify_init1" "ac_cv_func_inotify_init1" if test "x$ac_cv_func_inotify_init1" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_INOTIFY_INIT1 1 _ACEOF fi done fi done if test "$inotify_support" = "yes"; then HAVE_INOTIFY_TRUE= HAVE_INOTIFY_FALSE='#' else HAVE_INOTIFY_TRUE='#' HAVE_INOTIFY_FALSE= fi kqueue_support=no for ac_header in sys/event.h do : ac_fn_c_check_header_mongrel "$LINENO" "sys/event.h" "ac_cv_header_sys_event_h" "$ac_includes_default" if test "x$ac_cv_header_sys_event_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SYS_EVENT_H 1 _ACEOF for ac_func in kqueue kevent do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF kqueue_support=yes fi done fi done if test "$kqueue_support" = "yes"; then HAVE_KQUEUE_TRUE= HAVE_KQUEUE_FALSE='#' else HAVE_KQUEUE_TRUE='#' HAVE_KQUEUE_FALSE= fi fen_support=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifndef PORT_SOURCE_FILE #error "Please upgrade to Nevada 72 or above to suppoert FEN" #endif int main() { return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : fen_support=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test "$fen_support" = "yes"; then HAVE_FEN_TRUE= HAVE_FEN_FALSE='#' else HAVE_FEN_TRUE='#' HAVE_FEN_FALSE= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for platform-dependent source" >&5 $as_echo_n "checking for platform-dependent source... " >&6; } case "$host" in *-*-cygwin*|*-*-mingw*) PLATFORMDEP=gwin32.lo ;; *) PLATFORMDEP= ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PLATFORMDEP" >&5 $as_echo "$PLATFORMDEP" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to compile timeloop" >&5 $as_echo_n "checking whether to compile timeloop... " >&6; } case "$host" in *-*-cygwin*|*-*-mingw*|*-*-minix) enable_timeloop=no ;; *) enable_timeloop=yes ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_timeloop" >&5 $as_echo "$enable_timeloop" >&6; } if test x$enable_timeloop = xyes; then ENABLE_TIMELOOP_TRUE= ENABLE_TIMELOOP_FALSE='#' else ENABLE_TIMELOOP_TRUE='#' ENABLE_TIMELOOP_FALSE= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if building for some Win32 platform" >&5 $as_echo_n "checking if building for some Win32 platform... " >&6; } case "$host" in *-*-mingw*|*-*-cygwin*) platform_win32=yes ;; *) platform_win32=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $platform_win32" >&5 $as_echo "$platform_win32" >&6; } if test x$platform_win32 = xyes; then PLATFORM_WIN32_TRUE= PLATFORM_WIN32_FALSE='#' else PLATFORM_WIN32_TRUE='#' PLATFORM_WIN32_FALSE= fi # Check whether --with-threads was given. if test "${with_threads+set}" = set; then : withval=$with_threads; else with_threads=yes fi THREAD_NO_IMPLEMENTATION="No thread implementation found." FLAG_DOES_NOT_WORK="I can't find the MACRO to enable thread safety on your platform (normally it's "_REENTRANT"). I'll not use any flag on compilation now, but then your programs might not work. Please provide information on how it is done on your system." LIBS_NOT_FOUND_1="I can't find the libraries for the thread implementation " LIBS_NOT_FOUND_2=". Please choose another thread implementation or provide information on your thread implementation." FUNC_NO_GETPWUID_R="the 'g_get_(user_name|real_name|home_dir|tmp_dir)' functions will not be MT-safe during their first call because there is no working 'getpwuid_r' on your system." FUNC_NO_LOCALTIME_R="the 'g_date_set_time' function will not be MT-safe because there is no 'localtime_r' on your system." AIX_COMPILE_INFO="AIX's C compiler needs to be called by a different name, when linking threaded applications. As GLib cannot do that automatically, you will get an linkg error everytime you are not using the right compiler. In that case you have to relink with the right compiler. Ususally just '_r' is appended to the compiler name." { $as_echo "$as_me:${as_lineno-$LINENO}: checking for thread implementation" >&5 $as_echo_n "checking for thread implementation... " >&6; } have_threads=no if test "x$with_threads" = xyes || test "x$with_threads" = xposix; then : # -D_POSIX4_DRAFT_SOURCE -D_POSIX4A_DRAFT10_SOURCE is for DG/UX # -U_OSF_SOURCE is for Digital UNIX 4.0d GTHREAD_COMPILE_IMPL_DEFINES="-D_POSIX4_DRAFT_SOURCE -D_POSIX4A_DRAFT10_SOURCE -U_OSF_SOURCE" glib_save_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $GTHREAD_COMPILE_IMPL_DEFINES" if test "x$have_threads" = xno; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : have_threads=posix fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi # Tru64Unix requires -pthread to find pthread.h. See #103020 CPPFLAGS="$CPPFLAGS -pthread" if test "x$have_threads" = xno; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : have_threads=posix fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi CPPFLAGS="$glib_save_CPPFLAGS" fi if test "x$with_threads" = xyes || test "x$with_threads" = xwin32; then case $host in *-*-mingw*) have_threads=win32 ;; esac fi if test "x$have_threads" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: none available" >&5 $as_echo "none available" >&6; } as_fn_error $? "$THREAD_NO_IMPLEMENTATION" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_threads" >&5 $as_echo "$have_threads" >&6; } fi G_THREAD_LIBS= G_THREAD_LIBS_EXTRA= G_THREAD_CFLAGS= if test x"$have_threads" = xposix; then : # First we test for posix, whether -pthread or -pthreads do the trick as # both CPPFLAG and LIBS. # One of them does for most gcc versions and some other platforms/compilers # too and could be considered as the canonical way to go. case $host in *-*-cygwin*|*-*-darwin*) # skip cygwin and darwin -pthread or -pthreads test ;; *-solaris*) # These compiler/linker flags work with both Sun Studio and gcc # Sun Studio expands -mt to -D_REENTRANT and -lthread # gcc expands -pthreads to -D_REENTRANT -D_PTHREADS -lpthread G_THREAD_CFLAGS="-D_REENTRANT -D_PTHREADS" G_THREAD_LIBS="-lpthread -lthread" ;; *) for flag in pthread pthreads mt; do glib_save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -$flag" if test "$cross_compiling" = yes; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int check_me = 0; void* func(void* data) {check_me = 42; return &check_me;} int main() { pthread_t t; void *ret; pthread_create (&t, 0, func, 0); pthread_join (t, &ret); return (check_me != 42 || ret != &check_me); } _ACEOF if ac_fn_c_try_link "$LINENO"; then : glib_flag_works=yes else glib_flag_works=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int check_me = 0; void* func(void* data) {check_me = 42; return &check_me;} int main() { pthread_t t; void *ret; pthread_create (&t, 0, func, 0); pthread_join (t, &ret); return (check_me != 42 || ret != &check_me); } _ACEOF if ac_fn_c_try_run "$LINENO"; then : glib_flag_works=yes else glib_flag_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi CFLAGS="$glib_save_CFLAGS" if test $glib_flag_works = yes ; then G_THREAD_CFLAGS=-$flag G_THREAD_LIBS=-$flag break; fi done ;; esac fi if test x"$G_THREAD_CFLAGS" = x; then : # The canonical -pthread[s] does not work. Try something different. case $host in *-aix*) if test x"$GCC" = xyes; then # GCC 3.0 and above needs -pthread. # Should be coverd by the case above. # GCC 2.x and below needs -mthreads G_THREAD_CFLAGS="-mthreads" G_THREAD_LIBS=$G_THREAD_CFLAGS else # We are probably using the aix compiler. Normaly a # program would have to be compiled with the _r variant # of the corresponding compiler, but we as GLib cannot # do that: but the good news is that for compiling the # only difference is the added -D_THREAD_SAFE compile # option. This is according to the "C for AIX User's # Guide". G_THREAD_CFLAGS="-D_THREAD_SAFE" fi ;; *-dg-dgux*) # DG/UX G_THREAD_CFLAGS="-D_REENTRANT -D_POSIX4A_DRAFT10_SOURCE" ;; *-sysv5uw7*) # UnixWare 7 # We are not using gcc with -pthread. Catched above. G_THREAD_CFLAGS="-Kthread" G_THREAD_LIBS=$G_THREAD_CFLAGS ;; *-mingw*) # No flag needed when using MSVCRT.DLL G_THREAD_CFLAGS="" ;; *) G_THREAD_CFLAGS="-D_REENTRANT" # good default guess otherwise ;; esac fi # if we are not finding the localtime_r function, then we probably are # not using the proper multithread flag glib_save_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $G_THREAD_CFLAGS" # First we test, whether localtime_r is declared in time.h # directly. Then we test whether a macro localtime_r exists, in # which case localtime_r in the test program is replaced and thus # if we still find localtime_r in the output, it is not defined as # a macro. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "[^a-zA-Z1-9_]localtime_r[^a-zA-Z1-9_]" >/dev/null 2>&1; then : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include localtime_r(a,b) _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "[^a-zA-Z1-9_]localtime_r[^a-zA-Z1-9_]" >/dev/null 2>&1; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $FLAG_DOES_NOT_WORK" >&5 $as_echo "$as_me: WARNING: $FLAG_DOES_NOT_WORK" >&2;} fi rm -f conftest* fi rm -f conftest* CPPFLAGS="$glib_save_CPPFLAGS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking thread related cflags" >&5 $as_echo_n "checking thread related cflags... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $G_THREAD_CFLAGS" >&5 $as_echo "$G_THREAD_CFLAGS" >&6; } CPPFLAGS="$CPPFLAGS $G_THREAD_CFLAGS" if test x$have_threads = xposix; then : glib_save_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $GTHREAD_COMPILE_IMPL_DEFINES" if test x"$G_THREAD_LIBS" = x ; then : case $host in *-aix*) # We are not using gcc (would have set G_THREAD_LIBS) and thus # probably using the aix compiler. { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $AIX_COMPILE_INFO" >&5 $as_echo "$as_me: WARNING: $AIX_COMPILE_INFO" >&2;} ;; *) G_THREAD_LIBS=error glib_save_LIBS="$LIBS" for thread_lib in "" pthread pthread32 pthreads thread; do if test x"$thread_lib" = x; then add_thread_lib="" IN="" else add_thread_lib="-l$thread_lib" IN=" in -l$thread_lib" fi if test x"$have_threads" = xposix; then defattr=0 else defattr=pthread_attr_default fi LIBS="$add_thread_lib $glib_save_LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_create/pthread_join$IN" >&5 $as_echo_n "checking for pthread_create/pthread_join$IN... " >&6; } if test "$cross_compiling" = yes; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int check_me = 0; void* func(void* data) {check_me = 42; return &check_me;} int main() { pthread_t t; void *ret; pthread_create (&t, $defattr, func, 0); pthread_join (t, &ret); return (check_me != 42 || ret != &check_me); } _ACEOF if ac_fn_c_try_link "$LINENO"; then : glib_result=yes else glib_result=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int check_me = 0; void* func(void* data) {check_me = 42; return &check_me;} int main() { pthread_t t; void *ret; pthread_create (&t, $defattr, func, 0); pthread_join (t, &ret); return (check_me != 42 || ret != &check_me); } _ACEOF if ac_fn_c_try_run "$LINENO"; then : glib_result=yes else glib_result=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glib_result" >&5 $as_echo "$glib_result" >&6; } if test "$glib_result" = "yes" ; then G_THREAD_LIBS="$add_thread_lib" break fi done if test "x$G_THREAD_LIBS" = xerror; then as_fn_error $? "$LIBS_NOT_FOUND_1$have_threads$LIBS_NOT_FOUND_2" "$LINENO" 5 fi LIBS="$glib_save_LIBS" ;; esac fi g_threads_impl="POSIX" $as_echo "#define THREADS_POSIX 1" >>confdefs.h CPPFLAGS="$glib_save_CPPFLAGS" elif test x$have_threads = xwin32; then : $as_echo "#define THREADS_WIN32 1" >>confdefs.h g_threads_impl="WIN32" else $as_echo "#define THREADS_NONE 1" >>confdefs.h g_threads_impl="NONE" G_THREAD_LIBS=error fi if test "$g_threads_impl" = "POSIX"; then THREADS_POSIX_TRUE= THREADS_POSIX_FALSE='#' else THREADS_POSIX_TRUE='#' THREADS_POSIX_FALSE= fi if test "$g_threads_impl" = "WIN32"; then THREADS_WIN32_TRUE= THREADS_WIN32_FALSE='#' else THREADS_WIN32_TRUE='#' THREADS_WIN32_FALSE= fi if test "$g_threads_impl" = "NONE"; then THREADS_NONE_TRUE= THREADS_NONE_FALSE='#' else THREADS_NONE_TRUE='#' THREADS_NONE_FALSE= fi if test "x$G_THREAD_LIBS" = xerror; then as_fn_error $? "$LIBS_NOT_FOUND_1$have_threads$LIBS_NOT_FOUND_2" "$LINENO" 5 fi case $host in *-*-beos*) G_THREAD_LIBS="-lbe -lroot -lglib-2.0 " G_THREAD_LIBS_EXTRA="-L\$(top_builddir_full)/.libs" ;; *) ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking thread related libraries" >&5 $as_echo_n "checking thread related libraries... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $G_THREAD_LIBS" >&5 $as_echo "$G_THREAD_LIBS" >&6; } glib_save_LIBS="$LIBS" # we are not doing the following for now, as this might require glib # to always be linked with the thread libs on some platforms. # LIBS="$LIBS $G_THREAD_LIBS" for ac_func in localtime_r gmtime_r do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done if test "$ac_cv_header_pwd_h" = "yes"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for posix getpwuid_r" >&5 $as_echo_n "checking for posix getpwuid_r... " >&6; } if ${ac_cv_func_posix_getpwuid_r+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run test program while cross compiling See \`config.log' for more details" "$LINENO" 5; } else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { char buffer[10000]; struct passwd pwd, *pwptr = &pwd; int error; errno = 0; error = getpwuid_r (0, &pwd, buffer, sizeof (buffer), &pwptr); return (error < 0 && errno == ENOSYS) || error == ENOSYS; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_posix_getpwuid_r=yes else ac_cv_func_posix_getpwuid_r=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_posix_getpwuid_r" >&5 $as_echo "$ac_cv_func_posix_getpwuid_r" >&6; } if test "x${ac_cv_func_posix_getpwuid_r+set}" != "xset" ; then as_fn_error $? "ac_cv_func_posix_getpwuid_r must be set in cache file when cross-compiling." "$LINENO" 5 fi if test "$ac_cv_func_posix_getpwuid_r" = yes; then $as_echo "#define HAVE_POSIX_GETPWUID_R 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for nonposix getpwuid_r" >&5 $as_echo_n "checking for nonposix getpwuid_r... " >&6; } if ${ac_cv_func_nonposix_getpwuid_r+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { char buffer[10000]; struct passwd pwd; getpwuid_r (0, &pwd, buffer, sizeof (buffer)); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_func_nonposix_getpwuid_r=yes else ac_cv_func_nonposix_getpwuid_r=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_nonposix_getpwuid_r" >&5 $as_echo "$ac_cv_func_nonposix_getpwuid_r" >&6; } if test "x${ac_cv_func_nonposix_getpwuid_r+set}" != "xset" ; then as_fn_error $? "ac_cv_func_nonposix_getpwuid_r must be set in cache file when cross-compiling." "$LINENO" 5 fi if test "$ac_cv_func_nonposix_getpwuid_r" = yes; then $as_echo "#define HAVE_NONPOSIX_GETPWUID_R 1" >>confdefs.h fi fi fi if test "$ac_cv_header_grp_h" = "yes"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for posix getgrgid_r" >&5 $as_echo_n "checking for posix getgrgid_r... " >&6; } if ${ac_cv_func_posix_getgrgid_r+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run test program while cross compiling See \`config.log' for more details" "$LINENO" 5; } else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { char buffer[10000]; struct group grp, *grpptr = &grp; int error; errno = 0; error = getgrgid_r (0, &grp, buffer, sizeof (buffer), &grpptr); return (error < 0 && errno == ENOSYS) || error == ENOSYS; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_posix_getgrgid_r=yes else ac_cv_func_posix_getgrgid_r=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_posix_getgrgid_r" >&5 $as_echo "$ac_cv_func_posix_getgrgid_r" >&6; } if test "x${ac_cv_func_posix_getgrgid_r+set}" != "xset" ; then as_fn_error $? "ac_cv_func_posix_getgrgid_r must be set in cache file when cross-compiling." "$LINENO" 5 fi if test "$ac_cv_func_posix_getgrgid_r" = yes ; then : $as_echo "#define HAVE_POSIX_GETGRGID_R 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for nonposix getgrgid_r" >&5 $as_echo_n "checking for nonposix getgrgid_r... " >&6; } if ${ac_cv_func_nonposix_getgrgid_r+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { char buffer[10000]; struct group grp; getgrgid_r (0, &grp, buffer, sizeof (buffer)); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_func_nonposix_getgrgid_r=yes else ac_cv_func_nonposix_getgrgid_r=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_nonposix_getgrgid_r" >&5 $as_echo "$ac_cv_func_nonposix_getgrgid_r" >&6; } if test "x${ac_cv_func_nonposix_getgrgid_r+set}" != "xset" ; then as_fn_error $? "ac_cv_func_nonposix_getgrgid_r must be set in cache file when cross-compiling." "$LINENO" 5 fi if test "$ac_cv_func_nonposix_getgrgid_r" = yes; then $as_echo "#define HAVE_NONPOSIX_GETGRGID_R 1" >>confdefs.h fi fi fi LIBS="$G_THREAD_LIBS $LIBS" if test x"$have_threads" = xposix; then : glib_save_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $GTHREAD_COMPILE_IMPL_DEFINES" # This is not AC_CHECK_FUNC to also work with function # name mangling in header files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_attr_setstacksize" >&5 $as_echo_n "checking for pthread_attr_setstacksize... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { pthread_attr_t t; pthread_attr_setstacksize(&t,0) ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "#define HAVE_PTHREAD_ATTR_SETSTACKSIZE 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_condattr_setclock" >&5 $as_echo_n "checking for pthread_condattr_setclock... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { pthread_condattr_t a; pthread_condattr_setclock(&a,0) ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "#define HAVE_PTHREAD_CONDATTR_SETCLOCK 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_cond_timedwait_monotonic" >&5 $as_echo_n "checking for pthread_cond_timedwait_monotonic... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { pthread_cond_timedwait_monotonic(NULL, NULL, NULL) ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "#define HAVE_PTHREAD_COND_TIMEDWAIT_MONOTONIC 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_cond_timedwait_monotonic_np" >&5 $as_echo_n "checking for pthread_cond_timedwait_monotonic_np... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { pthread_cond_timedwait_monotonic_np(NULL, NULL, NULL) ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "#define HAVE_PTHREAD_COND_TIMEDWAIT_MONOTONIC_NP 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CPPFLAGS="$glib_save_CPPFLAGS" fi LIBS="$glib_save_LIBS" # now spit out all the warnings. if test "$ac_cv_func_posix_getpwuid_r" != "yes" && test "$ac_cv_func_nonposix_getpwuid_r" != "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $FUNC_NO_GETPWUID_R" >&5 $as_echo "$as_me: WARNING: $FUNC_NO_GETPWUID_R" >&2;} fi if test "$ac_cv_func_localtime_r" != "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $FUNC_NO_LOCALTIME_R" >&5 $as_echo "$as_me: WARNING: $FUNC_NO_LOCALTIME_R" >&2;} fi # # Hack to deal with: # # a) GCC < 3.3 for Linux doesn't include -lpthread when # building shared libraries with linux. # 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/`" ;; *-*-openbsd*) LDFLAGS="$LDFLAGS -pthread" ;; *) G_THREAD_LIBS_FOR_GTHREAD="$G_THREAD_LIBS" ;; esac for ac_func in clock_gettime do : ac_fn_c_check_func "$LINENO" "clock_gettime" "ac_cv_func_clock_gettime" if test "x$ac_cv_func_clock_gettime" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_CLOCK_GETTIME 1 _ACEOF else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for clock_gettime in -lrt" >&5 $as_echo_n "checking for clock_gettime in -lrt... " >&6; } if ${ac_cv_lib_rt_clock_gettime+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lrt $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char clock_gettime (); int main () { return clock_gettime (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_rt_clock_gettime=yes else ac_cv_lib_rt_clock_gettime=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rt_clock_gettime" >&5 $as_echo "$ac_cv_lib_rt_clock_gettime" >&6; } if test "x$ac_cv_lib_rt_clock_gettime" = xyes; then : $as_echo "#define HAVE_CLOCK_GETTIME 1" >>confdefs.h G_THREAD_LIBS="$G_THREAD_LIBS -lrt" G_THREAD_LIBS_FOR_GTHREAD="$G_THREAD_LIBS_FOR_GTHREAD -lrt" fi fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for lock-free atomic intrinsics" >&5 $as_echo_n "checking for lock-free atomic intrinsics... " >&6; } if ${glib_cv_g_atomic_lock_free+:} false; then : $as_echo_n "(cached) " >&6 else case $host in *-*-mingw*) glib_cv_g_atomic_lock_free=yes ;; *) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { volatile int atomic = 2;\ __sync_bool_compare_and_swap (&atomic, 2, 3); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : glib_cv_g_atomic_lock_free=yes else glib_cv_g_atomic_lock_free=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test "$glib_cv_g_atomic_lock_free" = "no"; then SAVE_CFLAGS="${CFLAGS}" CFLAGS="-march=i486" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { volatile int atomic = 2;\ __sync_bool_compare_and_swap (&atomic, 2, 3); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : as_fn_error $? "GLib must be build with -march=i486 or later." "$LINENO" 5 fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS="${SAVE_CFLAGS}" fi ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glib_cv_g_atomic_lock_free" >&5 $as_echo "$glib_cv_g_atomic_lock_free" >&6; } 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 cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : else $as_echo "#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4 1" >>confdefs.h fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi ;; esac case $host_cpu in i?86|x86_64|s390|s390x|arm*|crisv32*|etrax*) glib_memory_barrier_needed=no ;; sparc*|alpha*|powerpc*|ia64) glib_memory_barrier_needed=yes ;; *) glib_memory_barrier_needed=yes ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for futex(2) system call" >&5 $as_echo_n "checking for futex(2) system call... " >&6; } if ${glib_cv_futex+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { int main (void) { /* it is not like this actually runs or anything... */ syscall (__NR_futex, NULL, FUTEX_WAKE, FUTEX_WAIT); return 0; } ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : glib_cv_futex=yes else glib_cv_futex=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glib_cv_futex" >&5 $as_echo "$glib_cv_futex" >&6; } if test x"$glib_cv_futex" = xyes; then $as_echo "#define HAVE_FUTEX 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for eventfd(2) system call" >&5 $as_echo_n "checking for eventfd(2) system call... " >&6; } if ${glib_cv_eventfd+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { int main (void) { eventfd (0, EFD_CLOEXEC); return 0; } ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : glib_cv_eventfd=yes else glib_cv_eventfd=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glib_cv_eventfd" >&5 $as_echo "$glib_cv_eventfd" >&6; } if test x"$glib_cv_eventfd" = x"yes"; then $as_echo "#define HAVE_EVENTFD 1" >>confdefs.h fi if test "$glib_cv_eventfd" = "yes"; then HAVE_EVENTFD_TRUE= HAVE_EVENTFD_FALSE='#' else HAVE_EVENTFD_TRUE='#' HAVE_EVENTFD_FALSE= fi glib_poll_includes=" #include #include " if test $ac_cv_header_sys_types_h = yes && test $ac_cv_header_sys_poll_h = yes ; then : glib_failed=false { $as_echo "$as_me:${as_lineno-$LINENO}: checking value of POLLIN" >&5 $as_echo_n "checking value of POLLIN... " >&6; } if ${glib_cv_value_POLLIN+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "POLLIN" "glib_cv_value_POLLIN" "$glib_poll_includes"; then : else glib_failed=true fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glib_cv_value_POLLIN" >&5 $as_echo "$glib_cv_value_POLLIN" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking value of POLLOUT" >&5 $as_echo_n "checking value of POLLOUT... " >&6; } if ${glib_cv_value_POLLOUT+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "POLLOUT" "glib_cv_value_POLLOUT" "$glib_poll_includes"; then : else glib_failed=true fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glib_cv_value_POLLOUT" >&5 $as_echo "$glib_cv_value_POLLOUT" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking value of POLLPRI" >&5 $as_echo_n "checking value of POLLPRI... " >&6; } if ${glib_cv_value_POLLPRI+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "POLLPRI" "glib_cv_value_POLLPRI" "$glib_poll_includes"; then : else glib_failed=true fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glib_cv_value_POLLPRI" >&5 $as_echo "$glib_cv_value_POLLPRI" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking value of POLLERR" >&5 $as_echo_n "checking value of POLLERR... " >&6; } if ${glib_cv_value_POLLERR+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "POLLERR" "glib_cv_value_POLLERR" "$glib_poll_includes"; then : else glib_failed=true fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glib_cv_value_POLLERR" >&5 $as_echo "$glib_cv_value_POLLERR" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking value of POLLHUP" >&5 $as_echo_n "checking value of POLLHUP... " >&6; } if ${glib_cv_value_POLLHUP+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "POLLHUP" "glib_cv_value_POLLHUP" "$glib_poll_includes"; then : else glib_failed=true fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glib_cv_value_POLLHUP" >&5 $as_echo "$glib_cv_value_POLLHUP" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking value of POLLNVAL" >&5 $as_echo_n "checking value of POLLNVAL... " >&6; } if ${glib_cv_value_POLLNVAL+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "POLLNVAL" "glib_cv_value_POLLNVAL" "$glib_poll_includes"; then : else glib_failed=true fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glib_cv_value_POLLNVAL" >&5 $as_echo "$glib_cv_value_POLLNVAL" >&6; } if $glib_failed ; then as_fn_error $? "Could not determine values for POLL* constants" "$LINENO" 5 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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for broken poll" >&5 $as_echo_n "checking for broken poll... " >&6; } if test "$cross_compiling" = yes; then : broken_poll="no (cross compiling)" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #ifdef HAVE_SYS_POLL_H #include #endif int main(void) { struct pollfd fds[1]; int fd; fd = open("/dev/null", 1); fds[0].fd = fd; fds[0].events = POLLIN; fds[0].revents = 0; if (poll(fds, 1, 0) < 0 || (fds[0].revents & POLLNVAL) != 0) { exit(1); /* Does not work for devices -- fail */ } exit(0); } _ACEOF if ac_fn_c_try_run "$LINENO"; then : broken_poll=no else broken_poll=yes $as_echo "#define BROKEN_POLL 1" >>confdefs.h fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $broken_poll" >&5 $as_echo "$broken_poll" >&6; } case $host in *-*-cygwin*) G_LIBS_EXTRA="-luser32 -lkernel32" ;; *-*-mingw*) G_LIBS_EXTRA="-lws2_32 -lole32 -lwinmm -lshlwapi" ;; *) G_LIBS_EXTRA="" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for EILSEQ" >&5 $as_echo_n "checking for EILSEQ... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { int error = EILSEQ; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : have_eilseq=yes else have_eilseq=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext; { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_eilseq" >&5 $as_echo "$have_eilseq" >&6; } # Check whether --enable-gcov was given. if test "${enable_gcov+set}" = set; then : enableval=$enable_gcov; use_gcov=$enableval else use_gcov=no fi if test "x$use_gcov" = "xyes"; then : if test "$GCC" != "yes"; then as_fn_error $? "GCC is required for --enable-gcov" "$LINENO" 5 fi # Extract the first word of "shtool", so it can be a program name with args. set dummy shtool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_SHTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$SHTOOL"; then ac_cv_prog_SHTOOL="$SHTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_SHTOOL="shtool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi SHTOOL=$ac_cv_prog_SHTOOL if test -n "$SHTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SHTOOL" >&5 $as_echo "$SHTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi case `$SHTOOL path $CC` in *ccache*) gcc_ccache=yes;; *) gcc_ccache=no;; esac if test "$gcc_ccache" = "yes" && (test -z "$CCACHE_DISABLE" || test "$CCACHE_DISABLE" != "1"); then as_fn_error $? "ccache must be disabled when --enable-gcov option is used. You can disable ccache by setting environment variable CCACHE_DISABLE=1." "$LINENO" 5 fi ltp_version_list="1.6 1.7 1.8 1.9 1.10" # Extract the first word of "lcov", so it can be a program name with args. set dummy lcov; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_LTP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$LTP"; then ac_cv_prog_LTP="$LTP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_LTP="lcov" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi LTP=$ac_cv_prog_LTP if test -n "$LTP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LTP" >&5 $as_echo "$LTP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "genhtml", so it can be a program name with args. set dummy genhtml; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_LTP_GENHTML+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$LTP_GENHTML"; then ac_cv_prog_LTP_GENHTML="$LTP_GENHTML" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_LTP_GENHTML="genhtml" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi LTP_GENHTML=$ac_cv_prog_LTP_GENHTML if test -n "$LTP_GENHTML"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LTP_GENHTML" >&5 $as_echo "$LTP_GENHTML" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "$LTP" ; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ltp version" >&5 $as_echo_n "checking for ltp version... " >&6; } if ${glib_cv_ltp_version+:} false; then : $as_echo_n "(cached) " >&6 else glib_cv_ltp_version=invalid ltp_version=`$LTP -v 2>/dev/null | $SED -e 's/^.* //'` for ltp_check_version in $ltp_version_list; do if test "$ltp_version" = "$ltp_check_version"; then glib_cv_ltp_version="$ltp_check_version (ok)" fi done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glib_cv_ltp_version" >&5 $as_echo "$glib_cv_ltp_version" >&6; } else ltp_msg="To enable code coverage reporting you must have one of the following LTP versions installed: $ltp_version_list" as_fn_error $? "$ltp_msg" "$LINENO" 5 fi case $glib_cv_ltp_version in ""|invalid) ltp_msg="You must have one of the following versions of LTP: $ltp_version_list (found: $ltp_version)." as_fn_error $? "$ltp_msg" "$LINENO" 5 LTP="exit 0;" ;; esac if test -z "$LTP_GENHTML"; then as_fn_error $? "Could not find genhtml from the LTP package" "$LINENO" 5 fi CFLAGS=`echo "$CFLAGS" | $SED -e 's/-O[0-9]*//g'` CFLAGS="$CFLAGS -O0 -fprofile-arcs -ftest-coverage" LDFLAGS="$LDFLAGS -lgcov" fi ac_config_commands="$ac_config_commands glib/glibconfig.h" # Redo enough to get guint32 and guint64 for the alignment checks below case 4 in $ac_cv_sizeof_short) gint32=short ;; $ac_cv_sizeof_int) gint32=int ;; $ac_cv_sizeof_long) gint32=long ;; esac case 8 in $ac_cv_sizeof_int) gint64=int ;; $ac_cv_sizeof_long) gint64=long ;; $ac_cv_sizeof_long_long) gint64='long long' ;; $ac_cv_sizeof___int64) gint64='__int64' ;; esac ac_fn_c_check_type "$LINENO" "guint32" "ac_cv_type_guint32" "typedef unsigned $gint32 guint32; " if test "x$ac_cv_type_guint32" = xyes; then : fi # The cast to long int works around a bug in the HP C Compiler, # see AC_CHECK_SIZEOF for more information. { $as_echo "$as_me:${as_lineno-$LINENO}: checking alignment of guint32" >&5 $as_echo_n "checking alignment of guint32... " >&6; } if ${ac_cv_alignof_guint32+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) offsetof (ac__type_alignof_, y)" "ac_cv_alignof_guint32" "$ac_includes_default typedef unsigned $gint32 guint32; #ifndef offsetof # define offsetof(type, member) ((char *) &((type *) 0)->member - (char *) 0) #endif typedef struct { char x; guint32 y; } ac__type_alignof_;"; then : else if test "$ac_cv_type_guint32" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute alignment of guint32 See \`config.log' for more details" "$LINENO" 5; } else ac_cv_alignof_guint32=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_alignof_guint32" >&5 $as_echo "$ac_cv_alignof_guint32" >&6; } cat >>confdefs.h <<_ACEOF #define ALIGNOF_GUINT32 $ac_cv_alignof_guint32 _ACEOF ac_fn_c_check_type "$LINENO" "guint64" "ac_cv_type_guint64" "typedef unsigned $gint64 guint64; " if test "x$ac_cv_type_guint64" = xyes; then : fi # The cast to long int works around a bug in the HP C Compiler, # see AC_CHECK_SIZEOF for more information. { $as_echo "$as_me:${as_lineno-$LINENO}: checking alignment of guint64" >&5 $as_echo_n "checking alignment of guint64... " >&6; } if ${ac_cv_alignof_guint64+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) offsetof (ac__type_alignof_, y)" "ac_cv_alignof_guint64" "$ac_includes_default typedef unsigned $gint64 guint64; #ifndef offsetof # define offsetof(type, member) ((char *) &((type *) 0)->member - (char *) 0) #endif typedef struct { char x; guint64 y; } ac__type_alignof_;"; then : else if test "$ac_cv_type_guint64" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute alignment of guint64 See \`config.log' for more details" "$LINENO" 5; } else ac_cv_alignof_guint64=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_alignof_guint64" >&5 $as_echo "$ac_cv_alignof_guint64" >&6; } cat >>confdefs.h <<_ACEOF #define ALIGNOF_GUINT64 $ac_cv_alignof_guint64 _ACEOF ac_fn_c_check_type "$LINENO" "unsigned long" "ac_cv_type_unsigned_long" "$ac_includes_default" if test "x$ac_cv_type_unsigned_long" = xyes; then : fi # The cast to long int works around a bug in the HP C Compiler, # see AC_CHECK_SIZEOF for more information. { $as_echo "$as_me:${as_lineno-$LINENO}: checking alignment of unsigned long" >&5 $as_echo_n "checking alignment of unsigned long... " >&6; } if ${ac_cv_alignof_unsigned_long+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) offsetof (ac__type_alignof_, y)" "ac_cv_alignof_unsigned_long" "$ac_includes_default #ifndef offsetof # define offsetof(type, member) ((char *) &((type *) 0)->member - (char *) 0) #endif typedef struct { char x; unsigned long y; } ac__type_alignof_;"; then : else if test "$ac_cv_type_unsigned_long" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute alignment of unsigned long See \`config.log' for more details" "$LINENO" 5; } else ac_cv_alignof_unsigned_long=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_alignof_unsigned_long" >&5 $as_echo "$ac_cv_alignof_unsigned_long" >&6; } cat >>confdefs.h <<_ACEOF #define ALIGNOF_UNSIGNED_LONG $ac_cv_alignof_unsigned_long _ACEOF # Check whether --enable-Bsymbolic was given. if test "${enable_Bsymbolic+set}" = set; then : enableval=$enable_Bsymbolic; else SAVED_LDFLAGS="${LDFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -Bsymbolic-functions linker flag" >&5 $as_echo_n "checking for -Bsymbolic-functions linker flag... " >&6; } LDFLAGS=-Wl,-Bsymbolic-functions cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { int main (void) { return 0; } ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } enable_Bsymbolic=yes else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } enable_Bsymbolic=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="${SAVED_LDFLAGS}" fi if test "x${enable_Bsymbolic}" = "xyes"; then GLIB_LINK_FLAGS=-Wl,-Bsymbolic-functions fi GLIB_HIDDEN_VISIBILITY_CFLAGS="" case "$host" in *-*-mingw*) $as_echo "#define _GLIB_EXTERN __attribute__((visibility(\"default\"))) __declspec(dllexport) extern" >>confdefs.h CFLAGS="${CFLAGS} -fvisibility=hidden" ;; *) SAVED_CFLAGS="${CFLAGS}" CFLAGS="-fvisibility=hidden" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -fvisibility=hidden compiler flag" >&5 $as_echo_n "checking for -fvisibility=hidden compiler flag... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { int main (void) { return 0; } ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } enable_fvisibility_hidden=yes else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } enable_fvisibility_hidden=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS="${SAVED_CFLAGS}" if test "${enable_fvisibility_hidden}" = "yes"; then : $as_echo "#define _GLIB_EXTERN __attribute__((visibility(\"default\"))) extern" >>confdefs.h GLIB_HIDDEN_VISIBILITY_CFLAGS="-fvisibility=hidden" fi ;; esac # Check whether --enable-compile-warnings was given. if test "${enable_compile_warnings+set}" = set; then : enableval=$enable_compile_warnings; else enable_compile_warnings=yes fi if test "x$enable_compile_warnings" = xyes; then : for flag in \ -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; do { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports flag $flag in envvar CFLAGS" >&5 $as_echo_n "checking if $CC supports flag $flag in envvar CFLAGS... " >&6; } if { as_var=`$as_echo "cc_cv_CFLAGS_$flag" | $as_tr_sh`; eval \${$as_var+:} false; }; then : $as_echo_n "(cached) " >&6 else eval "cc_save_CFLAGS='${CFLAGS}'" eval "CFLAGS='-Werror $flag'" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int a = 0; int main(void) { return a; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "`$as_echo "cc_cv_CFLAGS_$flag" | $as_tr_sh`='yes'" else eval "`$as_echo "cc_cv_CFLAGS_$flag" | $as_tr_sh`='no'" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext eval "CFLAGS='$cc_save_CFLAGS'" fi eval ac_res=\$`$as_echo "cc_cv_CFLAGS_$flag" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test x$`$as_echo "cc_cv_CFLAGS_$flag" | $as_tr_sh` = xyes; then : eval "GLIB_WARN_CFLAGS='${GLIB_WARN_CFLAGS} $flag'" fi done fi # # Define variables corresponding to the correct include paths to use for # in-tree building. # # for config.h: config_h_INCLUDES='-I$(top_builddir)' # glib: # config.h # $(top_builddir)/glib: for glibconfig.h # $(top_srcdir)/glib: for glib.h # $(top_srcdir): for everything glib_INCLUDES='$(config_h_INCLUDES) -I$(top_builddir)/glib -I$(top_srcdir)/glib -I$(top_srcdir)' # gobject: # same as glib gobject_INCLUDES='$(glib_INCLUDES)' # gmodule: # glib includes # $(top_srcdir)/gmodule: for gmodule.h gmodule_INCLUDES='$(glib_INCLUDES) -I$(top_srcdir)/gmodule' # gio: # same as gmodule gio_INCLUDES='$(gmodule_INCLUDES)' ac_config_files="$ac_config_files Makefile glib/Makefile glib/libcharset/Makefile glib/gnulib/Makefile m4macros/Makefile" # we want to invoke this macro solely so that the config.status script # and automake generated makefiles know about these generated files. # They are only needed to distcheck the package if false; then ac_config_files="$ac_config_files README glib/glib.rc" fi cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs { $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 $as_echo_n "checking that generated files are newer than configure... " >&6; } if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 $as_echo "done" >&6; } if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_GCC_TRUE}" && test -z "${HAVE_GCC_FALSE}"; then as_fn_error $? "conditional \"HAVE_GCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${OS_WIN32_TRUE}" && test -z "${OS_WIN32_FALSE}"; then as_fn_error $? "conditional \"OS_WIN32\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${OS_WIN32_X64_TRUE}" && test -z "${OS_WIN32_X64_FALSE}"; then as_fn_error $? "conditional \"OS_WIN32_X64\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${OS_UNIX_TRUE}" && test -z "${OS_UNIX_FALSE}"; then as_fn_error $? "conditional \"OS_UNIX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${OS_LINUX_TRUE}" && test -z "${OS_LINUX_FALSE}"; then as_fn_error $? "conditional \"OS_LINUX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${OS_CARBON_TRUE}" && test -z "${OS_CARBON_FALSE}"; then as_fn_error $? "conditional \"OS_CARBON\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${OS_COCOA_TRUE}" && test -z "${OS_COCOA_FALSE}"; then as_fn_error $? "conditional \"OS_COCOA\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${MS_LIB_AVAILABLE_TRUE}" && test -z "${MS_LIB_AVAILABLE_FALSE}"; then as_fn_error $? "conditional \"MS_LIB_AVAILABLE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_INSTALLED_TESTS_TRUE}" && test -z "${ENABLE_INSTALLED_TESTS_FALSE}"; then as_fn_error $? "conditional \"ENABLE_INSTALLED_TESTS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_ALWAYS_BUILD_TESTS_TRUE}" && test -z "${ENABLE_ALWAYS_BUILD_TESTS_FALSE}"; then as_fn_error $? "conditional \"ENABLE_ALWAYS_BUILD_TESTS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_GLIB_RUNTIME_LIBDIR_TRUE}" && test -z "${HAVE_GLIB_RUNTIME_LIBDIR_FALSE}"; then as_fn_error $? "conditional \"HAVE_GLIB_RUNTIME_LIBDIR\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_CXX_TRUE}" && test -z "${HAVE_CXX_FALSE}"; then as_fn_error $? "conditional \"HAVE_CXX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${OS_WIN32_AND_DLL_COMPILATION_TRUE}" && test -z "${OS_WIN32_AND_DLL_COMPILATION_FALSE}"; then as_fn_error $? "conditional \"OS_WIN32_AND_DLL_COMPILATION\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_GNUC_VISIBILITY_TRUE}" && test -z "${HAVE_GNUC_VISIBILITY_FALSE}"; then as_fn_error $? "conditional \"HAVE_GNUC_VISIBILITY\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_SUNSTUDIO_VISIBILITY_TRUE}" && test -z "${HAVE_SUNSTUDIO_VISIBILITY_FALSE}"; then as_fn_error $? "conditional \"HAVE_SUNSTUDIO_VISIBILITY\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_NETLINK_TRUE}" && test -z "${HAVE_NETLINK_FALSE}"; then as_fn_error $? "conditional \"HAVE_NETLINK\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_GOOD_PRINTF_TRUE}" && test -z "${HAVE_GOOD_PRINTF_FALSE}"; then as_fn_error $? "conditional \"HAVE_GOOD_PRINTF\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_INOTIFY_TRUE}" && test -z "${HAVE_INOTIFY_FALSE}"; then as_fn_error $? "conditional \"HAVE_INOTIFY\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_KQUEUE_TRUE}" && test -z "${HAVE_KQUEUE_FALSE}"; then as_fn_error $? "conditional \"HAVE_KQUEUE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_FEN_TRUE}" && test -z "${HAVE_FEN_FALSE}"; then as_fn_error $? "conditional \"HAVE_FEN\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_TIMELOOP_TRUE}" && test -z "${ENABLE_TIMELOOP_FALSE}"; then as_fn_error $? "conditional \"ENABLE_TIMELOOP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${PLATFORM_WIN32_TRUE}" && test -z "${PLATFORM_WIN32_FALSE}"; then as_fn_error $? "conditional \"PLATFORM_WIN32\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${THREADS_POSIX_TRUE}" && test -z "${THREADS_POSIX_FALSE}"; then as_fn_error $? "conditional \"THREADS_POSIX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${THREADS_WIN32_TRUE}" && test -z "${THREADS_WIN32_FALSE}"; then as_fn_error $? "conditional \"THREADS_WIN32\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${THREADS_NONE_TRUE}" && test -z "${THREADS_NONE_FALSE}"; then as_fn_error $? "conditional \"THREADS_NONE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_EVENTFD_TRUE}" && test -z "${HAVE_EVENTFD_FALSE}"; then as_fn_error $? "conditional \"HAVE_EVENTFD\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by glib $as_me 2.38.2, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration commands: $config_commands Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ glib config.status 2.38.2 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' AS='`$ECHO "$AS" | $SED "$delay_single_quote_subst"`' DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' shared_archive_member_spec='`$ECHO "$shared_archive_member_spec" | $SED "$delay_single_quote_subst"`' SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_import='`$ECHO "$lt_cv_sys_global_symbol_to_import" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' lt_cv_nm_interface='`$ECHO "$lt_cv_nm_interface" | $SED "$delay_single_quote_subst"`' nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' lt_cv_truncate_bin='`$ECHO "$lt_cv_truncate_bin" | $SED "$delay_single_quote_subst"`' objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' configure_time_dlsearch_path='`$ECHO "$configure_time_dlsearch_path" | $SED "$delay_single_quote_subst"`' configure_time_lt_sys_library_path='`$ECHO "$configure_time_lt_sys_library_path" | $SED "$delay_single_quote_subst"`' hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`' predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`' postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`' predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`' postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`' compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`' LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`' reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`' reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`' old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`' GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`' archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`' enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`' export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`' old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`' archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`' module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`' allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`' hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`' hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`' hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`' hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`' inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`' link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`' always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`' export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`' exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`' include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`' prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`' postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`' file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`' hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`' compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`' predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`' postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`' predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`' postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`' compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`' LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } # Quote evaled strings. for var in AS \ DLLTOOL \ OBJDUMP \ SHELL \ ECHO \ PATH_SEPARATOR \ SED \ GREP \ EGREP \ FGREP \ LD \ NM \ LN_S \ lt_SP2NL \ lt_NL2SP \ reload_flag \ deplibs_check_method \ file_magic_cmd \ file_magic_glob \ want_nocaseglob \ sharedlib_from_linklib_cmd \ AR \ AR_FLAGS \ archiver_list_spec \ STRIP \ RANLIB \ CC \ CFLAGS \ compiler \ lt_cv_sys_global_symbol_pipe \ lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_import \ lt_cv_sys_global_symbol_to_c_name_address \ lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ lt_cv_nm_interface \ nm_file_list_spec \ lt_cv_truncate_bin \ lt_prog_compiler_no_builtin_flag \ lt_prog_compiler_pic \ lt_prog_compiler_wl \ lt_prog_compiler_static \ lt_cv_prog_compiler_c_o \ need_locks \ MANIFEST_TOOL \ DSYMUTIL \ NMEDIT \ LIPO \ OTOOL \ OTOOL64 \ shrext_cmds \ export_dynamic_flag_spec \ whole_archive_flag_spec \ compiler_needs_object \ with_gnu_ld \ allow_undefined_flag \ no_undefined_flag \ hardcode_libdir_flag_spec \ hardcode_libdir_separator \ exclude_expsyms \ include_expsyms \ file_list_spec \ variables_saved_for_relink \ libname_spec \ library_names_spec \ soname_spec \ install_override_mode \ finish_eval \ old_striplib \ striplib \ compiler_lib_search_dirs \ predep_objects \ postdep_objects \ predeps \ postdeps \ compiler_lib_search_path \ LD_CXX \ reload_flag_CXX \ compiler_CXX \ lt_prog_compiler_no_builtin_flag_CXX \ lt_prog_compiler_pic_CXX \ lt_prog_compiler_wl_CXX \ lt_prog_compiler_static_CXX \ lt_cv_prog_compiler_c_o_CXX \ export_dynamic_flag_spec_CXX \ whole_archive_flag_spec_CXX \ compiler_needs_object_CXX \ with_gnu_ld_CXX \ allow_undefined_flag_CXX \ no_undefined_flag_CXX \ hardcode_libdir_flag_spec_CXX \ hardcode_libdir_separator_CXX \ exclude_expsyms_CXX \ include_expsyms_CXX \ file_list_spec_CXX \ compiler_lib_search_dirs_CXX \ predep_objects_CXX \ postdep_objects_CXX \ predeps_CXX \ postdeps_CXX \ compiler_lib_search_path_CXX; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in reload_cmds \ old_postinstall_cmds \ old_postuninstall_cmds \ old_archive_cmds \ extract_expsyms_cmds \ old_archive_from_new_cmds \ old_archive_from_expsyms_cmds \ archive_cmds \ archive_expsym_cmds \ module_cmds \ module_expsym_cmds \ export_symbols_cmds \ prelink_cmds \ postlink_cmds \ postinstall_cmds \ postuninstall_cmds \ finish_cmds \ sys_lib_search_path_spec \ configure_time_dlsearch_path \ configure_time_lt_sys_library_path \ reload_cmds_CXX \ old_archive_cmds_CXX \ old_archive_from_new_cmds_CXX \ old_archive_from_expsyms_cmds_CXX \ archive_cmds_CXX \ archive_expsym_cmds_CXX \ module_cmds_CXX \ module_expsym_cmds_CXX \ export_symbols_cmds_CXX \ prelink_cmds_CXX \ postlink_cmds_CXX; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done ac_aux_dir='$ac_aux_dir' # See if we are running on zsh, and set the options that allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi PACKAGE='$PACKAGE' VERSION='$VERSION' RM='$RM' ofile='$ofile' ac_aux_dir='$ac_aux_dir' # Note that if two cases are the same, case goes with the first one. # Note also that this is inside an AC_OUTPUT_COMMAND. We do not depend # on variable expansion in case labels. Look at the generated config.status # for a hint. if test "x${ac_cv_working_alloca_h+set}" = xset ; then glib_header_alloca_h="$ac_cv_working_alloca_h" else glib_header_alloca_h="$ac_cv_header_alloca_h" fi case xyes in x$ac_cv_header_float_h) glib_float_h=yes glib_mf=FLT_MIN glib_Mf=FLT_MAX glib_md=DBL_MIN glib_Md=DBL_MAX ;; x$ac_cv_header_values_h) glib_values_h=yes glib_mf=MINFLOAT glib_Mf=MAXFLOAT glib_md=MINDOUBLE glib_Md=MAXDOUBLE ;; esac case xyes in x$ac_cv_header_limits_h) glib_limits_h=yes glib_ms=SHRT_MIN glib_Ms=SHRT_MAX glib_Mus=USHRT_MAX glib_mi=INT_MIN glib_Mi=INT_MAX glib_Mui=UINT_MAX glib_ml=LONG_MIN glib_Ml=LONG_MAX glib_Mul=ULONG_MAX ;; x$ac_cv_header_values_h) glib_values_h=yes glib_ms=MINSHORT glib_Ms=MAXSHORT glib_Mus="(((gushort)G_MAXSHORT)*2+1)" glib_mi=MININT glib_Mi=MAXINT glib_Mui="(((guint)G_MAXINT)*2+1)" glib_ml=MINLONG glib_Ml=MAXLONG glib_Mul="(((gulong)G_MAXLONG)*2+1)" ;; esac if test x$ac_cv_header_sys_poll_h = xyes ; then glib_sys_poll_h=yes fi if test x$enable_included_printf = xyes ; then glib_included_printf=yes fi case 2 in $ac_cv_sizeof_short) gint16=short gint16_modifier='"h"' gint16_format='"hi"' guint16_format='"hu"' ;; $ac_cv_sizeof_int) gint16=int gint16_modifier='""' gint16_format='"i"' guint16_format='"u"' ;; esac case 4 in $ac_cv_sizeof_short) gint32=short gint32_modifier='"h"' gint32_format='"hi"' guint32_format='"hu"' ;; $ac_cv_sizeof_int) gint32=int gint32_modifier='""' gint32_format='"i"' guint32_format='"u"' ;; $ac_cv_sizeof_long) gint32=long gint32_modifier='"l"' gint32_format='"li"' guint32_format='"lu"' ;; esac case 8 in $ac_cv_sizeof_int) gint64=int gint64_modifier='""' gint64_format='"i"' guint64_format='"u"' glib_extension= gint64_constant='(val)' guint64_constant='(val)' ;; $ac_cv_sizeof_long) gint64=long gint64_modifier='"l"' gint64_format='"li"' guint64_format='"lu"' glib_extension= gint64_constant='(val##L)' guint64_constant='(val##UL)' ;; $ac_cv_sizeof_long_long) gint64='long long' if test -n "$glib_cv_long_long_format"; then gint64_modifier='"'$glib_cv_long_long_format'"' gint64_format='"'$glib_cv_long_long_format'i"' guint64_format='"'$glib_cv_long_long_format'u"' fi glib_extension='G_GNUC_EXTENSION ' gint64_constant='(G_GNUC_EXTENSION (val##LL))' guint64_constant='(G_GNUC_EXTENSION (val##ULL))' ;; $ac_cv_sizeof___int64) gint64='__int64' if test -n "$glib_cv_long_long_format"; then gint64_modifier='"'$glib_cv_long_long_format'"' gint64_format='"'$glib_cv_long_long_format'i"' guint64_format='"'$glib_cv_long_long_format'u"' fi glib_extension= gint64_constant='(val##i64)' guint64_constant='(val##ui64)' ;; esac glib_size_t=$ac_cv_sizeof_size_t glib_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 case "$glib_size_type" in short) gsize_modifier='"h"' gsize_format='"hu"' glib_msize_type='SHRT' ;; int) gsize_modifier='""' gsize_format='"u"' glib_msize_type='INT' ;; long) gsize_modifier='"l"' gsize_format='"lu"' glib_msize_type='LONG' ;; "long long"|__int64) gsize_modifier='"I64"' gsize_format='"I64u"' 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) glib_intptr_type_define=int gintptr_modifier='""' gintptr_format='"i"' guintptr_format='"u"' glib_gpi_cast='(gint)' glib_gpui_cast='(guint)' ;; $ac_cv_sizeof_long) glib_intptr_type_define=long gintptr_modifier='"l"' gintptr_format='"li"' guintptr_format='"lu"' glib_gpi_cast='(glong)' glib_gpui_cast='(gulong)' ;; $ac_cv_sizeof_long_long) glib_intptr_type_define='long long' gintptr_modifier='"I64"' gintptr_format='"I64i"' guintptr_format='"I64u"' glib_gpi_cast='(gint64)' glib_gpui_cast='(guint64)' ;; $ac_cv_sizeof___int64) glib_intptr_type_define=__int64 gintptr_modifier='"I64"' gintptr_format='"I64i"' guintptr_format='"I64u"' glib_gpi_cast='(gint64)' glib_gpui_cast='(guint64)' ;; *) glib_unknown_void_p=yes ;; esac case xyes in x$ac_cv_func_atexit) glib_atexit=" #ifdef NeXT /* @#%@! NeXTStep */ # define g_ATEXIT(proc) (!atexit (proc)) #else # define g_ATEXIT(proc) (atexit (proc)) #endif" ;; x$ac_cv_func_on_exit) glib_atexit=" #define g_ATEXIT(proc) (on_exit ((void (*)(int, void*))(proc), NULL))" ;; esac case xyes in x$ac_cv_func_memmove) glib_memmove=' #define g_memmove(dest,src,len) G_STMT_START { memmove ((dest), (src), (len)); } G_STMT_END' ;; x$glib_cv_working_bcopy) glib_memmove=" /* memmove isn't available, but bcopy can copy overlapping memory regions */ #define g_memmove(d,s,n) G_STMT_START { bcopy ((s), (d), (n)); } G_STMT_END" ;; *) glib_memmove=" /* memmove isn't found and bcopy can't copy overlapping memory regions, * so we have to roll our own copy routine. */ void g_memmove (void* dest, const void * src, unsigned long len);" ;; esac glib_defines=" #define GLIB_MAJOR_VERSION $GLIB_MAJOR_VERSION #define GLIB_MINOR_VERSION $GLIB_MINOR_VERSION #define GLIB_MICRO_VERSION $GLIB_MICRO_VERSION " case xyes in x$glib_cv_va_copy) glib_vacopy='#define G_VA_COPY va_copy' ;; x$glib_cv___va_copy) glib_vacopy='#define G_VA_COPY __va_copy' ;; *) glib_vacopy='' esac if test x$glib_cv_va_val_copy = xno; then glib_vacopy="\$glib_vacopy #define G_VA_COPY_AS_ARRAY 1" fi if test x$glib_cv_hasinline = xyes; then glib_inline='#define G_HAVE_INLINE 1' fi if test x$glib_cv_has__inline = xyes; then glib_inline="\$glib_inline #define G_HAVE___INLINE 1" fi if test x$glib_cv_has__inline__ = xyes; then glib_inline="\$glib_inline #define G_HAVE___INLINE__ 1" fi g_have_gnuc_varargs=$g_have_gnuc_varargs g_have_iso_c_varargs=$g_have_iso_c_varargs g_have_iso_cxx_varargs=$g_have_iso_cxx_varargs g_can_inline=$g_can_inline g_have_gnuc_visibility=$g_have_gnuc_visibility g_have_sunstudio_visibility=$g_have_sunstudio_visibility if test x$ac_cv_c_bigendian = xyes; then g_byte_order=G_BIG_ENDIAN g_bs_native=BE g_bs_alien=LE else g_byte_order=G_LITTLE_ENDIAN g_bs_native=LE g_bs_alien=BE fi g_pollin=$glib_cv_value_POLLIN g_pollout=$glib_cv_value_POLLOUT g_pollpri=$glib_cv_value_POLLPRI g_pollhup=$glib_cv_value_POLLHUP g_pollerr=$glib_cv_value_POLLERR g_pollnval=$glib_cv_value_POLLNVAL # If a family is not found on the system, define that family to # a negative value, picking a different one for each undefined # family (-1 for AF_UNIX, -2 for the next one, -3 ...) # This is needed because glib-mkenums doesn't handle optional # values in enums, and thus we have to have all existing values # defined in the enum. if test "x$glib_cv_value_AF_UNIX" != "x"; then g_af_unix=$glib_cv_value_AF_UNIX else g_af_unix=-1 fi g_af_inet=$glib_cv_value_AF_INET g_af_inet6=$glib_cv_value_AF_INET6 g_msg_peek=$glib_cv_value_MSG_PEEK g_msg_oob=$glib_cv_value_MSG_OOB g_msg_dontroute=$glib_cv_value_MSG_DONTROUTE g_stack_grows=$glib_cv_stack_grows g_have_eilseq=$have_eilseq g_threads_impl_def=$g_threads_impl g_atomic_lock_free="$glib_cv_g_atomic_lock_free" g_memory_barrier_needed="$glib_memory_barrier_needed" g_gcc_atomic_ops="$glib_cv_gcc_has_builtin_atomic_operations" g_module_suffix="$glib_gmodule_suffix" g_pid_type="$glib_pid_type" case $host in *-*-beos*) glib_os="#define G_OS_BEOS" ;; *-*-cygwin*) glib_os="#define G_OS_UNIX #define G_PLATFORM_WIN32 #define G_WITH_CYGWIN" ;; *-*-mingw*) glib_os="#define G_OS_WIN32 #define G_PLATFORM_WIN32" ;; *) glib_os="#define G_OS_UNIX" ;; esac glib_static_compilation="" if test x$glib_win32_static_compilation = xyes; then glib_static_compilation="#define GLIB_STATIC_COMPILATION 1 #define GOBJECT_STATIC_COMPILATION 1" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; "glib/glibconfig.h") CONFIG_COMMANDS="$CONFIG_COMMANDS glib/glibconfig.h" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "glib/Makefile") CONFIG_FILES="$CONFIG_FILES glib/Makefile" ;; "glib/libcharset/Makefile") CONFIG_FILES="$CONFIG_FILES glib/libcharset/Makefile" ;; "glib/gnulib/Makefile") CONFIG_FILES="$CONFIG_FILES glib/gnulib/Makefile" ;; "m4macros/Makefile") CONFIG_FILES="$CONFIG_FILES m4macros/Makefile" ;; "README") CONFIG_FILES="$CONFIG_FILES README" ;; "glib/glib.rc") CONFIG_FILES="$CONFIG_FILES glib/glib.rc" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'`/stamp-h$_am_stamp_count ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir=$dirpart/$fdir; as_fn_mkdir_p # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ;; "libtool":C) # See if we are running on zsh, and set the options that allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi cfgfile=${ofile}T trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # Generated automatically by $as_me ($PACKAGE) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # Provide generalized library-building support services. # Written by Gordon Matzigkeit, 1996 # Copyright (C) 2014 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. # GNU Libtool 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 of of the License, or # (at your option) any later version. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program or library that is built # using GNU Libtool, you may include this file under the same # distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that 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, see . # The names of the tagged configurations supported by this script. available_tags='CXX ' # Configured defaults for sys_lib_dlsearch_path munging. : \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"} # ### BEGIN LIBTOOL CONFIG # Which release of libtool.m4 was used? macro_version=$macro_version macro_revision=$macro_revision # Whether or not to build static libraries. build_old_libs=$enable_static # Assembler program. AS=$lt_AS # DLL creation program. DLLTOOL=$lt_DLLTOOL # Object dumper program. OBJDUMP=$lt_OBJDUMP # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # What type of objects to build. pic_mode=$pic_mode # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # Shared archive member basename,for filename based shared library versioning on AIX. shared_archive_member_spec=$shared_archive_member_spec # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # An echo program that protects backslashes. ECHO=$lt_ECHO # The PATH separator for the build system. PATH_SEPARATOR=$lt_PATH_SEPARATOR # The host system. host_alias=$host_alias host=$host host_os=$host_os # The build system. build_alias=$build_alias build=$build build_os=$build_os # A sed program that does not truncate output. SED=$lt_SED # Sed that helps us avoid accidentally triggering echo(1) options like -n. Xsed="\$SED -e 1s/^X//" # A grep program that handles long lines. GREP=$lt_GREP # An ERE matcher. EGREP=$lt_EGREP # A literal string matcher. FGREP=$lt_FGREP # A BSD- or MS-compatible name lister. NM=$lt_NM # Whether we need soft or hard links. LN_S=$lt_LN_S # What is the maximum length of a command? max_cmd_len=$max_cmd_len # Object file suffix (normally "o"). objext=$ac_objext # Executable file suffix (normally ""). exeext=$exeext # whether the shell understands "unset". lt_unset=$lt_unset # turn spaces into newlines. SP2NL=$lt_lt_SP2NL # turn newlines into spaces. NL2SP=$lt_lt_NL2SP # convert \$build file names to \$host format. to_host_file_cmd=$lt_cv_to_host_file_cmd # convert \$build files to toolchain format. to_tool_file_cmd=$lt_cv_to_tool_file_cmd # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method = "file_magic". file_magic_cmd=$lt_file_magic_cmd # How to find potential files when deplibs_check_method = "file_magic". file_magic_glob=$lt_file_magic_glob # Find potential files using nocaseglob when deplibs_check_method = "file_magic". want_nocaseglob=$lt_want_nocaseglob # Command to associate shared and link libraries. sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd # The archiver. AR=$lt_AR # Flags to create an archive. AR_FLAGS=$lt_AR_FLAGS # How to feed a file listing to the archiver. archiver_list_spec=$lt_archiver_list_spec # A symbol stripping program. STRIP=$lt_STRIP # Commands used to install an old-style archive. RANLIB=$lt_RANLIB old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Whether to use a lock for old archive extraction. lock_old_archive_extraction=$lock_old_archive_extraction # A C compiler. LTCC=$lt_CC # LTCC compiler flags. LTCFLAGS=$lt_CFLAGS # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration. global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm into a list of symbols to manually relocate. global_symbol_to_import=$lt_lt_cv_sys_global_symbol_to_import # Transform the output of nm in a C name address pair. global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # Transform the output of nm in a C name address pair when lib prefix is needed. global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix # The name lister interface. nm_interface=$lt_lt_cv_nm_interface # Specify filename containing input files for \$NM. nm_file_list_spec=$lt_nm_file_list_spec # The root where to search for dependent libraries,and where our libraries should be installed. lt_sysroot=$lt_sysroot # Command to truncate a binary pipe. lt_truncate_bin=$lt_lt_cv_truncate_bin # The name of the directory that contains temporary libtool files. objdir=$objdir # Used to examine libraries when file_magic_cmd begins with "file". MAGIC_CMD=$MAGIC_CMD # Must we lock files when doing compilation? need_locks=$lt_need_locks # Manifest tool. MANIFEST_TOOL=$lt_MANIFEST_TOOL # Tool to manipulate archived DWARF debug symbol files on Mac OS X. DSYMUTIL=$lt_DSYMUTIL # Tool to change global to local symbols on Mac OS X. NMEDIT=$lt_NMEDIT # Tool to manipulate fat objects and archives on Mac OS X. LIPO=$lt_LIPO # ldd/readelf like tool for Mach-O binaries on Mac OS X. OTOOL=$lt_OTOOL # ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. OTOOL64=$lt_OTOOL64 # Old archive suffix (normally "a"). libext=$libext # Shared library suffix (normally ".so"). shrext_cmds=$lt_shrext_cmds # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Variables whose values should be saved in libtool wrapper scripts and # restored at link time. variables_saved_for_relink=$lt_variables_saved_for_relink # Do we need the "lib" prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Library versioning type. version_type=$version_type # Shared library runtime path variable. runpath_var=$runpath_var # Shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Permission mode override for installation of shared libraries. install_override_mode=$lt_install_override_mode # Command to use after installation of a shared archive. postinstall_cmds=$lt_postinstall_cmds # Command to use after uninstallation of a shared archive. postuninstall_cmds=$lt_postuninstall_cmds # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # As "finish_cmds", except a single script fragment to be evaled but # not shown. finish_eval=$lt_finish_eval # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Compile-time system search path for libraries. sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Detected run-time system search path for libraries. sys_lib_dlsearch_path_spec=$lt_configure_time_dlsearch_path # Explicit LT_SYS_LIBRARY_PATH set during ./configure time. configure_time_lt_sys_library_path=$lt_configure_time_lt_sys_library_path # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # The linker used to build libraries. LD=$lt_LD # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds # A language specific compiler. CC=$lt_compiler # Is the compiler the GNU compiler? with_gcc=$GCC # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds archive_expsym_cmds=$lt_archive_expsym_cmds # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds module_expsym_cmds=$lt_module_expsym_cmds # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator # Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct # Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \$shlibpath_var if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms # Symbols that must always be exported. include_expsyms=$lt_include_expsyms # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds # Specify filename containing input files. file_list_spec=$lt_file_list_spec # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action # The directories searched by this compiler when creating a shared library. compiler_lib_search_dirs=$lt_compiler_lib_search_dirs # Dependencies to place before and after the objects being linked to # create a shared library. predep_objects=$lt_predep_objects postdep_objects=$lt_postdep_objects predeps=$lt_predeps postdeps=$lt_postdeps # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path # ### END LIBTOOL CONFIG _LT_EOF cat <<'_LT_EOF' >> "$cfgfile" # ### BEGIN FUNCTIONS SHARED WITH CONFIGURE # func_munge_path_list VARIABLE PATH # ----------------------------------- # VARIABLE is name of variable containing _space_ separated list of # directories to be munged by the contents of PATH, which is string # having a format: # "DIR[:DIR]:" # string "DIR[ DIR]" will be prepended to VARIABLE # ":DIR[:DIR]" # string "DIR[ DIR]" will be appended to VARIABLE # "DIRP[:DIRP]::[DIRA:]DIRA" # string "DIRP[ DIRP]" will be prepended to VARIABLE and string # "DIRA[ DIRA]" will be appended to VARIABLE # "DIR[:DIR]" # VARIABLE will be replaced by "DIR[ DIR]" func_munge_path_list () { case x$2 in x) ;; *:) eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\" ;; x:*) eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\" ;; *::*) eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\" ;; *) eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\" ;; esac } # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. func_cc_basename () { for cc_temp in $*""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` } # ### END FUNCTIONS SHARED WITH CONFIGURE _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test set != "${COLLECT_NAMES+set}"; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac ltmain=$ac_aux_dir/ltmain.sh # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" cat <<_LT_EOF >> "$ofile" # ### BEGIN LIBTOOL TAG CONFIG: CXX # The linker used to build libraries. LD=$lt_LD_CXX # How to create reloadable object files. reload_flag=$lt_reload_flag_CXX reload_cmds=$lt_reload_cmds_CXX # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds_CXX # A language specific compiler. CC=$lt_compiler_CXX # Is the compiler the GNU compiler? with_gcc=$GCC_CXX # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic_CXX # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl_CXX # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static_CXX # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc_CXX # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object_CXX # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds_CXX archive_expsym_cmds=$lt_archive_expsym_cmds_CXX # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds_CXX module_expsym_cmds=$lt_module_expsym_cmds_CXX # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld_CXX # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag_CXX # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag_CXX # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX # Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct_CXX # Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \$shlibpath_var if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute_CXX # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L_CXX # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic_CXX # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath_CXX # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs_CXX # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols_CXX # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds_CXX # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms_CXX # Symbols that must always be exported. include_expsyms=$lt_include_expsyms_CXX # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds_CXX # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds_CXX # Specify filename containing input files. file_list_spec=$lt_file_list_spec_CXX # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action_CXX # The directories searched by this compiler when creating a shared library. compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX # Dependencies to place before and after the objects being linked to # create a shared library. predep_objects=$lt_predep_objects_CXX postdep_objects=$lt_postdep_objects_CXX predeps=$lt_predeps_CXX postdeps=$lt_postdeps_CXX # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path_CXX # ### END LIBTOOL TAG CONFIG: CXX _LT_EOF ;; "glib/glibconfig.h":C) outfile=glib/glibconfig.h-tmp cat > $outfile <<\_______EOF /* glibconfig.h * * This is a generated file. Please modify 'configure.ac' */ #ifndef __GLIBCONFIG_H__ #define __GLIBCONFIG_H__ #include _______EOF if test x$glib_limits_h = xyes; then echo '#include ' >> $outfile fi if test x$glib_float_h = xyes; then echo '#include ' >> $outfile fi if test x$glib_values_h = xyes; then echo '#include ' >> $outfile fi if test "$glib_header_alloca_h" = "yes"; then echo '#define GLIB_HAVE_ALLOCA_H' >> $outfile fi if test x$glib_sys_poll_h = xyes; then echo '#define GLIB_HAVE_SYS_POLL_H' >> $outfile fi if test x$glib_included_printf != xyes; then echo " /* Specifies that GLib's g_print*() functions wrap the * system printf functions. This is useful to know, for example, * when using glibc's register_printf_function(). */" >> $outfile echo '#define GLIB_USING_SYSTEM_PRINTF' >> $outfile fi cat >> $outfile <<_______EOF G_BEGIN_DECLS #define G_MINFLOAT $glib_mf #define G_MAXFLOAT $glib_Mf #define G_MINDOUBLE $glib_md #define G_MAXDOUBLE $glib_Md #define G_MINSHORT $glib_ms #define G_MAXSHORT $glib_Ms #define G_MAXUSHORT $glib_Mus #define G_MININT $glib_mi #define G_MAXINT $glib_Mi #define G_MAXUINT $glib_Mui #define G_MINLONG $glib_ml #define G_MAXLONG $glib_Ml #define G_MAXULONG $glib_Mul _______EOF ### this should always be true in a modern C/C++ compiler cat >>$outfile <<_______EOF typedef signed char gint8; typedef unsigned char guint8; _______EOF if test -n "$gint16"; then cat >>$outfile <<_______EOF typedef signed $gint16 gint16; typedef unsigned $gint16 guint16; #define G_GINT16_MODIFIER $gint16_modifier #define G_GINT16_FORMAT $gint16_format #define G_GUINT16_FORMAT $guint16_format _______EOF fi if test -n "$gint32"; then cat >>$outfile <<_______EOF typedef signed $gint32 gint32; typedef unsigned $gint32 guint32; #define G_GINT32_MODIFIER $gint32_modifier #define G_GINT32_FORMAT $gint32_format #define G_GUINT32_FORMAT $guint32_format _______EOF fi cat >>$outfile <<_______EOF #define G_HAVE_GINT64 1 /* deprecated, always true */ ${glib_extension}typedef signed $gint64 gint64; ${glib_extension}typedef unsigned $gint64 guint64; #define G_GINT64_CONSTANT(val) $gint64_constant #define G_GUINT64_CONSTANT(val) $guint64_constant _______EOF if test x$gint64_format != x ; then cat >>$outfile <<_______EOF #define G_GINT64_MODIFIER $gint64_modifier #define G_GINT64_FORMAT $gint64_format #define G_GUINT64_FORMAT $guint64_format _______EOF else cat >>$outfile <<_______EOF #undef G_GINT64_MODIFIER #undef G_GINT64_FORMAT #undef G_GUINT64_FORMAT _______EOF fi cat >>$outfile <<_______EOF #define GLIB_SIZEOF_VOID_P $glib_void_p #define GLIB_SIZEOF_LONG $glib_long #define GLIB_SIZEOF_SIZE_T $glib_size_t #define GLIB_SIZEOF_SSIZE_T $glib_ssize_t _______EOF cat >>$outfile <<_______EOF typedef signed $glib_ssize_type_define gssize; typedef unsigned $glib_size_type_define gsize; #define G_GSIZE_MODIFIER $gsize_modifier #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_mssize_type #define G_MAXSSIZE G_MAX$glib_mssize_type typedef gint64 goffset; #define G_MINOFFSET G_MININT64 #define G_MAXOFFSET G_MAXINT64 #define G_GOFFSET_MODIFIER G_GINT64_MODIFIER #define G_GOFFSET_FORMAT G_GINT64_FORMAT #define G_GOFFSET_CONSTANT(val) G_GINT64_CONSTANT(val) _______EOF if test -z "$glib_unknown_void_p"; then cat >>$outfile <<_______EOF #define GPOINTER_TO_INT(p) ((gint) ${glib_gpi_cast} (p)) #define GPOINTER_TO_UINT(p) ((guint) ${glib_gpui_cast} (p)) #define GINT_TO_POINTER(i) ((gpointer) ${glib_gpi_cast} (i)) #define GUINT_TO_POINTER(u) ((gpointer) ${glib_gpui_cast} (u)) typedef signed $glib_intptr_type_define gintptr; typedef unsigned $glib_intptr_type_define guintptr; #define G_GINTPTR_MODIFIER $gintptr_modifier #define G_GINTPTR_FORMAT $gintptr_format #define G_GUINTPTR_FORMAT $guintptr_format _______EOF else echo '#error SIZEOF_VOID_P unknown - This should never happen' >>$outfile fi cat >>$outfile <<_______EOF $glib_atexit $glib_memmove $glib_defines $glib_os $glib_static_compilation $glib_vacopy #ifdef __cplusplus #define G_HAVE_INLINE 1 #else /* !__cplusplus */ $glib_inline #endif /* !__cplusplus */ #ifdef __cplusplus #define G_CAN_INLINE 1 _______EOF if test x$g_can_inline = xyes ; then cat >>$outfile <<_______EOF #else /* !__cplusplus */ #define G_CAN_INLINE 1 _______EOF fi cat >>$outfile <<_______EOF #endif _______EOF if test x$g_have_iso_c_varargs = xyes ; then cat >>$outfile <<_______EOF #ifndef __cplusplus # define G_HAVE_ISO_VARARGS 1 #endif _______EOF fi if test x$g_have_iso_cxx_varargs = xyes ; then cat >>$outfile <<_______EOF #ifdef __cplusplus # define G_HAVE_ISO_VARARGS 1 #endif _______EOF fi if test x$g_have_gnuc_varargs = xyes ; then cat >>$outfile <<_______EOF /* gcc-2.95.x supports both gnu style and ISO varargs, but if -ansi * is passed ISO vararg support is turned off, and there is no work * around to turn it on, so we unconditionally turn it off. */ #if __GNUC__ == 2 && __GNUC_MINOR__ == 95 # undef G_HAVE_ISO_VARARGS #endif #define G_HAVE_GNUC_VARARGS 1 _______EOF fi case x$g_stack_grows in xyes) echo "#define G_HAVE_GROWING_STACK 1" >>$outfile ;; *) echo "#define G_HAVE_GROWING_STACK 0" >>$outfile ;; esac echo >>$outfile if test x$g_have_eilseq = xno; then cat >>$outfile <<_______EOF #ifndef EILSEQ /* On some systems, like SunOS and NetBSD, EILSEQ is not defined. * The correspondence between this and the corresponding definition * in libiconv is essential. */ # define EILSEQ ENOENT #endif _______EOF fi if test x$g_have_gnuc_visibility = xyes; then cat >>$outfile <<_______EOF #define G_HAVE_GNUC_VISIBILITY 1 _______EOF fi cat >>$outfile <<_______EOF #if defined(__SUNPRO_C) && (__SUNPRO_C >= 0x590) #define G_GNUC_INTERNAL __attribute__((visibility("hidden"))) #elif defined(__SUNPRO_C) && (__SUNPRO_C >= 0x550) #define G_GNUC_INTERNAL __hidden #elif defined (__GNUC__) && defined (G_HAVE_GNUC_VISIBILITY) #define G_GNUC_INTERNAL __attribute__((visibility("hidden"))) #else #define G_GNUC_INTERNAL #endif _______EOF echo >>$outfile cat >>$outfile <<_______EOF #define G_THREADS_ENABLED #define G_THREADS_IMPL_$g_threads_impl_def _______EOF if test x"$g_memory_barrier_needed" != xno; then echo >>$outfile echo "#define G_ATOMIC_OP_MEMORY_BARRIER_NEEDED 1" >>$outfile fi if test x"$g_atomic_lock_free" = xyes; then echo >>$outfile echo "#define G_ATOMIC_LOCK_FREE" >>$outfile fi echo >>$outfile g_bit_sizes="16 32 64" for bits in $g_bit_sizes; do cat >>$outfile <<_______EOF #define GINT${bits}_TO_${g_bs_native}(val) ((gint${bits}) (val)) #define GUINT${bits}_TO_${g_bs_native}(val) ((guint${bits}) (val)) #define GINT${bits}_TO_${g_bs_alien}(val) ((gint${bits}) GUINT${bits}_SWAP_LE_BE (val)) #define GUINT${bits}_TO_${g_bs_alien}(val) (GUINT${bits}_SWAP_LE_BE (val)) _______EOF done cat >>$outfile <<_______EOF #define GLONG_TO_LE(val) ((glong) GINT${glongbits}_TO_LE (val)) #define GULONG_TO_LE(val) ((gulong) GUINT${glongbits}_TO_LE (val)) #define GLONG_TO_BE(val) ((glong) GINT${glongbits}_TO_BE (val)) #define GULONG_TO_BE(val) ((gulong) GUINT${glongbits}_TO_BE (val)) #define GINT_TO_LE(val) ((gint) GINT${gintbits}_TO_LE (val)) #define GUINT_TO_LE(val) ((guint) GUINT${gintbits}_TO_LE (val)) #define GINT_TO_BE(val) ((gint) GINT${gintbits}_TO_BE (val)) #define GUINT_TO_BE(val) ((guint) GUINT${gintbits}_TO_BE (val)) #define GSIZE_TO_LE(val) ((gsize) GUINT${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${gssizebits}_TO_BE (val)) #define G_BYTE_ORDER $g_byte_order #define GLIB_SYSDEF_POLLIN =$g_pollin #define GLIB_SYSDEF_POLLOUT =$g_pollout #define GLIB_SYSDEF_POLLPRI =$g_pollpri #define GLIB_SYSDEF_POLLHUP =$g_pollhup #define GLIB_SYSDEF_POLLERR =$g_pollerr #define GLIB_SYSDEF_POLLNVAL =$g_pollnval #define G_MODULE_SUFFIX "$g_module_suffix" typedef $g_pid_type GPid; #define GLIB_SYSDEF_AF_UNIX $g_af_unix #define GLIB_SYSDEF_AF_INET $g_af_inet #define GLIB_SYSDEF_AF_INET6 $g_af_inet6 #define GLIB_SYSDEF_MSG_OOB $g_msg_oob #define GLIB_SYSDEF_MSG_PEEK $g_msg_peek #define GLIB_SYSDEF_MSG_DONTROUTE $g_msg_dontroute G_END_DECLS #endif /* __GLIBCONFIG_H__ */ _______EOF if cmp -s $outfile glib/glibconfig.h; then { $as_echo "$as_me:${as_lineno-$LINENO}: glib/glibconfig.h is unchanged" >&5 $as_echo "$as_me: glib/glibconfig.h is unchanged" >&6;} rm -f $outfile else mv $outfile glib/glibconfig.h fi ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi pkg-config-0.29.1/glib/config.h.in0000664000175000017500000005012712665370347013534 00000000000000/* config.h.in. Generated from configure.ac by autoheader. */ /* Define if building universal (internal helper macro) */ #undef AC_APPLE_UNIVERSAL_BUILD /* The normal alignment of `guint32', in bytes. */ #undef ALIGNOF_GUINT32 /* The normal alignment of `guint64', in bytes. */ #undef ALIGNOF_GUINT64 /* The normal alignment of `unsigned long', in bytes. */ #undef ALIGNOF_UNSIGNED_LONG /* poll doesn't work on devices */ #undef BROKEN_POLL /* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP systems. This function is required for `alloca.c' support on those systems. */ #undef CRAY_STACKSEG_END /* Define to 1 if using `alloca.c'. */ #undef C_ALLOCA /* Whether to disable memory pools */ #undef DISABLE_MEM_POOLS /* Whether to enable GC friendliness by default */ #undef ENABLE_GC_FRIENDLY_DEFAULT /* Define the gettext package to be used */ #undef GETTEXT_PACKAGE /* Define to the GLIB binary age */ #undef GLIB_BINARY_AGE /* Define to the GLIB interface age */ #undef GLIB_INTERFACE_AGE /* Dummy catalog directory */ #undef GLIB_LOCALE_DIR /* Define to the GLIB major version */ #undef GLIB_MAJOR_VERSION /* Define to the GLIB micro version */ #undef GLIB_MICRO_VERSION /* Define to the GLIB minor version */ #undef GLIB_MINOR_VERSION /* Have inline keyword */ #undef G_HAVE_INLINE /* Have __inline keyword */ #undef G_HAVE___INLINE /* Have __inline__ keyword */ #undef G_HAVE___INLINE__ /* A 'va_copy' style function */ #undef G_VA_COPY /* 'va_lists' cannot be copies as values */ #undef G_VA_COPY_AS_ARRAY /* Define to 1 if you have `alloca', as a function or macro. */ #undef HAVE_ALLOCA /* Define to 1 if you have and it should be used (not on Ultrix). */ #undef HAVE_ALLOCA_H /* Define to 1 if you have the `atexit' function. */ #undef HAVE_ATEXIT /* Define if you have a version of the snprintf function with semantics as specified by the ISO C99 standard. */ #undef HAVE_C99_SNPRINTF /* Define if you have a version of the vsnprintf function with semantics as specified by the ISO C99 standard. */ #undef HAVE_C99_VSNPRINTF /* define to 1 if Carbon is available */ #undef HAVE_CARBON /* Define to 1 if you have the `chown' function. */ #undef HAVE_CHOWN /* Define to 1 if you have the `clock_gettime' function. */ #undef HAVE_CLOCK_GETTIME /* define to 1 if Cocoa is available */ #undef HAVE_COCOA /* Have nl_langinfo (CODESET) */ #undef HAVE_CODESET /* Define to 1 if you have the header file. */ #undef HAVE_CRT_EXTERNS_H /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_DIRENT_H /* Define to 1 if you have the header file. */ #undef HAVE_DLFCN_H /* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */ #undef HAVE_DOPRNT /* define for working do while(0) macros */ #undef HAVE_DOWHILE_MACROS /* Define to 1 if you have the `endmntent' function. */ #undef HAVE_ENDMNTENT /* Define to 1 if you have the `endservent' function. */ #undef HAVE_ENDSERVENT /* we have the eventfd(2) system call */ #undef HAVE_EVENTFD /* Define to 1 if you have the `fallocate' function. */ #undef HAVE_FALLOCATE /* Define to 1 if you have the `fchmod' function. */ #undef HAVE_FCHMOD /* Define to 1 if you have the `fchown' function. */ #undef HAVE_FCHOWN /* Define to 1 if you have the `fdwalk' function. */ #undef HAVE_FDWALK /* Define to 1 if you have the header file. */ #undef HAVE_FLOAT_H /* Define to 1 if you have the header file. */ #undef HAVE_FSTAB_H /* Define to 1 if you have the `fsync' function. */ #undef HAVE_FSYNC /* we have the futex(2) system call */ #undef HAVE_FUTEX /* Define to 1 if you have the `getcwd' function. */ #undef HAVE_GETCWD /* Define to 1 if you have the `getc_unlocked' function. */ #undef HAVE_GETC_UNLOCKED /* Define to 1 if you have the `getfsstat' function. */ #undef HAVE_GETFSSTAT /* Define to 1 if you have the `getgrgid' function. */ #undef HAVE_GETGRGID /* Define to 1 if you have the `getmntent_r' function. */ #undef HAVE_GETMNTENT_R /* Define to 1 if you have the `getprotobyname_r' function. */ #undef HAVE_GETPROTOBYNAME_R /* Define to 1 if you have the `getpwuid' function. */ #undef HAVE_GETPWUID /* Define to 1 if you have the `getresuid' function. */ #undef HAVE_GETRESUID /* Define to 1 if you have the `getvfsstat' function. */ #undef HAVE_GETVFSSTAT /* Define to 1 if you have the `gmtime_r' function. */ #undef HAVE_GMTIME_R /* define to use system printf */ #undef HAVE_GOOD_PRINTF /* Define to 1 if you have the header file. */ #undef HAVE_GRP_H /* Define to 1 if you have the `hasmntopt' function. */ #undef HAVE_HASMNTOPT /* Define to 1 if you have the `if_indextoname' function. */ #undef HAVE_IF_INDEXTONAME /* Define to 1 if you have the `if_nametoindex' function. */ #undef HAVE_IF_NAMETOINDEX /* Define to 1 if you have the `inotify_init1' function. */ #undef HAVE_INOTIFY_INIT1 /* define to support printing 64-bit integers with format I64 */ #undef HAVE_INT64_AND_I64 /* Define if you have the 'intmax_t' type in or . */ #undef HAVE_INTMAX_T /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define if exists, doesn't clash with , and declares uintmax_t. */ #undef HAVE_INTTYPES_H_WITH_UINTMAX /* Define if we have struct ip_mreqn */ #undef HAVE_IP_MREQN /* Define to 1 if you have the `issetugid' function. */ #undef HAVE_ISSETUGID /* Define to 1 if you have the `kevent' function. */ #undef HAVE_KEVENT /* Define to 1 if you have the `kqueue' function. */ #undef HAVE_KQUEUE /* Define if you have and nl_langinfo(CODESET). */ #undef HAVE_LANGINFO_CODESET /* Have nl_langinfo (_NL_CTYPE_OUTDIGITn_MB) */ #undef HAVE_LANGINFO_OUTDIGIT /* Have nl_langinfo (PM_STR) */ #undef HAVE_LANGINFO_TIME /* Define to 1 if you have the `lchmod' function. */ #undef HAVE_LCHMOD /* Define to 1 if you have the `lchown' function. */ #undef HAVE_LCHOWN /* Define if you have the __libc_enable_secure variable (GNU libc, eglibc) */ #undef HAVE_LIBC_ENABLE_SECURE /* Define to 1 if you have the header file. */ #undef HAVE_LIMITS_H /* Define to 1 if you have the `link' function. */ #undef HAVE_LINK /* Define to 1 if you have the header file. */ #undef HAVE_LINUX_MAGIC_H /* Define to 1 if you have the `localtime_r' function. */ #undef HAVE_LOCALTIME_R /* Define if you have the 'long double' type. */ #undef HAVE_LONG_DOUBLE /* Define if you have the 'long long' type. */ #undef HAVE_LONG_LONG /* define if system printf can print long long */ #undef HAVE_LONG_LONG_FORMAT /* Define to 1 if you have the `lstat' function. */ #undef HAVE_LSTAT /* Define to 1 if you have the header file. */ #undef HAVE_MALLOC_H /* Define to 1 if you have the `memalign' function. */ #undef HAVE_MEMALIGN /* Define to 1 if you have the `memmem' function. */ #undef HAVE_MEMMEM /* Define to 1 if you have the `memmove' function. */ #undef HAVE_MEMMOVE /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the `mmap' function. */ #undef HAVE_MMAP /* Define to 1 if you have the header file. */ #undef HAVE_MNTENT_H /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_NDIR_H /* We have AF_NETLINK sockets */ #undef HAVE_NETLINK /* Define to 1 if you have the `newlocale' function. */ #undef HAVE_NEWLOCALE /* Have non-POSIX function getgrgid_r */ #undef HAVE_NONPOSIX_GETGRGID_R /* Have non-POSIX function getpwuid_r */ #undef HAVE_NONPOSIX_GETPWUID_R /* Define to 1 if you have the `on_exit' function. */ #undef HAVE_ON_EXIT /* Define to 1 if you have the `pipe2' function. */ #undef HAVE_PIPE2 /* Define to 1 if you have the `poll' function. */ #undef HAVE_POLL /* Have POSIX function getgrgid_r */ #undef HAVE_POSIX_GETGRGID_R /* Have POSIX function getpwuid_r */ #undef HAVE_POSIX_GETPWUID_R /* Define to 1 if you have the `posix_memalign' function. */ #undef HAVE_POSIX_MEMALIGN /* Define to 1 if you have the `prlimit' function. */ #undef HAVE_PRLIMIT /* Have function pthread_attr_setstacksize */ #undef HAVE_PTHREAD_ATTR_SETSTACKSIZE /* Have function pthread_condattr_setclock */ #undef HAVE_PTHREAD_CONDATTR_SETCLOCK /* Have function pthread_cond_timedwait_monotonic */ #undef HAVE_PTHREAD_COND_TIMEDWAIT_MONOTONIC /* Have function pthread_cond_timedwait_monotonic_np */ #undef HAVE_PTHREAD_COND_TIMEDWAIT_MONOTONIC_NP /* Define to 1 if the system has the type `ptrdiff_t'. */ #undef HAVE_PTRDIFF_T /* Define to 1 if you have the header file. */ #undef HAVE_PWD_H /* Define to 1 if you have the `readlink' function. */ #undef HAVE_READLINK /* Define to 1 if you have the 'res_init' function. */ #undef HAVE_RES_INIT /* Define to 1 if you have the header file. */ #undef HAVE_SCHED_H /* Define to 1 if you have the `setenv' function. */ #undef HAVE_SETENV /* Define to 1 if you have the `setlocale' function. */ #undef HAVE_SETLOCALE /* Define to 1 if you have the `setmntent' function. */ #undef HAVE_SETMNTENT /* Define if you have the 'sig_atomic_t' type. */ #undef HAVE_SIG_ATOMIC_T /* Define to 1 if you have the `snprintf' function. */ #undef HAVE_SNPRINTF /* Define to 1 if you have the `splice' function. */ #undef HAVE_SPLICE /* Define to 1 if you have the `statfs' function. */ #undef HAVE_STATFS /* Define to 1 if you have the `statvfs' function. */ #undef HAVE_STATVFS /* Define to 1 if you have the header file. */ #undef HAVE_STDDEF_H /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define if exists, doesn't clash with , and declares uintmax_t. */ #undef HAVE_STDINT_H_WITH_UINTMAX /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the `stpcpy' function. */ #undef HAVE_STPCPY /* Define to 1 if you have the `strcasecmp' function. */ #undef HAVE_STRCASECMP /* Define to 1 if you have the `strerror' function. */ #undef HAVE_STRERROR /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Have functions strlcpy and strlcat */ #undef HAVE_STRLCPY /* Define to 1 if you have the `strncasecmp' function. */ #undef HAVE_STRNCASECMP /* Define to 1 if you have the `strsignal' function. */ #undef HAVE_STRSIGNAL /* Define to 1 if you have the `strtod_l' function. */ #undef HAVE_STRTOD_L /* Define to 1 if you have the `strtoll_l' function. */ #undef HAVE_STRTOLL_L /* Define to 1 if you have the `strtoull_l' function. */ #undef HAVE_STRTOULL_L /* Define to 1 if `d_type' is a member of `struct dirent'. */ #undef HAVE_STRUCT_DIRENT_D_TYPE /* Define to 1 if `f_bavail' is a member of `struct statfs'. */ #undef HAVE_STRUCT_STATFS_F_BAVAIL /* Define to 1 if `f_fstypename' is a member of `struct statfs'. */ #undef HAVE_STRUCT_STATFS_F_FSTYPENAME /* Define to 1 if `f_basetype' is a member of `struct statvfs'. */ #undef HAVE_STRUCT_STATVFS_F_BASETYPE /* Define to 1 if `f_fstypename' is a member of `struct statvfs'. */ #undef HAVE_STRUCT_STATVFS_F_FSTYPENAME /* Define to 1 if `st_atimensec' is a member of `struct stat'. */ #undef HAVE_STRUCT_STAT_ST_ATIMENSEC /* Define to 1 if `st_atim.tv_nsec' is a member of `struct stat'. */ #undef HAVE_STRUCT_STAT_ST_ATIM_TV_NSEC /* Define to 1 if `st_blksize' is a member of `struct stat'. */ #undef HAVE_STRUCT_STAT_ST_BLKSIZE /* Define to 1 if `st_blocks' is a member of `struct stat'. */ #undef HAVE_STRUCT_STAT_ST_BLOCKS /* Define to 1 if `st_ctimensec' is a member of `struct stat'. */ #undef HAVE_STRUCT_STAT_ST_CTIMENSEC /* Define to 1 if `st_ctim.tv_nsec' is a member of `struct stat'. */ #undef HAVE_STRUCT_STAT_ST_CTIM_TV_NSEC /* Define to 1 if `st_mtimensec' is a member of `struct stat'. */ #undef HAVE_STRUCT_STAT_ST_MTIMENSEC /* Define to 1 if `st_mtim.tv_nsec' is a member of `struct stat'. */ #undef HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC /* Define to 1 if `tm_gmtoff' is a member of `struct tm'. */ #undef HAVE_STRUCT_TM_TM_GMTOFF /* Define to 1 if `__tm_gmtoff' is a member of `struct tm'. */ #undef HAVE_STRUCT_TM___TM_GMTOFF /* Define to 1 if you have the `symlink' function. */ #undef HAVE_SYMLINK /* Define to 1 if you have the `sysctlbyname' function. */ #undef HAVE_SYSCTLBYNAME /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_SYS_DIR_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_EVENT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_FILIO_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_INOTIFY_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_MKDEV_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_MNTCTL_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_MNTTAB_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_MOUNT_H /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_SYS_NDIR_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_PARAM_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_POLL_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_PRCTL_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_RESOURCE_H /* found fd_set in sys/select.h */ #undef HAVE_SYS_SELECT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STATFS_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STATVFS_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SYSCTL_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TIMES_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TIME_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_UIO_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_VFSTAB_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_VFS_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_VMOUNT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_WAIT_H /* Define to 1 if you have the `timegm' function. */ #undef HAVE_TIMEGM /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define if your printf function family supports positional parameters as specified by Unix98. */ #undef HAVE_UNIX98_PRINTF /* Define to 1 if you have the `unsetenv' function. */ #undef HAVE_UNSETENV /* Define to 1 if you have the `uselocale' function. */ #undef HAVE_USELOCALE /* Define to 1 if you have the `utimes' function. */ #undef HAVE_UTIMES /* Define to 1 if you have the `valloc' function. */ #undef HAVE_VALLOC /* Define to 1 if you have the header file. */ #undef HAVE_VALUES_H /* Define to 1 if you have the `vasprintf' function. */ #undef HAVE_VASPRINTF /* Define to 1 if you have the `vprintf' function. */ #undef HAVE_VPRINTF /* Define to 1 if you have the `vsnprintf' function. */ #undef HAVE_VSNPRINTF /* Define if you have the 'wchar_t' type. */ #undef HAVE_WCHAR_T /* Define to 1 if you have the `wcslen' function. */ #undef HAVE_WCSLEN /* Define if you have the 'wint_t' type. */ #undef HAVE_WINT_T /* Have a working bcopy */ #undef HAVE_WORKING_BCOPY /* Define to 1 if you have the header file. */ #undef HAVE_XLOCALE_H /* Define to 1 if you have the `_NSGetEnviron' function. */ #undef HAVE__NSGETENVIRON /* Define to the sub-directory where libtool stores uninstalled libraries. */ #undef LT_OBJDIR /* didn't find fd_set */ #undef NO_FD_SET /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* define if posix_memalign() can allocate any size */ #undef POSIX_MEMALIGN_WITH_COMPLIANT_ALLOCS /* The size of `char', as computed by sizeof. */ #undef SIZEOF_CHAR /* The size of `int', as computed by sizeof. */ #undef SIZEOF_INT /* The size of `long', as computed by sizeof. */ #undef SIZEOF_LONG /* The size of `long long', as computed by sizeof. */ #undef SIZEOF_LONG_LONG /* The size of `short', as computed by sizeof. */ #undef SIZEOF_SHORT /* The size of `size_t', as computed by sizeof. */ #undef SIZEOF_SIZE_T /* The size of `ssize_t', as computed by sizeof. */ #undef SIZEOF_SSIZE_T /* The size of `void *', as computed by sizeof. */ #undef SIZEOF_VOID_P /* The size of `__int64', as computed by sizeof. */ #undef SIZEOF___INT64 /* If using the C implementation of alloca, define if you know the direction of stack growth for your system; otherwise it will be automatically deduced at runtime. STACK_DIRECTION > 0 => grows toward higher addresses STACK_DIRECTION < 0 => grows toward lower addresses STACK_DIRECTION = 0 => direction of growth unknown */ #undef STACK_DIRECTION /* Number of arguments to statfs() */ #undef STATFS_ARGS /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Use no threads */ #undef THREADS_NONE /* Use pthreads */ #undef THREADS_POSIX /* Use w32 threads */ #undef THREADS_WIN32 /* Using GNU libiconv */ #undef USE_LIBICONV_GNU /* Using a native implementation of iconv in a separate library */ #undef USE_LIBICONV_NATIVE /* Define to use statfs() */ #undef USE_STATFS /* Define to use statvfs() */ #undef USE_STATVFS /* Enable extensions on AIX 3, Interix. */ #ifndef _ALL_SOURCE # undef _ALL_SOURCE #endif /* Enable GNU extensions on systems that have them. */ #ifndef _GNU_SOURCE # undef _GNU_SOURCE #endif /* Enable threading extensions on Solaris. */ #ifndef _POSIX_PTHREAD_SEMANTICS # undef _POSIX_PTHREAD_SEMANTICS #endif /* Enable extensions on HP NonStop. */ #ifndef _TANDEM_SOURCE # undef _TANDEM_SOURCE #endif /* Enable general extensions on Solaris. */ #ifndef __EXTENSIONS__ # undef __EXTENSIONS__ #endif /* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most significant byte first (like Motorola and SPARC, unlike Intel). */ #if defined AC_APPLE_UNIVERSAL_BUILD # if defined __BIG_ENDIAN__ # define WORDS_BIGENDIAN 1 # endif #else # ifndef WORDS_BIGENDIAN # undef WORDS_BIGENDIAN # endif #endif /* Enable large inode numbers on Mac OS X 10.5. */ #ifndef _DARWIN_USE_64_BIT_INODE # define _DARWIN_USE_64_BIT_INODE 1 #endif /* Number of bits in a file offset, on hosts where this is settable. */ #undef _FILE_OFFSET_BITS /* defines how to decorate public symbols while building */ #undef _GLIB_EXTERN /* Define for large files, on AIX-style hosts. */ #undef _LARGE_FILES /* Define to 1 if on MINIX. */ #undef _MINIX /* Define to 2 if the system does not provide POSIX.1 features except with this defined. */ #undef _POSIX_1_SOURCE /* Define to 1 if you need to in order for `stat' and other things to work. */ #undef _POSIX_SOURCE /* Target the Windows XP API */ #undef _WIN32_WINNT /* Needed to get declarations for msg_control and msg_controllen on Solaris */ #undef _XOPEN_SOURCE /* Needed to get declarations for msg_control and msg_controllen on Solaris */ #undef _XOPEN_SOURCE_EXTENDED /* Needed to get declarations for msg_control and msg_controllen on Solaris */ #undef __EXTENSIONS__ /* compiler supports atomic operations */ #undef __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4 /* Define to empty if `const' does not conform to ANSI C. */ #undef const /* Define to long or long long if and don't define. */ #undef intmax_t /* Define to empty if the C compiler doesn't support this keyword. */ #undef signed /* Define to `unsigned int' if does not define. */ #undef size_t pkg-config-0.29.1/glib/missing0000755000175000017500000001533012601774025013072 00000000000000#! /bin/sh # Common wrapper for a few potentially missing GNU programs. scriptversion=2013-10-28.13; # UTC # Copyright (C) 1996-2014 Free Software Foundation, Inc. # Originally written by Fran,cois Pinard , 1996. # 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, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try '$0 --help' for more information" exit 1 fi case $1 in --is-lightweight) # Used by our autoconf macros to check whether the available missing # script is modern enough. exit 0 ;; --run) # Back-compat with the calling convention used by older automake. shift ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due to PROGRAM being missing or too old. Options: -h, --help display this help and exit -v, --version output version information and exit Supported PROGRAM values: aclocal autoconf autoheader autom4te automake makeinfo bison yacc flex lex help2man Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and 'g' are ignored when checking the name. Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: unknown '$1' option" echo 1>&2 "Try '$0 --help' for more information" exit 1 ;; esac # Run the given program, remember its exit status. "$@"; st=$? # If it succeeded, we are done. test $st -eq 0 && exit 0 # Also exit now if we it failed (or wasn't found), and '--version' was # passed; such an option is passed most likely to detect whether the # program is present and works. case $2 in --version|--help) exit $st;; esac # Exit code 63 means version mismatch. This often happens when the user # tries to use an ancient version of a tool on a file that requires a # minimum version. if test $st -eq 63; then msg="probably too old" elif test $st -eq 127; then # Program was missing. msg="missing on your system" else # Program was found and executed, but failed. Give up. exit $st fi perl_URL=http://www.perl.org/ flex_URL=http://flex.sourceforge.net/ gnu_software_URL=http://www.gnu.org/software program_details () { case $1 in aclocal|automake) echo "The '$1' program is part of the GNU Automake package:" echo "<$gnu_software_URL/automake>" echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/autoconf>" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; autoconf|autom4te|autoheader) echo "The '$1' program is part of the GNU Autoconf package:" echo "<$gnu_software_URL/autoconf/>" echo "It also requires GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; esac } give_advice () { # Normalize program name to check for. normalized_program=`echo "$1" | sed ' s/^gnu-//; t s/^gnu//; t s/^g//; t'` printf '%s\n' "'$1' is $msg." configure_deps="'configure.ac' or m4 files included by 'configure.ac'" case $normalized_program in autoconf*) echo "You should only need it if you modified 'configure.ac'," echo "or m4 files included by it." program_details 'autoconf' ;; autoheader*) echo "You should only need it if you modified 'acconfig.h' or" echo "$configure_deps." program_details 'autoheader' ;; automake*) echo "You should only need it if you modified 'Makefile.am' or" echo "$configure_deps." program_details 'automake' ;; aclocal*) echo "You should only need it if you modified 'acinclude.m4' or" echo "$configure_deps." program_details 'aclocal' ;; autom4te*) echo "You might have modified some maintainer files that require" echo "the 'autom4te' program to be rebuilt." program_details 'autom4te' ;; bison*|yacc*) echo "You should only need it if you modified a '.y' file." echo "You may want to install the GNU Bison package:" echo "<$gnu_software_URL/bison/>" ;; lex*|flex*) echo "You should only need it if you modified a '.l' file." echo "You may want to install the Fast Lexical Analyzer package:" echo "<$flex_URL>" ;; help2man*) echo "You should only need it if you modified a dependency" \ "of a man page." echo "You may want to install the GNU Help2man package:" echo "<$gnu_software_URL/help2man/>" ;; makeinfo*) echo "You should only need it if you modified a '.texi' file, or" echo "any other file indirectly affecting the aspect of the manual." echo "You might want to install the Texinfo package:" echo "<$gnu_software_URL/texinfo/>" echo "The spurious makeinfo call might also be the consequence of" echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" echo "want to install GNU make:" echo "<$gnu_software_URL/make/>" ;; *) echo "You might have modified some files without having the proper" echo "tools for further handling them. Check the 'README' file, it" echo "often tells you about the needed prerequisites for installing" echo "this package. You may also peek at any GNU archive site, in" echo "case some other package contains this missing '$1' program." ;; esac } give_advice "$1" | sed -e '1s/^/WARNING: /' \ -e '2,$s/^/ /' >&2 # Propagate the correct exit status (expected to be 127 for a program # not found, 63 for a program that failed due to version mismatch). exit $st # Local variables: # 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: pkg-config-0.29.1/glib/README.in0000664000175000017500000003223112651243552012762 00000000000000General Information =================== This is GLib version @GLIB_VERSION@. GLib is the low-level core library that forms the basis for projects such as GTK+ and GNOME. It provides data structure handling for C, portability wrappers, and interfaces for such runtime functionality as an event loop, threads, dynamic loading, and an object system. The official download locations are: ftp://ftp.gtk.org/pub/glib http://download.gnome.org/sources/glib The official web site is: http://www.gtk.org/ Information about mailing lists can be found at http://www.gtk.org/mailing-lists.php To subscribe, send mail to gtk-list-request@gnome.org with the subject "subscribe". Installation ============ See the file 'INSTALL' How to report bugs ================== Bugs should be reported to the GNOME bug tracking system. (http://bugzilla.gnome.org, product glib.) You will need to create an account for yourself. In the bug report please include: * Information about your system. For instance: - What operating system and version - For Linux, what version of the C library And anything else you think is relevant. * How to reproduce the bug. If you can reproduce it with one of the test programs that are built in the tests/ subdirectory, that will be most convenient. Otherwise, please include a short test program that exhibits the behavior. As a last resort, you can also provide a pointer to a larger piece of software that can be downloaded. * If the bug was a crash, the exact text that was printed out when the crash occured. * Further information such as stack traces may be useful, but is not necessary. Patches ======= Patches should also be submitted to bugzilla.gnome.org. If the patch fixes an existing bug, add the patch as an attachment to that bug report. Otherwise, enter a new bug report that describes the patch, and attach the patch to that bug report. 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 ===================== * It is no longer necessary to use g_thread_init() or to link against libgthread. libglib is now always thread-enabled. Custom thread system implementations are no longer supported (including errorcheck mutexes). * The thread and synchronisation APIs have been updated. GMutex and GCond can be statically allocated without explicit initialisation, as can new types GRWLock and GRecMutex. The GStatic_______ variants of these types have been deprecated. GPrivate can also be statically allocated and has a nicer API (deprecating GStaticPrivate). Finally, g_thread_create() has been replaced with a substantially simplified g_thread_new(). * The g_once_init_enter()/_leave() functions have been replaced with macros that allow for a pointer to any gsize-sized object, not just a gsize*. The assertions to ensure that a pointer to a correctly-sized object is being used will not work with generic pointers (ie: (void*) and (gpointer) casts) which would have worked with the old version. * It is now mandatory to include glib.h instead of individual headers. * The -uninstalled variants of the pkg-config files have been dropped. * For a long time, gobject-2.0.pc mistakenly declared a public dependency on gthread-2.0.pc (when the dependency should have been private). This means that programs got away with calling g_thread_init() without explicitly listing gthread-2.0.pc among their dependencies. gthread has now been removed as a gobject dependency, which will cause such programs to break. The fix for this problem is either to declare an explicit dependency on gthread-2.0.pc (if you care about compatibility with older GLib versions) or to stop calling g_thread_init(). * g_debug() output is no longer enabled by default. It can be enabled on a per-domain basis with the G_MESSAGES_DEBUG environment variable like G_MESSAGES_DEBUG=domain1,domain2 or G_MESSAGES_DEBUG=all Notes about GLib 2.30 ===================== * GObject includes a generic marshaller, g_cclosure_marshal_generic. To use it, simply specify NULL as the marshaller in g_signal_new(). The generic marshaller is implemented with libffi, and consequently GObject depends on libffi now. Notes about GLib 2.28 ===================== * The GApplication API has changed compared to the version that was included in the 2.25 development snapshots. Existing users will need adjustments. Notes about GLib 2.26 ===================== * Nothing noteworthy. Notes about GLib 2.24 ===================== * It is now allowed to call g_thread_init(NULL) multiple times, and to call glib functions before g_thread_init(NULL) is called (although the later is mainly a change in docs as this worked before too). See the GThread reference documentation for the details. * GObject now links to GThread and threads are enabled automatically when g_type_init() is called. * GObject no longer allows to call g_object_set() on construct-only properties while an object is being initialized. If this behavior is needed, setting a custom constructor that just chains up will re-enable this functionality. * GMappedFile on an empty file now returns NULL for the contents instead of returning an empty string. The documentation specifically states that code may not rely on nul-termination here so any breakage caused by this change is a bug in application code. Notes about GLib 2.22 ===================== * Repeated calls to g_simple_async_result_set_op_res_gpointer used to leak the data. This has been fixed to always call the provided destroy notify. Notes about GLib 2.20 ===================== * The functions for launching applications (e.g. g_app_info_launch() + friends) now passes a FUSE file:// URI if possible (requires gvfs with the FUSE daemon to be running and operational). With gvfs 2.26, FUSE file:// URIs will be mapped back to gio URIs in the GFile constructors. The intent of this change is to better integrate POSIX-only applications, see bug #528670 for the rationale. The only user-visible change is when an application needs to examine an URI passed to it (e.g. as a positional parameter). Instead of looking at the given URI, the application will now need to look at the result of g_file_get_uri() after having constructed a GFile object with the given URI. Notes about GLib 2.18 ===================== * The recommended way of using GLib has always been to only include the toplevel headers glib.h, glib-object.h and gio.h. GLib enforces this by generating an error when individual headers are directly included. To help with the transition, the enforcement is not turned on by default for GLib headers (it is turned on for GObject and GIO). To turn it on, define the preprocessor symbol G_DISABLE_SINGLE_INCLUDES. Notes about GLib 2.16 ===================== * GLib now includes GIO, which adds optional dependencies against libattr and libselinux for extended attribute and SELinux support. Use --disable-xattr and --disable-selinux to build without these. Notes about GLib 2.10 ===================== * The functions g_snprintf() and g_vsnprintf() have been removed from the gprintf.h header, since they are already declared in glib.h. This doesn't break documented use of gprintf.h, but people have been known to include gprintf.h without including glib.h. * The Unicode support has been updated to Unicode 4.1. This adds several new members to the GUnicodeBreakType enumeration. * The support for Solaris threads has been retired. Solaris has provided POSIX threads for long enough now to have them available on every Solaris platform. * 'make check' has been changed to validate translations by calling msgfmt with the -c option. As a result, it may fail on systems with older gettext implementations (GNU gettext < 0.14.1, or Solaris gettext). 'make check' will also fail on systems where the C compiler does not support ELF visibility attributes. * The GMemChunk API has been deprecated in favour of a new 'slice allocator'. See the g_slice documentation for more details. * A new type, GInitiallyUnowned, has been introduced, which is intended to serve as a common implementation of the 'floating reference' concept that is e.g. used by GtkObject. Note that changing the inheritance hierarchy of a type can cause problems for language bindings and other code which needs to work closely with the type system. Therefore, switching to GInitiallyUnowned should be done carefully. g_object_compat_control() has been added to GLib 2.8.5 to help with the transition. Notes about GLib 2.6.0 ====================== * GLib 2.6 introduces the concept of 'GLib filename encoding', which is the on-disk encoding on Unix, but UTF-8 on Windows. All GLib functions returning or accepting pathnames have been changed to expect filenames in this encoding, and the common POSIX functions dealing with pathnames have been wrapped. These wrappers are declared in the header which must be included explicitly; it is not included through . On current (NT-based) Windows versions, where the on-disk file names are Unicode, these wrappers use the wide-character API in the C library. Thus applications can handle file names containing any Unicode characters through GLib's own API and its POSIX wrappers, not just file names restricted to characters in the system codepage. To keep binary compatibility with applications compiled against older versions of GLib, the Windows DLL still provides entry points with the old semantics using the old names, and applications compiled against GLib 2.6 will actually use new names for the functions. This is transparent to the programmer. When compiling against GLib 2.6, applications intended to be portable to Windows must take the UTF-8 file name encoding into consideration, and use the gstdio wrappers to access files whose names have been constructed from strings returned from GLib. * Likewise, g_get_user_name() and g_get_real_name() have been changed to return UTF-8 on Windows, while keeping the old semantics for applications compiled against older versions of GLib. * The GLib uses an '_' prefix to indicate private symbols that must not be used by applications. On some platforms, symbols beginning with prefixes such as _g will be exported from the library, on others not. In no case can applications use these private symbols. In addition to that, GLib+ 2.6 makes several symbols private which were not in any installed header files and were never intended to be exported. * To reduce code size and improve efficiency, GLib, when compiled with the GNU toolchain, has separate internal and external entry points for exported functions. The internal names, which begin with IA__, may be seen when debugging a GLib program. * On Windows, GLib no longer opens a console window when printing warning messages if stdout or stderr are invalid, as they are in "Windows subsystem" (GUI) applications. Simply redirect stdout or stderr if you need to see them. * The child watch functionality tends to reveal a bug in many thread implementations (in particular the older LinuxThreads implementation on Linux) where it's not possible to call waitpid() for a child created in a different thread. For this reason, for maximum portability, you should structure your code to fork all child processes that you want to wait for from the main thread. * A problem was recently discovered with g_signal_connect_object(); it doesn't actually disconnect the signal handler once the object being connected to dies, just disables it. See the API docs for the function for further details and the correct workaround that will continue to work with future versions of GLib. pkg-config-0.29.1/glib/Makefile.am0000664000175000017500000000266112651243552013535 00000000000000## Process this file with automake to produce Makefile.in include $(top_srcdir)/glib.mk # http://people.gnome.org/~walters/docs/build-api.txt .buildapi-allow-builddir: ACLOCAL_AMFLAGS = -I m4macros ${ACLOCAL_FLAGS} SUBDIRS = . m4macros glib DIST_SUBDIRS = $(SUBDIRS) AM_CPPFLAGS = \ -DG_LOG_DOMAIN=g_log_domain_glib \ @GLIB_DEBUG_FLAGS@ \ -DG_DISABLE_DEPRECATED \ -DGLIB_COMPILATION EXTRA_DIST += \ acglib.m4 \ README.in \ glib.mk \ $(NULL) # These may be in the builddir too 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 distclean-local: lcov-clean if test $(srcdir) = .; then :; else \ rm -f $(BUILT_EXTRA_DIST); \ fi .PHONY: files release sanity snapshot files: @files=`ls $(DISTFILES) 2> /dev/null `; for p in $$files; do \ echo $$p; \ done release: rm -rf .deps */.deps cd docs && make glib.html $(MAKE) distcheck sanity: ./sanity_check $(VERSION) snapshot: $(MAKE) dist distdir=$(PACKAGE)-snap`date +"%Y%m%d"` snapcheck: $(MAKE) distcheck distdir=$(PACKAGE)-snap`date +"%Y%m%d"` dist-hook: $(BUILT_EXTRA_DIST) files='$(BUILT_EXTRA_DIST)'; \ for f in $$files; do \ if test -f $$f; then d=.; else d=$(srcdir); fi; \ rm -f $(distdir)/$$f && cp $$d/$$f $(distdir) || exit 1; done pkg-config-0.29.1/glib/install-sh0000755000175000017500000003452312601774025013504 00000000000000#!/bin/sh # install - install a program, script, or datafile scriptversion=2013-12-25.23; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # 'make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. tab=' ' nl=' ' IFS=" $tab$nl" # Set DOITPROG to "echo" to test this script. doit=${DOITPROG-} doit_exec=${doit:-exec} # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false is_target_a_directory=possibly usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) is_target_a_directory=always dst_arg=$2 # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac shift;; -T) is_target_a_directory=never;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done # We allow the use of options -d and -T together, by making -d # take the precedence; this is for compatibility with GNU install. if test -n "$dir_arg"; then if test -n "$dst_arg"; then echo "$0: target directory not allowed when installing a directory." >&2 exit 1 fi fi if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call 'install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then if test $# -gt 1 || test "$is_target_a_directory" = always; then if test ! -d "$dst_arg"; then echo "$0: $dst_arg: Is not a directory." >&2 exit 1 fi fi fi if test -z "$dir_arg"; then do_exit='(exit $ret); exit $ret' trap "ret=129; $do_exit" 1 trap "ret=130; $do_exit" 2 trap "ret=141; $do_exit" 13 trap "ret=143; $do_exit" 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names problematic for 'test' and other utilities. case $src in -* | [=\(\)!]) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test "$is_target_a_directory" = never; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else dstdir=`dirname "$dst"` test -d "$dstdir" dstdir_status=$? fi fi obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 if (umask $mkdir_umask && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. ls_ld_tmpdir=`ls -ld "$tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/d" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; [-=\(\)!]*) prefix='./';; *) prefix='';; esac oIFS=$IFS IFS=/ set -f set fnord $dstdir shift set +f IFS=$oIFS prefixes= for d do test X"$d" = X && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # 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: pkg-config-0.29.1/glib/README0000664000175000017500000003222112665370350012356 00000000000000General Information =================== This is GLib version 2.38.2. GLib is the low-level core library that forms the basis for projects such as GTK+ and GNOME. It provides data structure handling for C, portability wrappers, and interfaces for such runtime functionality as an event loop, threads, dynamic loading, and an object system. The official download locations are: ftp://ftp.gtk.org/pub/glib http://download.gnome.org/sources/glib The official web site is: http://www.gtk.org/ Information about mailing lists can be found at http://www.gtk.org/mailing-lists.php To subscribe, send mail to gtk-list-request@gnome.org with the subject "subscribe". Installation ============ See the file 'INSTALL' How to report bugs ================== Bugs should be reported to the GNOME bug tracking system. (http://bugzilla.gnome.org, product glib.) You will need to create an account for yourself. In the bug report please include: * Information about your system. For instance: - What operating system and version - For Linux, what version of the C library And anything else you think is relevant. * How to reproduce the bug. If you can reproduce it with one of the test programs that are built in the tests/ subdirectory, that will be most convenient. Otherwise, please include a short test program that exhibits the behavior. As a last resort, you can also provide a pointer to a larger piece of software that can be downloaded. * If the bug was a crash, the exact text that was printed out when the crash occured. * Further information such as stack traces may be useful, but is not necessary. Patches ======= Patches should also be submitted to bugzilla.gnome.org. If the patch fixes an existing bug, add the patch as an attachment to that bug report. Otherwise, enter a new bug report that describes the patch, and attach the patch to that bug report. 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 ===================== * It is no longer necessary to use g_thread_init() or to link against libgthread. libglib is now always thread-enabled. Custom thread system implementations are no longer supported (including errorcheck mutexes). * The thread and synchronisation APIs have been updated. GMutex and GCond can be statically allocated without explicit initialisation, as can new types GRWLock and GRecMutex. The GStatic_______ variants of these types have been deprecated. GPrivate can also be statically allocated and has a nicer API (deprecating GStaticPrivate). Finally, g_thread_create() has been replaced with a substantially simplified g_thread_new(). * The g_once_init_enter()/_leave() functions have been replaced with macros that allow for a pointer to any gsize-sized object, not just a gsize*. The assertions to ensure that a pointer to a correctly-sized object is being used will not work with generic pointers (ie: (void*) and (gpointer) casts) which would have worked with the old version. * It is now mandatory to include glib.h instead of individual headers. * The -uninstalled variants of the pkg-config files have been dropped. * For a long time, gobject-2.0.pc mistakenly declared a public dependency on gthread-2.0.pc (when the dependency should have been private). This means that programs got away with calling g_thread_init() without explicitly listing gthread-2.0.pc among their dependencies. gthread has now been removed as a gobject dependency, which will cause such programs to break. The fix for this problem is either to declare an explicit dependency on gthread-2.0.pc (if you care about compatibility with older GLib versions) or to stop calling g_thread_init(). * g_debug() output is no longer enabled by default. It can be enabled on a per-domain basis with the G_MESSAGES_DEBUG environment variable like G_MESSAGES_DEBUG=domain1,domain2 or G_MESSAGES_DEBUG=all Notes about GLib 2.30 ===================== * GObject includes a generic marshaller, g_cclosure_marshal_generic. To use it, simply specify NULL as the marshaller in g_signal_new(). The generic marshaller is implemented with libffi, and consequently GObject depends on libffi now. Notes about GLib 2.28 ===================== * The GApplication API has changed compared to the version that was included in the 2.25 development snapshots. Existing users will need adjustments. Notes about GLib 2.26 ===================== * Nothing noteworthy. Notes about GLib 2.24 ===================== * It is now allowed to call g_thread_init(NULL) multiple times, and to call glib functions before g_thread_init(NULL) is called (although the later is mainly a change in docs as this worked before too). See the GThread reference documentation for the details. * GObject now links to GThread and threads are enabled automatically when g_type_init() is called. * GObject no longer allows to call g_object_set() on construct-only properties while an object is being initialized. If this behavior is needed, setting a custom constructor that just chains up will re-enable this functionality. * GMappedFile on an empty file now returns NULL for the contents instead of returning an empty string. The documentation specifically states that code may not rely on nul-termination here so any breakage caused by this change is a bug in application code. Notes about GLib 2.22 ===================== * Repeated calls to g_simple_async_result_set_op_res_gpointer used to leak the data. This has been fixed to always call the provided destroy notify. Notes about GLib 2.20 ===================== * The functions for launching applications (e.g. g_app_info_launch() + friends) now passes a FUSE file:// URI if possible (requires gvfs with the FUSE daemon to be running and operational). With gvfs 2.26, FUSE file:// URIs will be mapped back to gio URIs in the GFile constructors. The intent of this change is to better integrate POSIX-only applications, see bug #528670 for the rationale. The only user-visible change is when an application needs to examine an URI passed to it (e.g. as a positional parameter). Instead of looking at the given URI, the application will now need to look at the result of g_file_get_uri() after having constructed a GFile object with the given URI. Notes about GLib 2.18 ===================== * The recommended way of using GLib has always been to only include the toplevel headers glib.h, glib-object.h and gio.h. GLib enforces this by generating an error when individual headers are directly included. To help with the transition, the enforcement is not turned on by default for GLib headers (it is turned on for GObject and GIO). To turn it on, define the preprocessor symbol G_DISABLE_SINGLE_INCLUDES. Notes about GLib 2.16 ===================== * GLib now includes GIO, which adds optional dependencies against libattr and libselinux for extended attribute and SELinux support. Use --disable-xattr and --disable-selinux to build without these. Notes about GLib 2.10 ===================== * The functions g_snprintf() and g_vsnprintf() have been removed from the gprintf.h header, since they are already declared in glib.h. This doesn't break documented use of gprintf.h, but people have been known to include gprintf.h without including glib.h. * The Unicode support has been updated to Unicode 4.1. This adds several new members to the GUnicodeBreakType enumeration. * The support for Solaris threads has been retired. Solaris has provided POSIX threads for long enough now to have them available on every Solaris platform. * 'make check' has been changed to validate translations by calling msgfmt with the -c option. As a result, it may fail on systems with older gettext implementations (GNU gettext < 0.14.1, or Solaris gettext). 'make check' will also fail on systems where the C compiler does not support ELF visibility attributes. * The GMemChunk API has been deprecated in favour of a new 'slice allocator'. See the g_slice documentation for more details. * A new type, GInitiallyUnowned, has been introduced, which is intended to serve as a common implementation of the 'floating reference' concept that is e.g. used by GtkObject. Note that changing the inheritance hierarchy of a type can cause problems for language bindings and other code which needs to work closely with the type system. Therefore, switching to GInitiallyUnowned should be done carefully. g_object_compat_control() has been added to GLib 2.8.5 to help with the transition. Notes about GLib 2.6.0 ====================== * GLib 2.6 introduces the concept of 'GLib filename encoding', which is the on-disk encoding on Unix, but UTF-8 on Windows. All GLib functions returning or accepting pathnames have been changed to expect filenames in this encoding, and the common POSIX functions dealing with pathnames have been wrapped. These wrappers are declared in the header which must be included explicitly; it is not included through . On current (NT-based) Windows versions, where the on-disk file names are Unicode, these wrappers use the wide-character API in the C library. Thus applications can handle file names containing any Unicode characters through GLib's own API and its POSIX wrappers, not just file names restricted to characters in the system codepage. To keep binary compatibility with applications compiled against older versions of GLib, the Windows DLL still provides entry points with the old semantics using the old names, and applications compiled against GLib 2.6 will actually use new names for the functions. This is transparent to the programmer. When compiling against GLib 2.6, applications intended to be portable to Windows must take the UTF-8 file name encoding into consideration, and use the gstdio wrappers to access files whose names have been constructed from strings returned from GLib. * Likewise, g_get_user_name() and g_get_real_name() have been changed to return UTF-8 on Windows, while keeping the old semantics for applications compiled against older versions of GLib. * The GLib uses an '_' prefix to indicate private symbols that must not be used by applications. On some platforms, symbols beginning with prefixes such as _g will be exported from the library, on others not. In no case can applications use these private symbols. In addition to that, GLib+ 2.6 makes several symbols private which were not in any installed header files and were never intended to be exported. * To reduce code size and improve efficiency, GLib, when compiled with the GNU toolchain, has separate internal and external entry points for exported functions. The internal names, which begin with IA__, may be seen when debugging a GLib program. * On Windows, GLib no longer opens a console window when printing warning messages if stdout or stderr are invalid, as they are in "Windows subsystem" (GUI) applications. Simply redirect stdout or stderr if you need to see them. * The child watch functionality tends to reveal a bug in many thread implementations (in particular the older LinuxThreads implementation on Linux) where it's not possible to call waitpid() for a child created in a different thread. For this reason, for maximum portability, you should structure your code to fork all child processes that you want to wait for from the main thread. * A problem was recently discovered with g_signal_connect_object(); it doesn't actually disconnect the signal handler once the object being connected to dies, just disables it. See the API docs for the function for further details and the correct workaround that will continue to work with future versions of GLib. pkg-config-0.29.1/glib/compile0000755000175000017500000001624512601774025013057 00000000000000#! /bin/sh # Wrapper for compilers which do not understand '-c -o'. scriptversion=2012-10-14.11; # UTC # Copyright (C) 1999-2014 Free Software Foundation, Inc. # Written by Tom Tromey . # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . nl=' ' # We need space, tab and new line, in precisely that order. Quoting is # there to prevent tools from complaining about whitespace usage. IFS=" "" $nl" file_conv= # func_file_conv build_file lazy # Convert a $build file to $host form and store it in $file # Currently only supports Windows hosts. If the determined conversion # type is listed in (the comma separated) LAZY, no conversion will # take place. func_file_conv () { file=$1 case $file in / | /[!/]*) # absolute file, and not a UNC file if test -z "$file_conv"; then # lazily determine how to convert abs files case `uname -s` in MINGW*) file_conv=mingw ;; CYGWIN*) file_conv=cygwin ;; *) file_conv=wine ;; esac fi case $file_conv/,$2, in *,$file_conv,*) ;; mingw/*) file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` ;; cygwin/*) file=`cygpath -m "$file" || echo "$file"` ;; wine/*) file=`winepath -w "$file" || echo "$file"` ;; esac ;; esac } # func_cl_dashL linkdir # Make cl look for libraries in LINKDIR func_cl_dashL () { func_file_conv "$1" if test -z "$lib_path"; then lib_path=$file else lib_path="$lib_path;$file" fi linker_opts="$linker_opts -LIBPATH:$file" } # func_cl_dashl library # Do a library search-path lookup for cl func_cl_dashl () { lib=$1 found=no save_IFS=$IFS IFS=';' for dir in $lib_path $LIB do IFS=$save_IFS if $shared && test -f "$dir/$lib.dll.lib"; then found=yes lib=$dir/$lib.dll.lib break fi if test -f "$dir/$lib.lib"; then found=yes lib=$dir/$lib.lib break fi if test -f "$dir/lib$lib.a"; then found=yes lib=$dir/lib$lib.a break fi done IFS=$save_IFS if test "$found" != yes; then lib=$lib.lib fi } # func_cl_wrapper cl arg... # Adjust compile command to suit cl func_cl_wrapper () { # Assume a capable shell lib_path= shared=: linker_opts= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. eat=1 case $2 in *.o | *.[oO][bB][jJ]) func_file_conv "$2" set x "$@" -Fo"$file" shift ;; *) func_file_conv "$2" set x "$@" -Fe"$file" shift ;; esac ;; -I) eat=1 func_file_conv "$2" mingw set x "$@" -I"$file" shift ;; -I*) func_file_conv "${1#-I}" mingw set x "$@" -I"$file" shift ;; -l) eat=1 func_cl_dashl "$2" set x "$@" "$lib" shift ;; -l*) func_cl_dashl "${1#-l}" set x "$@" "$lib" shift ;; -L) eat=1 func_cl_dashL "$2" ;; -L*) func_cl_dashL "${1#-L}" ;; -static) shared=false ;; -Wl,*) arg=${1#-Wl,} save_ifs="$IFS"; IFS=',' for flag in $arg; do IFS="$save_ifs" linker_opts="$linker_opts $flag" done IFS="$save_ifs" ;; -Xlinker) eat=1 linker_opts="$linker_opts $2" ;; -*) set x "$@" "$1" shift ;; *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) func_file_conv "$1" set x "$@" -Tp"$file" shift ;; *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) func_file_conv "$1" mingw set x "$@" "$file" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -n "$linker_opts"; then linker_opts="-link$linker_opts" fi exec "$@" $linker_opts exit 1 } eat= case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: compile [--help] [--version] PROGRAM [ARGS] Wrapper for compilers which do not understand '-c -o'. Remove '-o dest.o' from ARGS, run PROGRAM with the remaining arguments, and rename the output as expected. If you are trying to build a whole package this is not the right script to run: please start by reading the file 'INSTALL'. Report bugs to . EOF exit $? ;; -v | --v*) echo "compile $scriptversion" exit $? ;; cl | *[/\\]cl | cl.exe | *[/\\]cl.exe ) func_cl_wrapper "$@" # Doesn't return... ;; esac ofile= cfile= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. # So we strip '-o arg' only if arg is an object. eat=1 case $2 in *.o | *.obj) ofile=$2 ;; *) set x "$@" -o "$2" shift ;; esac ;; *.c) cfile=$1 set x "$@" "$1" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -z "$ofile" || test -z "$cfile"; then # If no '-o' option was seen then we might have been invoked from a # pattern rule where we don't need one. That is ok -- this is a # normal compilation that the losing compiler can handle. If no # '.c' file was seen then we are probably linking. That is also # ok. exec "$@" fi # Name of file we expect compiler to create. cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` # Create the lock directory. # Note: use '[/\\:.-]' here to ensure that we don't use the same name # that we are using for the .o file. Also, base the name on the expected # object file name, since that is what matters with a parallel build. lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d while true; do if mkdir "$lockdir" >/dev/null 2>&1; then break fi sleep 1 done # FIXME: race condition here if user kills between mkdir and trap. trap "rmdir '$lockdir'; exit 1" 1 2 15 # Run the compile. "$@" ret=$? if test -f "$cofile"; then test "$cofile" = "$ofile" || mv "$cofile" "$ofile" elif test -f "${cofile}bj"; then test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" fi rmdir "$lockdir" exit $ret # 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: pkg-config-0.29.1/glib/ltmain.sh0000644000175000017500000117077112650726031013325 00000000000000#! /bin/sh ## DO NOT EDIT - This file generated from ./build-aux/ltmain.in ## by inline-source v2014-01-03.01 # libtool (GNU libtool) 2.4.6 # Provide generalized library-building support services. # Written by Gordon Matzigkeit , 1996 # Copyright (C) 1996-2015 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. # GNU Libtool 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 of the License, or # (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that 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, see . PROGRAM=libtool PACKAGE=libtool VERSION=2.4.6 package_revision=2.4.6 ## ------ ## ## Usage. ## ## ------ ## # Run './libtool --help' for help with using this script from the # command line. ## ------------------------------- ## ## User overridable command paths. ## ## ------------------------------- ## # After configure completes, it has a better idea of some of the # shell tools we need than the defaults used by the functions shared # with bootstrap, so set those here where they can still be over- # ridden by the user, but otherwise take precedence. : ${AUTOCONF="autoconf"} : ${AUTOMAKE="automake"} ## -------------------------- ## ## Source external libraries. ## ## -------------------------- ## # Much of our low-level functionality needs to be sourced from external # libraries, which are installed to $pkgauxdir. # Set a version string for this script. scriptversion=2015-01-20.17; # UTC # General shell script boiler plate, and helper functions. # Written by Gary V. Vaughan, 2004 # Copyright (C) 2004-2015 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. # 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 3 of the License, or # (at your option) any later version. # As a special exception to the GNU General Public License, if you distribute # this file as part of a program or library that is built using GNU Libtool, # you may include this file under the same distribution terms that you use # for the rest of that program. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNES 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, see . # Please report bugs or propose patches to gary@gnu.org. ## ------ ## ## Usage. ## ## ------ ## # Evaluate this file near the top of your script to gain access to # the functions and variables defined here: # # . `echo "$0" | ${SED-sed} 's|[^/]*$||'`/build-aux/funclib.sh # # If you need to override any of the default environment variable # settings, do that before evaluating this file. ## -------------------- ## ## Shell normalisation. ## ## -------------------- ## # Some shells need a little help to be as Bourne compatible as possible. # Before doing anything else, make sure all that help has been provided! DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac fi # NLS nuisances: We save the old values in case they are required later. _G_user_locale= _G_safe_locale= for _G_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test set = \"\${$_G_var+set}\"; then save_$_G_var=\$$_G_var $_G_var=C export $_G_var _G_user_locale=\"$_G_var=\\\$save_\$_G_var; \$_G_user_locale\" _G_safe_locale=\"$_G_var=C; \$_G_safe_locale\" fi" done # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Make sure IFS has a sensible default sp=' ' nl=' ' IFS="$sp $nl" # There are apparently some retarded systems that use ';' as a PATH separator! if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi ## ------------------------- ## ## Locate command utilities. ## ## ------------------------- ## # func_executable_p FILE # ---------------------- # Check that FILE is an executable regular file. func_executable_p () { test -f "$1" && test -x "$1" } # func_path_progs PROGS_LIST CHECK_FUNC [PATH] # -------------------------------------------- # Search for either a program that responds to --version with output # containing "GNU", or else returned by CHECK_FUNC otherwise, by # trying all the directories in PATH with each of the elements of # PROGS_LIST. # # CHECK_FUNC should accept the path to a candidate program, and # set $func_check_prog_result if it truncates its output less than # $_G_path_prog_max characters. func_path_progs () { _G_progs_list=$1 _G_check_func=$2 _G_PATH=${3-"$PATH"} _G_path_prog_max=0 _G_path_prog_found=false _G_save_IFS=$IFS; IFS=${PATH_SEPARATOR-:} for _G_dir in $_G_PATH; do IFS=$_G_save_IFS test -z "$_G_dir" && _G_dir=. for _G_prog_name in $_G_progs_list; do for _exeext in '' .EXE; do _G_path_prog=$_G_dir/$_G_prog_name$_exeext func_executable_p "$_G_path_prog" || continue case `"$_G_path_prog" --version 2>&1` in *GNU*) func_path_progs_result=$_G_path_prog _G_path_prog_found=: ;; *) $_G_check_func $_G_path_prog func_path_progs_result=$func_check_prog_result ;; esac $_G_path_prog_found && break 3 done done done IFS=$_G_save_IFS test -z "$func_path_progs_result" && { echo "no acceptable sed could be found in \$PATH" >&2 exit 1 } } # We want to be able to use the functions in this file before configure # has figured out where the best binaries are kept, which means we have # to search for them ourselves - except when the results are already set # where we skip the searches. # Unless the user overrides by setting SED, search the path for either GNU # sed, or the sed that truncates its output the least. test -z "$SED" && { _G_sed_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for _G_i in 1 2 3 4 5 6 7; do _G_sed_script=$_G_sed_script$nl$_G_sed_script done echo "$_G_sed_script" 2>/dev/null | sed 99q >conftest.sed _G_sed_script= func_check_prog_sed () { _G_path_prog=$1 _G_count=0 printf 0123456789 >conftest.in while : do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo '' >> conftest.nl "$_G_path_prog" -f conftest.sed conftest.out 2>/dev/null || break diff conftest.out conftest.nl >/dev/null 2>&1 || break _G_count=`expr $_G_count + 1` if test "$_G_count" -gt "$_G_path_prog_max"; then # Best one so far, save it but keep looking for a better one func_check_prog_result=$_G_path_prog _G_path_prog_max=$_G_count fi # 10*(2^10) chars as input seems more than enough test 10 -lt "$_G_count" && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out } func_path_progs "sed gsed" func_check_prog_sed $PATH:/usr/xpg4/bin rm -f conftest.sed SED=$func_path_progs_result } # Unless the user overrides by setting GREP, search the path for either GNU # grep, or the grep that truncates its output the least. test -z "$GREP" && { func_check_prog_grep () { _G_path_prog=$1 _G_count=0 _G_path_prog_max=0 printf 0123456789 >conftest.in while : do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo 'GREP' >> conftest.nl "$_G_path_prog" -e 'GREP$' -e '-(cannot match)-' conftest.out 2>/dev/null || break diff conftest.out conftest.nl >/dev/null 2>&1 || break _G_count=`expr $_G_count + 1` if test "$_G_count" -gt "$_G_path_prog_max"; then # Best one so far, save it but keep looking for a better one func_check_prog_result=$_G_path_prog _G_path_prog_max=$_G_count fi # 10*(2^10) chars as input seems more than enough test 10 -lt "$_G_count" && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out } func_path_progs "grep ggrep" func_check_prog_grep $PATH:/usr/xpg4/bin GREP=$func_path_progs_result } ## ------------------------------- ## ## User overridable command paths. ## ## ------------------------------- ## # All uppercase variable names are used for environment variables. These # variables can be overridden by the user before calling a script that # uses them if a suitable command of that name is not already available # in the command search PATH. : ${CP="cp -f"} : ${ECHO="printf %s\n"} : ${EGREP="$GREP -E"} : ${FGREP="$GREP -F"} : ${LN_S="ln -s"} : ${MAKE="make"} : ${MKDIR="mkdir"} : ${MV="mv -f"} : ${RM="rm -f"} : ${SHELL="${CONFIG_SHELL-/bin/sh}"} ## -------------------- ## ## Useful sed snippets. ## ## -------------------- ## sed_dirname='s|/[^/]*$||' sed_basename='s|^.*/||' # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. sed_quote_subst='s|\([`"$\\]\)|\\\1|g' # Same as above, but do not quote variable references. sed_double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution that turns a string into a regex matching for the # string literally. sed_make_literal_regex='s|[].[^$\\*\/]|\\&|g' # Sed substitution that converts a w32 file name or path # that contains forward slashes, into one that contains # (escaped) backslashes. A very naive implementation. sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' # Re-'\' parameter expansions in output of sed_double_quote_subst that # were '\'-ed in input to the same. If an odd number of '\' preceded a # '$' in input to sed_double_quote_subst, that '$' was protected from # expansion. Since each input '\' is now two '\'s, look for any number # of runs of four '\'s followed by two '\'s and then a '$'. '\' that '$'. _G_bs='\\' _G_bs2='\\\\' _G_bs4='\\\\\\\\' _G_dollar='\$' sed_double_backslash="\ s/$_G_bs4/&\\ /g s/^$_G_bs2$_G_dollar/$_G_bs&/ s/\\([^$_G_bs]\\)$_G_bs2$_G_dollar/\\1$_G_bs2$_G_bs$_G_dollar/g s/\n//g" ## ----------------- ## ## Global variables. ## ## ----------------- ## # Except for the global variables explicitly listed below, the following # functions in the '^func_' namespace, and the '^require_' namespace # variables initialised in the 'Resource management' section, sourcing # this file will not pollute your global namespace with anything # else. There's no portable way to scope variables in Bourne shell # though, so actually running these functions will sometimes place # results into a variable named after the function, and often use # temporary variables in the '^_G_' namespace. If you are careful to # avoid using those namespaces casually in your sourcing script, things # should continue to work as you expect. And, of course, you can freely # overwrite any of the functions or variables defined here before # calling anything to customize them. EXIT_SUCCESS=0 EXIT_FAILURE=1 EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. # Allow overriding, eg assuming that you follow the convention of # putting '$debug_cmd' at the start of all your functions, you can get # bash to show function call trace with: # # debug_cmd='eval echo "${FUNCNAME[0]} $*" >&2' bash your-script-name debug_cmd=${debug_cmd-":"} exit_cmd=: # By convention, finish your script with: # # exit $exit_status # # so that you can set exit_status to non-zero if you want to indicate # something went wrong during execution without actually bailing out at # the point of failure. exit_status=$EXIT_SUCCESS # Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh # is ksh but when the shell is invoked as "sh" and the current value of # the _XPG environment variable is not equal to 1 (one), the special # positional parameter $0, within a function call, is the name of the # function. progpath=$0 # The name of this program. progname=`$ECHO "$progpath" |$SED "$sed_basename"` # Make sure we have an absolute progpath for reexecution: case $progpath in [\\/]*|[A-Za-z]:\\*) ;; *[\\/]*) progdir=`$ECHO "$progpath" |$SED "$sed_dirname"` progdir=`cd "$progdir" && pwd` progpath=$progdir/$progname ;; *) _G_IFS=$IFS IFS=${PATH_SEPARATOR-:} for progdir in $PATH; do IFS=$_G_IFS test -x "$progdir/$progname" && break done IFS=$_G_IFS test -n "$progdir" || progdir=`pwd` progpath=$progdir/$progname ;; esac ## ----------------- ## ## Standard options. ## ## ----------------- ## # The following options affect the operation of the functions defined # below, and should be set appropriately depending on run-time para- # meters passed on the command line. opt_dry_run=false opt_quiet=false opt_verbose=false # Categories 'all' and 'none' are always available. Append any others # you will pass as the first argument to func_warning from your own # code. warning_categories= # By default, display warnings according to 'opt_warning_types'. Set # 'warning_func' to ':' to elide all warnings, or func_fatal_error to # treat the next displayed warning as a fatal error. warning_func=func_warn_and_continue # Set to 'all' to display all warnings, 'none' to suppress all # warnings, or a space delimited list of some subset of # 'warning_categories' to display only the listed warnings. opt_warning_types=all ## -------------------- ## ## Resource management. ## ## -------------------- ## # This section contains definitions for functions that each ensure a # particular resource (a file, or a non-empty configuration variable for # example) is available, and if appropriate to extract default values # from pertinent package files. Call them using their associated # 'require_*' variable to ensure that they are executed, at most, once. # # It's entirely deliberate that calling these functions can set # variables that don't obey the namespace limitations obeyed by the rest # of this file, in order that that they be as useful as possible to # callers. # require_term_colors # ------------------- # Allow display of bold text on terminals that support it. require_term_colors=func_require_term_colors func_require_term_colors () { $debug_cmd test -t 1 && { # COLORTERM and USE_ANSI_COLORS environment variables take # precedence, because most terminfo databases neglect to describe # whether color sequences are supported. test -n "${COLORTERM+set}" && : ${USE_ANSI_COLORS="1"} if test 1 = "$USE_ANSI_COLORS"; then # Standard ANSI escape sequences tc_reset='' tc_bold=''; tc_standout='' tc_red=''; tc_green='' tc_blue=''; tc_cyan='' else # Otherwise trust the terminfo database after all. test -n "`tput sgr0 2>/dev/null`" && { tc_reset=`tput sgr0` test -n "`tput bold 2>/dev/null`" && tc_bold=`tput bold` tc_standout=$tc_bold test -n "`tput smso 2>/dev/null`" && tc_standout=`tput smso` test -n "`tput setaf 1 2>/dev/null`" && tc_red=`tput setaf 1` test -n "`tput setaf 2 2>/dev/null`" && tc_green=`tput setaf 2` test -n "`tput setaf 4 2>/dev/null`" && tc_blue=`tput setaf 4` test -n "`tput setaf 5 2>/dev/null`" && tc_cyan=`tput setaf 5` } fi } require_term_colors=: } ## ----------------- ## ## Function library. ## ## ----------------- ## # This section contains a variety of useful functions to call in your # scripts. Take note of the portable wrappers for features provided by # some modern shells, which will fall back to slower equivalents on # less featureful shells. # func_append VAR VALUE # --------------------- # Append VALUE onto the existing contents of VAR. # We should try to minimise forks, especially on Windows where they are # unreasonably slow, so skip the feature probes when bash or zsh are # being used: if test set = "${BASH_VERSION+set}${ZSH_VERSION+set}"; then : ${_G_HAVE_ARITH_OP="yes"} : ${_G_HAVE_XSI_OPS="yes"} # The += operator was introduced in bash 3.1 case $BASH_VERSION in [12].* | 3.0 | 3.0*) ;; *) : ${_G_HAVE_PLUSEQ_OP="yes"} ;; esac fi # _G_HAVE_PLUSEQ_OP # Can be empty, in which case the shell is probed, "yes" if += is # useable or anything else if it does not work. test -z "$_G_HAVE_PLUSEQ_OP" \ && (eval 'x=a; x+=" b"; test "a b" = "$x"') 2>/dev/null \ && _G_HAVE_PLUSEQ_OP=yes if test yes = "$_G_HAVE_PLUSEQ_OP" then # This is an XSI compatible shell, allowing a faster implementation... eval 'func_append () { $debug_cmd eval "$1+=\$2" }' else # ...otherwise fall back to using expr, which is often a shell builtin. func_append () { $debug_cmd eval "$1=\$$1\$2" } fi # func_append_quoted VAR VALUE # ---------------------------- # Quote VALUE and append to the end of shell variable VAR, separated # by a space. if test yes = "$_G_HAVE_PLUSEQ_OP"; then eval 'func_append_quoted () { $debug_cmd func_quote_for_eval "$2" eval "$1+=\\ \$func_quote_for_eval_result" }' else func_append_quoted () { $debug_cmd func_quote_for_eval "$2" eval "$1=\$$1\\ \$func_quote_for_eval_result" } fi # func_append_uniq VAR VALUE # -------------------------- # Append unique VALUE onto the existing contents of VAR, assuming # entries are delimited by the first character of VALUE. For example: # # func_append_uniq options " --another-option option-argument" # # will only append to $options if " --another-option option-argument " # is not already present somewhere in $options already (note spaces at # each end implied by leading space in second argument). func_append_uniq () { $debug_cmd eval _G_current_value='`$ECHO $'$1'`' _G_delim=`expr "$2" : '\(.\)'` case $_G_delim$_G_current_value$_G_delim in *"$2$_G_delim"*) ;; *) func_append "$@" ;; esac } # func_arith TERM... # ------------------ # Set func_arith_result to the result of evaluating TERMs. test -z "$_G_HAVE_ARITH_OP" \ && (eval 'test 2 = $(( 1 + 1 ))') 2>/dev/null \ && _G_HAVE_ARITH_OP=yes if test yes = "$_G_HAVE_ARITH_OP"; then eval 'func_arith () { $debug_cmd func_arith_result=$(( $* )) }' else func_arith () { $debug_cmd func_arith_result=`expr "$@"` } fi # func_basename FILE # ------------------ # Set func_basename_result to FILE with everything up to and including # the last / stripped. if test yes = "$_G_HAVE_XSI_OPS"; then # If this shell supports suffix pattern removal, then use it to avoid # forking. Hide the definitions single quotes in case the shell chokes # on unsupported syntax... _b='func_basename_result=${1##*/}' _d='case $1 in */*) func_dirname_result=${1%/*}$2 ;; * ) func_dirname_result=$3 ;; esac' else # ...otherwise fall back to using sed. _b='func_basename_result=`$ECHO "$1" |$SED "$sed_basename"`' _d='func_dirname_result=`$ECHO "$1" |$SED "$sed_dirname"` if test "X$func_dirname_result" = "X$1"; then func_dirname_result=$3 else func_append func_dirname_result "$2" fi' fi eval 'func_basename () { $debug_cmd '"$_b"' }' # func_dirname FILE APPEND NONDIR_REPLACEMENT # ------------------------------------------- # Compute the dirname of FILE. If nonempty, add APPEND to the result, # otherwise set result to NONDIR_REPLACEMENT. eval 'func_dirname () { $debug_cmd '"$_d"' }' # func_dirname_and_basename FILE APPEND NONDIR_REPLACEMENT # -------------------------------------------------------- # Perform func_basename and func_dirname in a single function # call: # dirname: Compute the dirname of FILE. If nonempty, # add APPEND to the result, otherwise set result # to NONDIR_REPLACEMENT. # value returned in "$func_dirname_result" # basename: Compute filename of FILE. # value retuned in "$func_basename_result" # For efficiency, we do not delegate to the functions above but instead # duplicate the functionality here. eval 'func_dirname_and_basename () { $debug_cmd '"$_b"' '"$_d"' }' # func_echo ARG... # ---------------- # Echo program name prefixed message. func_echo () { $debug_cmd _G_message=$* func_echo_IFS=$IFS IFS=$nl for _G_line in $_G_message; do IFS=$func_echo_IFS $ECHO "$progname: $_G_line" done IFS=$func_echo_IFS } # func_echo_all ARG... # -------------------- # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } # func_echo_infix_1 INFIX ARG... # ------------------------------ # Echo program name, followed by INFIX on the first line, with any # additional lines not showing INFIX. func_echo_infix_1 () { $debug_cmd $require_term_colors _G_infix=$1; shift _G_indent=$_G_infix _G_prefix="$progname: $_G_infix: " _G_message=$* # Strip color escape sequences before counting printable length for _G_tc in "$tc_reset" "$tc_bold" "$tc_standout" "$tc_red" "$tc_green" "$tc_blue" "$tc_cyan" do test -n "$_G_tc" && { _G_esc_tc=`$ECHO "$_G_tc" | $SED "$sed_make_literal_regex"` _G_indent=`$ECHO "$_G_indent" | $SED "s|$_G_esc_tc||g"` } done _G_indent="$progname: "`echo "$_G_indent" | $SED 's|.| |g'`" " ## exclude from sc_prohibit_nested_quotes func_echo_infix_1_IFS=$IFS IFS=$nl for _G_line in $_G_message; do IFS=$func_echo_infix_1_IFS $ECHO "$_G_prefix$tc_bold$_G_line$tc_reset" >&2 _G_prefix=$_G_indent done IFS=$func_echo_infix_1_IFS } # func_error ARG... # ----------------- # Echo program name prefixed message to standard error. func_error () { $debug_cmd $require_term_colors func_echo_infix_1 " $tc_standout${tc_red}error$tc_reset" "$*" >&2 } # func_fatal_error ARG... # ----------------------- # Echo program name prefixed message to standard error, and exit. func_fatal_error () { $debug_cmd func_error "$*" exit $EXIT_FAILURE } # func_grep EXPRESSION FILENAME # ----------------------------- # Check whether EXPRESSION matches any line of FILENAME, without output. func_grep () { $debug_cmd $GREP "$1" "$2" >/dev/null 2>&1 } # func_len STRING # --------------- # Set func_len_result to the length of STRING. STRING may not # start with a hyphen. test -z "$_G_HAVE_XSI_OPS" \ && (eval 'x=a/b/c; test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ && _G_HAVE_XSI_OPS=yes if test yes = "$_G_HAVE_XSI_OPS"; then eval 'func_len () { $debug_cmd func_len_result=${#1} }' else func_len () { $debug_cmd func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len` } fi # func_mkdir_p DIRECTORY-PATH # --------------------------- # Make sure the entire path to DIRECTORY-PATH is available. func_mkdir_p () { $debug_cmd _G_directory_path=$1 _G_dir_list= if test -n "$_G_directory_path" && test : != "$opt_dry_run"; then # Protect directory names starting with '-' case $_G_directory_path in -*) _G_directory_path=./$_G_directory_path ;; esac # While some portion of DIR does not yet exist... while test ! -d "$_G_directory_path"; do # ...make a list in topmost first order. Use a colon delimited # list incase some portion of path contains whitespace. _G_dir_list=$_G_directory_path:$_G_dir_list # If the last portion added has no slash in it, the list is done case $_G_directory_path in */*) ;; *) break ;; esac # ...otherwise throw away the child directory and loop _G_directory_path=`$ECHO "$_G_directory_path" | $SED -e "$sed_dirname"` done _G_dir_list=`$ECHO "$_G_dir_list" | $SED 's|:*$||'` func_mkdir_p_IFS=$IFS; IFS=: for _G_dir in $_G_dir_list; do IFS=$func_mkdir_p_IFS # mkdir can fail with a 'File exist' error if two processes # try to create one of the directories concurrently. Don't # stop in that case! $MKDIR "$_G_dir" 2>/dev/null || : done IFS=$func_mkdir_p_IFS # Bail out if we (or some other process) failed to create a directory. test -d "$_G_directory_path" || \ func_fatal_error "Failed to create '$1'" fi } # func_mktempdir [BASENAME] # ------------------------- # Make a temporary directory that won't clash with other running # libtool processes, and avoids race conditions if possible. If # given, BASENAME is the basename for that directory. func_mktempdir () { $debug_cmd _G_template=${TMPDIR-/tmp}/${1-$progname} if test : = "$opt_dry_run"; then # Return a directory name, but don't create it in dry-run mode _G_tmpdir=$_G_template-$$ else # If mktemp works, use that first and foremost _G_tmpdir=`mktemp -d "$_G_template-XXXXXXXX" 2>/dev/null` if test ! -d "$_G_tmpdir"; then # Failing that, at least try and use $RANDOM to avoid a race _G_tmpdir=$_G_template-${RANDOM-0}$$ func_mktempdir_umask=`umask` umask 0077 $MKDIR "$_G_tmpdir" umask $func_mktempdir_umask fi # If we're not in dry-run mode, bomb out on failure test -d "$_G_tmpdir" || \ func_fatal_error "cannot create temporary directory '$_G_tmpdir'" fi $ECHO "$_G_tmpdir" } # func_normal_abspath PATH # ------------------------ # Remove doubled-up and trailing slashes, "." path components, # and cancel out any ".." path components in PATH after making # it an absolute path. func_normal_abspath () { $debug_cmd # These SED scripts presuppose an absolute path with a trailing slash. _G_pathcar='s|^/\([^/]*\).*$|\1|' _G_pathcdr='s|^/[^/]*||' _G_removedotparts=':dotsl s|/\./|/|g t dotsl s|/\.$|/|' _G_collapseslashes='s|/\{1,\}|/|g' _G_finalslash='s|/*$|/|' # Start from root dir and reassemble the path. func_normal_abspath_result= func_normal_abspath_tpath=$1 func_normal_abspath_altnamespace= case $func_normal_abspath_tpath in "") # Empty path, that just means $cwd. func_stripname '' '/' "`pwd`" func_normal_abspath_result=$func_stripname_result return ;; # The next three entries are used to spot a run of precisely # two leading slashes without using negated character classes; # we take advantage of case's first-match behaviour. ///*) # Unusual form of absolute path, do nothing. ;; //*) # Not necessarily an ordinary path; POSIX reserves leading '//' # and for example Cygwin uses it to access remote file shares # over CIFS/SMB, so we conserve a leading double slash if found. func_normal_abspath_altnamespace=/ ;; /*) # Absolute path, do nothing. ;; *) # Relative path, prepend $cwd. func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath ;; esac # Cancel out all the simple stuff to save iterations. We also want # the path to end with a slash for ease of parsing, so make sure # there is one (and only one) here. func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$_G_removedotparts" -e "$_G_collapseslashes" -e "$_G_finalslash"` while :; do # Processed it all yet? if test / = "$func_normal_abspath_tpath"; then # If we ascended to the root using ".." the result may be empty now. if test -z "$func_normal_abspath_result"; then func_normal_abspath_result=/ fi break fi func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$_G_pathcar"` func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$_G_pathcdr"` # Figure out what to do with it case $func_normal_abspath_tcomponent in "") # Trailing empty path component, ignore it. ;; ..) # Parent dir; strip last assembled component from result. func_dirname "$func_normal_abspath_result" func_normal_abspath_result=$func_dirname_result ;; *) # Actual path component, append it. func_append func_normal_abspath_result "/$func_normal_abspath_tcomponent" ;; esac done # Restore leading double-slash if one was found on entry. func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result } # func_notquiet ARG... # -------------------- # Echo program name prefixed message only when not in quiet mode. func_notquiet () { $debug_cmd $opt_quiet || func_echo ${1+"$@"} # A bug in bash halts the script if the last line of a function # fails when set -e is in force, so we need another command to # work around that: : } # func_relative_path SRCDIR DSTDIR # -------------------------------- # Set func_relative_path_result to the relative path from SRCDIR to DSTDIR. func_relative_path () { $debug_cmd func_relative_path_result= func_normal_abspath "$1" func_relative_path_tlibdir=$func_normal_abspath_result func_normal_abspath "$2" func_relative_path_tbindir=$func_normal_abspath_result # Ascend the tree starting from libdir while :; do # check if we have found a prefix of bindir case $func_relative_path_tbindir in $func_relative_path_tlibdir) # found an exact match func_relative_path_tcancelled= break ;; $func_relative_path_tlibdir*) # found a matching prefix func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" func_relative_path_tcancelled=$func_stripname_result if test -z "$func_relative_path_result"; then func_relative_path_result=. fi break ;; *) func_dirname $func_relative_path_tlibdir func_relative_path_tlibdir=$func_dirname_result if test -z "$func_relative_path_tlibdir"; then # Have to descend all the way to the root! func_relative_path_result=../$func_relative_path_result func_relative_path_tcancelled=$func_relative_path_tbindir break fi func_relative_path_result=../$func_relative_path_result ;; esac done # Now calculate path; take care to avoid doubling-up slashes. func_stripname '' '/' "$func_relative_path_result" func_relative_path_result=$func_stripname_result func_stripname '/' '/' "$func_relative_path_tcancelled" if test -n "$func_stripname_result"; then func_append func_relative_path_result "/$func_stripname_result" fi # Normalisation. If bindir is libdir, return '.' else relative path. if test -n "$func_relative_path_result"; then func_stripname './' '' "$func_relative_path_result" func_relative_path_result=$func_stripname_result fi test -n "$func_relative_path_result" || func_relative_path_result=. : } # func_quote_for_eval ARG... # -------------------------- # Aesthetically quote ARGs to be evaled later. # This function returns two values: # i) func_quote_for_eval_result # double-quoted, suitable for a subsequent eval # ii) func_quote_for_eval_unquoted_result # has all characters that are still active within double # quotes backslashified. func_quote_for_eval () { $debug_cmd func_quote_for_eval_unquoted_result= func_quote_for_eval_result= while test 0 -lt $#; do case $1 in *[\\\`\"\$]*) _G_unquoted_arg=`printf '%s\n' "$1" |$SED "$sed_quote_subst"` ;; *) _G_unquoted_arg=$1 ;; esac if test -n "$func_quote_for_eval_unquoted_result"; then func_append func_quote_for_eval_unquoted_result " $_G_unquoted_arg" else func_append func_quote_for_eval_unquoted_result "$_G_unquoted_arg" fi case $_G_unquoted_arg in # Double-quote args containing shell metacharacters to delay # word splitting, command substitution and variable expansion # for a subsequent eval. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") _G_quoted_arg=\"$_G_unquoted_arg\" ;; *) _G_quoted_arg=$_G_unquoted_arg ;; esac if test -n "$func_quote_for_eval_result"; then func_append func_quote_for_eval_result " $_G_quoted_arg" else func_append func_quote_for_eval_result "$_G_quoted_arg" fi shift done } # func_quote_for_expand ARG # ------------------------- # Aesthetically quote ARG to be evaled later; same as above, # but do not quote variable references. func_quote_for_expand () { $debug_cmd case $1 in *[\\\`\"]*) _G_arg=`$ECHO "$1" | $SED \ -e "$sed_double_quote_subst" -e "$sed_double_backslash"` ;; *) _G_arg=$1 ;; esac case $_G_arg in # Double-quote args containing shell metacharacters to delay # word splitting and command substitution for a subsequent eval. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") _G_arg=\"$_G_arg\" ;; esac func_quote_for_expand_result=$_G_arg } # func_stripname PREFIX SUFFIX NAME # --------------------------------- # strip PREFIX and SUFFIX from NAME, and store in func_stripname_result. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). if test yes = "$_G_HAVE_XSI_OPS"; then eval 'func_stripname () { $debug_cmd # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are # positional parameters, so assign one to ordinary variable first. func_stripname_result=$3 func_stripname_result=${func_stripname_result#"$1"} func_stripname_result=${func_stripname_result%"$2"} }' else func_stripname () { $debug_cmd case $2 in .*) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%\\\\$2\$%%"`;; *) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%$2\$%%"`;; esac } fi # func_show_eval CMD [FAIL_EXP] # ----------------------------- # Unless opt_quiet is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. func_show_eval () { $debug_cmd _G_cmd=$1 _G_fail_exp=${2-':'} func_quote_for_expand "$_G_cmd" eval "func_notquiet $func_quote_for_expand_result" $opt_dry_run || { eval "$_G_cmd" _G_status=$? if test 0 -ne "$_G_status"; then eval "(exit $_G_status); $_G_fail_exp" fi } } # func_show_eval_locale CMD [FAIL_EXP] # ------------------------------------ # Unless opt_quiet is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. Use the saved locale for evaluation. func_show_eval_locale () { $debug_cmd _G_cmd=$1 _G_fail_exp=${2-':'} $opt_quiet || { func_quote_for_expand "$_G_cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || { eval "$_G_user_locale $_G_cmd" _G_status=$? eval "$_G_safe_locale" if test 0 -ne "$_G_status"; then eval "(exit $_G_status); $_G_fail_exp" fi } } # func_tr_sh # ---------- # Turn $1 into a string suitable for a shell variable name. # Result is stored in $func_tr_sh_result. All characters # not in the set a-zA-Z0-9_ are replaced with '_'. Further, # if $1 begins with a digit, a '_' is prepended as well. func_tr_sh () { $debug_cmd case $1 in [0-9]* | *[!a-zA-Z0-9_]*) func_tr_sh_result=`$ECHO "$1" | $SED -e 's/^\([0-9]\)/_\1/' -e 's/[^a-zA-Z0-9_]/_/g'` ;; * ) func_tr_sh_result=$1 ;; esac } # func_verbose ARG... # ------------------- # Echo program name prefixed message in verbose mode only. func_verbose () { $debug_cmd $opt_verbose && func_echo "$*" : } # func_warn_and_continue ARG... # ----------------------------- # Echo program name prefixed warning message to standard error. func_warn_and_continue () { $debug_cmd $require_term_colors func_echo_infix_1 "${tc_red}warning$tc_reset" "$*" >&2 } # func_warning CATEGORY ARG... # ---------------------------- # Echo program name prefixed warning message to standard error. Warning # messages can be filtered according to CATEGORY, where this function # elides messages where CATEGORY is not listed in the global variable # 'opt_warning_types'. func_warning () { $debug_cmd # CATEGORY must be in the warning_categories list! case " $warning_categories " in *" $1 "*) ;; *) func_internal_error "invalid warning category '$1'" ;; esac _G_category=$1 shift case " $opt_warning_types " in *" $_G_category "*) $warning_func ${1+"$@"} ;; esac } # func_sort_ver VER1 VER2 # ----------------------- # 'sort -V' is not generally available. # Note this deviates from the version comparison in automake # in that it treats 1.5 < 1.5.0, and treats 1.4.4a < 1.4-p3a # but this should suffice as we won't be specifying old # version formats or redundant trailing .0 in bootstrap.conf. # If we did want full compatibility then we should probably # use m4_version_compare from autoconf. func_sort_ver () { $debug_cmd printf '%s\n%s\n' "$1" "$2" \ | sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n -k 5,5n -k 6,6n -k 7,7n -k 8,8n -k 9,9n } # func_lt_ver PREV CURR # --------------------- # Return true if PREV and CURR are in the correct order according to # func_sort_ver, otherwise false. Use it like this: # # func_lt_ver "$prev_ver" "$proposed_ver" || func_fatal_error "..." func_lt_ver () { $debug_cmd test "x$1" = x`func_sort_ver "$1" "$2" | $SED 1q` } # Local variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC" # time-stamp-time-zone: "UTC" # End: #! /bin/sh # Set a version string for this script. scriptversion=2014-01-07.03; # UTC # A portable, pluggable option parser for Bourne shell. # Written by Gary V. Vaughan, 2010 # Copyright (C) 2010-2015 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. # 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 3 of the License, 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, see . # Please report bugs or propose patches to gary@gnu.org. ## ------ ## ## Usage. ## ## ------ ## # This file is a library for parsing options in your shell scripts along # with assorted other useful supporting features that you can make use # of too. # # For the simplest scripts you might need only: # # #!/bin/sh # . relative/path/to/funclib.sh # . relative/path/to/options-parser # scriptversion=1.0 # func_options ${1+"$@"} # eval set dummy "$func_options_result"; shift # ...rest of your script... # # In order for the '--version' option to work, you will need to have a # suitably formatted comment like the one at the top of this file # starting with '# Written by ' and ending with '# warranty; '. # # For '-h' and '--help' to work, you will also need a one line # description of your script's purpose in a comment directly above the # '# Written by ' line, like the one at the top of this file. # # The default options also support '--debug', which will turn on shell # execution tracing (see the comment above debug_cmd below for another # use), and '--verbose' and the func_verbose function to allow your script # to display verbose messages only when your user has specified # '--verbose'. # # After sourcing this file, you can plug processing for additional # options by amending the variables from the 'Configuration' section # below, and following the instructions in the 'Option parsing' # section further down. ## -------------- ## ## Configuration. ## ## -------------- ## # You should override these variables in your script after sourcing this # file so that they reflect the customisations you have added to the # option parser. # The usage line for option parsing errors and the start of '-h' and # '--help' output messages. You can embed shell variables for delayed # expansion at the time the message is displayed, but you will need to # quote other shell meta-characters carefully to prevent them being # expanded when the contents are evaled. usage='$progpath [OPTION]...' # Short help message in response to '-h' and '--help'. Add to this or # override it after sourcing this library to reflect the full set of # options your script accepts. usage_message="\ --debug enable verbose shell tracing -W, --warnings=CATEGORY report the warnings falling in CATEGORY [all] -v, --verbose verbosely report processing --version print version information and exit -h, --help print short or long help message and exit " # Additional text appended to 'usage_message' in response to '--help'. long_help_message=" Warning categories include: 'all' show all warnings 'none' turn off all the warnings 'error' warnings are treated as fatal errors" # Help message printed before fatal option parsing errors. fatal_help="Try '\$progname --help' for more information." ## ------------------------- ## ## Hook function management. ## ## ------------------------- ## # This section contains functions for adding, removing, and running hooks # to the main code. A hook is just a named list of of function, that can # be run in order later on. # func_hookable FUNC_NAME # ----------------------- # Declare that FUNC_NAME will run hooks added with # 'func_add_hook FUNC_NAME ...'. func_hookable () { $debug_cmd func_append hookable_fns " $1" } # func_add_hook FUNC_NAME HOOK_FUNC # --------------------------------- # Request that FUNC_NAME call HOOK_FUNC before it returns. FUNC_NAME must # first have been declared "hookable" by a call to 'func_hookable'. func_add_hook () { $debug_cmd case " $hookable_fns " in *" $1 "*) ;; *) func_fatal_error "'$1' does not accept hook functions." ;; esac eval func_append ${1}_hooks '" $2"' } # func_remove_hook FUNC_NAME HOOK_FUNC # ------------------------------------ # Remove HOOK_FUNC from the list of functions called by FUNC_NAME. func_remove_hook () { $debug_cmd eval ${1}_hooks='`$ECHO "\$'$1'_hooks" |$SED "s| '$2'||"`' } # func_run_hooks FUNC_NAME [ARG]... # --------------------------------- # Run all hook functions registered to FUNC_NAME. # It is assumed that the list of hook functions contains nothing more # than a whitespace-delimited list of legal shell function names, and # no effort is wasted trying to catch shell meta-characters or preserve # whitespace. func_run_hooks () { $debug_cmd case " $hookable_fns " in *" $1 "*) ;; *) func_fatal_error "'$1' does not support hook funcions.n" ;; esac eval _G_hook_fns=\$$1_hooks; shift for _G_hook in $_G_hook_fns; do eval $_G_hook '"$@"' # store returned options list back into positional # parameters for next 'cmd' execution. eval _G_hook_result=\$${_G_hook}_result eval set dummy "$_G_hook_result"; shift done func_quote_for_eval ${1+"$@"} func_run_hooks_result=$func_quote_for_eval_result } ## --------------- ## ## Option parsing. ## ## --------------- ## # In order to add your own option parsing hooks, you must accept the # full positional parameter list in your hook function, remove any # options that you action, and then pass back the remaining unprocessed # options in '_result', escaped suitably for # 'eval'. Like this: # # my_options_prep () # { # $debug_cmd # # # Extend the existing usage message. # usage_message=$usage_message' # -s, --silent don'\''t print informational messages # ' # # func_quote_for_eval ${1+"$@"} # my_options_prep_result=$func_quote_for_eval_result # } # func_add_hook func_options_prep my_options_prep # # # my_silent_option () # { # $debug_cmd # # # Note that for efficiency, we parse as many options as we can # # recognise in a loop before passing the remainder back to the # # caller on the first unrecognised argument we encounter. # while test $# -gt 0; do # opt=$1; shift # case $opt in # --silent|-s) opt_silent=: ;; # # Separate non-argument short options: # -s*) func_split_short_opt "$_G_opt" # set dummy "$func_split_short_opt_name" \ # "-$func_split_short_opt_arg" ${1+"$@"} # shift # ;; # *) set dummy "$_G_opt" "$*"; shift; break ;; # esac # done # # func_quote_for_eval ${1+"$@"} # my_silent_option_result=$func_quote_for_eval_result # } # func_add_hook func_parse_options my_silent_option # # # my_option_validation () # { # $debug_cmd # # $opt_silent && $opt_verbose && func_fatal_help "\ # '--silent' and '--verbose' options are mutually exclusive." # # func_quote_for_eval ${1+"$@"} # my_option_validation_result=$func_quote_for_eval_result # } # func_add_hook func_validate_options my_option_validation # # You'll alse need to manually amend $usage_message to reflect the extra # options you parse. It's preferable to append if you can, so that # multiple option parsing hooks can be added safely. # func_options [ARG]... # --------------------- # All the functions called inside func_options are hookable. See the # individual implementations for details. func_hookable func_options func_options () { $debug_cmd func_options_prep ${1+"$@"} eval func_parse_options \ ${func_options_prep_result+"$func_options_prep_result"} eval func_validate_options \ ${func_parse_options_result+"$func_parse_options_result"} eval func_run_hooks func_options \ ${func_validate_options_result+"$func_validate_options_result"} # save modified positional parameters for caller func_options_result=$func_run_hooks_result } # func_options_prep [ARG]... # -------------------------- # All initialisations required before starting the option parse loop. # Note that when calling hook functions, we pass through the list of # positional parameters. If a hook function modifies that list, and # needs to propogate that back to rest of this script, then the complete # modified list must be put in 'func_run_hooks_result' before # returning. func_hookable func_options_prep func_options_prep () { $debug_cmd # Option defaults: opt_verbose=false opt_warning_types= func_run_hooks func_options_prep ${1+"$@"} # save modified positional parameters for caller func_options_prep_result=$func_run_hooks_result } # func_parse_options [ARG]... # --------------------------- # The main option parsing loop. func_hookable func_parse_options func_parse_options () { $debug_cmd func_parse_options_result= # this just eases exit handling while test $# -gt 0; do # Defer to hook functions for initial option parsing, so they # get priority in the event of reusing an option name. func_run_hooks func_parse_options ${1+"$@"} # Adjust func_parse_options positional parameters to match eval set dummy "$func_run_hooks_result"; shift # Break out of the loop if we already parsed every option. test $# -gt 0 || break _G_opt=$1 shift case $_G_opt in --debug|-x) debug_cmd='set -x' func_echo "enabling shell trace mode" $debug_cmd ;; --no-warnings|--no-warning|--no-warn) set dummy --warnings none ${1+"$@"} shift ;; --warnings|--warning|-W) test $# = 0 && func_missing_arg $_G_opt && break case " $warning_categories $1" in *" $1 "*) # trailing space prevents matching last $1 above func_append_uniq opt_warning_types " $1" ;; *all) opt_warning_types=$warning_categories ;; *none) opt_warning_types=none warning_func=: ;; *error) opt_warning_types=$warning_categories warning_func=func_fatal_error ;; *) func_fatal_error \ "unsupported warning category: '$1'" ;; esac shift ;; --verbose|-v) opt_verbose=: ;; --version) func_version ;; -\?|-h) func_usage ;; --help) func_help ;; # Separate optargs to long options (plugins may need this): --*=*) func_split_equals "$_G_opt" set dummy "$func_split_equals_lhs" \ "$func_split_equals_rhs" ${1+"$@"} shift ;; # Separate optargs to short options: -W*) func_split_short_opt "$_G_opt" set dummy "$func_split_short_opt_name" \ "$func_split_short_opt_arg" ${1+"$@"} shift ;; # Separate non-argument short options: -\?*|-h*|-v*|-x*) func_split_short_opt "$_G_opt" set dummy "$func_split_short_opt_name" \ "-$func_split_short_opt_arg" ${1+"$@"} shift ;; --) break ;; -*) func_fatal_help "unrecognised option: '$_G_opt'" ;; *) set dummy "$_G_opt" ${1+"$@"}; shift; break ;; esac done # save modified positional parameters for caller func_quote_for_eval ${1+"$@"} func_parse_options_result=$func_quote_for_eval_result } # func_validate_options [ARG]... # ------------------------------ # Perform any sanity checks on option settings and/or unconsumed # arguments. func_hookable func_validate_options func_validate_options () { $debug_cmd # Display all warnings if -W was not given. test -n "$opt_warning_types" || opt_warning_types=" $warning_categories" func_run_hooks func_validate_options ${1+"$@"} # Bail if the options were screwed! $exit_cmd $EXIT_FAILURE # save modified positional parameters for caller func_validate_options_result=$func_run_hooks_result } ## ----------------- ## ## Helper functions. ## ## ----------------- ## # This section contains the helper functions used by the rest of the # hookable option parser framework in ascii-betical order. # func_fatal_help ARG... # ---------------------- # Echo program name prefixed message to standard error, followed by # a help hint, and exit. func_fatal_help () { $debug_cmd eval \$ECHO \""Usage: $usage"\" eval \$ECHO \""$fatal_help"\" func_error ${1+"$@"} exit $EXIT_FAILURE } # func_help # --------- # Echo long help message to standard output and exit. func_help () { $debug_cmd func_usage_message $ECHO "$long_help_message" exit 0 } # func_missing_arg ARGNAME # ------------------------ # Echo program name prefixed message to standard error and set global # exit_cmd. func_missing_arg () { $debug_cmd func_error "Missing argument for '$1'." exit_cmd=exit } # func_split_equals STRING # ------------------------ # Set func_split_equals_lhs and func_split_equals_rhs shell variables after # splitting STRING at the '=' sign. test -z "$_G_HAVE_XSI_OPS" \ && (eval 'x=a/b/c; test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ && _G_HAVE_XSI_OPS=yes if test yes = "$_G_HAVE_XSI_OPS" then # This is an XSI compatible shell, allowing a faster implementation... eval 'func_split_equals () { $debug_cmd func_split_equals_lhs=${1%%=*} func_split_equals_rhs=${1#*=} test "x$func_split_equals_lhs" = "x$1" \ && func_split_equals_rhs= }' else # ...otherwise fall back to using expr, which is often a shell builtin. func_split_equals () { $debug_cmd func_split_equals_lhs=`expr "x$1" : 'x\([^=]*\)'` func_split_equals_rhs= test "x$func_split_equals_lhs" = "x$1" \ || func_split_equals_rhs=`expr "x$1" : 'x[^=]*=\(.*\)$'` } fi #func_split_equals # func_split_short_opt SHORTOPT # ----------------------------- # Set func_split_short_opt_name and func_split_short_opt_arg shell # variables after splitting SHORTOPT after the 2nd character. if test yes = "$_G_HAVE_XSI_OPS" then # This is an XSI compatible shell, allowing a faster implementation... eval 'func_split_short_opt () { $debug_cmd func_split_short_opt_arg=${1#??} func_split_short_opt_name=${1%"$func_split_short_opt_arg"} }' else # ...otherwise fall back to using expr, which is often a shell builtin. func_split_short_opt () { $debug_cmd func_split_short_opt_name=`expr "x$1" : 'x-\(.\)'` func_split_short_opt_arg=`expr "x$1" : 'x-.\(.*\)$'` } fi #func_split_short_opt # func_usage # ---------- # Echo short help message to standard output and exit. func_usage () { $debug_cmd func_usage_message $ECHO "Run '$progname --help |${PAGER-more}' for full usage" exit 0 } # func_usage_message # ------------------ # Echo short help message to standard output. func_usage_message () { $debug_cmd eval \$ECHO \""Usage: $usage"\" echo $SED -n 's|^# || /^Written by/{ x;p;x } h /^Written by/q' < "$progpath" echo eval \$ECHO \""$usage_message"\" } # func_version # ------------ # Echo version message to standard output and exit. func_version () { $debug_cmd printf '%s\n' "$progname $scriptversion" $SED -n ' /(C)/!b go :more /\./!{ N s|\n# | | b more } :go /^# Written by /,/# warranty; / { s|^# || s|^# *$|| s|\((C)\)[ 0-9,-]*[ ,-]\([1-9][0-9]* \)|\1 \2| p } /^# Written by / { s|^# || p } /^warranty; /q' < "$progpath" exit $? } # Local variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC" # time-stamp-time-zone: "UTC" # End: # Set a version string. scriptversion='(GNU libtool) 2.4.6' # func_echo ARG... # ---------------- # Libtool also displays the current mode in messages, so override # funclib.sh func_echo with this custom definition. func_echo () { $debug_cmd _G_message=$* func_echo_IFS=$IFS IFS=$nl for _G_line in $_G_message; do IFS=$func_echo_IFS $ECHO "$progname${opt_mode+: $opt_mode}: $_G_line" done IFS=$func_echo_IFS } # func_warning ARG... # ------------------- # Libtool warnings are not categorized, so override funclib.sh # func_warning with this simpler definition. func_warning () { $debug_cmd $warning_func ${1+"$@"} } ## ---------------- ## ## Options parsing. ## ## ---------------- ## # Hook in the functions to make sure our own options are parsed during # the option parsing loop. usage='$progpath [OPTION]... [MODE-ARG]...' # Short help message in response to '-h'. usage_message="Options: --config show all configuration variables --debug enable verbose shell tracing -n, --dry-run display commands without modifying any files --features display basic configuration information and exit --mode=MODE use operation mode MODE --no-warnings equivalent to '-Wnone' --preserve-dup-deps don't remove duplicate dependency libraries --quiet, --silent don't print informational messages --tag=TAG use configuration variables from tag TAG -v, --verbose print more informational messages than default --version print version information -W, --warnings=CATEGORY report the warnings falling in CATEGORY [all] -h, --help, --help-all print short, long, or detailed help message " # Additional text appended to 'usage_message' in response to '--help'. func_help () { $debug_cmd func_usage_message $ECHO "$long_help_message MODE must be one of the following: clean remove files from the build directory compile compile a source file into a libtool object execute automatically set library path, then run a program finish complete the installation of libtool libraries install install libraries or executables link create a library or an executable uninstall remove libraries from an installed directory MODE-ARGS vary depending on the MODE. When passed as first option, '--mode=MODE' may be abbreviated as 'MODE' or a unique abbreviation of that. Try '$progname --help --mode=MODE' for a more detailed description of MODE. When reporting a bug, please describe a test case to reproduce it and include the following information: host-triplet: $host shell: $SHELL compiler: $LTCC compiler flags: $LTCFLAGS linker: $LD (gnu? $with_gnu_ld) version: $progname (GNU libtool) 2.4.6 automake: `($AUTOMAKE --version) 2>/dev/null |$SED 1q` autoconf: `($AUTOCONF --version) 2>/dev/null |$SED 1q` Report bugs to . GNU libtool home page: . General help using GNU software: ." exit 0 } # func_lo2o OBJECT-NAME # --------------------- # Transform OBJECT-NAME from a '.lo' suffix to the platform specific # object suffix. lo2o=s/\\.lo\$/.$objext/ o2lo=s/\\.$objext\$/.lo/ if test yes = "$_G_HAVE_XSI_OPS"; then eval 'func_lo2o () { case $1 in *.lo) func_lo2o_result=${1%.lo}.$objext ;; * ) func_lo2o_result=$1 ;; esac }' # func_xform LIBOBJ-OR-SOURCE # --------------------------- # Transform LIBOBJ-OR-SOURCE from a '.o' or '.c' (or otherwise) # suffix to a '.lo' libtool-object suffix. eval 'func_xform () { func_xform_result=${1%.*}.lo }' else # ...otherwise fall back to using sed. func_lo2o () { func_lo2o_result=`$ECHO "$1" | $SED "$lo2o"` } func_xform () { func_xform_result=`$ECHO "$1" | $SED 's|\.[^.]*$|.lo|'` } fi # func_fatal_configuration ARG... # ------------------------------- # Echo program name prefixed message to standard error, followed by # a configuration failure hint, and exit. func_fatal_configuration () { func__fatal_error ${1+"$@"} \ "See the $PACKAGE documentation for more information." \ "Fatal configuration error." } # func_config # ----------- # Display the configuration for all the tags in this script. func_config () { re_begincf='^# ### BEGIN LIBTOOL' re_endcf='^# ### END LIBTOOL' # Default configuration. $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" # Now print the configurations for the tags. for tagname in $taglist; do $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" done exit $? } # func_features # ------------- # Display the features supported by this script. func_features () { echo "host: $host" if test yes = "$build_libtool_libs"; then echo "enable shared libraries" else echo "disable shared libraries" fi if test yes = "$build_old_libs"; then echo "enable static libraries" else echo "disable static libraries" fi exit $? } # func_enable_tag TAGNAME # ----------------------- # Verify that TAGNAME is valid, and either flag an error and exit, or # enable the TAGNAME tag. We also add TAGNAME to the global $taglist # variable here. func_enable_tag () { # Global variable: tagname=$1 re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" sed_extractcf=/$re_begincf/,/$re_endcf/p # Validate tagname. case $tagname in *[!-_A-Za-z0-9,/]*) func_fatal_error "invalid tag name: $tagname" ;; esac # Don't test for the "default" C tag, as we know it's # there but not specially marked. case $tagname in CC) ;; *) if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then taglist="$taglist $tagname" # Evaluate the configuration. Be careful to quote the path # and the sed script, to avoid splitting on whitespace, but # also don't use non-portable quotes within backquotes within # quotes we have to do it in 2 steps: extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` eval "$extractedcf" else func_error "ignoring unknown tag $tagname" fi ;; esac } # func_check_version_match # ------------------------ # Ensure that we are using m4 macros, and libtool script from the same # release of libtool. func_check_version_match () { if test "$package_revision" != "$macro_revision"; then if test "$VERSION" != "$macro_version"; then if test -z "$macro_version"; then cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from an older release. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from $PACKAGE $macro_version. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF fi else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, $progname: but the definition of this LT_INIT comes from revision $macro_revision. $progname: You should recreate aclocal.m4 with macros from revision $package_revision $progname: of $PACKAGE $VERSION and run autoconf again. _LT_EOF fi exit $EXIT_MISMATCH fi } # libtool_options_prep [ARG]... # ----------------------------- # Preparation for options parsed by libtool. libtool_options_prep () { $debug_mode # Option defaults: opt_config=false opt_dlopen= opt_dry_run=false opt_help=false opt_mode= opt_preserve_dup_deps=false opt_quiet=false nonopt= preserve_args= # Shorthand for --mode=foo, only valid as the first argument case $1 in clean|clea|cle|cl) shift; set dummy --mode clean ${1+"$@"}; shift ;; compile|compil|compi|comp|com|co|c) shift; set dummy --mode compile ${1+"$@"}; shift ;; execute|execut|execu|exec|exe|ex|e) shift; set dummy --mode execute ${1+"$@"}; shift ;; finish|finis|fini|fin|fi|f) shift; set dummy --mode finish ${1+"$@"}; shift ;; install|instal|insta|inst|ins|in|i) shift; set dummy --mode install ${1+"$@"}; shift ;; link|lin|li|l) shift; set dummy --mode link ${1+"$@"}; shift ;; uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) shift; set dummy --mode uninstall ${1+"$@"}; shift ;; esac # Pass back the list of options. func_quote_for_eval ${1+"$@"} libtool_options_prep_result=$func_quote_for_eval_result } func_add_hook func_options_prep libtool_options_prep # libtool_parse_options [ARG]... # --------------------------------- # Provide handling for libtool specific options. libtool_parse_options () { $debug_cmd # Perform our own loop to consume as many options as possible in # each iteration. while test $# -gt 0; do _G_opt=$1 shift case $_G_opt in --dry-run|--dryrun|-n) opt_dry_run=: ;; --config) func_config ;; --dlopen|-dlopen) opt_dlopen="${opt_dlopen+$opt_dlopen }$1" shift ;; --preserve-dup-deps) opt_preserve_dup_deps=: ;; --features) func_features ;; --finish) set dummy --mode finish ${1+"$@"}; shift ;; --help) opt_help=: ;; --help-all) opt_help=': help-all' ;; --mode) test $# = 0 && func_missing_arg $_G_opt && break opt_mode=$1 case $1 in # Valid mode arguments: clean|compile|execute|finish|install|link|relink|uninstall) ;; # Catch anything else as an error *) func_error "invalid argument for $_G_opt" exit_cmd=exit break ;; esac shift ;; --no-silent|--no-quiet) opt_quiet=false func_append preserve_args " $_G_opt" ;; --no-warnings|--no-warning|--no-warn) opt_warning=false func_append preserve_args " $_G_opt" ;; --no-verbose) opt_verbose=false func_append preserve_args " $_G_opt" ;; --silent|--quiet) opt_quiet=: opt_verbose=false func_append preserve_args " $_G_opt" ;; --tag) test $# = 0 && func_missing_arg $_G_opt && break opt_tag=$1 func_append preserve_args " $_G_opt $1" func_enable_tag "$1" shift ;; --verbose|-v) opt_quiet=false opt_verbose=: func_append preserve_args " $_G_opt" ;; # An option not handled by this hook function: *) set dummy "$_G_opt" ${1+"$@"}; shift; break ;; esac done # save modified positional parameters for caller func_quote_for_eval ${1+"$@"} libtool_parse_options_result=$func_quote_for_eval_result } func_add_hook func_parse_options libtool_parse_options # libtool_validate_options [ARG]... # --------------------------------- # Perform any sanity checks on option settings and/or unconsumed # arguments. libtool_validate_options () { # save first non-option argument if test 0 -lt $#; then nonopt=$1 shift fi # preserve --debug test : = "$debug_cmd" || func_append preserve_args " --debug" case $host in # Solaris2 added to fix http://debbugs.gnu.org/cgi/bugreport.cgi?bug=16452 # see also: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59788 *cygwin* | *mingw* | *pw32* | *cegcc* | *solaris2* | *os2*) # don't eliminate duplications in $postdeps and $predeps opt_duplicate_compiler_generated_deps=: ;; *) opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps ;; esac $opt_help || { # Sanity checks first: func_check_version_match test yes != "$build_libtool_libs" \ && test yes != "$build_old_libs" \ && func_fatal_configuration "not configured to build any kind of library" # Darwin sucks eval std_shrext=\"$shrext_cmds\" # Only execute mode is allowed to have -dlopen flags. if test -n "$opt_dlopen" && test execute != "$opt_mode"; then func_error "unrecognized option '-dlopen'" $ECHO "$help" 1>&2 exit $EXIT_FAILURE fi # Change the help message to a mode-specific one. generic_help=$help help="Try '$progname --help --mode=$opt_mode' for more information." } # Pass back the unparsed argument list func_quote_for_eval ${1+"$@"} libtool_validate_options_result=$func_quote_for_eval_result } func_add_hook func_validate_options libtool_validate_options # Process options as early as possible so that --help and --version # can return quickly. func_options ${1+"$@"} eval set dummy "$func_options_result"; shift ## ----------- ## ## Main. ## ## ----------- ## magic='%%%MAGIC variable%%%' magic_exe='%%%MAGIC EXE variable%%%' # Global variables. extracted_archives= extracted_serial=0 # If this variable is set in any of the actions, the command in it # will be execed at the end. This prevents here-documents from being # left over by shells. exec_cmd= # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } # func_generated_by_libtool # True iff stdin has been generated by Libtool. This function is only # a basic sanity check; it will hardly flush out determined imposters. func_generated_by_libtool_p () { $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 } # func_lalib_p file # True iff FILE is a libtool '.la' library or '.lo' object file. # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_lalib_p () { test -f "$1" && $SED -e 4q "$1" 2>/dev/null | func_generated_by_libtool_p } # func_lalib_unsafe_p file # True iff FILE is a libtool '.la' library or '.lo' object file. # This function implements the same check as func_lalib_p without # resorting to external programs. To this end, it redirects stdin and # closes it afterwards, without saving the original file descriptor. # As a safety measure, use it only where a negative result would be # fatal anyway. Works if 'file' does not exist. func_lalib_unsafe_p () { lalib_p=no if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then for lalib_p_l in 1 2 3 4 do read lalib_p_line case $lalib_p_line in \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; esac done exec 0<&5 5<&- fi test yes = "$lalib_p" } # func_ltwrapper_script_p file # True iff FILE is a libtool wrapper script # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_script_p () { test -f "$1" && $lt_truncate_bin < "$1" 2>/dev/null | func_generated_by_libtool_p } # func_ltwrapper_executable_p file # True iff FILE is a libtool wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_executable_p () { func_ltwrapper_exec_suffix= case $1 in *.exe) ;; *) func_ltwrapper_exec_suffix=.exe ;; esac $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 } # func_ltwrapper_scriptname file # Assumes file is an ltwrapper_executable # uses $file to determine the appropriate filename for a # temporary ltwrapper_script. func_ltwrapper_scriptname () { func_dirname_and_basename "$1" "" "." func_stripname '' '.exe' "$func_basename_result" func_ltwrapper_scriptname_result=$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper } # func_ltwrapper_p file # True iff FILE is a libtool wrapper script or wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_p () { func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" } # func_execute_cmds commands fail_cmd # Execute tilde-delimited COMMANDS. # If FAIL_CMD is given, eval that upon failure. # FAIL_CMD may read-access the current command in variable CMD! func_execute_cmds () { $debug_cmd save_ifs=$IFS; IFS='~' for cmd in $1; do IFS=$sp$nl eval cmd=\"$cmd\" IFS=$save_ifs func_show_eval "$cmd" "${2-:}" done IFS=$save_ifs } # func_source file # Source FILE, adding directory component if necessary. # Note that it is not necessary on cygwin/mingw to append a dot to # FILE even if both FILE and FILE.exe exist: automatic-append-.exe # behavior happens only for exec(3), not for open(2)! Also, sourcing # 'FILE.' does not work on cygwin managed mounts. func_source () { $debug_cmd case $1 in */* | *\\*) . "$1" ;; *) . "./$1" ;; esac } # func_resolve_sysroot PATH # Replace a leading = in PATH with a sysroot. Store the result into # func_resolve_sysroot_result func_resolve_sysroot () { func_resolve_sysroot_result=$1 case $func_resolve_sysroot_result in =*) func_stripname '=' '' "$func_resolve_sysroot_result" func_resolve_sysroot_result=$lt_sysroot$func_stripname_result ;; esac } # func_replace_sysroot PATH # If PATH begins with the sysroot, replace it with = and # store the result into func_replace_sysroot_result. func_replace_sysroot () { case $lt_sysroot:$1 in ?*:"$lt_sysroot"*) func_stripname "$lt_sysroot" '' "$1" func_replace_sysroot_result='='$func_stripname_result ;; *) # Including no sysroot. func_replace_sysroot_result=$1 ;; esac } # func_infer_tag arg # Infer tagged configuration to use if any are available and # if one wasn't chosen via the "--tag" command line option. # Only attempt this if the compiler in the base compile # command doesn't match the default compiler. # arg is usually of the form 'gcc ...' func_infer_tag () { $debug_cmd if test -n "$available_tags" && test -z "$tagname"; then CC_quoted= for arg in $CC; do func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` case $@ in # Blanks in the command may have been stripped by the calling shell, # but not from the CC environment variable when configure was run. " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; # Blanks at the start of $base_compile will cause this to fail # if we don't check for them as well. *) for z in $available_tags; do if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then # Evaluate the configuration. eval "`$SED -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" CC_quoted= for arg in $CC; do # Double-quote args containing other shell metacharacters. func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` case "$@ " in " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) # The compiler in the base compile command matches # the one in the tagged configuration. # Assume this is the tagged configuration we want. tagname=$z break ;; esac fi done # If $tagname still isn't set, then no tagged configuration # was found and let the user know that the "--tag" command # line option must be used. if test -z "$tagname"; then func_echo "unable to infer tagged configuration" func_fatal_error "specify a tag with '--tag'" # else # func_verbose "using $tagname tagged configuration" fi ;; esac fi } # func_write_libtool_object output_name pic_name nonpic_name # Create a libtool object file (analogous to a ".la" file), # but don't create it if we're doing a dry run. func_write_libtool_object () { write_libobj=$1 if test yes = "$build_libtool_libs"; then write_lobj=\'$2\' else write_lobj=none fi if test yes = "$build_old_libs"; then write_oldobj=\'$3\' else write_oldobj=none fi $opt_dry_run || { cat >${write_libobj}T </dev/null` if test "$?" -eq 0 && test -n "$func_convert_core_file_wine_to_w32_tmp"; then func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | $SED -e "$sed_naive_backslashify"` else func_convert_core_file_wine_to_w32_result= fi fi } # end: func_convert_core_file_wine_to_w32 # func_convert_core_path_wine_to_w32 ARG # Helper function used by path conversion functions when $build is *nix, and # $host is mingw, cygwin, or some other w32 environment. Relies on a correctly # configured wine environment available, with the winepath program in $build's # $PATH. Assumes ARG has no leading or trailing path separator characters. # # ARG is path to be converted from $build format to win32. # Result is available in $func_convert_core_path_wine_to_w32_result. # Unconvertible file (directory) names in ARG are skipped; if no directory names # are convertible, then the result may be empty. func_convert_core_path_wine_to_w32 () { $debug_cmd # unfortunately, winepath doesn't convert paths, only file names func_convert_core_path_wine_to_w32_result= if test -n "$1"; then oldIFS=$IFS IFS=: for func_convert_core_path_wine_to_w32_f in $1; do IFS=$oldIFS func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" if test -n "$func_convert_core_file_wine_to_w32_result"; then if test -z "$func_convert_core_path_wine_to_w32_result"; then func_convert_core_path_wine_to_w32_result=$func_convert_core_file_wine_to_w32_result else func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" fi fi done IFS=$oldIFS fi } # end: func_convert_core_path_wine_to_w32 # func_cygpath ARGS... # Wrapper around calling the cygpath program via LT_CYGPATH. This is used when # when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) # $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or # (2), returns the Cygwin file name or path in func_cygpath_result (input # file name or path is assumed to be in w32 format, as previously converted # from $build's *nix or MSYS format). In case (3), returns the w32 file name # or path in func_cygpath_result (input file name or path is assumed to be in # Cygwin format). Returns an empty string on error. # # ARGS are passed to cygpath, with the last one being the file name or path to # be converted. # # Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH # environment variable; do not put it in $PATH. func_cygpath () { $debug_cmd if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` if test "$?" -ne 0; then # on failure, ensure result is empty func_cygpath_result= fi else func_cygpath_result= func_error "LT_CYGPATH is empty or specifies non-existent file: '$LT_CYGPATH'" fi } #end: func_cygpath # func_convert_core_msys_to_w32 ARG # Convert file name or path ARG from MSYS format to w32 format. Return # result in func_convert_core_msys_to_w32_result. func_convert_core_msys_to_w32 () { $debug_cmd # awkward: cmd appends spaces to result func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | $SED -e 's/[ ]*$//' -e "$sed_naive_backslashify"` } #end: func_convert_core_msys_to_w32 # func_convert_file_check ARG1 ARG2 # Verify that ARG1 (a file name in $build format) was converted to $host # format in ARG2. Otherwise, emit an error message, but continue (resetting # func_to_host_file_result to ARG1). func_convert_file_check () { $debug_cmd if test -z "$2" && test -n "$1"; then func_error "Could not determine host file name corresponding to" func_error " '$1'" func_error "Continuing, but uninstalled executables may not work." # Fallback: func_to_host_file_result=$1 fi } # end func_convert_file_check # func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH # Verify that FROM_PATH (a path in $build format) was converted to $host # format in TO_PATH. Otherwise, emit an error message, but continue, resetting # func_to_host_file_result to a simplistic fallback value (see below). func_convert_path_check () { $debug_cmd if test -z "$4" && test -n "$3"; then func_error "Could not determine the host path corresponding to" func_error " '$3'" func_error "Continuing, but uninstalled executables may not work." # Fallback. This is a deliberately simplistic "conversion" and # should not be "improved". See libtool.info. if test "x$1" != "x$2"; then lt_replace_pathsep_chars="s|$1|$2|g" func_to_host_path_result=`echo "$3" | $SED -e "$lt_replace_pathsep_chars"` else func_to_host_path_result=$3 fi fi } # end func_convert_path_check # func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG # Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT # and appending REPL if ORIG matches BACKPAT. func_convert_path_front_back_pathsep () { $debug_cmd case $4 in $1 ) func_to_host_path_result=$3$func_to_host_path_result ;; esac case $4 in $2 ) func_append func_to_host_path_result "$3" ;; esac } # end func_convert_path_front_back_pathsep ################################################## # $build to $host FILE NAME CONVERSION FUNCTIONS # ################################################## # invoked via '$to_host_file_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # Result will be available in $func_to_host_file_result. # func_to_host_file ARG # Converts the file name ARG from $build format to $host format. Return result # in func_to_host_file_result. func_to_host_file () { $debug_cmd $to_host_file_cmd "$1" } # end func_to_host_file # func_to_tool_file ARG LAZY # converts the file name ARG from $build format to toolchain format. Return # result in func_to_tool_file_result. If the conversion in use is listed # in (the comma separated) LAZY, no conversion takes place. func_to_tool_file () { $debug_cmd case ,$2, in *,"$to_tool_file_cmd",*) func_to_tool_file_result=$1 ;; *) $to_tool_file_cmd "$1" func_to_tool_file_result=$func_to_host_file_result ;; esac } # end func_to_tool_file # func_convert_file_noop ARG # Copy ARG to func_to_host_file_result. func_convert_file_noop () { func_to_host_file_result=$1 } # end func_convert_file_noop # func_convert_file_msys_to_w32 ARG # Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_file_result. func_convert_file_msys_to_w32 () { $debug_cmd func_to_host_file_result=$1 if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_to_host_file_result=$func_convert_core_msys_to_w32_result fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_w32 # func_convert_file_cygwin_to_w32 ARG # Convert file name ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_file_cygwin_to_w32 () { $debug_cmd func_to_host_file_result=$1 if test -n "$1"; then # because $build is cygwin, we call "the" cygpath in $PATH; no need to use # LT_CYGPATH in this case. func_to_host_file_result=`cygpath -m "$1"` fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_cygwin_to_w32 # func_convert_file_nix_to_w32 ARG # Convert file name ARG from *nix to w32 format. Requires a wine environment # and a working winepath. Returns result in func_to_host_file_result. func_convert_file_nix_to_w32 () { $debug_cmd func_to_host_file_result=$1 if test -n "$1"; then func_convert_core_file_wine_to_w32 "$1" func_to_host_file_result=$func_convert_core_file_wine_to_w32_result fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_w32 # func_convert_file_msys_to_cygwin ARG # Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_file_msys_to_cygwin () { $debug_cmd func_to_host_file_result=$1 if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_cygpath -u "$func_convert_core_msys_to_w32_result" func_to_host_file_result=$func_cygpath_result fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_cygwin # func_convert_file_nix_to_cygwin ARG # Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed # in a wine environment, working winepath, and LT_CYGPATH set. Returns result # in func_to_host_file_result. func_convert_file_nix_to_cygwin () { $debug_cmd func_to_host_file_result=$1 if test -n "$1"; then # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. func_convert_core_file_wine_to_w32 "$1" func_cygpath -u "$func_convert_core_file_wine_to_w32_result" func_to_host_file_result=$func_cygpath_result fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_cygwin ############################################# # $build to $host PATH CONVERSION FUNCTIONS # ############################################# # invoked via '$to_host_path_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # The result will be available in $func_to_host_path_result. # # Path separators are also converted from $build format to $host format. If # ARG begins or ends with a path separator character, it is preserved (but # converted to $host format) on output. # # All path conversion functions are named using the following convention: # file name conversion function : func_convert_file_X_to_Y () # path conversion function : func_convert_path_X_to_Y () # where, for any given $build/$host combination the 'X_to_Y' value is the # same. If conversion functions are added for new $build/$host combinations, # the two new functions must follow this pattern, or func_init_to_host_path_cmd # will break. # func_init_to_host_path_cmd # Ensures that function "pointer" variable $to_host_path_cmd is set to the # appropriate value, based on the value of $to_host_file_cmd. to_host_path_cmd= func_init_to_host_path_cmd () { $debug_cmd if test -z "$to_host_path_cmd"; then func_stripname 'func_convert_file_' '' "$to_host_file_cmd" to_host_path_cmd=func_convert_path_$func_stripname_result fi } # func_to_host_path ARG # Converts the path ARG from $build format to $host format. Return result # in func_to_host_path_result. func_to_host_path () { $debug_cmd func_init_to_host_path_cmd $to_host_path_cmd "$1" } # end func_to_host_path # func_convert_path_noop ARG # Copy ARG to func_to_host_path_result. func_convert_path_noop () { func_to_host_path_result=$1 } # end func_convert_path_noop # func_convert_path_msys_to_w32 ARG # Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_path_result. func_convert_path_msys_to_w32 () { $debug_cmd func_to_host_path_result=$1 if test -n "$1"; then # Remove leading and trailing path separator characters from ARG. MSYS # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; # and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result=$func_convert_core_msys_to_w32_result func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_msys_to_w32 # func_convert_path_cygwin_to_w32 ARG # Convert path ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_path_cygwin_to_w32 () { $debug_cmd func_to_host_path_result=$1 if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_cygwin_to_w32 # func_convert_path_nix_to_w32 ARG # Convert path ARG from *nix to w32 format. Requires a wine environment and # a working winepath. Returns result in func_to_host_file_result. func_convert_path_nix_to_w32 () { $debug_cmd func_to_host_path_result=$1 if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result=$func_convert_core_path_wine_to_w32_result func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_nix_to_w32 # func_convert_path_msys_to_cygwin ARG # Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_path_msys_to_cygwin () { $debug_cmd func_to_host_path_result=$1 if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_msys_to_w32_result" func_to_host_path_result=$func_cygpath_result func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_msys_to_cygwin # func_convert_path_nix_to_cygwin ARG # Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a # a wine environment, working winepath, and LT_CYGPATH set. Returns result in # func_to_host_file_result. func_convert_path_nix_to_cygwin () { $debug_cmd func_to_host_path_result=$1 if test -n "$1"; then # Remove leading and trailing path separator characters from # ARG. msys behavior is inconsistent here, cygpath turns them # into '.;' and ';.', and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" func_to_host_path_result=$func_cygpath_result func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_nix_to_cygwin # func_dll_def_p FILE # True iff FILE is a Windows DLL '.def' file. # Keep in sync with _LT_DLL_DEF_P in libtool.m4 func_dll_def_p () { $debug_cmd func_dll_def_p_tmp=`$SED -n \ -e 's/^[ ]*//' \ -e '/^\(;.*\)*$/d' \ -e 's/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p' \ -e q \ "$1"` test DEF = "$func_dll_def_p_tmp" } # func_mode_compile arg... func_mode_compile () { $debug_cmd # Get the compilation command and the source file. base_compile= srcfile=$nonopt # always keep a non-empty value in "srcfile" suppress_opt=yes suppress_output= arg_mode=normal libobj= later= pie_flag= for arg do case $arg_mode in arg ) # do not "continue". Instead, add this to base_compile lastarg=$arg arg_mode=normal ;; target ) libobj=$arg arg_mode=normal continue ;; normal ) # Accept any command-line options. case $arg in -o) test -n "$libobj" && \ func_fatal_error "you cannot specify '-o' more than once" arg_mode=target continue ;; -pie | -fpie | -fPIE) func_append pie_flag " $arg" continue ;; -shared | -static | -prefer-pic | -prefer-non-pic) func_append later " $arg" continue ;; -no-suppress) suppress_opt=no continue ;; -Xcompiler) arg_mode=arg # the next one goes into the "base_compile" arg list continue # The current "srcfile" will either be retained or ;; # replaced later. I would guess that would be a bug. -Wc,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result lastarg= save_ifs=$IFS; IFS=, for arg in $args; do IFS=$save_ifs func_append_quoted lastarg "$arg" done IFS=$save_ifs func_stripname ' ' '' "$lastarg" lastarg=$func_stripname_result # Add the arguments to base_compile. func_append base_compile " $lastarg" continue ;; *) # Accept the current argument as the source file. # The previous "srcfile" becomes the current argument. # lastarg=$srcfile srcfile=$arg ;; esac # case $arg ;; esac # case $arg_mode # Aesthetically quote the previous argument. func_append_quoted base_compile "$lastarg" done # for arg case $arg_mode in arg) func_fatal_error "you must specify an argument for -Xcompile" ;; target) func_fatal_error "you must specify a target with '-o'" ;; *) # Get the name of the library object. test -z "$libobj" && { func_basename "$srcfile" libobj=$func_basename_result } ;; esac # Recognize several different file suffixes. # If the user specifies -o file.o, it is replaced with file.lo case $libobj in *.[cCFSifmso] | \ *.ada | *.adb | *.ads | *.asm | \ *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup) func_xform "$libobj" libobj=$func_xform_result ;; esac case $libobj in *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; *) func_fatal_error "cannot determine name of library object from '$libobj'" ;; esac func_infer_tag $base_compile for arg in $later; do case $arg in -shared) test yes = "$build_libtool_libs" \ || func_fatal_configuration "cannot build a shared library" build_old_libs=no continue ;; -static) build_libtool_libs=no build_old_libs=yes continue ;; -prefer-pic) pic_mode=yes continue ;; -prefer-non-pic) pic_mode=no continue ;; esac done func_quote_for_eval "$libobj" test "X$libobj" != "X$func_quote_for_eval_result" \ && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ && func_warning "libobj name '$libobj' may not contain shell special characters." func_dirname_and_basename "$obj" "/" "" objname=$func_basename_result xdir=$func_dirname_result lobj=$xdir$objdir/$objname test -z "$base_compile" && \ func_fatal_help "you must specify a compilation command" # Delete any leftover library objects. if test yes = "$build_old_libs"; then removelist="$obj $lobj $libobj ${libobj}T" else removelist="$lobj $libobj ${libobj}T" fi # On Cygwin there's no "real" PIC flag so we must build both object types case $host_os in cygwin* | mingw* | pw32* | os2* | cegcc*) pic_mode=default ;; esac if test no = "$pic_mode" && test pass_all != "$deplibs_check_method"; then # non-PIC code in shared libraries is not supported pic_mode=default fi # Calculate the filename of the output object if compiler does # not support -o with -c if test no = "$compiler_c_o"; then output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.$objext lockfile=$output_obj.lock else output_obj= need_locks=no lockfile= fi # Lock this critical section if it is needed # We use this script file to make the link, it avoids creating a new file if test yes = "$need_locks"; then until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done elif test warn = "$need_locks"; then if test -f "$lockfile"; then $ECHO "\ *** ERROR, $lockfile exists and contains: `cat $lockfile 2>/dev/null` This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support '-c' and '-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi func_append removelist " $output_obj" $ECHO "$srcfile" > "$lockfile" fi $opt_dry_run || $RM $removelist func_append removelist " $lockfile" trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 srcfile=$func_to_tool_file_result func_quote_for_eval "$srcfile" qsrcfile=$func_quote_for_eval_result # Only build a PIC object if we are building libtool libraries. if test yes = "$build_libtool_libs"; then # Without this assignment, base_compile gets emptied. fbsd_hideous_sh_bug=$base_compile if test no != "$pic_mode"; then command="$base_compile $qsrcfile $pic_flag" else # Don't build PIC code command="$base_compile $qsrcfile" fi func_mkdir_p "$xdir$objdir" if test -z "$output_obj"; then # Place PIC objects in $objdir func_append command " -o $lobj" fi func_show_eval_locale "$command" \ 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' if test warn = "$need_locks" && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support '-c' and '-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed, then go on to compile the next one if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then func_show_eval '$MV "$output_obj" "$lobj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi # Allow error messages only from the first compilation. if test yes = "$suppress_opt"; then suppress_output=' >/dev/null 2>&1' fi fi # Only build a position-dependent object if we build old libraries. if test yes = "$build_old_libs"; then if test yes != "$pic_mode"; then # Don't build PIC code command="$base_compile $qsrcfile$pie_flag" else command="$base_compile $qsrcfile $pic_flag" fi if test yes = "$compiler_c_o"; then func_append command " -o $obj" fi # Suppress compiler output if we already did a PIC compilation. func_append command "$suppress_output" func_show_eval_locale "$command" \ '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' if test warn = "$need_locks" && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support '-c' and '-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then func_show_eval '$MV "$output_obj" "$obj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi fi $opt_dry_run || { func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" # Unlock the critical section if it was locked if test no != "$need_locks"; then removelist=$lockfile $RM "$lockfile" fi } exit $EXIT_SUCCESS } $opt_help || { test compile = "$opt_mode" && func_mode_compile ${1+"$@"} } func_mode_help () { # We need to display help for each of the modes. case $opt_mode in "") # Generic help is extracted from the usage comments # at the start of this file. func_help ;; clean) $ECHO \ "Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... Remove files from the build directory. RM is the name of the program to use to delete files associated with each FILE (typically '/bin/rm'). RM-OPTIONS are options (such as '-f') to be passed to RM. If FILE is a libtool library, object or program, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; compile) $ECHO \ "Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE Compile a source file into a libtool library object. This mode accepts the following additional options: -o OUTPUT-FILE set the output file name to OUTPUT-FILE -no-suppress do not suppress compiler output for multiple passes -prefer-pic try to build PIC objects only -prefer-non-pic try to build non-PIC objects only -shared do not build a '.o' file suitable for static linking -static only build a '.o' file suitable for static linking -Wc,FLAG pass FLAG directly to the compiler COMPILE-COMMAND is a command to be used in creating a 'standard' object file from the given SOURCEFILE. The output file name is determined by removing the directory component from SOURCEFILE, then substituting the C source code suffix '.c' with the library object suffix, '.lo'." ;; execute) $ECHO \ "Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... Automatically set library path, then run a program. This mode accepts the following additional options: -dlopen FILE add the directory containing FILE to the library path This mode sets the library path environment variable according to '-dlopen' flags. If any of the ARGS are libtool executable wrappers, then they are translated into their corresponding uninstalled binary, and any of their required library directories are added to the library path. Then, COMMAND is executed, with ARGS as arguments." ;; finish) $ECHO \ "Usage: $progname [OPTION]... --mode=finish [LIBDIR]... Complete the installation of libtool libraries. Each LIBDIR is a directory that contains libtool libraries. The commands that this mode executes may require superuser privileges. Use the '--dry-run' option if you just want to see what would be executed." ;; install) $ECHO \ "Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... Install executables or libraries. INSTALL-COMMAND is the installation command. The first component should be either the 'install' or 'cp' program. The following components of INSTALL-COMMAND are treated specially: -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation The rest of the components are interpreted as arguments to that command (only BSD-compatible install options are recognized)." ;; link) $ECHO \ "Usage: $progname [OPTION]... --mode=link LINK-COMMAND... Link object files or libraries together to form another library, or to create an executable program. LINK-COMMAND is a command using the C compiler that you would use to create a program from several object files. The following components of LINK-COMMAND are treated specially: -all-static do not do any dynamic linking at all -avoid-version do not add a version suffix if possible -bindir BINDIR specify path to binaries directory (for systems where libraries must be found in the PATH setting at runtime) -dlopen FILE '-dlpreopen' FILE if it cannot be dlopened at runtime -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) -export-symbols SYMFILE try to export only the symbols listed in SYMFILE -export-symbols-regex REGEX try to export only the symbols matching REGEX -LLIBDIR search LIBDIR for required installed libraries -lNAME OUTPUT-FILE requires the installed library libNAME -module build a library that can dlopened -no-fast-install disable the fast-install mode -no-install link a not-installable executable -no-undefined declare that a library does not refer to external symbols -o OUTPUT-FILE create OUTPUT-FILE from the specified objects -objectlist FILE use a list of object files found in FILE to specify objects -os2dllname NAME force a short DLL name on OS/2 (no effect on other OSes) -precious-files-regex REGEX don't remove output files matching REGEX -release RELEASE specify package release information -rpath LIBDIR the created library will eventually be installed in LIBDIR -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries -shared only do dynamic linking of libtool libraries -shrext SUFFIX override the standard shared library file extension -static do not do any dynamic linking of uninstalled libtool libraries -static-libtool-libs do not do any dynamic linking of libtool libraries -version-info CURRENT[:REVISION[:AGE]] specify library version info [each variable defaults to 0] -weak LIBNAME declare that the target provides the LIBNAME interface -Wc,FLAG -Xcompiler FLAG pass linker-specific FLAG directly to the compiler -Wl,FLAG -Xlinker FLAG pass linker-specific FLAG directly to the linker -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) All other options (arguments beginning with '-') are ignored. Every other argument is treated as a filename. Files ending in '.la' are treated as uninstalled libtool libraries, other files are standard or library object files. If the OUTPUT-FILE ends in '.la', then a libtool library is created, only library objects ('.lo' files) may be specified, and '-rpath' is required, except when creating a convenience library. If OUTPUT-FILE ends in '.a' or '.lib', then a standard library is created using 'ar' and 'ranlib', or on Windows using 'lib'. If OUTPUT-FILE ends in '.lo' or '.$objext', then a reloadable object file is created, otherwise an executable program is created." ;; uninstall) $ECHO \ "Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... Remove libraries from an installation directory. RM is the name of the program to use to delete files associated with each FILE (typically '/bin/rm'). RM-OPTIONS are options (such as '-f') to be passed to RM. If FILE is a libtool library, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; *) func_fatal_help "invalid operation mode '$opt_mode'" ;; esac echo $ECHO "Try '$progname --help' for more information about other modes." } # Now that we've collected a possible --mode arg, show help if necessary if $opt_help; then if test : = "$opt_help"; then func_mode_help else { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do func_mode_help done } | $SED -n '1p; 2,$s/^Usage:/ or: /p' { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do echo func_mode_help done } | $SED '1d /^When reporting/,/^Report/{ H d } $x /information about other modes/d /more detailed .*MODE/d s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' fi exit $? fi # func_mode_execute arg... func_mode_execute () { $debug_cmd # The first argument is the command name. cmd=$nonopt test -z "$cmd" && \ func_fatal_help "you must specify a COMMAND" # Handle -dlopen flags immediately. for file in $opt_dlopen; do test -f "$file" \ || func_fatal_help "'$file' is not a file" dir= case $file in *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "'$lib' is not a valid libtool archive" # Read the libtool library. dlname= library_names= func_source "$file" # Skip this library if it cannot be dlopened. if test -z "$dlname"; then # Warn if it was a shared library. test -n "$library_names" && \ func_warning "'$file' was not linked with '-export-dynamic'" continue fi func_dirname "$file" "" "." dir=$func_dirname_result if test -f "$dir/$objdir/$dlname"; then func_append dir "/$objdir" else if test ! -f "$dir/$dlname"; then func_fatal_error "cannot find '$dlname' in '$dir' or '$dir/$objdir'" fi fi ;; *.lo) # Just add the directory containing the .lo file. func_dirname "$file" "" "." dir=$func_dirname_result ;; *) func_warning "'-dlopen' is ignored for non-libtool libraries and objects" continue ;; esac # Get the absolute pathname. absdir=`cd "$dir" && pwd` test -n "$absdir" && dir=$absdir # Now add the directory to shlibpath_var. if eval "test -z \"\$$shlibpath_var\""; then eval "$shlibpath_var=\"\$dir\"" else eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" fi done # This variable tells wrapper scripts just to set shlibpath_var # rather than running their programs. libtool_execute_magic=$magic # Check if any of the arguments is a wrapper script. args= for file do case $file in -* | *.la | *.lo ) ;; *) # Do a test to see if this is really a libtool program. if func_ltwrapper_script_p "$file"; then func_source "$file" # Transform arg to wrapped name. file=$progdir/$program elif func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" func_source "$func_ltwrapper_scriptname_result" # Transform arg to wrapped name. file=$progdir/$program fi ;; esac # Quote arguments (to preserve shell metacharacters). func_append_quoted args "$file" done if $opt_dry_run; then # Display what would be done. if test -n "$shlibpath_var"; then eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" echo "export $shlibpath_var" fi $ECHO "$cmd$args" exit $EXIT_SUCCESS else if test -n "$shlibpath_var"; then # Export the shlibpath_var. eval "export $shlibpath_var" fi # Restore saved environment variables for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test \"\${save_$lt_var+set}\" = set; then $lt_var=\$save_$lt_var; export $lt_var else $lt_unset $lt_var fi" done # Now prepare to actually exec the command. exec_cmd=\$cmd$args fi } test execute = "$opt_mode" && func_mode_execute ${1+"$@"} # func_mode_finish arg... func_mode_finish () { $debug_cmd libs= libdirs= admincmds= for opt in "$nonopt" ${1+"$@"} do if test -d "$opt"; then func_append libdirs " $opt" elif test -f "$opt"; then if func_lalib_unsafe_p "$opt"; then func_append libs " $opt" else func_warning "'$opt' is not a valid libtool archive" fi else func_fatal_error "invalid argument '$opt'" fi done if test -n "$libs"; then if test -n "$lt_sysroot"; then sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" else sysroot_cmd= fi # Remove sysroot references if $opt_dry_run; then for lib in $libs; do echo "removing references to $lt_sysroot and '=' prefixes from $lib" done else tmpdir=`func_mktempdir` for lib in $libs; do $SED -e "$sysroot_cmd s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ > $tmpdir/tmp-la mv -f $tmpdir/tmp-la $lib done ${RM}r "$tmpdir" fi fi if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then for libdir in $libdirs; do if test -n "$finish_cmds"; then # Do each command in the finish commands. func_execute_cmds "$finish_cmds" 'admincmds="$admincmds '"$cmd"'"' fi if test -n "$finish_eval"; then # Do the single finish_eval. eval cmds=\"$finish_eval\" $opt_dry_run || eval "$cmds" || func_append admincmds " $cmds" fi done fi # Exit here if they wanted silent mode. $opt_quiet && exit $EXIT_SUCCESS if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then echo "----------------------------------------------------------------------" echo "Libraries have been installed in:" for libdir in $libdirs; do $ECHO " $libdir" done echo echo "If you ever happen to want to link against installed libraries" echo "in a given directory, LIBDIR, you must either use libtool, and" echo "specify the full pathname of the library, or use the '-LLIBDIR'" echo "flag during linking and do at least one of the following:" if test -n "$shlibpath_var"; then echo " - add LIBDIR to the '$shlibpath_var' environment variable" echo " during execution" fi if test -n "$runpath_var"; then echo " - add LIBDIR to the '$runpath_var' environment variable" echo " during linking" fi if test -n "$hardcode_libdir_flag_spec"; then libdir=LIBDIR eval flag=\"$hardcode_libdir_flag_spec\" $ECHO " - use the '$flag' linker flag" fi if test -n "$admincmds"; then $ECHO " - have your system administrator run these commands:$admincmds" fi if test -f /etc/ld.so.conf; then echo " - have your system administrator add LIBDIR to '/etc/ld.so.conf'" fi echo echo "See any operating system documentation about shared libraries for" case $host in solaris2.[6789]|solaris2.1[0-9]) echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" echo "pages." ;; *) echo "more information, such as the ld(1) and ld.so(8) manual pages." ;; esac echo "----------------------------------------------------------------------" fi exit $EXIT_SUCCESS } test finish = "$opt_mode" && func_mode_finish ${1+"$@"} # func_mode_install arg... func_mode_install () { $debug_cmd # There may be an optional sh(1) argument at the beginning of # install_prog (especially on Windows NT). if test "$SHELL" = "$nonopt" || test /bin/sh = "$nonopt" || # Allow the use of GNU shtool's install command. case $nonopt in *shtool*) :;; *) false;; esac then # Aesthetically quote it. func_quote_for_eval "$nonopt" install_prog="$func_quote_for_eval_result " arg=$1 shift else install_prog= arg=$nonopt fi # The real first argument should be the name of the installation program. # Aesthetically quote it. func_quote_for_eval "$arg" func_append install_prog "$func_quote_for_eval_result" install_shared_prog=$install_prog case " $install_prog " in *[\\\ /]cp\ *) install_cp=: ;; *) install_cp=false ;; esac # We need to accept at least all the BSD install flags. dest= files= opts= prev= install_type= isdir=false stripme= no_mode=: for arg do arg2= if test -n "$dest"; then func_append files " $dest" dest=$arg continue fi case $arg in -d) isdir=: ;; -f) if $install_cp; then :; else prev=$arg fi ;; -g | -m | -o) prev=$arg ;; -s) stripme=" -s" continue ;; -*) ;; *) # If the previous option needed an argument, then skip it. if test -n "$prev"; then if test X-m = "X$prev" && test -n "$install_override_mode"; then arg2=$install_override_mode no_mode=false fi prev= else dest=$arg continue fi ;; esac # Aesthetically quote the argument. func_quote_for_eval "$arg" func_append install_prog " $func_quote_for_eval_result" if test -n "$arg2"; then func_quote_for_eval "$arg2" fi func_append install_shared_prog " $func_quote_for_eval_result" done test -z "$install_prog" && \ func_fatal_help "you must specify an install program" test -n "$prev" && \ func_fatal_help "the '$prev' option requires an argument" if test -n "$install_override_mode" && $no_mode; then if $install_cp; then :; else func_quote_for_eval "$install_override_mode" func_append install_shared_prog " -m $func_quote_for_eval_result" fi fi if test -z "$files"; then if test -z "$dest"; then func_fatal_help "no file or destination specified" else func_fatal_help "you must specify a destination" fi fi # Strip any trailing slash from the destination. func_stripname '' '/' "$dest" dest=$func_stripname_result # Check to see that the destination is a directory. test -d "$dest" && isdir=: if $isdir; then destdir=$dest destname= else func_dirname_and_basename "$dest" "" "." destdir=$func_dirname_result destname=$func_basename_result # Not a directory, so check to see that there is only one file specified. set dummy $files; shift test "$#" -gt 1 && \ func_fatal_help "'$dest' is not a directory" fi case $destdir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) for file in $files; do case $file in *.lo) ;; *) func_fatal_help "'$destdir' must be an absolute directory name" ;; esac done ;; esac # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic=$magic staticlibs= future_libdirs= current_libdirs= for file in $files; do # Do each installation. case $file in *.$libext) # Do the static libraries later. func_append staticlibs " $file" ;; *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "'$file' is not a valid libtool archive" library_names= old_library= relink_command= func_source "$file" # Add the libdir to current_libdirs if it is the destination. if test "X$destdir" = "X$libdir"; then case "$current_libdirs " in *" $libdir "*) ;; *) func_append current_libdirs " $libdir" ;; esac else # Note the libdir as a future libdir. case "$future_libdirs " in *" $libdir "*) ;; *) func_append future_libdirs " $libdir" ;; esac fi func_dirname "$file" "/" "" dir=$func_dirname_result func_append dir "$objdir" if test -n "$relink_command"; then # Determine the prefix the user has applied to our future dir. inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` # Don't allow the user to place us outside of our expected # location b/c this prevents finding dependent libraries that # are installed to the same prefix. # At present, this check doesn't affect windows .dll's that # are installed into $libdir/../bin (currently, that works fine) # but it's something to keep an eye on. test "$inst_prefix_dir" = "$destdir" && \ func_fatal_error "error: cannot install '$file' to a directory not ending in $libdir" if test -n "$inst_prefix_dir"; then # Stick the inst_prefix_dir data into the link command. relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` else relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` fi func_warning "relinking '$file'" func_show_eval "$relink_command" \ 'func_fatal_error "error: relink '\''$file'\'' with the above command before installing it"' fi # See the names of the shared library. set dummy $library_names; shift if test -n "$1"; then realname=$1 shift srcname=$realname test -n "$relink_command" && srcname=${realname}T # Install the shared library and build the symlinks. func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ 'exit $?' tstripme=$stripme case $host_os in cygwin* | mingw* | pw32* | cegcc*) case $realname in *.dll.a) tstripme= ;; esac ;; os2*) case $realname in *_dll.a) tstripme= ;; esac ;; esac if test -n "$tstripme" && test -n "$striplib"; then func_show_eval "$striplib $destdir/$realname" 'exit $?' fi if test "$#" -gt 0; then # Delete the old symlinks, and create new ones. # Try 'ln -sf' first, because the 'ln' binary might depend on # the symlink we replace! Solaris /bin/ln does not understand -f, # so we also need to try rm && ln -s. for linkname do test "$linkname" != "$realname" \ && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" done fi # Do each command in the postinstall commands. lib=$destdir/$realname func_execute_cmds "$postinstall_cmds" 'exit $?' fi # Install the pseudo-library for information purposes. func_basename "$file" name=$func_basename_result instname=$dir/${name}i func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' # Maybe install the static library, too. test -n "$old_library" && func_append staticlibs " $dir/$old_library" ;; *.lo) # Install (i.e. copy) a libtool object. # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile=$destdir/$destname else func_basename "$file" destfile=$func_basename_result destfile=$destdir/$destfile fi # Deduce the name of the destination old-style object file. case $destfile in *.lo) func_lo2o "$destfile" staticdest=$func_lo2o_result ;; *.$objext) staticdest=$destfile destfile= ;; *) func_fatal_help "cannot copy a libtool object to '$destfile'" ;; esac # Install the libtool object if requested. test -n "$destfile" && \ func_show_eval "$install_prog $file $destfile" 'exit $?' # Install the old object if enabled. if test yes = "$build_old_libs"; then # Deduce the name of the old-style object file. func_lo2o "$file" staticobj=$func_lo2o_result func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' fi exit $EXIT_SUCCESS ;; *) # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile=$destdir/$destname else func_basename "$file" destfile=$func_basename_result destfile=$destdir/$destfile fi # If the file is missing, and there is a .exe on the end, strip it # because it is most likely a libtool script we actually want to # install stripped_ext= case $file in *.exe) if test ! -f "$file"; then func_stripname '' '.exe' "$file" file=$func_stripname_result stripped_ext=.exe fi ;; esac # Do a test to see if this is really a libtool program. case $host in *cygwin* | *mingw*) if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" wrapper=$func_ltwrapper_scriptname_result else func_stripname '' '.exe' "$file" wrapper=$func_stripname_result fi ;; *) wrapper=$file ;; esac if func_ltwrapper_script_p "$wrapper"; then notinst_deplibs= relink_command= func_source "$wrapper" # Check the variables that should have been set. test -z "$generated_by_libtool_version" && \ func_fatal_error "invalid libtool wrapper script '$wrapper'" finalize=: for lib in $notinst_deplibs; do # Check to see that each library is installed. libdir= if test -f "$lib"; then func_source "$lib" fi libfile=$libdir/`$ECHO "$lib" | $SED 's%^.*/%%g'` if test -n "$libdir" && test ! -f "$libfile"; then func_warning "'$lib' has not been installed in '$libdir'" finalize=false fi done relink_command= func_source "$wrapper" outputname= if test no = "$fast_install" && test -n "$relink_command"; then $opt_dry_run || { if $finalize; then tmpdir=`func_mktempdir` func_basename "$file$stripped_ext" file=$func_basename_result outputname=$tmpdir/$file # Replace the output file specification. relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` $opt_quiet || { func_quote_for_expand "$relink_command" eval "func_echo $func_quote_for_expand_result" } if eval "$relink_command"; then : else func_error "error: relink '$file' with the above command before installing it" $opt_dry_run || ${RM}r "$tmpdir" continue fi file=$outputname else func_warning "cannot relink '$file'" fi } else # Install the binary that we compiled earlier. file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` fi fi # remove .exe since cygwin /usr/bin/install will append another # one anyway case $install_prog,$host in */usr/bin/install*,*cygwin*) case $file:$destfile in *.exe:*.exe) # this is ok ;; *.exe:*) destfile=$destfile.exe ;; *:*.exe) func_stripname '' '.exe' "$destfile" destfile=$func_stripname_result ;; esac ;; esac func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' $opt_dry_run || if test -n "$outputname"; then ${RM}r "$tmpdir" fi ;; esac done for file in $staticlibs; do func_basename "$file" name=$func_basename_result # Set up the ranlib parameters. oldlib=$destdir/$name func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 tool_oldlib=$func_to_tool_file_result func_show_eval "$install_prog \$file \$oldlib" 'exit $?' if test -n "$stripme" && test -n "$old_striplib"; then func_show_eval "$old_striplib $tool_oldlib" 'exit $?' fi # Do each command in the postinstall commands. func_execute_cmds "$old_postinstall_cmds" 'exit $?' done test -n "$future_libdirs" && \ func_warning "remember to run '$progname --finish$future_libdirs'" if test -n "$current_libdirs"; then # Maybe just do a dry run. $opt_dry_run && current_libdirs=" -n$current_libdirs" exec_cmd='$SHELL "$progpath" $preserve_args --finish$current_libdirs' else exit $EXIT_SUCCESS fi } test install = "$opt_mode" && func_mode_install ${1+"$@"} # func_generate_dlsyms outputname originator pic_p # Extract symbols from dlprefiles and create ${outputname}S.o with # a dlpreopen symbol table. func_generate_dlsyms () { $debug_cmd my_outputname=$1 my_originator=$2 my_pic_p=${3-false} my_prefix=`$ECHO "$my_originator" | $SED 's%[^a-zA-Z0-9]%_%g'` my_dlsyms= if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then if test -n "$NM" && test -n "$global_symbol_pipe"; then my_dlsyms=${my_outputname}S.c else func_error "not configured to extract global symbols from dlpreopened files" fi fi if test -n "$my_dlsyms"; then case $my_dlsyms in "") ;; *.c) # Discover the nlist of each of the dlfiles. nlist=$output_objdir/$my_outputname.nm func_show_eval "$RM $nlist ${nlist}S ${nlist}T" # Parse the name list into a source file. func_verbose "creating $output_objdir/$my_dlsyms" $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ /* $my_dlsyms - symbol resolution table for '$my_outputname' dlsym emulation. */ /* Generated by $PROGRAM (GNU $PACKAGE) $VERSION */ #ifdef __cplusplus extern \"C\" { #endif #if defined __GNUC__ && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) #pragma GCC diagnostic ignored \"-Wstrict-prototypes\" #endif /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE /* DATA imports from DLLs on WIN32 can't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined __osf__ /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif #define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) /* External symbol declarations for the compiler. */\ " if test yes = "$dlself"; then func_verbose "generating symbol list for '$output'" $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" # Add our own program objects to the symbol list. progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` for progfile in $progfiles; do func_to_tool_file "$progfile" func_convert_file_msys_to_w32 func_verbose "extracting global C symbols from '$func_to_tool_file_result'" $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" done if test -n "$exclude_expsyms"; then $opt_dry_run || { eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi if test -n "$export_symbols_regex"; then $opt_dry_run || { eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi # Prepare the list of exported symbols if test -z "$export_symbols"; then export_symbols=$output_objdir/$outputname.exp $opt_dry_run || { $RM $export_symbols eval "$SED -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' case $host in *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' ;; esac } else $opt_dry_run || { eval "$SED -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' case $host in *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' ;; esac } fi fi for dlprefile in $dlprefiles; do func_verbose "extracting global C symbols from '$dlprefile'" func_basename "$dlprefile" name=$func_basename_result case $host in *cygwin* | *mingw* | *cegcc* ) # if an import library, we need to obtain dlname if func_win32_import_lib_p "$dlprefile"; then func_tr_sh "$dlprefile" eval "curr_lafile=\$libfile_$func_tr_sh_result" dlprefile_dlbasename= if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then # Use subshell, to avoid clobbering current variable values dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` if test -n "$dlprefile_dlname"; then func_basename "$dlprefile_dlname" dlprefile_dlbasename=$func_basename_result else # no lafile. user explicitly requested -dlpreopen . $sharedlib_from_linklib_cmd "$dlprefile" dlprefile_dlbasename=$sharedlib_from_linklib_result fi fi $opt_dry_run || { if test -n "$dlprefile_dlbasename"; then eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' else func_warning "Could not compute DLL name from $name" eval '$ECHO ": $name " >> "$nlist"' fi func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" } else # not an import lib $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } fi ;; *) $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } ;; esac done $opt_dry_run || { # Make sure we have at least an empty file. test -f "$nlist" || : > "$nlist" if test -n "$exclude_expsyms"; then $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T $MV "$nlist"T "$nlist" fi # Try sorting and uniquifying the output. if $GREP -v "^: " < "$nlist" | if sort -k 3 /dev/null 2>&1; then sort -k 3 else sort +2 fi | uniq > "$nlist"S; then : else $GREP -v "^: " < "$nlist" > "$nlist"S fi if test -f "$nlist"S; then eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' else echo '/* NONE */' >> "$output_objdir/$my_dlsyms" fi func_show_eval '$RM "${nlist}I"' if test -n "$global_symbol_to_import"; then eval "$global_symbol_to_import"' < "$nlist"S > "$nlist"I' fi echo >> "$output_objdir/$my_dlsyms" "\ /* The mapping between symbol names and symbols. */ typedef struct { const char *name; void *address; } lt_dlsymlist; extern LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[];\ " if test -s "$nlist"I; then echo >> "$output_objdir/$my_dlsyms" "\ static void lt_syminit(void) { LT_DLSYM_CONST lt_dlsymlist *symbol = lt_${my_prefix}_LTX_preloaded_symbols; for (; symbol->name; ++symbol) {" $SED 's/.*/ if (STREQ (symbol->name, \"&\")) symbol->address = (void *) \&&;/' < "$nlist"I >> "$output_objdir/$my_dlsyms" echo >> "$output_objdir/$my_dlsyms" "\ } }" fi echo >> "$output_objdir/$my_dlsyms" "\ LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[] = { {\"$my_originator\", (void *) 0}," if test -s "$nlist"I; then echo >> "$output_objdir/$my_dlsyms" "\ {\"@INIT@\", (void *) <_syminit}," fi case $need_lib_prefix in no) eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; *) eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; esac echo >> "$output_objdir/$my_dlsyms" "\ {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt_${my_prefix}_LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif\ " } # !$opt_dry_run pic_flag_for_symtable= case "$compile_command " in *" -static "*) ;; *) case $host in # compiling the symbol table file with pic_flag works around # a FreeBSD bug that causes programs to crash when -lm is # linked before any other PIC object. But we must not use # pic_flag when linking with -static. The problem exists in # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; *-*-hpux*) pic_flag_for_symtable=" $pic_flag" ;; *) $my_pic_p && pic_flag_for_symtable=" $pic_flag" ;; esac ;; esac symtab_cflags= for arg in $LTCFLAGS; do case $arg in -pie | -fpie | -fPIE) ;; *) func_append symtab_cflags " $arg" ;; esac done # Now compile the dynamic symbol file. func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' # Clean up the generated files. func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T" "${nlist}I"' # Transform the symbol file into the correct name. symfileobj=$output_objdir/${my_outputname}S.$objext case $host in *cygwin* | *mingw* | *cegcc* ) if test -f "$output_objdir/$my_outputname.def"; then compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` else compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` fi ;; *) compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` ;; esac ;; *) func_fatal_error "unknown suffix for '$my_dlsyms'" ;; esac else # We keep going just in case the user didn't refer to # lt_preloaded_symbols. The linker will fail if global_symbol_pipe # really was required. # Nullify the symbol file. compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"` finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` fi } # func_cygming_gnu_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is a GNU/binutils-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_gnu_implib_p () { $debug_cmd func_to_tool_file "$1" func_convert_file_msys_to_w32 func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` test -n "$func_cygming_gnu_implib_tmp" } # func_cygming_ms_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is an MS-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_ms_implib_p () { $debug_cmd func_to_tool_file "$1" func_convert_file_msys_to_w32 func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` test -n "$func_cygming_ms_implib_tmp" } # func_win32_libid arg # return the library type of file 'arg' # # Need a lot of goo to handle *both* DLLs and import libs # Has to be a shell function in order to 'eat' the argument # that is supplied when $file_magic_command is called. # Despite the name, also deal with 64 bit binaries. func_win32_libid () { $debug_cmd win32_libid_type=unknown win32_fileres=`file -L $1 2>/dev/null` case $win32_fileres in *ar\ archive\ import\ library*) # definitely import win32_libid_type="x86 archive import" ;; *ar\ archive*) # could be an import, or static # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then case $nm_interface in "MS dumpbin") if func_cygming_ms_implib_p "$1" || func_cygming_gnu_implib_p "$1" then win32_nmres=import else win32_nmres= fi ;; *) func_to_tool_file "$1" func_convert_file_msys_to_w32 win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | $SED -n -e ' 1,100{ / I /{ s|.*|import| p q } }'` ;; esac case $win32_nmres in import*) win32_libid_type="x86 archive import";; *) win32_libid_type="x86 archive static";; esac fi ;; *DLL*) win32_libid_type="x86 DLL" ;; *executable*) # but shell scripts are "executable" too... case $win32_fileres in *MS\ Windows\ PE\ Intel*) win32_libid_type="x86 DLL" ;; esac ;; esac $ECHO "$win32_libid_type" } # func_cygming_dll_for_implib ARG # # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib () { $debug_cmd sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` } # func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs # # The is the core of a fallback implementation of a # platform-specific function to extract the name of the # DLL associated with the specified import library LIBNAME. # # SECTION_NAME is either .idata$6 or .idata$7, depending # on the platform and compiler that created the implib. # # Echos the name of the DLL associated with the # specified import library. func_cygming_dll_for_implib_fallback_core () { $debug_cmd match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` $OBJDUMP -s --section "$1" "$2" 2>/dev/null | $SED '/^Contents of section '"$match_literal"':/{ # Place marker at beginning of archive member dllname section s/.*/====MARK====/ p d } # These lines can sometimes be longer than 43 characters, but # are always uninteresting /:[ ]*file format pe[i]\{,1\}-/d /^In archive [^:]*:/d # Ensure marker is printed /^====MARK====/p # Remove all lines with less than 43 characters /^.\{43\}/!d # From remaining lines, remove first 43 characters s/^.\{43\}//' | $SED -n ' # Join marker and all lines until next marker into a single line /^====MARK====/ b para H $ b para b :para x s/\n//g # Remove the marker s/^====MARK====// # Remove trailing dots and whitespace s/[\. \t]*$// # Print /./p' | # we now have a list, one entry per line, of the stringified # contents of the appropriate section of all members of the # archive that possess that section. Heuristic: eliminate # all those that have a first or second character that is # a '.' (that is, objdump's representation of an unprintable # character.) This should work for all archives with less than # 0x302f exports -- but will fail for DLLs whose name actually # begins with a literal '.' or a single character followed by # a '.'. # # Of those that remain, print the first one. $SED -e '/^\./d;/^.\./d;q' } # func_cygming_dll_for_implib_fallback ARG # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # # This fallback implementation is for use when $DLLTOOL # does not support the --identify-strict option. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib_fallback () { $debug_cmd if func_cygming_gnu_implib_p "$1"; then # binutils import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` elif func_cygming_ms_implib_p "$1"; then # ms-generated import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` else # unknown sharedlib_from_linklib_result= fi } # func_extract_an_archive dir oldlib func_extract_an_archive () { $debug_cmd f_ex_an_ar_dir=$1; shift f_ex_an_ar_oldlib=$1 if test yes = "$lock_old_archive_extraction"; then lockfile=$f_ex_an_ar_oldlib.lock until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done fi func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ 'stat=$?; rm -f "$lockfile"; exit $stat' if test yes = "$lock_old_archive_extraction"; then $opt_dry_run || rm -f "$lockfile" fi if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then : else func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" fi } # func_extract_archives gentop oldlib ... func_extract_archives () { $debug_cmd my_gentop=$1; shift my_oldlibs=${1+"$@"} my_oldobjs= my_xlib= my_xabs= my_xdir= for my_xlib in $my_oldlibs; do # Extract the objects. case $my_xlib in [\\/]* | [A-Za-z]:[\\/]*) my_xabs=$my_xlib ;; *) my_xabs=`pwd`"/$my_xlib" ;; esac func_basename "$my_xlib" my_xlib=$func_basename_result my_xlib_u=$my_xlib while :; do case " $extracted_archives " in *" $my_xlib_u "*) func_arith $extracted_serial + 1 extracted_serial=$func_arith_result my_xlib_u=lt$extracted_serial-$my_xlib ;; *) break ;; esac done extracted_archives="$extracted_archives $my_xlib_u" my_xdir=$my_gentop/$my_xlib_u func_mkdir_p "$my_xdir" case $host in *-darwin*) func_verbose "Extracting $my_xabs" # Do not bother doing anything if just a dry run $opt_dry_run || { darwin_orig_dir=`pwd` cd $my_xdir || exit $? darwin_archive=$my_xabs darwin_curdir=`pwd` func_basename "$darwin_archive" darwin_base_archive=$func_basename_result darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` if test -n "$darwin_arches"; then darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` darwin_arch= func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" for darwin_arch in $darwin_arches; do func_mkdir_p "unfat-$$/$darwin_base_archive-$darwin_arch" $LIPO -thin $darwin_arch -output "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" "$darwin_archive" cd "unfat-$$/$darwin_base_archive-$darwin_arch" func_extract_an_archive "`pwd`" "$darwin_base_archive" cd "$darwin_curdir" $RM "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" done # $darwin_arches ## Okay now we've a bunch of thin objects, gotta fatten them up :) darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$sed_basename" | sort -u` darwin_file= darwin_files= for darwin_file in $darwin_filelist; do darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` $LIPO -create -output "$darwin_file" $darwin_files done # $darwin_filelist $RM -rf unfat-$$ cd "$darwin_orig_dir" else cd $darwin_orig_dir func_extract_an_archive "$my_xdir" "$my_xabs" fi # $darwin_arches } # !$opt_dry_run ;; *) func_extract_an_archive "$my_xdir" "$my_xabs" ;; esac my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` done func_extract_archives_result=$my_oldobjs } # func_emit_wrapper [arg=no] # # Emit a libtool wrapper script on stdout. # Don't directly open a file because we may want to # incorporate the script contents within a cygwin/mingw # wrapper executable. Must ONLY be called from within # func_mode_link because it depends on a number of variables # set therein. # # ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR # variable will take. If 'yes', then the emitted script # will assume that the directory where it is stored is # the $objdir directory. This is a cygwin/mingw-specific # behavior. func_emit_wrapper () { func_emit_wrapper_arg1=${1-no} $ECHO "\ #! $SHELL # $output - temporary wrapper script for $objdir/$outputname # Generated by $PROGRAM (GNU $PACKAGE) $VERSION # # The $output program cannot be directly executed until all the libtool # libraries that it depends on are installed. # # This wrapper script should never be moved out of the build directory. # If it is, it will not operate correctly. # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. sed_quote_subst='$sed_quote_subst' # Be Bourne compatible if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH relink_command=\"$relink_command\" # This environment variable determines our operation mode. if test \"\$libtool_install_magic\" = \"$magic\"; then # install mode needs the following variables: generated_by_libtool_version='$macro_version' notinst_deplibs='$notinst_deplibs' else # When we are sourced in execute mode, \$file and \$ECHO are already set. if test \"\$libtool_execute_magic\" != \"$magic\"; then file=\"\$0\"" qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"` $ECHO "\ # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } ECHO=\"$qECHO\" fi # Very basic option parsing. These options are (a) specific to # the libtool wrapper, (b) are identical between the wrapper # /script/ and the wrapper /executable/ that is used only on # windows platforms, and (c) all begin with the string "--lt-" # (application programs are unlikely to have options that match # this pattern). # # There are only two supported options: --lt-debug and # --lt-dump-script. There is, deliberately, no --lt-help. # # The first argument to this parsing function should be the # script's $0 value, followed by "$@". lt_option_debug= func_parse_lt_options () { lt_script_arg0=\$0 shift for lt_opt do case \"\$lt_opt\" in --lt-debug) lt_option_debug=1 ;; --lt-dump-script) lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` cat \"\$lt_dump_D/\$lt_dump_F\" exit 0 ;; --lt-*) \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 exit 1 ;; esac done # Print the debug banner immediately: if test -n \"\$lt_option_debug\"; then echo \"$outputname:$output:\$LINENO: libtool wrapper (GNU $PACKAGE) $VERSION\" 1>&2 fi } # Used when --lt-debug. Prints its arguments to stdout # (redirection is the responsibility of the caller) func_lt_dump_args () { lt_dump_args_N=1; for lt_arg do \$ECHO \"$outputname:$output:\$LINENO: newargv[\$lt_dump_args_N]: \$lt_arg\" lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` done } # Core function for launching the target application func_exec_program_core () { " case $host in # Backslashes separate directories on plain windows *-*-mingw | *-*-os2* | *-cegcc*) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir\\\\\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} " ;; *) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir/\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir/\$program\" \${1+\"\$@\"} " ;; esac $ECHO "\ \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 exit 1 } # A function to encapsulate launching the target application # Strips options in the --lt-* namespace from \$@ and # launches target application with the remaining arguments. func_exec_program () { case \" \$* \" in *\\ --lt-*) for lt_wr_arg do case \$lt_wr_arg in --lt-*) ;; *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; esac shift done ;; esac func_exec_program_core \${1+\"\$@\"} } # Parse options func_parse_lt_options \"\$0\" \${1+\"\$@\"} # Find the directory that this script lives in. thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\` test \"x\$thisdir\" = \"x\$file\" && thisdir=. # Follow symbolic links until we get to the real thisdir. file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\` while test -n \"\$file\"; do destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\` # If there was a directory component, then change thisdir. if test \"x\$destdir\" != \"x\$file\"; then case \"\$destdir\" in [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; *) thisdir=\"\$thisdir/\$destdir\" ;; esac fi file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\` file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` done # Usually 'no', except on cygwin/mingw when embedded into # the cwrapper. WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then # special case for '.' if test \"\$thisdir\" = \".\"; then thisdir=\`pwd\` fi # remove .libs from thisdir case \"\$thisdir\" in *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; $objdir ) thisdir=. ;; esac fi # Try to get the absolute directory name. absdir=\`cd \"\$thisdir\" && pwd\` test -n \"\$absdir\" && thisdir=\"\$absdir\" " if test yes = "$fast_install"; then $ECHO "\ program=lt-'$outputname'$exeext progdir=\"\$thisdir/$objdir\" if test ! -f \"\$progdir/\$program\" || { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | $SED 1q\`; \\ test \"X\$file\" != \"X\$progdir/\$program\"; }; then file=\"\$\$-\$program\" if test ! -d \"\$progdir\"; then $MKDIR \"\$progdir\" else $RM \"\$progdir/\$file\" fi" $ECHO "\ # relink executable if necessary if test -n \"\$relink_command\"; then if relink_command_output=\`eval \$relink_command 2>&1\`; then : else \$ECHO \"\$relink_command_output\" >&2 $RM \"\$progdir/\$file\" exit 1 fi fi $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || { $RM \"\$progdir/\$program\"; $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } $RM \"\$progdir/\$file\" fi" else $ECHO "\ program='$outputname' progdir=\"\$thisdir/$objdir\" " fi $ECHO "\ if test -f \"\$progdir/\$program\"; then" # fixup the dll searchpath if we need to. # # Fix the DLL searchpath if we need to. Do this before prepending # to shlibpath, because on Windows, both are PATH and uninstalled # libraries must come first. if test -n "$dllsearchpath"; then $ECHO "\ # Add the dll search path components to the executable PATH PATH=$dllsearchpath:\$PATH " fi # Export our shlibpath_var if we have one. if test yes = "$shlibpath_overrides_runpath" && test -n "$shlibpath_var" && test -n "$temp_rpath"; then $ECHO "\ # Add our own library path to $shlibpath_var $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" # Some systems cannot cope with colon-terminated $shlibpath_var # The second colon is a workaround for a bug in BeOS R4 sed $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\` export $shlibpath_var " fi $ECHO "\ if test \"\$libtool_execute_magic\" != \"$magic\"; then # Run the actual program with our arguments. func_exec_program \${1+\"\$@\"} fi else # The program doesn't exist. \$ECHO \"\$0: error: '\$progdir/\$program' does not exist\" 1>&2 \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 exit 1 fi fi\ " } # func_emit_cwrapperexe_src # emit the source code for a wrapper executable on stdout # Must ONLY be called from within func_mode_link because # it depends on a number of variable set therein. func_emit_cwrapperexe_src () { cat < #include #ifdef _MSC_VER # include # include # include #else # include # include # ifdef __CYGWIN__ # include # endif #endif #include #include #include #include #include #include #include #include #define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) /* declarations of non-ANSI functions */ #if defined __MINGW32__ # ifdef __STRICT_ANSI__ int _putenv (const char *); # endif #elif defined __CYGWIN__ # ifdef __STRICT_ANSI__ char *realpath (const char *, char *); int putenv (char *); int setenv (const char *, const char *, int); # endif /* #elif defined other_platform || defined ... */ #endif /* portability defines, excluding path handling macros */ #if defined _MSC_VER # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv # define S_IXUSR _S_IEXEC #elif defined __MINGW32__ # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv #elif defined __CYGWIN__ # define HAVE_SETENV # define FOPEN_WB "wb" /* #elif defined other platforms ... */ #endif #if defined PATH_MAX # define LT_PATHMAX PATH_MAX #elif defined MAXPATHLEN # define LT_PATHMAX MAXPATHLEN #else # define LT_PATHMAX 1024 #endif #ifndef S_IXOTH # define S_IXOTH 0 #endif #ifndef S_IXGRP # define S_IXGRP 0 #endif /* path handling portability macros */ #ifndef DIR_SEPARATOR # define DIR_SEPARATOR '/' # define PATH_SEPARATOR ':' #endif #if defined _WIN32 || defined __MSDOS__ || defined __DJGPP__ || \ defined __OS2__ # define HAVE_DOS_BASED_FILE_SYSTEM # define FOPEN_WB "wb" # ifndef DIR_SEPARATOR_2 # define DIR_SEPARATOR_2 '\\' # endif # ifndef PATH_SEPARATOR_2 # define PATH_SEPARATOR_2 ';' # endif #endif #ifndef DIR_SEPARATOR_2 # define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) #else /* DIR_SEPARATOR_2 */ # define IS_DIR_SEPARATOR(ch) \ (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) #endif /* DIR_SEPARATOR_2 */ #ifndef PATH_SEPARATOR_2 # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) #else /* PATH_SEPARATOR_2 */ # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) #endif /* PATH_SEPARATOR_2 */ #ifndef FOPEN_WB # define FOPEN_WB "w" #endif #ifndef _O_BINARY # define _O_BINARY 0 #endif #define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) #define XFREE(stale) do { \ if (stale) { free (stale); stale = 0; } \ } while (0) #if defined LT_DEBUGWRAPPER static int lt_debug = 1; #else static int lt_debug = 0; #endif const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ void *xmalloc (size_t num); char *xstrdup (const char *string); const char *base_name (const char *name); char *find_executable (const char *wrapper); char *chase_symlinks (const char *pathspec); int make_executable (const char *path); int check_executable (const char *path); char *strendzap (char *str, const char *pat); void lt_debugprintf (const char *file, int line, const char *fmt, ...); void lt_fatal (const char *file, int line, const char *message, ...); static const char *nonnull (const char *s); static const char *nonempty (const char *s); void lt_setenv (const char *name, const char *value); char *lt_extend_str (const char *orig_value, const char *add, int to_end); void lt_update_exe_path (const char *name, const char *value); void lt_update_lib_path (const char *name, const char *value); char **prepare_spawn (char **argv); void lt_dump_script (FILE *f); EOF cat <= 0) && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) return 1; else return 0; } int make_executable (const char *path) { int rval = 0; struct stat st; lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", nonempty (path)); if ((!path) || (!*path)) return 0; if (stat (path, &st) >= 0) { rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); } return rval; } /* Searches for the full path of the wrapper. Returns newly allocated full path name if found, NULL otherwise Does not chase symlinks, even on platforms that support them. */ char * find_executable (const char *wrapper) { int has_slash = 0; const char *p; const char *p_next; /* static buffer for getcwd */ char tmp[LT_PATHMAX + 1]; size_t tmp_len; char *concat_name; lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", nonempty (wrapper)); if ((wrapper == NULL) || (*wrapper == '\0')) return NULL; /* Absolute path? */ #if defined HAVE_DOS_BASED_FILE_SYSTEM if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } else { #endif if (IS_DIR_SEPARATOR (wrapper[0])) { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } #if defined HAVE_DOS_BASED_FILE_SYSTEM } #endif for (p = wrapper; *p; p++) if (*p == '/') { has_slash = 1; break; } if (!has_slash) { /* no slashes; search PATH */ const char *path = getenv ("PATH"); if (path != NULL) { for (p = path; *p; p = p_next) { const char *q; size_t p_len; for (q = p; *q; q++) if (IS_PATH_SEPARATOR (*q)) break; p_len = (size_t) (q - p); p_next = (*q == '\0' ? q : q + 1); if (p_len == 0) { /* empty path: current directory */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); } else { concat_name = XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, p, p_len); concat_name[p_len] = '/'; strcpy (concat_name + p_len + 1, wrapper); } if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } } /* not found in PATH; assume curdir */ } /* Relative path | not found in path: prepend cwd */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); return NULL; } char * chase_symlinks (const char *pathspec) { #ifndef S_ISLNK return xstrdup (pathspec); #else char buf[LT_PATHMAX]; struct stat s; char *tmp_pathspec = xstrdup (pathspec); char *p; int has_symlinks = 0; while (strlen (tmp_pathspec) && !has_symlinks) { lt_debugprintf (__FILE__, __LINE__, "checking path component for symlinks: %s\n", tmp_pathspec); if (lstat (tmp_pathspec, &s) == 0) { if (S_ISLNK (s.st_mode) != 0) { has_symlinks = 1; break; } /* search backwards for last DIR_SEPARATOR */ p = tmp_pathspec + strlen (tmp_pathspec) - 1; while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) p--; if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) { /* no more DIR_SEPARATORS left */ break; } *p = '\0'; } else { lt_fatal (__FILE__, __LINE__, "error accessing file \"%s\": %s", tmp_pathspec, nonnull (strerror (errno))); } } XFREE (tmp_pathspec); if (!has_symlinks) { return xstrdup (pathspec); } tmp_pathspec = realpath (pathspec, buf); if (tmp_pathspec == 0) { lt_fatal (__FILE__, __LINE__, "could not follow symlinks for %s", pathspec); } return xstrdup (tmp_pathspec); #endif } char * strendzap (char *str, const char *pat) { size_t len, patlen; assert (str != NULL); assert (pat != NULL); len = strlen (str); patlen = strlen (pat); if (patlen <= len) { str += len - patlen; if (STREQ (str, pat)) *str = '\0'; } return str; } void lt_debugprintf (const char *file, int line, const char *fmt, ...) { va_list args; if (lt_debug) { (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); va_start (args, fmt); (void) vfprintf (stderr, fmt, args); va_end (args); } } static void lt_error_core (int exit_status, const char *file, int line, const char *mode, const char *message, va_list ap) { fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); vfprintf (stderr, message, ap); fprintf (stderr, ".\n"); if (exit_status >= 0) exit (exit_status); } void lt_fatal (const char *file, int line, const char *message, ...) { va_list ap; va_start (ap, message); lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); va_end (ap); } static const char * nonnull (const char *s) { return s ? s : "(null)"; } static const char * nonempty (const char *s) { return (s && !*s) ? "(empty)" : nonnull (s); } void lt_setenv (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_setenv) setting '%s' to '%s'\n", nonnull (name), nonnull (value)); { #ifdef HAVE_SETENV /* always make a copy, for consistency with !HAVE_SETENV */ char *str = xstrdup (value); setenv (name, str, 1); #else size_t len = strlen (name) + 1 + strlen (value) + 1; char *str = XMALLOC (char, len); sprintf (str, "%s=%s", name, value); if (putenv (str) != EXIT_SUCCESS) { XFREE (str); } #endif } } char * lt_extend_str (const char *orig_value, const char *add, int to_end) { char *new_value; if (orig_value && *orig_value) { size_t orig_value_len = strlen (orig_value); size_t add_len = strlen (add); new_value = XMALLOC (char, add_len + orig_value_len + 1); if (to_end) { strcpy (new_value, orig_value); strcpy (new_value + orig_value_len, add); } else { strcpy (new_value, add); strcpy (new_value + add_len, orig_value); } } else { new_value = xstrdup (add); } return new_value; } void lt_update_exe_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); /* some systems can't cope with a ':'-terminated path #' */ size_t len = strlen (new_value); while ((len > 0) && IS_PATH_SEPARATOR (new_value[len-1])) { new_value[--len] = '\0'; } lt_setenv (name, new_value); XFREE (new_value); } } void lt_update_lib_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); lt_setenv (name, new_value); XFREE (new_value); } } EOF case $host_os in mingw*) cat <<"EOF" /* Prepares an argument vector before calling spawn(). Note that spawn() does not by itself call the command interpreter (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&v); v.dwPlatformId == VER_PLATFORM_WIN32_NT; }) ? "cmd.exe" : "command.com"). Instead it simply concatenates the arguments, separated by ' ', and calls CreateProcess(). We must quote the arguments since Win32 CreateProcess() interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a special way: - Space and tab are interpreted as delimiters. They are not treated as delimiters if they are surrounded by double quotes: "...". - Unescaped double quotes are removed from the input. Their only effect is that within double quotes, space and tab are treated like normal characters. - Backslashes not followed by double quotes are not special. - But 2*n+1 backslashes followed by a double quote become n backslashes followed by a double quote (n >= 0): \" -> " \\\" -> \" \\\\\" -> \\" */ #define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" #define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" char ** prepare_spawn (char **argv) { size_t argc; char **new_argv; size_t i; /* Count number of arguments. */ for (argc = 0; argv[argc] != NULL; argc++) ; /* Allocate new argument vector. */ new_argv = XMALLOC (char *, argc + 1); /* Put quoted arguments into the new argument vector. */ for (i = 0; i < argc; i++) { const char *string = argv[i]; if (string[0] == '\0') new_argv[i] = xstrdup ("\"\""); else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) { int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); size_t length; unsigned int backslashes; const char *s; char *quoted_string; char *p; length = 0; backslashes = 0; if (quote_around) length++; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') length += backslashes + 1; length++; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) length += backslashes + 1; quoted_string = XMALLOC (char, length + 1); p = quoted_string; backslashes = 0; if (quote_around) *p++ = '"'; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') { unsigned int j; for (j = backslashes + 1; j > 0; j--) *p++ = '\\'; } *p++ = c; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) { unsigned int j; for (j = backslashes; j > 0; j--) *p++ = '\\'; *p++ = '"'; } *p = '\0'; new_argv[i] = quoted_string; } else new_argv[i] = (char *) string; } new_argv[argc] = NULL; return new_argv; } EOF ;; esac cat <<"EOF" void lt_dump_script (FILE* f) { EOF func_emit_wrapper yes | $SED -n -e ' s/^\(.\{79\}\)\(..*\)/\1\ \2/ h s/\([\\"]\)/\\\1/g s/$/\\n/ s/\([^\n]*\).*/ fputs ("\1", f);/p g D' cat <<"EOF" } EOF } # end: func_emit_cwrapperexe_src # func_win32_import_lib_p ARG # True if ARG is an import lib, as indicated by $file_magic_cmd func_win32_import_lib_p () { $debug_cmd case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in *import*) : ;; *) false ;; esac } # func_suncc_cstd_abi # !!ONLY CALL THIS FOR SUN CC AFTER $compile_command IS FULLY EXPANDED!! # Several compiler flags select an ABI that is incompatible with the # Cstd library. Avoid specifying it if any are in CXXFLAGS. func_suncc_cstd_abi () { $debug_cmd case " $compile_command " in *" -compat=g "*|*\ -std=c++[0-9][0-9]\ *|*" -library=stdcxx4 "*|*" -library=stlport4 "*) suncc_use_cstd_abi=no ;; *) suncc_use_cstd_abi=yes ;; esac } # func_mode_link arg... func_mode_link () { $debug_cmd case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) # It is impossible to link a dll without this setting, and # we shouldn't force the makefile maintainer to figure out # what system we are compiling for in order to pass an extra # flag for every libtool invocation. # allow_undefined=no # FIXME: Unfortunately, there are problems with the above when trying # to make a dll that has undefined symbols, in which case not # even a static library is built. For now, we need to specify # -no-undefined on the libtool link line when we can be certain # that all symbols are satisfied, otherwise we get a static library. allow_undefined=yes ;; *) allow_undefined=yes ;; esac libtool_args=$nonopt base_compile="$nonopt $@" compile_command=$nonopt finalize_command=$nonopt compile_rpath= finalize_rpath= compile_shlibpath= finalize_shlibpath= convenience= old_convenience= deplibs= old_deplibs= compiler_flags= linker_flags= dllsearchpath= lib_search_path=`pwd` inst_prefix_dir= new_inherited_linker_flags= avoid_version=no bindir= dlfiles= dlprefiles= dlself=no export_dynamic=no export_symbols= export_symbols_regex= generated= libobjs= ltlibs= module=no no_install=no objs= os2dllname= non_pic_objects= precious_files_regex= prefer_static_libs=no preload=false prev= prevarg= release= rpath= xrpath= perm_rpath= temp_rpath= thread_safe=no vinfo= vinfo_number=no weak_libs= single_module=$wl-single_module func_infer_tag $base_compile # We need to know -static, to get the right output filenames. for arg do case $arg in -shared) test yes != "$build_libtool_libs" \ && func_fatal_configuration "cannot build a shared library" build_old_libs=no break ;; -all-static | -static | -static-libtool-libs) case $arg in -all-static) if test yes = "$build_libtool_libs" && test -z "$link_static_flag"; then func_warning "complete static linking is impossible in this configuration" fi if test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; -static) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=built ;; -static-libtool-libs) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; esac build_libtool_libs=no build_old_libs=yes break ;; esac done # See if our shared archives depend on static archives. test -n "$old_archive_from_new_cmds" && build_old_libs=yes # Go through the arguments, transforming them on the way. while test "$#" -gt 0; do arg=$1 shift func_quote_for_eval "$arg" qarg=$func_quote_for_eval_unquoted_result func_append libtool_args " $func_quote_for_eval_result" # If the previous option needs an argument, assign it. if test -n "$prev"; then case $prev in output) func_append compile_command " @OUTPUT@" func_append finalize_command " @OUTPUT@" ;; esac case $prev in bindir) bindir=$arg prev= continue ;; dlfiles|dlprefiles) $preload || { # Add the symbol object into the linking commands. func_append compile_command " @SYMFILE@" func_append finalize_command " @SYMFILE@" preload=: } case $arg in *.la | *.lo) ;; # We handle these cases below. force) if test no = "$dlself"; then dlself=needless export_dynamic=yes fi prev= continue ;; self) if test dlprefiles = "$prev"; then dlself=yes elif test dlfiles = "$prev" && test yes != "$dlopen_self"; then dlself=yes else dlself=needless export_dynamic=yes fi prev= continue ;; *) if test dlfiles = "$prev"; then func_append dlfiles " $arg" else func_append dlprefiles " $arg" fi prev= continue ;; esac ;; expsyms) export_symbols=$arg test -f "$arg" \ || func_fatal_error "symbol file '$arg' does not exist" prev= continue ;; expsyms_regex) export_symbols_regex=$arg prev= continue ;; framework) case $host in *-*-darwin*) case "$deplibs " in *" $qarg.ltframework "*) ;; *) func_append deplibs " $qarg.ltframework" # this is fixed later ;; esac ;; esac prev= continue ;; inst_prefix) inst_prefix_dir=$arg prev= continue ;; mllvm) # Clang does not use LLVM to link, so we can simply discard any # '-mllvm $arg' options when doing the link step. prev= continue ;; objectlist) if test -f "$arg"; then save_arg=$arg moreargs= for fil in `cat "$save_arg"` do # func_append moreargs " $fil" arg=$fil # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test none = "$pic_object" && test none = "$non_pic_object"; then func_fatal_error "cannot find name of object for '$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir=$func_dirname_result if test none != "$pic_object"; then # Prepend the subdirectory the object is found in. pic_object=$xdir$pic_object if test dlfiles = "$prev"; then if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then func_append dlfiles " $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test dlprefiles = "$prev"; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg=$pic_object fi # Non-PIC object. if test none != "$non_pic_object"; then # Prepend the subdirectory the object is found in. non_pic_object=$xdir$non_pic_object # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test none = "$pic_object"; then arg=$non_pic_object fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object=$pic_object func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir=$func_dirname_result func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "'$arg' is not a valid libtool object" fi fi done else func_fatal_error "link input file '$arg' does not exist" fi arg=$save_arg prev= continue ;; os2dllname) os2dllname=$arg prev= continue ;; precious_regex) precious_files_regex=$arg prev= continue ;; release) release=-$arg prev= continue ;; rpath | xrpath) # We need an absolute path. case $arg in [\\/]* | [A-Za-z]:[\\/]*) ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac if test rpath = "$prev"; then case "$rpath " in *" $arg "*) ;; *) func_append rpath " $arg" ;; esac else case "$xrpath " in *" $arg "*) ;; *) func_append xrpath " $arg" ;; esac fi prev= continue ;; shrext) shrext_cmds=$arg prev= continue ;; weak) func_append weak_libs " $arg" prev= continue ;; xcclinker) func_append linker_flags " $qarg" func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xcompiler) func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xlinker) func_append linker_flags " $qarg" func_append compiler_flags " $wl$qarg" prev= func_append compile_command " $wl$qarg" func_append finalize_command " $wl$qarg" continue ;; *) eval "$prev=\"\$arg\"" prev= continue ;; esac fi # test -n "$prev" prevarg=$arg case $arg in -all-static) if test -n "$link_static_flag"; then # See comment for -static flag below, for more details. func_append compile_command " $link_static_flag" func_append finalize_command " $link_static_flag" fi continue ;; -allow-undefined) # FIXME: remove this flag sometime in the future. func_fatal_error "'-allow-undefined' must not be used because it is the default" ;; -avoid-version) avoid_version=yes continue ;; -bindir) prev=bindir continue ;; -dlopen) prev=dlfiles continue ;; -dlpreopen) prev=dlprefiles continue ;; -export-dynamic) export_dynamic=yes continue ;; -export-symbols | -export-symbols-regex) if test -n "$export_symbols" || test -n "$export_symbols_regex"; then func_fatal_error "more than one -exported-symbols argument is not allowed" fi if test X-export-symbols = "X$arg"; then prev=expsyms else prev=expsyms_regex fi continue ;; -framework) prev=framework continue ;; -inst-prefix-dir) prev=inst_prefix continue ;; # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* # so, if we see these flags be careful not to treat them like -L -L[A-Z][A-Z]*:*) case $with_gcc/$host in no/*-*-irix* | /*-*-irix*) func_append compile_command " $arg" func_append finalize_command " $arg" ;; esac continue ;; -L*) func_stripname "-L" '' "$arg" if test -z "$func_stripname_result"; then if test "$#" -gt 0; then func_fatal_error "require no space between '-L' and '$1'" else func_fatal_error "need path for '-L' option" fi fi func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) absdir=`cd "$dir" && pwd` test -z "$absdir" && \ func_fatal_error "cannot determine absolute directory name of '$dir'" dir=$absdir ;; esac case "$deplibs " in *" -L$dir "* | *" $arg "*) # Will only happen for absolute or sysroot arguments ;; *) # Preserve sysroot, but never include relative directories case $dir in [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; *) func_append deplibs " -L$dir" ;; esac func_append lib_search_path " $dir" ;; esac case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` case :$dllsearchpath: in *":$dir:"*) ;; ::) dllsearchpath=$dir;; *) func_append dllsearchpath ":$dir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) func_append dllsearchpath ":$testbindir";; esac ;; esac continue ;; -l*) if test X-lc = "X$arg" || test X-lm = "X$arg"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) # These systems don't actually have a C or math library (as such) continue ;; *-*-os2*) # These systems don't actually have a C library (as such) test X-lc = "X$arg" && continue ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*) # Do not include libc due to us having libc/libc_r. test X-lc = "X$arg" && continue ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C and math libraries are in the System framework func_append deplibs " System.ltframework" continue ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype test X-lc = "X$arg" && continue ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work test X-lc = "X$arg" && continue ;; esac elif test X-lc_r = "X$arg"; then case $host in *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*) # Do not include libc_r directly, use -pthread flag. continue ;; esac fi func_append deplibs " $arg" continue ;; -mllvm) prev=mllvm continue ;; -module) module=yes continue ;; # Tru64 UNIX uses -model [arg] to determine the layout of C++ # classes, name mangling, and exception handling. # Darwin uses the -arch flag to determine output architecture. -model|-arch|-isysroot|--sysroot) func_append compiler_flags " $arg" func_append compile_command " $arg" func_append finalize_command " $arg" prev=xcompiler continue ;; -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) func_append compiler_flags " $arg" func_append compile_command " $arg" func_append finalize_command " $arg" case "$new_inherited_linker_flags " in *" $arg "*) ;; * ) func_append new_inherited_linker_flags " $arg" ;; esac continue ;; -multi_module) single_module=$wl-multi_module continue ;; -no-fast-install) fast_install=no continue ;; -no-install) case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) # The PATH hackery in wrapper scripts is required on Windows # and Darwin in order for the loader to find any dlls it needs. func_warning "'-no-install' is ignored for $host" func_warning "assuming '-no-fast-install' instead" fast_install=no ;; *) no_install=yes ;; esac continue ;; -no-undefined) allow_undefined=no continue ;; -objectlist) prev=objectlist continue ;; -os2dllname) prev=os2dllname continue ;; -o) prev=output ;; -precious-files-regex) prev=precious_regex continue ;; -release) prev=release continue ;; -rpath) prev=rpath continue ;; -R) prev=xrpath continue ;; -R*) func_stripname '-R' '' "$arg" dir=$func_stripname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; =*) func_stripname '=' '' "$dir" dir=$lt_sysroot$func_stripname_result ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac case "$xrpath " in *" $dir "*) ;; *) func_append xrpath " $dir" ;; esac continue ;; -shared) # The effects of -shared are defined in a previous loop. continue ;; -shrext) prev=shrext continue ;; -static | -static-libtool-libs) # The effects of -static are defined in a previous loop. # We used to do the same as -all-static on platforms that # didn't have a PIC flag, but the assumption that the effects # would be equivalent was wrong. It would break on at least # Digital Unix and AIX. continue ;; -thread-safe) thread_safe=yes continue ;; -version-info) prev=vinfo continue ;; -version-number) prev=vinfo vinfo_number=yes continue ;; -weak) prev=weak continue ;; -Wc,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result arg= save_ifs=$IFS; IFS=, for flag in $args; do IFS=$save_ifs func_quote_for_eval "$flag" func_append arg " $func_quote_for_eval_result" func_append compiler_flags " $func_quote_for_eval_result" done IFS=$save_ifs func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Wl,*) func_stripname '-Wl,' '' "$arg" args=$func_stripname_result arg= save_ifs=$IFS; IFS=, for flag in $args; do IFS=$save_ifs func_quote_for_eval "$flag" func_append arg " $wl$func_quote_for_eval_result" func_append compiler_flags " $wl$func_quote_for_eval_result" func_append linker_flags " $func_quote_for_eval_result" done IFS=$save_ifs func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Xcompiler) prev=xcompiler continue ;; -Xlinker) prev=xlinker continue ;; -XCClinker) prev=xcclinker continue ;; # -msg_* for osf cc -msg_*) func_quote_for_eval "$arg" arg=$func_quote_for_eval_result ;; # Flags to be passed through unchanged, with rationale: # -64, -mips[0-9] enable 64-bit mode for the SGI compiler # -r[0-9][0-9]* specify processor for the SGI compiler # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler # +DA*, +DD* enable 64-bit mode for the HP compiler # -q* compiler args for the IBM compiler # -m*, -t[45]*, -txscale* architecture-specific flags for GCC # -F/path path to uninstalled frameworks, gcc on darwin # -p, -pg, --coverage, -fprofile-* profiling flags for GCC # -fstack-protector* stack protector flags for GCC # @file GCC response files # -tp=* Portland pgcc target processor selection # --sysroot=* for sysroot support # -O*, -g*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization # -stdlib=* select c++ std lib with clang -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ -O*|-g*|-flto*|-fwhopr*|-fuse-linker-plugin|-fstack-protector*|-stdlib=*) func_quote_for_eval "$arg" arg=$func_quote_for_eval_result func_append compile_command " $arg" func_append finalize_command " $arg" func_append compiler_flags " $arg" continue ;; -Z*) if test os2 = "`expr $host : '.*\(os2\)'`"; then # OS/2 uses -Zxxx to specify OS/2-specific options compiler_flags="$compiler_flags $arg" func_append compile_command " $arg" func_append finalize_command " $arg" case $arg in -Zlinker | -Zstack) prev=xcompiler ;; esac continue else # Otherwise treat like 'Some other compiler flag' below func_quote_for_eval "$arg" arg=$func_quote_for_eval_result fi ;; # Some other compiler flag. -* | +*) func_quote_for_eval "$arg" arg=$func_quote_for_eval_result ;; *.$objext) # A standard object. func_append objs " $arg" ;; *.lo) # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test none = "$pic_object" && test none = "$non_pic_object"; then func_fatal_error "cannot find name of object for '$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir=$func_dirname_result test none = "$pic_object" || { # Prepend the subdirectory the object is found in. pic_object=$xdir$pic_object if test dlfiles = "$prev"; then if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then func_append dlfiles " $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test dlprefiles = "$prev"; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg=$pic_object } # Non-PIC object. if test none != "$non_pic_object"; then # Prepend the subdirectory the object is found in. non_pic_object=$xdir$non_pic_object # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test none = "$pic_object"; then arg=$non_pic_object fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object=$pic_object func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir=$func_dirname_result func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "'$arg' is not a valid libtool object" fi fi ;; *.$libext) # An archive. func_append deplibs " $arg" func_append old_deplibs " $arg" continue ;; *.la) # A libtool-controlled library. func_resolve_sysroot "$arg" if test dlfiles = "$prev"; then # This library was specified with -dlopen. func_append dlfiles " $func_resolve_sysroot_result" prev= elif test dlprefiles = "$prev"; then # The library was specified with -dlpreopen. func_append dlprefiles " $func_resolve_sysroot_result" prev= else func_append deplibs " $func_resolve_sysroot_result" fi continue ;; # Some other compiler argument. *) # Unknown arguments in both finalize_command and compile_command need # to be aesthetically quoted because they are evaled later. func_quote_for_eval "$arg" arg=$func_quote_for_eval_result ;; esac # arg # Now actually substitute the argument into the commands. if test -n "$arg"; then func_append compile_command " $arg" func_append finalize_command " $arg" fi done # argument parsing loop test -n "$prev" && \ func_fatal_help "the '$prevarg' option requires an argument" if test yes = "$export_dynamic" && test -n "$export_dynamic_flag_spec"; then eval arg=\"$export_dynamic_flag_spec\" func_append compile_command " $arg" func_append finalize_command " $arg" fi oldlibs= # calculate the name of the file, without its directory func_basename "$output" outputname=$func_basename_result libobjs_save=$libobjs if test -n "$shlibpath_var"; then # get the directories listed in $shlibpath_var eval shlib_search_path=\`\$ECHO \"\$$shlibpath_var\" \| \$SED \'s/:/ /g\'\` else shlib_search_path= fi eval sys_lib_search_path=\"$sys_lib_search_path_spec\" eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" # Definition is injected by LT_CONFIG during libtool generation. func_munge_path_list sys_lib_dlsearch_path "$LT_SYS_LIBRARY_PATH" func_dirname "$output" "/" "" output_objdir=$func_dirname_result$objdir func_to_tool_file "$output_objdir/" tool_output_objdir=$func_to_tool_file_result # Create the object directory. func_mkdir_p "$output_objdir" # Determine the type of output case $output in "") func_fatal_help "you must specify an output file" ;; *.$libext) linkmode=oldlib ;; *.lo | *.$objext) linkmode=obj ;; *.la) linkmode=lib ;; *) linkmode=prog ;; # Anything else should be a program. esac specialdeplibs= libs= # Find all interdependent deplibs by searching for libraries # that are linked more than once (e.g. -la -lb -la) for deplib in $deplibs; do if $opt_preserve_dup_deps; then case "$libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append libs " $deplib" done if test lib = "$linkmode"; then libs="$predeps $libs $compiler_lib_search_path $postdeps" # Compute libraries that are listed more than once in $predeps # $postdeps and mark them as special (i.e., whose duplicates are # not to be eliminated). pre_post_deps= if $opt_duplicate_compiler_generated_deps; then for pre_post_dep in $predeps $postdeps; do case "$pre_post_deps " in *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;; esac func_append pre_post_deps " $pre_post_dep" done fi pre_post_deps= fi deplibs= newdependency_libs= newlib_search_path= need_relink=no # whether we're linking any uninstalled libtool libraries notinst_deplibs= # not-installed libtool libraries notinst_path= # paths that contain not-installed libtool libraries case $linkmode in lib) passes="conv dlpreopen link" for file in $dlfiles $dlprefiles; do case $file in *.la) ;; *) func_fatal_help "libraries can '-dlopen' only libtool libraries: $file" ;; esac done ;; prog) compile_deplibs= finalize_deplibs= alldeplibs=false newdlfiles= newdlprefiles= passes="conv scan dlopen dlpreopen link" ;; *) passes="conv" ;; esac for pass in $passes; do # The preopen pass in lib mode reverses $deplibs; put it back here # so that -L comes before libs that need it for instance... if test lib,link = "$linkmode,$pass"; then ## FIXME: Find the place where the list is rebuilt in the wrong ## order, and fix it there properly tmp_deplibs= for deplib in $deplibs; do tmp_deplibs="$deplib $tmp_deplibs" done deplibs=$tmp_deplibs fi if test lib,link = "$linkmode,$pass" || test prog,scan = "$linkmode,$pass"; then libs=$deplibs deplibs= fi if test prog = "$linkmode"; then case $pass in dlopen) libs=$dlfiles ;; dlpreopen) libs=$dlprefiles ;; link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; esac fi if test lib,dlpreopen = "$linkmode,$pass"; then # Collect and forward deplibs of preopened libtool libs for lib in $dlprefiles; do # Ignore non-libtool-libs dependency_libs= func_resolve_sysroot "$lib" case $lib in *.la) func_source "$func_resolve_sysroot_result" ;; esac # Collect preopened libtool deplibs, except any this library # has declared as weak libs for deplib in $dependency_libs; do func_basename "$deplib" deplib_base=$func_basename_result case " $weak_libs " in *" $deplib_base "*) ;; *) func_append deplibs " $deplib" ;; esac done done libs=$dlprefiles fi if test dlopen = "$pass"; then # Collect dlpreopened libraries save_deplibs=$deplibs deplibs= fi for deplib in $libs; do lib= found=false case $deplib in -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) if test prog,link = "$linkmode,$pass"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append compiler_flags " $deplib" if test lib = "$linkmode"; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; esac fi fi continue ;; -l*) if test lib != "$linkmode" && test prog != "$linkmode"; then func_warning "'-l' is ignored for archives/objects" continue fi func_stripname '-l' '' "$deplib" name=$func_stripname_result if test lib = "$linkmode"; then searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" else searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" fi for searchdir in $searchdirs; do for search_ext in .la $std_shrext .so .a; do # Search the libtool library lib=$searchdir/lib$name$search_ext if test -f "$lib"; then if test .la = "$search_ext"; then found=: else found=false fi break 2 fi done done if $found; then # deplib is a libtool library # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, # We need to do some special things here, and not later. if test yes = "$allow_libtool_libs_with_static_runtimes"; then case " $predeps $postdeps " in *" $deplib "*) if func_lalib_p "$lib"; then library_names= old_library= func_source "$lib" for l in $old_library $library_names; do ll=$l done if test "X$ll" = "X$old_library"; then # only static version available found=false func_dirname "$lib" "" "." ladir=$func_dirname_result lib=$ladir/$old_library if test prog,link = "$linkmode,$pass"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs" fi continue fi fi ;; *) ;; esac fi else # deplib doesn't seem to be a libtool library if test prog,link = "$linkmode,$pass"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs" fi continue fi ;; # -l *.ltframework) if test prog,link = "$linkmode,$pass"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" if test lib = "$linkmode"; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; esac fi fi continue ;; -L*) case $linkmode in lib) deplibs="$deplib $deplibs" test conv = "$pass" && continue newdependency_libs="$deplib $newdependency_libs" func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; prog) if test conv = "$pass"; then deplibs="$deplib $deplibs" continue fi if test scan = "$pass"; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; *) func_warning "'-L' is ignored for archives/objects" ;; esac # linkmode continue ;; # -L -R*) if test link = "$pass"; then func_stripname '-R' '' "$deplib" func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result # Make sure the xrpath contains only unique directories. case "$xrpath " in *" $dir "*) ;; *) func_append xrpath " $dir" ;; esac fi deplibs="$deplib $deplibs" continue ;; *.la) func_resolve_sysroot "$deplib" lib=$func_resolve_sysroot_result ;; *.$libext) if test conv = "$pass"; then deplibs="$deplib $deplibs" continue fi case $linkmode in lib) # Linking convenience modules into shared libraries is allowed, # but linking other static libraries is non-portable. case " $dlpreconveniencelibs " in *" $deplib "*) ;; *) valid_a_lib=false case $deplibs_check_method in match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ | $EGREP "$match_pattern_regex" > /dev/null; then valid_a_lib=: fi ;; pass_all) valid_a_lib=: ;; esac if $valid_a_lib; then echo $ECHO "*** Warning: Linking the shared library $output against the" $ECHO "*** static library $deplib is not portable!" deplibs="$deplib $deplibs" else echo $ECHO "*** Warning: Trying to link with static lib archive $deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because the file extensions .$libext of this argument makes me believe" echo "*** that it is just a static archive that I should not use here." fi ;; esac continue ;; prog) if test link != "$pass"; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi continue ;; esac # linkmode ;; # *.$libext *.lo | *.$objext) if test conv = "$pass"; then deplibs="$deplib $deplibs" elif test prog = "$linkmode"; then if test dlpreopen = "$pass" || test yes != "$dlopen_support" || test no = "$build_libtool_libs"; then # If there is no dlopen support or we're linking statically, # we need to preload. func_append newdlprefiles " $deplib" compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append newdlfiles " $deplib" fi fi continue ;; %DEPLIBS%) alldeplibs=: continue ;; esac # case $deplib $found || test -f "$lib" \ || func_fatal_error "cannot find the library '$lib' or unhandled argument '$deplib'" # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$lib" \ || func_fatal_error "'$lib' is not a valid libtool archive" func_dirname "$lib" "" "." ladir=$func_dirname_result dlname= dlopen= dlpreopen= libdir= library_names= old_library= inherited_linker_flags= # If the library was installed with an old release of libtool, # it will not redefine variables installed, or shouldnotlink installed=yes shouldnotlink=no avoidtemprpath= # Read the .la file func_source "$lib" # Convert "-framework foo" to "foo.ltframework" if test -n "$inherited_linker_flags"; then tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do case " $new_inherited_linker_flags " in *" $tmp_inherited_linker_flag "*) ;; *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";; esac done fi dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` if test lib,link = "$linkmode,$pass" || test prog,scan = "$linkmode,$pass" || { test prog != "$linkmode" && test lib != "$linkmode"; }; then test -n "$dlopen" && func_append dlfiles " $dlopen" test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" fi if test conv = "$pass"; then # Only check for convenience libraries deplibs="$lib $deplibs" if test -z "$libdir"; then if test -z "$old_library"; then func_fatal_error "cannot find name of link library for '$lib'" fi # It is a libtool convenience library, so add in its objects. func_append convenience " $ladir/$objdir/$old_library" func_append old_convenience " $ladir/$objdir/$old_library" elif test prog != "$linkmode" && test lib != "$linkmode"; then func_fatal_error "'$lib' is not a convenience library" fi tmp_libs= for deplib in $dependency_libs; do deplibs="$deplib $deplibs" if $opt_preserve_dup_deps; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append tmp_libs " $deplib" done continue fi # $pass = conv # Get the name of the library we link against. linklib= if test -n "$old_library" && { test yes = "$prefer_static_libs" || test built,no = "$prefer_static_libs,$installed"; }; then linklib=$old_library else for l in $old_library $library_names; do linklib=$l done fi if test -z "$linklib"; then func_fatal_error "cannot find name of link library for '$lib'" fi # This library was specified with -dlopen. if test dlopen = "$pass"; then test -z "$libdir" \ && func_fatal_error "cannot -dlopen a convenience library: '$lib'" if test -z "$dlname" || test yes != "$dlopen_support" || test no = "$build_libtool_libs" then # If there is no dlname, no dlopen support or we're linking # statically, we need to preload. We also need to preload any # dependent libraries so libltdl's deplib preloader doesn't # bomb out in the load deplibs phase. func_append dlprefiles " $lib $dependency_libs" else func_append newdlfiles " $lib" fi continue fi # $pass = dlopen # We need an absolute path. case $ladir in [\\/]* | [A-Za-z]:[\\/]*) abs_ladir=$ladir ;; *) abs_ladir=`cd "$ladir" && pwd` if test -z "$abs_ladir"; then func_warning "cannot determine absolute directory name of '$ladir'" func_warning "passing it literally to the linker, although it might fail" abs_ladir=$ladir fi ;; esac func_basename "$lib" laname=$func_basename_result # Find the relevant object directory and library name. if test yes = "$installed"; then if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then func_warning "library '$lib' was moved." dir=$ladir absdir=$abs_ladir libdir=$abs_ladir else dir=$lt_sysroot$libdir absdir=$lt_sysroot$libdir fi test yes = "$hardcode_automatic" && avoidtemprpath=yes else if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then dir=$ladir absdir=$abs_ladir # Remove this search path later func_append notinst_path " $abs_ladir" else dir=$ladir/$objdir absdir=$abs_ladir/$objdir # Remove this search path later func_append notinst_path " $abs_ladir" fi fi # $installed = yes func_stripname 'lib' '.la' "$laname" name=$func_stripname_result # This library was specified with -dlpreopen. if test dlpreopen = "$pass"; then if test -z "$libdir" && test prog = "$linkmode"; then func_fatal_error "only libraries may -dlpreopen a convenience library: '$lib'" fi case $host in # special handling for platforms with PE-DLLs. *cygwin* | *mingw* | *cegcc* ) # Linker will automatically link against shared library if both # static and shared are present. Therefore, ensure we extract # symbols from the import library if a shared library is present # (otherwise, the dlopen module name will be incorrect). We do # this by putting the import library name into $newdlprefiles. # We recover the dlopen module name by 'saving' the la file # name in a special purpose variable, and (later) extracting the # dlname from the la file. if test -n "$dlname"; then func_tr_sh "$dir/$linklib" eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" func_append newdlprefiles " $dir/$linklib" else func_append newdlprefiles " $dir/$old_library" # Keep a list of preopened convenience libraries to check # that they are being used correctly in the link pass. test -z "$libdir" && \ func_append dlpreconveniencelibs " $dir/$old_library" fi ;; * ) # Prefer using a static library (so that no silly _DYNAMIC symbols # are required to link). if test -n "$old_library"; then func_append newdlprefiles " $dir/$old_library" # Keep a list of preopened convenience libraries to check # that they are being used correctly in the link pass. test -z "$libdir" && \ func_append dlpreconveniencelibs " $dir/$old_library" # Otherwise, use the dlname, so that lt_dlopen finds it. elif test -n "$dlname"; then func_append newdlprefiles " $dir/$dlname" else func_append newdlprefiles " $dir/$linklib" fi ;; esac fi # $pass = dlpreopen if test -z "$libdir"; then # Link the convenience library if test lib = "$linkmode"; then deplibs="$dir/$old_library $deplibs" elif test prog,link = "$linkmode,$pass"; then compile_deplibs="$dir/$old_library $compile_deplibs" finalize_deplibs="$dir/$old_library $finalize_deplibs" else deplibs="$lib $deplibs" # used for prog,scan pass fi continue fi if test prog = "$linkmode" && test link != "$pass"; then func_append newlib_search_path " $ladir" deplibs="$lib $deplibs" linkalldeplibs=false if test no != "$link_all_deplibs" || test -z "$library_names" || test no = "$build_libtool_libs"; then linkalldeplibs=: fi tmp_libs= for deplib in $dependency_libs; do case $deplib in -L*) func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; esac # Need to link against all dependency_libs? if $linkalldeplibs; then deplibs="$deplib $deplibs" else # Need to hardcode shared library paths # or/and link against static libraries newdependency_libs="$deplib $newdependency_libs" fi if $opt_preserve_dup_deps; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append tmp_libs " $deplib" done # for deplib continue fi # $linkmode = prog... if test prog,link = "$linkmode,$pass"; then if test -n "$library_names" && { { test no = "$prefer_static_libs" || test built,yes = "$prefer_static_libs,$installed"; } || test -z "$old_library"; }; then # We need to hardcode the library path if test -n "$shlibpath_var" && test -z "$avoidtemprpath"; then # Make sure the rpath contains only unique directories. case $temp_rpath: in *"$absdir:"*) ;; *) func_append temp_rpath "$absdir:" ;; esac fi # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) func_append compile_rpath " $absdir" ;; esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac ;; esac fi # $linkmode,$pass = prog,link... if $alldeplibs && { test pass_all = "$deplibs_check_method" || { test yes = "$build_libtool_libs" && test -n "$library_names"; }; }; then # We only need to search for static libraries continue fi fi link_static=no # Whether the deplib will be linked statically use_static_libs=$prefer_static_libs if test built = "$use_static_libs" && test yes = "$installed"; then use_static_libs=no fi if test -n "$library_names" && { test no = "$use_static_libs" || test -z "$old_library"; }; then case $host in *cygwin* | *mingw* | *cegcc* | *os2*) # No point in relinking DLLs because paths are not encoded func_append notinst_deplibs " $lib" need_relink=no ;; *) if test no = "$installed"; then func_append notinst_deplibs " $lib" need_relink=yes fi ;; esac # This is a shared library # Warn about portability, can't link against -module's on some # systems (darwin). Don't bleat about dlopened modules though! dlopenmodule= for dlpremoduletest in $dlprefiles; do if test "X$dlpremoduletest" = "X$lib"; then dlopenmodule=$dlpremoduletest break fi done if test -z "$dlopenmodule" && test yes = "$shouldnotlink" && test link = "$pass"; then echo if test prog = "$linkmode"; then $ECHO "*** Warning: Linking the executable $output against the loadable module" else $ECHO "*** Warning: Linking the shared library $output against the loadable module" fi $ECHO "*** $linklib is not portable!" fi if test lib = "$linkmode" && test yes = "$hardcode_into_libs"; then # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) func_append compile_rpath " $absdir" ;; esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac ;; esac fi if test -n "$old_archive_from_expsyms_cmds"; then # figure out the soname set dummy $library_names shift realname=$1 shift libname=`eval "\\$ECHO \"$libname_spec\""` # use dlname if we got it. it's perfectly good, no? if test -n "$dlname"; then soname=$dlname elif test -n "$soname_spec"; then # bleh windows case $host in *cygwin* | mingw* | *cegcc* | *os2*) func_arith $current - $age major=$func_arith_result versuffix=-$major ;; esac eval soname=\"$soname_spec\" else soname=$realname fi # Make a new name for the extract_expsyms_cmds to use soroot=$soname func_basename "$soroot" soname=$func_basename_result func_stripname 'lib' '.dll' "$soname" newlib=libimp-$func_stripname_result.a # If the library has no export list, then create one now if test -f "$output_objdir/$soname-def"; then : else func_verbose "extracting exported symbol list from '$soname'" func_execute_cmds "$extract_expsyms_cmds" 'exit $?' fi # Create $newlib if test -f "$output_objdir/$newlib"; then :; else func_verbose "generating import library for '$soname'" func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' fi # make sure the library variables are pointing to the new library dir=$output_objdir linklib=$newlib fi # test -n "$old_archive_from_expsyms_cmds" if test prog = "$linkmode" || test relink != "$opt_mode"; then add_shlibpath= add_dir= add= lib_linked=yes case $hardcode_action in immediate | unsupported) if test no = "$hardcode_direct"; then add=$dir/$linklib case $host in *-*-sco3.2v5.0.[024]*) add_dir=-L$dir ;; *-*-sysv4*uw2*) add_dir=-L$dir ;; *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ *-*-unixware7*) add_dir=-L$dir ;; *-*-darwin* ) # if the lib is a (non-dlopened) module then we cannot # link against it, someone is ignoring the earlier warnings if /usr/bin/file -L $add 2> /dev/null | $GREP ": [^:]* bundle" >/dev/null; then if test "X$dlopenmodule" != "X$lib"; then $ECHO "*** Warning: lib $linklib is a module, not a shared library" if test -z "$old_library"; then echo echo "*** And there doesn't seem to be a static archive available" echo "*** The link will probably fail, sorry" else add=$dir/$old_library fi elif test -n "$old_library"; then add=$dir/$old_library fi fi esac elif test no = "$hardcode_minus_L"; then case $host in *-*-sunos*) add_shlibpath=$dir ;; esac add_dir=-L$dir add=-l$name elif test no = "$hardcode_shlibpath_var"; then add_shlibpath=$dir add=-l$name else lib_linked=no fi ;; relink) if test yes = "$hardcode_direct" && test no = "$hardcode_direct_absolute"; then add=$dir/$linklib elif test yes = "$hardcode_minus_L"; then add_dir=-L$absdir # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) func_append add_dir " -L$inst_prefix_dir$libdir" ;; esac fi add=-l$name elif test yes = "$hardcode_shlibpath_var"; then add_shlibpath=$dir add=-l$name else lib_linked=no fi ;; *) lib_linked=no ;; esac if test yes != "$lib_linked"; then func_fatal_configuration "unsupported hardcode properties" fi if test -n "$add_shlibpath"; then case :$compile_shlibpath: in *":$add_shlibpath:"*) ;; *) func_append compile_shlibpath "$add_shlibpath:" ;; esac fi if test prog = "$linkmode"; then test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" test -n "$add" && compile_deplibs="$add $compile_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" if test yes != "$hardcode_direct" && test yes != "$hardcode_minus_L" && test yes = "$hardcode_shlibpath_var"; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac fi fi fi if test prog = "$linkmode" || test relink = "$opt_mode"; then add_shlibpath= add_dir= add= # Finalize command for both is simple: just hardcode it. if test yes = "$hardcode_direct" && test no = "$hardcode_direct_absolute"; then add=$libdir/$linklib elif test yes = "$hardcode_minus_L"; then add_dir=-L$libdir add=-l$name elif test yes = "$hardcode_shlibpath_var"; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac add=-l$name elif test yes = "$hardcode_automatic"; then if test -n "$inst_prefix_dir" && test -f "$inst_prefix_dir$libdir/$linklib"; then add=$inst_prefix_dir$libdir/$linklib else add=$libdir/$linklib fi else # We cannot seem to hardcode it, guess we'll fake it. add_dir=-L$libdir # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) func_append add_dir " -L$inst_prefix_dir$libdir" ;; esac fi add=-l$name fi if test prog = "$linkmode"; then test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" test -n "$add" && finalize_deplibs="$add $finalize_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" fi fi elif test prog = "$linkmode"; then # Here we assume that one of hardcode_direct or hardcode_minus_L # is not unsupported. This is valid on all known static and # shared platforms. if test unsupported != "$hardcode_direct"; then test -n "$old_library" && linklib=$old_library compile_deplibs="$dir/$linklib $compile_deplibs" finalize_deplibs="$dir/$linklib $finalize_deplibs" else compile_deplibs="-l$name -L$dir $compile_deplibs" finalize_deplibs="-l$name -L$dir $finalize_deplibs" fi elif test yes = "$build_libtool_libs"; then # Not a shared library if test pass_all != "$deplibs_check_method"; then # We're trying link a shared library against a static one # but the system doesn't support it. # Just print a warning and add the library to dependency_libs so # that the program can be linked against the static library. echo $ECHO "*** Warning: This system cannot link to static lib archive $lib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have." if test yes = "$module"; then echo "*** But as you try to build a module library, libtool will still create " echo "*** a static module, that should work as long as the dlopening application" echo "*** is linked with the -dlopen flag to resolve symbols at runtime." if test -z "$global_symbol_pipe"; then echo echo "*** However, this would only work if libtool was able to extract symbol" echo "*** lists from a program, using 'nm' or equivalent, but libtool could" echo "*** not find such a program. So, this module is probably useless." echo "*** 'nm' from GNU binutils and a full rebuild may help." fi if test no = "$build_old_libs"; then build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi else deplibs="$dir/$old_library $deplibs" link_static=yes fi fi # link shared/static library? if test lib = "$linkmode"; then if test -n "$dependency_libs" && { test yes != "$hardcode_into_libs" || test yes = "$build_old_libs" || test yes = "$link_static"; }; then # Extract -R from dependency_libs temp_deplibs= for libdir in $dependency_libs; do case $libdir in -R*) func_stripname '-R' '' "$libdir" temp_xrpath=$func_stripname_result case " $xrpath " in *" $temp_xrpath "*) ;; *) func_append xrpath " $temp_xrpath";; esac;; *) func_append temp_deplibs " $libdir";; esac done dependency_libs=$temp_deplibs fi func_append newlib_search_path " $absdir" # Link against this library test no = "$link_static" && newdependency_libs="$abs_ladir/$laname $newdependency_libs" # ... and its dependency_libs tmp_libs= for deplib in $dependency_libs; do newdependency_libs="$deplib $newdependency_libs" case $deplib in -L*) func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result";; *) func_resolve_sysroot "$deplib" ;; esac if $opt_preserve_dup_deps; then case "$tmp_libs " in *" $func_resolve_sysroot_result "*) func_append specialdeplibs " $func_resolve_sysroot_result" ;; esac fi func_append tmp_libs " $func_resolve_sysroot_result" done if test no != "$link_all_deplibs"; then # Add the search paths of all dependency libraries for deplib in $dependency_libs; do path= case $deplib in -L*) path=$deplib ;; *.la) func_resolve_sysroot "$deplib" deplib=$func_resolve_sysroot_result func_dirname "$deplib" "" "." dir=$func_dirname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) absdir=$dir ;; *) absdir=`cd "$dir" && pwd` if test -z "$absdir"; then func_warning "cannot determine absolute directory name of '$dir'" absdir=$dir fi ;; esac if $GREP "^installed=no" $deplib > /dev/null; then case $host in *-*-darwin*) depdepl= eval deplibrary_names=`$SED -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` if test -n "$deplibrary_names"; then for tmp in $deplibrary_names; do depdepl=$tmp done if test -f "$absdir/$objdir/$depdepl"; then depdepl=$absdir/$objdir/$depdepl darwin_install_name=`$OTOOL -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` if test -z "$darwin_install_name"; then darwin_install_name=`$OTOOL64 -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` fi func_append compiler_flags " $wl-dylib_file $wl$darwin_install_name:$depdepl" func_append linker_flags " -dylib_file $darwin_install_name:$depdepl" path= fi fi ;; *) path=-L$absdir/$objdir ;; esac else eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` test -z "$libdir" && \ func_fatal_error "'$deplib' is not a valid libtool archive" test "$absdir" != "$libdir" && \ func_warning "'$deplib' seems to be moved" path=-L$absdir fi ;; esac case " $deplibs " in *" $path "*) ;; *) deplibs="$path $deplibs" ;; esac done fi # link_all_deplibs != no fi # linkmode = lib done # for deplib in $libs if test link = "$pass"; then if test prog = "$linkmode"; then compile_deplibs="$new_inherited_linker_flags $compile_deplibs" finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" else compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` fi fi dependency_libs=$newdependency_libs if test dlpreopen = "$pass"; then # Link the dlpreopened libraries before other libraries for deplib in $save_deplibs; do deplibs="$deplib $deplibs" done fi if test dlopen != "$pass"; then test conv = "$pass" || { # Make sure lib_search_path contains only unique directories. lib_search_path= for dir in $newlib_search_path; do case "$lib_search_path " in *" $dir "*) ;; *) func_append lib_search_path " $dir" ;; esac done newlib_search_path= } if test prog,link = "$linkmode,$pass"; then vars="compile_deplibs finalize_deplibs" else vars=deplibs fi for var in $vars dependency_libs; do # Add libraries to $var in reverse order eval tmp_libs=\"\$$var\" new_libs= for deplib in $tmp_libs; do # FIXME: Pedantically, this is the right thing to do, so # that some nasty dependency loop isn't accidentally # broken: #new_libs="$deplib $new_libs" # Pragmatically, this seems to cause very few problems in # practice: case $deplib in -L*) new_libs="$deplib $new_libs" ;; -R*) ;; *) # And here is the reason: when a library appears more # than once as an explicit dependence of a library, or # is implicitly linked in more than once by the # compiler, it is considered special, and multiple # occurrences thereof are not removed. Compare this # with having the same library being listed as a # dependency of multiple other libraries: in this case, # we know (pedantically, we assume) the library does not # need to be listed more than once, so we keep only the # last copy. This is not always right, but it is rare # enough that we require users that really mean to play # such unportable linking tricks to link the library # using -Wl,-lname, so that libtool does not consider it # for duplicate removal. case " $specialdeplibs " in *" $deplib "*) new_libs="$deplib $new_libs" ;; *) case " $new_libs " in *" $deplib "*) ;; *) new_libs="$deplib $new_libs" ;; esac ;; esac ;; esac done tmp_libs= for deplib in $new_libs; do case $deplib in -L*) case " $tmp_libs " in *" $deplib "*) ;; *) func_append tmp_libs " $deplib" ;; esac ;; *) func_append tmp_libs " $deplib" ;; esac done eval $var=\"$tmp_libs\" done # for var fi # Add Sun CC postdeps if required: test CXX = "$tagname" && { case $host_os in linux*) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 func_suncc_cstd_abi if test no != "$suncc_use_cstd_abi"; then func_append postdeps ' -library=Cstd -library=Crun' fi ;; esac ;; solaris*) func_cc_basename "$CC" case $func_cc_basename_result in CC* | sunCC*) func_suncc_cstd_abi if test no != "$suncc_use_cstd_abi"; then func_append postdeps ' -library=Cstd -library=Crun' fi ;; esac ;; esac } # Last step: remove runtime libs from dependency_libs # (they stay in deplibs) tmp_libs= for i in $dependency_libs; do case " $predeps $postdeps $compiler_lib_search_path " in *" $i "*) i= ;; esac if test -n "$i"; then func_append tmp_libs " $i" fi done dependency_libs=$tmp_libs done # for pass if test prog = "$linkmode"; then dlfiles=$newdlfiles fi if test prog = "$linkmode" || test lib = "$linkmode"; then dlprefiles=$newdlprefiles fi case $linkmode in oldlib) if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then func_warning "'-dlopen' is ignored for archives" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "'-l' and '-L' are ignored for archives" ;; esac test -n "$rpath" && \ func_warning "'-rpath' is ignored for archives" test -n "$xrpath" && \ func_warning "'-R' is ignored for archives" test -n "$vinfo" && \ func_warning "'-version-info/-version-number' is ignored for archives" test -n "$release" && \ func_warning "'-release' is ignored for archives" test -n "$export_symbols$export_symbols_regex" && \ func_warning "'-export-symbols' is ignored for archives" # Now set the variables for building old libraries. build_libtool_libs=no oldlibs=$output func_append objs "$old_deplibs" ;; lib) # Make sure we only generate libraries of the form 'libNAME.la'. case $outputname in lib*) func_stripname 'lib' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" ;; *) test no = "$module" \ && func_fatal_help "libtool library '$output' must begin with 'lib'" if test no != "$need_lib_prefix"; then # Add the "lib" prefix for modules if required func_stripname '' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" else func_stripname '' '.la' "$outputname" libname=$func_stripname_result fi ;; esac if test -n "$objs"; then if test pass_all != "$deplibs_check_method"; then func_fatal_error "cannot build libtool library '$output' from non-libtool objects on this host:$objs" else echo $ECHO "*** Warning: Linking the shared library $output against the non-libtool" $ECHO "*** objects $objs is not portable!" func_append libobjs " $objs" fi fi test no = "$dlself" \ || func_warning "'-dlopen self' is ignored for libtool libraries" set dummy $rpath shift test 1 -lt "$#" \ && func_warning "ignoring multiple '-rpath's for a libtool library" install_libdir=$1 oldlibs= if test -z "$rpath"; then if test yes = "$build_libtool_libs"; then # Building a libtool convenience library. # Some compilers have problems with a '.al' extension so # convenience libraries should have the same extension an # archive normally would. oldlibs="$output_objdir/$libname.$libext $oldlibs" build_libtool_libs=convenience build_old_libs=yes fi test -n "$vinfo" && \ func_warning "'-version-info/-version-number' is ignored for convenience libraries" test -n "$release" && \ func_warning "'-release' is ignored for convenience libraries" else # Parse the version information argument. save_ifs=$IFS; IFS=: set dummy $vinfo 0 0 0 shift IFS=$save_ifs test -n "$7" && \ func_fatal_help "too many parameters to '-version-info'" # convert absolute version numbers to libtool ages # this retains compatibility with .la files and attempts # to make the code below a bit more comprehensible case $vinfo_number in yes) number_major=$1 number_minor=$2 number_revision=$3 # # There are really only two kinds -- those that # use the current revision as the major version # and those that subtract age and use age as # a minor version. But, then there is irix # that has an extra 1 added just for fun # case $version_type in # correct linux to gnu/linux during the next big refactor darwin|freebsd-elf|linux|osf|windows|none) func_arith $number_major + $number_minor current=$func_arith_result age=$number_minor revision=$number_revision ;; freebsd-aout|qnx|sunos) current=$number_major revision=$number_minor age=0 ;; irix|nonstopux) func_arith $number_major + $number_minor current=$func_arith_result age=$number_minor revision=$number_minor lt_irix_increment=no ;; esac ;; no) current=$1 revision=$2 age=$3 ;; esac # Check that each of the things are valid numbers. case $current in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "CURRENT '$current' must be a nonnegative integer" func_fatal_error "'$vinfo' is not valid version information" ;; esac case $revision in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "REVISION '$revision' must be a nonnegative integer" func_fatal_error "'$vinfo' is not valid version information" ;; esac case $age in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "AGE '$age' must be a nonnegative integer" func_fatal_error "'$vinfo' is not valid version information" ;; esac if test "$age" -gt "$current"; then func_error "AGE '$age' is greater than the current interface number '$current'" func_fatal_error "'$vinfo' is not valid version information" fi # Calculate the version variables. major= versuffix= verstring= case $version_type in none) ;; darwin) # Like Linux, but with the current version available in # verstring for coding it into the library header func_arith $current - $age major=.$func_arith_result versuffix=$major.$age.$revision # Darwin ld doesn't like 0 for these options... func_arith $current + 1 minor_current=$func_arith_result xlcverstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision" verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" # On Darwin other compilers case $CC in nagfor*) verstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision" ;; *) verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" ;; esac ;; freebsd-aout) major=.$current versuffix=.$current.$revision ;; freebsd-elf) func_arith $current - $age major=.$func_arith_result versuffix=$major.$age.$revision ;; irix | nonstopux) if test no = "$lt_irix_increment"; then func_arith $current - $age else func_arith $current - $age + 1 fi major=$func_arith_result case $version_type in nonstopux) verstring_prefix=nonstopux ;; *) verstring_prefix=sgi ;; esac verstring=$verstring_prefix$major.$revision # Add in all the interfaces that we are compatible with. loop=$revision while test 0 -ne "$loop"; do func_arith $revision - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring=$verstring_prefix$major.$iface:$verstring done # Before this point, $major must not contain '.'. major=.$major versuffix=$major.$revision ;; linux) # correct to gnu/linux during the next big refactor func_arith $current - $age major=.$func_arith_result versuffix=$major.$age.$revision ;; osf) func_arith $current - $age major=.$func_arith_result versuffix=.$current.$age.$revision verstring=$current.$age.$revision # Add in all the interfaces that we are compatible with. loop=$age while test 0 -ne "$loop"; do func_arith $current - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring=$verstring:$iface.0 done # Make executables depend on our current version. func_append verstring ":$current.0" ;; qnx) major=.$current versuffix=.$current ;; sco) major=.$current versuffix=.$current ;; sunos) major=.$current versuffix=.$current.$revision ;; windows) # Use '-' rather than '.', since we only want one # extension on DOS 8.3 file systems. func_arith $current - $age major=$func_arith_result versuffix=-$major ;; *) func_fatal_configuration "unknown library version type '$version_type'" ;; esac # Clear the version info if we defaulted, and they specified a release. if test -z "$vinfo" && test -n "$release"; then major= case $version_type in darwin) # we can't check for "0.0" in archive_cmds due to quoting # problems, so we reset it completely verstring= ;; *) verstring=0.0 ;; esac if test no = "$need_version"; then versuffix= else versuffix=.0.0 fi fi # Remove version info from name if versioning should be avoided if test yes,no = "$avoid_version,$need_version"; then major= versuffix= verstring= fi # Check to see if the archive will have undefined symbols. if test yes = "$allow_undefined"; then if test unsupported = "$allow_undefined_flag"; then if test yes = "$build_old_libs"; then func_warning "undefined symbols not allowed in $host shared libraries; building static only" build_libtool_libs=no else func_fatal_error "can't build $host shared library unless -no-undefined is specified" fi fi else # Don't allow undefined symbols. allow_undefined_flag=$no_undefined_flag fi fi func_generate_dlsyms "$libname" "$libname" : func_append libobjs " $symfileobj" test " " = "$libobjs" && libobjs= if test relink != "$opt_mode"; then # Remove our outputs, but don't remove object files since they # may have been created when compiling PIC objects. removelist= tempremovelist=`$ECHO "$output_objdir/*"` for p in $tempremovelist; do case $p in *.$objext | *.gcno) ;; $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/$libname$release.*) if test -n "$precious_files_regex"; then if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 then continue fi fi func_append removelist " $p" ;; *) ;; esac done test -n "$removelist" && \ func_show_eval "${RM}r \$removelist" fi # Now set the variables for building old libraries. if test yes = "$build_old_libs" && test convenience != "$build_libtool_libs"; then func_append oldlibs " $output_objdir/$libname.$libext" # Transform .lo files to .o files. oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; $lo2o" | $NL2SP` fi # Eliminate all temporary directories. #for path in $notinst_path; do # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"` #done if test -n "$xrpath"; then # If the user specified any rpath flags, then add them. temp_xrpath= for libdir in $xrpath; do func_replace_sysroot "$libdir" func_append temp_xrpath " -R$func_replace_sysroot_result" case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac done if test yes != "$hardcode_into_libs" || test yes = "$build_old_libs"; then dependency_libs="$temp_xrpath $dependency_libs" fi fi # Make sure dlfiles contains only unique files that won't be dlpreopened old_dlfiles=$dlfiles dlfiles= for lib in $old_dlfiles; do case " $dlprefiles $dlfiles " in *" $lib "*) ;; *) func_append dlfiles " $lib" ;; esac done # Make sure dlprefiles contains only unique files old_dlprefiles=$dlprefiles dlprefiles= for lib in $old_dlprefiles; do case "$dlprefiles " in *" $lib "*) ;; *) func_append dlprefiles " $lib" ;; esac done if test yes = "$build_libtool_libs"; then if test -n "$rpath"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) # these systems don't actually have a c library (as such)! ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C library is in the System framework func_append deplibs " System.ltframework" ;; *-*-netbsd*) # Don't link with libc until the a.out ld.so is fixed. ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc due to us having libc/libc_r. ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work ;; *) # Add libc to deplibs on all other systems if necessary. if test yes = "$build_libtool_need_lc"; then func_append deplibs " -lc" fi ;; esac fi # Transform deplibs into only deplibs that can be linked in shared. name_save=$name libname_save=$libname release_save=$release versuffix_save=$versuffix major_save=$major # I'm not sure if I'm treating the release correctly. I think # release should show up in the -l (ie -lgmp5) so we don't want to # add it in twice. Is that correct? release= versuffix= major= newdeplibs= droppeddeps=no case $deplibs_check_method in pass_all) # Don't check for shared/static. Everything works. # This might be a little naive. We might want to check # whether the library exists or not. But this is on # osf3 & osf4 and I'm not really sure... Just # implementing what was already the behavior. newdeplibs=$deplibs ;; test_compile) # This code stresses the "libraries are programs" paradigm to its # limits. Maybe even breaks it. We compile a program, linking it # against the deplibs as a proxy for the library. Then we can check # whether they linked in statically or dynamically with ldd. $opt_dry_run || $RM conftest.c cat > conftest.c </dev/null` $nocaseglob else potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` fi for potent_lib in $potential_libs; do # Follow soft links. if ls -lLd "$potent_lib" 2>/dev/null | $GREP " -> " >/dev/null; then continue fi # The statement above tries to avoid entering an # endless loop below, in case of cyclic links. # We might still enter an endless loop, since a link # loop can be closed while we follow links, # but so what? potlib=$potent_lib while test -h "$potlib" 2>/dev/null; do potliblink=`ls -ld $potlib | $SED 's/.* -> //'` case $potliblink in [\\/]* | [A-Za-z]:[\\/]*) potlib=$potliblink;; *) potlib=`$ECHO "$potlib" | $SED 's|[^/]*$||'`"$potliblink";; esac done if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | $SED -e 10q | $EGREP "$file_magic_regex" > /dev/null; then func_append newdeplibs " $a_deplib" a_deplib= break 2 fi done done fi if test -n "$a_deplib"; then droppeddeps=yes echo $ECHO "*** Warning: linker path does not have real file for library $a_deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib"; then $ECHO "*** with $libname but no candidates were found. (...for file magic test)" else $ECHO "*** with $libname and none of the candidates passed a file format test" $ECHO "*** using a file magic. Last file checked: $potlib" fi fi ;; *) # Add a -L argument. func_append newdeplibs " $a_deplib" ;; esac done # Gone through all deplibs. ;; match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` for a_deplib in $deplibs; do case $a_deplib in -l*) func_stripname -l '' "$a_deplib" name=$func_stripname_result if test yes = "$allow_libtool_libs_with_static_runtimes"; then case " $predeps $postdeps " in *" $a_deplib "*) func_append newdeplibs " $a_deplib" a_deplib= ;; esac fi if test -n "$a_deplib"; then libname=`eval "\\$ECHO \"$libname_spec\""` for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do potential_libs=`ls $i/$libname[.-]* 2>/dev/null` for potent_lib in $potential_libs; do potlib=$potent_lib # see symlink-check above in file_magic test if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ $EGREP "$match_pattern_regex" > /dev/null; then func_append newdeplibs " $a_deplib" a_deplib= break 2 fi done done fi if test -n "$a_deplib"; then droppeddeps=yes echo $ECHO "*** Warning: linker path does not have real file for library $a_deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib"; then $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" else $ECHO "*** with $libname and none of the candidates passed a file format test" $ECHO "*** using a regex pattern. Last file checked: $potlib" fi fi ;; *) # Add a -L argument. func_append newdeplibs " $a_deplib" ;; esac done # Gone through all deplibs. ;; none | unknown | *) newdeplibs= tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` if test yes = "$allow_libtool_libs_with_static_runtimes"; then for i in $predeps $postdeps; do # can't use Xsed below, because $i might contain '/' tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s|$i||"` done fi case $tmp_deplibs in *[!\ \ ]*) echo if test none = "$deplibs_check_method"; then echo "*** Warning: inter-library dependencies are not supported in this platform." else echo "*** Warning: inter-library dependencies are not known to be supported." fi echo "*** All declared inter-library dependencies are being dropped." droppeddeps=yes ;; esac ;; esac versuffix=$versuffix_save major=$major_save release=$release_save libname=$libname_save name=$name_save case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library with the System framework newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` ;; esac if test yes = "$droppeddeps"; then if test yes = "$module"; then echo echo "*** Warning: libtool could not satisfy all declared inter-library" $ECHO "*** dependencies of module $libname. Therefore, libtool will create" echo "*** a static module, that should work as long as the dlopening" echo "*** application is linked with the -dlopen flag." if test -z "$global_symbol_pipe"; then echo echo "*** However, this would only work if libtool was able to extract symbol" echo "*** lists from a program, using 'nm' or equivalent, but libtool could" echo "*** not find such a program. So, this module is probably useless." echo "*** 'nm' from GNU binutils and a full rebuild may help." fi if test no = "$build_old_libs"; then oldlibs=$output_objdir/$libname.$libext build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi else echo "*** The inter-library dependencies that have been dropped here will be" echo "*** automatically added whenever a program is linked with this library" echo "*** or is declared to -dlopen it." if test no = "$allow_undefined"; then echo echo "*** Since this library must not contain undefined symbols," echo "*** because either the platform does not support them or" echo "*** it was explicitly requested with -no-undefined," echo "*** libtool will only create a static version of it." if test no = "$build_old_libs"; then oldlibs=$output_objdir/$libname.$libext build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi fi fi # Done checking deplibs! deplibs=$newdeplibs fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" case $host in *-*-darwin*) newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $deplibs " in *" -L$path/$objdir "*) func_append new_libs " -L$path/$objdir" ;; esac ;; esac done for deplib in $deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) func_append new_libs " $deplib" ;; esac ;; *) func_append new_libs " $deplib" ;; esac done deplibs=$new_libs # All the library-specific variables (install_libdir is set above). library_names= old_library= dlname= # Test again, we may have decided not to build it any more if test yes = "$build_libtool_libs"; then # Remove $wl instances when linking with ld. # FIXME: should test the right _cmds variable. case $archive_cmds in *\$LD\ *) wl= ;; esac if test yes = "$hardcode_into_libs"; then # Hardcode the library paths hardcode_libdirs= dep_rpath= rpath=$finalize_rpath test relink = "$opt_mode" || rpath=$compile_rpath$rpath for libdir in $rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then func_replace_sysroot "$libdir" libdir=$func_replace_sysroot_result if test -z "$hardcode_libdirs"; then hardcode_libdirs=$libdir else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append dep_rpath " $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) func_append perm_rpath " $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir=$hardcode_libdirs eval "dep_rpath=\"$hardcode_libdir_flag_spec\"" fi if test -n "$runpath_var" && test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do func_append rpath "$dir:" done eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" fi test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" fi shlibpath=$finalize_shlibpath test relink = "$opt_mode" || shlibpath=$compile_shlibpath$shlibpath if test -n "$shlibpath"; then eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" fi # Get the real and link names of the library. eval shared_ext=\"$shrext_cmds\" eval library_names=\"$library_names_spec\" set dummy $library_names shift realname=$1 shift if test -n "$soname_spec"; then eval soname=\"$soname_spec\" else soname=$realname fi if test -z "$dlname"; then dlname=$soname fi lib=$output_objdir/$realname linknames= for link do func_append linknames " $link" done # Use standard objects if they are pic test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` test "X$libobjs" = "X " && libobjs= delfiles= if test -n "$export_symbols" && test -n "$include_expsyms"; then $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" export_symbols=$output_objdir/$libname.uexp func_append delfiles " $export_symbols" fi orig_export_symbols= case $host_os in cygwin* | mingw* | cegcc*) if test -n "$export_symbols" && test -z "$export_symbols_regex"; then # exporting using user supplied symfile func_dll_def_p "$export_symbols" || { # and it's NOT already a .def file. Must figure out # which of the given symbols are data symbols and tag # them as such. So, trigger use of export_symbols_cmds. # export_symbols gets reassigned inside the "prepare # the list of exported symbols" if statement, so the # include_expsyms logic still works. orig_export_symbols=$export_symbols export_symbols= always_export_symbols=yes } fi ;; esac # Prepare the list of exported symbols if test -z "$export_symbols"; then if test yes = "$always_export_symbols" || test -n "$export_symbols_regex"; then func_verbose "generating symbol list for '$libname.la'" export_symbols=$output_objdir/$libname.exp $opt_dry_run || $RM $export_symbols cmds=$export_symbols_cmds save_ifs=$IFS; IFS='~' for cmd1 in $cmds; do IFS=$save_ifs # Take the normal branch if the nm_file_list_spec branch # doesn't work or if tool conversion is not needed. case $nm_file_list_spec~$to_tool_file_cmd in *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) try_normal_branch=yes eval cmd=\"$cmd1\" func_len " $cmd" len=$func_len_result ;; *) try_normal_branch=no ;; esac if test yes = "$try_normal_branch" \ && { test "$len" -lt "$max_cmd_len" \ || test "$max_cmd_len" -le -1; } then func_show_eval "$cmd" 'exit $?' skipped_export=false elif test -n "$nm_file_list_spec"; then func_basename "$output" output_la=$func_basename_result save_libobjs=$libobjs save_output=$output output=$output_objdir/$output_la.nm func_to_tool_file "$output" libobjs=$nm_file_list_spec$func_to_tool_file_result func_append delfiles " $output" func_verbose "creating $NM input file list: $output" for obj in $save_libobjs; do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" done > "$output" eval cmd=\"$cmd1\" func_show_eval "$cmd" 'exit $?' output=$save_output libobjs=$save_libobjs skipped_export=false else # The command line is too long to execute in one step. func_verbose "using reloadable object file for export list..." skipped_export=: # Break out early, otherwise skipped_export may be # set to false by a later but shorter cmd. break fi done IFS=$save_ifs if test -n "$export_symbols_regex" && test : != "$skipped_export"; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi fi if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols=$export_symbols test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test : != "$skipped_export" && test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for '$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands, which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter func_append delfiles " $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi tmp_deplibs= for test_deplib in $deplibs; do case " $convenience " in *" $test_deplib "*) ;; *) func_append tmp_deplibs " $test_deplib" ;; esac done deplibs=$tmp_deplibs if test -n "$convenience"; then if test -n "$whole_archive_flag_spec" && test yes = "$compiler_needs_object" && test -z "$libobjs"; then # extract the archives, so we have objects to list. # TODO: could optimize this to just extract one archive. whole_archive_flag_spec= fi if test -n "$whole_archive_flag_spec"; then save_libobjs=$libobjs eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= else gentop=$output_objdir/${outputname}x func_append generated " $gentop" func_extract_archives $gentop $convenience func_append libobjs " $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi fi if test yes = "$thread_safe" && test -n "$thread_safe_flag_spec"; then eval flag=\"$thread_safe_flag_spec\" func_append linker_flags " $flag" fi # Make a backup of the uninstalled library when relinking if test relink = "$opt_mode"; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? fi # Do each of the archive commands. if test yes = "$module" && test -n "$module_cmds"; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then eval test_cmds=\"$module_expsym_cmds\" cmds=$module_expsym_cmds else eval test_cmds=\"$module_cmds\" cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then eval test_cmds=\"$archive_expsym_cmds\" cmds=$archive_expsym_cmds else eval test_cmds=\"$archive_cmds\" cmds=$archive_cmds fi fi if test : != "$skipped_export" && func_len " $test_cmds" && len=$func_len_result && test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then : else # The command line is too long to link in one step, link piecewise # or, if using GNU ld and skipped_export is not :, use a linker # script. # Save the value of $output and $libobjs because we want to # use them later. If we have whole_archive_flag_spec, we # want to use save_libobjs as it was before # whole_archive_flag_spec was expanded, because we can't # assume the linker understands whole_archive_flag_spec. # This may have to be revisited, in case too many # convenience libraries get linked in and end up exceeding # the spec. if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then save_libobjs=$libobjs fi save_output=$output func_basename "$output" output_la=$func_basename_result # Clear the reloadable object creation command queue and # initialize k to one. test_cmds= concat_cmds= objlist= last_robj= k=1 if test -n "$save_libobjs" && test : != "$skipped_export" && test yes = "$with_gnu_ld"; then output=$output_objdir/$output_la.lnkscript func_verbose "creating GNU ld script: $output" echo 'INPUT (' > $output for obj in $save_libobjs do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" >> $output done echo ')' >> $output func_append delfiles " $output" func_to_tool_file "$output" output=$func_to_tool_file_result elif test -n "$save_libobjs" && test : != "$skipped_export" && test -n "$file_list_spec"; then output=$output_objdir/$output_la.lnk func_verbose "creating linker input file list: $output" : > $output set x $save_libobjs shift firstobj= if test yes = "$compiler_needs_object"; then firstobj="$1 " shift fi for obj do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" >> $output done func_append delfiles " $output" func_to_tool_file "$output" output=$firstobj\"$file_list_spec$func_to_tool_file_result\" else if test -n "$save_libobjs"; then func_verbose "creating reloadable object files..." output=$output_objdir/$output_la-$k.$objext eval test_cmds=\"$reload_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 # Loop over the list of objects to be linked. for obj in $save_libobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result if test -z "$objlist" || test "$len" -lt "$max_cmd_len"; then func_append objlist " $obj" else # The command $test_cmds is almost too long, add a # command to the queue. if test 1 -eq "$k"; then # The first file doesn't have a previous command to add. reload_objs=$objlist eval concat_cmds=\"$reload_cmds\" else # All subsequent reloadable object files will link in # the last one created. reload_objs="$objlist $last_robj" eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" fi last_robj=$output_objdir/$output_la-$k.$objext func_arith $k + 1 k=$func_arith_result output=$output_objdir/$output_la-$k.$objext objlist=" $obj" func_len " $last_robj" func_arith $len0 + $func_len_result len=$func_arith_result fi done # Handle the remaining objects by creating one last # reloadable object file. All subsequent reloadable object # files will link in the last one created. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ reload_objs="$objlist $last_robj" eval concat_cmds=\"\$concat_cmds$reload_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" fi func_append delfiles " $output" else output= fi ${skipped_export-false} && { func_verbose "generating symbol list for '$libname.la'" export_symbols=$output_objdir/$libname.exp $opt_dry_run || $RM $export_symbols libobjs=$output # Append the command to create the export file. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" fi } test -n "$save_libobjs" && func_verbose "creating a temporary reloadable object file: $output" # Loop through the commands generated above and execute them. save_ifs=$IFS; IFS='~' for cmd in $concat_cmds; do IFS=$save_ifs $opt_quiet || { func_quote_for_expand "$cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test relink = "$opt_mode"; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS=$save_ifs if test -n "$export_symbols_regex" && ${skipped_export-false}; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi ${skipped_export-false} && { if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols=$export_symbols test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for '$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands, which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter func_append delfiles " $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi } libobjs=$output # Restore the value of output. output=$save_output if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= fi # Expand the library linking commands again to reset the # value of $libobjs for piecewise linking. # Do each of the archive commands. if test yes = "$module" && test -n "$module_cmds"; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then cmds=$module_expsym_cmds else cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then cmds=$archive_expsym_cmds else cmds=$archive_cmds fi fi fi if test -n "$delfiles"; then # Append the command to remove temporary files to $cmds. eval cmds=\"\$cmds~\$RM $delfiles\" fi # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop=$output_objdir/${outputname}x func_append generated " $gentop" func_extract_archives $gentop $dlprefiles func_append libobjs " $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi save_ifs=$IFS; IFS='~' for cmd in $cmds; do IFS=$sp$nl eval cmd=\"$cmd\" IFS=$save_ifs $opt_quiet || { func_quote_for_expand "$cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test relink = "$opt_mode"; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS=$save_ifs # Restore the uninstalled library and exit if test relink = "$opt_mode"; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? if test -n "$convenience"; then if test -z "$whole_archive_flag_spec"; then func_show_eval '${RM}r "$gentop"' fi fi exit $EXIT_SUCCESS fi # Create links to the real library. for linkname in $linknames; do if test "$realname" != "$linkname"; then func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' fi done # If -module or -export-dynamic was specified, set the dlname. if test yes = "$module" || test yes = "$export_dynamic"; then # On all known operating systems, these are identical. dlname=$soname fi fi ;; obj) if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then func_warning "'-dlopen' is ignored for objects" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "'-l' and '-L' are ignored for objects" ;; esac test -n "$rpath" && \ func_warning "'-rpath' is ignored for objects" test -n "$xrpath" && \ func_warning "'-R' is ignored for objects" test -n "$vinfo" && \ func_warning "'-version-info' is ignored for objects" test -n "$release" && \ func_warning "'-release' is ignored for objects" case $output in *.lo) test -n "$objs$old_deplibs" && \ func_fatal_error "cannot build library object '$output' from non-libtool objects" libobj=$output func_lo2o "$libobj" obj=$func_lo2o_result ;; *) libobj= obj=$output ;; esac # Delete the old objects. $opt_dry_run || $RM $obj $libobj # Objects from convenience libraries. This assumes # single-version convenience libraries. Whenever we create # different ones for PIC/non-PIC, this we'll have to duplicate # the extraction. reload_conv_objs= gentop= # if reload_cmds runs $LD directly, get rid of -Wl from # whole_archive_flag_spec and hope we can get by with turning comma # into space. case $reload_cmds in *\$LD[\ \$]*) wl= ;; esac if test -n "$convenience"; then if test -n "$whole_archive_flag_spec"; then eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" test -n "$wl" || tmp_whole_archive_flags=`$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` reload_conv_objs=$reload_objs\ $tmp_whole_archive_flags else gentop=$output_objdir/${obj}x func_append generated " $gentop" func_extract_archives $gentop $convenience reload_conv_objs="$reload_objs $func_extract_archives_result" fi fi # If we're not building shared, we need to use non_pic_objs test yes = "$build_libtool_libs" || libobjs=$non_pic_objects # Create the old-style object. reload_objs=$objs$old_deplibs' '`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; /\.lib$/d; $lo2o" | $NL2SP`' '$reload_conv_objs output=$obj func_execute_cmds "$reload_cmds" 'exit $?' # Exit if we aren't doing a library object file. if test -z "$libobj"; then if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS fi test yes = "$build_libtool_libs" || { if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi # Create an invalid libtool object if no PIC, so that we don't # accidentally link it into a program. # $show "echo timestamp > $libobj" # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? exit $EXIT_SUCCESS } if test -n "$pic_flag" || test default != "$pic_mode"; then # Only do commands if we really have different PIC objects. reload_objs="$libobjs $reload_conv_objs" output=$libobj func_execute_cmds "$reload_cmds" 'exit $?' fi if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS ;; prog) case $host in *cygwin*) func_stripname '' '.exe' "$output" output=$func_stripname_result.exe;; esac test -n "$vinfo" && \ func_warning "'-version-info' is ignored for programs" test -n "$release" && \ func_warning "'-release' is ignored for programs" $preload \ && test unknown,unknown,unknown = "$dlopen_support,$dlopen_self,$dlopen_self_static" \ && func_warning "'LT_INIT([dlopen])' not used. Assuming no dlopen support." case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library is the System framework compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` ;; esac case $host in *-*-darwin*) # Don't allow lazy linking, it breaks C++ global constructors # But is supposedly fixed on 10.4 or later (yay!). if test CXX = "$tagname"; then case ${MACOSX_DEPLOYMENT_TARGET-10.0} in 10.[0123]) func_append compile_command " $wl-bind_at_load" func_append finalize_command " $wl-bind_at_load" ;; esac fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $compile_deplibs " in *" -L$path/$objdir "*) func_append new_libs " -L$path/$objdir" ;; esac ;; esac done for deplib in $compile_deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) func_append new_libs " $deplib" ;; esac ;; *) func_append new_libs " $deplib" ;; esac done compile_deplibs=$new_libs func_append compile_command " $compile_deplibs" func_append finalize_command " $finalize_deplibs" if test -n "$rpath$xrpath"; then # If the user specified any rpath flags, then add them. for libdir in $rpath $xrpath; do # This is the magic to use -rpath. case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac done fi # Now hardcode the library paths rpath= hardcode_libdirs= for libdir in $compile_rpath $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs=$libdir else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append rpath " $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) func_append perm_rpath " $libdir" ;; esac fi case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`$ECHO "$libdir" | $SED -e 's*/lib$*/bin*'` case :$dllsearchpath: in *":$libdir:"*) ;; ::) dllsearchpath=$libdir;; *) func_append dllsearchpath ":$libdir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) func_append dllsearchpath ":$testbindir";; esac ;; esac done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir=$hardcode_libdirs eval rpath=\" $hardcode_libdir_flag_spec\" fi compile_rpath=$rpath rpath= hardcode_libdirs= for libdir in $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs=$libdir else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append rpath " $flag" fi elif test -n "$runpath_var"; then case "$finalize_perm_rpath " in *" $libdir "*) ;; *) func_append finalize_perm_rpath " $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir=$hardcode_libdirs eval rpath=\" $hardcode_libdir_flag_spec\" fi finalize_rpath=$rpath if test -n "$libobjs" && test yes = "$build_old_libs"; then # Transform all the library objects into standard objects. compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` fi func_generate_dlsyms "$outputname" "@PROGRAM@" false # template prelinking step if test -n "$prelink_cmds"; then func_execute_cmds "$prelink_cmds" 'exit $?' fi wrappers_required=: case $host in *cegcc* | *mingw32ce*) # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. wrappers_required=false ;; *cygwin* | *mingw* ) test yes = "$build_libtool_libs" || wrappers_required=false ;; *) if test no = "$need_relink" || test yes != "$build_libtool_libs"; then wrappers_required=false fi ;; esac $wrappers_required || { # Replace the output file specification. compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` link_command=$compile_command$compile_rpath # We have no uninstalled library dependencies, so finalize right now. exit_status=0 func_show_eval "$link_command" 'exit_status=$?' if test -n "$postlink_cmds"; then func_to_tool_file "$output" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi # Delete the generated files. if test -f "$output_objdir/${outputname}S.$objext"; then func_show_eval '$RM "$output_objdir/${outputname}S.$objext"' fi exit $exit_status } if test -n "$compile_shlibpath$finalize_shlibpath"; then compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" fi if test -n "$finalize_shlibpath"; then finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" fi compile_var= finalize_var= if test -n "$runpath_var"; then if test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do func_append rpath "$dir:" done compile_var="$runpath_var=\"$rpath\$$runpath_var\" " fi if test -n "$finalize_perm_rpath"; then # We should set the runpath_var. rpath= for dir in $finalize_perm_rpath; do func_append rpath "$dir:" done finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " fi fi if test yes = "$no_install"; then # We don't need to create a wrapper script. link_command=$compile_var$compile_command$compile_rpath # Replace the output file specification. link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` # Delete the old output file. $opt_dry_run || $RM $output # Link the executable and exit func_show_eval "$link_command" 'exit $?' if test -n "$postlink_cmds"; then func_to_tool_file "$output" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi exit $EXIT_SUCCESS fi case $hardcode_action,$fast_install in relink,*) # Fast installation is not supported link_command=$compile_var$compile_command$compile_rpath relink_command=$finalize_var$finalize_command$finalize_rpath func_warning "this platform does not like uninstalled shared libraries" func_warning "'$output' will be relinked during installation" ;; *,yes) link_command=$finalize_var$compile_command$finalize_rpath relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` ;; *,no) link_command=$compile_var$compile_command$compile_rpath relink_command=$finalize_var$finalize_command$finalize_rpath ;; *,needless) link_command=$finalize_var$compile_command$finalize_rpath relink_command= ;; esac # Replace the output file specification. link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` # Delete the old output files. $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname func_show_eval "$link_command" 'exit $?' if test -n "$postlink_cmds"; then func_to_tool_file "$output_objdir/$outputname" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi # Now create the wrapper script. func_verbose "creating $output" # Quote the relink command for shipping. if test -n "$relink_command"; then # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else func_quote_for_eval "$var_value" relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" fi done relink_command="(cd `pwd`; $relink_command)" relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` fi # Only actually do things if not in dry run mode. $opt_dry_run || { # win32 will think the script is a binary if it has # a .exe suffix, so we strip it off here. case $output in *.exe) func_stripname '' '.exe' "$output" output=$func_stripname_result ;; esac # test for cygwin because mv fails w/o .exe extensions case $host in *cygwin*) exeext=.exe func_stripname '' '.exe' "$outputname" outputname=$func_stripname_result ;; *) exeext= ;; esac case $host in *cygwin* | *mingw* ) func_dirname_and_basename "$output" "" "." output_name=$func_basename_result output_path=$func_dirname_result cwrappersource=$output_path/$objdir/lt-$output_name.c cwrapper=$output_path/$output_name.exe $RM $cwrappersource $cwrapper trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 func_emit_cwrapperexe_src > $cwrappersource # The wrapper executable is built using the $host compiler, # because it contains $host paths and files. If cross- # compiling, it, like the target executable, must be # executed on the $host or under an emulation environment. $opt_dry_run || { $LTCC $LTCFLAGS -o $cwrapper $cwrappersource $STRIP $cwrapper } # Now, create the wrapper script for func_source use: func_ltwrapper_scriptname $cwrapper $RM $func_ltwrapper_scriptname_result trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 $opt_dry_run || { # note: this script will not be executed, so do not chmod. if test "x$build" = "x$host"; then $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result else func_emit_wrapper no > $func_ltwrapper_scriptname_result fi } ;; * ) $RM $output trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 func_emit_wrapper no > $output chmod +x $output ;; esac } exit $EXIT_SUCCESS ;; esac # See if we need to build an old-fashioned archive. for oldlib in $oldlibs; do case $build_libtool_libs in convenience) oldobjs="$libobjs_save $symfileobj" addlibs=$convenience build_libtool_libs=no ;; module) oldobjs=$libobjs_save addlibs=$old_convenience build_libtool_libs=no ;; *) oldobjs="$old_deplibs $non_pic_objects" $preload && test -f "$symfileobj" \ && func_append oldobjs " $symfileobj" addlibs=$old_convenience ;; esac if test -n "$addlibs"; then gentop=$output_objdir/${outputname}x func_append generated " $gentop" func_extract_archives $gentop $addlibs func_append oldobjs " $func_extract_archives_result" fi # Do each command in the archive commands. if test -n "$old_archive_from_new_cmds" && test yes = "$build_libtool_libs"; then cmds=$old_archive_from_new_cmds else # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop=$output_objdir/${outputname}x func_append generated " $gentop" func_extract_archives $gentop $dlprefiles func_append oldobjs " $func_extract_archives_result" fi # POSIX demands no paths to be encoded in archives. We have # to avoid creating archives with duplicate basenames if we # might have to extract them afterwards, e.g., when creating a # static archive out of a convenience library, or when linking # the entirety of a libtool archive into another (currently # not supported by libtool). if (for obj in $oldobjs do func_basename "$obj" $ECHO "$func_basename_result" done | sort | sort -uc >/dev/null 2>&1); then : else echo "copying selected object files to avoid basename conflicts..." gentop=$output_objdir/${outputname}x func_append generated " $gentop" func_mkdir_p "$gentop" save_oldobjs=$oldobjs oldobjs= counter=1 for obj in $save_oldobjs do func_basename "$obj" objbase=$func_basename_result case " $oldobjs " in " ") oldobjs=$obj ;; *[\ /]"$objbase "*) while :; do # Make sure we don't pick an alternate name that also # overlaps. newobj=lt$counter-$objbase func_arith $counter + 1 counter=$func_arith_result case " $oldobjs " in *[\ /]"$newobj "*) ;; *) if test ! -f "$gentop/$newobj"; then break; fi ;; esac done func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" func_append oldobjs " $gentop/$newobj" ;; *) func_append oldobjs " $obj" ;; esac done fi func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 tool_oldlib=$func_to_tool_file_result eval cmds=\"$old_archive_cmds\" func_len " $cmds" len=$func_len_result if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then cmds=$old_archive_cmds elif test -n "$archiver_list_spec"; then func_verbose "using command file archive linking..." for obj in $oldobjs do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" done > $output_objdir/$libname.libcmd func_to_tool_file "$output_objdir/$libname.libcmd" oldobjs=" $archiver_list_spec$func_to_tool_file_result" cmds=$old_archive_cmds else # the command line is too long to link in one step, link in parts func_verbose "using piecewise archive linking..." save_RANLIB=$RANLIB RANLIB=: objlist= concat_cmds= save_oldobjs=$oldobjs oldobjs= # Is there a better way of finding the last object in the list? for obj in $save_oldobjs do last_oldobj=$obj done eval test_cmds=\"$old_archive_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 for obj in $save_oldobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result func_append objlist " $obj" if test "$len" -lt "$max_cmd_len"; then : else # the above command should be used before it gets too long oldobjs=$objlist if test "$obj" = "$last_oldobj"; then RANLIB=$save_RANLIB fi test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\$concat_cmds$old_archive_cmds\" objlist= len=$len0 fi done RANLIB=$save_RANLIB oldobjs=$objlist if test -z "$oldobjs"; then eval cmds=\"\$concat_cmds\" else eval cmds=\"\$concat_cmds~\$old_archive_cmds\" fi fi fi func_execute_cmds "$cmds" 'exit $?' done test -n "$generated" && \ func_show_eval "${RM}r$generated" # Now create the libtool archive. case $output in *.la) old_library= test yes = "$build_old_libs" && old_library=$libname.$libext func_verbose "creating $output" # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else func_quote_for_eval "$var_value" relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" fi done # Quote the link command for shipping. relink_command="(cd `pwd`; $SHELL \"$progpath\" $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` if test yes = "$hardcode_automatic"; then relink_command= fi # Only create the output if not a dry run. $opt_dry_run || { for installed in no yes; do if test yes = "$installed"; then if test -z "$install_libdir"; then break fi output=$output_objdir/${outputname}i # Replace all uninstalled libtool libraries with the installed ones newdependency_libs= for deplib in $dependency_libs; do case $deplib in *.la) func_basename "$deplib" name=$func_basename_result func_resolve_sysroot "$deplib" eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result` test -z "$libdir" && \ func_fatal_error "'$deplib' is not a valid libtool archive" func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" ;; -L*) func_stripname -L '' "$deplib" func_replace_sysroot "$func_stripname_result" func_append newdependency_libs " -L$func_replace_sysroot_result" ;; -R*) func_stripname -R '' "$deplib" func_replace_sysroot "$func_stripname_result" func_append newdependency_libs " -R$func_replace_sysroot_result" ;; *) func_append newdependency_libs " $deplib" ;; esac done dependency_libs=$newdependency_libs newdlfiles= for lib in $dlfiles; do case $lib in *.la) func_basename "$lib" name=$func_basename_result eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "'$lib' is not a valid libtool archive" func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" ;; *) func_append newdlfiles " $lib" ;; esac done dlfiles=$newdlfiles newdlprefiles= for lib in $dlprefiles; do case $lib in *.la) # Only pass preopened files to the pseudo-archive (for # eventual linking with the app. that links it) if we # didn't already link the preopened objects directly into # the library: func_basename "$lib" name=$func_basename_result eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "'$lib' is not a valid libtool archive" func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" ;; esac done dlprefiles=$newdlprefiles else newdlfiles= for lib in $dlfiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlfiles " $abs" done dlfiles=$newdlfiles newdlprefiles= for lib in $dlprefiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlprefiles " $abs" done dlprefiles=$newdlprefiles fi $RM $output # place dlname in correct position for cygwin # In fact, it would be nice if we could use this code for all target # systems that can't hard-code library paths into their executables # and that have no shared library path variable independent of PATH, # but it turns out we can't easily determine that from inspecting # libtool variables, so we have to hard-code the OSs to which it # applies here; at the moment, that means platforms that use the PE # object format with DLL files. See the long comment at the top of # tests/bindir.at for full details. tdlname=$dlname case $host,$output,$installed,$module,$dlname in *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) # If a -bindir argument was supplied, place the dll there. if test -n "$bindir"; then func_relative_path "$install_libdir" "$bindir" tdlname=$func_relative_path_result/$dlname else # Otherwise fall back on heuristic. tdlname=../bin/$dlname fi ;; esac $ECHO > $output "\ # $outputname - a libtool library file # Generated by $PROGRAM (GNU $PACKAGE) $VERSION # # Please DO NOT delete this file! # It is necessary for linking the library. # The name that we can dlopen(3). dlname='$tdlname' # Names of this library. library_names='$library_names' # The name of the static archive. old_library='$old_library' # Linker flags that cannot go in dependency_libs. inherited_linker_flags='$new_inherited_linker_flags' # Libraries that this one depends upon. dependency_libs='$dependency_libs' # Names of additional weak libraries provided by this library weak_library_names='$weak_libs' # Version information for $libname. current=$current age=$age revision=$revision # Is this an already installed library? installed=$installed # Should we warn about portability when linking against -modules? shouldnotlink=$module # Files to dlopen/dlpreopen dlopen='$dlfiles' dlpreopen='$dlprefiles' # Directory that this library needs to be installed in: libdir='$install_libdir'" if test no,yes = "$installed,$need_relink"; then $ECHO >> $output "\ relink_command=\"$relink_command\"" fi done } # Do a symbolic link so that the libtool archive can be found in # LD_LIBRARY_PATH before the program is installed. func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' ;; esac exit $EXIT_SUCCESS } if test link = "$opt_mode" || test relink = "$opt_mode"; then func_mode_link ${1+"$@"} fi # func_mode_uninstall arg... func_mode_uninstall () { $debug_cmd RM=$nonopt files= rmforce=false exit_status=0 # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic=$magic for arg do case $arg in -f) func_append RM " $arg"; rmforce=: ;; -*) func_append RM " $arg" ;; *) func_append files " $arg" ;; esac done test -z "$RM" && \ func_fatal_help "you must specify an RM program" rmdirs= for file in $files; do func_dirname "$file" "" "." dir=$func_dirname_result if test . = "$dir"; then odir=$objdir else odir=$dir/$objdir fi func_basename "$file" name=$func_basename_result test uninstall = "$opt_mode" && odir=$dir # Remember odir for removal later, being careful to avoid duplicates if test clean = "$opt_mode"; then case " $rmdirs " in *" $odir "*) ;; *) func_append rmdirs " $odir" ;; esac fi # Don't error if the file doesn't exist and rm -f was used. if { test -L "$file"; } >/dev/null 2>&1 || { test -h "$file"; } >/dev/null 2>&1 || test -f "$file"; then : elif test -d "$file"; then exit_status=1 continue elif $rmforce; then continue fi rmfiles=$file case $name in *.la) # Possibly a libtool archive, so verify it. if func_lalib_p "$file"; then func_source $dir/$name # Delete the libtool libraries and symlinks. for n in $library_names; do func_append rmfiles " $odir/$n" done test -n "$old_library" && func_append rmfiles " $odir/$old_library" case $opt_mode in clean) case " $library_names " in *" $dlname "*) ;; *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; esac test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" ;; uninstall) if test -n "$library_names"; then # Do each command in the postuninstall commands. func_execute_cmds "$postuninstall_cmds" '$rmforce || exit_status=1' fi if test -n "$old_library"; then # Do each command in the old_postuninstall commands. func_execute_cmds "$old_postuninstall_cmds" '$rmforce || exit_status=1' fi # FIXME: should reinstall the best remaining shared library. ;; esac fi ;; *.lo) # Possibly a libtool object, so verify it. if func_lalib_p "$file"; then # Read the .lo file func_source $dir/$name # Add PIC object to the list of files to remove. if test -n "$pic_object" && test none != "$pic_object"; then func_append rmfiles " $dir/$pic_object" fi # Add non-PIC object to the list of files to remove. if test -n "$non_pic_object" && test none != "$non_pic_object"; then func_append rmfiles " $dir/$non_pic_object" fi fi ;; *) if test clean = "$opt_mode"; then noexename=$name case $file in *.exe) func_stripname '' '.exe' "$file" file=$func_stripname_result func_stripname '' '.exe' "$name" noexename=$func_stripname_result # $file with .exe has already been added to rmfiles, # add $file without .exe func_append rmfiles " $file" ;; esac # Do a test to see if this is a libtool program. if func_ltwrapper_p "$file"; then if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" relink_command= func_source $func_ltwrapper_scriptname_result func_append rmfiles " $func_ltwrapper_scriptname_result" else relink_command= func_source $dir/$noexename fi # note $name still contains .exe if it was in $file originally # as does the version of $file that was added into $rmfiles func_append rmfiles " $odir/$name $odir/${name}S.$objext" if test yes = "$fast_install" && test -n "$relink_command"; then func_append rmfiles " $odir/lt-$name" fi if test "X$noexename" != "X$name"; then func_append rmfiles " $odir/lt-$noexename.c" fi fi fi ;; esac func_show_eval "$RM $rmfiles" 'exit_status=1' done # Try to remove the $objdir's in the directories where we deleted files for dir in $rmdirs; do if test -d "$dir"; then func_show_eval "rmdir $dir >/dev/null 2>&1" fi done exit $exit_status } if test uninstall = "$opt_mode" || test clean = "$opt_mode"; then func_mode_uninstall ${1+"$@"} fi test -z "$opt_mode" && { help=$generic_help func_fatal_help "you must specify a MODE" } test -z "$exec_cmd" && \ func_fatal_help "invalid operation mode '$opt_mode'" if test -n "$exec_cmd"; then eval exec "$exec_cmd" exit $EXIT_FAILURE fi exit $exit_status # The TAGs below are defined such that we never get into a situation # where we disable both kinds of libraries. Given conflicting # choices, we go for a static library, that is the most portable, # since we can't tell whether shared libraries were disabled because # the user asked for that or because the platform doesn't support # them. This is particularly important on AIX, because we don't # support having both static and shared libraries enabled at the same # time on that platform, so we default to a shared-only configuration. # If a disable-shared tag is given, we'll fallback to a static-only # configuration. But we'll never go from static-only to shared-only. # ### BEGIN LIBTOOL TAG CONFIG: disable-shared build_libtool_libs=no build_old_libs=yes # ### END LIBTOOL TAG CONFIG: disable-shared # ### BEGIN LIBTOOL TAG CONFIG: disable-static build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` # ### END LIBTOOL TAG CONFIG: disable-static # Local Variables: # mode:shell-script # sh-indentation:2 # End: pkg-config-0.29.1/glib/m4macros/0000775000175000017500000000000012665370347013311 500000000000000pkg-config-0.29.1/glib/m4macros/ltsugar.m40000644000175000017500000001042412601774016015142 00000000000000# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- # # Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 6 ltsugar.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) # lt_join(SEP, ARG1, [ARG2...]) # ----------------------------- # Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their # associated separator. # Needed until we can rely on m4_join from Autoconf 2.62, since all earlier # versions in m4sugar had bugs. m4_define([lt_join], [m4_if([$#], [1], [], [$#], [2], [[$2]], [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) m4_define([_lt_join], [m4_if([$#$2], [2], [], [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) # lt_car(LIST) # lt_cdr(LIST) # ------------ # Manipulate m4 lists. # These macros are necessary as long as will still need to support # Autoconf-2.59 which quotes differently. m4_define([lt_car], [[$1]]) m4_define([lt_cdr], [m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], [$#], 1, [], [m4_dquote(m4_shift($@))])]) m4_define([lt_unquote], $1) # lt_append(MACRO-NAME, STRING, [SEPARATOR]) # ------------------------------------------ # Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'. # Note that neither SEPARATOR nor STRING are expanded; they are appended # to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). # No SEPARATOR is output if MACRO-NAME was previously undefined (different # than defined and empty). # # This macro is needed until we can rely on Autoconf 2.62, since earlier # versions of m4sugar mistakenly expanded SEPARATOR but not STRING. m4_define([lt_append], [m4_define([$1], m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) # lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) # ---------------------------------------------------------- # Produce a SEP delimited list of all paired combinations of elements of # PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list # has the form PREFIXmINFIXSUFFIXn. # Needed until we can rely on m4_combine added in Autoconf 2.62. m4_define([lt_combine], [m4_if(m4_eval([$# > 3]), [1], [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl [[m4_foreach([_Lt_prefix], [$2], [m4_foreach([_Lt_suffix], ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) # lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) # ----------------------------------------------------------------------- # Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited # by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. m4_define([lt_if_append_uniq], [m4_ifdef([$1], [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], [lt_append([$1], [$2], [$3])$4], [$5])], [lt_append([$1], [$2], [$3])$4])]) # lt_dict_add(DICT, KEY, VALUE) # ----------------------------- m4_define([lt_dict_add], [m4_define([$1($2)], [$3])]) # lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) # -------------------------------------------- m4_define([lt_dict_add_subkey], [m4_define([$1($2:$3)], [$4])]) # lt_dict_fetch(DICT, KEY, [SUBKEY]) # ---------------------------------- m4_define([lt_dict_fetch], [m4_ifval([$3], m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) # lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) # ----------------------------------------------------------------- m4_define([lt_if_dict_fetch], [m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], [$5], [$6])]) # lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) # -------------------------------------------------------------- m4_define([lt_dict_filter], [m4_if([$5], [], [], [lt_join(m4_quote(m4_default([$4], [[, ]])), lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl ]) pkg-config-0.29.1/glib/m4macros/glib-gettext.m40000664000175000017500000003260712651243552016072 00000000000000# Copyright (C) 1995-2002 Free Software Foundation, Inc. # Copyright (C) 2001-2003,2004 Red Hat, Inc. # # This file is free software, distributed under the terms of the GNU # General Public License. As a special exception to the GNU General # Public License, this file may be distributed as part of a program # that contains a configuration script generated by Autoconf, under # the same distribution terms as the rest of that program. # # This file can be copied and used freely without restrictions. It can # be used in projects which are not available under the GNU Public License # but which still want to provide support for the GNU gettext functionality. # # Macro to add for using GNU gettext. # Ulrich Drepper , 1995, 1996 # # Modified to never use included libintl. # Owen Taylor , 12/15/1998 # # Major rework to remove unused code # Owen Taylor , 12/11/2002 # # Added better handling of ALL_LINGUAS from GNU gettext version # written by Bruno Haible, Owen Taylor 5/30/3002 # # Modified to require ngettext # Matthias Clasen 08/06/2004 # # We need this here as well, since someone might use autoconf-2.5x # to configure GLib then an older version to configure a package # using AM_GLIB_GNU_GETTEXT AC_PREREQ(2.53) dnl dnl We go to great lengths to make sure that aclocal won't dnl try to pull in the installed version of these macros dnl when running aclocal in the glib directory. dnl m4_copy([AC_DEFUN],[glib_DEFUN]) m4_copy([AC_REQUIRE],[glib_REQUIRE]) dnl dnl At the end, if we're not within glib, we'll define the public dnl definitions in terms of our private definitions. dnl # GLIB_LC_MESSAGES #-------------------- glib_DEFUN([GLIB_LC_MESSAGES], [AC_CHECK_HEADERS([locale.h]) if test $ac_cv_header_locale_h = yes; then AC_CACHE_CHECK([for LC_MESSAGES], am_cv_val_LC_MESSAGES, [AC_TRY_LINK([#include ], [return LC_MESSAGES], am_cv_val_LC_MESSAGES=yes, am_cv_val_LC_MESSAGES=no)]) if test $am_cv_val_LC_MESSAGES = yes; then AC_DEFINE(HAVE_LC_MESSAGES, 1, [Define if your file defines LC_MESSAGES.]) fi fi]) # GLIB_PATH_PROG_WITH_TEST #---------------------------- dnl GLIB_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR, dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]]) glib_DEFUN([GLIB_PATH_PROG_WITH_TEST], [# Extract the first word of "$2", so it can be a program name with args. set dummy $2; ac_word=[$]2 AC_MSG_CHECKING([for $ac_word]) AC_CACHE_VAL(ac_cv_path_$1, [case "[$]$1" in /*) ac_cv_path_$1="[$]$1" # Let the user override the test with a path. ;; *) IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" for ac_dir in ifelse([$5], , $PATH, [$5]); do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then if [$3]; then ac_cv_path_$1="$ac_dir/$ac_word" break fi fi done IFS="$ac_save_ifs" dnl If no 4th arg is given, leave the cache variable unset, dnl so AC_PATH_PROGS will keep looking. ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4" ])dnl ;; esac])dnl $1="$ac_cv_path_$1" if test ifelse([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then AC_MSG_RESULT([$]$1) else AC_MSG_RESULT(no) fi AC_SUBST($1)dnl ]) # GLIB_WITH_NLS #----------------- glib_DEFUN([GLIB_WITH_NLS], dnl NLS is obligatory [USE_NLS=yes AC_SUBST(USE_NLS) gt_cv_have_gettext=no CATOBJEXT=NONE XGETTEXT=: INTLLIBS= AC_CHECK_HEADER(libintl.h, [gt_cv_func_dgettext_libintl="no" libintl_extra_libs="" # # First check in libc # AC_CACHE_CHECK([for ngettext in libc], gt_cv_func_ngettext_libc, [AC_TRY_LINK([ #include ], [return !ngettext ("","", 1)], gt_cv_func_ngettext_libc=yes, gt_cv_func_ngettext_libc=no) ]) if test "$gt_cv_func_ngettext_libc" = "yes" ; then AC_CACHE_CHECK([for dgettext in libc], gt_cv_func_dgettext_libc, [AC_TRY_LINK([ #include ], [return !dgettext ("","")], gt_cv_func_dgettext_libc=yes, gt_cv_func_dgettext_libc=no) ]) fi if test "$gt_cv_func_ngettext_libc" = "yes" ; then AC_CHECK_FUNCS(bind_textdomain_codeset) fi # # If we don't have everything we want, check in libintl # if test "$gt_cv_func_dgettext_libc" != "yes" \ || test "$gt_cv_func_ngettext_libc" != "yes" \ || test "$ac_cv_func_bind_textdomain_codeset" != "yes" ; then AC_CHECK_LIB(intl, bindtextdomain, [AC_CHECK_LIB(intl, ngettext, [AC_CHECK_LIB(intl, dgettext, gt_cv_func_dgettext_libintl=yes)])]) if test "$gt_cv_func_dgettext_libintl" != "yes" ; then AC_MSG_CHECKING([if -liconv is needed to use gettext]) AC_MSG_RESULT([]) AC_CHECK_LIB(intl, ngettext, [AC_CHECK_LIB(intl, dcgettext, [gt_cv_func_dgettext_libintl=yes libintl_extra_libs=-liconv], :,-liconv)], :,-liconv) fi # # If we found libintl, then check in it for bind_textdomain_codeset(); # we'll prefer libc if neither have bind_textdomain_codeset(), # and both have dgettext and ngettext # if test "$gt_cv_func_dgettext_libintl" = "yes" ; then glib_save_LIBS="$LIBS" LIBS="$LIBS -lintl $libintl_extra_libs" unset ac_cv_func_bind_textdomain_codeset AC_CHECK_FUNCS(bind_textdomain_codeset) LIBS="$glib_save_LIBS" if test "$ac_cv_func_bind_textdomain_codeset" = "yes" ; then gt_cv_func_dgettext_libc=no else if test "$gt_cv_func_dgettext_libc" = "yes" \ && test "$gt_cv_func_ngettext_libc" = "yes"; then gt_cv_func_dgettext_libintl=no fi fi fi fi if test "$gt_cv_func_dgettext_libc" = "yes" \ || test "$gt_cv_func_dgettext_libintl" = "yes"; then gt_cv_have_gettext=yes fi if test "$gt_cv_func_dgettext_libintl" = "yes"; then INTLLIBS="-lintl $libintl_extra_libs" fi if test "$gt_cv_have_gettext" = "yes"; then AC_DEFINE(HAVE_GETTEXT,1, [Define if the GNU gettext() function is already present or preinstalled.]) GLIB_PATH_PROG_WITH_TEST(MSGFMT, msgfmt, [test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"], no)dnl if test "$MSGFMT" != "no"; then glib_save_LIBS="$LIBS" LIBS="$LIBS $INTLLIBS" AC_CHECK_FUNCS(dcgettext) MSGFMT_OPTS= AC_MSG_CHECKING([if msgfmt accepts -c]) GLIB_RUN_PROG([$MSGFMT -c -o /dev/null],[ msgid "" msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Project-Id-Version: test 1.0\n" "PO-Revision-Date: 2007-02-15 12:01+0100\n" "Last-Translator: test \n" "Language-Team: C \n" "MIME-Version: 1.0\n" "Content-Transfer-Encoding: 8bit\n" ], [MSGFMT_OPTS=-c; AC_MSG_RESULT([yes])], [AC_MSG_RESULT([no])]) AC_SUBST(MSGFMT_OPTS) AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) GLIB_PATH_PROG_WITH_TEST(XGETTEXT, xgettext, [test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"], :) AC_TRY_LINK(, [extern int _nl_msg_cat_cntr; return _nl_msg_cat_cntr], [CATOBJEXT=.gmo DATADIRNAME=share], [case $host in *-*-solaris*) dnl On Solaris, if bind_textdomain_codeset is in libc, dnl GNU format message catalog is always supported, dnl since both are added to the libc all together. dnl Hence, we'd like to go with DATADIRNAME=share and dnl and CATOBJEXT=.gmo in this case. AC_CHECK_FUNC(bind_textdomain_codeset, [CATOBJEXT=.gmo DATADIRNAME=share], [CATOBJEXT=.mo DATADIRNAME=lib]) ;; *-*-openbsd*) CATOBJEXT=.mo DATADIRNAME=share ;; *) CATOBJEXT=.mo DATADIRNAME=lib ;; esac]) LIBS="$glib_save_LIBS" INSTOBJEXT=.mo else gt_cv_have_gettext=no fi fi ]) if test "$gt_cv_have_gettext" = "yes" ; then AC_DEFINE(ENABLE_NLS, 1, [always defined to indicate that i18n is enabled]) fi dnl Test whether we really found GNU xgettext. if test "$XGETTEXT" != ":"; then dnl If it is not GNU xgettext we define it as : so that the dnl Makefiles still can work. if $XGETTEXT --omit-header /dev/null 2> /dev/null; then : ; else AC_MSG_RESULT( [found xgettext program is not GNU xgettext; ignore it]) XGETTEXT=":" fi fi # We need to process the po/ directory. POSUB=po AC_OUTPUT_COMMANDS( [case "$CONFIG_FILES" in *po/Makefile.in*) sed -e "/POTFILES =/r po/POTFILES" po/Makefile.in > po/Makefile esac]) dnl These rules are solely for the distribution goal. While doing this dnl we only have to keep exactly one list of the available catalogs dnl in configure.ac. for lang in $ALL_LINGUAS; do GMOFILES="$GMOFILES $lang.gmo" POFILES="$POFILES $lang.po" done dnl Make all variables we use known to autoconf. AC_SUBST(CATALOGS) AC_SUBST(CATOBJEXT) AC_SUBST(DATADIRNAME) AC_SUBST(GMOFILES) AC_SUBST(INSTOBJEXT) AC_SUBST(INTLLIBS) AC_SUBST(PO_IN_DATADIR_TRUE) AC_SUBST(PO_IN_DATADIR_FALSE) AC_SUBST(POFILES) AC_SUBST(POSUB) ]) # AM_GLIB_GNU_GETTEXT # ------------------- # Do checks necessary for use of gettext. If a suitable implementation # of gettext is found in either in libintl or in the C library, # it will set INTLLIBS to the libraries needed for use of gettext # and AC_DEFINE() HAVE_GETTEXT and ENABLE_NLS. (The shell variable # gt_cv_have_gettext will be set to "yes".) It will also call AC_SUBST() # on various variables needed by the Makefile.in.in installed by # glib-gettextize. dnl glib_DEFUN([GLIB_GNU_GETTEXT], [AC_REQUIRE([AC_PROG_CC])dnl GLIB_LC_MESSAGES GLIB_WITH_NLS if test "$gt_cv_have_gettext" = "yes"; then if test "x$ALL_LINGUAS" = "x"; then LINGUAS= else AC_MSG_CHECKING(for catalogs to be installed) NEW_LINGUAS= for presentlang in $ALL_LINGUAS; do useit=no if test "%UNSET%" != "${LINGUAS-%UNSET%}"; then desiredlanguages="$LINGUAS" else desiredlanguages="$ALL_LINGUAS" fi for desiredlang in $desiredlanguages; do # Use the presentlang catalog if desiredlang is # a. equal to presentlang, or # b. a variant of presentlang (because in this case, # presentlang can be used as a fallback for messages # which are not translated in the desiredlang catalog). case "$desiredlang" in "$presentlang"*) useit=yes;; esac done if test $useit = yes; then NEW_LINGUAS="$NEW_LINGUAS $presentlang" fi done LINGUAS=$NEW_LINGUAS AC_MSG_RESULT($LINGUAS) fi dnl Construct list of names of catalog files to be constructed. if test -n "$LINGUAS"; then for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done fi fi dnl If the AC_CONFIG_AUX_DIR macro for autoconf is used we possibly dnl find the mkinstalldirs script in another subdir but ($top_srcdir). dnl Try to locate is. MKINSTALLDIRS= if test -n "$ac_aux_dir"; then MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs" fi if test -z "$MKINSTALLDIRS"; then MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs" fi AC_SUBST(MKINSTALLDIRS) dnl Generate list of files to be processed by xgettext which will dnl be included in po/Makefile. test -d po || mkdir po if test "x$srcdir" != "x."; then if test "x`echo $srcdir | sed 's@/.*@@'`" = "x"; then posrcprefix="$srcdir/" else posrcprefix="../$srcdir/" fi else posrcprefix="../" fi rm -f po/POTFILES sed -e "/^#/d" -e "/^\$/d" -e "s,.*, $posrcprefix& \\\\," -e "\$s/\(.*\) \\\\/\1/" \ < $srcdir/po/POTFILES.in > po/POTFILES ]) # AM_GLIB_DEFINE_LOCALEDIR(VARIABLE) # ------------------------------- # Define VARIABLE to the location where catalog files will # be installed by po/Makefile. glib_DEFUN([GLIB_DEFINE_LOCALEDIR], [glib_REQUIRE([GLIB_GNU_GETTEXT])dnl glib_save_prefix="$prefix" glib_save_exec_prefix="$exec_prefix" glib_save_datarootdir="$datarootdir" test "x$prefix" = xNONE && prefix=$ac_default_prefix test "x$exec_prefix" = xNONE && exec_prefix=$prefix datarootdir=`eval echo "${datarootdir}"` if test "x$CATOBJEXT" = "x.mo" ; then localedir=`eval echo "${libdir}/locale"` else localedir=`eval echo "${datadir}/locale"` fi prefix="$glib_save_prefix" exec_prefix="$glib_save_exec_prefix" datarootdir="$glib_save_datarootdir" AC_DEFINE_UNQUOTED($1, "$localedir", [Define the location where the catalogs will be installed]) ]) dnl dnl Now the definitions that aclocal will find dnl ifdef(glib_configure_ac,[],[ AC_DEFUN([AM_GLIB_GNU_GETTEXT],[GLIB_GNU_GETTEXT($@)]) AC_DEFUN([AM_GLIB_DEFINE_LOCALEDIR],[GLIB_DEFINE_LOCALEDIR($@)]) ])dnl # GLIB_RUN_PROG(PROGRAM, TEST-FILE, [ACTION-IF-PASS], [ACTION-IF-FAIL]) # # Create a temporary file with TEST-FILE as its contents and pass the # file name to PROGRAM. Perform ACTION-IF-PASS if PROGRAM exits with # 0 and perform ACTION-IF-FAIL for any other exit status. AC_DEFUN([GLIB_RUN_PROG], [cat >conftest.foo <<_ACEOF $2 _ACEOF if AC_RUN_LOG([$1 conftest.foo]); then m4_ifval([$3], [$3], [:]) m4_ifvaln([$4], [else $4])dnl echo "$as_me: failed input was:" >&AS_MESSAGE_LOG_FD sed 's/^/| /' conftest.foo >&AS_MESSAGE_LOG_FD fi]) pkg-config-0.29.1/glib/m4macros/gsettings.m40000664000175000017500000000652712275467762015521 00000000000000dnl GLIB_GSETTINGS dnl Defines GSETTINGS_SCHEMAS_INSTALL which controls whether dnl the schema should be compiled dnl AC_DEFUN([GLIB_GSETTINGS], [ m4_pattern_allow([AM_V_GEN]) AC_ARG_ENABLE(schemas-compile, AS_HELP_STRING([--disable-schemas-compile], [Disable regeneration of gschemas.compiled on install]), [case ${enableval} in yes) GSETTINGS_DISABLE_SCHEMAS_COMPILE="" ;; no) GSETTINGS_DISABLE_SCHEMAS_COMPILE="1" ;; *) AC_MSG_ERROR([bad value ${enableval} for --enable-schemas-compile]) ;; esac]) AC_SUBST([GSETTINGS_DISABLE_SCHEMAS_COMPILE]) PKG_PROG_PKG_CONFIG([0.16]) AC_SUBST(gsettingsschemadir, [${datadir}/glib-2.0/schemas]) if test x$cross_compiling != xyes; then GLIB_COMPILE_SCHEMAS=`$PKG_CONFIG --variable glib_compile_schemas gio-2.0` else AC_PATH_PROG(GLIB_COMPILE_SCHEMAS, glib-compile-schemas) fi AC_SUBST(GLIB_COMPILE_SCHEMAS) if test "x$GLIB_COMPILE_SCHEMAS" = "x"; then ifelse([$2],,[AC_MSG_ERROR([glib-compile-schemas not found.])],[$2]) else ifelse([$1],,[:],[$1]) fi GSETTINGS_RULES=' .PHONY : uninstall-gsettings-schemas install-gsettings-schemas clean-gsettings-schemas mostlyclean-am: clean-gsettings-schemas gsettings__enum_file = $(addsuffix .enums.xml,$(gsettings_ENUM_NAMESPACE)) %.gschema.valid: %.gschema.xml $(gsettings__enum_file) $(AM_V_GEN) if test -f "$<"; then d=; else d="$(srcdir)/"; fi; $(GLIB_COMPILE_SCHEMAS) --strict --dry-run $(addprefix --schema-file=,$(gsettings__enum_file)) --schema-file=$${d}$< && touch [$]@ all-am: $(gsettings_SCHEMAS:.xml=.valid) uninstall-am: uninstall-gsettings-schemas install-data-am: install-gsettings-schemas .SECONDARY: $(gsettings_SCHEMAS) install-gsettings-schemas: $(gsettings_SCHEMAS) $(gsettings__enum_file) @$(NORMAL_INSTALL) if test -n "$^"; then \ test -z "$(gsettingsschemadir)" || $(MKDIR_P) "$(DESTDIR)$(gsettingsschemadir)"; \ $(INSTALL_DATA) $^ "$(DESTDIR)$(gsettingsschemadir)"; \ test -n "$(GSETTINGS_DISABLE_SCHEMAS_COMPILE)$(DESTDIR)" || $(GLIB_COMPILE_SCHEMAS) $(gsettingsschemadir); \ fi uninstall-gsettings-schemas: @$(NORMAL_UNINSTALL) @list='\''$(gsettings_SCHEMAS) $(gsettings__enum_file)'\''; test -n "$(gsettingsschemadir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e '\''s|^.*/||'\''`; \ test -n "$$files" || exit 0; \ echo " ( cd '\''$(DESTDIR)$(gsettingsschemadir)'\'' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(gsettingsschemadir)" && rm -f $$files test -n "$(GSETTINGS_DISABLE_SCHEMAS_COMPILE)$(DESTDIR)" || $(GLIB_COMPILE_SCHEMAS) $(gsettingsschemadir) clean-gsettings-schemas: rm -f $(gsettings_SCHEMAS:.xml=.valid) $(gsettings__enum_file) ifdef gsettings_ENUM_NAMESPACE $(gsettings__enum_file): $(gsettings_ENUM_FILES) $(AM_V_GEN) glib-mkenums --comments '\'''\'' --fhead "" --vhead " <@type@ id='\''$(gsettings_ENUM_NAMESPACE).@EnumName@'\''>" --vprod " " --vtail " " --ftail "" [$]^ > [$]@.tmp && mv [$]@.tmp [$]@ endif ' _GSETTINGS_SUBST(GSETTINGS_RULES) ]) dnl _GSETTINGS_SUBST(VARIABLE) dnl Abstract macro to do either _AM_SUBST_NOTMAKE or AC_SUBST AC_DEFUN([_GSETTINGS_SUBST], [ AC_SUBST([$1]) m4_ifdef([_AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE([$1])]) ] ) pkg-config-0.29.1/glib/m4macros/ltoptions.m40000644000175000017500000003426212650726031015520 00000000000000# Helper functions for option handling. -*- Autoconf -*- # # Copyright (C) 2004-2005, 2007-2009, 2011-2015 Free Software # Foundation, Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 8 ltoptions.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) # _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) # ------------------------------------------ m4_define([_LT_MANGLE_OPTION], [[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) # _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) # --------------------------------------- # Set option OPTION-NAME for macro MACRO-NAME, and if there is a # matching handler defined, dispatch to it. Other OPTION-NAMEs are # saved as a flag. m4_define([_LT_SET_OPTION], [m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), _LT_MANGLE_DEFUN([$1], [$2]), [m4_warning([Unknown $1 option '$2'])])[]dnl ]) # _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) # ------------------------------------------------------------ # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. m4_define([_LT_IF_OPTION], [m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) # _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) # ------------------------------------------------------- # Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME # are set. m4_define([_LT_UNLESS_OPTIONS], [m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), [m4_define([$0_found])])])[]dnl m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 ])[]dnl ]) # _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) # ---------------------------------------- # OPTION-LIST is a space-separated list of Libtool options associated # with MACRO-NAME. If any OPTION has a matching handler declared with # LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about # the unknown option and exit. m4_defun([_LT_SET_OPTIONS], [# Set options m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [_LT_SET_OPTION([$1], _LT_Option)]) m4_if([$1],[LT_INIT],[ dnl dnl Simply set some default values (i.e off) if boolean options were not dnl specified: _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no ]) _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no ]) dnl dnl If no reference was made to various pairs of opposing options, then dnl we run the default mode handler for the pair. For example, if neither dnl 'shared' nor 'disable-shared' was passed, we enable building of shared dnl archives by default: _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], [_LT_ENABLE_FAST_INSTALL]) _LT_UNLESS_OPTIONS([LT_INIT], [aix-soname=aix aix-soname=both aix-soname=svr4], [_LT_WITH_AIX_SONAME([aix])]) ]) ])# _LT_SET_OPTIONS ## --------------------------------- ## ## Macros to handle LT_INIT options. ## ## --------------------------------- ## # _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) # ----------------------------------------- m4_define([_LT_MANGLE_DEFUN], [[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) # LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) # ----------------------------------------------- m4_define([LT_OPTION_DEFINE], [m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl ])# LT_OPTION_DEFINE # dlopen # ------ LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes ]) AU_DEFUN([AC_LIBTOOL_DLOPEN], [_LT_SET_OPTION([LT_INIT], [dlopen]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the 'dlopen' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) # win32-dll # --------- # Declare package support for building win32 dll's. LT_OPTION_DEFINE([LT_INIT], [win32-dll], [enable_win32_dll=yes case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) AC_CHECK_TOOL(AS, as, false) AC_CHECK_TOOL(DLLTOOL, dlltool, false) AC_CHECK_TOOL(OBJDUMP, objdump, false) ;; esac test -z "$AS" && AS=as _LT_DECL([], [AS], [1], [Assembler program])dnl test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl ])# win32-dll AU_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_REQUIRE([AC_CANONICAL_HOST])dnl _LT_SET_OPTION([LT_INIT], [win32-dll]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the 'win32-dll' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) # _LT_ENABLE_SHARED([DEFAULT]) # ---------------------------- # implement the --enable-shared flag, and supports the 'shared' and # 'disable-shared' LT_INIT options. # DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. m4_define([_LT_ENABLE_SHARED], [m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([shared], [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS=$lt_save_ifs ;; esac], [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) _LT_DECL([build_libtool_libs], [enable_shared], [0], [Whether or not to build shared libraries]) ])# _LT_ENABLE_SHARED LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) # Old names: AC_DEFUN([AC_ENABLE_SHARED], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) ]) AC_DEFUN([AC_DISABLE_SHARED], [_LT_SET_OPTION([LT_INIT], [disable-shared]) ]) AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_SHARED], []) dnl AC_DEFUN([AM_DISABLE_SHARED], []) # _LT_ENABLE_STATIC([DEFAULT]) # ---------------------------- # implement the --enable-static flag, and support the 'static' and # 'disable-static' LT_INIT options. # DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. m4_define([_LT_ENABLE_STATIC], [m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([static], [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS=$lt_save_ifs ;; esac], [enable_static=]_LT_ENABLE_STATIC_DEFAULT) _LT_DECL([build_old_libs], [enable_static], [0], [Whether or not to build static libraries]) ])# _LT_ENABLE_STATIC LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) # Old names: AC_DEFUN([AC_ENABLE_STATIC], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) ]) AC_DEFUN([AC_DISABLE_STATIC], [_LT_SET_OPTION([LT_INIT], [disable-static]) ]) AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_STATIC], []) dnl AC_DEFUN([AM_DISABLE_STATIC], []) # _LT_ENABLE_FAST_INSTALL([DEFAULT]) # ---------------------------------- # implement the --enable-fast-install flag, and support the 'fast-install' # and 'disable-fast-install' LT_INIT options. # DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. m4_define([_LT_ENABLE_FAST_INSTALL], [m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([fast-install], [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS=$lt_save_ifs ;; esac], [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) _LT_DECL([fast_install], [enable_fast_install], [0], [Whether or not to optimize for fast installation])dnl ])# _LT_ENABLE_FAST_INSTALL LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) # Old names: AU_DEFUN([AC_ENABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the 'fast-install' option into LT_INIT's first parameter.]) ]) AU_DEFUN([AC_DISABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], [disable-fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the 'disable-fast-install' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) # _LT_WITH_AIX_SONAME([DEFAULT]) # ---------------------------------- # implement the --with-aix-soname flag, and support the `aix-soname=aix' # and `aix-soname=both' and `aix-soname=svr4' LT_INIT options. DEFAULT # is either `aix', `both' or `svr4'. If omitted, it defaults to `aix'. m4_define([_LT_WITH_AIX_SONAME], [m4_define([_LT_WITH_AIX_SONAME_DEFAULT], [m4_if($1, svr4, svr4, m4_if($1, both, both, aix))])dnl shared_archive_member_spec= case $host,$enable_shared in power*-*-aix[[5-9]]*,yes) AC_MSG_CHECKING([which variant of shared library versioning to provide]) AC_ARG_WITH([aix-soname], [AS_HELP_STRING([--with-aix-soname=aix|svr4|both], [shared library versioning (aka "SONAME") variant to provide on AIX, @<:@default=]_LT_WITH_AIX_SONAME_DEFAULT[@:>@.])], [case $withval in aix|svr4|both) ;; *) AC_MSG_ERROR([Unknown argument to --with-aix-soname]) ;; esac lt_cv_with_aix_soname=$with_aix_soname], [AC_CACHE_VAL([lt_cv_with_aix_soname], [lt_cv_with_aix_soname=]_LT_WITH_AIX_SONAME_DEFAULT) with_aix_soname=$lt_cv_with_aix_soname]) AC_MSG_RESULT([$with_aix_soname]) if test aix != "$with_aix_soname"; then # For the AIX way of multilib, we name the shared archive member # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o', # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File. # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag, # the AIX toolchain works better with OBJECT_MODE set (default 32). if test 64 = "${OBJECT_MODE-32}"; then shared_archive_member_spec=shr_64 else shared_archive_member_spec=shr fi fi ;; *) with_aix_soname=aix ;; esac _LT_DECL([], [shared_archive_member_spec], [0], [Shared archive member basename, for filename based shared library versioning on AIX])dnl ])# _LT_WITH_AIX_SONAME LT_OPTION_DEFINE([LT_INIT], [aix-soname=aix], [_LT_WITH_AIX_SONAME([aix])]) LT_OPTION_DEFINE([LT_INIT], [aix-soname=both], [_LT_WITH_AIX_SONAME([both])]) LT_OPTION_DEFINE([LT_INIT], [aix-soname=svr4], [_LT_WITH_AIX_SONAME([svr4])]) # _LT_WITH_PIC([MODE]) # -------------------- # implement the --with-pic flag, and support the 'pic-only' and 'no-pic' # LT_INIT options. # MODE is either 'yes' or 'no'. If omitted, it defaults to 'both'. m4_define([_LT_WITH_PIC], [AC_ARG_WITH([pic], [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@], [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], [lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for lt_pkg in $withval; do IFS=$lt_save_ifs if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS=$lt_save_ifs ;; esac], [pic_mode=m4_default([$1], [default])]) _LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl ])# _LT_WITH_PIC LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) # Old name: AU_DEFUN([AC_LIBTOOL_PICMODE], [_LT_SET_OPTION([LT_INIT], [pic-only]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the 'pic-only' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) ## ----------------- ## ## LTDL_INIT Options ## ## ----------------- ## m4_define([_LTDL_MODE], []) LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], [m4_define([_LTDL_MODE], [nonrecursive])]) LT_OPTION_DEFINE([LTDL_INIT], [recursive], [m4_define([_LTDL_MODE], [recursive])]) LT_OPTION_DEFINE([LTDL_INIT], [subproject], [m4_define([_LTDL_MODE], [subproject])]) m4_define([_LTDL_TYPE], []) LT_OPTION_DEFINE([LTDL_INIT], [installable], [m4_define([_LTDL_TYPE], [installable])]) LT_OPTION_DEFINE([LTDL_INIT], [convenience], [m4_define([_LTDL_TYPE], [convenience])]) pkg-config-0.29.1/glib/m4macros/libtool.m40000644000175000017500000112530612650726031015132 00000000000000# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- # # Copyright (C) 1996-2001, 2003-2015 Free Software Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. m4_define([_LT_COPYING], [dnl # Copyright (C) 2014 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. # GNU Libtool 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 of of the License, or # (at your option) any later version. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program or library that is built # using GNU Libtool, you may include this file under the same # distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that 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, see . ]) # serial 58 LT_INIT # LT_PREREQ(VERSION) # ------------------ # Complain and exit if this libtool version is less that VERSION. m4_defun([LT_PREREQ], [m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, [m4_default([$3], [m4_fatal([Libtool version $1 or higher is required], 63)])], [$2])]) # _LT_CHECK_BUILDDIR # ------------------ # Complain if the absolute build directory name contains unusual characters m4_defun([_LT_CHECK_BUILDDIR], [case `pwd` in *\ * | *\ *) AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; esac ]) # LT_INIT([OPTIONS]) # ------------------ AC_DEFUN([LT_INIT], [AC_PREREQ([2.62])dnl We use AC_PATH_PROGS_FEATURE_CHECK AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl AC_BEFORE([$0], [LT_LANG])dnl AC_BEFORE([$0], [LT_OUTPUT])dnl AC_BEFORE([$0], [LTDL_INIT])dnl m4_require([_LT_CHECK_BUILDDIR])dnl dnl Autoconf doesn't catch unexpanded LT_ macros by default: m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 dnl unless we require an AC_DEFUNed macro: AC_REQUIRE([LTOPTIONS_VERSION])dnl AC_REQUIRE([LTSUGAR_VERSION])dnl AC_REQUIRE([LTVERSION_VERSION])dnl AC_REQUIRE([LTOBSOLETE_VERSION])dnl m4_require([_LT_PROG_LTMAIN])dnl _LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) dnl Parse OPTIONS _LT_SET_OPTIONS([$0], [$1]) # This can be used to rebuild libtool when needed LIBTOOL_DEPS=$ltmain # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' AC_SUBST(LIBTOOL)dnl _LT_SETUP # Only expand once: m4_define([LT_INIT]) ])# LT_INIT # Old names: AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PROG_LIBTOOL], []) dnl AC_DEFUN([AM_PROG_LIBTOOL], []) # _LT_PREPARE_CC_BASENAME # ----------------------- m4_defun([_LT_PREPARE_CC_BASENAME], [ # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. func_cc_basename () { for cc_temp in @S|@*""; do case $cc_temp in compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; \-*) ;; *) break;; esac done func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` } ])# _LT_PREPARE_CC_BASENAME # _LT_CC_BASENAME(CC) # ------------------- # It would be clearer to call AC_REQUIREs from _LT_PREPARE_CC_BASENAME, # but that macro is also expanded into generated libtool script, which # arranges for $SED and $ECHO to be set by different means. m4_defun([_LT_CC_BASENAME], [m4_require([_LT_PREPARE_CC_BASENAME])dnl AC_REQUIRE([_LT_DECL_SED])dnl AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl func_cc_basename $1 cc_basename=$func_cc_basename_result ]) # _LT_FILEUTILS_DEFAULTS # ---------------------- # It is okay to use these file commands and assume they have been set # sensibly after 'm4_require([_LT_FILEUTILS_DEFAULTS])'. m4_defun([_LT_FILEUTILS_DEFAULTS], [: ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} ])# _LT_FILEUTILS_DEFAULTS # _LT_SETUP # --------- m4_defun([_LT_SETUP], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl _LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl dnl _LT_DECL([], [host_alias], [0], [The host system])dnl _LT_DECL([], [host], [0])dnl _LT_DECL([], [host_os], [0])dnl dnl _LT_DECL([], [build_alias], [0], [The build system])dnl _LT_DECL([], [build], [0])dnl _LT_DECL([], [build_os], [0])dnl dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl dnl AC_REQUIRE([AC_PROG_LN_S])dnl test -z "$LN_S" && LN_S="ln -s" _LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl dnl AC_REQUIRE([LT_CMD_MAX_LEN])dnl _LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl _LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl m4_require([_LT_CMD_RELOAD])dnl m4_require([_LT_CHECK_MAGIC_METHOD])dnl m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl m4_require([_LT_CMD_OLD_ARCHIVE])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_WITH_SYSROOT])dnl m4_require([_LT_CMD_TRUNCATE])dnl _LT_CONFIG_LIBTOOL_INIT([ # See if we are running on zsh, and set the options that allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi ]) if test -n "${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi _LT_CHECK_OBJDIR m4_require([_LT_TAG_COMPILER])dnl case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test set != "${COLLECT_NAMES+set}"; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a '.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld=$lt_cv_prog_gnu_ld old_CC=$CC old_CFLAGS=$CFLAGS # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o _LT_CC_BASENAME([$compiler]) # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then _LT_PATH_MAGIC fi ;; esac # Use C for the default configuration in the libtool script LT_SUPPORTED_TAG([CC]) _LT_LANG_C_CONFIG _LT_LANG_DEFAULT_CONFIG _LT_CONFIG_COMMANDS ])# _LT_SETUP # _LT_PREPARE_SED_QUOTE_VARS # -------------------------- # Define a few sed substitution that help us do robust quoting. m4_defun([_LT_PREPARE_SED_QUOTE_VARS], [# Backslashify metacharacters that are still active within # double-quoted strings. sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\([["`\\]]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ]) # _LT_PROG_LTMAIN # --------------- # Note that this code is called both from 'configure', and 'config.status' # now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, # 'config.status' has no value for ac_aux_dir unless we are using Automake, # so we pass a copy along to make sure it has a sensible value anyway. m4_defun([_LT_PROG_LTMAIN], [m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl _LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) ltmain=$ac_aux_dir/ltmain.sh ])# _LT_PROG_LTMAIN ## ------------------------------------- ## ## Accumulate code for creating libtool. ## ## ------------------------------------- ## # So that we can recreate a full libtool script including additional # tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS # in macros and then make a single call at the end using the 'libtool' # label. # _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) # ---------------------------------------- # Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL_INIT], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_INIT], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_INIT]) # _LT_CONFIG_LIBTOOL([COMMANDS]) # ------------------------------ # Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) # _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) # ----------------------------------------------------- m4_defun([_LT_CONFIG_SAVE_COMMANDS], [_LT_CONFIG_LIBTOOL([$1]) _LT_CONFIG_LIBTOOL_INIT([$2]) ]) # _LT_FORMAT_COMMENT([COMMENT]) # ----------------------------- # Add leading comment marks to the start of each line, and a trailing # full-stop to the whole comment if one is not present already. m4_define([_LT_FORMAT_COMMENT], [m4_ifval([$1], [ m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) )]) ## ------------------------ ## ## FIXME: Eliminate VARNAME ## ## ------------------------ ## # _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) # ------------------------------------------------------------------- # CONFIGNAME is the name given to the value in the libtool script. # VARNAME is the (base) name used in the configure script. # VALUE may be 0, 1 or 2 for a computed quote escaped value based on # VARNAME. Any other value will be used directly. m4_define([_LT_DECL], [lt_if_append_uniq([lt_decl_varnames], [$2], [, ], [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], [m4_ifval([$1], [$1], [$2])]) lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) m4_ifval([$4], [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) lt_dict_add_subkey([lt_decl_dict], [$2], [tagged?], [m4_ifval([$5], [yes], [no])])]) ]) # _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) # -------------------------------------------------------- m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) # lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_tag_varnames], [_lt_decl_filter([tagged?], [yes], $@)]) # _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) # --------------------------------------------------------- m4_define([_lt_decl_filter], [m4_case([$#], [0], [m4_fatal([$0: too few arguments: $#])], [1], [m4_fatal([$0: too few arguments: $#: $1])], [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], [lt_dict_filter([lt_decl_dict], $@)])[]dnl ]) # lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) # -------------------------------------------------- m4_define([lt_decl_quote_varnames], [_lt_decl_filter([value], [1], $@)]) # lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_dquote_varnames], [_lt_decl_filter([value], [2], $@)]) # lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_varnames_tagged], [m4_assert([$# <= 2])dnl _$0(m4_quote(m4_default([$1], [[, ]])), m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) m4_define([_lt_decl_varnames_tagged], [m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) # lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_all_varnames], [_$0(m4_quote(m4_default([$1], [[, ]])), m4_if([$2], [], m4_quote(lt_decl_varnames), m4_quote(m4_shift($@))))[]dnl ]) m4_define([_lt_decl_all_varnames], [lt_join($@, lt_decl_varnames_tagged([$1], lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl ]) # _LT_CONFIG_STATUS_DECLARE([VARNAME]) # ------------------------------------ # Quote a variable value, and forward it to 'config.status' so that its # declaration there will have the same value as in 'configure'. VARNAME # must have a single quote delimited value for this to work. m4_define([_LT_CONFIG_STATUS_DECLARE], [$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`']) # _LT_CONFIG_STATUS_DECLARATIONS # ------------------------------ # We delimit libtool config variables with single quotes, so when # we write them to config.status, we have to be sure to quote all # embedded single quotes properly. In configure, this macro expands # each variable declared with _LT_DECL (and _LT_TAGDECL) into: # # ='`$ECHO "$" | $SED "$delay_single_quote_subst"`' m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], [m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAGS # ---------------- # Output comment and list of tags supported by the script m4_defun([_LT_LIBTOOL_TAGS], [_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl available_tags='_LT_TAGS'dnl ]) # _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) # ----------------------------------- # Extract the dictionary values for VARNAME (optionally with TAG) and # expand to a commented shell variable setting: # # # Some comment about what VAR is for. # visible_name=$lt_internal_name m4_define([_LT_LIBTOOL_DECLARE], [_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [description])))[]dnl m4_pushdef([_libtool_name], m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), [0], [_libtool_name=[$]$1], [1], [_libtool_name=$lt_[]$1], [2], [_libtool_name=$lt_[]$1], [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl ]) # _LT_LIBTOOL_CONFIG_VARS # ----------------------- # Produce commented declarations of non-tagged libtool config variables # suitable for insertion in the LIBTOOL CONFIG section of the 'libtool' # script. Tagged libtool config variables (even for the LIBTOOL CONFIG # section) are produced by _LT_LIBTOOL_TAG_VARS. m4_defun([_LT_LIBTOOL_CONFIG_VARS], [m4_foreach([_lt_var], m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAG_VARS(TAG) # ------------------------- m4_define([_LT_LIBTOOL_TAG_VARS], [m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) # _LT_TAGVAR(VARNAME, [TAGNAME]) # ------------------------------ m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) # _LT_CONFIG_COMMANDS # ------------------- # Send accumulated output to $CONFIG_STATUS. Thanks to the lists of # variables for single and double quote escaping we saved from calls # to _LT_DECL, we can put quote escaped variables declarations # into 'config.status', and then the shell code to quote escape them in # for loops in 'config.status'. Finally, any additional code accumulated # from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. m4_defun([_LT_CONFIG_COMMANDS], [AC_PROVIDE_IFELSE([LT_OUTPUT], dnl If the libtool generation code has been placed in $CONFIG_LT, dnl instead of duplicating it all over again into config.status, dnl then we will have config.status run $CONFIG_LT later, so it dnl needs to know what name is stored there: [AC_CONFIG_COMMANDS([libtool], [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], dnl If the libtool generation code is destined for config.status, dnl expand the accumulated commands and init code now: [AC_CONFIG_COMMANDS([libtool], [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) ])#_LT_CONFIG_COMMANDS # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], [ # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' _LT_CONFIG_STATUS_DECLARATIONS LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$[]1 _LTECHO_EOF' } # Quote evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_quote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_dquote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done _LT_OUTPUT_LIBTOOL_INIT ]) # _LT_GENERATED_FILE_INIT(FILE, [COMMENT]) # ------------------------------------ # Generate a child script FILE with all initialization necessary to # reuse the environment learned by the parent script, and make the # file executable. If COMMENT is supplied, it is inserted after the # '#!' sequence but before initialization text begins. After this # macro, additional text can be appended to FILE to form the body of # the child script. The macro ends with non-zero status if the # file could not be fully written (such as if the disk is full). m4_ifdef([AS_INIT_GENERATED], [m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])], [m4_defun([_LT_GENERATED_FILE_INIT], [m4_require([AS_PREPARE])]dnl [m4_pushdef([AS_MESSAGE_LOG_FD])]dnl [lt_write_fail=0 cat >$1 <<_ASEOF || lt_write_fail=1 #! $SHELL # Generated by $as_me. $2 SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$1 <<\_ASEOF || lt_write_fail=1 AS_SHELL_SANITIZE _AS_PREPARE exec AS_MESSAGE_FD>&1 _ASEOF test 0 = "$lt_write_fail" && chmod +x $1[]dnl m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT # LT_OUTPUT # --------- # This macro allows early generation of the libtool script (before # AC_OUTPUT is called), incase it is used in configure for compilation # tests. AC_DEFUN([LT_OUTPUT], [: ${CONFIG_LT=./config.lt} AC_MSG_NOTICE([creating $CONFIG_LT]) _LT_GENERATED_FILE_INIT(["$CONFIG_LT"], [# Run this file to recreate a libtool stub with the current configuration.]) cat >>"$CONFIG_LT" <<\_LTEOF lt_cl_silent=false exec AS_MESSAGE_LOG_FD>>config.log { echo AS_BOX([Running $as_me.]) } >&AS_MESSAGE_LOG_FD lt_cl_help="\ '$as_me' creates a local libtool stub from the current configuration, for use in further configure time tests before the real libtool is generated. Usage: $[0] [[OPTIONS]] -h, --help print this help, then exit -V, --version print version number, then exit -q, --quiet do not print progress messages -d, --debug don't remove temporary files Report bugs to ." lt_cl_version="\ m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) configured by $[0], generated by m4_PACKAGE_STRING. Copyright (C) 2011 Free Software Foundation, Inc. This config.lt script is free software; the Free Software Foundation gives unlimited permision to copy, distribute and modify it." while test 0 != $[#] do case $[1] in --version | --v* | -V ) echo "$lt_cl_version"; exit 0 ;; --help | --h* | -h ) echo "$lt_cl_help"; exit 0 ;; --debug | --d* | -d ) debug=: ;; --quiet | --q* | --silent | --s* | -q ) lt_cl_silent=: ;; -*) AC_MSG_ERROR([unrecognized option: $[1] Try '$[0] --help' for more information.]) ;; *) AC_MSG_ERROR([unrecognized argument: $[1] Try '$[0] --help' for more information.]) ;; esac shift done if $lt_cl_silent; then exec AS_MESSAGE_FD>/dev/null fi _LTEOF cat >>"$CONFIG_LT" <<_LTEOF _LT_OUTPUT_LIBTOOL_COMMANDS_INIT _LTEOF cat >>"$CONFIG_LT" <<\_LTEOF AC_MSG_NOTICE([creating $ofile]) _LT_OUTPUT_LIBTOOL_COMMANDS AS_EXIT(0) _LTEOF chmod +x "$CONFIG_LT" # configure is writing to config.log, but config.lt does its own redirection, # appending to config.log, which fails on DOS, as config.log is still kept # open by configure. Here we exec the FD to /dev/null, effectively closing # config.log, so it can be properly (re)opened and appended to by config.lt. lt_cl_success=: test yes = "$silent" && lt_config_lt_args="$lt_config_lt_args --quiet" exec AS_MESSAGE_LOG_FD>/dev/null $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false exec AS_MESSAGE_LOG_FD>>config.log $lt_cl_success || AS_EXIT(1) ])# LT_OUTPUT # _LT_CONFIG(TAG) # --------------- # If TAG is the built-in tag, create an initial libtool script with a # default configuration from the untagged config vars. Otherwise add code # to config.status for appending the configuration named by TAG from the # matching tagged config vars. m4_defun([_LT_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_CONFIG_SAVE_COMMANDS([ m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl m4_if(_LT_TAG, [C], [ # See if we are running on zsh, and set the options that allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi cfgfile=${ofile}T trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # Generated automatically by $as_me ($PACKAGE) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # Provide generalized library-building support services. # Written by Gordon Matzigkeit, 1996 _LT_COPYING _LT_LIBTOOL_TAGS # Configured defaults for sys_lib_dlsearch_path munging. : \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"} # ### BEGIN LIBTOOL CONFIG _LT_LIBTOOL_CONFIG_VARS _LT_LIBTOOL_TAG_VARS # ### END LIBTOOL CONFIG _LT_EOF cat <<'_LT_EOF' >> "$cfgfile" # ### BEGIN FUNCTIONS SHARED WITH CONFIGURE _LT_PREPARE_MUNGE_PATH_LIST _LT_PREPARE_CC_BASENAME # ### END FUNCTIONS SHARED WITH CONFIGURE _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test set != "${COLLECT_NAMES+set}"; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac _LT_PROG_LTMAIN # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" ], [cat <<_LT_EOF >> "$ofile" dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded dnl in a comment (ie after a #). # ### BEGIN LIBTOOL TAG CONFIG: $1 _LT_LIBTOOL_TAG_VARS(_LT_TAG) # ### END LIBTOOL TAG CONFIG: $1 _LT_EOF ])dnl /m4_if ], [m4_if([$1], [], [ PACKAGE='$PACKAGE' VERSION='$VERSION' RM='$RM' ofile='$ofile'], []) ])dnl /_LT_CONFIG_SAVE_COMMANDS ])# _LT_CONFIG # LT_SUPPORTED_TAG(TAG) # --------------------- # Trace this macro to discover what tags are supported by the libtool # --tag option, using: # autoconf --trace 'LT_SUPPORTED_TAG:$1' AC_DEFUN([LT_SUPPORTED_TAG], []) # C support is built-in for now m4_define([_LT_LANG_C_enabled], []) m4_define([_LT_TAGS], []) # LT_LANG(LANG) # ------------- # Enable libtool support for the given language if not already enabled. AC_DEFUN([LT_LANG], [AC_BEFORE([$0], [LT_OUTPUT])dnl m4_case([$1], [C], [_LT_LANG(C)], [C++], [_LT_LANG(CXX)], [Go], [_LT_LANG(GO)], [Java], [_LT_LANG(GCJ)], [Fortran 77], [_LT_LANG(F77)], [Fortran], [_LT_LANG(FC)], [Windows Resource], [_LT_LANG(RC)], [m4_ifdef([_LT_LANG_]$1[_CONFIG], [_LT_LANG($1)], [m4_fatal([$0: unsupported language: "$1"])])])dnl ])# LT_LANG # _LT_LANG(LANGNAME) # ------------------ m4_defun([_LT_LANG], [m4_ifdef([_LT_LANG_]$1[_enabled], [], [LT_SUPPORTED_TAG([$1])dnl m4_append([_LT_TAGS], [$1 ])dnl m4_define([_LT_LANG_]$1[_enabled], [])dnl _LT_LANG_$1_CONFIG($1)])dnl ])# _LT_LANG m4_ifndef([AC_PROG_GO], [ ############################################################ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_GO. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # ############################################################ m4_defun([AC_PROG_GO], [AC_LANG_PUSH(Go)dnl AC_ARG_VAR([GOC], [Go compiler command])dnl AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl _AC_ARG_VAR_LDFLAGS()dnl AC_CHECK_TOOL(GOC, gccgo) if test -z "$GOC"; then if test -n "$ac_tool_prefix"; then AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo]) fi fi if test -z "$GOC"; then AC_CHECK_PROG(GOC, gccgo, gccgo, false) fi ])#m4_defun ])#m4_ifndef # _LT_LANG_DEFAULT_CONFIG # ----------------------- m4_defun([_LT_LANG_DEFAULT_CONFIG], [AC_PROVIDE_IFELSE([AC_PROG_CXX], [LT_LANG(CXX)], [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) AC_PROVIDE_IFELSE([AC_PROG_F77], [LT_LANG(F77)], [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) AC_PROVIDE_IFELSE([AC_PROG_FC], [LT_LANG(FC)], [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal dnl pulling things in needlessly. AC_PROVIDE_IFELSE([AC_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([LT_PROG_GCJ], [LT_LANG(GCJ)], [m4_ifdef([AC_PROG_GCJ], [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([A][M_PROG_GCJ], [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([LT_PROG_GCJ], [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) AC_PROVIDE_IFELSE([AC_PROG_GO], [LT_LANG(GO)], [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])]) AC_PROVIDE_IFELSE([LT_PROG_RC], [LT_LANG(RC)], [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) ])# _LT_LANG_DEFAULT_CONFIG # Obsolete macros: AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_CXX], []) dnl AC_DEFUN([AC_LIBTOOL_F77], []) dnl AC_DEFUN([AC_LIBTOOL_FC], []) dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) dnl AC_DEFUN([AC_LIBTOOL_RC], []) # _LT_TAG_COMPILER # ---------------- m4_defun([_LT_TAG_COMPILER], [AC_REQUIRE([AC_PROG_CC])dnl _LT_DECL([LTCC], [CC], [1], [A C compiler])dnl _LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl _LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl _LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC ])# _LT_TAG_COMPILER # _LT_COMPILER_BOILERPLATE # ------------------------ # Check for compiler boilerplate output or warnings with # the simple compiler test code. m4_defun([_LT_COMPILER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ])# _LT_COMPILER_BOILERPLATE # _LT_LINKER_BOILERPLATE # ---------------------- # Check for linker boilerplate output or warnings with # the simple link test code. m4_defun([_LT_LINKER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ])# _LT_LINKER_BOILERPLATE # _LT_REQUIRED_DARWIN_CHECKS # ------------------------- m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ case $host_os in rhapsody* | darwin*) AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) AC_CHECK_TOOL([LIPO], [lipo], [:]) AC_CHECK_TOOL([OTOOL], [otool], [:]) AC_CHECK_TOOL([OTOOL64], [otool64], [:]) _LT_DECL([], [DSYMUTIL], [1], [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) _LT_DECL([], [NMEDIT], [1], [Tool to change global to local symbols on Mac OS X]) _LT_DECL([], [LIPO], [1], [Tool to manipulate fat objects and archives on Mac OS X]) _LT_DECL([], [OTOOL], [1], [ldd/readelf like tool for Mach-O binaries on Mac OS X]) _LT_DECL([], [OTOOL64], [1], [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], [lt_cv_apple_cc_single_mod=no if test -z "$LT_MULTI_MODULE"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? # If there is a non-empty error log, and "single_module" # appears in it, assume the flag caused a linker warning if test -s conftest.err && $GREP single_module conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. elif test -f libconftest.dylib && test 0 = "$_lt_result"; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -rf libconftest.dylib* rm -f conftest.* fi]) AC_CACHE_CHECK([for -exported_symbols_list linker flag], [lt_cv_ld_exported_symbols_list], [lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [lt_cv_ld_exported_symbols_list=yes], [lt_cv_ld_exported_symbols_list=no]) LDFLAGS=$save_LDFLAGS ]) AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], [lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then lt_cv_ld_force_load=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM ]) case $host_os in rhapsody* | darwin1.[[012]]) _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; 10.[[012]][[,.]]*) _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test yes = "$lt_cv_apple_cc_single_mod"; then _lt_dar_single_mod='$single_module' fi if test yes = "$lt_cv_ld_exported_symbols_list"; then _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib' fi if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac ]) # _LT_DARWIN_LINKER_FEATURES([TAG]) # --------------------------------- # Checks for linker and compiler features on darwin m4_defun([_LT_DARWIN_LINKER_FEATURES], [ m4_require([_LT_REQUIRED_DARWIN_CHECKS]) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported if test yes = "$lt_cv_ld_force_load"; then _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes], [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes]) else _LT_TAGVAR(whole_archive_flag_spec, $1)='' fi _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=$_lt_dar_allow_undefined case $cc_basename in ifort*|nagfor*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test yes = "$_lt_dar_can_shared"; then output_verbose_link_cmd=func_echo_all _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" m4_if([$1], [CXX], [ if test yes != "$lt_cv_apple_cc_single_mod"; then _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil" _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil" fi ],[]) else _LT_TAGVAR(ld_shlibs, $1)=no fi ]) # _LT_SYS_MODULE_PATH_AIX([TAGNAME]) # ---------------------------------- # Links a minimal program and checks the executable # for the system default hardcoded library path. In most cases, # this is /usr/lib:/lib, but when the MPI compilers are used # the location of the communication and MPI libs are included too. # If we don't find anything, use the default library path according # to the aix ld manual. # Store the results from the different compilers for each TAGNAME. # Allow to override them for all tags through lt_cv_aix_libpath. m4_defun([_LT_SYS_MODULE_PATH_AIX], [m4_require([_LT_DECL_SED])dnl if test set = "${lt_cv_aix_libpath+set}"; then aix_libpath=$lt_cv_aix_libpath else AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], [AC_LINK_IFELSE([AC_LANG_PROGRAM],[ lt_aix_libpath_sed='[ /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }]' _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi],[]) if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=/usr/lib:/lib fi ]) aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) fi ])# _LT_SYS_MODULE_PATH_AIX # _LT_SHELL_INIT(ARG) # ------------------- m4_define([_LT_SHELL_INIT], [m4_divert_text([M4SH-INIT], [$1 ])])# _LT_SHELL_INIT # _LT_PROG_ECHO_BACKSLASH # ----------------------- # Find how we can fake an echo command that does not interpret backslash. # In particular, with Autoconf 2.60 or later we add some code to the start # of the generated configure script that will find a shell with a builtin # printf (that we can use as an echo command). m4_defun([_LT_PROG_ECHO_BACKSLASH], [ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO AC_MSG_CHECKING([how to print strings]) # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $[]1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } case $ECHO in printf*) AC_MSG_RESULT([printf]) ;; print*) AC_MSG_RESULT([print -r]) ;; *) AC_MSG_RESULT([cat]) ;; esac m4_ifdef([_AS_DETECT_SUGGESTED], [_AS_DETECT_SUGGESTED([ test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test "X`printf %s $ECHO`" = "X$ECHO" \ || test "X`print -r -- $ECHO`" = "X$ECHO" )])]) _LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) _LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) ])# _LT_PROG_ECHO_BACKSLASH # _LT_WITH_SYSROOT # ---------------- AC_DEFUN([_LT_WITH_SYSROOT], [AC_MSG_CHECKING([for sysroot]) AC_ARG_WITH([sysroot], [AS_HELP_STRING([--with-sysroot@<:@=DIR@:>@], [Search for dependent libraries within DIR (or the compiler's sysroot if not specified).])], [], [with_sysroot=no]) dnl lt_sysroot will always be passed unquoted. We quote it here dnl in case the user passed a directory name. lt_sysroot= case $with_sysroot in #( yes) if test yes = "$GCC"; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) AC_MSG_RESULT([$with_sysroot]) AC_MSG_ERROR([The sysroot must be an absolute path.]) ;; esac AC_MSG_RESULT([${lt_sysroot:-no}]) _LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl [dependent libraries, and where our libraries should be installed.])]) # _LT_ENABLE_LOCK # --------------- m4_defun([_LT_ENABLE_LOCK], [AC_ARG_ENABLE([libtool-lock], [AS_HELP_STRING([--disable-libtool-lock], [avoid locking (might break parallel builds)])]) test no = "$enable_libtool_lock" || enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out what ABI is being produced by ac_compile, and set mode # options accordingly. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE=32 ;; *ELF-64*) HPUX_IA64_MODE=64 ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then if test yes = "$lt_cv_prog_gnu_ld"; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; mips64*-*linux*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then emul=elf case `/usr/bin/file conftest.$ac_objext` in *32-bit*) emul="${emul}32" ;; *64-bit*) emul="${emul}64" ;; esac case `/usr/bin/file conftest.$ac_objext` in *MSB*) emul="${emul}btsmip" ;; *LSB*) emul="${emul}ltsmip" ;; esac case `/usr/bin/file conftest.$ac_objext` in *N32*) emul="${emul}n32" ;; esac LD="${LD-ld} -m $emul" fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. Note that the listed cases only cover the # situations where additional linker options are needed (such as when # doing 32-bit compilation for a host where ld defaults to 64-bit, or # vice versa); the common cases where no linker options are needed do # not appear in the list. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) case `/usr/bin/file conftest.o` in *x86-64*) LD="${LD-ld} -m elf32_x86_64" ;; *) LD="${LD-ld} -m elf_i386" ;; esac ;; powerpc64le-*linux*) LD="${LD-ld} -m elf32lppclinux" ;; powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; powerpcle-*linux*) LD="${LD-ld} -m elf64lppc" ;; powerpc-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS=$CFLAGS CFLAGS="$CFLAGS -belf" AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, [AC_LANG_PUSH(C) AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) AC_LANG_POP]) if test yes != "$lt_cv_cc_needs_belf"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS=$SAVE_CFLAGS fi ;; *-*solaris*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) case $host in i?86-*-solaris*|x86_64-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) LD="${LD-ld} -m elf64_sparc" ;; esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then LD=${LD-ld}_sol2 fi ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks=$enable_libtool_lock ])# _LT_ENABLE_LOCK # _LT_PROG_AR # ----------- m4_defun([_LT_PROG_AR], [AC_CHECK_TOOLS(AR, [ar], false) : ${AR=ar} : ${AR_FLAGS=cru} _LT_DECL([], [AR], [1], [The archiver]) _LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive]) AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], [lt_cv_ar_at_file=no AC_COMPILE_IFELSE([AC_LANG_PROGRAM], [echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' AC_TRY_EVAL([lt_ar_try]) if test 0 -eq "$ac_status"; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a AC_TRY_EVAL([lt_ar_try]) if test 0 -ne "$ac_status"; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a ]) ]) if test no = "$lt_cv_ar_at_file"; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi _LT_DECL([], [archiver_list_spec], [1], [How to feed a file listing to the archiver]) ])# _LT_PROG_AR # _LT_CMD_OLD_ARCHIVE # ------------------- m4_defun([_LT_CMD_OLD_ARCHIVE], [_LT_PROG_AR AC_CHECK_TOOL(STRIP, strip, :) test -z "$STRIP" && STRIP=: _LT_DECL([], [STRIP], [1], [A symbol stripping program]) AC_CHECK_TOOL(RANLIB, ranlib, :) test -z "$RANLIB" && RANLIB=: _LT_DECL([], [RANLIB], [1], [Commands used to install an old-style archive]) # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in bitrig* | openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac _LT_DECL([], [old_postinstall_cmds], [2]) _LT_DECL([], [old_postuninstall_cmds], [2]) _LT_TAGDECL([], [old_archive_cmds], [2], [Commands used to build an old-style archive]) _LT_DECL([], [lock_old_archive_extraction], [0], [Whether to use a lock for old archive extraction]) ])# _LT_CMD_OLD_ARCHIVE # _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------------------- # Check whether the given compiler option works AC_DEFUN([_LT_COMPILER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$3" ## exclude from sc_useless_quotes_in_assignment # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi fi $RM conftest* ]) if test yes = "[$]$2"; then m4_if([$5], , :, [$5]) else m4_if([$6], , :, [$6]) fi ])# _LT_COMPILER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) # _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------- # Check whether the given linker option works AC_DEFUN([_LT_LINKER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS $3" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&AS_MESSAGE_LOG_FD $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi else $2=yes fi fi $RM -r conftest* LDFLAGS=$save_LDFLAGS ]) if test yes = "[$]$2"; then m4_if([$4], , :, [$4]) else m4_if([$5], , :, [$5]) fi ])# _LT_LINKER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) # LT_CMD_MAX_LEN #--------------- AC_DEFUN([LT_CMD_MAX_LEN], [AC_REQUIRE([AC_CANONICAL_HOST])dnl # find the maximum length of command line arguments AC_MSG_CHECKING([the maximum length of command line arguments]) AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl i=0 teststring=ABCD case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; os2*) # The test takes a long time on OS/2. lt_cv_sys_max_cmd_len=8192 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len" && \ test undefined != "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test X`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test 17 != "$i" # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac ]) if test -n "$lt_cv_sys_max_cmd_len"; then AC_MSG_RESULT($lt_cv_sys_max_cmd_len) else AC_MSG_RESULT(none) fi max_cmd_len=$lt_cv_sys_max_cmd_len _LT_DECL([], [max_cmd_len], [0], [What is the maximum length of a command?]) ])# LT_CMD_MAX_LEN # Old name: AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) # _LT_HEADER_DLFCN # ---------------- m4_defun([_LT_HEADER_DLFCN], [AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl ])# _LT_HEADER_DLFCN # _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, # ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) # ---------------------------------------------------------------- m4_defun([_LT_TRY_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test yes = "$cross_compiling"; then : [$4] else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF [#line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisibility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; }] _LT_EOF if AC_TRY_EVAL(ac_link) && test -s "conftest$ac_exeext" 2>/dev/null; then (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) $1 ;; x$lt_dlneed_uscore) $2 ;; x$lt_dlunknown|x*) $3 ;; esac else : # compilation failed $3 fi fi rm -fr conftest* ])# _LT_TRY_DLOPEN_SELF # LT_SYS_DLOPEN_SELF # ------------------ AC_DEFUN([LT_SYS_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test yes != "$enable_dlopen"; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen=load_add_on lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen=LoadLibrary lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen=dlopen lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl],[ lt_cv_dlopen=dyld lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ]) ;; tpf*) # Don't try to run any link tests for TPF. We know it's impossible # because TPF is a cross-compiler, and we know how we open DSOs. lt_cv_dlopen=dlopen lt_cv_dlopen_libs= lt_cv_dlopen_self=no ;; *) AC_CHECK_FUNC([shl_load], [lt_cv_dlopen=shl_load], [AC_CHECK_LIB([dld], [shl_load], [lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld], [AC_CHECK_FUNC([dlopen], [lt_cv_dlopen=dlopen], [AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl], [AC_CHECK_LIB([svld], [dlopen], [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld], [AC_CHECK_LIB([dld], [dld_link], [lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld]) ]) ]) ]) ]) ]) ;; esac if test no = "$lt_cv_dlopen"; then enable_dlopen=no else enable_dlopen=yes fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS=$CPPFLAGS test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS=$LDFLAGS wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS=$LIBS LIBS="$lt_cv_dlopen_libs $LIBS" AC_CACHE_CHECK([whether a program can dlopen itself], lt_cv_dlopen_self, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) ]) if test yes = "$lt_cv_dlopen_self"; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" AC_CACHE_CHECK([whether a statically linked program can dlopen itself], lt_cv_dlopen_self_static, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) ]) fi CPPFLAGS=$save_CPPFLAGS LDFLAGS=$save_LDFLAGS LIBS=$save_LIBS ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi _LT_DECL([dlopen_support], [enable_dlopen], [0], [Whether dlopen is supported]) _LT_DECL([dlopen_self], [enable_dlopen_self], [0], [Whether dlopen of programs is supported]) _LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], [Whether dlopen of statically linked programs is supported]) ])# LT_SYS_DLOPEN_SELF # Old name: AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) # _LT_COMPILER_C_O([TAGNAME]) # --------------------------- # Check to see if options -c and -o are simultaneously supported by compiler. # This macro does not hard code the compiler like AC_PROG_CC_C_O. m4_defun([_LT_COMPILER_C_O], [m4_require([_LT_DECL_SED])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes fi fi chmod u+w . 2>&AS_MESSAGE_LOG_FD $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* ]) _LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], [Does compiler simultaneously support -c and -o options?]) ])# _LT_COMPILER_C_O # _LT_COMPILER_FILE_LOCKS([TAGNAME]) # ---------------------------------- # Check to see if we can do hard links to lock some files if needed m4_defun([_LT_COMPILER_FILE_LOCKS], [m4_require([_LT_ENABLE_LOCK])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_COMPILER_C_O([$1]) hard_links=nottested if test no = "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" && test no != "$need_locks"; then # do not overwrite the value of need_locks provided by the user AC_MSG_CHECKING([if we can lock with hard links]) hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no AC_MSG_RESULT([$hard_links]) if test no = "$hard_links"; then AC_MSG_WARN(['$CC' does not support '-c -o', so 'make -j' may be unsafe]) need_locks=warn fi else need_locks=no fi _LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) ])# _LT_COMPILER_FILE_LOCKS # _LT_CHECK_OBJDIR # ---------------- m4_defun([_LT_CHECK_OBJDIR], [AC_CACHE_CHECK([for objdir], [lt_cv_objdir], [rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null]) objdir=$lt_cv_objdir _LT_DECL([], [objdir], [0], [The name of the directory that contains temporary libtool files])dnl m4_pattern_allow([LT_OBJDIR])dnl AC_DEFINE_UNQUOTED([LT_OBJDIR], "$lt_cv_objdir/", [Define to the sub-directory where libtool stores uninstalled libraries.]) ])# _LT_CHECK_OBJDIR # _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) # -------------------------------------- # Check hardcoding attributes. m4_defun([_LT_LINKER_HARDCODE_LIBPATH], [AC_MSG_CHECKING([how to hardcode library paths into programs]) _LT_TAGVAR(hardcode_action, $1)= if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || test -n "$_LT_TAGVAR(runpath_var, $1)" || test yes = "$_LT_TAGVAR(hardcode_automatic, $1)"; then # We can hardcode non-existent directories. if test no != "$_LT_TAGVAR(hardcode_direct, $1)" && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" && test no != "$_LT_TAGVAR(hardcode_minus_L, $1)"; then # Linking always hardcodes the temporary library directory. _LT_TAGVAR(hardcode_action, $1)=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. _LT_TAGVAR(hardcode_action, $1)=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. _LT_TAGVAR(hardcode_action, $1)=unsupported fi AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) if test relink = "$_LT_TAGVAR(hardcode_action, $1)" || test yes = "$_LT_TAGVAR(inherit_rpath, $1)"; then # Fast installation is not supported enable_fast_install=no elif test yes = "$shlibpath_overrides_runpath" || test no = "$enable_shared"; then # Fast installation is not necessary enable_fast_install=needless fi _LT_TAGDECL([], [hardcode_action], [0], [How to hardcode a shared library path into an executable]) ])# _LT_LINKER_HARDCODE_LIBPATH # _LT_CMD_STRIPLIB # ---------------- m4_defun([_LT_CMD_STRIPLIB], [m4_require([_LT_DECL_EGREP]) striplib= old_striplib= AC_MSG_CHECKING([whether stripping libraries is possible]) if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" AC_MSG_RESULT([yes]) else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP"; then striplib="$STRIP -x" old_striplib="$STRIP -S" AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) fi ;; *) AC_MSG_RESULT([no]) ;; esac fi _LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) _LT_DECL([], [striplib], [1]) ])# _LT_CMD_STRIPLIB # _LT_PREPARE_MUNGE_PATH_LIST # --------------------------- # Make sure func_munge_path_list() is defined correctly. m4_defun([_LT_PREPARE_MUNGE_PATH_LIST], [[# func_munge_path_list VARIABLE PATH # ----------------------------------- # VARIABLE is name of variable containing _space_ separated list of # directories to be munged by the contents of PATH, which is string # having a format: # "DIR[:DIR]:" # string "DIR[ DIR]" will be prepended to VARIABLE # ":DIR[:DIR]" # string "DIR[ DIR]" will be appended to VARIABLE # "DIRP[:DIRP]::[DIRA:]DIRA" # string "DIRP[ DIRP]" will be prepended to VARIABLE and string # "DIRA[ DIRA]" will be appended to VARIABLE # "DIR[:DIR]" # VARIABLE will be replaced by "DIR[ DIR]" func_munge_path_list () { case x@S|@2 in x) ;; *:) eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'` \@S|@@S|@1\" ;; x:*) eval @S|@1=\"\@S|@@S|@1 `$ECHO @S|@2 | $SED 's/:/ /g'`\" ;; *::*) eval @S|@1=\"\@S|@@S|@1\ `$ECHO @S|@2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" eval @S|@1=\"`$ECHO @S|@2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \@S|@@S|@1\" ;; *) eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'`\" ;; esac } ]])# _LT_PREPARE_PATH_LIST # _LT_SYS_DYNAMIC_LINKER([TAG]) # ----------------------------- # PORTME Fill in your ld.so characteristics m4_defun([_LT_SYS_DYNAMIC_LINKER], [AC_REQUIRE([AC_CANONICAL_HOST])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_OBJDUMP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl m4_require([_LT_PREPARE_MUNGE_PATH_LIST])dnl AC_MSG_CHECKING([dynamic linker characteristics]) m4_if([$1], [], [ if test yes = "$GCC"; then case $host_os in darwin*) lt_awk_arg='/^libraries:/,/LR/' ;; *) lt_awk_arg='/^libraries:/' ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq='s|=\([[A-Za-z]]:\)|\1|g' ;; *) lt_sed_strip_eq='s|=/|/|g' ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary... lt_tmp_lt_search_path_spec= lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` # ...but if some path component already ends with the multilib dir we assume # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer). case "$lt_multi_os_dir; $lt_search_path_spec " in "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*) lt_multi_os_dir= ;; esac for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir" elif test -n "$lt_multi_os_dir"; then test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS = " "; FS = "/|\n";} { lt_foo = ""; lt_count = 0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo = "/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[[lt_foo]]++; } if (lt_freq[[lt_foo]] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's|/\([[A-Za-z]]:\)|\1|g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi]) library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=.so postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown AC_ARG_VAR([LT_SYS_LIBRARY_PATH], [User-defined run-time library search path.]) case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='$libname$release$shared_ext$major' ;; aix[[4-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test ia64 = "$host_cpu"; then # AIX 5 supports IA64 library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line '#! .'. This would cause the generated library to # depend on '.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[[01]] | aix4.[[01]].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # Using Import Files as archive members, it is possible to support # filename-based versioning of shared library archives on AIX. While # this would work for both with and without runtime linking, it will # prevent static linking of such archives. So we do filename-based # shared library versioning with .so extension only, which is used # when both runtime linking and shared linking is enabled. # Unfortunately, runtime linking may impact performance, so we do # not want this to be the default eventually. Also, we use the # versioned .so libs for executables only if there is the -brtl # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. # To allow for filename-based versioning support, we need to create # libNAME.so.V as an archive file, containing: # *) an Import File, referring to the versioned filename of the # archive as well as the shared archive member, telling the # bitwidth (32 or 64) of that shared object, and providing the # list of exported symbols of that shared object, eventually # decorated with the 'weak' keyword # *) the shared object with the F_LOADONLY flag set, to really avoid # it being seen by the linker. # At run time we better use the real file rather than another symlink, # but for link time we create the symlink libNAME.so -> libNAME.so.V case $with_aix_soname,$aix_use_runtimelinking in # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. aix,yes) # traditional libtool dynamic_linker='AIX unversionable lib.so' # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' ;; aix,no) # traditional AIX only dynamic_linker='AIX lib.a[(]lib.so.V[)]' # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='$libname$release.a $libname.a' soname_spec='$libname$release$shared_ext$major' ;; svr4,*) # full svr4 only dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)]" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,yes) # both, prefer svr4 dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)], lib.a[(]lib.so.V[)]" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # unpreferred sharedlib libNAME.a needs extra handling postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,no) # both, prefer aix dynamic_linker="AIX lib.a[(]lib.so.V[)], lib.so.V[(]$shared_archive_member_spec.o[)]" library_names_spec='$libname$release.a $libname.a' soname_spec='$libname$release$shared_ext$major' # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' ;; esac shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='$libname$shared_ext' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[[45]]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=.dll need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' library_names_spec='$libname.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec=$LIB if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' soname_spec='$libname$release$major$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[[23]].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[[01]]* | freebsdelf3.[[01]]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=no sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' if test 32 = "$HPUX_IA64_MODE"; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" sys_lib_dlsearch_path_spec=/usr/lib/hpux32 else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" sys_lib_dlsearch_path_spec=/usr/lib/hpux64 fi ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[[3-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test yes = "$lt_cv_prog_gnu_ld"; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='$libname$release$shared_ext$major' library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; linux*android*) version_type=none # Android doesn't support versioned libraries. need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext' soname_spec='$libname$release$shared_ext' finish_cmds= shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes dynamic_linker='Android linker' # Don't embed -rpath directories since the linker doesn't support them. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath], [lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], [lt_cv_shlibpath_overrides_runpath=yes])]) LDFLAGS=$save_LDFLAGS libdir=$save_libdir ]) shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Add ABI-specific directories to the system library path. sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib" # Ideally, we could use ldconfig to report *all* directores which are # searched for libraries, however this is still not possible. Aside from not # being certain /sbin/ldconfig is available, command # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, # even though it is searched at run-time. Try to do the best guess by # appending ld.so.conf contents (and includes) to the search path. if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd* | bitrig*) version_type=sunos sys_lib_dlsearch_path_spec=/usr/lib need_lib_prefix=no if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then need_version=no else need_version=yes fi library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; os2*) libname_spec='$name' version_type=windows shrext_cmds=.dll need_version=no need_lib_prefix=no # OS/2 can only load a DLL with a base name of 8 characters or less. soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; v=$($ECHO $release$versuffix | tr -d .-); n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); $ECHO $n$v`$shared_ext' library_names_spec='${libname}_dll.$libext' dynamic_linker='OS/2 ld.exe' shlibpath_var=BEGINLIBPATH sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='$libname$release$shared_ext$major' library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test yes = "$with_gnu_ld"; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec; then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' soname_spec='$libname$shared_ext.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=sco need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test yes = "$with_gnu_ld"; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac AC_MSG_RESULT([$dynamic_linker]) test no = "$dynamic_linker" && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test yes = "$GCC"; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec fi if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec fi # remember unaugmented sys_lib_dlsearch_path content for libtool script decls... configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec # ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" # to be used as default LT_SYS_LIBRARY_PATH value in generated libtool configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH _LT_DECL([], [variables_saved_for_relink], [1], [Variables whose values should be saved in libtool wrapper scripts and restored at link time]) _LT_DECL([], [need_lib_prefix], [0], [Do we need the "lib" prefix for modules?]) _LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) _LT_DECL([], [version_type], [0], [Library versioning type]) _LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) _LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) _LT_DECL([], [shlibpath_overrides_runpath], [0], [Is shlibpath searched before the hard-coded library search path?]) _LT_DECL([], [libname_spec], [1], [Format of library name prefix]) _LT_DECL([], [library_names_spec], [1], [[List of archive names. First name is the real one, the rest are links. The last name is the one that the linker finds with -lNAME]]) _LT_DECL([], [soname_spec], [1], [[The coded name of the library, if different from the real name]]) _LT_DECL([], [install_override_mode], [1], [Permission mode override for installation of shared libraries]) _LT_DECL([], [postinstall_cmds], [2], [Command to use after installation of a shared archive]) _LT_DECL([], [postuninstall_cmds], [2], [Command to use after uninstallation of a shared archive]) _LT_DECL([], [finish_cmds], [2], [Commands used to finish a libtool library installation in a directory]) _LT_DECL([], [finish_eval], [1], [[As "finish_cmds", except a single script fragment to be evaled but not shown]]) _LT_DECL([], [hardcode_into_libs], [0], [Whether we should hardcode library paths into libraries]) _LT_DECL([], [sys_lib_search_path_spec], [2], [Compile-time system search path for libraries]) _LT_DECL([sys_lib_dlsearch_path_spec], [configure_time_dlsearch_path], [2], [Detected run-time system search path for libraries]) _LT_DECL([], [configure_time_lt_sys_library_path], [2], [Explicit LT_SYS_LIBRARY_PATH set during ./configure time]) ])# _LT_SYS_DYNAMIC_LINKER # _LT_PATH_TOOL_PREFIX(TOOL) # -------------------------- # find a file program that can recognize shared library AC_DEFUN([_LT_PATH_TOOL_PREFIX], [m4_require([_LT_DECL_EGREP])dnl AC_MSG_CHECKING([for $1]) AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, [case $MAGIC_CMD in [[\\/*] | ?:[\\/]*]) lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD=$MAGIC_CMD lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR dnl $ac_dummy forces splitting on constant user-supplied paths. dnl POSIX.2 word splitting is done only on the output of word expansions, dnl not every word. This closes a longstanding sh security hole. ac_dummy="m4_if([$2], , $PATH, [$2])" for ac_dir in $ac_dummy; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$1"; then lt_cv_path_MAGIC_CMD=$ac_dir/"$1" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD=$lt_cv_path_MAGIC_CMD if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS=$lt_save_ifs MAGIC_CMD=$lt_save_MAGIC_CMD ;; esac]) MAGIC_CMD=$lt_cv_path_MAGIC_CMD if test -n "$MAGIC_CMD"; then AC_MSG_RESULT($MAGIC_CMD) else AC_MSG_RESULT(no) fi _LT_DECL([], [MAGIC_CMD], [0], [Used to examine libraries when file_magic_cmd begins with "file"])dnl ])# _LT_PATH_TOOL_PREFIX # Old name: AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) # _LT_PATH_MAGIC # -------------- # find a file program that can recognize a shared library m4_defun([_LT_PATH_MAGIC], [_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) else MAGIC_CMD=: fi fi ])# _LT_PATH_MAGIC # LT_PATH_LD # ---------- # find the pathname to the GNU or non-GNU linker AC_DEFUN([LT_PATH_LD], [AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PROG_ECHO_BACKSLASH])dnl AC_ARG_WITH([gnu-ld], [AS_HELP_STRING([--with-gnu-ld], [assume the C compiler uses GNU ld @<:@default=no@:>@])], [test no = "$withval" || with_gnu_ld=yes], [with_gnu_ld=no])dnl ac_prog=ld if test yes = "$GCC"; then # Check if gcc -print-prog-name=ld gives a path. AC_MSG_CHECKING([for ld used by $CC]) case $host in *-*-mingw*) # gcc leaves a trailing carriage return, which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [[\\/]]* | ?:[[\\/]]*) re_direlt='/[[^/]][[^/]]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD=$ac_prog ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test yes = "$with_gnu_ld"; then AC_MSG_CHECKING([for GNU ld]) else AC_MSG_CHECKING([for non-GNU ld]) fi AC_CACHE_VAL(lt_cv_path_LD, [if test -z "$LD"; then lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD=$ac_dir/$ac_prog # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &1 conftest.i cat conftest.i conftest.i >conftest2.i : ${lt_DD:=$DD} AC_PATH_PROGS_FEATURE_CHECK([lt_DD], [dd], [if "$ac_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then cmp -s conftest.i conftest.out \ && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=: fi]) rm -f conftest.i conftest2.i conftest.out]) ])# _LT_PATH_DD # _LT_CMD_TRUNCATE # ---------------- # find command to truncate a binary pipe m4_defun([_LT_CMD_TRUNCATE], [m4_require([_LT_PATH_DD]) AC_CACHE_CHECK([how to truncate binary pipes], [lt_cv_truncate_bin], [printf 0123456789abcdef0123456789abcdef >conftest.i cat conftest.i conftest.i >conftest2.i lt_cv_truncate_bin= if "$ac_cv_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then cmp -s conftest.i conftest.out \ && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1" fi rm -f conftest.i conftest2.i conftest.out test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q"]) _LT_DECL([lt_truncate_bin], [lt_cv_truncate_bin], [1], [Command to truncate a binary pipe]) ])# _LT_CMD_TRUNCATE # _LT_CHECK_MAGIC_METHOD # ---------------------- # how to check for library dependencies # -- PORTME fill in with the dynamic library characteristics m4_defun([_LT_CHECK_MAGIC_METHOD], [m4_require([_LT_DECL_EGREP]) m4_require([_LT_DECL_OBJDUMP]) AC_CACHE_CHECK([how to recognize dependent libraries], lt_cv_deplibs_check_method, [lt_cv_file_magic_cmd='$MAGIC_CMD' lt_cv_file_magic_test_file= lt_cv_deplibs_check_method='unknown' # Need to set the preceding variable on all platforms that support # interlibrary dependencies. # 'none' -- dependencies not supported. # 'unknown' -- same as none, but documents that we really don't know. # 'pass_all' -- all dependencies passed with no checks. # 'test_compile' -- check by making test program. # 'file_magic [[regex]]' -- check by looking for files in library path # that responds to the $file_magic_cmd with a given extended regex. # If you have 'file' or equivalent on your system and you're not sure # whether 'pass_all' will *always* work, you probably want this one. case $host_os in aix[[4-9]]*) lt_cv_deplibs_check_method=pass_all ;; beos*) lt_cv_deplibs_check_method=pass_all ;; bsdi[[45]]*) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)' lt_cv_file_magic_cmd='/usr/bin/file -L' lt_cv_file_magic_test_file=/shlib/libc.so ;; cygwin*) # func_win32_libid is a shell function defined in ltmain.sh lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' ;; mingw* | pw32*) # Base MSYS/MinGW do not provide the 'file' command needed by # func_win32_libid shell function, so use a weaker test based on 'objdump', # unless we find 'file', for example because we are cross-compiling. if ( file / ) >/dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'] lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[[3-9]]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) lt_cv_deplibs_check_method=pass_all ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd* | bitrig*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; os2*) lt_cv_deplibs_check_method=pass_all ;; esac ]) file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown _LT_DECL([], [deplibs_check_method], [1], [Method to check whether dependent libraries are shared objects]) _LT_DECL([], [file_magic_cmd], [1], [Command to use when deplibs_check_method = "file_magic"]) _LT_DECL([], [file_magic_glob], [1], [How to find potential files when deplibs_check_method = "file_magic"]) _LT_DECL([], [want_nocaseglob], [1], [Find potential files using nocaseglob when deplibs_check_method = "file_magic"]) ])# _LT_CHECK_MAGIC_METHOD # LT_PATH_NM # ---------- # find the pathname to a BSD- or MS-compatible name lister AC_DEFUN([LT_PATH_NM], [AC_REQUIRE([AC_PROG_CC])dnl AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, [if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM=$NM else lt_nm_to_check=${ac_tool_prefix}nm if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. tmp_nm=$ac_dir/$lt_tmp_nm if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then # Check to see if the nm accepts a BSD-compat flag. # Adding the 'sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty case $build_os in mingw*) lt_bad_file=conftest.nm/nofile ;; *) lt_bad_file=/dev/null ;; esac case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in *$lt_bad_file* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break 2 ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break 2 ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS=$lt_save_ifs done : ${lt_cv_path_NM=no} fi]) if test no != "$lt_cv_path_NM"; then NM=$lt_cv_path_NM else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols -headers" ;; *) DUMPBIN=: ;; esac fi AC_SUBST([DUMPBIN]) if test : != "$DUMPBIN"; then NM=$DUMPBIN fi fi test -z "$NM" && NM=nm AC_SUBST([NM]) _LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], [lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) cat conftest.out >&AS_MESSAGE_LOG_FD if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest*]) ])# LT_PATH_NM # Old names: AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_PROG_NM], []) dnl AC_DEFUN([AC_PROG_NM], []) # _LT_CHECK_SHAREDLIB_FROM_LINKLIB # -------------------------------- # how to determine the name of the shared library # associated with a specific link library. # -- PORTME fill in with the dynamic library characteristics m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB], [m4_require([_LT_DECL_EGREP]) m4_require([_LT_DECL_OBJDUMP]) m4_require([_LT_DECL_DLLTOOL]) AC_CACHE_CHECK([how to associate runtime and link libraries], lt_cv_sharedlib_from_linklib_cmd, [lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh; # decide which one to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd=$ECHO ;; esac ]) sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO _LT_DECL([], [sharedlib_from_linklib_cmd], [1], [Command to associate shared and link libraries]) ])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB # _LT_PATH_MANIFEST_TOOL # ---------------------- # locate the manifest tool m4_defun([_LT_PATH_MANIFEST_TOOL], [AC_CHECK_TOOL(MANIFEST_TOOL, mt, :) test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool], [lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&AS_MESSAGE_LOG_FD if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest*]) if test yes != "$lt_cv_path_mainfest_tool"; then MANIFEST_TOOL=: fi _LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl ])# _LT_PATH_MANIFEST_TOOL # _LT_DLL_DEF_P([FILE]) # --------------------- # True iff FILE is a Windows DLL '.def' file. # Keep in sync with func_dll_def_p in the libtool script AC_DEFUN([_LT_DLL_DEF_P], [dnl test DEF = "`$SED -n dnl -e '\''s/^[[ ]]*//'\'' dnl Strip leading whitespace -e '\''/^\(;.*\)*$/d'\'' dnl Delete empty lines and comments -e '\''s/^\(EXPORTS\|LIBRARY\)\([[ ]].*\)*$/DEF/p'\'' dnl -e q dnl Only consider the first "real" line $1`" dnl ])# _LT_DLL_DEF_P # LT_LIB_M # -------- # check for math library AC_DEFUN([LT_LIB_M], [AC_REQUIRE([AC_CANONICAL_HOST])dnl LIBM= case $host in *-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) # These system don't have libm, or don't need it ;; *-ncr-sysv4.3*) AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM=-lmw) AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") ;; *) AC_CHECK_LIB(m, cos, LIBM=-lm) ;; esac AC_SUBST([LIBM]) ])# LT_LIB_M # Old name: AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_CHECK_LIBM], []) # _LT_COMPILER_NO_RTTI([TAGNAME]) # ------------------------------- m4_defun([_LT_COMPILER_NO_RTTI], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= if test yes = "$GCC"; then case $cc_basename in nvcc*) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; *) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;; esac _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], lt_cv_prog_compiler_rtti_exceptions, [-fno-rtti -fno-exceptions], [], [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) fi _LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], [Compiler flag to turn off builtin functions]) ])# _LT_COMPILER_NO_RTTI # _LT_CMD_GLOBAL_SYMBOLS # ---------------------- m4_defun([_LT_CMD_GLOBAL_SYMBOLS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([LT_PATH_NM])dnl AC_REQUIRE([LT_PATH_LD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_TAG_COMPILER])dnl # Check for command to grab the raw symbol name followed by C symbol from nm. AC_MSG_CHECKING([command to parse $NM output from $compiler object]) AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], [ # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[[BCDEGRST]]' # Regexp to match symbols that can be accessed directly from C. sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[[BCDT]]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[[ABCDGISTW]]' ;; hpux*) if test ia64 = "$host_cpu"; then symcode='[[ABCDEGRST]]' fi ;; irix* | nonstopux*) symcode='[[BCDEGRST]]' ;; osf*) symcode='[[BCDEGQRST]]' ;; solaris*) symcode='[[BDRT]]' ;; sco3.2v5*) symcode='[[DT]]' ;; sysv4.2uw2*) symcode='[[DT]]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[[ABDT]]' ;; sysv4) symcode='[[DFNSTU]]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[[ABCDGIRSTW]]' ;; esac if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Gets list of data symbols to import. lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'" # Adjust the below global symbol transforms to fixup imported variables. lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'" lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'" lt_c_name_lib_hook="\ -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\ -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'" else # Disable hooks by default. lt_cv_sys_global_symbol_to_import= lt_cdecl_hook= lt_c_name_hook= lt_c_name_lib_hook= fi # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n"\ $lt_cdecl_hook\ " -e 's/^T .* \(.*\)$/extern int \1();/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n"\ $lt_c_name_hook\ " -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'" # Transform an extracted symbol line into symbol name with lib prefix and # symbol address. lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\ $lt_c_name_lib_hook\ " -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ " -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function, # D for any global variable and I for any imported variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK ['"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\ " /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\ " /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\ " {split(\$ 0,a,/\||\r/); split(a[2],s)};"\ " s[1]~/^[@?]/{print f,s[1],s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx]" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if AC_TRY_EVAL(ac_compile); then # Now try to grab the symbols. nlist=conftest.nm if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE /* DATA imports from DLLs on WIN32 can't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT@&t@_DLSYM_CONST #elif defined __osf__ /* This system does not cope well with relocations in const data. */ # define LT@&t@_DLSYM_CONST #else # define LT@&t@_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT@&t@_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[[]] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS=conftstm.$ac_objext CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" if AC_TRY_EVAL(ac_link) && test -s conftest$ac_exeext; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD fi else echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test yes = "$pipe_works"; then break else lt_cv_sys_global_symbol_pipe= fi done ]) if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then AC_MSG_RESULT(failed) else AC_MSG_RESULT(ok) fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then nm_file_list_spec='@' fi _LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], [Take the output of nm and produce a listing of raw symbols and C names]) _LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], [Transform the output of nm in a proper C declaration]) _LT_DECL([global_symbol_to_import], [lt_cv_sys_global_symbol_to_import], [1], [Transform the output of nm into a list of symbols to manually relocate]) _LT_DECL([global_symbol_to_c_name_address], [lt_cv_sys_global_symbol_to_c_name_address], [1], [Transform the output of nm in a C name address pair]) _LT_DECL([global_symbol_to_c_name_address_lib_prefix], [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], [Transform the output of nm in a C name address pair when lib prefix is needed]) _LT_DECL([nm_interface], [lt_cv_nm_interface], [1], [The name lister interface]) _LT_DECL([], [nm_file_list_spec], [1], [Specify filename containing input files for $NM]) ]) # _LT_CMD_GLOBAL_SYMBOLS # _LT_COMPILER_PIC([TAGNAME]) # --------------------------- m4_defun([_LT_COMPILER_PIC], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_wl, $1)= _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)= m4_if([$1], [CXX], [ # C++ specific cases for pic, static, wl, etc. if test yes = "$GXX"; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the '-m68020' flag to GCC prevents building anything better, # like '-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) case $host_os in os2*) _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' ;; esac ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac else case $host_os in aix[[4-9]]*) # All AIX code is PIC. if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; dgux*) case $cc_basename in ec++*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; ghcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; freebsd* | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' if test ia64 != "$host_cpu"; then _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' fi ;; aCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # KAI C++ Compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; ecpc* ) # old Intel C++ for x86_64, which still supported -KPIC. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; icpc* ) # Intel C++, used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL 8.0, 9.0 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' ;; *) ;; esac ;; netbsd*) ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; cxx*) # Digital/Compaq C++ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; lcc*) # Lucid _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; *) ;; esac ;; vxworks*) ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ], [ if test yes = "$GCC"; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the '-m68020' flag to GCC prevents building anything better, # like '-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) case $host_os in os2*) _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' ;; esac ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker ' if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' case $cc_basename in nagfor*) # NAG Fortran compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) case $host_os in os2*) _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' ;; esac ;; hpux9* | hpux10* | hpux11*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC (with -KPIC) is the default. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in # old Intel for x86_64, which still supported -KPIC. ecc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # Lahey Fortran 8.1. lf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' ;; nagfor*) # NAG Fortran compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; tcc*) # Fabrice Bellard et al's Tiny C Compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; ccc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All Alpha code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='' ;; *Sun\ F* | *Sun*Fortran*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ;; *Intel*\ [[CF]]*Compiler*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; *Portland\ Group*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; esac ;; newsos6) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All OSF/1 code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; rdos*) _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; solaris*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; *) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; esac ;; sunos4*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; unicos*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; uts4*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ]) case $host_os in # For platforms that do not support PIC, -DPIC is meaningless: *djgpp*) _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" ;; esac AC_CACHE_CHECK([for $compiler option to produce PIC], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) _LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1) # # Check to make sure the PIC flag actually works. # if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in "" | " "*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; esac], [_LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) fi _LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], [Additional compiler flags for building library objects]) _LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], [How to pass a linker flag through the compiler]) # # Check to make sure the static flag actually works. # wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" _LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), $lt_tmp_static_flag, [], [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) _LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], [Compiler flag to prevent dynamic linking]) ])# _LT_COMPILER_PIC # _LT_LINKER_SHLIBS([TAGNAME]) # ---------------------------- # See if the linker supports building shared libraries. m4_defun([_LT_LINKER_SHLIBS], [AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) m4_if([$1], [CXX], [ _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] case $host_os in aix[[4-9]]*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to GNU nm, but means don't demangle to AIX nm. # Without the "-l" option, or with the "-B" option, AIX nm treats # weak defined symbols like other global defined symbols, whereas # GNU nm marks them as "W". # While the 'weak' keyword is ignored in the Export File, we need # it in the Import File for the 'aix-soname' feature, so we have # to replace the "-B" option with "-P" for AIX nm. if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' fi ;; pw32*) _LT_TAGVAR(export_symbols_cmds, $1)=$ltdll_cmds ;; cygwin* | mingw* | cegcc*) case $cc_basename in cl*) _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] ;; esac ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac ], [ runpath_var= _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_cmds, $1)= _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(old_archive_from_new_cmds, $1)= _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= _LT_TAGVAR(thread_safe_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list _LT_TAGVAR(include_expsyms, $1)= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ' (' and ')$', so one must not match beginning or # end of line. Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc', # as well as any symbol that contains 'd'. _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. dnl Note also adjust exclude_expsyms for C++ above. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test yes != "$GCC"; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd* | bitrig*) with_gnu_ld=no ;; esac _LT_TAGVAR(ld_shlibs, $1)=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test yes = "$with_gnu_ld"; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;; *\ \(GNU\ Binutils\)\ [[3-9]]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test yes = "$lt_use_gnu_ld_interface"; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='$wl' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi supports_anon_versioning=no case `$LD -v | $SED -e 's/([^)]\+)\s\+//' 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[[3-9]]*) # On AIX/PPC, the GNU linker is very broken if test ia64 != "$host_cpu"; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file, use it as # is; otherwise, prepend EXPORTS... _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; os2*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=unsupported shrext_cmds=.dll _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test linux-dietlibc = "$host_os"; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test no = "$tmp_diet" then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 _LT_TAGVAR(whole_archive_flag_spec, $1)= tmp_sharedflag='--shared' ;; nagfor*) # NAGFOR 5.3 tmp_sharedflag='-Wl,-shared' ;; xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' if test yes = "$supports_anon_versioning"; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' fi case $cc_basename in tcc*) _LT_TAGVAR(export_dynamic_flag_spec, $1)='-rdynamic' ;; xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test yes = "$supports_anon_versioning"; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; sunos4*) _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac if test no = "$_LT_TAGVAR(ld_shlibs, $1)"; then runpath_var= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. _LT_TAGVAR(hardcode_minus_L, $1)=yes if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. _LT_TAGVAR(hardcode_direct, $1)=unsupported fi ;; aix[[4-9]]*) if test ia64 = "$host_cpu"; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag= else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to GNU nm, but means don't demangle to AIX nm. # Without the "-l" option, or with the "-B" option, AIX nm treats # weak defined symbols like other global defined symbols, whereas # GNU nm marks them as "W". # While the 'weak' keyword is ignored in the Export File, we need # it in the Import File for the 'aix-soname' feature, so we have # to replace the "-B" option with "-P" for AIX nm. if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # have runtime linking enabled, and use it for executables. # For shared libraries, we enable/disable runtime linking # depending on the kind of the shared library created - # when "with_aix_soname,aix_use_runtimelinking" is: # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables # "aix,yes" lib.so shared, rtl:yes, for executables # lib.a static archive # "both,no" lib.so.V(shr.o) shared, rtl:yes # lib.a(lib.so.V) shared, rtl:no, for executables # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a(lib.so.V) shared, rtl:no # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a static archive case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then aix_use_runtimelinking=yes break fi done if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then # With aix-soname=svr4, we create the lib.so.V shared archives only, # so we don't have lib.a shared libs to link our executables. # We have to force runtime linking in this case. aix_use_runtimelinking=yes LDFLAGS="$LDFLAGS -Wl,-brtl" fi ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='$wl-f,' case $with_aix_soname,$aix_use_runtimelinking in aix,*) ;; # traditional, no import file svr4,* | *,yes) # use import file # The Import File defines what to hardcode. _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no ;; esac if test yes = "$GCC"; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`$CC -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi ;; esac shared_flag='-shared' if test yes = "$aix_use_runtimelinking"; then shared_flag="$shared_flag "'$wl-G' fi # Need to ensure runtime linking is disabled for the traditional # shared library, or the linker may eventually find shared libraries # /with/ Import File - we do not want to mix them. shared_flag_aix='-shared' shared_flag_svr4='-shared $wl-G' else # not using gcc if test ia64 = "$host_cpu"; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test yes = "$aix_use_runtimelinking"; then shared_flag='$wl-G' else shared_flag='$wl-bM:SRE' fi shared_flag_aix='$wl-bM:SRE' shared_flag_svr4='$wl-G' fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. _LT_TAGVAR(always_export_symbols, $1)=yes if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag else if test ia64 = "$host_cpu"; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok' if test yes = "$with_gnu_ld"; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' # -brtl affects multiple linker settings, -berok does not and is overridden later compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`' if test svr4 != "$with_aix_soname"; then # This is similar to how AIX traditionally builds its shared libraries. _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' fi if test aix != "$with_aix_soname"; then _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' else # used by -dlpreopen to get the symbols _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV $output_objdir/$realname.d/$soname $output_objdir' fi _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; bsdi[[45]]*) _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl*) # Native MSVC _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then cp "$export_symbols" "$output_objdir/$soname.def"; echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; else $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile=$lt_outputfile.exe lt_tool_outputfile=$lt_tool_outputfile.exe ;; esac~ if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' # FIXME: Should let the user specify the lib program. _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; dgux*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; hpux9*) if test yes = "$GCC"; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' else _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' ;; hpux10*) if test yes,no = "$GCC,$with_gnu_ld"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test no = "$with_gnu_ld"; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes fi ;; hpux11*) if test yes,no = "$GCC,$with_gnu_ld"; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) m4_if($1, [], [ # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) _LT_LINKER_OPTION([if $CC understands -b], _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])], [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) ;; esac fi if test no = "$with_gnu_ld"; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test yes = "$GCC"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], [lt_cv_irix_exported_symbol], [save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null" AC_LINK_IFELSE( [AC_LANG_SOURCE( [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], [C++], [[int foo (void) { return 0; }]], [Fortran 77], [[ subroutine foo end]], [Fortran], [[ subroutine foo end]])])], [lt_cv_irix_exported_symbol=yes], [lt_cv_irix_exported_symbol=no]) LDFLAGS=$save_LDFLAGS]) if test yes = "$lt_cv_irix_exported_symbol"; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib' fi else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes _LT_TAGVAR(link_all_deplibs, $1)=yes ;; linux*) case $cc_basename in tcc*) # Fabrice Bellard et al's Tiny C Compiler _LT_TAGVAR(ld_shlibs, $1)=yes _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; newsos6) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *nto* | *qnx*) ;; openbsd* | bitrig*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' fi else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; os2*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=unsupported shrext_cmds=.dll _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; osf3*) if test yes = "$GCC"; then _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test yes = "$GCC"; then _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; solaris*) _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' if test yes = "$GCC"; then wlarc='$wl' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' _LT_TAGVAR(archive_cmds, $1)='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='$wl' _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands '-z linker_flag'. GCC discards it without '$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test yes = "$GCC"; then _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' else _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' fi ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes ;; sunos4*) if test sequent = "$host_vendor"; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4) case $host_vendor in sni) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' _LT_TAGVAR(hardcode_direct, $1)=no ;; motorola) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4.3*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes _LT_TAGVAR(ld_shlibs, $1)=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' if test yes = "$GCC"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We CANNOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport' runpath_var='LD_RUN_PATH' if test yes = "$GCC"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(ld_shlibs, $1)=no ;; esac if test sni = "$host_vendor"; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Blargedynsym' ;; esac fi fi ]) AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no _LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld _LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl _LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl _LT_DECL([], [extract_expsyms_cmds], [2], [The commands to extract the exported symbol list from a shared archive]) # # Do we need to explicitly link libc? # case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in x|xyes) # Assume -lc should be added _LT_TAGVAR(archive_cmds_need_lc, $1)=yes if test yes,yes = "$GCC,$enable_shared"; then case $_LT_TAGVAR(archive_cmds, $1) in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. AC_CACHE_CHECK([whether -lc should be explicitly linked in], [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1), [$RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if AC_TRY_EVAL(ac_compile) 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) _LT_TAGVAR(allow_undefined_flag, $1)= if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) then lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no else lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes fi _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* ]) _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1) ;; esac fi ;; esac _LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], [Whether or not to add -lc for building shared libraries]) _LT_TAGDECL([allow_libtool_libs_with_static_runtimes], [enable_shared_with_static_runtimes], [0], [Whether or not to disallow shared libs when runtime libs are static]) _LT_TAGDECL([], [export_dynamic_flag_spec], [1], [Compiler flag to allow reflexive dlopens]) _LT_TAGDECL([], [whole_archive_flag_spec], [1], [Compiler flag to generate shared objects directly from archives]) _LT_TAGDECL([], [compiler_needs_object], [1], [Whether the compiler copes with passing no objects directly]) _LT_TAGDECL([], [old_archive_from_new_cmds], [2], [Create an old-style archive from a shared archive]) _LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], [Create a temporary old-style archive to link instead of a shared archive]) _LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) _LT_TAGDECL([], [archive_expsym_cmds], [2]) _LT_TAGDECL([], [module_cmds], [2], [Commands used to build a loadable module if different from building a shared archive.]) _LT_TAGDECL([], [module_expsym_cmds], [2]) _LT_TAGDECL([], [with_gnu_ld], [1], [Whether we are building with GNU ld or not]) _LT_TAGDECL([], [allow_undefined_flag], [1], [Flag that allows shared libraries with undefined symbols to be built]) _LT_TAGDECL([], [no_undefined_flag], [1], [Flag that enforces no undefined symbols]) _LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], [Flag to hardcode $libdir into a binary during linking. This must work even if $libdir does not exist]) _LT_TAGDECL([], [hardcode_libdir_separator], [1], [Whether we need a single "-rpath" flag with a separated argument]) _LT_TAGDECL([], [hardcode_direct], [0], [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_direct_absolute], [0], [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes DIR into the resulting binary and the resulting library dependency is "absolute", i.e impossible to change by setting $shlibpath_var if the library is relocated]) _LT_TAGDECL([], [hardcode_minus_L], [0], [Set to "yes" if using the -LDIR flag during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_shlibpath_var], [0], [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_automatic], [0], [Set to "yes" if building a shared library automatically hardcodes DIR into the library and all subsequent libraries and executables linked against it]) _LT_TAGDECL([], [inherit_rpath], [0], [Set to yes if linker adds runtime paths of dependent libraries to runtime path list]) _LT_TAGDECL([], [link_all_deplibs], [0], [Whether libtool must link a program against all its dependency libraries]) _LT_TAGDECL([], [always_export_symbols], [0], [Set to "yes" if exported symbols are required]) _LT_TAGDECL([], [export_symbols_cmds], [2], [The commands to list exported symbols]) _LT_TAGDECL([], [exclude_expsyms], [1], [Symbols that should not be listed in the preloaded symbols]) _LT_TAGDECL([], [include_expsyms], [1], [Symbols that must always be exported]) _LT_TAGDECL([], [prelink_cmds], [2], [Commands necessary for linking programs (against libraries) with templates]) _LT_TAGDECL([], [postlink_cmds], [2], [Commands necessary for finishing linking programs]) _LT_TAGDECL([], [file_list_spec], [1], [Specify filename containing input files]) dnl FIXME: Not yet implemented dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], dnl [Compiler flag to generate thread safe objects]) ])# _LT_LINKER_SHLIBS # _LT_LANG_C_CONFIG([TAG]) # ------------------------ # Ensure that the configuration variables for a C compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to 'libtool'. m4_defun([_LT_LANG_C_CONFIG], [m4_require([_LT_DECL_EGREP])dnl lt_save_CC=$CC AC_LANG_PUSH(C) # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' _LT_TAG_COMPILER # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) LT_SYS_DLOPEN_SELF _LT_CMD_STRIPLIB # Report what library types will actually be built AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test no = "$can_build_shared" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test yes = "$enable_shared" && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test ia64 != "$host_cpu"; then case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in yes,aix,yes) ;; # shared object as lib.so file only yes,svr4,*) ;; # shared object as lib.so archive member only yes,*) enable_static=no ;; # shared object in lib.a archive as well esac fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test yes = "$enable_shared" || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_CONFIG($1) fi AC_LANG_POP CC=$lt_save_CC ])# _LT_LANG_C_CONFIG # _LT_LANG_CXX_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a C++ compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to 'libtool'. m4_defun([_LT_LANG_CXX_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl if test -n "$CXX" && ( test no != "$CXX" && ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) || (test g++ != "$CXX"))); then AC_PROG_CXXCPP else _lt_caught_CXX_error=yes fi AC_LANG_PUSH(C++) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the CXX compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test yes != "$_lt_caught_CXX_error"; then # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} CFLAGS=$CXXFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately if test yes = "$GXX"; then _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' else _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= fi if test yes = "$GXX"; then # Set up default GNU C++ configuration LT_PATH_LD # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test yes = "$with_gnu_ld"; then _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='$wl' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) _LT_TAGVAR(ld_shlibs, $1)=yes case $host_os in aix3*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aix[[4-9]]*) if test ia64 = "$host_cpu"; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag= else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # have runtime linking enabled, and use it for executables. # For shared libraries, we enable/disable runtime linking # depending on the kind of the shared library created - # when "with_aix_soname,aix_use_runtimelinking" is: # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables # "aix,yes" lib.so shared, rtl:yes, for executables # lib.a static archive # "both,no" lib.so.V(shr.o) shared, rtl:yes # lib.a(lib.so.V) shared, rtl:no, for executables # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a(lib.so.V) shared, rtl:no # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a static archive case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then # With aix-soname=svr4, we create the lib.so.V shared archives only, # so we don't have lib.a shared libs to link our executables. # We have to force runtime linking in this case. aix_use_runtimelinking=yes LDFLAGS="$LDFLAGS -Wl,-brtl" fi ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='$wl-f,' case $with_aix_soname,$aix_use_runtimelinking in aix,*) ;; # no import file svr4,* | *,yes) # use import file # The Import File defines what to hardcode. _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no ;; esac if test yes = "$GXX"; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`$CC -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi esac shared_flag='-shared' if test yes = "$aix_use_runtimelinking"; then shared_flag=$shared_flag' $wl-G' fi # Need to ensure runtime linking is disabled for the traditional # shared library, or the linker may eventually find shared libraries # /with/ Import File - we do not want to mix them. shared_flag_aix='-shared' shared_flag_svr4='-shared $wl-G' else # not using gcc if test ia64 = "$host_cpu"; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test yes = "$aix_use_runtimelinking"; then shared_flag='$wl-G' else shared_flag='$wl-bM:SRE' fi shared_flag_aix='$wl-bM:SRE' shared_flag_svr4='$wl-G' fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to # export. _LT_TAGVAR(always_export_symbols, $1)=yes if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. # The "-G" linker flag allows undefined symbols. _LT_TAGVAR(no_undefined_flag, $1)='-bernotok' # Determine the default libpath from the value encoded in an empty # executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag else if test ia64 = "$host_cpu"; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok' if test yes = "$with_gnu_ld"; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' # -brtl affects multiple linker settings, -berok does not and is overridden later compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`' if test svr4 != "$with_aix_soname"; then # This is similar to how AIX traditionally builds its shared # libraries. Need -bnortl late, we may have -brtl in LDFLAGS. _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' fi if test aix != "$with_aix_soname"; then _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' else # used by -dlpreopen to get the symbols _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV $output_objdir/$realname.d/$soname $output_objdir' fi _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d' fi fi ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; cygwin* | mingw* | pw32* | cegcc*) case $GXX,$cc_basename in ,cl* | no,cl*) # Native MSVC # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then cp "$export_symbols" "$output_objdir/$soname.def"; echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; else $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile=$lt_outputfile.exe lt_tool_outputfile=$lt_tool_outputfile.exe ;; esac~ func_to_tool_file "$lt_outputfile"~ if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # g++ # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file, use it as # is; otherwise, prepend EXPORTS... _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; os2*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=unsupported shrext_cmds=.dll _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; freebsd2.*) # C++ shared libraries reported to be fairly broken before # switch to ELF _LT_TAGVAR(ld_shlibs, $1)=no ;; freebsd-elf*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; freebsd* | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions _LT_TAGVAR(ld_shlibs, $1)=yes ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; hpux9*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test yes = "$GXX"; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; hpux10*|hpux11*) if test no = "$with_gnu_ld"; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) ;; *) _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test yes = "$GXX"; then if test no = "$with_gnu_ld"; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test yes = "$GXX"; then if test no = "$with_gnu_ld"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` -o $lib' fi fi _LT_TAGVAR(link_all_deplibs, $1)=yes ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib $wl-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc* | ecpc* ) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; esac _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ $RANLIB $oldlib' _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 6 and above use weak symbols _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl--rpath $wl$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' ;; cxx*) # Compaq C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib $wl-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' ;; xl* | mpixl* | bgxl*) # IBM XL 8.0 on PPC, with GNU ld _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' if test yes = "$supports_anon_versioning"; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' fi ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file $wl$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; m88k*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; *nto* | *qnx*) _LT_TAGVAR(ld_shlibs, $1)=yes ;; openbsd* | bitrig*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`"; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file,$export_symbols -o $lib' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' fi output_verbose_link_cmd=func_echo_all else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Archives containing C++ object files must be created using # the KAI C++ compiler. case $host in osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; esac ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; cxx*) case $host in osf3*) _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $soname `test -n "$verstring" && func_echo_all "$wl-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' ;; *) _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname $wl-input $wl$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~ $RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' ;; esac _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test yes,no = "$GXX,$with_gnu_ld"; then _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' case $host in osf3*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(archive_cmds_need_lc,$1)=yes _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G$allow_undefined_flag $wl-M $wl$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands '-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test yes,no = "$GXX,$with_gnu_ld"; then _LT_TAGVAR(no_undefined_flag, $1)=' $wl-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # g++ 2.7 appears to require '-G' NOT '-shared' on this # platform. _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $wl$libdir' case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We CANNOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ '"$_LT_TAGVAR(old_archive_cmds, $1)" _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ '"$_LT_TAGVAR(reload_cmds, $1)" ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no _LT_TAGVAR(GCC, $1)=$GXX _LT_TAGVAR(LD, $1)=$LD ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld fi # test yes != "$_lt_caught_CXX_error" AC_LANG_POP ])# _LT_LANG_CXX_CONFIG # _LT_FUNC_STRIPNAME_CNF # ---------------------- # func_stripname_cnf prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). # # This function is identical to the (non-XSI) version of func_stripname, # except this one can be used by m4 code that may be executed by configure, # rather than the libtool script. m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl AC_REQUIRE([_LT_DECL_SED]) AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) func_stripname_cnf () { case @S|@2 in .*) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%\\\\@S|@2\$%%"`;; *) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%@S|@2\$%%"`;; esac } # func_stripname_cnf ])# _LT_FUNC_STRIPNAME_CNF # _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) # --------------------------------- # Figure out "hidden" library dependencies from verbose # compiler output when linking a shared library. # Parse the compiler output and extract the necessary # objects, libraries and library flags. m4_defun([_LT_SYS_HIDDEN_LIBDEPS], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl # Dependencies to place before and after the object being linked: _LT_TAGVAR(predep_objects, $1)= _LT_TAGVAR(postdep_objects, $1)= _LT_TAGVAR(predeps, $1)= _LT_TAGVAR(postdeps, $1)= _LT_TAGVAR(compiler_lib_search_path, $1)= dnl we can't use the lt_simple_compile_test_code here, dnl because it contains code intended for an executable, dnl not a library. It's possible we should let each dnl tag define a new lt_????_link_test_code variable, dnl but it's only used here... m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF int a; void foo (void) { a = 0; } _LT_EOF ], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF class Foo { public: Foo (void) { a = 0; } private: int a; }; _LT_EOF ], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer*4 a a=0 return end _LT_EOF ], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer a a=0 return end _LT_EOF ], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF public class foo { private int a; public void bar (void) { a = 0; } }; _LT_EOF ], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF package foo func foo() { } _LT_EOF ]) _lt_libdeps_save_CFLAGS=$CFLAGS case "$CC $CFLAGS " in #( *\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; *\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; *\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; esac dnl Parse the compiler output and extract the necessary dnl objects, libraries and library flags. if AC_TRY_EVAL(ac_compile); then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do case $prev$p in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test x-L = "$p" || test x-R = "$p"; then prev=$p continue fi # Expand the sysroot to ease extracting the directories later. if test -z "$prev"; then case $p in -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; esac fi case $p in =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; esac if test no = "$pre_test_object_deps_done"; then case $prev in -L | -R) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then _LT_TAGVAR(compiler_lib_search_path, $1)=$prev$p else _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} $prev$p" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$_LT_TAGVAR(postdeps, $1)"; then _LT_TAGVAR(postdeps, $1)=$prev$p else _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} $prev$p" fi fi prev= ;; *.lto.$objext) ;; # Ignore GCC LTO objects *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test no = "$pre_test_object_deps_done"; then if test -z "$_LT_TAGVAR(predep_objects, $1)"; then _LT_TAGVAR(predep_objects, $1)=$p else _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" fi else if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then _LT_TAGVAR(postdep_objects, $1)=$p else _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling $1 test program" fi $RM -f confest.$objext CFLAGS=$_lt_libdeps_save_CFLAGS # PORTME: override above test on systems where it is broken m4_if([$1], [CXX], [case $host_os in interix[[3-9]]*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. _LT_TAGVAR(predep_objects,$1)= _LT_TAGVAR(postdep_objects,$1)= _LT_TAGVAR(postdeps,$1)= ;; esac ]) case " $_LT_TAGVAR(postdeps, $1) " in *" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; esac _LT_TAGVAR(compiler_lib_search_dirs, $1)= if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | $SED -e 's! -L! !g' -e 's!^ !!'` fi _LT_TAGDECL([], [compiler_lib_search_dirs], [1], [The directories searched by this compiler when creating a shared library]) _LT_TAGDECL([], [predep_objects], [1], [Dependencies to place before and after the objects being linked to create a shared library]) _LT_TAGDECL([], [postdep_objects], [1]) _LT_TAGDECL([], [predeps], [1]) _LT_TAGDECL([], [postdeps], [1]) _LT_TAGDECL([], [compiler_lib_search_path], [1], [The library search path used internally by the compiler when linking a shared library]) ])# _LT_SYS_HIDDEN_LIBDEPS # _LT_LANG_F77_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a Fortran 77 compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to 'libtool'. m4_defun([_LT_LANG_F77_CONFIG], [AC_LANG_PUSH(Fortran 77) if test -z "$F77" || test no = "$F77"; then _lt_disable_F77=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for f77 test sources. ac_ext=f # Object file extension for compiled f77 test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the F77 compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test yes != "$_lt_disable_F77"; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${F77-"f77"} CFLAGS=$FFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) GCC=$G77 if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test no = "$can_build_shared" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test yes = "$enable_shared" && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test ia64 != "$host_cpu"; then case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in yes,aix,yes) ;; # shared object as lib.so file only yes,svr4,*) ;; # shared object as lib.so archive member only yes,*) enable_static=no ;; # shared object in lib.a archive as well esac fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test yes = "$enable_shared" || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)=$G77 _LT_TAGVAR(LD, $1)=$LD ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS fi # test yes != "$_lt_disable_F77" AC_LANG_POP ])# _LT_LANG_F77_CONFIG # _LT_LANG_FC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for a Fortran compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to 'libtool'. m4_defun([_LT_LANG_FC_CONFIG], [AC_LANG_PUSH(Fortran) if test -z "$FC" || test no = "$FC"; then _lt_disable_FC=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for fc test sources. ac_ext=${ac_fc_srcext-f} # Object file extension for compiled fc test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the FC compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test yes != "$_lt_disable_FC"; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${FC-"f95"} CFLAGS=$FCFLAGS compiler=$CC GCC=$ac_cv_fc_compiler_gnu _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test no = "$can_build_shared" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test yes = "$enable_shared" && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test ia64 != "$host_cpu"; then case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in yes,aix,yes) ;; # shared object as lib.so file only yes,svr4,*) ;; # shared object as lib.so archive member only yes,*) enable_static=no ;; # shared object in lib.a archive as well esac fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test yes = "$enable_shared" || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)=$ac_cv_fc_compiler_gnu _LT_TAGVAR(LD, $1)=$LD ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS fi # test yes != "$_lt_disable_FC" AC_LANG_POP ])# _LT_LANG_FC_CONFIG # _LT_LANG_GCJ_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Java Compiler compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to 'libtool'. m4_defun([_LT_LANG_GCJ_CONFIG], [AC_REQUIRE([LT_PROG_GCJ])dnl AC_LANG_SAVE # Source file extension for Java test sources. ac_ext=java # Object file extension for compiled Java test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="class foo {}" # Code to be used in simple link tests lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GCJ-"gcj"} CFLAGS=$GCJFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)=$LD _LT_CC_BASENAME([$compiler]) # GCJ did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GCJ_CONFIG # _LT_LANG_GO_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Go compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to 'libtool'. m4_defun([_LT_LANG_GO_CONFIG], [AC_REQUIRE([LT_PROG_GO])dnl AC_LANG_SAVE # Source file extension for Go test sources. ac_ext=go # Object file extension for compiled Go test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="package main; func main() { }" # Code to be used in simple link tests lt_simple_link_test_code='package main; func main() { }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GOC-"gccgo"} CFLAGS=$GOFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)=$LD _LT_CC_BASENAME([$compiler]) # Go did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GO_CONFIG # _LT_LANG_RC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for the Windows resource compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to 'libtool'. m4_defun([_LT_LANG_RC_CONFIG], [AC_REQUIRE([LT_PROG_RC])dnl AC_LANG_SAVE # Source file extension for RC test sources. ac_ext=rc # Object file extension for compiled RC test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' # Code to be used in simple link tests lt_simple_link_test_code=$lt_simple_compile_test_code # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC= CC=${RC-"windres"} CFLAGS= compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes if test -n "$compiler"; then : _LT_CONFIG($1) fi GCC=$lt_save_GCC AC_LANG_RESTORE CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_RC_CONFIG # LT_PROG_GCJ # ----------- AC_DEFUN([LT_PROG_GCJ], [m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], [AC_CHECK_TOOL(GCJ, gcj,) test set = "${GCJFLAGS+set}" || GCJFLAGS="-g -O2" AC_SUBST(GCJFLAGS)])])[]dnl ]) # Old name: AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_GCJ], []) # LT_PROG_GO # ---------- AC_DEFUN([LT_PROG_GO], [AC_CHECK_TOOL(GOC, gccgo,) ]) # LT_PROG_RC # ---------- AC_DEFUN([LT_PROG_RC], [AC_CHECK_TOOL(RC, windres,) ]) # Old name: AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_RC], []) # _LT_DECL_EGREP # -------------- # If we don't have a new enough Autoconf to choose the best grep # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_EGREP], [AC_REQUIRE([AC_PROG_EGREP])dnl AC_REQUIRE([AC_PROG_FGREP])dnl test -z "$GREP" && GREP=grep _LT_DECL([], [GREP], [1], [A grep program that handles long lines]) _LT_DECL([], [EGREP], [1], [An ERE matcher]) _LT_DECL([], [FGREP], [1], [A literal string matcher]) dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too AC_SUBST([GREP]) ]) # _LT_DECL_OBJDUMP # -------------- # If we don't have a new enough Autoconf to choose the best objdump # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_OBJDUMP], [AC_CHECK_TOOL(OBJDUMP, objdump, false) test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) AC_SUBST([OBJDUMP]) ]) # _LT_DECL_DLLTOOL # ---------------- # Ensure DLLTOOL variable is set. m4_defun([_LT_DECL_DLLTOOL], [AC_CHECK_TOOL(DLLTOOL, dlltool, false) test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program]) AC_SUBST([DLLTOOL]) ]) # _LT_DECL_SED # ------------ # Check for a fully-functional sed program, that truncates # as few characters as possible. Prefer GNU sed if found. m4_defun([_LT_DECL_SED], [AC_PROG_SED test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" _LT_DECL([], [SED], [1], [A sed program that does not truncate output]) _LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], [Sed that helps us avoid accidentally triggering echo(1) options like -n]) ])# _LT_DECL_SED m4_ifndef([AC_PROG_SED], [ ############################################################ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_SED. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # ############################################################ m4_defun([AC_PROG_SED], [AC_MSG_CHECKING([for a sed that does not truncate output]) AC_CACHE_VAL(lt_cv_path_SED, [# Loop through the user's path and test for sed and gsed. # Then use that list of sed's as ones to test for truncation. as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for lt_ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" fi done done done IFS=$as_save_IFS lt_ac_max=0 lt_ac_count=0 # Add /usr/xpg4/bin/sed as it is typically found on Solaris # along with /bin/sed that truncates output. for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do test ! -f "$lt_ac_sed" && continue cat /dev/null > conftest.in lt_ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >conftest.in # Check for GNU sed and select it if it is found. if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then lt_cv_path_SED=$lt_ac_sed break fi while true; do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo >>conftest.nl $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break cmp -s conftest.out conftest.nl || break # 10000 chars as input seems more than enough test 10 -lt "$lt_ac_count" && break lt_ac_count=`expr $lt_ac_count + 1` if test "$lt_ac_count" -gt "$lt_ac_max"; then lt_ac_max=$lt_ac_count lt_cv_path_SED=$lt_ac_sed fi done done ]) SED=$lt_cv_path_SED AC_SUBST([SED]) AC_MSG_RESULT([$SED]) ])#AC_PROG_SED ])#m4_ifndef # Old name: AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_SED], []) # _LT_CHECK_SHELL_FEATURES # ------------------------ # Find out whether the shell is Bourne or XSI compatible, # or has some other useful features. m4_defun([_LT_CHECK_SHELL_FEATURES], [if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi _LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac _LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl _LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl ])# _LT_CHECK_SHELL_FEATURES # _LT_PATH_CONVERSION_FUNCTIONS # ----------------------------- # Determine what file name conversion functions should be used by # func_to_host_file (and, implicitly, by func_to_host_path). These are needed # for certain cross-compile configurations and native mingw. m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_MSG_CHECKING([how to convert $build file names to $host format]) AC_CACHE_VAL(lt_cv_to_host_file_cmd, [case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac ]) to_host_file_cmd=$lt_cv_to_host_file_cmd AC_MSG_RESULT([$lt_cv_to_host_file_cmd]) _LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd], [0], [convert $build file names to $host format])dnl AC_MSG_CHECKING([how to convert $build file names to toolchain format]) AC_CACHE_VAL(lt_cv_to_tool_file_cmd, [#assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac ]) to_tool_file_cmd=$lt_cv_to_tool_file_cmd AC_MSG_RESULT([$lt_cv_to_tool_file_cmd]) _LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], [0], [convert $build files to toolchain format])dnl ])# _LT_PATH_CONVERSION_FUNCTIONS pkg-config-0.29.1/glib/m4macros/Makefile.am0000664000175000017500000000026212651243552015255 00000000000000include $(top_srcdir)/glib.mk installed_m4= glib-2.0.m4 glib-gettext.m4 gsettings.m4 EXTRA_DIST+=$(installed_m4) m4datadir = $(datadir)/aclocal noinst_DATA += $(installed_m4) pkg-config-0.29.1/glib/m4macros/glibtests.m40000664000175000017500000000243512651243552015467 00000000000000dnl 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 ]) pkg-config-0.29.1/glib/m4macros/attributes.m40000664000175000017500000002316612651243552015661 00000000000000dnl Macros to check the presence of generic (non-typed) symbols. dnl Copyright (c) 2006-2008 Diego Pettenò dnl Copyright (c) 2006-2008 xine project dnl Copyright (c) 2012 Lucas De Marchi 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 ]) pkg-config-0.29.1/glib/m4macros/glib-2.0.m40000664000175000017500000002024512275467762014715 00000000000000# Configure paths for GLIB # Owen Taylor 1997-2001 dnl AM_PATH_GLIB_2_0([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND [, MODULES]]]]) dnl Test for GLIB, and define GLIB_CFLAGS and GLIB_LIBS, if gmodule, gobject, dnl gthread, or gio is specified in MODULES, pass to pkg-config dnl AC_DEFUN([AM_PATH_GLIB_2_0], [dnl dnl Get the cflags and libraries from pkg-config dnl AC_ARG_ENABLE(glibtest, [ --disable-glibtest do not try to compile and run a test GLIB program], , enable_glibtest=yes) pkg_config_args=glib-2.0 for module in . $4 do case "$module" in gmodule) pkg_config_args="$pkg_config_args gmodule-2.0" ;; gmodule-no-export) pkg_config_args="$pkg_config_args gmodule-no-export-2.0" ;; gobject) pkg_config_args="$pkg_config_args gobject-2.0" ;; gthread) pkg_config_args="$pkg_config_args gthread-2.0" ;; gio*) pkg_config_args="$pkg_config_args $module-2.0" ;; esac done PKG_PROG_PKG_CONFIG([0.16]) no_glib="" if test "x$PKG_CONFIG" = x ; then no_glib=yes PKG_CONFIG=no fi min_glib_version=ifelse([$1], ,2.0.0,$1) AC_MSG_CHECKING(for GLIB - version >= $min_glib_version) if test x$PKG_CONFIG != xno ; then ## don't try to run the test against uninstalled libtool libs if $PKG_CONFIG --uninstalled $pkg_config_args; then echo "Will use uninstalled version of GLib found in PKG_CONFIG_PATH" enable_glibtest=no fi if $PKG_CONFIG --atleast-version $min_glib_version $pkg_config_args; then : else no_glib=yes fi fi if test x"$no_glib" = x ; then GLIB_GENMARSHAL=`$PKG_CONFIG --variable=glib_genmarshal glib-2.0` GOBJECT_QUERY=`$PKG_CONFIG --variable=gobject_query glib-2.0` GLIB_MKENUMS=`$PKG_CONFIG --variable=glib_mkenums glib-2.0` GLIB_COMPILE_RESOURCES=`$PKG_CONFIG --variable=glib_compile_resources gio-2.0` GLIB_CFLAGS=`$PKG_CONFIG --cflags $pkg_config_args` GLIB_LIBS=`$PKG_CONFIG --libs $pkg_config_args` glib_config_major_version=`$PKG_CONFIG --modversion glib-2.0 | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` glib_config_minor_version=`$PKG_CONFIG --modversion glib-2.0 | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` glib_config_micro_version=`$PKG_CONFIG --modversion glib-2.0 | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` if test "x$enable_glibtest" = "xyes" ; then ac_save_CFLAGS="$CFLAGS" ac_save_LIBS="$LIBS" CFLAGS="$CFLAGS $GLIB_CFLAGS" LIBS="$GLIB_LIBS $LIBS" dnl dnl Now check if the installed GLIB is sufficiently new. (Also sanity dnl checks the results of pkg-config to some extent) dnl rm -f conf.glibtest AC_TRY_RUN([ #include #include #include int main () { unsigned int major, minor, micro; char *tmp_version; fclose (fopen ("conf.glibtest", "w")); /* HP/UX 9 (%@#!) writes to sscanf strings */ tmp_version = g_strdup("$min_glib_version"); if (sscanf(tmp_version, "%u.%u.%u", &major, &minor, µ) != 3) { printf("%s, bad version string\n", "$min_glib_version"); exit(1); } if ((glib_major_version != $glib_config_major_version) || (glib_minor_version != $glib_config_minor_version) || (glib_micro_version != $glib_config_micro_version)) { printf("\n*** 'pkg-config --modversion glib-2.0' returned %d.%d.%d, but GLIB (%d.%d.%d)\n", $glib_config_major_version, $glib_config_minor_version, $glib_config_micro_version, glib_major_version, glib_minor_version, glib_micro_version); printf ("*** was found! If pkg-config was correct, then it is best\n"); printf ("*** to remove the old version of GLib. You may also be able to fix the error\n"); printf("*** by modifying your LD_LIBRARY_PATH enviroment variable, or by editing\n"); printf("*** /etc/ld.so.conf. Make sure you have run ldconfig if that is\n"); printf("*** required on your system.\n"); printf("*** If pkg-config was wrong, set the environment variable PKG_CONFIG_PATH\n"); printf("*** to point to the correct configuration files\n"); } else if ((glib_major_version != GLIB_MAJOR_VERSION) || (glib_minor_version != GLIB_MINOR_VERSION) || (glib_micro_version != GLIB_MICRO_VERSION)) { printf("*** GLIB header files (version %d.%d.%d) do not match\n", GLIB_MAJOR_VERSION, GLIB_MINOR_VERSION, GLIB_MICRO_VERSION); printf("*** library (version %d.%d.%d)\n", glib_major_version, glib_minor_version, glib_micro_version); } else { if ((glib_major_version > major) || ((glib_major_version == major) && (glib_minor_version > minor)) || ((glib_major_version == major) && (glib_minor_version == minor) && (glib_micro_version >= micro))) { return 0; } else { printf("\n*** An old version of GLIB (%u.%u.%u) was found.\n", glib_major_version, glib_minor_version, glib_micro_version); printf("*** You need a version of GLIB newer than %u.%u.%u. The latest version of\n", major, minor, micro); printf("*** GLIB is always available from ftp://ftp.gtk.org.\n"); printf("***\n"); printf("*** If you have already installed a sufficiently new version, this error\n"); printf("*** probably means that the wrong copy of the pkg-config shell script is\n"); printf("*** being found. The easiest way to fix this is to remove the old version\n"); printf("*** of GLIB, but you can also set the PKG_CONFIG environment to point to the\n"); printf("*** correct copy of pkg-config. (In this case, you will have to\n"); printf("*** modify your LD_LIBRARY_PATH enviroment variable, or edit /etc/ld.so.conf\n"); printf("*** so that the correct libraries are found at run-time))\n"); } } return 1; } ],, no_glib=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" fi fi if test "x$no_glib" = x ; then AC_MSG_RESULT(yes (version $glib_config_major_version.$glib_config_minor_version.$glib_config_micro_version)) ifelse([$2], , :, [$2]) else AC_MSG_RESULT(no) if test "$PKG_CONFIG" = "no" ; then echo "*** A new enough version of pkg-config was not found." echo "*** See http://www.freedesktop.org/software/pkgconfig/" else if test -f conf.glibtest ; then : else echo "*** Could not run GLIB test program, checking why..." ac_save_CFLAGS="$CFLAGS" ac_save_LIBS="$LIBS" CFLAGS="$CFLAGS $GLIB_CFLAGS" LIBS="$LIBS $GLIB_LIBS" AC_TRY_LINK([ #include #include ], [ return ((glib_major_version) || (glib_minor_version) || (glib_micro_version)); ], [ echo "*** The test program compiled, but did not run. This usually means" echo "*** that the run-time linker is not finding GLIB or finding the wrong" echo "*** version of GLIB. If it is not finding GLIB, you'll need to set your" echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" echo "*** to the installed location Also, make sure you have run ldconfig if that" echo "*** is required on your system" echo "***" echo "*** If you have an old version installed, it is best to remove it, although" echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH" ], [ echo "*** The test program failed to compile or link. See the file config.log for the" echo "*** exact error that occured. This usually means GLIB is incorrectly installed."]) CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" fi fi GLIB_CFLAGS="" GLIB_LIBS="" GLIB_GENMARSHAL="" GOBJECT_QUERY="" GLIB_MKENUMS="" GLIB_COMPILE_RESOURCES="" ifelse([$3], , :, [$3]) fi AC_SUBST(GLIB_CFLAGS) AC_SUBST(GLIB_LIBS) AC_SUBST(GLIB_GENMARSHAL) AC_SUBST(GOBJECT_QUERY) AC_SUBST(GLIB_MKENUMS) AC_SUBST(GLIB_COMPILE_RESOURCES) rm -f conf.glibtest ]) pkg-config-0.29.1/glib/m4macros/ltversion.m40000644000175000017500000000127312650726031015506 00000000000000# ltversion.m4 -- version numbers -*- Autoconf -*- # # Copyright (C) 2004, 2011-2015 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # @configure_input@ # serial 4179 ltversion.m4 # This file is part of GNU Libtool m4_define([LT_PACKAGE_VERSION], [2.4.6]) m4_define([LT_PACKAGE_REVISION], [2.4.6]) AC_DEFUN([LTVERSION_VERSION], [macro_version='2.4.6' macro_revision='2.4.6' _LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) _LT_DECL(, macro_revision, 0) ]) pkg-config-0.29.1/glib/m4macros/lt~obsolete.m40000644000175000017500000001375612601774016016046 00000000000000# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- # # Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004. # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 5 lt~obsolete.m4 # These exist entirely to fool aclocal when bootstrapping libtool. # # In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN) # which have later been changed to m4_define as they aren't part of the # exported API, or moved to Autoconf or Automake where they belong. # # The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN # in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us # using a macro with the same name in our local m4/libtool.m4 it'll # pull the old libtool.m4 in (it doesn't see our shiny new m4_define # and doesn't know about Autoconf macros at all.) # # So we provide this file, which has a silly filename so it's always # included after everything else. This provides aclocal with the # AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything # because those macros already exist, or will be overwritten later. # We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. # # Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. # Yes, that means every name once taken will need to remain here until # we give up compatibility with versions before 1.7, at which point # we need to keep only those names which we still refer to. # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])]) m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])]) m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])]) m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) pkg-config-0.29.1/glib/m4macros/Makefile.in0000664000175000017500000014310512665370333015275 00000000000000# Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # GLIB - Library of useful C routines VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ installed_test_PROGRAMS = $(am__EXEEXT_1) noinst_PROGRAMS = $(am__EXEEXT_3) check_PROGRAMS = $(am__EXEEXT_2) TESTS = $(am__EXEEXT_1) @OS_WIN32_TRUE@am__append_1 = $(test_programs) $(test_scripts) $(uninstalled_test_programs) $(uninstalled_test_scripts) \ @OS_WIN32_TRUE@ $(dist_test_scripts) $(dist_uninstalled_test_scripts) @ENABLE_ALWAYS_BUILD_TESTS_TRUE@am__append_2 = $(all_test_ltlibs) @ENABLE_ALWAYS_BUILD_TESTS_TRUE@am__append_3 = $(all_test_programs) @ENABLE_ALWAYS_BUILD_TESTS_TRUE@am__append_4 = $(all_test_scripts) @ENABLE_ALWAYS_BUILD_TESTS_TRUE@am__append_5 = $(all_test_data) @ENABLE_ALWAYS_BUILD_TESTS_FALSE@am__append_6 = $(all_test_ltlibs) @ENABLE_ALWAYS_BUILD_TESTS_FALSE@am__append_7 = $(all_test_programs) @ENABLE_ALWAYS_BUILD_TESTS_FALSE@am__append_8 = $(all_test_scripts) @ENABLE_ALWAYS_BUILD_TESTS_FALSE@am__append_9 = $(all_test_data) @ENABLE_INSTALLED_TESTS_TRUE@am__append_10 = $(test_programs) $(installed_test_programs) \ @ENABLE_INSTALLED_TESTS_TRUE@ $(test_extra_programs) $(installed_test_extra_programs) @ENABLE_INSTALLED_TESTS_TRUE@am__append_11 = $(test_scripts) \ @ENABLE_INSTALLED_TESTS_TRUE@ $(installed_test_scripts) \ @ENABLE_INSTALLED_TESTS_TRUE@ $(test_extra_scripts) \ @ENABLE_INSTALLED_TESTS_TRUE@ $(test_installed_extra_scripts) \ @ENABLE_INSTALLED_TESTS_TRUE@ $(dist_test_scripts) \ @ENABLE_INSTALLED_TESTS_TRUE@ $(dist_test_extra_scripts) \ @ENABLE_INSTALLED_TESTS_TRUE@ $(dist_installed_test_scripts) \ @ENABLE_INSTALLED_TESTS_TRUE@ $(dist_installed_test_extra_scripts) @ENABLE_INSTALLED_TESTS_TRUE@am__append_12 = $(test_data) \ @ENABLE_INSTALLED_TESTS_TRUE@ $(installed_test_data) \ @ENABLE_INSTALLED_TESTS_TRUE@ $(dist_test_data) \ @ENABLE_INSTALLED_TESTS_TRUE@ $(dist_installed_test_data) @ENABLE_INSTALLED_TESTS_TRUE@am__append_13 = $(test_ltlibraries) $(installed_test_ltlibraries) @ENABLE_INSTALLED_TESTS_TRUE@am__append_14 = $(installed_test_meta_DATA) subdir = m4macros ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4macros/attributes.m4 \ $(top_srcdir)/m4macros/glibtests.m4 \ $(top_srcdir)/m4macros/libtool.m4 \ $(top_srcdir)/m4macros/ltoptions.m4 \ $(top_srcdir)/m4macros/ltsugar.m4 \ $(top_srcdir)/m4macros/ltversion.m4 \ $(top_srcdir)/m4macros/lt~obsolete.m4 \ $(top_srcdir)/acinclude.m4 $(top_srcdir)/acglib.m4 \ $(top_srcdir)/glib/libcharset/codeset.m4 \ $(top_srcdir)/glib/libcharset/glibc21.m4 \ $(top_srcdir)/m4macros/glib-gettext.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(installed_testdir)" \ "$(DESTDIR)$(installed_testdir)" \ "$(DESTDIR)$(installed_testdir)" \ "$(DESTDIR)$(installed_test_metadir)" \ "$(DESTDIR)$(installed_testdir)" LTLIBRARIES = $(installed_test_LTLIBRARIES) $(noinst_LTLIBRARIES) am__EXEEXT_1 = @ENABLE_ALWAYS_BUILD_TESTS_FALSE@am__EXEEXT_2 = $(am__EXEEXT_1) @ENABLE_ALWAYS_BUILD_TESTS_TRUE@am__EXEEXT_3 = $(am__EXEEXT_1) PROGRAMS = $(installed_test_PROGRAMS) $(noinst_PROGRAMS) SCRIPTS = $(installed_test_SCRIPTS) $(noinst_SCRIPTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(installed_test_meta_DATA) $(nobase_installed_test_DATA) \ $(noinst_DATA) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/glib.mk \ $(top_srcdir)/test-driver DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ABS_GLIB_RUNTIME_LIBDIR = @ABS_GLIB_RUNTIME_LIBDIR@ ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO = @GIO@ GIO_MODULE_DIR = @GIO_MODULE_DIR@ GLIBC21 = @GLIBC21@ GLIB_BINARY_AGE = @GLIB_BINARY_AGE@ GLIB_DEBUG_FLAGS = @GLIB_DEBUG_FLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_HIDDEN_VISIBILITY_CFLAGS = @GLIB_HIDDEN_VISIBILITY_CFLAGS@ GLIB_INTERFACE_AGE = @GLIB_INTERFACE_AGE@ GLIB_LINK_FLAGS = @GLIB_LINK_FLAGS@ GLIB_MAJOR_VERSION = @GLIB_MAJOR_VERSION@ GLIB_MICRO_VERSION = @GLIB_MICRO_VERSION@ GLIB_MINOR_VERSION = @GLIB_MINOR_VERSION@ GLIB_RUNTIME_LIBDIR = @GLIB_RUNTIME_LIBDIR@ GLIB_VERSION = @GLIB_VERSION@ GLIB_WARN_CFLAGS = @GLIB_WARN_CFLAGS@ GLIB_WIN32_STATIC_COMPILATION_DEFINE = @GLIB_WIN32_STATIC_COMPILATION_DEFINE@ GREP = @GREP@ GSPAWN = @GSPAWN@ GTHREAD_COMPILE_IMPL_DEFINES = @GTHREAD_COMPILE_IMPL_DEFINES@ G_LIBS_EXTRA = @G_LIBS_EXTRA@ G_MODULE_BROKEN_RTLD_GLOBAL = @G_MODULE_BROKEN_RTLD_GLOBAL@ G_MODULE_HAVE_DLERROR = @G_MODULE_HAVE_DLERROR@ G_MODULE_IMPL = @G_MODULE_IMPL@ G_MODULE_LDFLAGS = @G_MODULE_LDFLAGS@ G_MODULE_LIBS = @G_MODULE_LIBS@ G_MODULE_LIBS_EXTRA = @G_MODULE_LIBS_EXTRA@ G_MODULE_NEED_USCORE = @G_MODULE_NEED_USCORE@ G_MODULE_PLUGIN_LIBS = @G_MODULE_PLUGIN_LIBS@ G_MODULE_SUPPORTED = @G_MODULE_SUPPORTED@ G_THREAD_CFLAGS = @G_THREAD_CFLAGS@ G_THREAD_LIBS = @G_THREAD_LIBS@ G_THREAD_LIBS_EXTRA = @G_THREAD_LIBS_EXTRA@ G_THREAD_LIBS_FOR_GTHREAD = @G_THREAD_LIBS_FOR_GTHREAD@ ICONV_LIBS = @ICONV_LIBS@ INDENT = @INDENT@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIB_EXE_MACHINE_FLAG = @LIB_EXE_MACHINE_FLAG@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LTP = @LTP@ LTP_GENHTML = @LTP_GENHTML@ LT_AGE = @LT_AGE@ LT_CURRENT = @LT_CURRENT@ LT_CURRENT_MINUS_AGE = @LT_CURRENT_MINUS_AGE@ LT_RELEASE = @LT_RELEASE@ LT_REVISION = @LT_REVISION@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NAMESER_COMPAT_INCLUDE = @NAMESER_COMPAT_INCLUDE@ NETWORK_LIBS = @NETWORK_LIBS@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PERL = @PERL@ PERL_PATH = @PERL_PATH@ PLATFORMDEP = @PLATFORMDEP@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ REBUILD = @REBUILD@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHTOOL = @SHTOOL@ STRIP = @STRIP@ VERSION = @VERSION@ WINDRES = @WINDRES@ WSPIAPI_INCLUDE = @WSPIAPI_INCLUDE@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ config_h_INCLUDES = @config_h_INCLUDES@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gio_INCLUDES = @gio_INCLUDES@ glib_INCLUDES = @glib_INCLUDES@ gmodule_INCLUDES = @gmodule_INCLUDES@ gobject_INCLUDES = @gobject_INCLUDES@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ installed_test_metadir = @installed_test_metadir@ installed_testdir = @installed_testdir@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ ms_librarian = @ms_librarian@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ #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 $(am__append_14) DISTCLEANFILES = MAINTAINERCLEANFILES = EXTRA_DIST = $(all_dist_test_scripts) $(all_dist_test_data) \ $(installed_m4) # 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)) installed_test_LTLIBRARIES = $(am__append_13) installed_test_SCRIPTS = $(am__append_11) nobase_installed_test_DATA = $(am__append_12) noinst_LTLIBRARIES = $(am__append_2) noinst_SCRIPTS = $(am__append_4) noinst_DATA = $(am__append_5) $(installed_m4) check_LTLIBRARIES = $(am__append_6) check_SCRIPTS = $(am__append_8) check_DATA = $(am__append_9) # 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) 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_data = $(test_data) $(uninstalled_test_data) \ $(installed_test_data) $(all_dist_test_data) all_dist_test_data = $(dist_test_data) $(dist_uninstalled_test_data) $(dist_installed_test_data) all_test_ltlibs = $(test_ltlibraries) $(uninstalled_test_ltlibraries) $(installed_test_ltlibraries) @ENABLE_INSTALLED_TESTS_TRUE@installed_testcases = $(test_programs) $(installed_test_programs) \ @ENABLE_INSTALLED_TESTS_TRUE@ $(test_scripts) $(installed_test_scripts) \ @ENABLE_INSTALLED_TESTS_TRUE@ $(dist_test_scripts) $(dist_installed_test_scripts) @ENABLE_INSTALLED_TESTS_TRUE@installed_test_meta_DATA = $(installed_testcases:=.test) installed_m4 = glib-2.0.m4 glib-gettext.m4 gsettings.m4 m4datadir = $(datadir)/aclocal all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .log .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/glib.mk $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign m4macros/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign m4macros/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_srcdir)/glib.mk $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-checkLTLIBRARIES: -test -z "$(check_LTLIBRARIES)" || rm -f $(check_LTLIBRARIES) @list='$(check_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } install-installed_testLTLIBRARIES: $(installed_test_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(installed_test_LTLIBRARIES)'; test -n "$(installed_testdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(installed_testdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(installed_testdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(installed_testdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(installed_testdir)"; \ } uninstall-installed_testLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(installed_test_LTLIBRARIES)'; test -n "$(installed_testdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(installed_testdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(installed_testdir)/$$f"; \ done clean-installed_testLTLIBRARIES: -test -z "$(installed_test_LTLIBRARIES)" || rm -f $(installed_test_LTLIBRARIES) @list='$(installed_test_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list install-installed_testPROGRAMS: $(installed_test_PROGRAMS) @$(NORMAL_INSTALL) @list='$(installed_test_PROGRAMS)'; test -n "$(installed_testdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(installed_testdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(installed_testdir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ || test -f $$p1 \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(installed_testdir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(installed_testdir)$$dir" || exit $$?; \ } \ ; done uninstall-installed_testPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(installed_test_PROGRAMS)'; test -n "$(installed_testdir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(installed_testdir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(installed_testdir)" && rm -f $$files clean-installed_testPROGRAMS: @list='$(installed_test_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list clean-noinstPROGRAMS: @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list install-installed_testSCRIPTS: $(installed_test_SCRIPTS) @$(NORMAL_INSTALL) @list='$(installed_test_SCRIPTS)'; test -n "$(installed_testdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(installed_testdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(installed_testdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) { files[d] = files[d] " " $$1; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$4, $$1 } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(installed_testdir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(installed_testdir)$$dir" || exit $$?; \ } \ ; done uninstall-installed_testSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(installed_test_SCRIPTS)'; test -n "$(installed_testdir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ dir='$(DESTDIR)$(installed_testdir)'; $(am__uninstall_files_from_dir) mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-installed_test_metaDATA: $(installed_test_meta_DATA) @$(NORMAL_INSTALL) @list='$(installed_test_meta_DATA)'; test -n "$(installed_test_metadir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(installed_test_metadir)'"; \ $(MKDIR_P) "$(DESTDIR)$(installed_test_metadir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(installed_test_metadir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(installed_test_metadir)" || exit $$?; \ done uninstall-installed_test_metaDATA: @$(NORMAL_UNINSTALL) @list='$(installed_test_meta_DATA)'; test -n "$(installed_test_metadir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(installed_test_metadir)'; $(am__uninstall_files_from_dir) install-nobase_installed_testDATA: $(nobase_installed_test_DATA) @$(NORMAL_INSTALL) @list='$(nobase_installed_test_DATA)'; test -n "$(installed_testdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(installed_testdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(installed_testdir)" || exit 1; \ fi; \ $(am__nobase_list) | while read dir files; do \ xfiles=; for file in $$files; do \ if test -f "$$file"; then xfiles="$$xfiles $$file"; \ else xfiles="$$xfiles $(srcdir)/$$file"; fi; done; \ test -z "$$xfiles" || { \ test "x$$dir" = x. || { \ echo " $(MKDIR_P) '$(DESTDIR)$(installed_testdir)/$$dir'"; \ $(MKDIR_P) "$(DESTDIR)$(installed_testdir)/$$dir"; }; \ echo " $(INSTALL_DATA) $$xfiles '$(DESTDIR)$(installed_testdir)/$$dir'"; \ $(INSTALL_DATA) $$xfiles "$(DESTDIR)$(installed_testdir)/$$dir" || exit $$?; }; \ done uninstall-nobase_installed_testDATA: @$(NORMAL_UNINSTALL) @list='$(nobase_installed_test_DATA)'; test -n "$(installed_testdir)" || list=; \ $(am__nobase_strip_setup); files=`$(am__nobase_strip)`; \ dir='$(DESTDIR)$(installed_testdir)'; $(am__uninstall_files_from_dir) tags TAGS: ctags CTAGS: cscope cscopelist: # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ elif test -n "$$redo_logs"; then \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_LTLIBRARIES) $(check_PROGRAMS) $(check_SCRIPTS) $(check_DATA) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_LTLIBRARIES) $(check_PROGRAMS) \ $(check_SCRIPTS) $(check_DATA) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check-local check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(SCRIPTS) $(DATA) installdirs: for dir in "$(DESTDIR)$(installed_testdir)" "$(DESTDIR)$(installed_testdir)" "$(DESTDIR)$(installed_testdir)" "$(DESTDIR)$(installed_test_metadir)" "$(DESTDIR)$(installed_testdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-checkLTLIBRARIES clean-checkPROGRAMS clean-generic \ clean-installed_testLTLIBRARIES clean-installed_testPROGRAMS \ clean-libtool clean-noinstLTLIBRARIES clean-noinstPROGRAMS \ mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-installed_testLTLIBRARIES \ install-installed_testPROGRAMS install-installed_testSCRIPTS \ install-installed_test_metaDATA \ install-nobase_installed_testDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-installed_testLTLIBRARIES \ uninstall-installed_testPROGRAMS \ uninstall-installed_testSCRIPTS \ uninstall-installed_test_metaDATA \ uninstall-nobase_installed_testDATA .MAKE: all check check-am install install-am install-strip .PHONY: all all-am check check-TESTS check-am check-local clean \ clean-checkLTLIBRARIES clean-checkPROGRAMS clean-generic \ clean-installed_testLTLIBRARIES clean-installed_testPROGRAMS \ clean-libtool clean-noinstLTLIBRARIES clean-noinstPROGRAMS \ cscopelist-am ctags-am distclean distclean-generic \ distclean-libtool distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am \ install-installed_testLTLIBRARIES \ install-installed_testPROGRAMS install-installed_testSCRIPTS \ install-installed_test_metaDATA install-man \ install-nobase_installed_testDATA install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am recheck tags-am \ uninstall uninstall-am uninstall-installed_testLTLIBRARIES \ uninstall-installed_testPROGRAMS \ uninstall-installed_testSCRIPTS \ uninstall-installed_test_metaDATA \ uninstall-nobase_installed_testDATA .PRECIOUS: Makefile ### testing rules # test: run all tests in cwd and subdirs test: test-nonrecursive @OS_UNIX_TRUE@ @ for subdir in $(SUBDIRS) . ; do \ @OS_UNIX_TRUE@ test "$$subdir" = "." -o "$$subdir" = "po" || \ @OS_UNIX_TRUE@ ( cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $@ ) || exit $? ; \ @OS_UNIX_TRUE@ done # test-nonrecursive: run tests only in cwd @OS_UNIX_TRUE@test-nonrecursive: ${TEST_PROGS} @OS_UNIX_TRUE@ @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} @OS_UNIX_FALSE@test-nonrecursive: # 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 ; \ echo '' >> $@.xml ; \ echo '' >> $@.xml ; \ echo ' $(PACKAGE)' >> $@.xml ; \ echo ' $(VERSION)' >> $@.xml ; \ echo " $$REVISION" >> $@.xml ; \ echo '' >> $@.xml ; \ for lf in `ls -L "$$GTESTER_LOGDIR"/.` ; do \ sed '1,1s/^?]*?>//' <"$$GTESTER_LOGDIR"/"$$lf" >> $@.xml ; \ done ; \ echo >> $@.xml ; \ echo '' >> $@.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 @ENABLE_INSTALLED_TESTS_TRUE@%.test: %$(EXEEXT) Makefile @ENABLE_INSTALLED_TESTS_TRUE@ $(AM_V_GEN) (echo '[Test]' > $@.tmp; \ @ENABLE_INSTALLED_TESTS_TRUE@ echo 'Type=session' >> $@.tmp; \ @ENABLE_INSTALLED_TESTS_TRUE@ echo 'Exec=$(installed_testdir)/$<' >> $@.tmp; \ @ENABLE_INSTALLED_TESTS_TRUE@ mv $@.tmp $@) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: pkg-config-0.29.1/glib/test-driver0000755000175000017500000001104012601774026013664 00000000000000#! /bin/sh # test-driver - basic testsuite driver script. scriptversion=2013-07-13.22; # UTC # Copyright (C) 2011-2014 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, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . # Make unconditional expansion of undefined variables an error. This # helps a lot in preventing typo-related bugs. set -u usage_error () { echo "$0: $*" >&2 print_usage >&2 exit 2 } print_usage () { cat <$log_file 2>&1 estatus=$? if test $enable_hard_errors = no && test $estatus -eq 99; then tweaked_estatus=1 else tweaked_estatus=$estatus fi case $tweaked_estatus:$expect_failure in 0:yes) col=$red res=XPASS recheck=yes gcopy=yes;; 0:*) col=$grn res=PASS recheck=no gcopy=no;; 77:*) col=$blu res=SKIP recheck=no gcopy=yes;; 99:*) col=$mgn res=ERROR recheck=yes gcopy=yes;; *:yes) col=$lgn res=XFAIL recheck=no gcopy=yes;; *:*) col=$red res=FAIL recheck=yes gcopy=yes;; esac # Report the test outcome and exit status in the logs, so that one can # know whether the test passed or failed simply by looking at the '.log' # file, without the need of also peaking into the corresponding '.trs' # file (automake bug#11814). echo "$res $test_name (exit status: $estatus)" >>$log_file # Report outcome to console. echo "${col}${res}${std}: $test_name" # Register the test result, and other relevant metadata. echo ":test-result: $res" > $trs_file echo ":global-test-result: $res" >> $trs_file echo ":recheck: $recheck" >> $trs_file echo ":copy-in-global-log: $gcopy" >> $trs_file # 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: pkg-config-0.29.1/glib/config.sub0000755000175000017500000010624612601774025013465 00000000000000#! /bin/sh # Configuration validation subroutine script. # Copyright 1992-2015 Free Software Foundation, Inc. timestamp='2015-01-01' # This file 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 3 of the License, 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, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # Please send patches to . # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright 1992-2015 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." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ knetbsd*-gnu* | netbsd*-gnu* | \ kopensolaris*-gnu* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; android-linux) os=-linux-android basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray | -microblaze*) os= basic_machine=$1 ;; -bluegene*) os=-cnk ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco6) os=-sco5v6 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5v6*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*178) os=-lynxos178 ;; -lynx*5) os=-lynxos5 ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | aarch64 | aarch64_be \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arceb \ | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ | avr | avr32 \ | be32 | be64 \ | bfin \ | c4x | c8051 | clipper \ | d10v | d30v | dlx | dsp16xx \ | epiphany \ | fido | fr30 | frv | ft32 \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | hexagon \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | k1om \ | le32 | le64 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64octeon | mips64octeonel \ | mips64orion | mips64orionel \ | mips64r5900 | mips64r5900el \ | mips64vr | mips64vrel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa32r6 | mipsisa32r6el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64r6 | mipsisa64r6el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipsr5900 | mipsr5900el \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ | nds32 | nds32le | nds32be \ | nios | nios2 | nios2eb | nios2el \ | ns16k | ns32k \ | open8 | or1k | or1knd | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle \ | pyramid \ | riscv32 | riscv64 \ | rl78 | rx \ | score \ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu \ | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ | ubicom32 \ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ | visium \ | we32k \ | x86 | xc16x | xstormy16 | xtensa \ | z8k | z80) basic_machine=$basic_machine-unknown ;; c54x) basic_machine=tic54x-unknown ;; c55x) basic_machine=tic55x-unknown ;; c6x) basic_machine=tic6x-unknown ;; leon|leon[3-9]) basic_machine=sparc-$basic_machine ;; m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip) basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; ms1) basic_machine=mt-unknown ;; strongarm | thumb | xscale) basic_machine=arm-unknown ;; xgate) basic_machine=$basic_machine-unknown os=-none ;; xscaleeb) basic_machine=armeb-unknown ;; xscaleel) basic_machine=armel-unknown ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | aarch64-* | aarch64_be-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | be32-* | be64-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* \ | c8051-* | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | hexagon-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | k1om-* \ | le32-* | le64-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ | microblaze-* | microblazeel-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64octeon-* | mips64octeonel-* \ | mips64orion-* | mips64orionel-* \ | mips64r5900-* | mips64r5900el-* \ | mips64vr-* | mips64vrel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa32r6-* | mipsisa32r6el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64r6-* | mipsisa64r6el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipsr5900-* | mipsr5900el-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nds32-* | nds32le-* | nds32be-* \ | nios-* | nios2-* | nios2eb-* | nios2el-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | open8-* \ | or1k*-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ | pyramid-* \ | rl78-* | romp-* | rs6000-* | rx-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \ | tahoe-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tile*-* \ | tron-* \ | ubicom32-* \ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ | vax-* \ | visium-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* \ | xstormy16-* | xtensa*-* \ | ymp-* \ | z8k-* | z80-*) ;; # Recognize the basic CPU types without company name, with glob match. xtensa*) basic_machine=$basic_machine-unknown ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aros) basic_machine=i386-pc os=-aros ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; blackfin) basic_machine=bfin-unknown os=-linux ;; blackfin-*) basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; bluegene*) basic_machine=powerpc-ibm os=-cnk ;; c54x-*) basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c55x-*) basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c6x-*) basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c90) basic_machine=c90-cray os=-unicos ;; cegcc) basic_machine=arm-unknown os=-cegcc ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16 | cr16-*) basic_machine=cr16-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; dicos) basic_machine=i686-pc os=-dicos ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; leon-*|leon[3-9]-*) basic_machine=sparc-`echo $basic_machine | sed 's/-.*//'` ;; m68knommu) basic_machine=m68k-unknown os=-linux ;; m68knommu-*) basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; microblaze*) basic_machine=microblaze-xilinx ;; mingw64) basic_machine=x86_64-pc os=-mingw64 ;; mingw32) basic_machine=i686-pc os=-mingw32 ;; mingw32ce) basic_machine=arm-unknown os=-mingw32ce ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; moxiebox) basic_machine=moxie-unknown os=-moxiebox ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; msys) basic_machine=i686-pc os=-msys ;; mvs) basic_machine=i370-ibm os=-mvs ;; nacl) basic_machine=le32-unknown os=-nacl ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; neo-tandem) basic_machine=neo-tandem ;; nse-tandem) basic_machine=nse-tandem ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; parisc) basic_machine=hppa-unknown os=-linux ;; parisc-*) basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc | ppcbe) basic_machine=powerpc-unknown ;; ppc-* | ppcbe-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-* | ppc64p7-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rdos | rdos64) basic_machine=x86_64-pc os=-rdos ;; rdos32) basic_machine=i386-pc os=-rdos ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sde) basic_machine=mipsisa32-sde os=-elf ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh5el) basic_machine=sh5le-unknown ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; strongarm-* | thumb-*) basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tile*) basic_machine=$basic_machine-unknown os=-linux-gnu ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; xscale-* | xscalee[bl]-*) basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; z80-*-coff) basic_machine=z80-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -auroraux) os=-auroraux ;; -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ | -sym* | -kopensolaris* | -plan9* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* | -aros* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ | -bitrig* | -openbsd* | -solidbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* | -cegcc* \ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ | -linux-newlib* | -linux-musl* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* | -tirtos*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -zvmoe) os=-zvmoe ;; -dicos*) os=-dicos ;; -nacl*) ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in score-*) os=-elf ;; spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; c8051-*) os=-elf ;; hexagon-*) os=-elf ;; tic54x-*) os=-coff ;; tic55x-*) os=-coff ;; tic6x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 ;; m68*-cisco) os=-aout ;; mep-*) os=-elf ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-haiku) os=-haiku ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -cnk*|-aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: pkg-config-0.29.1/glib/AUTHORS0000664000175000017500000000250012275467762012556 00000000000000Below are just a few of the people who have contributed to GLib. Please don't mail these people about problems you have with GTK+; see the README file for information about filing bugs and submitting patches. GLib-2.0 Team ------------- Hans Breuer Matthias Clasen Tor Lillqvist Tim Janik Havoc Pennington Ron Steinke Owen Taylor Sebastian Wilhelmi GLib-1.2 Team ------------- Shawn T. Amundson Jeff Garzik Raja R Harinath Tim Janik Elliot Lee Tor Lillqvist Paolo Molaro Havoc Pennington Manish Singh Owen Taylor Sebastian Wilhelmi The random number generator "Mersenne Twister", which is used by GLib, was developed and originally coded by: Makoto Matsumoto Takuji Nishimura Original Authors ---------------- Peter Mattis Spencer Kimball Josh MacDonald pkg-config-0.29.1/glib/configure.ac0000664000175000017500000030555612665154435014006 00000000000000# Process this file with autoconf to produce a configure script. AC_PREREQ([2.62]) dnl *********************************** dnl *** include special GLib macros *** dnl *********************************** m4_define(glib_configure_ac) # # The following version number definitions apply to GLib, GModule, GObject, # GThread and GIO as a whole, so if changes occurred in any of them, they are # all treated with the same interface and binary age. # # Making releases: # glib_micro_version += 1; # glib_interface_age += 1; # glib_binary_age += 1; # if any functions have been added, set glib_interface_age to 0. # if backwards compatibility has been broken, # set glib_binary_age _and_ glib_interface_age to 0. # # remember to add a GLIB_VERSION_2_xx macro every time the minor version is # bumped, as well as the GLIB_DEPRECATED_IN and GLIB_AVAILABLE_IN macros # for that version - see gversion.h for further information. # # in easier to understand terms: # # on the stable branch, interface age == micro # on the unstable (ie master), interface age = 0 m4_define([glib_major_version], [2]) 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], [glib_major_version.glib_minor_version.glib_micro_version]) # libtool version related macros m4_define([glib_lt_release], [glib_major_version.glib_minor_version]) m4_define([glib_lt_current], [m4_eval(100 * glib_minor_version + glib_micro_version - glib_interface_age)]) m4_define([glib_lt_revision], [glib_interface_age]) m4_define([glib_lt_age], [m4_eval(glib_binary_age - glib_interface_age)]) m4_define([glib_lt_current_minus_age], [m4_eval(glib_lt_current - glib_lt_age)]) # if the minor version number is odd, then we want debugging. Otherwise # we only want minimal debugging support. m4_define([glib_debug_default], [m4_if(m4_eval(glib_minor_version % 2), [1], [yes], [minimum])])dnl AC_INIT(glib, [glib_version], [http://bugzilla.gnome.org/enter_bug.cgi?product=glib]) AC_CONFIG_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 -Wno-portability no-define no-dist-gzip dist-xz tar-ustar foreign]) AM_MAINTAINER_MODE([enable]) # Support silent build rules. Disable # by either passing --disable-silent-rules to configure or passing V=1 # to make AM_SILENT_RULES([yes]) GLIB_MAJOR_VERSION=glib_major_version GLIB_MINOR_VERSION=glib_minor_version GLIB_MICRO_VERSION=glib_micro_version GLIB_INTERFACE_AGE=glib_interface_age GLIB_BINARY_AGE=glib_binary_age GLIB_VERSION=glib_version AC_SUBST(GLIB_MAJOR_VERSION) AC_SUBST(GLIB_MINOR_VERSION) AC_SUBST(GLIB_MICRO_VERSION) AC_SUBST(GLIB_VERSION) AC_SUBST(GLIB_INTERFACE_AGE) AC_SUBST(GLIB_BINARY_AGE) AC_DEFINE(GLIB_MAJOR_VERSION, [glib_major_version], [Define to the GLIB major version]) AC_DEFINE(GLIB_MINOR_VERSION, [glib_minor_version], [Define to the GLIB minor version]) AC_DEFINE(GLIB_MICRO_VERSION, [glib_micro_version], [Define to the GLIB micro version]) AC_DEFINE(GLIB_INTERFACE_AGE, [glib_interface_age], [Define to the GLIB interface age]) AC_DEFINE(GLIB_BINARY_AGE, [glib_binary_age], [Define to the GLIB binary age]) # libtool versioning LT_RELEASE=glib_lt_release LT_CURRENT=glib_lt_current LT_REVISION=glib_lt_revision LT_AGE=glib_lt_age LT_CURRENT_MINUS_AGE=glib_lt_current_minus_age AC_SUBST(LT_RELEASE) AC_SUBST(LT_CURRENT) AC_SUBST(LT_REVISION) AC_SUBST(LT_AGE) AC_SUBST(LT_CURRENT_MINUS_AGE) dnl Checks for programs. AC_PROG_CC AC_PROG_CPP AC_USE_SYSTEM_EXTENSIONS AM_CONDITIONAL(HAVE_GCC, [test "$GCC" = "yes"]) AC_CANONICAL_HOST AC_MSG_CHECKING([for the BeOS]) case $host in *-*-beos*) glib_native_beos="yes" ;; *) glib_native_beos="no" ;; esac AC_MSG_RESULT([$glib_native_beos]) dnl AC_MSG_CHECKING([for Win32]) LIB_EXE_MACHINE_FLAG=X86 case "$host" in *-*-mingw*) glib_native_win32=yes glib_pid_type='void *' glib_cv_stack_grows=no # Unfortunately the mingw implementations of C99-style snprintf and vsnprintf # don't seem to be quite good enough, at least not in mingw-runtime-3.14. # (Sorry, I don't know exactly what is the problem, but it is related to # floating point formatting and decimal point vs. comma.) # The simple tests in AC_FUNC_VSNPRINTF_C99 and AC_FUNC_SNPRINTF_C99 aren't # rigorous enough to notice, though. # So preset the autoconf cache variables. ac_cv_func_vsnprintf_c99=no ac_cv_func_snprintf_c99=no case "$host" in x86_64-*-*) LIB_EXE_MACHINE_FLAG=X64 ;; esac AC_DEFINE([_WIN32_WINNT], [0x0501], [Target the Windows XP API]) ;; *) glib_native_win32=no glib_pid_type=int ;; esac case $host in *-*-linux*) glib_os_linux=yes ;; 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 AC_MSG_CHECKING([for Mac OS X Carbon support]) AC_TRY_CPP([ #include #include ], glib_have_carbon=yes) AC_MSG_RESULT([$glib_have_carbon]) glib_have_cocoa=no AC_MSG_CHECKING([for Mac OS X Cocoa support]) AC_TRY_CPP([ #include #ifdef GNUSTEP_BASE_VERSION #error "Detected GNUstep, not Cocoa" #endif ], glib_have_cocoa=yes) AC_MSG_RESULT([$glib_have_cocoa]) AM_CONDITIONAL(OS_WIN32, [test "$glib_native_win32" = "yes"]) AM_CONDITIONAL(OS_WIN32_X64, [test "$LIB_EXE_MACHINE_FLAG" = "X64"]) AM_CONDITIONAL(OS_UNIX, [test "$glib_native_win32" != "yes"]) AM_CONDITIONAL(OS_LINUX, [test "$glib_os_linux" = "yes"]) AM_CONDITIONAL(OS_CARBON, [test "$glib_have_carbon" = "yes"]) AM_CONDITIONAL(OS_COCOA, [test "$glib_have_cocoa" = "yes"]) 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.]) fi AC_CHECK_TOOL(NM, nm, no) if test "$NM" = no; then AC_MSG_ERROR([*** Could not find an implementation of nm in your PATH.]) fi AC_CHECK_TOOL(RANLIB, ranlib, :) AC_CHECK_TOOL(DLLTOOL, dlltool, :) AC_CHECK_PROG(ms_librarian, [lib.exe], [yes], [no]) ]) AM_CONDITIONAL(MS_LIB_AVAILABLE, [test x$ms_librarian = xyes]) AS_IF([test "x$glib_have_carbon" = "xyes"], [ AC_DEFINE(HAVE_CARBON, 1, [define to 1 if Carbon is available]) LDFLAGS="$LDFLAGS -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 dnl declare --enable-* args and collect ac_help strings AC_ARG_ENABLE(debug, 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, [AS_HELP_STRING([--enable-gc-friendly], [turn on garbage collector friendliness [default=no]])],, [enable_gc_friendly=no]) AC_ARG_ENABLE(mem_pools, [AS_HELP_STRING([--disable-mem-pools], [disable all glib memory pools])],, [disable_mem_pools=no]) AC_ARG_ENABLE(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]) 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]) ], [ AC_MSG_RESULT([no]) ]) AC_MSG_CHECKING([whether to disable memory pools]) AS_IF([test "x$disable_mem_pools" = "xno"], [ AC_MSG_RESULT([no]) ], [ AC_DEFINE(DISABLE_MEM_POOLS, [1], [Whether to disable memory pools]) AC_MSG_RESULT([yes]) ]) dnl location to install runtime libraries, e.g. ../../lib to install dnl to /lib if libdir is /usr/lib AC_ARG_WITH(runtime-libdir, [AS_HELP_STRING([--with-runtime-libdir=RELPATH], [install runtime libraries relative to libdir])], [], [with_runtime_libdir=""]) GLIB_RUNTIME_LIBDIR="$with_runtime_libdir" ABS_GLIB_RUNTIME_LIBDIR="`readlink -f $libdir/$with_runtime_libdir`" AC_SUBST(GLIB_RUNTIME_LIBDIR) AC_SUBST(ABS_GLIB_RUNTIME_LIBDIR) AM_CONDITIONAL(HAVE_GLIB_RUNTIME_LIBDIR, [test "x$with_runtime_libdir" != "x"]) dnl Check for a working C++ compiler, but do not bail out, if none is found. AC_CHECK_TOOLS(CXX, [$CCC c++ g++ gcc CC cxx cc++ cl], [gcc]) AC_LANG_SAVE AC_LANG_CPLUSPLUS AC_TRY_COMPILE(,[class a { int b; } c;], ,CXX=) AM_CONDITIONAL(HAVE_CXX, [test "$CXX" != ""]) AC_LANG_RESTORE AM_PROG_CC_C_O AC_PROG_INSTALL AC_SYS_LARGEFILE if test "x$enable_debug" = "xyes"; then if test x$cflags_set != xset ; then case " $CFLAGS " in *[[\ \ ]]-g[[\ \ ]]*) ;; *) CFLAGS="$CFLAGS -g" ;; esac fi GLIB_DEBUG_FLAGS="-DG_ENABLE_DEBUG" else GLIB_DEBUG_FLAGS="-DG_DISABLE_CAST_CHECKS" if test "x$enable_debug" = "xno"; then GLIB_DEBUG_FLAGS="$GLIB_DEBUG_FLAGS -DG_DISABLE_ASSERT -DG_DISABLE_CHECKS" fi fi # Ensure MSVC-compatible struct packing convention is used when # compiling for Win32 with gcc. # What flag to depends on gcc version: gcc3 uses "-mms-bitfields", while # gcc2 uses "-fnative-struct". if test x"$glib_native_win32" = xyes; then if test x"$GCC" = xyes; then msnative_struct='' AC_MSG_CHECKING([how to get MSVC-compatible struct packing]) if test -z "$ac_cv_prog_CC"; then our_gcc="$CC" else our_gcc="$ac_cv_prog_CC" fi case `$our_gcc --version | sed -e 's,\..*,.,' -e q` in 2.) if $our_gcc -v --help 2>/dev/null | grep fnative-struct >/dev/null; then msnative_struct='-fnative-struct' fi ;; *) if $our_gcc -v --help 2>/dev/null | grep ms-bitfields >/dev/null; then msnative_struct='-mms-bitfields' fi ;; esac if test x"$msnative_struct" = x ; then AC_MSG_RESULT([no way]) AC_MSG_WARN([produced libraries might be incompatible with MSVC-compiled code]) else CFLAGS="$CFLAGS $msnative_struct" AC_MSG_RESULT([${msnative_struct}]) fi fi fi GLIB_EXTRA_CFLAGS="${msnative_struct}" AC_SUBST(GLIB_EXTRA_CFLAGS) AC_EXEEXT # define a MAINT-like variable REBUILD which is set if Perl # and awk are found, so autogenerated sources can be rebuilt AC_PROG_AWK AC_CHECK_PROGS(PERL, [perl5 perl]) # We would like indent, but don't require it. AC_CHECK_PROG(INDENT, indent, indent) REBUILD=\# if test "x$enable_rebuilds" = "xyes" && \ test -n "$PERL" && \ $PERL -e 'exit !($] >= 5.002)' > /dev/null 2>&1 && \ test -n "$AWK" ; then REBUILD= fi AC_SUBST(REBUILD) # Need full path to Perl for glib-mkenums # if test "x$PERL" != x ; then AC_PATH_PROG(PERL_PATH, [$PERL]) fi if test "x$PERL_PATH" = x ; then PERL_PATH="/usr/bin/env perl" fi AC_SUBST(PERL_PATH) # 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") dnl *********************** dnl *** Tests for iconv *** dnl *********************** dnl dnl We do this before the gettext checks, to avoid distortion dnl On Windows we use a native implementation AS_IF([ test x"$glib_native_win32" = xyes], [ with_libiconv=native ], [ AC_ARG_WITH(libiconv, [AS_HELP_STRING([--with-libiconv=@<:@no/gnu/native@:>@], [use the libiconv library])],, [with_libiconv=maybe]) found_iconv=no case $with_libiconv in maybe) # Check in the C library first AC_CHECK_FUNC(iconv_open, [with_libiconv=no; found_iconv=yes]) # Check if we have GNU libiconv if test $found_iconv = "no"; then AC_CHECK_LIB(iconv, libiconv_open, [with_libiconv=gnu; found_iconv=yes]) fi # Check if we have a iconv in -liconv, possibly from vendor if test $found_iconv = "no"; then AC_CHECK_LIB(iconv, iconv_open, [with_libiconv=native; found_iconv=yes]) fi ;; no) AC_CHECK_FUNC(iconv_open, [with_libiconv=no; found_iconv=yes]) ;; gnu|yes) AC_CHECK_LIB(iconv, libiconv_open, [with_libiconv=gnu; found_iconv=yes]) ;; native) AC_CHECK_LIB(iconv, iconv_open, [with_libiconv=native; found_iconv=yes]) ;; esac if test "x$found_iconv" = "xno" ; then AC_MSG_ERROR([*** No iconv() implementation found in C library or libiconv]) fi ]) dnl dnl gettext support dnl GETTEXT_PACKAGE=glib20 AC_SUBST(GETTEXT_PACKAGE) AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE, ["$GETTEXT_PACKAGE"], [Define the gettext package to be used]) AC_DEFINE_UNQUOTED([GLIB_LOCALE_DIR], [""], [Dummy catalog directory]) dnl dnl Now we are done with gettext checks, figure out ICONV_LIBS dnl AS_IF([test x"$glib_native_win32" != xyes], [ if test x$with_libiconv != xno ; then case " $INTLLIBS " in *[[\ \ ]]-liconv[[\ \ ]]*) ;; *) ICONV_LIBS="-liconv" ;; esac fi ]) AC_SUBST(ICONV_LIBS) case $with_libiconv in gnu) AC_DEFINE(USE_LIBICONV_GNU, 1, [Using GNU libiconv]) ;; native) AC_DEFINE(USE_LIBICONV_NATIVE, 1, [Using a native implementation of iconv in a separate library]) ;; esac dnl Ensure we do a static-only build. This really only matters on Windows, dnl but it's safer to do it for all platforms. enable_static=yes enable_shared=no dnl Initialize libtool LT_PREREQ([2.2]) LT_INIT([disable-static win32-dll]) dnl when using libtool 2.x create libtool early, because it's used in configure m4_ifdef([LT_OUTPUT], [LT_OUTPUT]) 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 if test x$enable_static = xyes; then glib_win32_static_compilation=yes GLIB_WIN32_STATIC_COMPILATION_DEFINE="#define GLIB_STATIC_COMPILATION 1 #define GOBJECT_STATIC_COMPILATION 1" AC_SUBST(GLIB_WIN32_STATIC_COMPILATION_DEFINE) 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 AS_IF([test $cross_compiling != yes], [ AC_MSG_CHECKING([for extra flags to get ANSI library prototypes]) glib_save_LIBS=$LIBS LIBS="$LIBS -lm" AC_TRY_RUN([#include int main (void) { return (log(1) != log(1.)); }], AC_MSG_RESULT(none needed), glib_save_CFLAGS=$CFLAGS CFLAGS="$CFLAGS -std1" AC_TRY_RUN([#include int main (void) { return (log(1) != log(1.)); }], AC_MSG_RESULT(-std1), AC_MSG_RESULT() CFLAGS=$glib_save_CFLAGS AC_MSG_WARN( [No ANSI prototypes found in library. (-std1 didn't work.)]) ) ) LIBS=$glib_save_LIBS ]) dnl NeXTStep cc seems to need this AC_MSG_CHECKING([for extra flags for POSIX compliance]) AC_TRY_COMPILE([#include ], [DIR *dir;], AC_MSG_RESULT(none needed), glib_save_CFLAGS=$CFLAGS CFLAGS="$CFLAGS -posix" AC_TRY_COMPILE([#include ], [DIR *dir;], AC_MSG_RESULT(-posix), AC_MSG_RESULT() CFLAGS=$glib_save_CFLAGS AC_MSG_WARN([Could not determine POSIX flag. (-posix didn't work.)]))) # Checks for library functions. AC_FUNC_VPRINTF AC_FUNC_ALLOCA 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 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) AC_CHECK_SIZEOF(int) AC_CHECK_SIZEOF(void *) AC_CHECK_SIZEOF(long long) AC_CHECK_SIZEOF(__int64) AC_CACHE_CHECK([for sig_atomic_t], ac_cv_type_sig_atomic_t, [AC_TRY_LINK([#include #include sig_atomic_t val = 42;], [return val == 42 ? 0 : 1], ac_cv_type_sig_atomic_t=yes, ac_cv_type_sig_atomic_t=no)]) if test x$ac_cv_type_sig_atomic_t = xyes; then AC_DEFINE(HAVE_SIG_ATOMIC_T, 1, [Define if you have the 'sig_atomic_t' type.]) fi if test x$ac_cv_sizeof_long = x8 || test x$ac_cv_sizeof_long_long = x8 || test x$ac_cv_sizeof___int64 = x8 ; then : else AC_MSG_ERROR([ *** GLib requires a 64 bit type. You might want to consider *** using the GNU C compiler. ]) fi 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,[ for format in ll q I64; do AC_TRY_RUN([#include int main() { long long b, a = -0x3AFAFAFAFAFAFAFALL; char buffer[1000]; sprintf (buffer, "%${format}u", a); sscanf (buffer, "%${format}u", &b); exit (b!=a); } ], [glib_cv_long_long_format=${format} break], [],[:]) done]) 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 ], [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 glib_cv_long_long_format=I64 AC_MSG_RESULT(%${glib_cv_long_long_format}u) AC_DEFINE(HAVE_LONG_LONG_FORMAT,1,[define if system printf can print long long]) AC_DEFINE(HAVE_INT64_AND_I64,1,[define to support printing 64-bit integers with format I64]) ]) AC_C_CONST dnl dnl check in which direction the stack grows dnl AC_CACHE_CHECK([for growing stack pointer],glib_cv_stack_grows,[ AC_TRY_RUN([ volatile int *a = 0, *b = 0; void foo (void); int main () { volatile int y = 7; a = &y; foo (); return b > a; } void foo (void) { volatile int x = 5; b = &x; } ], glib_cv_stack_grows=no , glib_cv_stack_grows=yes ,) ]) dnl AC_C_INLINE is useless to us since it bails out too early, we need to dnl truely know which ones of `inline', `__inline' and `__inline__' are dnl actually supported. AC_CACHE_CHECK([for __inline],glib_cv_has__inline,[ AC_COMPILE_IFELSE([AC_LANG_SOURCE([[ __inline int foo () { return 0; } int main () { return foo (); } ]])], glib_cv_has__inline=yes , glib_cv_has__inline=no ,) ]) case x$glib_cv_has__inline in xyes) AC_DEFINE(G_HAVE___INLINE,1,[Have __inline keyword]) esac AC_CACHE_CHECK([for __inline__],glib_cv_has__inline__,[ AC_COMPILE_IFELSE([AC_LANG_SOURCE([[ __inline__ int foo () { return 0; } int main () { return foo (); } ]])], glib_cv_has__inline__=yes , glib_cv_has__inline__=no ,) ]) case x$glib_cv_has__inline__ in xyes) AC_DEFINE(G_HAVE___INLINE__,1,[Have __inline__ keyword]) esac AC_CACHE_CHECK([for inline], glib_cv_hasinline,[ AC_COMPILE_IFELSE([AC_LANG_SOURCE([[ #undef inline inline int foo () { return 0; } int main () { return foo (); } ]])], glib_cv_hasinline=yes , glib_cv_hasinline=no ,) ]) case x$glib_cv_hasinline in xyes) AC_DEFINE(G_HAVE_INLINE,1,[Have inline keyword]) esac # if we can use inline functions in headers AC_MSG_CHECKING(if inline functions in headers work) AC_LINK_IFELSE([AC_LANG_SOURCE([[ #if defined (G_HAVE_INLINE) && defined (__GNUC__) && defined (__STRICT_ANSI__) # undef inline # define inline __inline__ #elif !defined (G_HAVE_INLINE) # undef inline # if defined (G_HAVE___INLINE__) # define inline __inline__ # elif defined (G_HAVE___INLINE) # define inline __inline # endif #endif int glib_test_func2 (int); static inline int glib_test_func1 (void) { return glib_test_func2 (1); } int main (void) { int i = 1; }]])],[g_can_inline=yes],[g_can_inline=no]) AC_MSG_RESULT($g_can_inline) dnl *** check for working do while(0) macros *** AC_CACHE_CHECK([for working do while(0) macros], g_cv_support_dowhile_macros, [ AC_TRY_COMPILE([],[ #define STMT_START do #define STMT_END while(0) #define STMT_TEST STMT_START { i = 0; } STMT_END int main(void) { int i = 1; STMT_TEST; return i; }], [g_cv_support_dowhile_macros=yes], [g_cv_support_dowhile_macros=no], [g_cv_support_dowhile_macros=yes]) ]) if test x$g_cv_support_dowhile_macros = xyes; then AC_DEFINE(HAVE_DOWHILE_MACROS, 1, [define for working do while(0) macros]) fi # check for flavours of varargs macros AC_MSG_CHECKING(for ISO C99 varargs macros in C) AC_TRY_COMPILE([],[ int a(int p1, int p2, int p3); #define call_a(...) a(1,__VA_ARGS__) call_a(2,3); ],g_have_iso_c_varargs=yes,g_have_iso_c_varargs=no) AC_MSG_RESULT($g_have_iso_c_varargs) AC_MSG_CHECKING(for ISO C99 varargs macros in C++) AS_IF([test "$CXX" = ""], [ dnl No C++ compiler g_have_iso_cxx_varargs=no else AC_LANG_CPLUSPLUS AC_TRY_COMPILE([],[ int a(int p1, int p2, int p3); #define call_a(...) a(1,__VA_ARGS__) call_a(2,3); ],g_have_iso_cxx_varargs=yes,g_have_iso_cxx_varargs=no) AC_LANG_C ]) AC_MSG_RESULT($g_have_iso_cxx_varargs) AC_MSG_CHECKING(for GNUC varargs macros) AC_TRY_COMPILE([],[ int a(int p1, int p2, int p3); #define call_a(params...) a(1,params) call_a(2,3); ],g_have_gnuc_varargs=yes,g_have_gnuc_varargs=no) AC_MSG_RESULT($g_have_gnuc_varargs) # check for GNUC visibility support AC_MSG_CHECKING(for GNUC visibility attribute) GLIB_CHECK_COMPILE_WARNINGS([AC_LANG_SOURCE([[ void __attribute__ ((visibility ("hidden"))) f_hidden (void) { } void __attribute__ ((visibility ("internal"))) f_internal (void) { } void __attribute__ ((visibility ("protected"))) f_protected (void) { } void __attribute__ ((visibility ("default"))) f_default (void) { } int main (void) { f_hidden(); f_internal(); f_protected(); f_default(); return 0; } ]])],g_have_gnuc_visibility=yes,g_have_gnuc_visibility=no) AC_MSG_RESULT($g_have_gnuc_visibility) AM_CONDITIONAL(HAVE_GNUC_VISIBILITY, [test x$g_have_gnuc_visibility = xyes]) AC_MSG_CHECKING([whether using Sun Studio C compiler]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#if defined(__SUNPRO_C) || (__SUNPRO_C >= 0x550) #else # include "error: this is not Sun Studio." #endif ]], [[]])], [ g_have_sunstudio_visibility=yes ], [ g_have_sunstudio_visibility=no ]) AC_MSG_RESULT($g_have_sunstudio_visibility) AM_CONDITIONAL(HAVE_SUNSTUDIO_VISIBILITY, [test x$g_have_sunstudio_visibility = xyes]) # check for bytesex stuff AC_C_BIGENDIAN if test x$ac_cv_c_bigendian = xuniversal ; then AC_TRY_COMPILE([#include ], [#if __BYTE_ORDER == __BIG_ENDIAN #else #error Not a big endian. #endif], ac_cv_c_bigendian=yes ,AC_TRY_COMPILE([#include ], [#if __BYTE_ORDER == __LITTLE_ENDIAN #else #error Not a little endian. #endif], ac_cv_c_bigendian=no ,AC_MSG_WARN([Could not determine endianness.]))) fi # check for header files 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 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]) AC_CHECK_HEADERS([sys/prctl.h]) AC_CHECK_HEADERS([sys/mount.h sys/sysctl.h], [], [], [#if HAVE_SYS_PARAM_H #include #endif ]) AC_CHECK_FUNCS(sysctlbyname) AC_CHECK_HEADERS([xlocale.h]) # check for structure fields AC_CHECK_MEMBERS([struct stat.st_mtimensec, struct stat.st_mtim.tv_nsec, struct stat.st_atimensec, struct stat.st_atim.tv_nsec, struct stat.st_ctimensec, struct stat.st_ctim.tv_nsec]) AC_CHECK_MEMBERS([struct stat.st_blksize, struct stat.st_blocks, struct statfs.f_fstypename, struct statfs.f_bavail],,, [#include #include #include #ifdef HAVE_SYS_STATFS_H #include #endif #ifdef HAVE_SYS_PARAM_H #include #endif #ifdef HAVE_SYS_MOUNT_H #include #endif]) # struct statvfs.f_basetype is available on Solaris but not for Linux. AC_CHECK_MEMBERS([struct statvfs.f_basetype],,, [#include ]) AC_CHECK_MEMBERS([struct statvfs.f_fstypename],,, [#include ]) AC_CHECK_MEMBERS([struct tm.tm_gmtoff, struct tm.__tm_gmtoff],,,[#include ]) AC_STRUCT_DIRENT_D_TYPE # Checks for libcharset 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 should be long or int AC_MSG_CHECKING([for the appropriate definition for size_t]) case $ac_cv_sizeof_size_t in $ac_cv_sizeof_short) glib_size_type=short ;; $ac_cv_sizeof_int) glib_size_type=int ;; $ac_cv_sizeof_long) glib_size_type=long ;; $ac_cv_sizeof_long_long) glib_size_type='long long' ;; $ac_cv_sizeof__int64) glib_size_type='__int64' ;; *) AC_MSG_ERROR([No type matching size_t in size]) ;; esac dnl If int/long are the same size, we see which one produces dnl warnings when used in the location as size_t. (This matters dnl on AIX with xlc) dnl 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 #endif #include int main () { size_t s = 1; unsigned int *size_int = &s; return (int)*size_int; } ]])],glib_size_type=int, [GLIB_CHECK_COMPILE_WARNINGS([AC_LANG_SOURCE([[ #if defined(_AIX) && !defined(__GNUC__) #pragma options langlvl=stdc89 #endif #include int main () { size_t s = 1; unsigned long *size_long = &s; return (int)*size_long; } ]])],glib_size_type=long)]) ]) 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 #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif #ifdef HAVE_SYS_TYPES_H # include #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 #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif #ifdef HAVE_SYS_TYPES_H # include #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 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) # To avoid finding a compatibility unusable statfs, which typically # successfully compiles, but warns to use the newer statvfs interface: AS_IF([test $ac_cv_header_sys_statvfs_h = yes], [AC_CHECK_FUNCS([statvfs])]) AS_IF([test $ac_cv_header_sys_statfs_h = yes -o $ac_cv_header_sys_mount_h = yes], [AC_CHECK_FUNCS([statfs])]) AC_MSG_CHECKING([whether to use statfs or statvfs]) # Some systems have both statfs and statvfs, pick the most "native" for these AS_IF([test x$ac_cv_func_statfs = xyes && test x$ac_cv_func_statvfs = xyes], [ # on solaris and irix, statfs doesn't even have the f_bavail field AS_IF([test x$ac_cv_member_struct_statfs_f_bavail = xno], [ac_cv_func_statfs=no], # else, at least on linux, statfs is the actual syscall [ac_cv_func_statvfs=no]) ]) AS_IF([test x$ac_cv_func_statfs = xyes], [ AC_DEFINE([USE_STATFS], [1], [Define to use statfs()]) AC_MSG_RESULT([statfs]) ], [test x$ac_cv_func_statvfs = xyes], [ AC_DEFINE([USE_STATVFS], [1], [Define to use statvfs()]) AC_MSG_RESULT([statvfs]) ], [ AC_MSG_RESULT([neither])]) AC_CHECK_HEADERS(crt_externs.h) AC_CHECK_FUNCS(_NSGetEnviron) AC_CHECK_FUNCS(newlocale uselocale strtod_l strtoll_l strtoull_l) AC_FUNC_VSNPRINTF_C99 AC_FUNC_PRINTF_UNIX98 # Internet address families if test $glib_native_win32 = yes; then glib_inet_includes=[" #include "] else glib_inet_includes=[" #include #include "] fi glib_failed=false GLIB_CHECK_VALUE(AF_INET, $glib_inet_includes, glib_failed=true) GLIB_CHECK_VALUE(AF_INET6, $glib_inet_includes, glib_failed=true) # winsock defines this even though it doesn't support it GLIB_CHECK_VALUE(AF_UNIX, $glib_inet_includes, glib_failed=true) if $glib_failed ; then AC_MSG_ERROR([Could not determine values for AF_INET* constants]) fi glib_failed=false GLIB_CHECK_VALUE(MSG_PEEK, $glib_inet_includes, glib_failed=true) GLIB_CHECK_VALUE(MSG_OOB, $glib_inet_includes, glib_failed=true) GLIB_CHECK_VALUE(MSG_DONTROUTE, $glib_inet_includes, glib_failed=true) if $glib_failed ; then AC_MSG_ERROR([Could not determine values for MSG_* constants]) fi AC_CHECK_FUNCS(getprotobyname_r endservent if_nametoindex if_indextoname) AS_IF([test $glib_native_win32 = yes], [ # 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 "]) 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 #include ], [int qclass = C_IN;])], [AC_MSG_RESULT([no])], [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([#include #include #include ], [int qclass = C_IN;])], [AC_MSG_RESULT([yes]) NAMESER_COMPAT_INCLUDE="#include "], [AC_MSG_ERROR([could not compile test program either way])])])]) AC_SUBST(NAMESER_COMPAT_INCLUDE) # We can't just use AC_CHECK_FUNC/AC_CHECK_LIB here. Bug 586150 NETWORK_LIBS="" AC_MSG_CHECKING([for res_query]) AC_TRY_LINK([#include #include #include #include ],[ res_query("test", 0, 0, (void *)0, 0); ],[AC_MSG_RESULT([yes])], [save_libs="$LIBS" LIBS="-lresolv $LIBS" AC_TRY_LINK([#include #include #include #include ],[ res_query("test", 0, 0, (void *)0, 0); ],[AC_MSG_RESULT([in -lresolv]) NETWORK_LIBS="-lresolv $NETWORK_LIBS"], [LIBS="-lbind $save_libs" AC_TRY_LINK([#include ], [res_query("test", 0, 0, (void *)0, 0);], [AC_MSG_RESULT([in -lbind]) NETWORK_LIBS="-lbind $NETWORK_LIBS"], [AC_MSG_ERROR(not found)])]) LIBS="$save_libs"]) AC_CHECK_FUNC(socket, :, AC_CHECK_LIB(socket, socket, [NETWORK_LIBS="-lsocket $NETWORK_LIBS"], [AC_MSG_ERROR(Could not find socket())])) save_libs="$LIBS" LIBS="$LIBS $NETWORK_LIBS" AC_MSG_CHECKING([for res_init]) AC_TRY_LINK([#include #include #include #include ],[ 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], [AC_DEFINE(HAVE_NETLINK, 1, [We have AF_NETLINK sockets])],, [#include ]) AM_CONDITIONAL(HAVE_NETLINK, [test "$ac_cv_header_linux_netlink_h" = "yes"]) AC_CHECK_TYPE([struct ip_mreqn], [ AC_DEFINE(HAVE_IP_MREQN,, [Define if we have struct ip_mreqn])],, [#include ]) case $host in *-*-solaris* ) AC_DEFINE(_XOPEN_SOURCE_EXTENDED, 1, Needed to get declarations for msg_control and msg_controllen on Solaris) AC_DEFINE(_XOPEN_SOURCE, 2, Needed to get declarations for msg_control and msg_controllen on Solaris) AC_DEFINE(__EXTENSIONS__, 1, Needed to get declarations for msg_control and msg_controllen on Solaris) ;; esac dnl dnl if statfs() takes 2 arguments (Posix) or 4 (Solaris) dnl AS_IF([test "$ac_cv_func_statfs" = yes], [ AC_MSG_CHECKING([number of arguments to statfs()]) AC_TRY_COMPILE([#include #ifdef HAVE_SYS_PARAM_H #include #endif #ifdef HAVE_SYS_VFS_H #include #endif #ifdef HAVE_SYS_MOUNT_H #include #endif #ifdef HAVE_SYS_STATFS_H #include #endif], [struct statfs st; statfs(NULL, &st);],[ AC_MSG_RESULT([2]) AC_DEFINE(STATFS_ARGS, 2, [Number of arguments to statfs()])],[ AC_TRY_COMPILE([#include #ifdef HAVE_SYS_PARAM_H #include #endif #ifdef HAVE_SYS_VFS_H #include #endif #ifdef HAVE_SYS_MOUNT_H #include #endif #ifdef HAVE_SYS_STATFS_H #include #endif], [struct statfs st; statfs(NULL, &st, sizeof (st), 0);],[ AC_MSG_RESULT([4]) 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()])])]) ]) # # Check whether to use an included printf # AC_ARG_ENABLE(included-printf, [AS_HELP_STRING([--enable-included-printf], [use included printf [default=auto]])], enable_included_printf="$enableval") need_included_printf=no if test "x$enable_included_printf" = "xyes" ; then need_included_printf=yes fi if test "$ac_cv_func_vsnprintf_c99" != "yes" ; then need_included_printf=yes fi if test "$ac_cv_func_printf_unix98" != "yes" ; then need_included_printf=yes fi if test "x$ac_cv_sizeof_long_long" = "x8" && test -z "$glib_cv_long_long_format" ; then need_included_printf=yes fi if test "x$enable_included_printf" = "xno" && test "x$need_included_printf" = "xyes" ; then AC_MSG_ERROR([ *** Your C library's printf doesn't appear to have the features that *** GLib needs, but you specified --enable-included-printf=no.]) fi enable_included_printf=$need_included_printf AM_CONDITIONAL(HAVE_GOOD_PRINTF, test "$enable_included_printf" != "yes") AS_IF([test "$enable_included_printf" != "yes"], [ AC_DEFINE(HAVE_GOOD_PRINTF,1,[define to use system printf]) ], [ if test -z "$glib_cv_long_long_format" ; then glib_cv_long_long_format="ll" fi AC_DEFINE(HAVE_VASPRINTF,1) ]) # Checks needed for gnulib vasnprintf bh_C_SIGNED jm_AC_TYPE_LONG_LONG gt_TYPE_LONGDOUBLE gt_TYPE_WCHAR_T gt_TYPE_WINT_T AC_TYPE_SIZE_T AC_CHECK_TYPES(ptrdiff_t) jm_AC_TYPE_INTMAX_T AC_CHECK_FUNCS([snprintf wcslen]) AC_FUNC_SNPRINTF_C99 # Check if bcopy can be used for overlapping copies, if memmove isn't found. # The check is borrowed from the PERL Configure script. 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() { char buf[128], abc[128], *b; int len, off, align; bcopy("abcdefghijklmnopqrstuvwxyz0123456789", abc, 36); for (align = 7; align >= 0; align--) { for (len = 36; len; len--) { b = buf+align; bcopy(abc, b, len); for (off = 1; off <= len; off++) { bcopy(b, b+off, len); bcopy(b+off, b, len); if (bcmp(b, abc, len)) return(1); } } } return(0); }],glib_cv_working_bcopy=yes,glib_cv_working_bcopy=no)]) GLIB_ASSERT_SET(glib_cv_working_bcopy) if test "$glib_cv_working_bcopy" = "yes"; then AC_DEFINE(HAVE_WORKING_BCOPY,1,[Have a working bcopy]) fi ]) # Check if needs to be included for fd_set AC_MSG_CHECKING([for fd_set]) AC_TRY_COMPILE([#include ], [fd_set readMask, writeMask;], gtk_ok=yes, gtk_ok=no) AS_IF([test "$gtk_ok" = "yes"], [ AC_MSG_RESULT([yes, found in sys/types.h]) ], [ AC_EGREP_HEADER(fd_set, sys/select.h, gtk_ok=yes) if test "$gtk_ok" = "yes"; then # *** FIXME: give it a different name AC_DEFINE(HAVE_SYS_SELECT_H,1,[found fd_set in sys/select.h]) AC_MSG_RESULT([yes, found in sys/select.h]) else AC_DEFINE(NO_FD_SET,1,[didn't find fd_set]) AC_MSG_RESULT(no) fi ]) 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_LINK_IFELSE([AC_LANG_PROGRAM([#include ], [char *codeset = nl_langinfo (CODESET);])], [glib_cv_langinfo_codeset=yes], [glib_cv_langinfo_codeset=no])]) if test x$glib_cv_langinfo_codeset = xyes; then AC_DEFINE(HAVE_CODESET,1,[Have nl_langinfo (CODESET)]) fi dnl 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_LINK_IFELSE([AC_LANG_PROGRAM([#include ], [char *str; str = nl_langinfo (PM_STR); str = nl_langinfo (D_T_FMT); str = nl_langinfo (D_FMT); str = nl_langinfo (T_FMT); str = nl_langinfo (T_FMT_AMPM); str = nl_langinfo (MON_1); str = nl_langinfo (ABMON_12); str = nl_langinfo (DAY_1); str = nl_langinfo (ABDAY_7);])], [glib_cv_langinfo_time=yes], [glib_cv_langinfo_time=no])]) if test x$glib_cv_langinfo_time = xyes; then AC_DEFINE(HAVE_LANGINFO_TIME,1,[Have nl_langinfo (PM_STR)]) 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_LINK_IFELSE([AC_LANG_PROGRAM([#include ], [char *str; str = nl_langinfo (_NL_CTYPE_OUTDIGIT0_MB); str = nl_langinfo (_NL_CTYPE_OUTDIGIT1_MB); str = nl_langinfo (_NL_CTYPE_OUTDIGIT2_MB); str = nl_langinfo (_NL_CTYPE_OUTDIGIT3_MB); str = nl_langinfo (_NL_CTYPE_OUTDIGIT4_MB); str = nl_langinfo (_NL_CTYPE_OUTDIGIT5_MB); 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);])], [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 *** dnl **************************************** AC_MSG_CHECKING(for a compliant posix_memalign() implementation) AC_CACHE_VAL(glib_cv_compliant_posix_memalign,[ glib_cv_compliant_posix_memalign=0 if test "$ac_cv_func_posix_memalign" = "yes" ; then AC_TRY_RUN([ #define _XOPEN_SOURCE 600 #include /* posix_memalign() should be defined here */ /* some systems break if #include used */ static void test_memalign (size_t boundary, size_t size) { void *mem = 0; if (posix_memalign (&mem, boundary, size) != 0 || !mem) exit (1); else free (mem); } int main() { test_memalign ( 128, 128 - 2 * sizeof (void*)); test_memalign ( 256, 256 - 2 * sizeof (void*)); test_memalign ( 512, 512 - 2 * sizeof (void*)); test_memalign ( 1024, 1024 - 2 * sizeof (void*)); test_memalign ( 2048, 2048 - 2 * sizeof (void*)); test_memalign ( 4096, 4096 - 2 * sizeof (void*)); test_memalign ( 8192, 8192 - 2 * sizeof (void*)); test_memalign (16384, 16384 - 2 * sizeof (void*)); test_memalign (32768, 32768 - 2 * sizeof (void*)); exit (0); /* success */ } ], [glib_cv_compliant_posix_memalign=1], [], [:]) : fi ]) 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]) ], [ AC_MSG_RESULT(no) ]) dnl **************************************** dnl *** strlcpy/strlcat *** dnl **************************************** # Check for strlcpy AC_CACHE_CHECK([for OpenBSD strlcpy/strlcat],glib_cv_have_strlcpy,[ AC_TRY_RUN([#include #include int main() { char p[10]; (void) strlcpy (p, "hi", 10); if (strlcat (p, "bye", 0) != 3) return 1; return 0; }], glib_cv_have_strlcpy=yes, glib_cv_have_strlcpy=no, glib_cv_have_strlcpy=no)]) if test "$glib_cv_have_strlcpy" = "yes"; then AC_DEFINE(HAVE_STRLCPY,1,[Have functions strlcpy and strlcat]) fi dnl ********************** dnl *** va_copy checks *** dnl ********************** dnl we currently check for all three va_copy possibilities, so we get dnl all results in config.log for bug reports. AC_CACHE_CHECK([for an implementation of va_copy()],glib_cv_va_copy,[ AC_LINK_IFELSE([AC_LANG_SOURCE([[#include #include void f (int i, ...) { va_list args1, args2; va_start (args1, i); va_copy (args2, args1); if (va_arg (args2, int) != 42 || va_arg (args1, int) != 42) exit (1); va_end (args1); va_end (args2); } int main() { f (0, 42); return 0; }]])], [glib_cv_va_copy=yes], [glib_cv_va_copy=no]) ]) AC_CACHE_CHECK([for an implementation of __va_copy()],glib_cv___va_copy,[ AC_LINK_IFELSE([AC_LANG_SOURCE([[#include #include void f (int i, ...) { va_list args1, args2; va_start (args1, i); __va_copy (args2, args1); if (va_arg (args2, int) != 42 || va_arg (args1, int) != 42) exit (1); va_end (args1); va_end (args2); } int main() { f (0, 42); return 0; }]])], [glib_cv___va_copy=yes], [glib_cv___va_copy=no]) ]) if test "x$glib_cv_va_copy" = "xyes"; then g_va_copy_func=va_copy else if test "x$glib_cv___va_copy" = "xyes"; then g_va_copy_func=__va_copy fi fi if test -n "$g_va_copy_func"; then AC_DEFINE_UNQUOTED(G_VA_COPY,$g_va_copy_func,[A 'va_copy' style function]) fi AC_CACHE_CHECK([whether va_lists can be copied by value],glib_cv_va_val_copy,[ AC_TRY_RUN([#include #include void f (int i, ...) { va_list args1, args2; va_start (args1, i); args2 = args1; if (va_arg (args2, int) != 42 || va_arg (args1, int) != 42) exit (1); va_end (args1); va_end (args2); } int main() { f (0, 42); return 0; }], [glib_cv_va_val_copy=yes], [glib_cv_va_val_copy=no], [glib_cv_va_val_copy=yes]) ]) 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]) ]) dnl *********************** dnl *** g_module checks *** dnl *********************** G_MODULE_LIBS= G_MODULE_LIBS_EXTRA= G_MODULE_PLUGIN_LIBS= if test x"$glib_native_win32" = xyes; then dnl No use for this on Win32 G_MODULE_LDFLAGS= else export SED G_MODULE_LDFLAGS=`(./libtool --config; echo eval echo \\$export_dynamic_flag_spec) | sh` fi dnl G_MODULE_IMPL= don't reset, so cmd-line can override G_MODULE_NEED_USCORE=0 G_MODULE_BROKEN_RTLD_GLOBAL=0 G_MODULE_HAVE_DLERROR=0 dnl *** force native WIN32 shared lib loader if test -z "$G_MODULE_IMPL"; then case "$host" in *-*-mingw*|*-*-cygwin*) G_MODULE_IMPL=G_MODULE_IMPL_WIN32 ;; esac fi dnl *** force native AIX library loader dnl *** dlopen() filepath must be of the form /path/libname.a(libname.so) if test -z "$G_MODULE_IMPL"; then case "$host" in *-*-aix*) G_MODULE_IMPL=G_MODULE_IMPL_AR ;; esac fi dnl *** dlopen() and dlsym() in system libraries AS_IF([ test -z "$G_MODULE_IMPL"], [ AC_CHECK_FUNC(dlopen, [AC_CHECK_FUNC(dlsym, [G_MODULE_IMPL=G_MODULE_IMPL_DL],[])], []) ]) dnl *** load_image (BeOS) 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], []) ]) dnl *** NSLinkModule (dyld) in system libraries (Darwin) AS_IF([ test -z "$G_MODULE_IMPL" ], [ AC_CHECK_FUNC(NSLinkModule, [G_MODULE_IMPL=G_MODULE_IMPL_DYLD G_MODULE_NEED_USCORE=1], []) ]) dnl *** dlopen() and dlsym() in libdl 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],[])], []) ]) dnl *** shl_load() in libdld (HP-UX) AS_IF([ test -z "$G_MODULE_IMPL"], [ AC_CHECK_LIB(dld, shl_load, [G_MODULE_LIBS=-ldld G_MODULE_IMPL=G_MODULE_IMPL_DLD], []) ]) dnl *** additional checks for G_MODULE_IMPL_DL AS_IF([ test "$G_MODULE_IMPL" = "G_MODULE_IMPL_DL" ], [ LIBS_orig="$LIBS" LDFLAGS_orig="$LDFLAGS" LIBS="$G_MODULE_LIBS $LIBS" LDFLAGS="$LDFLAGS $G_MODULE_LDFLAGS" dnl *** check for OSF1/5.0 RTLD_GLOBAL brokenness echo "void glib_plugin_test(void) { }" > plugin.c ${SHELL} ./libtool --mode=compile --tag=CC ${CC} ${CFLAGS} \ ${CPPFLAGS} -c -o plugin.lo plugin.c >/dev/null 2>&1 ${SHELL} ./libtool --mode=link --tag=CC ${CC} ${CFLAGS} \ ${LDFLAGS} -module -o plugin.la -export-dynamic \ -shrext ".o" -avoid-version plugin.lo \ -rpath /dont/care >/dev/null 2>&1 eval `./libtool --config | grep ^objdir` AC_CACHE_CHECK([for RTLD_GLOBAL brokenness], glib_cv_rtldglobal_broken,[ AC_TRY_RUN([ #include #ifndef RTLD_GLOBAL # define RTLD_GLOBAL 0 #endif #ifndef RTLD_LAZY # define RTLD_LAZY 0 #endif int glib_plugin_test; int main () { void *handle, *global, *local; global = &glib_plugin_test; handle = dlopen ("./$objdir/plugin.o", RTLD_GLOBAL | RTLD_LAZY); if (!handle) return 0; local = dlsym (handle, "glib_plugin_test"); return global == local; } ], [glib_cv_rtldglobal_broken=no], [glib_cv_rtldglobal_broken=yes], [glib_cv_rtldglobal_broken=no]) rm -f plugin.c plugin.o plugin.lo plugin.la ${objdir}/plugin.* rmdir ${objdir} 2>/dev/null ]) if test "x$glib_cv_rtldglobal_broken" = "xyes"; then G_MODULE_BROKEN_RTLD_GLOBAL=1 else G_MODULE_BROKEN_RTLD_GLOBAL=0 fi dnl *** check whether we need preceeding underscores AC_CACHE_CHECK([for preceeding underscore in symbols], glib_cv_uscore,[ AC_TRY_RUN([#include int glib_underscore_test (void) { return 42; } int main() { void *f1 = (void*)0, *f2 = (void*)0, *handle; handle = dlopen ((void*)0, 0); if (handle) { f1 = dlsym (handle, "glib_underscore_test"); f2 = dlsym (handle, "_glib_underscore_test"); } return (!f2 || f1); }], [glib_cv_uscore=yes], [glib_cv_uscore=no], []) rm -f plugin.c plugin.$ac_objext plugin.lo ]) GLIB_ASSERT_SET(glib_cv_uscore) if test "x$glib_cv_uscore" = "xyes"; then G_MODULE_NEED_USCORE=1 else G_MODULE_NEED_USCORE=0 fi LDFLAGS="$LDFLAGS_orig" dnl *** check for having dlerror() AC_CHECK_FUNC(dlerror, [G_MODULE_HAVE_DLERROR=1], [G_MODULE_HAVE_DLERROR=0]) LIBS="$LIBS_orig" ]) dnl *** done, have we got an implementation? if test -z "$G_MODULE_IMPL"; then G_MODULE_IMPL=0 G_MODULE_SUPPORTED=false else G_MODULE_SUPPORTED=true fi AC_MSG_CHECKING(for the suffix of module shared libraries) export SED shrext_cmds=`./libtool --config | grep '^shrext_cmds='` eval $shrext_cmds module=yes eval std_shrext=$shrext_cmds # chop the initial dot glib_gmodule_suffix=`echo $std_shrext | sed 's/^\.//'` AC_MSG_RESULT(.$glib_gmodule_suffix) # any reason it may fail? if test "x$glib_gmodule_suffix" = x; then AC_MSG_ERROR(Cannot determine shared library suffix from libtool) fi AC_SUBST(G_MODULE_SUPPORTED) AC_SUBST(G_MODULE_IMPL) AC_SUBST(G_MODULE_LIBS) AC_SUBST(G_MODULE_LIBS_EXTRA) AC_SUBST(G_MODULE_PLUGIN_LIBS) AC_SUBST(G_MODULE_LDFLAGS) AC_SUBST(G_MODULE_HAVE_DLERROR) AC_SUBST(G_MODULE_BROKEN_RTLD_GLOBAL) AC_SUBST(G_MODULE_NEED_USCORE) AC_SUBST(GLIB_DEBUG_FLAGS) dnl ********************** dnl *** g_spawn checks *** dnl ********************** AC_MSG_CHECKING(for gspawn implementation) case "$host" in *-*-mingw*) GSPAWN=gspawn-win32.lo ;; *) GSPAWN=gspawn.lo ;; esac AC_MSG_RESULT($GSPAWN) AC_SUBST(GSPAWN) dnl ************************* dnl *** GIOChannel checks *** dnl ************************* AC_MSG_CHECKING(for GIOChannel implementation) case "$host" in *-*-mingw*) GIO=giowin32.lo ;; *) GIO=giounix.lo ;; esac AC_MSG_RESULT($GIO) AC_SUBST(GIO) dnl ********************************* dnl *** Directory for GIO modules *** dnl ********************************* AC_ARG_WITH(gio-module-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 inotify (GIO) ** dnl ***************************** inotify_support=no AC_CHECK_HEADERS([sys/inotify.h], [ inotify_support=yes AC_CHECK_FUNCS(inotify_init1) ]) 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 ********************************* fen_support=no AC_COMPILE_IFELSE([AC_LANG_SOURCE([[ #include #ifndef PORT_SOURCE_FILE #error "Please upgrade to Nevada 72 or above to suppoert FEN" #endif int main() { return 0; } ]])], [ fen_support=yes ],) AM_CONDITIONAL(HAVE_FEN, [test "$fen_support" = "yes"]) dnl **************************************** dnl *** platform dependent source checks *** dnl **************************************** AC_MSG_CHECKING(for platform-dependent source) case "$host" in *-*-cygwin*|*-*-mingw*) PLATFORMDEP=gwin32.lo ;; *) PLATFORMDEP= ;; esac AC_MSG_RESULT($PLATFORMDEP) AC_SUBST(PLATFORMDEP) AC_MSG_CHECKING([whether to compile timeloop]) case "$host" in *-*-cygwin*|*-*-mingw*|*-*-minix) enable_timeloop=no ;; *) enable_timeloop=yes ;; esac AC_MSG_RESULT($enable_timeloop) AM_CONDITIONAL(ENABLE_TIMELOOP, test x$enable_timeloop = xyes) AC_MSG_CHECKING([if building for some Win32 platform]) case "$host" in *-*-mingw*|*-*-cygwin*) platform_win32=yes ;; *) platform_win32=no ;; esac AC_MSG_RESULT($platform_win32) AM_CONDITIONAL(PLATFORM_WIN32, test x$platform_win32 = xyes) dnl *********************** dnl *** g_thread checks *** dnl *********************** AC_ARG_WITH(threads, [AS_HELP_STRING([--with-threads=@<:@posix/win32@:>@], [specify a thread implementation to use])], [], [with_threads=yes]) dnl error and warning message dnl ************************* THREAD_NO_IMPLEMENTATION="No thread implementation found." FLAG_DOES_NOT_WORK="I can't find the MACRO to enable thread safety on your platform (normally it's "_REENTRANT"). I'll not use any flag on compilation now, but then your programs might not work. Please provide information on how it is done on your system." LIBS_NOT_FOUND_1="I can't find the libraries for the thread implementation " LIBS_NOT_FOUND_2=". Please choose another thread implementation or provide information on your thread implementation." FUNC_NO_GETPWUID_R="the 'g_get_(user_name|real_name|home_dir|tmp_dir)' functions will not be MT-safe during their first call because there is no working 'getpwuid_r' on your system." FUNC_NO_LOCALTIME_R="the 'g_date_set_time' function will not be MT-safe because there is no 'localtime_r' on your system." AIX_COMPILE_INFO="AIX's C compiler needs to be called by a different name, when linking threaded applications. As GLib cannot do that automatically, you will get an linkg error everytime you are not using the right compiler. In that case you have to relink with the right compiler. Ususally just '_r' is appended to the compiler name." dnl determination of thread implementation dnl *************************************** AC_MSG_CHECKING(for thread implementation) have_threads=no 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" AS_IF([ test "x$have_threads" = xno], [ AC_TRY_COMPILE([#include ], [pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER;], have_threads=posix) ]) # Tru64Unix requires -pthread to find pthread.h. See #103020 CPPFLAGS="$CPPFLAGS -pthread" if test "x$have_threads" = xno; then AC_TRY_COMPILE([#include ], [pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER;], have_threads=posix) fi CPPFLAGS="$glib_save_CPPFLAGS" ]) if test "x$with_threads" = xyes || test "x$with_threads" = xwin32; then case $host in *-*-mingw*) have_threads=win32 ;; esac fi if test "x$have_threads" = xno; then AC_MSG_RESULT(none available) AC_MSG_ERROR($THREAD_NO_IMPLEMENTATION) else AC_MSG_RESULT($have_threads) fi dnl determination of G_THREAD_CFLAGS dnl ******************************** G_THREAD_LIBS= G_THREAD_LIBS_EXTRA= G_THREAD_CFLAGS= dnl dnl Test program for basic POSIX threads functionality dnl m4_define([glib_thread_test],[ #include int check_me = 0; void* func(void* data) {check_me = 42; return &check_me;} int main() { pthread_t t; void *ret; pthread_create (&t, $1, func, 0); pthread_join (t, &ret); return (check_me != 42 || ret != &check_me); }]) 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 # too and could be considered as the canonical way to go. case $host in *-*-cygwin*|*-*-darwin*) # skip cygwin and darwin -pthread or -pthreads test ;; *-solaris*) # These compiler/linker flags work with both Sun Studio and gcc # Sun Studio expands -mt to -D_REENTRANT and -lthread # gcc expands -pthreads to -D_REENTRANT -D_PTHREADS -lpthread G_THREAD_CFLAGS="-D_REENTRANT -D_PTHREADS" G_THREAD_LIBS="-lpthread -lthread" ;; *) for flag in pthread pthreads mt; do glib_save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -$flag" AC_TRY_RUN(glib_thread_test(0), glib_flag_works=yes, glib_flag_works=no, [AC_LINK_IFELSE([AC_LANG_SOURCE(glib_thread_test(0))], glib_flag_works=yes, glib_flag_works=no)]) CFLAGS="$glib_save_CFLAGS" if test $glib_flag_works = yes ; then G_THREAD_CFLAGS=-$flag G_THREAD_LIBS=-$flag break; fi done ;; esac ]) AS_IF([ test x"$G_THREAD_CFLAGS" = x], [ # The canonical -pthread[s] does not work. Try something different. case $host in *-aix*) if test x"$GCC" = xyes; then # GCC 3.0 and above needs -pthread. # Should be coverd by the case above. # GCC 2.x and below needs -mthreads G_THREAD_CFLAGS="-mthreads" G_THREAD_LIBS=$G_THREAD_CFLAGS else # We are probably using the aix compiler. Normaly a # program would have to be compiled with the _r variant # of the corresponding compiler, but we as GLib cannot # do that: but the good news is that for compiling the # only difference is the added -D_THREAD_SAFE compile # option. This is according to the "C for AIX User's # Guide". G_THREAD_CFLAGS="-D_THREAD_SAFE" fi ;; *-dg-dgux*) # DG/UX G_THREAD_CFLAGS="-D_REENTRANT -D_POSIX4A_DRAFT10_SOURCE" ;; *-sysv5uw7*) # UnixWare 7 # We are not using gcc with -pthread. Catched above. G_THREAD_CFLAGS="-Kthread" G_THREAD_LIBS=$G_THREAD_CFLAGS ;; *-mingw*) # No flag needed when using MSVCRT.DLL G_THREAD_CFLAGS="" ;; *) G_THREAD_CFLAGS="-D_REENTRANT" # good default guess otherwise ;; esac ]) # if we are not finding the localtime_r function, then we probably are # not using the proper multithread flag glib_save_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $G_THREAD_CFLAGS" # First we test, whether localtime_r is declared in time.h # directly. Then we test whether a macro localtime_r exists, in # which case localtime_r in the test program is replaced and thus # if we still find localtime_r in the output, it is not defined as # a macro. AC_EGREP_CPP([[^a-zA-Z1-9_]localtime_r[^a-zA-Z1-9_]], [#include ], , [AC_EGREP_CPP([[^a-zA-Z1-9_]localtime_r[^a-zA-Z1-9_]], [#include localtime_r(a,b)], AC_MSG_WARN($FLAG_DOES_NOT_WORK))]) CPPFLAGS="$glib_save_CPPFLAGS" AC_MSG_CHECKING(thread related cflags) AC_MSG_RESULT($G_THREAD_CFLAGS) CPPFLAGS="$CPPFLAGS $G_THREAD_CFLAGS" dnl determination of G_THREAD_LIBS dnl ****************************** AS_IF([test x$have_threads = xposix], [ glib_save_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $GTHREAD_COMPILE_IMPL_DEFINES" 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 # probably using the aix compiler. AC_MSG_WARN($AIX_COMPILE_INFO) ;; *) G_THREAD_LIBS=error glib_save_LIBS="$LIBS" for thread_lib in "" pthread pthread32 pthreads thread; do if test x"$thread_lib" = x; then add_thread_lib="" IN="" else add_thread_lib="-l$thread_lib" IN=" in -l$thread_lib" fi if test x"$have_threads" = xposix; then defattr=0 else defattr=pthread_attr_default fi LIBS="$add_thread_lib $glib_save_LIBS" AC_MSG_CHECKING(for pthread_create/pthread_join$IN) AC_TRY_RUN(glib_thread_test($defattr), glib_result=yes, glib_result=no, [AC_LINK_IFELSE([AC_LANG_SOURCE(glib_thread_test($defattr))], glib_result=yes, glib_result=no)]) AC_MSG_RESULT($glib_result) if test "$glib_result" = "yes" ; then G_THREAD_LIBS="$add_thread_lib" break fi done if test "x$G_THREAD_LIBS" = xerror; then AC_MSG_ERROR($LIBS_NOT_FOUND_1$have_threads$LIBS_NOT_FOUND_2) fi LIBS="$glib_save_LIBS" ;; esac ]) g_threads_impl="POSIX" AC_DEFINE([THREADS_POSIX], [1], [Use pthreads]) AC_SUBST(GTHREAD_COMPILE_IMPL_DEFINES) CPPFLAGS="$glib_save_CPPFLAGS" ], [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 ]) 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) fi case $host in *-*-beos*) G_THREAD_LIBS="-lbe -lroot -lglib-2.0 " G_THREAD_LIBS_EXTRA="-L\$(top_builddir_full)/.libs" ;; *) ;; esac AC_MSG_CHECKING(thread related libraries) AC_MSG_RESULT($G_THREAD_LIBS) dnl check for mt safe function variants and some posix functions dnl ************************************************************ glib_save_LIBS="$LIBS" # we are not doing the following for now, as this might require glib # to always be linked with the thread libs on some platforms. # LIBS="$LIBS $G_THREAD_LIBS" AC_CHECK_FUNCS(localtime_r gmtime_r) 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([ #include #include int main () { char buffer[10000]; struct passwd pwd, *pwptr = &pwd; int error; errno = 0; error = getpwuid_r (0, &pwd, buffer, sizeof (buffer), &pwptr); return (error < 0 && errno == ENOSYS) || error == ENOSYS; } ], [ac_cv_func_posix_getpwuid_r=yes], [ac_cv_func_posix_getpwuid_r=no])]) GLIB_ASSERT_SET(ac_cv_func_posix_getpwuid_r) if test "$ac_cv_func_posix_getpwuid_r" = yes; then AC_DEFINE(HAVE_POSIX_GETPWUID_R,1, [Have POSIX function getpwuid_r]) else AC_CACHE_CHECK([for nonposix getpwuid_r], ac_cv_func_nonposix_getpwuid_r, [AC_TRY_LINK([#include ], [char buffer[10000]; struct passwd pwd; getpwuid_r (0, &pwd, buffer, sizeof (buffer));], [ac_cv_func_nonposix_getpwuid_r=yes], [ac_cv_func_nonposix_getpwuid_r=no])]) GLIB_ASSERT_SET(ac_cv_func_nonposix_getpwuid_r) if test "$ac_cv_func_nonposix_getpwuid_r" = yes; then AC_DEFINE(HAVE_NONPOSIX_GETPWUID_R,1, [Have non-POSIX function getpwuid_r]) fi fi ]) 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([ #include #include int main () { char buffer[10000]; struct group grp, *grpptr = &grp; int error; errno = 0; error = getgrgid_r (0, &grp, buffer, sizeof (buffer), &grpptr); return (error < 0 && errno == ENOSYS) || error == ENOSYS; } ], [ac_cv_func_posix_getgrgid_r=yes], [ac_cv_func_posix_getgrgid_r=no])]) GLIB_ASSERT_SET(ac_cv_func_posix_getgrgid_r) AS_IF([ test "$ac_cv_func_posix_getgrgid_r" = yes ], [ AC_DEFINE(HAVE_POSIX_GETGRGID_R,1, [Have POSIX function getgrgid_r]) ], [ AC_CACHE_CHECK([for nonposix getgrgid_r], ac_cv_func_nonposix_getgrgid_r, [AC_TRY_LINK([#include ], [char buffer[10000]; struct group grp; getgrgid_r (0, &grp, buffer, sizeof (buffer));], [ac_cv_func_nonposix_getgrgid_r=yes], [ac_cv_func_nonposix_getgrgid_r=no])]) GLIB_ASSERT_SET(ac_cv_func_nonposix_getgrgid_r) if test "$ac_cv_func_nonposix_getgrgid_r" = yes; then AC_DEFINE(HAVE_NONPOSIX_GETGRGID_R,1, [Have non-POSIX function getgrgid_r]) fi ]) ]) LIBS="$G_THREAD_LIBS $LIBS" 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 # name mangling in header files. AC_MSG_CHECKING(for pthread_attr_setstacksize) AC_LINK_IFELSE( [AC_LANG_PROGRAM( [#include ], [pthread_attr_t t; pthread_attr_setstacksize(&t,0)])], [AC_MSG_RESULT(yes) AC_DEFINE(HAVE_PTHREAD_ATTR_SETSTACKSIZE,1, [Have function pthread_attr_setstacksize])], [AC_MSG_RESULT(no)]) AC_MSG_CHECKING(for pthread_condattr_setclock) AC_LINK_IFELSE( [AC_LANG_PROGRAM( [#include ], [pthread_condattr_t a; pthread_condattr_setclock(&a,0)])], [AC_MSG_RESULT(yes) 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_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_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" ]) LIBS="$glib_save_LIBS" # now spit out all the warnings. if test "$ac_cv_func_posix_getpwuid_r" != "yes" && test "$ac_cv_func_nonposix_getpwuid_r" != "yes"; then AC_MSG_WARN($FUNC_NO_GETPWUID_R) fi if test "$ac_cv_func_localtime_r" != "yes"; then AC_MSG_WARN($FUNC_NO_LOCALTIME_R) fi # # Hack to deal with: # # a) GCC < 3.3 for Linux doesn't include -lpthread when # building shared libraries with linux. # 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/`" ;; *-*-openbsd*) LDFLAGS="$LDFLAGS -pthread" ;; *) G_THREAD_LIBS_FOR_GTHREAD="$G_THREAD_LIBS" ;; esac AC_SUBST(G_THREAD_CFLAGS) AC_SUBST(G_THREAD_LIBS) AC_SUBST(G_THREAD_LIBS_FOR_GTHREAD) AC_SUBST(G_THREAD_LIBS_EXTRA) AC_CHECK_FUNCS(clock_gettime, [], [ AC_CHECK_LIB(rt, clock_gettime, [ AC_DEFINE(HAVE_CLOCK_GETTIME, 1) G_THREAD_LIBS="$G_THREAD_LIBS -lrt" G_THREAD_LIBS_FOR_GTHREAD="$G_THREAD_LIBS_FOR_GTHREAD -lrt" ]) ]) dnl ************************ dnl *** g_atomic_* tests *** dnl ************************ dnl We need to decide at configure time if GLib will use real atomic dnl operations ("lock free") or emulated ones with a mutex. This is dnl because we must put this information in glibconfig.h so we know if dnl it is safe or not to inline using compiler intrinsics directly from dnl the header. dnl dnl We also publish the information via G_ATOMIC_LOCK_FREE in case the dnl user is interested in knowing if they can use the atomic ops across dnl processes. 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 (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 dnl not available but would be available given the right flags, we want dnl to abort and advise the user to fix their CFLAGS. It's better to do dnl that then to silently fall back on emulated atomic ops just because 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, [ 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 i?86|x86_64|s390|s390x|arm*|crisv32*|etrax*) glib_memory_barrier_needed=no ;; sparc*|alpha*|powerpc*|ia64) glib_memory_barrier_needed=yes ;; *) glib_memory_barrier_needed=yes ;; esac dnl ************************ dnl ** Check for futex(2) ** dnl ************************ AC_CACHE_CHECK(for futex(2) system call, glib_cv_futex,AC_COMPILE_IFELSE([AC_LANG_PROGRAM([ #include #include #include ],[ int main (void) { /* it is not like this actually runs or anything... */ syscall (__NR_futex, NULL, FUTEX_WAKE, FUTEX_WAIT); return 0; } ])],glib_cv_futex=yes,glib_cv_futex=no)) if test x"$glib_cv_futex" = xyes; then AC_DEFINE(HAVE_FUTEX, 1, [we have the futex(2) system call]) fi AC_CACHE_CHECK(for eventfd(2) system call, glib_cv_eventfd,AC_COMPILE_IFELSE([AC_LANG_PROGRAM([ #include #include ],[ int main (void) { eventfd (0, EFD_CLOEXEC); return 0; } ])],glib_cv_eventfd=yes,glib_cv_eventfd=no)) if test x"$glib_cv_eventfd" = x"yes"; then AC_DEFINE(HAVE_EVENTFD, 1, [we have the eventfd(2) system call]) fi AM_CONDITIONAL(HAVE_EVENTFD, [test "$glib_cv_eventfd" = "yes"]) dnl **************************************** dnl *** GLib POLL* compatibility defines *** dnl **************************************** glib_poll_includes=[" #include #include "] 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) GLIB_CHECK_VALUE(POLLPRI, $glib_poll_includes, glib_failed=true) GLIB_CHECK_VALUE(POLLERR, $glib_poll_includes, glib_failed=true) GLIB_CHECK_VALUE(POLLHUP, $glib_poll_includes, glib_failed=true) GLIB_CHECK_VALUE(POLLNVAL, $glib_poll_includes, glib_failed=true) if $glib_failed ; then AC_MSG_ERROR([Could not determine values for POLL* constants]) fi ], [ 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 ]) AC_MSG_CHECKING([for broken poll]) AC_RUN_IFELSE([AC_LANG_SOURCE([[ #include #include #include #ifdef HAVE_SYS_POLL_H #include #endif int main(void) { struct pollfd fds[1]; int fd; fd = open("/dev/null", 1); fds[0].fd = fd; fds[0].events = POLLIN; fds[0].revents = 0; if (poll(fds, 1, 0) < 0 || (fds[0].revents & POLLNVAL) != 0) { exit(1); /* Does not work for devices -- fail */ } exit(0); }]])], [broken_poll=no], [broken_poll=yes AC_DEFINE(BROKEN_POLL,1,[poll doesn't work on devices])], [broken_poll="no (cross compiling)"]) AC_MSG_RESULT($broken_poll) dnl ********************** dnl *** Win32 API libs *** dnl ********************** case $host in *-*-cygwin*) G_LIBS_EXTRA="-luser32 -lkernel32" ;; *-*-mingw*) G_LIBS_EXTRA="-lws2_32 -lole32 -lwinmm -lshlwapi" ;; *) G_LIBS_EXTRA="" ;; esac AC_SUBST(G_LIBS_EXTRA) dnl If the system doesn't define EILSEQ, we should define EILSEQ ourselves dnl since we need it for g_iconv() AC_MSG_CHECKING([for EILSEQ]) AC_TRY_COMPILE([ #include ], [ int error = EILSEQ; ], have_eilseq=yes, have_eilseq=no); AC_MSG_RESULT($have_eilseq) dnl ************************************ dnl *** Enable lcov coverage reports *** dnl ************************************ AC_ARG_ENABLE(gcov, AS_HELP_STRING([--enable-gcov], [enable coverage testing with gcov]), [use_gcov=$enableval], [use_gcov=no]) 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]) fi dnl Check if ccache is being used AC_CHECK_PROG(SHTOOL, shtool, shtool) case `$SHTOOL path $CC` in *ccache*[)] gcc_ccache=yes;; *[)] gcc_ccache=no;; esac if test "$gcc_ccache" = "yes" && (test -z "$CCACHE_DISABLE" || test "$CCACHE_DISABLE" != "1"); 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 1.10" AC_CHECK_PROG(LTP, lcov, lcov) AC_CHECK_PROG(LTP_GENHTML, genhtml, genhtml) 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/^.* //'` for ltp_check_version in $ltp_version_list; do if test "$ltp_version" = "$ltp_check_version"; then glib_cv_ltp_version="$ltp_check_version (ok)" fi done ]) ], [ 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]) ]) case $glib_cv_ltp_version in ""|invalid[)] ltp_msg="You must have one of the following versions of LTP: $ltp_version_list (found: $ltp_version)." AC_MSG_ERROR([$ltp_msg]) LTP="exit 0;" ;; esac if test -z "$LTP_GENHTML"; then AC_MSG_ERROR([Could not find genhtml from the LTP package]) fi dnl Remove all optimization flags from CFLAGS changequote({,}) CFLAGS=`echo "$CFLAGS" | $SED -e 's/-O[0-9]*//g'` changequote([,]) dnl Add the special gcc flags CFLAGS="$CFLAGS -O0 -fprofile-arcs -ftest-coverage" LDFLAGS="$LDFLAGS -lgcov" ]) dnl ****************************** dnl *** output the whole stuff *** dnl ****************************** dnl this section will only be run if config.status is invoked with no dnl arguments, or with "glib/glibconfig.h" as an argument. AC_CONFIG_COMMANDS([glib/glibconfig.h], [ outfile=glib/glibconfig.h-tmp cat > $outfile <<\_______EOF /* glibconfig.h * * This is a generated file. Please modify 'configure.ac' */ #ifndef __GLIBCONFIG_H__ #define __GLIBCONFIG_H__ #include _______EOF if test x$glib_limits_h = xyes; then echo '#include ' >> $outfile fi if test x$glib_float_h = xyes; then echo '#include ' >> $outfile fi if test x$glib_values_h = xyes; then echo '#include ' >> $outfile fi if test "$glib_header_alloca_h" = "yes"; then echo '#define GLIB_HAVE_ALLOCA_H' >> $outfile fi if test x$glib_sys_poll_h = xyes; then echo '#define GLIB_HAVE_SYS_POLL_H' >> $outfile fi if test x$glib_included_printf != xyes; then echo " /* Specifies that GLib's g_print*() functions wrap the * system printf functions. This is useful to know, for example, * when using glibc's register_printf_function(). */" >> $outfile echo '#define GLIB_USING_SYSTEM_PRINTF' >> $outfile fi cat >> $outfile <<_______EOF G_BEGIN_DECLS #define G_MINFLOAT $glib_mf #define G_MAXFLOAT $glib_Mf #define G_MINDOUBLE $glib_md #define G_MAXDOUBLE $glib_Md #define G_MINSHORT $glib_ms #define G_MAXSHORT $glib_Ms #define G_MAXUSHORT $glib_Mus #define G_MININT $glib_mi #define G_MAXINT $glib_Mi #define G_MAXUINT $glib_Mui #define G_MINLONG $glib_ml #define G_MAXLONG $glib_Ml #define G_MAXULONG $glib_Mul _______EOF ### this should always be true in a modern C/C++ compiler cat >>$outfile <<_______EOF typedef signed char gint8; typedef unsigned char guint8; _______EOF if test -n "$gint16"; then cat >>$outfile <<_______EOF typedef signed $gint16 gint16; typedef unsigned $gint16 guint16; #define G_GINT16_MODIFIER $gint16_modifier #define G_GINT16_FORMAT $gint16_format #define G_GUINT16_FORMAT $guint16_format _______EOF fi if test -n "$gint32"; then cat >>$outfile <<_______EOF typedef signed $gint32 gint32; typedef unsigned $gint32 guint32; #define G_GINT32_MODIFIER $gint32_modifier #define G_GINT32_FORMAT $gint32_format #define G_GUINT32_FORMAT $guint32_format _______EOF fi cat >>$outfile <<_______EOF #define G_HAVE_GINT64 1 /* deprecated, always true */ ${glib_extension}typedef signed $gint64 gint64; ${glib_extension}typedef unsigned $gint64 guint64; #define G_GINT64_CONSTANT(val) $gint64_constant #define G_GUINT64_CONSTANT(val) $guint64_constant _______EOF if test x$gint64_format != x ; then cat >>$outfile <<_______EOF #define G_GINT64_MODIFIER $gint64_modifier #define G_GINT64_FORMAT $gint64_format #define G_GUINT64_FORMAT $guint64_format _______EOF else cat >>$outfile <<_______EOF #undef G_GINT64_MODIFIER #undef G_GINT64_FORMAT #undef G_GUINT64_FORMAT _______EOF fi cat >>$outfile <<_______EOF #define GLIB_SIZEOF_VOID_P $glib_void_p #define GLIB_SIZEOF_LONG $glib_long #define GLIB_SIZEOF_SIZE_T $glib_size_t #define GLIB_SIZEOF_SSIZE_T $glib_ssize_t _______EOF cat >>$outfile <<_______EOF typedef signed $glib_ssize_type_define gssize; typedef unsigned $glib_size_type_define gsize; #define G_GSIZE_MODIFIER $gsize_modifier #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_mssize_type #define G_MAXSSIZE G_MAX$glib_mssize_type typedef gint64 goffset; #define G_MINOFFSET G_MININT64 #define G_MAXOFFSET G_MAXINT64 #define G_GOFFSET_MODIFIER G_GINT64_MODIFIER #define G_GOFFSET_FORMAT G_GINT64_FORMAT #define G_GOFFSET_CONSTANT(val) G_GINT64_CONSTANT(val) _______EOF if test -z "$glib_unknown_void_p"; then cat >>$outfile <<_______EOF #define GPOINTER_TO_INT(p) ((gint) ${glib_gpi_cast} (p)) #define GPOINTER_TO_UINT(p) ((guint) ${glib_gpui_cast} (p)) #define GINT_TO_POINTER(i) ((gpointer) ${glib_gpi_cast} (i)) #define GUINT_TO_POINTER(u) ((gpointer) ${glib_gpui_cast} (u)) typedef signed $glib_intptr_type_define gintptr; typedef unsigned $glib_intptr_type_define guintptr; #define G_GINTPTR_MODIFIER $gintptr_modifier #define G_GINTPTR_FORMAT $gintptr_format #define G_GUINTPTR_FORMAT $guintptr_format _______EOF else echo '#error SIZEOF_VOID_P unknown - This should never happen' >>$outfile fi cat >>$outfile <<_______EOF $glib_atexit $glib_memmove $glib_defines $glib_os $glib_static_compilation $glib_vacopy #ifdef __cplusplus #define G_HAVE_INLINE 1 #else /* !__cplusplus */ $glib_inline #endif /* !__cplusplus */ #ifdef __cplusplus #define G_CAN_INLINE 1 _______EOF if test x$g_can_inline = xyes ; then cat >>$outfile <<_______EOF #else /* !__cplusplus */ #define G_CAN_INLINE 1 _______EOF fi cat >>$outfile <<_______EOF #endif _______EOF if test x$g_have_iso_c_varargs = xyes ; then cat >>$outfile <<_______EOF #ifndef __cplusplus # define G_HAVE_ISO_VARARGS 1 #endif _______EOF fi if test x$g_have_iso_cxx_varargs = xyes ; then cat >>$outfile <<_______EOF #ifdef __cplusplus # define G_HAVE_ISO_VARARGS 1 #endif _______EOF fi if test x$g_have_gnuc_varargs = xyes ; then cat >>$outfile <<_______EOF /* gcc-2.95.x supports both gnu style and ISO varargs, but if -ansi * is passed ISO vararg support is turned off, and there is no work * around to turn it on, so we unconditionally turn it off. */ #if __GNUC__ == 2 && __GNUC_MINOR__ == 95 # undef G_HAVE_ISO_VARARGS #endif #define G_HAVE_GNUC_VARARGS 1 _______EOF fi case x$g_stack_grows in xyes) echo "#define G_HAVE_GROWING_STACK 1" >>$outfile ;; *) echo "#define G_HAVE_GROWING_STACK 0" >>$outfile ;; esac echo >>$outfile if test x$g_have_eilseq = xno; then cat >>$outfile <<_______EOF #ifndef EILSEQ /* On some systems, like SunOS and NetBSD, EILSEQ is not defined. * The correspondence between this and the corresponding definition * in libiconv is essential. */ # define EILSEQ ENOENT #endif _______EOF fi if test x$g_have_gnuc_visibility = xyes; then cat >>$outfile <<_______EOF #define G_HAVE_GNUC_VISIBILITY 1 _______EOF fi cat >>$outfile <<_______EOF #if defined(__SUNPRO_C) && (__SUNPRO_C >= 0x590) #define G_GNUC_INTERNAL __attribute__((visibility("hidden"))) #elif defined(__SUNPRO_C) && (__SUNPRO_C >= 0x550) #define G_GNUC_INTERNAL __hidden #elif defined (__GNUC__) && defined (G_HAVE_GNUC_VISIBILITY) #define G_GNUC_INTERNAL __attribute__((visibility("hidden"))) #else #define G_GNUC_INTERNAL #endif _______EOF echo >>$outfile cat >>$outfile <<_______EOF #define G_THREADS_ENABLED #define G_THREADS_IMPL_$g_threads_impl_def _______EOF if test x"$g_memory_barrier_needed" != xno; then echo >>$outfile echo "#define G_ATOMIC_OP_MEMORY_BARRIER_NEEDED 1" >>$outfile fi if test x"$g_atomic_lock_free" = xyes; then echo >>$outfile echo "#define G_ATOMIC_LOCK_FREE" >>$outfile fi echo >>$outfile g_bit_sizes="16 32 64" for bits in $g_bit_sizes; do cat >>$outfile <<_______EOF #define GINT${bits}_TO_${g_bs_native}(val) ((gint${bits}) (val)) #define GUINT${bits}_TO_${g_bs_native}(val) ((guint${bits}) (val)) #define GINT${bits}_TO_${g_bs_alien}(val) ((gint${bits}) GUINT${bits}_SWAP_LE_BE (val)) #define GUINT${bits}_TO_${g_bs_alien}(val) (GUINT${bits}_SWAP_LE_BE (val)) _______EOF done cat >>$outfile <<_______EOF #define GLONG_TO_LE(val) ((glong) GINT${glongbits}_TO_LE (val)) #define GULONG_TO_LE(val) ((gulong) GUINT${glongbits}_TO_LE (val)) #define GLONG_TO_BE(val) ((glong) GINT${glongbits}_TO_BE (val)) #define GULONG_TO_BE(val) ((gulong) GUINT${glongbits}_TO_BE (val)) #define GINT_TO_LE(val) ((gint) GINT${gintbits}_TO_LE (val)) #define GUINT_TO_LE(val) ((guint) GUINT${gintbits}_TO_LE (val)) #define GINT_TO_BE(val) ((gint) GINT${gintbits}_TO_BE (val)) #define GUINT_TO_BE(val) ((guint) GUINT${gintbits}_TO_BE (val)) #define GSIZE_TO_LE(val) ((gsize) GUINT${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${gssizebits}_TO_BE (val)) #define G_BYTE_ORDER $g_byte_order #define GLIB_SYSDEF_POLLIN =$g_pollin #define GLIB_SYSDEF_POLLOUT =$g_pollout #define GLIB_SYSDEF_POLLPRI =$g_pollpri #define GLIB_SYSDEF_POLLHUP =$g_pollhup #define GLIB_SYSDEF_POLLERR =$g_pollerr #define GLIB_SYSDEF_POLLNVAL =$g_pollnval #define G_MODULE_SUFFIX "$g_module_suffix" typedef $g_pid_type GPid; #define GLIB_SYSDEF_AF_UNIX $g_af_unix #define GLIB_SYSDEF_AF_INET $g_af_inet #define GLIB_SYSDEF_AF_INET6 $g_af_inet6 #define GLIB_SYSDEF_MSG_OOB $g_msg_oob #define GLIB_SYSDEF_MSG_PEEK $g_msg_peek #define GLIB_SYSDEF_MSG_DONTROUTE $g_msg_dontroute G_END_DECLS #endif /* __GLIBCONFIG_H__ */ _______EOF if cmp -s $outfile glib/glibconfig.h; then AC_MSG_NOTICE([glib/glibconfig.h is unchanged]) rm -f $outfile else mv $outfile glib/glibconfig.h fi ],[ # Note that if two cases are the same, case goes with the first one. # Note also that this is inside an AC_OUTPUT_COMMAND. We do not depend # on variable expansion in case labels. Look at the generated config.status # for a hint. if test "x${ac_cv_working_alloca_h+set}" = xset ; then glib_header_alloca_h="$ac_cv_working_alloca_h" else glib_header_alloca_h="$ac_cv_header_alloca_h" fi case xyes in x$ac_cv_header_float_h) glib_float_h=yes glib_mf=FLT_MIN glib_Mf=FLT_MAX glib_md=DBL_MIN glib_Md=DBL_MAX ;; x$ac_cv_header_values_h) glib_values_h=yes glib_mf=MINFLOAT glib_Mf=MAXFLOAT glib_md=MINDOUBLE glib_Md=MAXDOUBLE ;; esac case xyes in x$ac_cv_header_limits_h) glib_limits_h=yes glib_ms=SHRT_MIN glib_Ms=SHRT_MAX glib_Mus=USHRT_MAX glib_mi=INT_MIN glib_Mi=INT_MAX glib_Mui=UINT_MAX glib_ml=LONG_MIN glib_Ml=LONG_MAX glib_Mul=ULONG_MAX ;; x$ac_cv_header_values_h) glib_values_h=yes glib_ms=MINSHORT glib_Ms=MAXSHORT glib_Mus="(((gushort)G_MAXSHORT)*2+1)" glib_mi=MININT glib_Mi=MAXINT glib_Mui="(((guint)G_MAXINT)*2+1)" glib_ml=MINLONG glib_Ml=MAXLONG glib_Mul="(((gulong)G_MAXLONG)*2+1)" ;; esac if test x$ac_cv_header_sys_poll_h = xyes ; then glib_sys_poll_h=yes fi if test x$enable_included_printf = xyes ; then glib_included_printf=yes fi case 2 in $ac_cv_sizeof_short) gint16=short gint16_modifier='"h"' gint16_format='"hi"' guint16_format='"hu"' ;; $ac_cv_sizeof_int) gint16=int gint16_modifier='""' gint16_format='"i"' guint16_format='"u"' ;; esac case 4 in $ac_cv_sizeof_short) gint32=short gint32_modifier='"h"' gint32_format='"hi"' guint32_format='"hu"' ;; $ac_cv_sizeof_int) gint32=int gint32_modifier='""' gint32_format='"i"' guint32_format='"u"' ;; $ac_cv_sizeof_long) gint32=long gint32_modifier='"l"' gint32_format='"li"' guint32_format='"lu"' ;; esac case 8 in $ac_cv_sizeof_int) gint64=int gint64_modifier='""' gint64_format='"i"' guint64_format='"u"' glib_extension= gint64_constant='(val)' guint64_constant='(val)' ;; $ac_cv_sizeof_long) gint64=long gint64_modifier='"l"' gint64_format='"li"' guint64_format='"lu"' glib_extension= gint64_constant='(val##L)' guint64_constant='(val##UL)' ;; $ac_cv_sizeof_long_long) gint64='long long' if test -n "$glib_cv_long_long_format"; then gint64_modifier='"'$glib_cv_long_long_format'"' gint64_format='"'$glib_cv_long_long_format'i"' guint64_format='"'$glib_cv_long_long_format'u"' fi glib_extension='G_GNUC_EXTENSION ' gint64_constant='(G_GNUC_EXTENSION (val##LL))' guint64_constant='(G_GNUC_EXTENSION (val##ULL))' ;; $ac_cv_sizeof___int64) gint64='__int64' if test -n "$glib_cv_long_long_format"; then gint64_modifier='"'$glib_cv_long_long_format'"' gint64_format='"'$glib_cv_long_long_format'i"' guint64_format='"'$glib_cv_long_long_format'u"' fi glib_extension= gint64_constant='(val##i64)' guint64_constant='(val##ui64)' ;; esac glib_size_t=$ac_cv_sizeof_size_t glib_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 case "$glib_size_type" in short) gsize_modifier='"h"' gsize_format='"hu"' glib_msize_type='SHRT' ;; int) gsize_modifier='""' gsize_format='"u"' glib_msize_type='INT' ;; long) gsize_modifier='"l"' gsize_format='"lu"' glib_msize_type='LONG' ;; "long long"|__int64) gsize_modifier='"I64"' gsize_format='"I64u"' 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) glib_intptr_type_define=int gintptr_modifier='""' gintptr_format='"i"' guintptr_format='"u"' glib_gpi_cast='(gint)' glib_gpui_cast='(guint)' ;; $ac_cv_sizeof_long) glib_intptr_type_define=long gintptr_modifier='"l"' gintptr_format='"li"' guintptr_format='"lu"' glib_gpi_cast='(glong)' glib_gpui_cast='(gulong)' ;; $ac_cv_sizeof_long_long) glib_intptr_type_define='long long' gintptr_modifier='"I64"' gintptr_format='"I64i"' guintptr_format='"I64u"' glib_gpi_cast='(gint64)' glib_gpui_cast='(guint64)' ;; $ac_cv_sizeof___int64) glib_intptr_type_define=__int64 gintptr_modifier='"I64"' gintptr_format='"I64i"' guintptr_format='"I64u"' glib_gpi_cast='(gint64)' glib_gpui_cast='(guint64)' ;; *) glib_unknown_void_p=yes ;; esac case xyes in x$ac_cv_func_atexit) glib_atexit=" #ifdef NeXT /* @#%@! NeXTStep */ # define g_ATEXIT(proc) (!atexit (proc)) #else # define g_ATEXIT(proc) (atexit (proc)) #endif" ;; x$ac_cv_func_on_exit) glib_atexit=" #define g_ATEXIT(proc) (on_exit ((void (*)(int, void*))(proc), NULL))" ;; esac case xyes in x$ac_cv_func_memmove) glib_memmove=' #define g_memmove(dest,src,len) G_STMT_START { memmove ((dest), (src), (len)); } G_STMT_END' ;; x$glib_cv_working_bcopy) glib_memmove=" /* memmove isn't available, but bcopy can copy overlapping memory regions */ #define g_memmove(d,s,n) G_STMT_START { bcopy ((s), (d), (n)); } G_STMT_END" ;; *) glib_memmove=" /* memmove isn't found and bcopy can't copy overlapping memory regions, * so we have to roll our own copy routine. */ void g_memmove (void* dest, const void * src, unsigned long len);" ;; esac glib_defines=" #define GLIB_MAJOR_VERSION $GLIB_MAJOR_VERSION #define GLIB_MINOR_VERSION $GLIB_MINOR_VERSION #define GLIB_MICRO_VERSION $GLIB_MICRO_VERSION " case xyes in x$glib_cv_va_copy) glib_vacopy='#define G_VA_COPY va_copy' ;; x$glib_cv___va_copy) glib_vacopy='#define G_VA_COPY __va_copy' ;; *) glib_vacopy='' esac if test x$glib_cv_va_val_copy = xno; then glib_vacopy="\$glib_vacopy #define G_VA_COPY_AS_ARRAY 1" fi if test x$glib_cv_hasinline = xyes; then glib_inline='#define G_HAVE_INLINE 1' fi if test x$glib_cv_has__inline = xyes; then glib_inline="\$glib_inline #define G_HAVE___INLINE 1" fi if test x$glib_cv_has__inline__ = xyes; then glib_inline="\$glib_inline #define G_HAVE___INLINE__ 1" fi g_have_gnuc_varargs=$g_have_gnuc_varargs g_have_iso_c_varargs=$g_have_iso_c_varargs g_have_iso_cxx_varargs=$g_have_iso_cxx_varargs g_can_inline=$g_can_inline g_have_gnuc_visibility=$g_have_gnuc_visibility g_have_sunstudio_visibility=$g_have_sunstudio_visibility if test x$ac_cv_c_bigendian = xyes; then g_byte_order=G_BIG_ENDIAN g_bs_native=BE g_bs_alien=LE else g_byte_order=G_LITTLE_ENDIAN g_bs_native=LE g_bs_alien=BE fi g_pollin=$glib_cv_value_POLLIN g_pollout=$glib_cv_value_POLLOUT g_pollpri=$glib_cv_value_POLLPRI g_pollhup=$glib_cv_value_POLLHUP g_pollerr=$glib_cv_value_POLLERR g_pollnval=$glib_cv_value_POLLNVAL # If a family is not found on the system, define that family to # a negative value, picking a different one for each undefined # family (-1 for AF_UNIX, -2 for the next one, -3 ...) # This is needed because glib-mkenums doesn't handle optional # values in enums, and thus we have to have all existing values # defined in the enum. if test "x$glib_cv_value_AF_UNIX" != "x"; then g_af_unix=$glib_cv_value_AF_UNIX else g_af_unix=-1 fi g_af_inet=$glib_cv_value_AF_INET g_af_inet6=$glib_cv_value_AF_INET6 g_msg_peek=$glib_cv_value_MSG_PEEK g_msg_oob=$glib_cv_value_MSG_OOB g_msg_dontroute=$glib_cv_value_MSG_DONTROUTE g_stack_grows=$glib_cv_stack_grows g_have_eilseq=$have_eilseq g_threads_impl_def=$g_threads_impl g_atomic_lock_free="$glib_cv_g_atomic_lock_free" g_memory_barrier_needed="$glib_memory_barrier_needed" g_gcc_atomic_ops="$glib_cv_gcc_has_builtin_atomic_operations" g_module_suffix="$glib_gmodule_suffix" g_pid_type="$glib_pid_type" case $host in *-*-beos*) glib_os="#define G_OS_BEOS" ;; *-*-cygwin*) glib_os="#define G_OS_UNIX #define G_PLATFORM_WIN32 #define G_WITH_CYGWIN" ;; *-*-mingw*) glib_os="#define G_OS_WIN32 #define G_PLATFORM_WIN32" ;; *) glib_os="#define G_OS_UNIX" ;; esac glib_static_compilation="" if test x$glib_win32_static_compilation = xyes; then glib_static_compilation="#define GLIB_STATIC_COMPILATION 1 #define GOBJECT_STATIC_COMPILATION 1" fi ]) # Redo enough to get guint32 and guint64 for the alignment checks below case 4 in $ac_cv_sizeof_short) gint32=short ;; $ac_cv_sizeof_int) gint32=int ;; $ac_cv_sizeof_long) gint32=long ;; esac case 8 in $ac_cv_sizeof_int) gint64=int ;; $ac_cv_sizeof_long) gint64=long ;; $ac_cv_sizeof_long_long) gint64='long long' ;; $ac_cv_sizeof___int64) gint64='__int64' ;; esac AC_CHECK_TYPE([guint32],,,[typedef unsigned $gint32 guint32;]) AC_CHECK_ALIGNOF([guint32], [AC_INCLUDES_DEFAULT typedef unsigned $gint32 guint32;]) AC_CHECK_TYPE([guint64],,,[typedef unsigned $gint64 guint64;]) AC_CHECK_ALIGNOF([guint64], [AC_INCLUDES_DEFAULT typedef unsigned $gint64 guint64;]) AC_CHECK_TYPE([unsigned long]) AC_CHECK_ALIGNOF([unsigned long]) dnl dnl Check for -Bsymbolic-functions linker flag used to avoid dnl intra-library PLT jumps, if available. dnl AC_ARG_ENABLE(Bsymbolic, [AS_HELP_STRING([--disable-Bsymbolic], [avoid linking with -Bsymbolic])],, [SAVED_LDFLAGS="${LDFLAGS}" AC_MSG_CHECKING([for -Bsymbolic-functions linker flag]) LDFLAGS=-Wl,-Bsymbolic-functions AC_TRY_LINK([], [int main (void) { return 0; }], AC_MSG_RESULT(yes) enable_Bsymbolic=yes, AC_MSG_RESULT(no) enable_Bsymbolic=no) LDFLAGS="${SAVED_LDFLAGS}"]) if test "x${enable_Bsymbolic}" = "xyes"; then GLIB_LINK_FLAGS=-Wl,-Bsymbolic-functions 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. # # for config.h: config_h_INCLUDES='-I$(top_builddir)' AC_SUBST(config_h_INCLUDES) # glib: # config.h # $(top_builddir)/glib: for glibconfig.h # $(top_srcdir)/glib: for glib.h # $(top_srcdir): for everything glib_INCLUDES='$(config_h_INCLUDES) -I$(top_builddir)/glib -I$(top_srcdir)/glib -I$(top_srcdir)' AC_SUBST(glib_INCLUDES) # gobject: # same as glib gobject_INCLUDES='$(glib_INCLUDES)' AC_SUBST(gobject_INCLUDES) # gmodule: # glib includes # $(top_srcdir)/gmodule: for gmodule.h gmodule_INCLUDES='$(glib_INCLUDES) -I$(top_srcdir)/gmodule' AC_SUBST(gmodule_INCLUDES) # gio: # same as gmodule gio_INCLUDES='$(gmodule_INCLUDES)' AC_SUBST(gio_INCLUDES) AC_CONFIG_FILES([ Makefile glib/Makefile glib/libcharset/Makefile glib/gnulib/Makefile m4macros/Makefile ]) # we want to invoke this macro solely so that the config.status script # and automake generated makefiles know about these generated files. # They are only needed to distcheck the package if false; then AC_CONFIG_FILES([ README glib/glib.rc ]) fi AC_OUTPUT pkg-config-0.29.1/glib/Makefile.in0000664000175000017500000017764612665370333013571 00000000000000# Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # GLIB - Library of useful C routines VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ installed_test_PROGRAMS = $(am__EXEEXT_1) noinst_PROGRAMS = $(am__EXEEXT_3) check_PROGRAMS = $(am__EXEEXT_2) TESTS = $(am__EXEEXT_1) @OS_WIN32_TRUE@am__append_1 = $(test_programs) $(test_scripts) $(uninstalled_test_programs) $(uninstalled_test_scripts) \ @OS_WIN32_TRUE@ $(dist_test_scripts) $(dist_uninstalled_test_scripts) @ENABLE_ALWAYS_BUILD_TESTS_TRUE@am__append_2 = $(all_test_ltlibs) @ENABLE_ALWAYS_BUILD_TESTS_TRUE@am__append_3 = $(all_test_programs) @ENABLE_ALWAYS_BUILD_TESTS_TRUE@am__append_4 = $(all_test_scripts) @ENABLE_ALWAYS_BUILD_TESTS_TRUE@am__append_5 = $(all_test_data) @ENABLE_ALWAYS_BUILD_TESTS_FALSE@am__append_6 = $(all_test_ltlibs) @ENABLE_ALWAYS_BUILD_TESTS_FALSE@am__append_7 = $(all_test_programs) @ENABLE_ALWAYS_BUILD_TESTS_FALSE@am__append_8 = $(all_test_scripts) @ENABLE_ALWAYS_BUILD_TESTS_FALSE@am__append_9 = $(all_test_data) @ENABLE_INSTALLED_TESTS_TRUE@am__append_10 = $(test_programs) $(installed_test_programs) \ @ENABLE_INSTALLED_TESTS_TRUE@ $(test_extra_programs) $(installed_test_extra_programs) @ENABLE_INSTALLED_TESTS_TRUE@am__append_11 = $(test_scripts) \ @ENABLE_INSTALLED_TESTS_TRUE@ $(installed_test_scripts) \ @ENABLE_INSTALLED_TESTS_TRUE@ $(test_extra_scripts) \ @ENABLE_INSTALLED_TESTS_TRUE@ $(test_installed_extra_scripts) \ @ENABLE_INSTALLED_TESTS_TRUE@ $(dist_test_scripts) \ @ENABLE_INSTALLED_TESTS_TRUE@ $(dist_test_extra_scripts) \ @ENABLE_INSTALLED_TESTS_TRUE@ $(dist_installed_test_scripts) \ @ENABLE_INSTALLED_TESTS_TRUE@ $(dist_installed_test_extra_scripts) @ENABLE_INSTALLED_TESTS_TRUE@am__append_12 = $(test_data) \ @ENABLE_INSTALLED_TESTS_TRUE@ $(installed_test_data) \ @ENABLE_INSTALLED_TESTS_TRUE@ $(dist_test_data) \ @ENABLE_INSTALLED_TESTS_TRUE@ $(dist_installed_test_data) @ENABLE_INSTALLED_TESTS_TRUE@am__append_13 = $(test_ltlibraries) $(installed_test_ltlibraries) @ENABLE_INSTALLED_TESTS_TRUE@am__append_14 = $(installed_test_meta_DATA) subdir = . ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4macros/attributes.m4 \ $(top_srcdir)/m4macros/glibtests.m4 \ $(top_srcdir)/m4macros/libtool.m4 \ $(top_srcdir)/m4macros/ltoptions.m4 \ $(top_srcdir)/m4macros/ltsugar.m4 \ $(top_srcdir)/m4macros/ltversion.m4 \ $(top_srcdir)/m4macros/lt~obsolete.m4 \ $(top_srcdir)/acinclude.m4 $(top_srcdir)/acglib.m4 \ $(top_srcdir)/glib/libcharset/codeset.m4 \ $(top_srcdir)/glib/libcharset/glibc21.m4 \ $(top_srcdir)/m4macros/glib-gettext.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \ $(am__configure_deps) $(am__DIST_COMMON) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_HEADER = config.h CONFIG_CLEAN_FILES = README CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(installed_testdir)" \ "$(DESTDIR)$(installed_testdir)" \ "$(DESTDIR)$(installed_testdir)" \ "$(DESTDIR)$(installed_test_metadir)" \ "$(DESTDIR)$(installed_testdir)" LTLIBRARIES = $(installed_test_LTLIBRARIES) $(noinst_LTLIBRARIES) am__EXEEXT_1 = @ENABLE_ALWAYS_BUILD_TESTS_FALSE@am__EXEEXT_2 = $(am__EXEEXT_1) @ENABLE_ALWAYS_BUILD_TESTS_TRUE@am__EXEEXT_3 = $(am__EXEEXT_1) PROGRAMS = $(installed_test_PROGRAMS) $(noinst_PROGRAMS) SCRIPTS = $(installed_test_SCRIPTS) $(noinst_SCRIPTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(installed_test_meta_DATA) $(nobase_installed_test_DATA) \ $(noinst_DATA) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ cscope check recheck distdir dist dist-all distcheck am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \ $(LISP)config.h.in # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags CSCOPE = cscope am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/README.in \ $(srcdir)/config.h.in $(top_srcdir)/glib.mk AUTHORS COPYING \ compile config.guess config.sub depcomp install-sh ltmain.sh \ missing test-driver DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ if test -d "$(distdir)"; then \ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -rf "$(distdir)" \ || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi am__post_remove_distdir = $(am__remove_distdir) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" GZIP_ENV = --best DIST_ARCHIVES = $(distdir).tar.xz DIST_TARGETS = dist-xz distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = find . -type f -print ABS_GLIB_RUNTIME_LIBDIR = @ABS_GLIB_RUNTIME_LIBDIR@ ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO = @GIO@ GIO_MODULE_DIR = @GIO_MODULE_DIR@ GLIBC21 = @GLIBC21@ GLIB_BINARY_AGE = @GLIB_BINARY_AGE@ GLIB_DEBUG_FLAGS = @GLIB_DEBUG_FLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_HIDDEN_VISIBILITY_CFLAGS = @GLIB_HIDDEN_VISIBILITY_CFLAGS@ GLIB_INTERFACE_AGE = @GLIB_INTERFACE_AGE@ GLIB_LINK_FLAGS = @GLIB_LINK_FLAGS@ GLIB_MAJOR_VERSION = @GLIB_MAJOR_VERSION@ GLIB_MICRO_VERSION = @GLIB_MICRO_VERSION@ GLIB_MINOR_VERSION = @GLIB_MINOR_VERSION@ GLIB_RUNTIME_LIBDIR = @GLIB_RUNTIME_LIBDIR@ GLIB_VERSION = @GLIB_VERSION@ GLIB_WARN_CFLAGS = @GLIB_WARN_CFLAGS@ GLIB_WIN32_STATIC_COMPILATION_DEFINE = @GLIB_WIN32_STATIC_COMPILATION_DEFINE@ GREP = @GREP@ GSPAWN = @GSPAWN@ GTHREAD_COMPILE_IMPL_DEFINES = @GTHREAD_COMPILE_IMPL_DEFINES@ G_LIBS_EXTRA = @G_LIBS_EXTRA@ G_MODULE_BROKEN_RTLD_GLOBAL = @G_MODULE_BROKEN_RTLD_GLOBAL@ G_MODULE_HAVE_DLERROR = @G_MODULE_HAVE_DLERROR@ G_MODULE_IMPL = @G_MODULE_IMPL@ G_MODULE_LDFLAGS = @G_MODULE_LDFLAGS@ G_MODULE_LIBS = @G_MODULE_LIBS@ G_MODULE_LIBS_EXTRA = @G_MODULE_LIBS_EXTRA@ G_MODULE_NEED_USCORE = @G_MODULE_NEED_USCORE@ G_MODULE_PLUGIN_LIBS = @G_MODULE_PLUGIN_LIBS@ G_MODULE_SUPPORTED = @G_MODULE_SUPPORTED@ G_THREAD_CFLAGS = @G_THREAD_CFLAGS@ G_THREAD_LIBS = @G_THREAD_LIBS@ G_THREAD_LIBS_EXTRA = @G_THREAD_LIBS_EXTRA@ G_THREAD_LIBS_FOR_GTHREAD = @G_THREAD_LIBS_FOR_GTHREAD@ ICONV_LIBS = @ICONV_LIBS@ INDENT = @INDENT@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIB_EXE_MACHINE_FLAG = @LIB_EXE_MACHINE_FLAG@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LTP = @LTP@ LTP_GENHTML = @LTP_GENHTML@ LT_AGE = @LT_AGE@ LT_CURRENT = @LT_CURRENT@ LT_CURRENT_MINUS_AGE = @LT_CURRENT_MINUS_AGE@ LT_RELEASE = @LT_RELEASE@ LT_REVISION = @LT_REVISION@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NAMESER_COMPAT_INCLUDE = @NAMESER_COMPAT_INCLUDE@ NETWORK_LIBS = @NETWORK_LIBS@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PERL = @PERL@ PERL_PATH = @PERL_PATH@ PLATFORMDEP = @PLATFORMDEP@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ REBUILD = @REBUILD@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHTOOL = @SHTOOL@ STRIP = @STRIP@ VERSION = @VERSION@ WINDRES = @WINDRES@ WSPIAPI_INCLUDE = @WSPIAPI_INCLUDE@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ config_h_INCLUDES = @config_h_INCLUDES@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gio_INCLUDES = @gio_INCLUDES@ glib_INCLUDES = @glib_INCLUDES@ gmodule_INCLUDES = @gmodule_INCLUDES@ gobject_INCLUDES = @gobject_INCLUDES@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ installed_test_metadir = @installed_test_metadir@ installed_testdir = @installed_testdir@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ ms_librarian = @ms_librarian@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ #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 = # These may be in the builddir too BUILT_EXTRA_DIST = README $(NULL) CLEANFILES = *.log *.trs $(am__append_14) DISTCLEANFILES = config.lt MAINTAINERCLEANFILES = EXTRA_DIST = $(all_dist_test_scripts) $(all_dist_test_data) acglib.m4 \ README.in glib.mk $(NULL) # 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)) installed_test_LTLIBRARIES = $(am__append_13) installed_test_SCRIPTS = $(am__append_11) nobase_installed_test_DATA = $(am__append_12) noinst_LTLIBRARIES = $(am__append_2) noinst_SCRIPTS = $(am__append_4) noinst_DATA = $(am__append_5) check_LTLIBRARIES = $(am__append_6) check_SCRIPTS = $(am__append_8) check_DATA = $(am__append_9) # 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) 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_data = $(test_data) $(uninstalled_test_data) \ $(installed_test_data) $(all_dist_test_data) all_dist_test_data = $(dist_test_data) $(dist_uninstalled_test_data) $(dist_installed_test_data) all_test_ltlibs = $(test_ltlibraries) $(uninstalled_test_ltlibraries) $(installed_test_ltlibraries) @ENABLE_INSTALLED_TESTS_TRUE@installed_testcases = $(test_programs) $(installed_test_programs) \ @ENABLE_INSTALLED_TESTS_TRUE@ $(test_scripts) $(installed_test_scripts) \ @ENABLE_INSTALLED_TESTS_TRUE@ $(dist_test_scripts) $(dist_installed_test_scripts) @ENABLE_INSTALLED_TESTS_TRUE@installed_test_meta_DATA = $(installed_testcases:=.test) ACLOCAL_AMFLAGS = -I m4macros ${ACLOCAL_FLAGS} SUBDIRS = . m4macros glib DIST_SUBDIRS = $(SUBDIRS) AM_CPPFLAGS = \ -DG_LOG_DOMAIN=g_log_domain_glib \ @GLIB_DEBUG_FLAGS@ \ -DG_DISABLE_DEPRECATED \ -DGLIB_COMPILATION CONFIGURE_DEPENDENCIES = acglib.m4 # build documentation when doing distcheck DISTCHECK_CONFIGURE_FLAGS = --enable-debug --enable-gtk-doc --enable-man --disable-maintainer-mode all: $(BUILT_SOURCES) config.h $(MAKE) $(AM_MAKEFLAGS) all-recursive .SUFFIXES: .SUFFIXES: .log .test .test$(EXEEXT) .trs am--refresh: Makefile @: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/glib.mk $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ esac; $(top_srcdir)/glib.mk $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): config.h: stamp-h1 @test -f $@ || rm -f stamp-h1 @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1 stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status @rm -f stamp-h1 cd $(top_builddir) && $(SHELL) ./config.status config.h $(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) rm -f stamp-h1 touch $@ distclean-hdr: -rm -f config.h stamp-h1 README: $(top_builddir)/config.status $(srcdir)/README.in cd $(top_builddir) && $(SHELL) ./config.status $@ clean-checkLTLIBRARIES: -test -z "$(check_LTLIBRARIES)" || rm -f $(check_LTLIBRARIES) @list='$(check_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } install-installed_testLTLIBRARIES: $(installed_test_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(installed_test_LTLIBRARIES)'; test -n "$(installed_testdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(installed_testdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(installed_testdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(installed_testdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(installed_testdir)"; \ } uninstall-installed_testLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(installed_test_LTLIBRARIES)'; test -n "$(installed_testdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(installed_testdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(installed_testdir)/$$f"; \ done clean-installed_testLTLIBRARIES: -test -z "$(installed_test_LTLIBRARIES)" || rm -f $(installed_test_LTLIBRARIES) @list='$(installed_test_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list install-installed_testPROGRAMS: $(installed_test_PROGRAMS) @$(NORMAL_INSTALL) @list='$(installed_test_PROGRAMS)'; test -n "$(installed_testdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(installed_testdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(installed_testdir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ || test -f $$p1 \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(installed_testdir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(installed_testdir)$$dir" || exit $$?; \ } \ ; done uninstall-installed_testPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(installed_test_PROGRAMS)'; test -n "$(installed_testdir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(installed_testdir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(installed_testdir)" && rm -f $$files clean-installed_testPROGRAMS: @list='$(installed_test_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list clean-noinstPROGRAMS: @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list install-installed_testSCRIPTS: $(installed_test_SCRIPTS) @$(NORMAL_INSTALL) @list='$(installed_test_SCRIPTS)'; test -n "$(installed_testdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(installed_testdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(installed_testdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) { files[d] = files[d] " " $$1; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$4, $$1 } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(installed_testdir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(installed_testdir)$$dir" || exit $$?; \ } \ ; done uninstall-installed_testSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(installed_test_SCRIPTS)'; test -n "$(installed_testdir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ dir='$(DESTDIR)$(installed_testdir)'; $(am__uninstall_files_from_dir) mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs distclean-libtool: -rm -f libtool config.lt install-installed_test_metaDATA: $(installed_test_meta_DATA) @$(NORMAL_INSTALL) @list='$(installed_test_meta_DATA)'; test -n "$(installed_test_metadir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(installed_test_metadir)'"; \ $(MKDIR_P) "$(DESTDIR)$(installed_test_metadir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(installed_test_metadir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(installed_test_metadir)" || exit $$?; \ done uninstall-installed_test_metaDATA: @$(NORMAL_UNINSTALL) @list='$(installed_test_meta_DATA)'; test -n "$(installed_test_metadir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(installed_test_metadir)'; $(am__uninstall_files_from_dir) install-nobase_installed_testDATA: $(nobase_installed_test_DATA) @$(NORMAL_INSTALL) @list='$(nobase_installed_test_DATA)'; test -n "$(installed_testdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(installed_testdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(installed_testdir)" || exit 1; \ fi; \ $(am__nobase_list) | while read dir files; do \ xfiles=; for file in $$files; do \ if test -f "$$file"; then xfiles="$$xfiles $$file"; \ else xfiles="$$xfiles $(srcdir)/$$file"; fi; done; \ test -z "$$xfiles" || { \ test "x$$dir" = x. || { \ echo " $(MKDIR_P) '$(DESTDIR)$(installed_testdir)/$$dir'"; \ $(MKDIR_P) "$(DESTDIR)$(installed_testdir)/$$dir"; }; \ echo " $(INSTALL_DATA) $$xfiles '$(DESTDIR)$(installed_testdir)/$$dir'"; \ $(INSTALL_DATA) $$xfiles "$(DESTDIR)$(installed_testdir)/$$dir" || exit $$?; }; \ done uninstall-nobase_installed_testDATA: @$(NORMAL_UNINSTALL) @list='$(nobase_installed_test_DATA)'; test -n "$(installed_testdir)" || list=; \ $(am__nobase_strip_setup); files=`$(am__nobase_strip)`; \ dir='$(DESTDIR)$(installed_testdir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscope: cscope.files test ! -s cscope.files \ || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) clean-cscope: -rm -f cscope.files cscope.files: clean-cscope cscopelist cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags -rm -f cscope.out cscope.in.out cscope.po.out cscope.files # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ elif test -n "$$redo_logs"; then \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_LTLIBRARIES) $(check_PROGRAMS) $(check_SCRIPTS) $(check_DATA) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) $(am__remove_distdir) test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$(top_distdir)" distdir="$(distdir)" \ dist-hook -test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__post_remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(am__post_remove_distdir) dist-lzip: distdir tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz $(am__post_remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(am__post_remove_distdir) dist-tarZ: distdir @echo WARNING: "Support for distribution archives compressed with" \ "legacy program 'compress' is deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__post_remove_distdir) dist-shar: distdir @echo WARNING: "Support for shar distribution archives is" \ "deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__post_remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__post_remove_distdir) dist dist-all: $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' $(am__post_remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lz*) \ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir) chmod u+w $(distdir) mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build/sub \ && ../../configure \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ --srcdir=../.. --prefix="$$dc_install_base" \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 $(am__post_remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @test -n '$(distuninstallcheck_dir)' || { \ echo 'ERROR: trying to run $@ with an empty' \ '$$(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ $(am__cd) '$(distuninstallcheck_dir)' || { \ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_LTLIBRARIES) $(check_PROGRAMS) \ $(check_SCRIPTS) $(check_DATA) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check-local check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-recursive all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(SCRIPTS) $(DATA) \ config.h installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(installed_testdir)" "$(DESTDIR)$(installed_testdir)" "$(DESTDIR)$(installed_testdir)" "$(DESTDIR)$(installed_test_metadir)" "$(DESTDIR)$(installed_testdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-recursive clean-am: clean-checkLTLIBRARIES clean-checkPROGRAMS clean-generic \ clean-installed_testLTLIBRARIES clean-installed_testPROGRAMS \ clean-libtool clean-noinstLTLIBRARIES clean-noinstPROGRAMS \ mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-generic distclean-hdr \ distclean-libtool distclean-local distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-installed_testLTLIBRARIES \ install-installed_testPROGRAMS install-installed_testSCRIPTS \ install-installed_test_metaDATA \ install-nobase_installed_testDATA install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-installed_testLTLIBRARIES \ uninstall-installed_testPROGRAMS \ uninstall-installed_testSCRIPTS \ uninstall-installed_test_metaDATA \ uninstall-nobase_installed_testDATA .MAKE: $(am__recursive_targets) all check check-am install install-am \ install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ am--refresh check check-TESTS check-am check-local clean \ clean-checkLTLIBRARIES clean-checkPROGRAMS clean-cscope \ clean-generic clean-installed_testLTLIBRARIES \ clean-installed_testPROGRAMS clean-libtool \ clean-noinstLTLIBRARIES clean-noinstPROGRAMS cscope \ cscopelist-am ctags ctags-am dist dist-all dist-bzip2 \ dist-gzip dist-hook dist-lzip dist-shar dist-tarZ dist-xz \ dist-zip distcheck distclean distclean-generic distclean-hdr \ distclean-libtool distclean-local distclean-tags \ distcleancheck distdir distuninstallcheck dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-installed_testLTLIBRARIES \ install-installed_testPROGRAMS install-installed_testSCRIPTS \ install-installed_test_metaDATA install-man \ install-nobase_installed_testDATA install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am recheck tags tags-am \ uninstall uninstall-am uninstall-installed_testLTLIBRARIES \ uninstall-installed_testPROGRAMS \ uninstall-installed_testSCRIPTS \ uninstall-installed_test_metaDATA \ uninstall-nobase_installed_testDATA .PRECIOUS: Makefile ### testing rules # test: run all tests in cwd and subdirs test: test-nonrecursive @OS_UNIX_TRUE@ @ for subdir in $(SUBDIRS) . ; do \ @OS_UNIX_TRUE@ test "$$subdir" = "." -o "$$subdir" = "po" || \ @OS_UNIX_TRUE@ ( cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $@ ) || exit $? ; \ @OS_UNIX_TRUE@ done # test-nonrecursive: run tests only in cwd @OS_UNIX_TRUE@test-nonrecursive: ${TEST_PROGS} @OS_UNIX_TRUE@ @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} @OS_UNIX_FALSE@test-nonrecursive: # 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 ; \ echo '' >> $@.xml ; \ echo '' >> $@.xml ; \ echo ' $(PACKAGE)' >> $@.xml ; \ echo ' $(VERSION)' >> $@.xml ; \ echo " $$REVISION" >> $@.xml ; \ echo '' >> $@.xml ; \ for lf in `ls -L "$$GTESTER_LOGDIR"/.` ; do \ sed '1,1s/^?]*?>//' <"$$GTESTER_LOGDIR"/"$$lf" >> $@.xml ; \ done ; \ echo >> $@.xml ; \ echo '' >> $@.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 @ENABLE_INSTALLED_TESTS_TRUE@%.test: %$(EXEEXT) Makefile @ENABLE_INSTALLED_TESTS_TRUE@ $(AM_V_GEN) (echo '[Test]' > $@.tmp; \ @ENABLE_INSTALLED_TESTS_TRUE@ echo 'Type=session' >> $@.tmp; \ @ENABLE_INSTALLED_TESTS_TRUE@ echo 'Exec=$(installed_testdir)/$<' >> $@.tmp; \ @ENABLE_INSTALLED_TESTS_TRUE@ mv $@.tmp $@) # http://people.gnome.org/~walters/docs/build-api.txt .buildapi-allow-builddir: distclean-local: lcov-clean if test $(srcdir) = .; then :; else \ rm -f $(BUILT_EXTRA_DIST); \ fi .PHONY: files release sanity snapshot files: @files=`ls $(DISTFILES) 2> /dev/null `; for p in $$files; do \ echo $$p; \ done release: rm -rf .deps */.deps cd docs && make glib.html $(MAKE) distcheck sanity: ./sanity_check $(VERSION) snapshot: $(MAKE) dist distdir=$(PACKAGE)-snap`date +"%Y%m%d"` snapcheck: $(MAKE) distcheck distdir=$(PACKAGE)-snap`date +"%Y%m%d"` dist-hook: $(BUILT_EXTRA_DIST) files='$(BUILT_EXTRA_DIST)'; \ for f in $$files; do \ if test -f $$f; then d=.; else d=$(srcdir); fi; \ rm -f $(distdir)/$$f && cp $$d/$$f $(distdir) || exit 1; done # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: pkg-config-0.29.1/glib/COPYING0000664000175000017500000006131412275467762012551 00000000000000 GNU LIBRARY GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the library GPL. It is numbered 2 because it goes with version 2 of the ordinary GPL.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Library General Public License, applies to some specially designated Free Software Foundation software, and to any other libraries whose authors decide to use it. You can use it for your libraries, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library, or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link a program with the library, you must provide complete object files to the recipients so that they can relink them with the library, after making changes to the library and recompiling it. And you must show them these terms so they know their rights. Our method of protecting your rights has two steps: (1) copyright the library, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the library. Also, for each distributor's protection, we want to make certain that everyone understands that there is no warranty for this free library. If the library is modified by someone else and passed on, we want its recipients to know that what they have is not the original version, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that companies distributing free software will individually obtain patent licenses, thus in effect transforming the program into proprietary software. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License, which was designed for utility programs. This license, the GNU Library General Public License, applies to certain designated libraries. This license is quite different from the ordinary one; be sure to read it in full, and don't assume that anything in it is the same as in the ordinary license. The reason we have a separate public license for some libraries is that they blur the distinction we usually make between modifying or adding to a program and simply using it. Linking a program with a library, without changing the library, is in some sense simply using the library, and is analogous to running a utility program or application program. However, in a textual and legal sense, the linked executable is a combined work, a derivative of the original library, and the ordinary General Public License treats it as such. Because of this blurred distinction, using the ordinary General Public License for libraries did not effectively promote software sharing, because most developers did not use the libraries. We concluded that weaker conditions might promote sharing better. However, unrestricted linking of non-free programs would deprive the users of those programs of all benefit from the free status of the libraries themselves. This Library General Public License is intended to permit developers of non-free programs to use free libraries, while preserving your freedom as a user of such programs to change the free libraries that are incorporated in them. (We have not seen how to achieve this as regards changes in header files, but we have achieved it as regards changes in the actual functions of the Library.) The hope is that this will lead to faster development of free libraries. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, while the latter only works together with the library. Note that it is possible for a library to be covered by the ordinary General Public License rather than by this special one. GNU LIBRARY GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Library General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also compile or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. c) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. d) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Library General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307 USA. Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! pkg-config-0.29.1/glib/acinclude.m40000664000175000017500000003402512275467762013706 00000000000000dnl @synopsis AC_FUNC_VSNPRINTF_C99 dnl dnl Check whether there is a vsnprintf() function with C99 semantics installed. dnl AC_DEFUN([AC_FUNC_VSNPRINTF_C99], [AC_CACHE_CHECK(for C99 vsnprintf, ac_cv_func_vsnprintf_c99, [AC_TRY_RUN( [#include #include int doit(char * s, ...) { char buffer[32]; va_list args; int r; va_start(args, s); r = vsnprintf(buffer, 5, s, args); va_end(args); if (r != 7) exit(1); /* AIX 5.1 and Solaris seems to have a half-baked vsnprintf() implementation. The above will return 7 but if you replace the size of the buffer with 0, it borks! */ va_start(args, s); r = vsnprintf(buffer, 0, s, args); va_end(args); if (r != 7) exit(1); exit(0); } int main(void) { doit("1234567"); exit(1); }], ac_cv_func_vsnprintf_c99=yes, ac_cv_func_vsnprintf_c99=no, ac_cv_func_vsnprintf_c99=no)]) dnl Note that the default is to be pessimistic in the case of cross compilation. dnl If you know that the target has a C99 vsnprintf(), you can get around this dnl by setting ac_func_vsnprintf_c99 to yes, as described in the Autoconf manual. if test $ac_cv_func_vsnprintf_c99 = yes; then AC_DEFINE(HAVE_C99_VSNPRINTF, 1, [Define if you have a version of the vsnprintf function with semantics as specified by the ISO C99 standard.]) fi ])# AC_FUNC_VSNPRINTF_C99 dnl @synopsis AC_FUNC_SNPRINTF_C99 dnl dnl Check whether there is a snprintf() function with C99 semantics installed. dnl AC_DEFUN([AC_FUNC_SNPRINTF_C99], [AC_CACHE_CHECK(for C99 snprintf, ac_cv_func_snprintf_c99, [AC_TRY_RUN( [#include #include int doit() { char buffer[32]; va_list args; int r; r = snprintf(buffer, 5, "1234567"); if (r != 7) exit(1); r = snprintf(buffer, 0, "1234567"); if (r != 7) exit(1); r = snprintf(NULL, 0, "1234567"); if (r != 7) exit(1); exit(0); } int main(void) { doit(); exit(1); }], ac_cv_func_snprintf_c99=yes, ac_cv_func_snprintf_c99=no, ac_cv_func_snprintf_c99=no)]) dnl Note that the default is to be pessimistic in the case of cross compilation. dnl If you know that the target has a C99 snprintf(), you can get around this dnl by setting ac_func_snprintf_c99 to yes, as described in the Autoconf manual. if test $ac_cv_func_snprintf_c99 = yes; then AC_DEFINE(HAVE_C99_SNPRINTF, 1, [Define if you have a version of the snprintf function with semantics as specified by the ISO C99 standard.]) fi ])# AC_FUNC_SNPRINTF_C99 dnl @synopsis AC_FUNC_PRINTF_UNIX98 dnl dnl Check whether the printf() family supports Unix98 %n$ positional parameters dnl AC_DEFUN([AC_FUNC_PRINTF_UNIX98], [AC_CACHE_CHECK(whether printf supports positional parameters, ac_cv_func_printf_unix98, [AC_TRY_RUN( [#include int main (void) { char buffer[128]; sprintf (buffer, "%2\$d %3\$d %1\$d", 1, 2, 3); if (strcmp ("2 3 1", buffer) == 0) exit (0); exit (1); }], ac_cv_func_printf_unix98=yes, ac_cv_func_printf_unix98=no, ac_cv_func_printf_unix98=no)]) dnl Note that the default is to be pessimistic in the case of cross compilation. dnl If you know that the target printf() supports positional parameters, you can get around dnl this by setting ac_func_printf_unix98 to yes, as described in the Autoconf manual. if test $ac_cv_func_printf_unix98 = yes; then AC_DEFINE(HAVE_UNIX98_PRINTF, 1, [Define if your printf function family supports positional parameters as specified by Unix98.]) fi ])# AC_FUNC_PRINTF_UNIX98 # Checks the location of the XML Catalog # Usage: # JH_PATH_XML_CATALOG([ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) # Defines XMLCATALOG and XML_CATALOG_FILE substitutions AC_DEFUN([JH_PATH_XML_CATALOG], [ # check for the presence of the XML catalog AC_ARG_WITH([xml-catalog], AC_HELP_STRING([--with-xml-catalog=CATALOG], [path to xml catalog to use]),, [with_xml_catalog=/etc/xml/catalog]) jh_found_xmlcatalog=true XML_CATALOG_FILE="$with_xml_catalog" AC_SUBST([XML_CATALOG_FILE]) AC_MSG_CHECKING([for XML catalog ($XML_CATALOG_FILE)]) if test -f "$XML_CATALOG_FILE"; then AC_MSG_RESULT([found]) else jh_found_xmlcatalog=false AC_MSG_RESULT([not found]) fi # check for the xmlcatalog program AC_PATH_PROG(XMLCATALOG, xmlcatalog, no) if test "x$XMLCATALOG" = xno; then jh_found_xmlcatalog=false fi if $jh_found_xmlcatalog; then ifelse([$1],,[:],[$1]) else ifelse([$2],,[AC_MSG_ERROR([could not find XML catalog])],[$2]) fi ]) # Checks if a particular URI appears in the XML catalog # Usage: # JH_CHECK_XML_CATALOG(URI, [FRIENDLY-NAME], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) AC_DEFUN([JH_CHECK_XML_CATALOG], [ AC_REQUIRE([JH_PATH_XML_CATALOG],[JH_PATH_XML_CATALOG(,[:])])dnl AC_MSG_CHECKING([for ifelse([$2],,[$1],[$2]) in XML catalog]) if $jh_found_xmlcatalog && \ AC_RUN_LOG([$XMLCATALOG --noout "$XML_CATALOG_FILE" "$1" >&2]); then AC_MSG_RESULT([found]) ifelse([$3],,,[$3 ])dnl else AC_MSG_RESULT([not found]) ifelse([$4],, [AC_MSG_ERROR([could not find ifelse([$2],,[$1],[$2]) in XML catalog])], [$4]) fi ]) # signed.m4 serial 1 (gettext-0.10.40) dnl Copyright (C) 2001-2002 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. dnl From Bruno Haible. AC_DEFUN([bh_C_SIGNED], [ AC_CACHE_CHECK([for signed], bh_cv_c_signed, [AC_TRY_COMPILE(, [signed char x;], bh_cv_c_signed=yes, bh_cv_c_signed=no)]) if test $bh_cv_c_signed = no; then AC_DEFINE(signed, , [Define to empty if the C compiler doesn't support this keyword.]) fi ]) # longlong.m4 serial 4 dnl Copyright (C) 1999-2003 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. dnl From Paul Eggert. # Define HAVE_LONG_LONG if 'long long' works. AC_DEFUN([jm_AC_TYPE_LONG_LONG], [ AC_CACHE_CHECK([for long long], ac_cv_type_long_long, [AC_TRY_LINK([long long ll = 1LL; int i = 63;], [long long llmax = (long long) -1; return ll << i | ll >> i | llmax / ll | llmax % ll;], ac_cv_type_long_long=yes, ac_cv_type_long_long=no)]) if test $ac_cv_type_long_long = yes; then AC_DEFINE(HAVE_LONG_LONG, 1, [Define if you have the 'long long' type.]) fi ]) # longdouble.m4 serial 1 (gettext-0.11.6) dnl Copyright (C) 2002 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. dnl From Bruno Haible. dnl Test whether the compiler supports the 'long double' type. dnl Prerequisite: AC_PROG_CC AC_DEFUN([gt_TYPE_LONGDOUBLE], [ AC_CACHE_CHECK([for long double], gt_cv_c_long_double, [if test "$GCC" = yes; then gt_cv_c_long_double=yes else AC_TRY_COMPILE([ /* The Stardent Vistra knows sizeof(long double), but does not support it. */ long double foo = 0.0; /* On Ultrix 4.3 cc, long double is 4 and double is 8. */ int array [2*(sizeof(long double) >= sizeof(double)) - 1]; ], , gt_cv_c_long_double=yes, gt_cv_c_long_double=no) fi]) if test $gt_cv_c_long_double = yes; then AC_DEFINE(HAVE_LONG_DOUBLE, 1, [Define if you have the 'long double' type.]) fi ]) # wchar_t.m4 serial 1 (gettext-0.11.6) dnl Copyright (C) 2002 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. dnl From Bruno Haible. dnl Test whether has the 'wchar_t' type. dnl Prerequisite: AC_PROG_CC AC_DEFUN([gt_TYPE_WCHAR_T], [ AC_CACHE_CHECK([for wchar_t], gt_cv_c_wchar_t, [AC_TRY_COMPILE([#include wchar_t foo = (wchar_t)'\0';], , gt_cv_c_wchar_t=yes, gt_cv_c_wchar_t=no)]) if test $gt_cv_c_wchar_t = yes; then AC_DEFINE(HAVE_WCHAR_T, 1, [Define if you have the 'wchar_t' type.]) fi ]) # wint_t.m4 serial 1 dnl Copyright (C) 2003 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. dnl From Bruno Haible. dnl Test whether has the 'wint_t' type. dnl Prerequisite: AC_PROG_CC AC_DEFUN([gt_TYPE_WINT_T], [ AC_CACHE_CHECK([for wint_t], gt_cv_c_wint_t, [AC_TRY_COMPILE([#include wint_t foo = (wchar_t)'\0';], , gt_cv_c_wint_t=yes, gt_cv_c_wint_t=no)]) if test $gt_cv_c_wint_t = yes; then AC_DEFINE(HAVE_WINT_T, 1, [Define if you have the 'wint_t' type.]) fi ]) # intmax_t.m4 serial 1 dnl Copyright (C) 1997-2002 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. dnl From Paul Eggert. AC_PREREQ(2.13) # Define intmax_t to 'long' or 'long long' # if it is not already defined in or . AC_DEFUN([jm_AC_TYPE_INTMAX_T], [ dnl For simplicity, we assume that a header file defines 'intmax_t' if and dnl only if it defines 'uintmax_t'. AC_REQUIRE([jm_AC_HEADER_INTTYPES_H]) AC_REQUIRE([jm_AC_HEADER_STDINT_H]) if test $jm_ac_cv_header_inttypes_h = no && test $jm_ac_cv_header_stdint_h = no; then AC_REQUIRE([jm_AC_TYPE_LONG_LONG]) test $ac_cv_type_long_long = yes \ && ac_type='long long' \ || ac_type='long' AC_DEFINE_UNQUOTED(intmax_t, $ac_type, [Define to long or long long if and don't define.]) else AC_DEFINE(HAVE_INTMAX_T, 1, [Define if you have the 'intmax_t' type in or .]) fi ]) dnl An alternative would be to explicitly test for 'intmax_t'. AC_DEFUN([gt_AC_TYPE_INTMAX_T], [ AC_REQUIRE([jm_AC_HEADER_INTTYPES_H]) AC_REQUIRE([jm_AC_HEADER_STDINT_H]) AC_CACHE_CHECK(for intmax_t, gt_cv_c_intmax_t, [AC_TRY_COMPILE([ #include #include #if HAVE_STDINT_H_WITH_UINTMAX #include #endif #if HAVE_INTTYPES_H_WITH_UINTMAX #include #endif ], [intmax_t x = -1;], gt_cv_c_intmax_t=yes, gt_cv_c_intmax_t=no)]) if test $gt_cv_c_intmax_t = yes; then AC_DEFINE(HAVE_INTMAX_T, 1, [Define if you have the 'intmax_t' type in or .]) else AC_REQUIRE([jm_AC_TYPE_LONG_LONG]) test $ac_cv_type_long_long = yes \ && ac_type='long long' \ || ac_type='long' AC_DEFINE_UNQUOTED(intmax_t, $ac_type, [Define to long or long long if and don't define.]) fi ]) # stdint_h.m4 serial 3 (gettext-0.11.6) dnl Copyright (C) 1997-2002 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. dnl From Paul Eggert. # Define HAVE_STDINT_H_WITH_UINTMAX if exists, # doesn't clash with , and declares uintmax_t. AC_DEFUN([jm_AC_HEADER_STDINT_H], [ AC_CACHE_CHECK([for stdint.h], jm_ac_cv_header_stdint_h, [AC_TRY_COMPILE( [#include #include ], [uintmax_t i = (uintmax_t) -1;], jm_ac_cv_header_stdint_h=yes, jm_ac_cv_header_stdint_h=no)]) if test $jm_ac_cv_header_stdint_h = yes; then AC_DEFINE_UNQUOTED(HAVE_STDINT_H_WITH_UINTMAX, 1, [Define if exists, doesn't clash with , and declares uintmax_t. ]) fi ]) # inttypes_h.m4 serial 5 (gettext-0.11.6) dnl Copyright (C) 1997-2002 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. dnl From Paul Eggert. # Define HAVE_INTTYPES_H_WITH_UINTMAX if exists, # doesn't clash with , and declares uintmax_t. AC_DEFUN([jm_AC_HEADER_INTTYPES_H], [ AC_CACHE_CHECK([for inttypes.h], jm_ac_cv_header_inttypes_h, [AC_TRY_COMPILE( [#include #include ], [uintmax_t i = (uintmax_t) -1;], jm_ac_cv_header_inttypes_h=yes, jm_ac_cv_header_inttypes_h=no)]) if test $jm_ac_cv_header_inttypes_h = yes; then AC_DEFINE_UNQUOTED(HAVE_INTTYPES_H_WITH_UINTMAX, 1, [Define if exists, doesn't clash with , and declares uintmax_t. ]) fi ]) m4_include(acglib.m4)dnl m4_include(glib/libcharset/codeset.m4)dnl m4_include(glib/libcharset/glibc21.m4)dnl m4_include(m4macros/glib-gettext.m4)dnl pkg-config-0.29.1/pkg-config.10000664000175000017500000005304012664101311012655 00000000000000.\" .\" pkg-config manual page. .\" (C) Red Hat, Inc. based on gnome-config man page (C) Miguel de Icaza (miguel@gnu.org) .\" . .TH pkg-config 1 .SH NAME pkg-config \- Return metainformation about installed libraries .SH SYNOPSIS .PP .B pkg-config [\-\-modversion] [\-\-version] [\-\-help] [\-\-atleast-pkgconfig-version=VERSION] [\-\-print-errors] [\-\-short-errors] [\-\-silence-errors] [\-\-errors-to-stdout] [\-\-debug] [\-\-cflags] [\-\-libs] [\-\-libs-only-L] [\-\-libs-only-l] [\-\-cflags-only-I] [\-\-libs-only-other] [\-\-cflags-only-other] [\-\-variable=VARIABLENAME] [\-\-define-variable=VARIABLENAME=VARIABLEVALUE] [\-\-print-variables] [\-\-uninstalled] [\-\-exists] [\-\-atleast-version=VERSION] [\-\-exact-version=VERSION] [\-\-max-version=VERSION] [\-\-validate] [\-\-list\-all] [\-\-print-provides] [\-\-print-requires] [\-\-print-requires-private] [LIBRARIES...] .SH DESCRIPTION The \fIpkg-config\fP program is used to retrieve information about installed libraries in the system. It is typically used to compile and link against one or more libraries. Here is a typical usage scenario in a Makefile: .PP .nf program: program.c cc program.c $(pkg-config --cflags --libs gnomeui) .fi .PP .I pkg-config retrieves information about packages from special metadata files. These files are named after the package, and has a .I .pc extension. On most systems, \fIpkg-config\fP looks in .I /usr/lib/pkgconfig, /usr/share/pkgconfig, /usr/local/lib/pkgconfig and .I /usr/local/share/pkgconfig for these files. It will additionally look in the colon-separated (on Windows, semicolon-separated) list of directories specified by the PKG_CONFIG_PATH environment variable. .PP The package name specified on the \fIpkg-config\fP command line is defined to be the name of the metadata file, minus the \fI.pc\fP extension. If a library can install multiple versions simultaneously, it must give each version its own name (for example, GTK 1.2 might have the package name "gtk+" while GTK 2.0 has "gtk+-2.0"). .PP In addition to specifying a package name on the command line, the full path to a given \fI.pc\fP file may be given instead. This allows a user to directly query a particular \fI.pc\fP file. .\" .SH OPTIONS The following options are supported: .TP .I "--modversion" Requests that the version information of the libraries specified on the command line be displayed. If \fIpkg-config\fP can find all the libraries on the command line, each library's version string is printed to stdout, one version per line. In this case \fIpkg-config\fP exits successfully. If one or more libraries is unknown, .I pkg-config exits with a nonzero code, and the contents of stdout are undefined. .TP .I "--version" Displays the version of .I pkg-config and terminates. .TP .I "--atleast-pkgconfig-version=VERSION" Requires at least the given version of pkg-config. .TP .I "--help" Displays a help message and terminates. .TP .I "--print-errors" If one or more of the modules on the command line, or their dependencies, are not found, or if an error occurs in parsing a \fI.pc\fP file, then this option will cause errors explaining the problem to be printed. With "predicate" options such as "--exists" .I "pkg-config" runs silently by default, because it's usually used in scripts that want to control what's output. This option can be used alone (to just print errors encountered locating modules on the command line) or with other options. The PKG_CONFIG_DEBUG_SPEW environment variable overrides this option. .TP .I "--short-errors" Print short error messages. .TP .I "--silence-errors" If one or more of the modules on the command line, or their dependencies, are not found, or if an error occurs in parsing a a \fI.pc\fP file, then this option will keep errors explaining the problem from being printed. With "predicate" options such as "--exists" \fIpkg-config\fP runs silently by default, because it's usually used in scripts that want to control what's output. So this option is only useful with options such as "--cflags" or "--modversion" that print errors by default. The PKG_CONFIG_DEBUG_SPEW environment variable overrides this option. .TP .I "--errors-to-stdout" If printing errors, print them to stdout rather than the default stderr .TP .I "--debug" Print debugging information. This is slightly different than the PKG_CONFIG_DEBUG_SPEW environment variable, which also enable "--print-errors". .PP The following options are used to compile and link programs: .TP .I "--cflags" This prints pre-processor and compile flags required to compile the packages on the command line, including flags for all their dependencies. Flags are "compressed" so that each identical flag appears only once. \fIpkg-config\fP exits with a nonzero code if it can't find metadata for one or more of the packages on the command line. .TP .I "--cflags-only-I" This prints the -I part of "--cflags". That is, it defines the header search path but doesn't specify anything else. .TP .I "--cflags-only-other" This prints parts of "--cflags" not covered by "--cflags-only-I". .TP .I "--libs" This option is identical to "--cflags", only it prints the link flags. As with "--cflags", duplicate flags are merged (maintaining proper ordering), and flags for dependencies are included in the output. .TP .I "--libs-only-L" This prints the -L/-R part of "--libs". That is, it defines the library search path but doesn't specify which libraries to link with. .TP .I "--libs-only-l" This prints the -l part of "--libs" for the libraries specified on the command line. Note that the union of "--libs-only-l" and "--libs-only-L" may be smaller than "--libs", due to flags such as -rdynamic. .TP .I "--libs-only-other" This prints the parts of "--libs" not covered by "--libs-only-L" and "--libs-only-l", such as "--pthread". .TP .I "--variable=VARIABLENAME" This returns the value of a variable defined in a package's \fI.pc\fP file. Most packages define the variable "prefix", for example, so you can say: .nf $ pkg-config --variable=prefix glib-2.0 /usr/ .fi .TP .I "--define-variable=VARIABLENAME=VARIABLEVALUE" This sets a global value for a variable, overriding the value in any .I .pc files. Most packages define the variable "prefix", for example, so you can say: .nf $ pkg-config --print-errors --define-variable=prefix=/foo \e --variable=prefix glib-2.0 /foo .fi .TP .I "--print-variables" Returns a list of all variables defined in the package. .TP .I "--uninstalled" Normally if you request the package "foo" and the package "foo-uninstalled" exists, \fIpkg-config\fP will prefer the "-uninstalled" variant. This allows compilation/linking against uninstalled packages. If you specify the "--uninstalled" option, .I pkg-config will return successfully if any "-uninstalled" packages are being used, and return failure (false) otherwise. (The PKG_CONFIG_DISABLE_UNINSTALLED environment variable keeps .I pkg-config from implicitly choosing "-uninstalled" packages, so if that variable is set, they will only have been used if you pass a name like "foo-uninstalled" on the command line explicitly.) .TP .I "--exists" .TP .I "--atleast-version=VERSION" .TP .I "--exact-version=VERSION" .TP .I "--max-version=VERSION" These options test whether the package or list of packages on the command line are known to \fIpkg-config\fP, and optionally whether the version number of a package meets certain constraints. If all packages exist and meet the specified version constraints, .I pkg-config exits successfully. Otherwise it exits unsuccessfully. Only the first VERSION comparing option will be honored. Subsequent options of this type will be ignored. Rather than using the version-test options, you can simply give a version constraint after each package name, for example: .nf $ pkg-config --exists 'glib-2.0 >= 1.3.4 libxml = 1.8.3' .fi Remember to use \-\-print-errors if you want error messages. When no output options are supplied to \fIpkg-config\fP, \-\-exists is implied. .TP .I "--validate" Checks the syntax of a package's .I .pc file for validity. This is the same as \-\-exists except that dependencies are not verified. This can be useful for package developers to test their .I .pc file prior to release: .nf $ pkg-config --validate ./my-package.pc .fi .TP .I "--msvc-syntax" This option is available only on Windows. It causes \fIpkg-config\fP to output -l and -L flags in the form recognized by the Microsoft Visual C++ command-line compiler, \fIcl\fP. Specifically, instead of .I -Lx:/some/path it prints \fI/libpath:x/some/path\fP, and instead of \fI-lfoo\fP it prints \fIfoo.lib\fP. Note that the --libs output consists of flags for the linker, and should be placed on the cl command line after a /link switch. .TP .I "--define-prefix" .TQ .I "--dont-define-prefix" These options control whether .I pkg-config overrides the value of the variable .I prefix in each .pc file. With \-\-define-prefix, .I pkg-config uses the installed location of the .pc file to determine the prefix. \-\-dont-define-prefix prevents this behavior. The default is usually \-\-define-prefix. When this feature is enabled and a .pc file is found in a directory named .IR pkgconfig , the prefix for that package is assumed to be the grandparent of the directory where the file was found, and the .I prefix variable is overridden for that file accordingly. If the value of a variable in a .pc file begins with the original, non-overridden, value of the .I prefix variable, then the overridden value of .I prefix is used instead. This allows the feature to work even when the variables have been expanded in the .pc file. .TP .I "--prefix-variable=PREFIX" Set the name of the variable that .I pkg-config overrides instead of .I prefix when using the \-\-define-prefix feature. .TP .I "--static" Output libraries suitable for static linking. That means including any private libraries in the output. This relies on proper tagging in the .pc files, else a too large number of libraries will ordinarily be output. .TP .I "--list-all" List all modules found in the \fIpkg-config\fP path. .TP .I "--print-provides" List all modules the given packages provides. .TP .I "--print-requires" List all modules the given packages requires. .TP .I "--print-requires-private" List all modules the given packages requires for static linking (see --static). .\" .SH ENVIRONMENT VARIABLES .TP .I "PKG_CONFIG_PATH" A colon-separated (on Windows, semicolon-separated) list of directories to search for .pc files. The default directory will always be searched after searching the path; the default is .I \%libdir/\fPpkgconfig:\fIdatadir\fP/pkgconfig where \fIlibdir\fP is the libdir for \fIpkg-config\fP and \fIdatadir\fP is the datadir for \fIpkg-config\fP when it was installed. .TP .I "PKG_CONFIG_DEBUG_SPEW" If set, causes \fIpkg-config\fP to print all kinds of debugging information and report all errors. .TP .I "PKG_CONFIG_TOP_BUILD_DIR" A value to set for the magic variable \fIpc_top_builddir\fP which may appear in \fI.pc\fP files. If the environment variable is not set, the default value '$(top_builddir)' will be used. This variable should refer to the top builddir of the Makefile where the compile/link flags reported by \fIpkg-config\fP will be used. This only matters when compiling/linking against a package that hasn't yet been installed. .TP .I "PKG_CONFIG_DISABLE_UNINSTALLED" Normally if you request the package "foo" and the package "foo-uninstalled" exists, \fIpkg-config\fP will prefer the "-uninstalled" variant. This allows compilation/linking against uninstalled packages. If this environment variable is set, it disables said behavior. .TP .I "PKG_CONFIG_ALLOW_SYSTEM_CFLAGS" Don't strip -I/usr/include out of cflags. .TP .I "PKG_CONFIG_ALLOW_SYSTEM_LIBS" Don't strip -L/usr/lib or -L/lib out of libs. .TP .I "PKG_CONFIG_SYSROOT_DIR" Modify -I and -L to use the directories located in target sysroot. this option is useful when cross-compiling packages that use pkg-config to determine CFLAGS and LDFLAGS. -I and -L are modified to point to the new system root. this means that a -I/usr/include/libfoo will become -I/var/target/usr/include/libfoo with a PKG_CONFIG_SYSROOT_DIR equal to /var/target (same rule apply to -L) .TP .I "PKG_CONFIG_LIBDIR" Replaces the default .I pkg-config search directory, usually .IR /usr/lib/pkgconfig : /usr/share/pkgconfig . .TP .I "PKG_CONFIG_$PACKAGE_$VARIABLE" Overrides the variable VARIABLE in the package PACKAGE. The environment variable should have the package name and package variable upper cased with non-alphanumeric characters converted to underscores. For example, setting PKG_CONFIG_GLADEUI_2_0_CATALOGDIR will override the variable "catalogdir" in the "gladeui-2.0" package. .\" .SH PKG-CONFIG DERIVED VARIABLES .I pkg-config sets a few metadata variables that can be used in .pc files or queried at runtime. .TP .I pc_path The default search path used by .I pkg-config when searching for .pc files. This can be used in a query for the .I pkg-config module itself itself: .nf $ pkg-config --variable pc_path pkg-config .fi .TP .I pcfiledir The installed location of the .pc file. This can be used to query the location of the .pc file for a particular module, but it can also be used to make .pc files relocatable. For instance: .nf prefix=${pcfiledir}/../.. exec_prefix=${prefix} libdir=${exec_prefix}/lib includedir=${prefix}/include .fi .TP .I pc_sysrootdir The sysroot directory set by the user. When the sysroot directory has not been set, this value is .IR / . See the .I PKG_CONFIG_SYSROOT_DIR environment variable for more details. .TP .I pc_top_builddir Location of the user's top build directory when calling .IR pkg-config. This is useful to dynamically set paths in uninstalled .pc files. See the .I PKG_CONFIG_TOP_BUILD_DIR environment variable for more details. .\" .SH WINDOWS SPECIALITIES The .I pkg-config default search path is ignored on Windows. Instead, the search path is constructed by using the installed directory of .I pkg-config and then appending .I lib\epkgconfig and .IR share\epkgconfig . This can be augmented or replaced using the standard environment variables described above. .\" .SH AUTOCONF MACROS .TP .I "PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES [,ACTION-IF-FOUND [,ACTION-IF-NOT-FOUND]])" The macro PKG_CHECK_MODULES can be used in \fIconfigure.ac\fP to check whether modules exist. A typical usage would be: .nf PKG_CHECK_MODULES([MYSTUFF], [gtk+-2.0 >= 1.3.5 libxml = 1.8.4]) .fi This would result in MYSTUFF_LIBS and MYSTUFF_CFLAGS substitution variables, set to the libs and cflags for the given module list. If a module is missing or has the wrong version, by default configure will abort with a message. To replace the default action, specify an \%ACTION-IF-NOT-FOUND. \%PKG_CHECK_MODULES will not print any error messages if you specify your own ACTION-IF-NOT-FOUND. However, it will set the variable MYSTUFF_PKG_ERRORS, which you can use to display what went wrong. Note that if there is a possibility the first call to PKG_CHECK_MODULES might not happen, you should be sure to include an explicit call to PKG_PROG_PKG_CONFIG in your configure.ac. Also note that repeated usage of VARIABLE-PREFIX is not recommended. After the first successful usage, subsequent calls with the same VARIABLE-PREFIX will simply use the _LIBS and _CFLAGS variables set from the previous usage without calling \fIpkg-config\fP again. .\" .TP .I "PKG_PREREQ(MIN-VERSION)" Checks that the version of the pkg-config autoconf macros in use is at least MIN-VERSION. This can be used to ensure a particular pkg-config macro will be available. .\" .TP .I "PKG_PROG_PKG_CONFIG([MIN-VERSION])" Defines the PKG_CONFIG variable to the best pkg-config available, useful if you need pkg-config but don't want to use PKG_CHECK_MODULES. .\" .TP .I "PKG_CHECK_MODULES_STATIC(VARIABLE-PREFIX, MODULES [,ACTION-IF-FOUND [,ACTION-IF-NOT-FOUND]])" Enables static linking through --static prior to calling PKG_CHECK_MODULES. .TP .I "PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])" Check to see whether a particular set of modules exists. Similar to PKG_CHECK_MODULES(), but does not set variables or print errors. Similar to PKG_CHECK_MODULES, make sure that the first instance of this or PKG_CHECK_MODULES is called, or make sure to call PKG_CHECK_EXISTS manually. .TP .I "PKG_INSTALLDIR(DIRECTORY)" Substitutes the variable pkgconfigdir as the location where a module should install pkg-config .pc files. By default the directory is $libdir/pkgconfig, but the default can be changed by passing DIRECTORY. The user can override through the --with-pkgconfigdir parameter. .TP .I "PKG_NOARCH_INSTALLDIR(DIRECTORY)" Substitutes the variable noarch_pkgconfigdir as the location where a module should install arch-independent pkg-config .pc files. By default the directory is $datadir/pkgconfig, but the default can be changed by passing DIRECTORY. The user can override through the --with-noarch-pkgconfigdir parameter. .TP .I "PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])" Retrieves the value of the pkg-config variable CONFIG-VARIABLE from MODULE and stores it in VARIABLE. Note that repeated usage of VARIABLE is not recommended as the check will be skipped if the variable is already set. .SH METADATA FILE SYNTAX To add a library to the set of packages \fIpkg-config\fP knows about, simply install a \fI.pc\fP file. You should install this file to .I libdir\fP/pkgconfig. .PP Here is an example file: .nf # This is a comment prefix=/home/hp/unst # this defines a variable exec_prefix=${prefix} # defining another variable in terms of the first libdir=${exec_prefix}/lib includedir=${prefix}/include Name: GObject # human-readable name Description: Object/type system for GLib # human-readable description Version: 1.3.1 URL: http://www.gtk.org Requires: glib-2.0 = 1.3.1 Conflicts: foobar <= 4.5 Libs: -L${libdir} -lgobject-1.3 Libs.private: -lm Cflags: -I${includedir}/glib-2.0 -I${libdir}/glib/include .fi .PP You would normally generate the file using configure, so that the prefix, etc. are set to the proper values. The GNU Autoconf manual recommends generating files like .pc files at build time rather than configure time, so when you build the .pc file is a matter of taste and preference. .PP Files have two kinds of line: keyword lines start with a keyword plus a colon, and variable definitions start with an alphanumeric string plus an equals sign. Keywords are defined in advance and have special meaning to \fIpkg-config\fP; variables do not, you can have any variables that you wish (however, users may expect to retrieve the usual directory name variables). .PP Note that variable references are written "${foo}"; you can escape literal "${" as "$${". .TP .I "Name:" This field should be a human-readable name for the package. Note that it is not the name passed as an argument to \fIpkg-config\fP. .TP .I "Description:" This should be a brief description of the package .TP .I "URL:" An URL where people can get more information about and download the package .TP .I "Version:" This should be the most-specific-possible package version string. .TP .I "Requires:" This is a comma-separated list of packages that are required by your package. Flags from dependent packages will be merged in to the flags reported for your package. Optionally, you can specify the version of the required package (using the operators =, <, >, >=, <=); specifying a version allows \fIpkg-config\fP to perform extra sanity checks. You may only mention the same package one time on the .I "Requires:" line. If the version of a package is unspecified, any version will be used with no checking. .TP .I Requires.private: A list of packages required by this package. The difference from .I Requires is that the packages listed under .I Requires.private are not taken into account when a flag list is computed for dynamically linked executable (i.e., when \-\-static was not specified). In the situation where each .pc file corresponds to a library, .I Requires.private shall be used exclusively to specify the dependencies between the libraries. .TP .I "Conflicts:" This optional line allows \fIpkg-config\fP to perform additional sanity checks, primarily to detect broken user installations. The syntax is the same as .I "Requires:" except that you can list the same package more than once here, for example "foobar = 1.2.3, foobar = 1.2.5, foobar >= 1.3", if you have reason to do so. If a version isn't specified, then your package conflicts with all versions of the mentioned package. If a user tries to use your package and a conflicting package at the same time, then \fIpkg-config\fP will complain. .TP .I "Libs:" This line should give the link flags specific to your package. Don't add any flags for required packages; \fIpkg-config\fP will add those automatically. .TP .I "Libs.private:" This line should list any private libraries in use. Private libraries are libraries which are not exposed through your library, but are needed in the case of static linking. This differs from .I Requires.private in that it references libraries that do not have package files installed. .TP .I "Cflags:" This line should list the compile flags specific to your package. Don't add any flags for required packages; \fIpkg-config\fP will add those automatically. .\" .SH AUTHOR .I pkg-config was written by James Henstridge, rewritten by Martijn van Beers, and rewritten again by Havoc Pennington. Tim Janik, Owen Taylor, and Raja Harinath submitted suggestions and some code. .I gnome-config was written by Miguel de Icaza, Raja Harinath and various hackers in the GNOME team. It was inspired by Owen Taylor's \fIgtk-config\fP program. .\" .SH BUGS \fIpkg-config\fP does not handle mixing of parameters with and without = well. Stick with one. Bugs can be reported at http://bugs.freedesktop.org/ under the .I pkg-config component. pkg-config-0.29.1/rpmvercmp.c0000664000175000017500000000770512651243552012747 00000000000000/* * This code is taken from the RPM package manager. * * RPM is Copyright (c) 1998 by Red Hat Software, Inc., * and may be distributed under the terms of the GPL and LGPL. * See http://rpm.org/gitweb?p=rpm.git;a=blob_plain;f=COPYING;hb=HEAD * * The code should follow upstream as closely as possible. * See http://rpm.org/gitweb?p=rpm.git;a=blob_plain;f=lib/rpmvercmp.c;hb=HEAD * * Currently the only difference as a policy is that upstream uses C99 * features and pkg-config does not require a C99 compiler yet. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "rpmvercmp.h" #include #include #include /* macros to help code look more like upstream */ #define rstreq(a, b) (strcmp(a, b) == 0) #define risalnum(c) isalnum((guchar)(c)) #define risdigit(c) isdigit((guchar)(c)) #define risalpha(c) isalpha((guchar)(c)) /* compare alpha and numeric segments of two versions */ /* return 1: a is newer than b */ /* 0: a and b are the same version */ /* -1: b is newer than a */ int rpmvercmp(const char * a, const char * b) { char oldch1, oldch2; char * str1, * str2; char * one, * two; int rc; int isnum; /* easy comparison to see if versions are identical */ if (rstreq(a, b)) return 0; str1 = g_alloca(strlen(a) + 1); str2 = g_alloca(strlen(b) + 1); strcpy(str1, a); strcpy(str2, b); one = str1; two = str2; /* loop through each version segment of str1 and str2 and compare them */ while (*one && *two) { while (*one && !risalnum(*one)) one++; while (*two && !risalnum(*two)) two++; /* If we ran to the end of either, we are finished with the loop */ if (!(*one && *two)) break; str1 = one; str2 = two; /* grab first completely alpha or completely numeric segment */ /* leave one and two pointing to the start of the alpha or numeric */ /* segment and walk str1 and str2 to end of segment */ if (risdigit(*str1)) { while (*str1 && risdigit(*str1)) str1++; while (*str2 && risdigit(*str2)) str2++; isnum = 1; } else { while (*str1 && risalpha(*str1)) str1++; while (*str2 && risalpha(*str2)) str2++; isnum = 0; } /* save character at the end of the alpha or numeric segment */ /* so that they can be restored after the comparison */ oldch1 = *str1; *str1 = '\0'; oldch2 = *str2; *str2 = '\0'; /* this cannot happen, as we previously tested to make sure that */ /* the first string has a non-null segment */ if (one == str1) return -1; /* arbitrary */ /* take care of the case where the two version segments are */ /* different types: one numeric, the other alpha (i.e. empty) */ /* numeric segments are always newer than alpha segments */ /* XXX See patch #60884 (and details) from bugzilla #50977. */ if (two == str2) return (isnum ? 1 : -1); if (isnum) { /* this used to be done by converting the digit segments */ /* to ints using atoi() - it's changed because long */ /* digit segments can overflow an int - this should fix that. */ /* throw away any leading zeros - it's a number, right? */ while (*one == '0') one++; while (*two == '0') two++; /* whichever number has more digits wins */ if (strlen(one) > strlen(two)) return 1; if (strlen(two) > strlen(one)) return -1; } /* strcmp will return which one is greater - even if the two */ /* segments are alpha or if they are numeric. don't return */ /* if they are equal because there might be more segments to */ /* compare */ rc = strcmp(one, two); if (rc) return (rc < 1 ? -1 : 1); /* restore character that was replaced by null above */ *str1 = oldch1; one = str1; *str2 = oldch2; two = str2; } /* this catches the case where all numeric and alpha segments have */ /* compared identically but the segment sepparating characters were */ /* different */ if ((!*one) && (!*two)) return 0; /* whichever version still has characters left over wins */ if (!*one) return -1; else return 1; } pkg-config-0.29.1/INSTALL0000644000175000017500000003661012601774033011612 00000000000000Installation Instructions ************************* Copyright (C) 1994-1996, 1999-2002, 2004-2013 Free Software Foundation, Inc. Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. This file is offered as-is, without warranty of any kind. Basic Installation ================== Briefly, the shell command `./configure && make && make install' should configure, build, and install this package. The following more-detailed instructions are generic; see the `README' file for instructions specific to this package. Some packages provide this `INSTALL' file but do not implement all of the features documented below. The lack of an optional feature in a given package is not necessarily a bug. More recommendations for GNU packages can be found in *note Makefile Conventions: (standards)Makefile Conventions. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that you can run in the future to recreate the current configuration, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). It can also use an optional file (typically called `config.cache' and enabled with `--cache-file=config.cache' or simply `-C') that saves the results of its tests to speed up reconfiguring. Caching is disabled by default to prevent problems with accidental use of stale cache files. If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can be considered for the next release. If you are using the cache, and at some point `config.cache' contains results you don't want to keep, you may remove or edit it. The file `configure.ac' (or `configure.in') is used to create `configure' by a program called `autoconf'. You need `configure.ac' if you want to change it or regenerate `configure' using a newer version of `autoconf'. The simplest way to compile this package is: 1. `cd' to the directory containing the package's source code and type `./configure' to configure the package for your system. Running `configure' might take a while. While running, it prints some messages telling which features it is checking for. 2. Type `make' to compile the package. 3. Optionally, type `make check' to run any self-tests that come with the package, generally using the just-built uninstalled binaries. 4. Type `make install' to install the programs and any data files and documentation. When installing into a prefix owned by root, it is recommended that the package be configured and built as a regular user, and only the `make install' phase executed with root privileges. 5. Optionally, type `make installcheck' to repeat any self-tests, but this time using the binaries in their final installed location. This target does not install anything. Running this target as a regular user, particularly if the prior `make install' required root privileges, verifies that the installation completed correctly. 6. You can remove the program binaries and object files from the source code directory by typing `make clean'. To also remove the files that `configure' created (so you can compile the package for a different kind of computer), type `make distclean'. There is also a `make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. 7. Often, you can also type `make uninstall' to remove the installed files again. In practice, not all packages have tested that uninstallation works correctly, even though it is required by the GNU Coding Standards. 8. Some packages, particularly those that use Automake, provide `make distcheck', which can by used by developers to test that all other targets like `make install' and `make uninstall' work correctly. This target is generally not run by end users. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the `configure' script does not know about. Run `./configure --help' for details on some of the pertinent environment variables. You can give `configure' initial values for configuration parameters by setting variables in the command line or in the environment. Here is an example: ./configure CC=c99 CFLAGS=-g LIBS=-lposix *Note Defining Variables::, for more details. Compiling For Multiple Architectures ==================================== You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you can use GNU `make'. `cd' to the directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. This is known as a "VPATH" build. With a non-GNU `make', it is safer to compile the package for one architecture at a time in the source code directory. After you have installed the package for one architecture, use `make distclean' before reconfiguring for another architecture. On MacOS X 10.5 and later systems, you can create libraries and executables that work on multiple system types--known as "fat" or "universal" binaries--by specifying multiple `-arch' options to the compiler but only a single `-arch' option to the preprocessor. Like this: ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ CPP="gcc -E" CXXCPP="g++ -E" This is not guaranteed to produce working output in all cases, you may have to build one architecture at a time and combine the results using the `lipo' tool if you have problems. Installation Names ================== By default, `make install' installs the package's commands under `/usr/local/bin', include files under `/usr/local/include', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PREFIX', where PREFIX must be an absolute file name. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you pass the option `--exec-prefix=PREFIX' to `configure', the package uses PREFIX as the prefix for installing programs and libraries. Documentation and other data files still use the regular prefix. In addition, if you use an unusual directory layout you can give options like `--bindir=DIR' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. In general, the default for these options is expressed in terms of `${prefix}', so that specifying just `--prefix' will affect all of the other directory specifications that were not explicitly provided. The most portable way to affect installation locations is to pass the correct locations to `configure'; however, many packages provide one or both of the following shortcuts of passing variable assignments to the `make install' command line to change installation locations without having to reconfigure or recompile. The first method involves providing an override variable for each affected directory. For example, `make install prefix=/alternate/directory' will choose an alternate location for all directory configuration variables that were expressed in terms of `${prefix}'. Any directories that were specified during `configure', but not in terms of `${prefix}', must each be overridden at install time for the entire installation to be relocated. The approach of makefile variable overrides for each directory variable is required by the GNU Coding Standards, and ideally causes no recompilation. However, some platforms have known limitations with the semantics of shared libraries that end up requiring recompilation when using this method, particularly noticeable in packages that use GNU Libtool. The second method involves providing the `DESTDIR' variable. For example, `make install DESTDIR=/alternate/directory' will prepend `/alternate/directory' before all installation names. The approach of `DESTDIR' overrides is not required by the GNU Coding Standards, and does not work on platforms that have drive letters. On the other hand, it does better at avoiding recompilation issues, and works well even when some directory options were not specified in terms of `${prefix}' at `configure' time. Optional Features ================= If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving `configure' the option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The `README' should mention any `--enable-' and `--with-' options that the package recognizes. For packages that use the X Window System, `configure' can usually find the X include and library files automatically, but if it doesn't, you can use the `configure' options `--x-includes=DIR' and `--x-libraries=DIR' to specify their locations. Some packages offer the ability to configure how verbose the execution of `make' will be. For these packages, running `./configure --enable-silent-rules' sets the default to minimal output, which can be overridden with `make V=1'; while running `./configure --disable-silent-rules' sets the default to verbose, which can be overridden with `make V=0'. Particular systems ================== On HP-UX, the default C compiler is not ANSI C compatible. If GNU CC is not installed, it is recommended to use the following options in order to use an ANSI C compiler: ./configure CC="cc -Ae -D_XOPEN_SOURCE=500" and if that doesn't work, install pre-built binaries of GCC for HP-UX. HP-UX `make' updates targets which have the same time stamps as their prerequisites, which makes it generally unusable when shipped generated files such as `configure' are involved. Use GNU `make' instead. On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot parse its `' header file. The option `-nodtk' can be used as a workaround. If GNU CC is not installed, it is therefore recommended to try ./configure CC="cc" and if that doesn't work, try ./configure CC="cc -nodtk" On Solaris, don't put `/usr/ucb' early in your `PATH'. This directory contains several dysfunctional programs; working variants of these programs are available in `/usr/bin'. So, if you need `/usr/ucb' in your `PATH', put it _after_ `/usr/bin'. On Haiku, software installed for all users goes in `/boot/common', not `/usr/local'. It is recommended to use the following options: ./configure --prefix=/boot/common Specifying the System Type ========================== There may be some features `configure' cannot figure out automatically, but needs to determine by the type of machine the package will run on. Usually, assuming the package is built to be run on the _same_ architectures, `configure' can figure that out, but if it prints a message saying it cannot guess the machine type, give it the `--build=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name which has the form: CPU-COMPANY-SYSTEM where SYSTEM can have one of these forms: OS KERNEL-OS See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't need to know the machine type. If you are _building_ compiler tools for cross-compiling, you should use the option `--target=TYPE' to select the type of system they will produce code for. If you want to _use_ a cross compiler, that generates code for a platform different from the build platform, you should specify the "host" platform (i.e., that on which the generated programs will eventually be run) with `--host=TYPE'. Sharing Defaults ================ If you want to set default values for `configure' scripts to share, you can create a site shell script called `config.site' that gives default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. Defining Variables ================== Variables not defined in a site shell script can be set in the environment passed to `configure'. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set them in the `configure' command line, using `VAR=value'. For example: ./configure CC=/usr/local2/bin/gcc causes the specified `gcc' to be used as the C compiler (unless it is overridden in the site shell script). Unfortunately, this technique does not work for `CONFIG_SHELL' due to an Autoconf limitation. Until the limitation is lifted, you can use this workaround: CONFIG_SHELL=/bin/bash ./configure CONFIG_SHELL=/bin/bash `configure' Invocation ====================== `configure' recognizes the following options to control how it operates. `--help' `-h' Print a summary of all of the options to `configure', and exit. `--help=short' `--help=recursive' Print a summary of the options unique to this package's `configure', and exit. The `short' variant lists options used only in the top level, while the `recursive' variant lists options also present in any nested packages. `--version' `-V' Print the version of Autoconf used to generate the `configure' script, and exit. `--cache-file=FILE' Enable the cache: use and save the results of the tests in FILE, traditionally `config.cache'. FILE defaults to `/dev/null' to disable caching. `--config-cache' `-C' Alias for `--cache-file=config.cache'. `--quiet' `--silent' `-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to `/dev/null' (any error messages will still be shown). `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `--prefix=DIR' Use DIR as the installation prefix. *note Installation Names:: for more details, including other options available for fine-tuning the installation locations. `--no-create' `-n' Run the configure checks, but stop before creating any output files. `configure' also accepts some other, not widely useful, options. Run `configure --help' for more details. pkg-config-0.29.1/configure0000775000175000017500000177644412665370324012520 00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for pkg-config 0.29.1. # # Report bugs to . # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org and $0: https://bugs.freedesktop.org/enter_bug.cgi?product=pkg-config $0: about your system, including any error possibly output $0: before this message. Then install a modern shell, or $0: manually run the script under such a shell if you do $0: have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" SHELL=${CONFIG_SHELL-/bin/sh} test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='pkg-config' PACKAGE_TARNAME='pkg-config' PACKAGE_VERSION='0.29.1' PACKAGE_STRING='pkg-config 0.29.1' PACKAGE_BUGREPORT='https://bugs.freedesktop.org/enter_bug.cgi?product=pkg-config' PACKAGE_URL='' ac_unique_file="main.c" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" enable_option_checking=no ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS LIBOBJS HOST_TOOL_FALSE HOST_TOOL_TRUE GCOV_CFLAGS GCOV GLIB_LIBS GLIB_CFLAGS PKG_CONFIG_LIBDIR PKG_CONFIG_PATH PKG_CONFIG subdirs INTERNAL_GLIB_FALSE INTERNAL_GLIB_TRUE WINE NATIVE_WIN32_FALSE NATIVE_WIN32_TRUE native_win32 WARN_CFLAGS use_indirect_deps system_library_path system_include_path pc_path TESTS_PKG_CONFIG TESTS_SHELL LN CPP LT_SYS_LIBRARY_PATH OTOOL64 OTOOL LIPO NMEDIT DSYMUTIL MANIFEST_TOOL RANLIB ac_ct_AR AR DLLTOOL OBJDUMP LN_S NM ac_ct_DUMPBIN DUMPBIN LD FGREP EGREP GREP SED am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC host_os host_vendor host_cpu host build_os build_vendor build_cpu build LIBTOOL AM_BACKSLASH AM_DEFAULT_VERBOSITY AM_DEFAULT_V AM_V am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_silent_rules enable_shared enable_static with_pic enable_fast_install with_aix_soname enable_dependency_tracking with_gnu_ld with_sysroot enable_libtool_lock enable_largefile with_pc_path with_system_include_path with_system_library_path enable_indirect_deps enable_define_prefix with_internal_glib with_gcov enable_host_tool ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS LT_SYS_LIBRARY_PATH CPP TESTS_SHELL PKG_CONFIG PKG_CONFIG_PATH PKG_CONFIG_LIBDIR GLIB_CFLAGS GLIB_LIBS' ac_subdirs_all='glib' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures pkg-config 0.29.1 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/pkg-config] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of pkg-config 0.29.1:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-silent-rules less verbose build output (undo: "make V=1") --disable-silent-rules verbose build output (undo: "make V=0") --enable-shared[=PKGS] build shared libraries [default=yes] --enable-static[=PKGS] build static libraries [default=yes] --enable-fast-install[=PKGS] optimize for fast installation [default=yes] --enable-dependency-tracking do not reject slow dependency extractors --disable-dependency-tracking speeds up one-time build --disable-libtool-lock avoid locking (might break parallel builds) --disable-largefile omit support for large files --enable-indirect-deps list both direct and indirect dependencies. --disable-indirect-deps only list direct dependencies. default=auto --enable-define-prefix redefine prefix in .pc files [default=yes on Win32] --disable-host-tool install link to pkg-config with $host- prefix [default=yes] Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-pic[=PKGS] try to use only PIC/non-PIC objects [default=use both] --with-aix-soname=aix|svr4|both shared library versioning (aka "SONAME") variant to provide on AIX, [default=aix]. --with-gnu-ld assume the C compiler uses GNU ld [default=no] --with-sysroot[=DIR] Search for dependent libraries within DIR (or the compiler's sysroot if not specified). --with-pc-path default search path for .pc files --with-system-include-path avoid -I flags from the given path --with-system-library-path avoid -L flags from the given path --with-internal-glib use internal glib --with-gcov gcov test coverage [default=no] Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory LT_SYS_LIBRARY_PATH User-defined run-time library search path. CPP C preprocessor TESTS_SHELL Path to a POSIX shell to be used for testing PKG_CONFIG path to pkg-config utility PKG_CONFIG_PATH directories to add to pkg-config's search path PKG_CONFIG_LIBDIR path overriding pkg-config's built-in search path GLIB_CFLAGS C compiler flags for GLIB, overriding pkg-config GLIB_LIBS linker flags for GLIB, overriding pkg-config Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF pkg-config configure 0.29.1 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ( $as_echo "## ---------------------------------------------------------------------------- ## ## Report this to https://bugs.freedesktop.org/enter_bug.cgi?product=pkg-config ## ## ---------------------------------------------------------------------------- ##" ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by pkg-config $as_me 0.29.1, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_config_headers="$ac_config_headers config.h" am__api_version='1.15' ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi if test "$2" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi rm -f conftest.file test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # Expand $ac_aux_dir to an absolute path. am_aux_dir=`cd "$ac_aux_dir" && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null # Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi case $enable_silent_rules in # ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=1;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 $as_echo_n "checking whether $am_make supports nested variables... " >&6; } if ${am_cv_make_support_nested_variables+:} false; then : $as_echo_n "(cached) " >&6 else if $as_echo 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 $as_echo "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='pkg-config' VERSION='0.29.1' cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # mkdir_p='$(MKDIR_P)' # We need awk for the "check" target (and possibly the TAP driver). The # system "awk" is bad on some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar pax cpio none' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 fi fi case `pwd` in *\ * | *\ *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 $as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; esac macro_version='2.4.6' macro_revision='2.4.6' ltmain=$ac_aux_dir/ltmain.sh # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac # Backslashify metacharacters that are still active within # double-quoted strings. sed_quote_subst='s/\(["`$\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 $as_echo_n "checking how to print strings... " >&6; } # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "" } case $ECHO in printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 $as_echo "printf" >&6; } ;; print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 $as_echo "print -r" >&6; } ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 $as_echo "cat" >&6; } ;; esac DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf # Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 $as_echo_n "checking whether $CC understands -c and -o together... " >&6; } if ${am_cv_prog_cc_c_o+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 $as_echo "$am_cv_prog_cc_c_o" >&6; } if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 $as_echo_n "checking for a sed that does not truncate output... " >&6; } if ${ac_cv_path_SED+:} false; then : $as_echo_n "(cached) " >&6 else ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for ac_i in 1 2 3 4 5 6 7; do ac_script="$ac_script$as_nl$ac_script" done echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed { ac_script=; unset ac_script;} if test -z "$SED"; then ac_path_SED_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_SED" || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED case `"$ac_path_SED" --version 2>&1` in *GNU*) ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo '' >> "conftest.nl" "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_SED_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_SED="$ac_path_SED" ac_path_SED_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_SED_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_SED"; then as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 fi else ac_cv_path_SED=$SED fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 $as_echo "$ac_cv_path_SED" >&6; } SED="$ac_cv_path_SED" rm -f conftest.sed test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 $as_echo_n "checking for fgrep... " >&6; } if ${ac_cv_path_FGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 then ac_cv_path_FGREP="$GREP -F" else if test -z "$FGREP"; then ac_path_FGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in fgrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_FGREP" || continue # Check for GNU ac_path_FGREP and select it if it is found. # Check for GNU $ac_path_FGREP case `"$ac_path_FGREP" --version 2>&1` in *GNU*) ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'FGREP' >> "conftest.nl" "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_FGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_FGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_FGREP"; then as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_FGREP=$FGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 $as_echo "$ac_cv_path_FGREP" >&6; } FGREP="$ac_cv_path_FGREP" test -z "$GREP" && GREP=grep # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes else with_gnu_ld=no fi ac_prog=ld if test yes = "$GCC"; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 $as_echo_n "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return, which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD=$ac_prog ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test yes = "$with_gnu_ld"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if ${lt_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD=$ac_dir/$ac_prog # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if ${lt_cv_prog_gnu_ld+:} false; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 $as_echo "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld { $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 $as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } if ${lt_cv_path_NM+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM=$NM else lt_nm_to_check=${ac_tool_prefix}nm if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. tmp_nm=$ac_dir/$lt_tmp_nm if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then # Check to see if the nm accepts a BSD-compat flag. # Adding the 'sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty case $build_os in mingw*) lt_bad_file=conftest.nm/nofile ;; *) lt_bad_file=/dev/null ;; esac case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in *$lt_bad_file* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break 2 ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break 2 ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS=$lt_save_ifs done : ${lt_cv_path_NM=no} fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 $as_echo "$lt_cv_path_NM" >&6; } if test no != "$lt_cv_path_NM"; then NM=$lt_cv_path_NM else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else if test -n "$ac_tool_prefix"; then for ac_prog in dumpbin "link -dump" do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DUMPBIN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DUMPBIN"; then ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DUMPBIN=$ac_cv_prog_DUMPBIN if test -n "$DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 $as_echo "$DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$DUMPBIN" && break done fi if test -z "$DUMPBIN"; then ac_ct_DUMPBIN=$DUMPBIN for ac_prog in dumpbin "link -dump" do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DUMPBIN"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN if test -n "$ac_ct_DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 $as_echo "$ac_ct_DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_DUMPBIN" && break done if test "x$ac_ct_DUMPBIN" = x; then DUMPBIN=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DUMPBIN=$ac_ct_DUMPBIN fi fi case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols -headers" ;; *) DUMPBIN=: ;; esac fi if test : != "$DUMPBIN"; then NM=$DUMPBIN fi fi test -z "$NM" && NM=nm { $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 $as_echo_n "checking the name lister ($NM) interface... " >&6; } if ${lt_cv_nm_interface+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: output\"" >&5) cat conftest.out >&5 if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 $as_echo "$lt_cv_nm_interface" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 $as_echo_n "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 $as_echo "no, using $LN_S" >&6; } fi # find the maximum length of command line arguments { $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 $as_echo_n "checking the maximum length of command line arguments... " >&6; } if ${lt_cv_sys_max_cmd_len+:} false; then : $as_echo_n "(cached) " >&6 else i=0 teststring=ABCD case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; os2*) # The test takes a long time on OS/2. lt_cv_sys_max_cmd_len=8192 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len" && \ test undefined != "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test X`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test 17 != "$i" # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac fi if test -n "$lt_cv_sys_max_cmd_len"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 $as_echo "$lt_cv_sys_max_cmd_len" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 $as_echo "none" >&6; } fi max_cmd_len=$lt_cv_sys_max_cmd_len : ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 $as_echo_n "checking how to convert $build file names to $host format... " >&6; } if ${lt_cv_to_host_file_cmd+:} false; then : $as_echo_n "(cached) " >&6 else case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac fi to_host_file_cmd=$lt_cv_to_host_file_cmd { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 $as_echo "$lt_cv_to_host_file_cmd" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 $as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } if ${lt_cv_to_tool_file_cmd+:} false; then : $as_echo_n "(cached) " >&6 else #assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac fi to_tool_file_cmd=$lt_cv_to_tool_file_cmd { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 $as_echo "$lt_cv_to_tool_file_cmd" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 $as_echo_n "checking for $LD option to reload object files... " >&6; } if ${lt_cv_ld_reload_flag+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_reload_flag='-r' fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 $as_echo "$lt_cv_ld_reload_flag" >&6; } reload_flag=$lt_cv_ld_reload_flag case $reload_flag in "" | " "*) ;; *) reload_flag=" $reload_flag" ;; esac reload_cmds='$LD$reload_flag -o $output$reload_objs' case $host_os in cygwin* | mingw* | pw32* | cegcc*) if test yes != "$GCC"; then reload_cmds=false fi ;; darwin*) if test yes = "$GCC"; then reload_cmds='$LTCC $LTCFLAGS -nostdlib $wl-r -o $output$reload_objs' else reload_cmds='$LD$reload_flag -o $output$reload_objs' fi ;; esac if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. set dummy ${ac_tool_prefix}objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OBJDUMP"; then ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OBJDUMP=$ac_cv_prog_OBJDUMP if test -n "$OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 $as_echo "$OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OBJDUMP"; then ac_ct_OBJDUMP=$OBJDUMP # Extract the first word of "objdump", so it can be a program name with args. set dummy objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OBJDUMP"; then ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OBJDUMP="objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP if test -n "$ac_ct_OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 $as_echo "$ac_ct_OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OBJDUMP" = x; then OBJDUMP="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OBJDUMP=$ac_ct_OBJDUMP fi else OBJDUMP="$ac_cv_prog_OBJDUMP" fi test -z "$OBJDUMP" && OBJDUMP=objdump { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 $as_echo_n "checking how to recognize dependent libraries... " >&6; } if ${lt_cv_deplibs_check_method+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_file_magic_cmd='$MAGIC_CMD' lt_cv_file_magic_test_file= lt_cv_deplibs_check_method='unknown' # Need to set the preceding variable on all platforms that support # interlibrary dependencies. # 'none' -- dependencies not supported. # 'unknown' -- same as none, but documents that we really don't know. # 'pass_all' -- all dependencies passed with no checks. # 'test_compile' -- check by making test program. # 'file_magic [[regex]]' -- check by looking for files in library path # that responds to the $file_magic_cmd with a given extended regex. # If you have 'file' or equivalent on your system and you're not sure # whether 'pass_all' will *always* work, you probably want this one. case $host_os in aix[4-9]*) lt_cv_deplibs_check_method=pass_all ;; beos*) lt_cv_deplibs_check_method=pass_all ;; bsdi[45]*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' lt_cv_file_magic_cmd='/usr/bin/file -L' lt_cv_file_magic_test_file=/shlib/libc.so ;; cygwin*) # func_win32_libid is a shell function defined in ltmain.sh lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' ;; mingw* | pw32*) # Base MSYS/MinGW do not provide the 'file' command needed by # func_win32_libid shell function, so use a weaker test based on 'objdump', # unless we find 'file', for example because we are cross-compiling. if ( file / ) >/dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[3-9]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) lt_cv_deplibs_check_method=pass_all ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd* | bitrig*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; os2*) lt_cv_deplibs_check_method=pass_all ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 $as_echo "$lt_cv_deplibs_check_method" >&6; } file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. set dummy ${ac_tool_prefix}dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DLLTOOL"; then ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DLLTOOL=$ac_cv_prog_DLLTOOL if test -n "$DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 $as_echo "$DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DLLTOOL"; then ac_ct_DLLTOOL=$DLLTOOL # Extract the first word of "dlltool", so it can be a program name with args. set dummy dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DLLTOOL"; then ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DLLTOOL="dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL if test -n "$ac_ct_DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 $as_echo "$ac_ct_DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DLLTOOL" = x; then DLLTOOL="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DLLTOOL=$ac_ct_DLLTOOL fi else DLLTOOL="$ac_cv_prog_DLLTOOL" fi test -z "$DLLTOOL" && DLLTOOL=dlltool { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 $as_echo_n "checking how to associate runtime and link libraries... " >&6; } if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh; # decide which one to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd=$ECHO ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 $as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO if test -n "$ac_tool_prefix"; then for ac_prog in ar do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AR="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 $as_echo "$AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AR" && break done fi if test -z "$AR"; then ac_ct_AR=$AR for ac_prog in ar do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AR="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 $as_echo "$ac_ct_AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_AR" && break done if test "x$ac_ct_AR" = x; then AR="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR fi fi : ${AR=ar} : ${AR_FLAGS=cru} { $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 $as_echo_n "checking for archiver @FILE support... " >&6; } if ${lt_cv_ar_at_file+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ar_at_file=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test 0 -eq "$ac_status"; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test 0 -ne "$ac_status"; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 $as_echo "$lt_cv_ar_at_file" >&6; } if test no = "$lt_cv_ar_at_file"; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi test -z "$STRIP" && STRIP=: if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi test -z "$RANLIB" && RANLIB=: # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in bitrig* | openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Check for command to grab the raw symbol name followed by C symbol from nm. { $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 $as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } if ${lt_cv_sys_global_symbol_pipe+:} false; then : $as_echo_n "(cached) " >&6 else # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[BCDEGRST]' # Regexp to match symbols that can be accessed directly from C. sympat='\([_A-Za-z][_A-Za-z0-9]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[BCDT]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[ABCDGISTW]' ;; hpux*) if test ia64 = "$host_cpu"; then symcode='[ABCDEGRST]' fi ;; irix* | nonstopux*) symcode='[BCDEGRST]' ;; osf*) symcode='[BCDEGQRST]' ;; solaris*) symcode='[BDRT]' ;; sco3.2v5*) symcode='[DT]' ;; sysv4.2uw2*) symcode='[DT]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[ABDT]' ;; sysv4) symcode='[DFNSTU]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[ABCDGIRSTW]' ;; esac if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Gets list of data symbols to import. lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'" # Adjust the below global symbol transforms to fixup imported variables. lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'" lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'" lt_c_name_lib_hook="\ -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\ -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'" else # Disable hooks by default. lt_cv_sys_global_symbol_to_import= lt_cdecl_hook= lt_c_name_hook= lt_c_name_lib_hook= fi # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n"\ $lt_cdecl_hook\ " -e 's/^T .* \(.*\)$/extern int \1();/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n"\ $lt_c_name_hook\ " -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'" # Transform an extracted symbol line into symbol name with lib prefix and # symbol address. lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\ $lt_c_name_lib_hook\ " -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ " -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function, # D for any global variable and I for any imported variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK '"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\ " /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\ " /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\ " {split(\$ 0,a,/\||\r/); split(a[2],s)};"\ " s[1]~/^[@?]/{print f,s[1],s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Now try to grab the symbols. nlist=conftest.nm if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5 (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE /* DATA imports from DLLs on WIN32 can't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined __osf__ /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS=conftstm.$ac_objext CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest$ac_exeext; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&5 fi else echo "cannot find nm_test_var in $nlist" >&5 fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 fi else echo "$progname: failed program was:" >&5 cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test yes = "$pipe_works"; then break else lt_cv_sys_global_symbol_pipe= fi done fi if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 $as_echo "failed" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 $as_echo "ok" >&6; } fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then nm_file_list_spec='@' fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 $as_echo_n "checking for sysroot... " >&6; } # Check whether --with-sysroot was given. if test "${with_sysroot+set}" = set; then : withval=$with_sysroot; else with_sysroot=no fi lt_sysroot= case $with_sysroot in #( yes) if test yes = "$GCC"; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_sysroot" >&5 $as_echo "$with_sysroot" >&6; } as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 $as_echo "${lt_sysroot:-no}" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a working dd" >&5 $as_echo_n "checking for a working dd... " >&6; } if ${ac_cv_path_lt_DD+:} false; then : $as_echo_n "(cached) " >&6 else printf 0123456789abcdef0123456789abcdef >conftest.i cat conftest.i conftest.i >conftest2.i : ${lt_DD:=$DD} if test -z "$lt_DD"; then ac_path_lt_DD_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in dd; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_lt_DD="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_lt_DD" || continue if "$ac_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then cmp -s conftest.i conftest.out \ && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=: fi $ac_path_lt_DD_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_lt_DD"; then : fi else ac_cv_path_lt_DD=$lt_DD fi rm -f conftest.i conftest2.i conftest.out fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_lt_DD" >&5 $as_echo "$ac_cv_path_lt_DD" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to truncate binary pipes" >&5 $as_echo_n "checking how to truncate binary pipes... " >&6; } if ${lt_cv_truncate_bin+:} false; then : $as_echo_n "(cached) " >&6 else printf 0123456789abcdef0123456789abcdef >conftest.i cat conftest.i conftest.i >conftest2.i lt_cv_truncate_bin= if "$ac_cv_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then cmp -s conftest.i conftest.out \ && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1" fi rm -f conftest.i conftest2.i conftest.out test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_truncate_bin" >&5 $as_echo "$lt_cv_truncate_bin" >&6; } # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. func_cc_basename () { for cc_temp in $*""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` } # Check whether --enable-libtool-lock was given. if test "${enable_libtool_lock+set}" = set; then : enableval=$enable_libtool_lock; fi test no = "$enable_libtool_lock" || enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out what ABI is being produced by ac_compile, and set mode # options accordingly. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE=32 ;; *ELF-64*) HPUX_IA64_MODE=64 ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. echo '#line '$LINENO' "configure"' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then if test yes = "$lt_cv_prog_gnu_ld"; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; mips64*-*linux*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. echo '#line '$LINENO' "configure"' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then emul=elf case `/usr/bin/file conftest.$ac_objext` in *32-bit*) emul="${emul}32" ;; *64-bit*) emul="${emul}64" ;; esac case `/usr/bin/file conftest.$ac_objext` in *MSB*) emul="${emul}btsmip" ;; *LSB*) emul="${emul}ltsmip" ;; esac case `/usr/bin/file conftest.$ac_objext` in *N32*) emul="${emul}n32" ;; esac LD="${LD-ld} -m $emul" fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. Note that the listed cases only cover the # situations where additional linker options are needed (such as when # doing 32-bit compilation for a host where ld defaults to 64-bit, or # vice versa); the common cases where no linker options are needed do # not appear in the list. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) case `/usr/bin/file conftest.o` in *x86-64*) LD="${LD-ld} -m elf32_x86_64" ;; *) LD="${LD-ld} -m elf_i386" ;; esac ;; powerpc64le-*linux*) LD="${LD-ld} -m elf32lppclinux" ;; powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; powerpcle-*linux*) LD="${LD-ld} -m elf64lppc" ;; powerpc-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS=$CFLAGS CFLAGS="$CFLAGS -belf" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 $as_echo_n "checking whether the C compiler needs -belf... " >&6; } if ${lt_cv_cc_needs_belf+:} false; then : $as_echo_n "(cached) " >&6 else ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_cc_needs_belf=yes else lt_cv_cc_needs_belf=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 $as_echo "$lt_cv_cc_needs_belf" >&6; } if test yes != "$lt_cv_cc_needs_belf"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS=$SAVE_CFLAGS fi ;; *-*solaris*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) case $host in i?86-*-solaris*|x86_64-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) LD="${LD-ld} -m elf64_sparc" ;; esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then LD=${LD-ld}_sol2 fi ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks=$enable_libtool_lock if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. set dummy ${ac_tool_prefix}mt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$MANIFEST_TOOL"; then ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL if test -n "$MANIFEST_TOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 $as_echo "$MANIFEST_TOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_MANIFEST_TOOL"; then ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL # Extract the first word of "mt", so it can be a program name with args. set dummy mt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_MANIFEST_TOOL"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL if test -n "$ac_ct_MANIFEST_TOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 $as_echo "$ac_ct_MANIFEST_TOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_MANIFEST_TOOL" = x; then MANIFEST_TOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL fi else MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" fi test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 $as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } if ${lt_cv_path_mainfest_tool+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&5 if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 $as_echo "$lt_cv_path_mainfest_tool" >&6; } if test yes != "$lt_cv_path_mainfest_tool"; then MANIFEST_TOOL=: fi case $host_os in rhapsody* | darwin*) if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DSYMUTIL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DSYMUTIL"; then ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DSYMUTIL=$ac_cv_prog_DSYMUTIL if test -n "$DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 $as_echo "$DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DSYMUTIL"; then ac_ct_DSYMUTIL=$DSYMUTIL # Extract the first word of "dsymutil", so it can be a program name with args. set dummy dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DSYMUTIL"; then ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL if test -n "$ac_ct_DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 $as_echo "$ac_ct_DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DSYMUTIL" = x; then DSYMUTIL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DSYMUTIL=$ac_ct_DSYMUTIL fi else DSYMUTIL="$ac_cv_prog_DSYMUTIL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. set dummy ${ac_tool_prefix}nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_NMEDIT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NMEDIT"; then ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi NMEDIT=$ac_cv_prog_NMEDIT if test -n "$NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 $as_echo "$NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_NMEDIT"; then ac_ct_NMEDIT=$NMEDIT # Extract the first word of "nmedit", so it can be a program name with args. set dummy nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_NMEDIT"; then ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_NMEDIT="nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT if test -n "$ac_ct_NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 $as_echo "$ac_ct_NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_NMEDIT" = x; then NMEDIT=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac NMEDIT=$ac_ct_NMEDIT fi else NMEDIT="$ac_cv_prog_NMEDIT" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. set dummy ${ac_tool_prefix}lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_LIPO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$LIPO"; then ac_cv_prog_LIPO="$LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_LIPO="${ac_tool_prefix}lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi LIPO=$ac_cv_prog_LIPO if test -n "$LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 $as_echo "$LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_LIPO"; then ac_ct_LIPO=$LIPO # Extract the first word of "lipo", so it can be a program name with args. set dummy lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_LIPO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_LIPO"; then ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_LIPO="lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO if test -n "$ac_ct_LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 $as_echo "$ac_ct_LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_LIPO" = x; then LIPO=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac LIPO=$ac_ct_LIPO fi else LIPO="$ac_cv_prog_LIPO" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. set dummy ${ac_tool_prefix}otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL"; then ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL="${ac_tool_prefix}otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL=$ac_cv_prog_OTOOL if test -n "$OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 $as_echo "$OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL"; then ac_ct_OTOOL=$OTOOL # Extract the first word of "otool", so it can be a program name with args. set dummy otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL"; then ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL="otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL if test -n "$ac_ct_OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 $as_echo "$ac_ct_OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL" = x; then OTOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL=$ac_ct_OTOOL fi else OTOOL="$ac_cv_prog_OTOOL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. set dummy ${ac_tool_prefix}otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OTOOL64+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL64"; then ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL64=$ac_cv_prog_OTOOL64 if test -n "$OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 $as_echo "$OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL64"; then ac_ct_OTOOL64=$OTOOL64 # Extract the first word of "otool64", so it can be a program name with args. set dummy otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL64"; then ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL64="otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 if test -n "$ac_ct_OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 $as_echo "$ac_ct_OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL64" = x; then OTOOL64=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL64=$ac_ct_OTOOL64 fi else OTOOL64="$ac_cv_prog_OTOOL64" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 $as_echo_n "checking for -single_module linker flag... " >&6; } if ${lt_cv_apple_cc_single_mod+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_apple_cc_single_mod=no if test -z "$LT_MULTI_MODULE"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&5 $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? # If there is a non-empty error log, and "single_module" # appears in it, assume the flag caused a linker warning if test -s conftest.err && $GREP single_module conftest.err; then cat conftest.err >&5 # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. elif test -f libconftest.dylib && test 0 = "$_lt_result"; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&5 fi rm -rf libconftest.dylib* rm -f conftest.* fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 $as_echo "$lt_cv_apple_cc_single_mod" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 $as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } if ${lt_cv_ld_exported_symbols_list+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_ld_exported_symbols_list=yes else lt_cv_ld_exported_symbols_list=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 $as_echo "$lt_cv_ld_exported_symbols_list" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 $as_echo_n "checking for -force_load linker flag... " >&6; } if ${lt_cv_ld_force_load+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 echo "$AR cru libconftest.a conftest.o" >&5 $AR cru libconftest.a conftest.o 2>&5 echo "$RANLIB libconftest.a" >&5 $RANLIB libconftest.a 2>&5 cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&5 elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then lt_cv_ld_force_load=yes else cat conftest.err >&5 fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 $as_echo "$lt_cv_ld_force_load" >&6; } case $host_os in rhapsody* | darwin1.[012]) _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[91]*) _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; 10.[012][,.]*) _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test yes = "$lt_cv_apple_cc_single_mod"; then _lt_dar_single_mod='$single_module' fi if test yes = "$lt_cv_ld_exported_symbols_list"; then _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib' fi if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac # func_munge_path_list VARIABLE PATH # ----------------------------------- # VARIABLE is name of variable containing _space_ separated list of # directories to be munged by the contents of PATH, which is string # having a format: # "DIR[:DIR]:" # string "DIR[ DIR]" will be prepended to VARIABLE # ":DIR[:DIR]" # string "DIR[ DIR]" will be appended to VARIABLE # "DIRP[:DIRP]::[DIRA:]DIRA" # string "DIRP[ DIRP]" will be prepended to VARIABLE and string # "DIRA[ DIRA]" will be appended to VARIABLE # "DIR[:DIR]" # VARIABLE will be replaced by "DIR[ DIR]" func_munge_path_list () { case x$2 in x) ;; *:) eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\" ;; x:*) eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\" ;; *::*) eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\" ;; *) eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\" ;; esac } ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in dlfcn.h do : ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default " if test "x$ac_cv_header_dlfcn_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_DLFCN_H 1 _ACEOF fi done # Set options enable_dlopen=no enable_win32_dll=no # Check whether --enable-shared was given. if test "${enable_shared+set}" = set; then : enableval=$enable_shared; p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS=$lt_save_ifs ;; esac else enable_shared=yes fi # Check whether --enable-static was given. if test "${enable_static+set}" = set; then : enableval=$enable_static; p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS=$lt_save_ifs ;; esac else enable_static=yes fi # Check whether --with-pic was given. if test "${with_pic+set}" = set; then : withval=$with_pic; lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for lt_pkg in $withval; do IFS=$lt_save_ifs if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS=$lt_save_ifs ;; esac else pic_mode=default fi # Check whether --enable-fast-install was given. if test "${enable_fast_install+set}" = set; then : enableval=$enable_fast_install; p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS=$lt_save_ifs ;; esac else enable_fast_install=yes fi shared_archive_member_spec= case $host,$enable_shared in power*-*-aix[5-9]*,yes) { $as_echo "$as_me:${as_lineno-$LINENO}: checking which variant of shared library versioning to provide" >&5 $as_echo_n "checking which variant of shared library versioning to provide... " >&6; } # Check whether --with-aix-soname was given. if test "${with_aix_soname+set}" = set; then : withval=$with_aix_soname; case $withval in aix|svr4|both) ;; *) as_fn_error $? "Unknown argument to --with-aix-soname" "$LINENO" 5 ;; esac lt_cv_with_aix_soname=$with_aix_soname else if ${lt_cv_with_aix_soname+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_with_aix_soname=aix fi with_aix_soname=$lt_cv_with_aix_soname fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_aix_soname" >&5 $as_echo "$with_aix_soname" >&6; } if test aix != "$with_aix_soname"; then # For the AIX way of multilib, we name the shared archive member # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o', # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File. # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag, # the AIX toolchain works better with OBJECT_MODE set (default 32). if test 64 = "${OBJECT_MODE-32}"; then shared_archive_member_spec=shr_64 else shared_archive_member_spec=shr fi fi ;; *) with_aix_soname=aix ;; esac # This can be used to rebuild libtool when needed LIBTOOL_DEPS=$ltmain # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' test -z "$LN_S" && LN_S="ln -s" if test -n "${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 $as_echo_n "checking for objdir... " >&6; } if ${lt_cv_objdir+:} false; then : $as_echo_n "(cached) " >&6 else rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 $as_echo "$lt_cv_objdir" >&6; } objdir=$lt_cv_objdir cat >>confdefs.h <<_ACEOF #define LT_OBJDIR "$lt_cv_objdir/" _ACEOF case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test set != "${COLLECT_NAMES+set}"; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a '.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld=$lt_cv_prog_gnu_ld old_CC=$CC old_CFLAGS=$CFLAGS # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o func_cc_basename $compiler cc_basename=$func_cc_basename_result # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 $as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } if ${lt_cv_path_MAGIC_CMD+:} false; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD=$MAGIC_CMD lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/${ac_tool_prefix}file"; then lt_cv_path_MAGIC_CMD=$ac_dir/"${ac_tool_prefix}file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD=$lt_cv_path_MAGIC_CMD if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS=$lt_save_ifs MAGIC_CMD=$lt_save_MAGIC_CMD ;; esac fi MAGIC_CMD=$lt_cv_path_MAGIC_CMD if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 $as_echo_n "checking for file... " >&6; } if ${lt_cv_path_MAGIC_CMD+:} false; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD=$MAGIC_CMD lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/file"; then lt_cv_path_MAGIC_CMD=$ac_dir/"file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD=$lt_cv_path_MAGIC_CMD if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS=$lt_save_ifs MAGIC_CMD=$lt_save_MAGIC_CMD ;; esac fi MAGIC_CMD=$lt_cv_path_MAGIC_CMD if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi else MAGIC_CMD=: fi fi fi ;; esac # Use C for the default configuration in the libtool script lt_save_CC=$CC ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o objext=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* if test -n "$compiler"; then lt_prog_compiler_no_builtin_flag= if test yes = "$GCC"; then case $cc_basename in nvcc*) lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; *) lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 $as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_rtti_exceptions=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-fno-rtti -fno-exceptions" ## exclude from sc_useless_quotes_in_assignment # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_rtti_exceptions=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 $as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } if test yes = "$lt_cv_prog_compiler_rtti_exceptions"; then lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" else : fi fi lt_prog_compiler_wl= lt_prog_compiler_pic= lt_prog_compiler_static= if test yes = "$GCC"; then lt_prog_compiler_wl='-Wl,' lt_prog_compiler_static='-static' case $host_os in aix*) # All AIX code is PIC. if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' fi lt_prog_compiler_pic='-fPIC' ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the '-m68020' flag to GCC prevents building anything better, # like '-m68040'. lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic='-DDLL_EXPORT' case $host_os in os2*) lt_prog_compiler_static='$wl-static' ;; esac ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. lt_prog_compiler_static= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) lt_prog_compiler_pic='-fPIC' ;; esac ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. lt_prog_compiler_can_build_shared=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic=-Kconform_pic fi ;; *) lt_prog_compiler_pic='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 lt_prog_compiler_wl='-Xlinker ' if test -n "$lt_prog_compiler_pic"; then lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) lt_prog_compiler_wl='-Wl,' if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' else lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' fi ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic='-fno-common' case $cc_basename in nagfor*) # NAG Fortran compiler lt_prog_compiler_wl='-Wl,-Wl,,' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; esac ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic='-DDLL_EXPORT' case $host_os in os2*) lt_prog_compiler_static='$wl-static' ;; esac ;; hpux9* | hpux10* | hpux11*) lt_prog_compiler_wl='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? lt_prog_compiler_static='$wl-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) lt_prog_compiler_wl='-Wl,' # PIC (with -KPIC) is the default. lt_prog_compiler_static='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in # old Intel for x86_64, which still supported -KPIC. ecc*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; # Lahey Fortran 8.1. lf95*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='--shared' lt_prog_compiler_static='--static' ;; nagfor*) # NAG Fortran compiler lt_prog_compiler_wl='-Wl,-Wl,,' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; tcc*) # Fabrice Bellard et al's Tiny C Compiler lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; ccc*) lt_prog_compiler_wl='-Wl,' # All Alpha code is PIC. lt_prog_compiler_static='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-qpic' lt_prog_compiler_static='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='' ;; *Sun\ F* | *Sun*Fortran*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Wl,' ;; *Intel*\ [CF]*Compiler*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; *Portland\ Group*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; esac ;; esac ;; newsos6) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static='-non_shared' ;; rdos*) lt_prog_compiler_static='-non_shared' ;; solaris*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) lt_prog_compiler_wl='-Qoption ld ';; *) lt_prog_compiler_wl='-Wl,';; esac ;; sunos4*) lt_prog_compiler_wl='-Qoption ld ' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic='-Kconform_pic' lt_prog_compiler_static='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; unicos*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_can_build_shared=no ;; uts4*) lt_prog_compiler_pic='-pic' lt_prog_compiler_static='-Bstatic' ;; *) lt_prog_compiler_can_build_shared=no ;; esac fi case $host_os in # For platforms that do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic= ;; *) lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 $as_echo_n "checking for $compiler option to produce PIC... " >&6; } if ${lt_cv_prog_compiler_pic+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic=$lt_prog_compiler_pic fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 $as_echo "$lt_cv_prog_compiler_pic" >&6; } lt_prog_compiler_pic=$lt_cv_prog_compiler_pic # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } if ${lt_cv_prog_compiler_pic_works+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_works=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic -DPIC" ## exclude from sc_useless_quotes_in_assignment # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 $as_echo "$lt_cv_prog_compiler_pic_works" >&6; } if test yes = "$lt_cv_prog_compiler_pic_works"; then case $lt_prog_compiler_pic in "" | " "*) ;; *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; esac else lt_prog_compiler_pic= lt_prog_compiler_can_build_shared=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 $as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if ${lt_cv_prog_compiler_static_works+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_static_works=no save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works=yes fi else lt_cv_prog_compiler_static_works=yes fi fi $RM -r conftest* LDFLAGS=$save_LDFLAGS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 $as_echo "$lt_cv_prog_compiler_static_works" >&6; } if test yes = "$lt_cv_prog_compiler_static_works"; then : else lt_prog_compiler_static= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } hard_links=nottested if test no = "$lt_cv_prog_compiler_c_o" && test no != "$need_locks"; then # do not overwrite the value of need_locks provided by the user { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 $as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 $as_echo "$hard_links" >&6; } if test no = "$hard_links"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5 $as_echo "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } runpath_var= allow_undefined_flag= always_export_symbols=no archive_cmds= archive_expsym_cmds= compiler_needs_object=no enable_shared_with_static_runtimes=no export_dynamic_flag_spec= export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' hardcode_automatic=no hardcode_direct=no hardcode_direct_absolute=no hardcode_libdir_flag_spec= hardcode_libdir_separator= hardcode_minus_L=no hardcode_shlibpath_var=unsupported inherit_rpath=no link_all_deplibs=unknown module_cmds= module_expsym_cmds= old_archive_from_new_cmds= old_archive_from_expsyms_cmds= thread_safe_flag_spec= whole_archive_flag_spec= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list include_expsyms= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ' (' and ')$', so one must not match beginning or # end of line. Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc', # as well as any symbol that contains 'd'. exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test yes != "$GCC"; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd* | bitrig*) with_gnu_ld=no ;; esac ld_shlibs=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test yes = "$with_gnu_ld"; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; *\ \(GNU\ Binutils\)\ [3-9]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test yes = "$lt_use_gnu_ld_interface"; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='$wl' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' export_dynamic_flag_spec='$wl--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then whole_archive_flag_spec=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' else whole_archive_flag_spec= fi supports_anon_versioning=no case `$LD -v | $SED -e 's/(^)\+)\s\+//' 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[3-9]*) # On AIX/PPC, the GNU linker is very broken if test ia64 != "$host_cpu"; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' else ld_shlibs=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec='-L$libdir' export_dynamic_flag_spec='$wl--export-all-symbols' allow_undefined_flag=unsupported always_export_symbols=no enable_shared_with_static_runtimes=yes export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file, use it as # is; otherwise, prepend EXPORTS... archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs=no fi ;; haiku*) archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' link_all_deplibs=yes ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes allow_undefined_flag=unsupported shrext_cmds=.dll archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' enable_shared_with_static_runtimes=yes ;; interix[3-9]*) hardcode_direct=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='$wl-rpath,$libdir' export_dynamic_flag_spec='$wl-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test linux-dietlibc = "$host_os"; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test no = "$tmp_diet" then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 whole_archive_flag_spec= tmp_sharedflag='--shared' ;; nagfor*) # NAGFOR 5.3 tmp_sharedflag='-Wl,-shared' ;; xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' compiler_needs_object=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 whole_archive_flag_spec='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' compiler_needs_object=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' if test yes = "$supports_anon_versioning"; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' fi case $cc_basename in tcc*) export_dynamic_flag_spec='-rdynamic' ;; xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test yes = "$supports_anon_versioning"; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else ld_shlibs=no fi ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac ;; sunos4*) archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= hardcode_direct=yes hardcode_shlibpath_var=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac if test no = "$ld_shlibs"; then runpath_var= hardcode_libdir_flag_spec= export_dynamic_flag_spec= whole_archive_flag_spec= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) allow_undefined_flag=unsupported always_export_symbols=yes archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L=yes if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct=unsupported fi ;; aix[4-9]*) if test ia64 = "$host_cpu"; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag= else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to GNU nm, but means don't demangle to AIX nm. # Without the "-l" option, or with the "-B" option, AIX nm treats # weak defined symbols like other global defined symbols, whereas # GNU nm marks them as "W". # While the 'weak' keyword is ignored in the Export File, we need # it in the Import File for the 'aix-soname' feature, so we have # to replace the "-B" option with "-P" for AIX nm. if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' else export_symbols_cmds='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # have runtime linking enabled, and use it for executables. # For shared libraries, we enable/disable runtime linking # depending on the kind of the shared library created - # when "with_aix_soname,aix_use_runtimelinking" is: # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables # "aix,yes" lib.so shared, rtl:yes, for executables # lib.a static archive # "both,no" lib.so.V(shr.o) shared, rtl:yes # lib.a(lib.so.V) shared, rtl:no, for executables # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a(lib.so.V) shared, rtl:no # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a static archive case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then aix_use_runtimelinking=yes break fi done if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then # With aix-soname=svr4, we create the lib.so.V shared archives only, # so we don't have lib.a shared libs to link our executables. # We have to force runtime linking in this case. aix_use_runtimelinking=yes LDFLAGS="$LDFLAGS -Wl,-brtl" fi ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds='' hardcode_direct=yes hardcode_direct_absolute=yes hardcode_libdir_separator=':' link_all_deplibs=yes file_list_spec='$wl-f,' case $with_aix_soname,$aix_use_runtimelinking in aix,*) ;; # traditional, no import file svr4,* | *,yes) # use import file # The Import File defines what to hardcode. hardcode_direct=no hardcode_direct_absolute=no ;; esac if test yes = "$GCC"; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`$CC -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L=yes hardcode_libdir_flag_spec='-L$libdir' hardcode_libdir_separator= fi ;; esac shared_flag='-shared' if test yes = "$aix_use_runtimelinking"; then shared_flag="$shared_flag "'$wl-G' fi # Need to ensure runtime linking is disabled for the traditional # shared library, or the linker may eventually find shared libraries # /with/ Import File - we do not want to mix them. shared_flag_aix='-shared' shared_flag_svr4='-shared $wl-G' else # not using gcc if test ia64 = "$host_cpu"; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test yes = "$aix_use_runtimelinking"; then shared_flag='$wl-G' else shared_flag='$wl-bM:SRE' fi shared_flag_aix='$wl-bM:SRE' shared_flag_svr4='$wl-G' fi fi export_dynamic_flag_spec='$wl-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols=yes if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag='-berok' # Determine the default libpath from the value encoded in an # empty executable. if test set = "${lt_cv_aix_libpath+set}"; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath_+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=/usr/lib:/lib fi fi aix_libpath=$lt_cv_aix_libpath_ fi hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag else if test ia64 = "$host_cpu"; then hardcode_libdir_flag_spec='$wl-R $libdir:/usr/lib:/lib' allow_undefined_flag="-z nodefs" archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. if test set = "${lt_cv_aix_libpath+set}"; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath_+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=/usr/lib:/lib fi fi aix_libpath=$lt_cv_aix_libpath_ fi hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag=' $wl-bernotok' allow_undefined_flag=' $wl-berok' if test yes = "$with_gnu_ld"; then # We only use this code for GNU lds that support --whole-archive. whole_archive_flag_spec='$wl--whole-archive$convenience $wl--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec='$convenience' fi archive_cmds_need_lc=yes archive_expsym_cmds='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' # -brtl affects multiple linker settings, -berok does not and is overridden later compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`' if test svr4 != "$with_aix_soname"; then # This is similar to how AIX traditionally builds its shared libraries. archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' fi if test aix != "$with_aix_soname"; then archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' else # used by -dlpreopen to get the symbols archive_expsym_cmds="$archive_expsym_cmds"'~$MV $output_objdir/$realname.d/$soname $output_objdir' fi archive_expsym_cmds="$archive_expsym_cmds"'~$RM -r $output_objdir/$realname.d' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; bsdi[45]*) export_dynamic_flag_spec=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl*) # Native MSVC hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported always_export_symbols=yes file_list_spec='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then cp "$export_symbols" "$output_objdir/$soname.def"; echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; else $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, )='true' enable_shared_with_static_runtimes=yes exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib old_postinstall_cmds='chmod 644 $oldlib' postlink_cmds='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile=$lt_outputfile.exe lt_tool_outputfile=$lt_tool_outputfile.exe ;; esac~ if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. old_archive_from_new_cmds='true' # FIXME: Should let the user specify the lib program. old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' enable_shared_with_static_runtimes=yes ;; esac ;; darwin* | rhapsody*) archive_cmds_need_lc=no hardcode_direct=no hardcode_automatic=yes hardcode_shlibpath_var=unsupported if test yes = "$lt_cv_ld_force_load"; then whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' else whole_archive_flag_spec='' fi link_all_deplibs=yes allow_undefined_flag=$_lt_dar_allow_undefined case $cc_basename in ifort*|nagfor*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test yes = "$_lt_dar_can_shared"; then output_verbose_link_cmd=func_echo_all archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" archive_expsym_cmds="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" module_expsym_cmds="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" else ld_shlibs=no fi ;; dgux*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; hpux9*) if test yes = "$GCC"; then archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' else archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' fi hardcode_libdir_flag_spec='$wl+b $wl$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes export_dynamic_flag_spec='$wl-E' ;; hpux10*) if test yes,no = "$GCC,$with_gnu_ld"; then archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test no = "$with_gnu_ld"; then hardcode_libdir_flag_spec='$wl+b $wl$libdir' hardcode_libdir_separator=: hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='$wl-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes fi ;; hpux11*) if test yes,no = "$GCC,$with_gnu_ld"; then case $host_cpu in hppa*64*) archive_cmds='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) archive_cmds='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 $as_echo_n "checking if $CC understands -b... " >&6; } if ${lt_cv_prog_compiler__b+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler__b=no save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS -b" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler__b=yes fi else lt_cv_prog_compiler__b=yes fi fi $RM -r conftest* LDFLAGS=$save_LDFLAGS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 $as_echo "$lt_cv_prog_compiler__b" >&6; } if test yes = "$lt_cv_prog_compiler__b"; then archive_cmds='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi ;; esac fi if test no = "$with_gnu_ld"; then hardcode_libdir_flag_spec='$wl+b $wl$libdir' hardcode_libdir_separator=: case $host_cpu in hppa*64*|ia64*) hardcode_direct=no hardcode_shlibpath_var=no ;; *) hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='$wl-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test yes = "$GCC"; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 $as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } if ${lt_cv_irix_exported_symbol+:} false; then : $as_echo_n "(cached) " >&6 else save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int foo (void) { return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_irix_exported_symbol=yes else lt_cv_irix_exported_symbol=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 $as_echo "$lt_cv_irix_exported_symbol" >&6; } if test yes = "$lt_cv_irix_exported_symbol"; then archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib' fi else archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' hardcode_libdir_separator=: inherit_rpath=yes link_all_deplibs=yes ;; linux*) case $cc_basename in tcc*) # Fabrice Bellard et al's Tiny C Compiler ld_shlibs=yes archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; newsos6) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' hardcode_libdir_separator=: hardcode_shlibpath_var=no ;; *nto* | *qnx*) ;; openbsd* | bitrig*) if test -f /usr/libexec/ld.so; then hardcode_direct=yes hardcode_shlibpath_var=no hardcode_direct_absolute=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols' hardcode_libdir_flag_spec='$wl-rpath,$libdir' export_dynamic_flag_spec='$wl-E' else archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='$wl-rpath,$libdir' fi else ld_shlibs=no fi ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes allow_undefined_flag=unsupported shrext_cmds=.dll archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' enable_shared_with_static_runtimes=yes ;; osf3*) if test yes = "$GCC"; then allow_undefined_flag=' $wl-expect_unresolved $wl\*' archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' hardcode_libdir_separator=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test yes = "$GCC"; then allow_undefined_flag=' $wl-expect_unresolved $wl\*' archive_cmds='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec='-rpath $libdir' fi archive_cmds_need_lc='no' hardcode_libdir_separator=: ;; solaris*) no_undefined_flag=' -z defs' if test yes = "$GCC"; then wlarc='$wl' archive_cmds='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' archive_cmds='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='$wl' archive_cmds='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi hardcode_libdir_flag_spec='-R$libdir' hardcode_shlibpath_var=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands '-z linker_flag'. GCC discards it without '$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test yes = "$GCC"; then whole_archive_flag_spec='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' else whole_archive_flag_spec='-z allextract$convenience -z defaultextract' fi ;; esac link_all_deplibs=yes ;; sunos4*) if test sequent = "$host_vendor"; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. archive_cmds='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; sysv4) case $host_vendor in sni) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' reload_cmds='$CC -r -o $output$reload_objs' hardcode_direct=no ;; motorola) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' hardcode_shlibpath_var=no ;; sysv4.3*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no export_dynamic_flag_spec='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ld_shlibs=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag='$wl-z,text' archive_cmds_need_lc=no hardcode_shlibpath_var=no runpath_var='LD_RUN_PATH' if test yes = "$GCC"; then archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We CANNOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag='$wl-z,text' allow_undefined_flag='$wl-z,nodefs' archive_cmds_need_lc=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='$wl-R,$libdir' hardcode_libdir_separator=':' link_all_deplibs=yes export_dynamic_flag_spec='$wl-Bexport' runpath_var='LD_RUN_PATH' if test yes = "$GCC"; then archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; *) ld_shlibs=no ;; esac if test sni = "$host_vendor"; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) export_dynamic_flag_spec='$wl-Blargedynsym' ;; esac fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 $as_echo "$ld_shlibs" >&6; } test no = "$ld_shlibs" && can_build_shared=no with_gnu_ld=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc" in x|xyes) # Assume -lc should be added archive_cmds_need_lc=yes if test yes,yes = "$GCC,$enable_shared"; then case $archive_cmds in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } if ${lt_cv_archive_cmds_need_lc+:} false; then : $as_echo_n "(cached) " >&6 else $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl pic_flag=$lt_prog_compiler_pic compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag allow_undefined_flag= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc=no else lt_cv_archive_cmds_need_lc=yes fi allow_undefined_flag=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 $as_echo "$lt_cv_archive_cmds_need_lc" >&6; } archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc ;; esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } if test yes = "$GCC"; then case $host_os in darwin*) lt_awk_arg='/^libraries:/,/LR/' ;; *) lt_awk_arg='/^libraries:/' ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq='s|=\([A-Za-z]:\)|\1|g' ;; *) lt_sed_strip_eq='s|=/|/|g' ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary... lt_tmp_lt_search_path_spec= lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` # ...but if some path component already ends with the multilib dir we assume # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer). case "$lt_multi_os_dir; $lt_search_path_spec " in "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*) lt_multi_os_dir= ;; esac for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir" elif test -n "$lt_multi_os_dir"; then test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS = " "; FS = "/|\n";} { lt_foo = ""; lt_count = 0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo = "/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[lt_foo]++; } if (lt_freq[lt_foo] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's|/\([A-Za-z]:\)|\1|g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=.so postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='$libname$release$shared_ext$major' ;; aix[4-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test ia64 = "$host_cpu"; then # AIX 5 supports IA64 library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line '#! .'. This would cause the generated library to # depend on '.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # Using Import Files as archive members, it is possible to support # filename-based versioning of shared library archives on AIX. While # this would work for both with and without runtime linking, it will # prevent static linking of such archives. So we do filename-based # shared library versioning with .so extension only, which is used # when both runtime linking and shared linking is enabled. # Unfortunately, runtime linking may impact performance, so we do # not want this to be the default eventually. Also, we use the # versioned .so libs for executables only if there is the -brtl # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. # To allow for filename-based versioning support, we need to create # libNAME.so.V as an archive file, containing: # *) an Import File, referring to the versioned filename of the # archive as well as the shared archive member, telling the # bitwidth (32 or 64) of that shared object, and providing the # list of exported symbols of that shared object, eventually # decorated with the 'weak' keyword # *) the shared object with the F_LOADONLY flag set, to really avoid # it being seen by the linker. # At run time we better use the real file rather than another symlink, # but for link time we create the symlink libNAME.so -> libNAME.so.V case $with_aix_soname,$aix_use_runtimelinking in # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. aix,yes) # traditional libtool dynamic_linker='AIX unversionable lib.so' # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' ;; aix,no) # traditional AIX only dynamic_linker='AIX lib.a(lib.so.V)' # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='$libname$release.a $libname.a' soname_spec='$libname$release$shared_ext$major' ;; svr4,*) # full svr4 only dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,yes) # both, prefer svr4 dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # unpreferred sharedlib libNAME.a needs extra handling postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,no) # both, prefer aix dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)" library_names_spec='$libname$release.a $libname.a' soname_spec='$libname$release$shared_ext$major' # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' ;; esac shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='$libname$shared_ext' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=.dll need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' library_names_spec='$libname.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec=$LIB if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' soname_spec='$libname$release$major$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[23].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=no sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' if test 32 = "$HPUX_IA64_MODE"; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" sys_lib_dlsearch_path_spec=/usr/lib/hpux32 else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" sys_lib_dlsearch_path_spec=/usr/lib/hpux64 fi ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[3-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test yes = "$lt_cv_prog_gnu_ld"; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='$libname$release$shared_ext$major' library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; linux*android*) version_type=none # Android doesn't support versioned libraries. need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext' soname_spec='$libname$release$shared_ext' finish_cmds= shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes dynamic_linker='Android linker' # Don't embed -rpath directories since the linker doesn't support them. hardcode_libdir_flag_spec='-L$libdir' ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH if ${lt_cv_shlibpath_overrides_runpath+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : lt_cv_shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir fi shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Add ABI-specific directories to the system library path. sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib" # Ideally, we could use ldconfig to report *all* directores which are # searched for libraries, however this is still not possible. Aside from not # being certain /sbin/ldconfig is available, command # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, # even though it is searched at run-time. Try to do the best guess by # appending ld.so.conf contents (and includes) to the search path. if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd* | bitrig*) version_type=sunos sys_lib_dlsearch_path_spec=/usr/lib need_lib_prefix=no if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then need_version=no else need_version=yes fi library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; os2*) libname_spec='$name' version_type=windows shrext_cmds=.dll need_version=no need_lib_prefix=no # OS/2 can only load a DLL with a base name of 8 characters or less. soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; v=$($ECHO $release$versuffix | tr -d .-); n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); $ECHO $n$v`$shared_ext' library_names_spec='${libname}_dll.$libext' dynamic_linker='OS/2 ld.exe' shlibpath_var=BEGINLIBPATH sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='$libname$release$shared_ext$major' library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test yes = "$with_gnu_ld"; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec; then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' soname_spec='$libname$shared_ext.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=sco need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test yes = "$with_gnu_ld"; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 $as_echo "$dynamic_linker" >&6; } test no = "$dynamic_linker" && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test yes = "$GCC"; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec fi if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec fi # remember unaugmented sys_lib_dlsearch_path content for libtool script decls... configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec # ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" # to be used as default LT_SYS_LIBRARY_PATH value in generated libtool configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 $as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action= if test -n "$hardcode_libdir_flag_spec" || test -n "$runpath_var" || test yes = "$hardcode_automatic"; then # We can hardcode non-existent directories. if test no != "$hardcode_direct" && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, )" && test no != "$hardcode_minus_L"; then # Linking always hardcodes the temporary library directory. hardcode_action=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action=unsupported fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 $as_echo "$hardcode_action" >&6; } if test relink = "$hardcode_action" || test yes = "$inherit_rpath"; then # Fast installation is not supported enable_fast_install=no elif test yes = "$shlibpath_overrides_runpath" || test no = "$enable_shared"; then # Fast installation is not necessary enable_fast_install=needless fi if test yes != "$enable_dlopen"; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen=load_add_on lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen=LoadLibrary lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen=dlopen lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl else lt_cv_dlopen=dyld lt_cv_dlopen_libs= lt_cv_dlopen_self=yes fi ;; tpf*) # Don't try to run any link tests for TPF. We know it's impossible # because TPF is a cross-compiler, and we know how we open DSOs. lt_cv_dlopen=dlopen lt_cv_dlopen_libs= lt_cv_dlopen_self=no ;; *) ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" if test "x$ac_cv_func_shl_load" = xyes; then : lt_cv_dlopen=shl_load else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 $as_echo_n "checking for shl_load in -ldld... " >&6; } if ${ac_cv_lib_dld_shl_load+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char shl_load (); int main () { return shl_load (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_shl_load=yes else ac_cv_lib_dld_shl_load=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 $as_echo "$ac_cv_lib_dld_shl_load" >&6; } if test "x$ac_cv_lib_dld_shl_load" = xyes; then : lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld else ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" if test "x$ac_cv_func_dlopen" = xyes; then : lt_cv_dlopen=dlopen else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 $as_echo_n "checking for dlopen in -lsvld... " >&6; } if ${ac_cv_lib_svld_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsvld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_svld_dlopen=yes else ac_cv_lib_svld_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 $as_echo "$ac_cv_lib_svld_dlopen" >&6; } if test "x$ac_cv_lib_svld_dlopen" = xyes; then : lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 $as_echo_n "checking for dld_link in -ldld... " >&6; } if ${ac_cv_lib_dld_dld_link+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dld_link (); int main () { return dld_link (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_dld_link=yes else ac_cv_lib_dld_dld_link=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 $as_echo "$ac_cv_lib_dld_dld_link" >&6; } if test "x$ac_cv_lib_dld_dld_link" = xyes; then : lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld fi fi fi fi fi fi ;; esac if test no = "$lt_cv_dlopen"; then enable_dlopen=no else enable_dlopen=yes fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS=$CPPFLAGS test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS=$LDFLAGS wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS=$LIBS LIBS="$lt_cv_dlopen_libs $LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 $as_echo_n "checking whether a program can dlopen itself... " >&6; } if ${lt_cv_dlopen_self+:} false; then : $as_echo_n "(cached) " >&6 else if test yes = "$cross_compiling"; then : lt_cv_dlopen_self=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisibility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; esac else : # compilation failed lt_cv_dlopen_self=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 $as_echo "$lt_cv_dlopen_self" >&6; } if test yes = "$lt_cv_dlopen_self"; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 $as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } if ${lt_cv_dlopen_self_static+:} false; then : $as_echo_n "(cached) " >&6 else if test yes = "$cross_compiling"; then : lt_cv_dlopen_self_static=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisibility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; esac else : # compilation failed lt_cv_dlopen_self_static=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 $as_echo "$lt_cv_dlopen_self_static" >&6; } fi CPPFLAGS=$save_CPPFLAGS LDFLAGS=$save_LDFLAGS LIBS=$save_LIBS ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi striplib= old_striplib= { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 $as_echo_n "checking whether stripping libraries is possible... " >&6; } if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP"; then striplib="$STRIP -x" old_striplib="$STRIP -S" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ;; esac fi # Report what library types will actually be built { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 $as_echo_n "checking if libtool supports shared libraries... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 $as_echo "$can_build_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 $as_echo_n "checking whether to build shared libraries... " >&6; } test no = "$can_build_shared" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test yes = "$enable_shared" && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[4-9]*) if test ia64 != "$host_cpu"; then case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in yes,aix,yes) ;; # shared object as lib.so file only yes,svr4,*) ;; # shared object as lib.so archive member only yes,*) enable_static=no ;; # shared object in lib.a archive as well esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 $as_echo "$enable_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 $as_echo_n "checking whether to build static libraries... " >&6; } # Make sure either enable_shared or enable_static is yes. test yes = "$enable_shared" || enable_static=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 $as_echo "$enable_static" >&6; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CC=$lt_save_CC ac_config_commands="$ac_config_commands libtool" # Only expand once: # Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi case $enable_silent_rules in # ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=0;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 $as_echo_n "checking whether $am_make supports nested variables... " >&6; } if ${am_cv_make_support_nested_variables+:} false; then : $as_echo_n "(cached) " >&6 else if $as_echo 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 $as_echo "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' # Check whether --enable-largefile was given. if test "${enable_largefile+set}" = set; then : enableval=$enable_largefile; fi if test "$enable_largefile" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for special C compiler options needed for large files" >&5 $as_echo_n "checking for special C compiler options needed for large files... " >&6; } if ${ac_cv_sys_largefile_CC+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_sys_largefile_CC=no if test "$GCC" != yes; then ac_save_CC=$CC while :; do # IRIX 6.2 and later do not support large files by default, # so use the C compiler's -n32 option if that helps. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : break fi rm -f core conftest.err conftest.$ac_objext CC="$CC -n32" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_largefile_CC=' -n32'; break fi rm -f core conftest.err conftest.$ac_objext break done CC=$ac_save_CC rm -f conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_CC" >&5 $as_echo "$ac_cv_sys_largefile_CC" >&6; } if test "$ac_cv_sys_largefile_CC" != no; then CC=$CC$ac_cv_sys_largefile_CC fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _FILE_OFFSET_BITS value needed for large files" >&5 $as_echo_n "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; } if ${ac_cv_sys_file_offset_bits+:} false; then : $as_echo_n "(cached) " >&6 else while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_file_offset_bits=no; break fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _FILE_OFFSET_BITS 64 #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_file_offset_bits=64; break fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_sys_file_offset_bits=unknown break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_file_offset_bits" >&5 $as_echo "$ac_cv_sys_file_offset_bits" >&6; } case $ac_cv_sys_file_offset_bits in #( no | unknown) ;; *) cat >>confdefs.h <<_ACEOF #define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits _ACEOF ;; esac rm -rf conftest* if test $ac_cv_sys_file_offset_bits = unknown; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGE_FILES value needed for large files" >&5 $as_echo_n "checking for _LARGE_FILES value needed for large files... " >&6; } if ${ac_cv_sys_large_files+:} false; then : $as_echo_n "(cached) " >&6 else while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_large_files=no; break fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _LARGE_FILES 1 #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_large_files=1; break fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_sys_large_files=unknown break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_large_files" >&5 $as_echo "$ac_cv_sys_large_files" >&6; } case $ac_cv_sys_large_files in #( no | unknown) ;; *) cat >>confdefs.h <<_ACEOF #define _LARGE_FILES $ac_cv_sys_large_files _ACEOF ;; esac rm -rf conftest* fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 $as_echo_n "checking whether $CC understands -c and -o together... " >&6; } if ${am_cv_prog_cc_c_o+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 $as_echo "$am_cv_prog_cc_c_o" >&6; } if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi # Extract the first word of "ln", so it can be a program name with args. set dummy ln; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_LN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$LN"; then ac_cv_prog_LN="$LN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_LN="ln" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_LN" && ac_cv_prog_LN="cp -Rp" fi fi LN=$ac_cv_prog_LN if test -n "$LN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LN" >&5 $as_echo "$LN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi for ac_header in dirent.h unistd.h sys/wait.h malloc.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done conf_path="$PATH:`getconf PATH 2>/dev/null`" for ac_prog in bash ksh sh do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_TESTS_SHELL+:} false; then : $as_echo_n "(cached) " >&6 else case $TESTS_SHELL in [\\/]* | ?:[\\/]*) ac_cv_path_TESTS_SHELL="$TESTS_SHELL" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $conf_path do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_TESTS_SHELL="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi TESTS_SHELL=$ac_cv_path_TESTS_SHELL if test -n "$TESTS_SHELL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $TESTS_SHELL" >&5 $as_echo "$TESTS_SHELL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$TESTS_SHELL" && break done test -n "$TESTS_SHELL" || TESTS_SHELL="$CONFIG_SHELL" TESTS_PKG_CONFIG='${top_builddir}/pkg-config${EXEEXT}' { $as_echo "$as_me:${as_lineno-$LINENO}: checking for default search path for .pc files" >&5 $as_echo_n "checking for default search path for .pc files... " >&6; } # Check whether --with-pc_path was given. if test "${with_pc_path+set}" = set; then : withval=$with_pc_path; pc_path="$withval" else # This is slightly wrong, but hopefully causes less confusion than # people being unable to find their .pc files in the standard location. if test "${prefix}" = "NONE"; then pc_path='${libdir}/pkgconfig:${datadir}/pkgconfig:/usr/lib/pkgconfig:/usr/share/pkgconfig' else pc_path='${libdir}/pkgconfig:${datadir}/pkgconfig' fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $pc_path" >&5 $as_echo "$pc_path" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for system include path to avoid -I flags" >&5 $as_echo_n "checking for system include path to avoid -I flags... " >&6; } # Check whether --with-system_include_path was given. if test "${with_system_include_path+set}" = set; then : withval=$with_system_include_path; system_include_path="$withval" else system_include_path="/usr/include" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $system_include_path" >&5 $as_echo "$system_include_path" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for system library path to avoid -L flags" >&5 $as_echo_n "checking for system library path to avoid -L flags... " >&6; } # Check whether --with-system_library_path was given. if test "${with_system_library_path+set}" = set; then : withval=$with_system_library_path; system_library_path="$withval" else pc_lib_sfx=`echo "$libdir" | sed 's:.*/lib::'` case "$pc_lib_sfx" in */*|"") system_library_path="/usr/lib:/lib" ;; *) system_library_path="/usr/lib$pc_lib_sfx:/lib$pc_lib_sfx:/usr/lib:/lib" ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $system_library_path" >&5 $as_echo "$system_library_path" >&6; } : ${CONFIG_LT=./config.lt} { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_LT" >&5 $as_echo "$as_me: creating $CONFIG_LT" >&6;} as_write_fail=0 cat >"$CONFIG_LT" <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate a libtool stub with the current configuration. SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>"$CONFIG_LT" <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## --------------------------------- ## ## Main body of "$CONFIG_LT" script. ## ## --------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x "$CONFIG_LT" cat >>"$CONFIG_LT" <<\_LTEOF lt_cl_silent=false exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX } >&5 lt_cl_help="\ '$as_me' creates a local libtool stub from the current configuration, for use in further configure time tests before the real libtool is generated. Usage: $0 [OPTIONS] -h, --help print this help, then exit -V, --version print version number, then exit -q, --quiet do not print progress messages -d, --debug don't remove temporary files Report bugs to ." lt_cl_version="\ pkg-config config.lt 0.29.1 configured by $0, generated by GNU Autoconf 2.69. Copyright (C) 2011 Free Software Foundation, Inc. This config.lt script is free software; the Free Software Foundation gives unlimited permision to copy, distribute and modify it." while test 0 != $# do case $1 in --version | --v* | -V ) echo "$lt_cl_version"; exit 0 ;; --help | --h* | -h ) echo "$lt_cl_help"; exit 0 ;; --debug | --d* | -d ) debug=: ;; --quiet | --q* | --silent | --s* | -q ) lt_cl_silent=: ;; -*) as_fn_error $? "unrecognized option: $1 Try '$0 --help' for more information." "$LINENO" 5 ;; *) as_fn_error $? "unrecognized argument: $1 Try '$0 --help' for more information." "$LINENO" 5 ;; esac shift done if $lt_cl_silent; then exec 6>/dev/null fi _LTEOF cat >>"$CONFIG_LT" <<_LTEOF # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' shared_archive_member_spec='`$ECHO "$shared_archive_member_spec" | $SED "$delay_single_quote_subst"`' SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_import='`$ECHO "$lt_cv_sys_global_symbol_to_import" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' lt_cv_nm_interface='`$ECHO "$lt_cv_nm_interface" | $SED "$delay_single_quote_subst"`' nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' lt_cv_truncate_bin='`$ECHO "$lt_cv_truncate_bin" | $SED "$delay_single_quote_subst"`' objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' configure_time_dlsearch_path='`$ECHO "$configure_time_dlsearch_path" | $SED "$delay_single_quote_subst"`' configure_time_lt_sys_library_path='`$ECHO "$configure_time_lt_sys_library_path" | $SED "$delay_single_quote_subst"`' hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } # Quote evaled strings. for var in SHELL \ ECHO \ PATH_SEPARATOR \ SED \ GREP \ EGREP \ FGREP \ LD \ NM \ LN_S \ lt_SP2NL \ lt_NL2SP \ reload_flag \ OBJDUMP \ deplibs_check_method \ file_magic_cmd \ file_magic_glob \ want_nocaseglob \ DLLTOOL \ sharedlib_from_linklib_cmd \ AR \ AR_FLAGS \ archiver_list_spec \ STRIP \ RANLIB \ CC \ CFLAGS \ compiler \ lt_cv_sys_global_symbol_pipe \ lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_import \ lt_cv_sys_global_symbol_to_c_name_address \ lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ lt_cv_nm_interface \ nm_file_list_spec \ lt_cv_truncate_bin \ lt_prog_compiler_no_builtin_flag \ lt_prog_compiler_pic \ lt_prog_compiler_wl \ lt_prog_compiler_static \ lt_cv_prog_compiler_c_o \ need_locks \ MANIFEST_TOOL \ DSYMUTIL \ NMEDIT \ LIPO \ OTOOL \ OTOOL64 \ shrext_cmds \ export_dynamic_flag_spec \ whole_archive_flag_spec \ compiler_needs_object \ with_gnu_ld \ allow_undefined_flag \ no_undefined_flag \ hardcode_libdir_flag_spec \ hardcode_libdir_separator \ exclude_expsyms \ include_expsyms \ file_list_spec \ variables_saved_for_relink \ libname_spec \ library_names_spec \ soname_spec \ install_override_mode \ finish_eval \ old_striplib \ striplib; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in reload_cmds \ old_postinstall_cmds \ old_postuninstall_cmds \ old_archive_cmds \ extract_expsyms_cmds \ old_archive_from_new_cmds \ old_archive_from_expsyms_cmds \ archive_cmds \ archive_expsym_cmds \ module_cmds \ module_expsym_cmds \ export_symbols_cmds \ prelink_cmds \ postlink_cmds \ postinstall_cmds \ postuninstall_cmds \ finish_cmds \ sys_lib_search_path_spec \ configure_time_dlsearch_path \ configure_time_lt_sys_library_path; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done ac_aux_dir='$ac_aux_dir' # See if we are running on zsh, and set the options that allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi PACKAGE='$PACKAGE' VERSION='$VERSION' RM='$RM' ofile='$ofile' _LTEOF cat >>"$CONFIG_LT" <<\_LTEOF { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ofile" >&5 $as_echo "$as_me: creating $ofile" >&6;} # See if we are running on zsh, and set the options that allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi cfgfile=${ofile}T trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # Generated automatically by $as_me ($PACKAGE) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # Provide generalized library-building support services. # Written by Gordon Matzigkeit, 1996 # Copyright (C) 2014 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. # GNU Libtool 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 of of the License, or # (at your option) any later version. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program or library that is built # using GNU Libtool, you may include this file under the same # distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that 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, see . # The names of the tagged configurations supported by this script. available_tags='' # Configured defaults for sys_lib_dlsearch_path munging. : \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"} # ### BEGIN LIBTOOL CONFIG # Which release of libtool.m4 was used? macro_version=$macro_version macro_revision=$macro_revision # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # What type of objects to build. pic_mode=$pic_mode # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # Shared archive member basename,for filename based shared library versioning on AIX. shared_archive_member_spec=$shared_archive_member_spec # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # An echo program that protects backslashes. ECHO=$lt_ECHO # The PATH separator for the build system. PATH_SEPARATOR=$lt_PATH_SEPARATOR # The host system. host_alias=$host_alias host=$host host_os=$host_os # The build system. build_alias=$build_alias build=$build build_os=$build_os # A sed program that does not truncate output. SED=$lt_SED # Sed that helps us avoid accidentally triggering echo(1) options like -n. Xsed="\$SED -e 1s/^X//" # A grep program that handles long lines. GREP=$lt_GREP # An ERE matcher. EGREP=$lt_EGREP # A literal string matcher. FGREP=$lt_FGREP # A BSD- or MS-compatible name lister. NM=$lt_NM # Whether we need soft or hard links. LN_S=$lt_LN_S # What is the maximum length of a command? max_cmd_len=$max_cmd_len # Object file suffix (normally "o"). objext=$ac_objext # Executable file suffix (normally ""). exeext=$exeext # whether the shell understands "unset". lt_unset=$lt_unset # turn spaces into newlines. SP2NL=$lt_lt_SP2NL # turn newlines into spaces. NL2SP=$lt_lt_NL2SP # convert \$build file names to \$host format. to_host_file_cmd=$lt_cv_to_host_file_cmd # convert \$build files to toolchain format. to_tool_file_cmd=$lt_cv_to_tool_file_cmd # An object symbol dumper. OBJDUMP=$lt_OBJDUMP # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method = "file_magic". file_magic_cmd=$lt_file_magic_cmd # How to find potential files when deplibs_check_method = "file_magic". file_magic_glob=$lt_file_magic_glob # Find potential files using nocaseglob when deplibs_check_method = "file_magic". want_nocaseglob=$lt_want_nocaseglob # DLL creation program. DLLTOOL=$lt_DLLTOOL # Command to associate shared and link libraries. sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd # The archiver. AR=$lt_AR # Flags to create an archive. AR_FLAGS=$lt_AR_FLAGS # How to feed a file listing to the archiver. archiver_list_spec=$lt_archiver_list_spec # A symbol stripping program. STRIP=$lt_STRIP # Commands used to install an old-style archive. RANLIB=$lt_RANLIB old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Whether to use a lock for old archive extraction. lock_old_archive_extraction=$lock_old_archive_extraction # A C compiler. LTCC=$lt_CC # LTCC compiler flags. LTCFLAGS=$lt_CFLAGS # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration. global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm into a list of symbols to manually relocate. global_symbol_to_import=$lt_lt_cv_sys_global_symbol_to_import # Transform the output of nm in a C name address pair. global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # Transform the output of nm in a C name address pair when lib prefix is needed. global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix # The name lister interface. nm_interface=$lt_lt_cv_nm_interface # Specify filename containing input files for \$NM. nm_file_list_spec=$lt_nm_file_list_spec # The root where to search for dependent libraries,and where our libraries should be installed. lt_sysroot=$lt_sysroot # Command to truncate a binary pipe. lt_truncate_bin=$lt_lt_cv_truncate_bin # The name of the directory that contains temporary libtool files. objdir=$objdir # Used to examine libraries when file_magic_cmd begins with "file". MAGIC_CMD=$MAGIC_CMD # Must we lock files when doing compilation? need_locks=$lt_need_locks # Manifest tool. MANIFEST_TOOL=$lt_MANIFEST_TOOL # Tool to manipulate archived DWARF debug symbol files on Mac OS X. DSYMUTIL=$lt_DSYMUTIL # Tool to change global to local symbols on Mac OS X. NMEDIT=$lt_NMEDIT # Tool to manipulate fat objects and archives on Mac OS X. LIPO=$lt_LIPO # ldd/readelf like tool for Mach-O binaries on Mac OS X. OTOOL=$lt_OTOOL # ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. OTOOL64=$lt_OTOOL64 # Old archive suffix (normally "a"). libext=$libext # Shared library suffix (normally ".so"). shrext_cmds=$lt_shrext_cmds # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Variables whose values should be saved in libtool wrapper scripts and # restored at link time. variables_saved_for_relink=$lt_variables_saved_for_relink # Do we need the "lib" prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Library versioning type. version_type=$version_type # Shared library runtime path variable. runpath_var=$runpath_var # Shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Permission mode override for installation of shared libraries. install_override_mode=$lt_install_override_mode # Command to use after installation of a shared archive. postinstall_cmds=$lt_postinstall_cmds # Command to use after uninstallation of a shared archive. postuninstall_cmds=$lt_postuninstall_cmds # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # As "finish_cmds", except a single script fragment to be evaled but # not shown. finish_eval=$lt_finish_eval # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Compile-time system search path for libraries. sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Detected run-time system search path for libraries. sys_lib_dlsearch_path_spec=$lt_configure_time_dlsearch_path # Explicit LT_SYS_LIBRARY_PATH set during ./configure time. configure_time_lt_sys_library_path=$lt_configure_time_lt_sys_library_path # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # The linker used to build libraries. LD=$lt_LD # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds # A language specific compiler. CC=$lt_compiler # Is the compiler the GNU compiler? with_gcc=$GCC # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds archive_expsym_cmds=$lt_archive_expsym_cmds # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds module_expsym_cmds=$lt_module_expsym_cmds # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator # Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct # Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \$shlibpath_var if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms # Symbols that must always be exported. include_expsyms=$lt_include_expsyms # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds # Specify filename containing input files. file_list_spec=$lt_file_list_spec # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action # ### END LIBTOOL CONFIG _LT_EOF cat <<'_LT_EOF' >> "$cfgfile" # ### BEGIN FUNCTIONS SHARED WITH CONFIGURE # func_munge_path_list VARIABLE PATH # ----------------------------------- # VARIABLE is name of variable containing _space_ separated list of # directories to be munged by the contents of PATH, which is string # having a format: # "DIR[:DIR]:" # string "DIR[ DIR]" will be prepended to VARIABLE # ":DIR[:DIR]" # string "DIR[ DIR]" will be appended to VARIABLE # "DIRP[:DIRP]::[DIRA:]DIRA" # string "DIRP[ DIRP]" will be prepended to VARIABLE and string # "DIRA[ DIRA]" will be appended to VARIABLE # "DIR[:DIR]" # VARIABLE will be replaced by "DIR[ DIR]" func_munge_path_list () { case x$2 in x) ;; *:) eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\" ;; x:*) eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\" ;; *::*) eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\" ;; *) eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\" ;; esac } # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. func_cc_basename () { for cc_temp in $*""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` } # ### END FUNCTIONS SHARED WITH CONFIGURE _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test set != "${COLLECT_NAMES+set}"; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac ltmain=$ac_aux_dir/ltmain.sh # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" as_fn_exit 0 _LTEOF chmod +x "$CONFIG_LT" # configure is writing to config.log, but config.lt does its own redirection, # appending to config.log, which fails on DOS, as config.log is still kept # open by configure. Here we exec the FD to /dev/null, effectively closing # config.log, so it can be properly (re)opened and appended to by config.lt. lt_cl_success=: test yes = "$silent" && lt_config_lt_args="$lt_config_lt_args --quiet" exec 5>/dev/null $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false exec 5>>config.log $lt_cl_success || as_fn_exit 1 # Check whether --enable-indirect-deps was given. if test "${enable_indirect_deps+set}" = set; then : enableval=$enable_indirect_deps; use_indirect_deps=$enableval else use_indirect_deps=auto fi echo use_indirect_deps=$use_indirect_deps >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to list both direct and indirect dependencies" >&5 $as_echo_n "checking whether to list both direct and indirect dependencies... " >&6; } case $use_indirect_deps in auto) deplibs_check_method=`(./libtool --config; echo eval echo '\"$deplibs_check_method\"') | sh` if test "X$deplibs_check_method" = Xnone; then echo "foo: $deplibs_check_method" >&5 use_indirect_deps=yes else use_indirect_deps=no fi ;; yes|no) ;; *) as_fn_error $? "Value given to --enable-indirect-deps must be one of yes, no or auto" "$LINENO" 5 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $use_indirect_deps" >&5 $as_echo "$use_indirect_deps" >&6; } cat >>confdefs.h <<_ACEOF #define ENABLE_INDIRECT_DEPS `test $use_indirect_deps = yes && echo TRUE || echo FALSE` _ACEOF WARN_CFLAGS="" if test "${GCC}" = "yes" && test "${ac_env_CFLAGS_set}" != "set"; then WARN_CFLAGS="-g -Wall -O2" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Win32" >&5 $as_echo_n "checking for Win32... " >&6; } case "$host" in *-*-mingw*) native_win32=yes ;; *) native_win32=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $native_win32" >&5 $as_echo "$native_win32" >&6; } if test "x$native_win32" = xyes; then NATIVE_WIN32_TRUE= NATIVE_WIN32_FALSE='#' else NATIVE_WIN32_TRUE='#' NATIVE_WIN32_FALSE= fi if test "$cross_compiling" = yes && test "$native_win32" = yes; then # Extract the first word of "wine", so it can be a program name with args. set dummy wine; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_WINE+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$WINE"; then ac_cv_prog_WINE="$WINE" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_WINE="wine" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi WINE=$ac_cv_prog_WINE if test -n "$WINE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $WINE" >&5 $as_echo "$WINE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test "x$WINE" != x && TESTS_PKG_CONFIG='${WINE} '"$TESTS_PKG_CONFIG" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if prefix should be redefined at runtime" >&5 $as_echo_n "checking if prefix should be redefined at runtime... " >&6; } # Check whether --enable-define_prefix was given. if test "${enable_define_prefix+set}" = set; then : enableval=$enable_define_prefix; else enable_define_prefix=$native_win32 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_define_prefix" >&5 $as_echo "$enable_define_prefix" >&6; } cat >>confdefs.h <<_ACEOF #define ENABLE_DEFINE_PREFIX `test "x$enable_define_prefix" = xyes && echo TRUE || echo FALSE` _ACEOF # Check whether --with-internal-glib was given. if test "${with_internal_glib+set}" = set; then : withval=$with_internal_glib; with_internal_glib="$withval" else with_internal_glib=no fi if test "x$with_internal_glib" = xyes; then INTERNAL_GLIB_TRUE= INTERNAL_GLIB_FALSE='#' else INTERNAL_GLIB_TRUE='#' INTERNAL_GLIB_FALSE= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if internal glib should be used" >&5 $as_echo_n "checking if internal glib should be used... " >&6; } if test "x$with_internal_glib" = xyes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } GLIB_CFLAGS='-I$(top_srcdir)/glib -I$(top_srcdir)/glib/glib \ -I$(top_builddir)/glib/glib' GLIB_LIBS='$(top_builddir)/glib/glib/libglib-2.0.la' subdirs="$subdirs glib" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PKG_CONFIG=$ac_cv_path_PKG_CONFIG if test -n "$PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 $as_echo "$PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_path_PKG_CONFIG"; then ac_pt_PKG_CONFIG=$PKG_CONFIG # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_pt_PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG if test -n "$ac_pt_PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 $as_echo "$ac_pt_PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_pt_PKG_CONFIG" = x; then PKG_CONFIG="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac PKG_CONFIG=$ac_pt_PKG_CONFIG fi else PKG_CONFIG="$ac_cv_path_PKG_CONFIG" fi fi if test -n "$PKG_CONFIG"; then _pkg_min_version=0.9.0 { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 $as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } PKG_CONFIG="" fi fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GLIB" >&5 $as_echo_n "checking for GLIB... " >&6; } if test -n "$GLIB_CFLAGS"; then pkg_cv_GLIB_CFLAGS="$GLIB_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0 >= 2.16\""; } >&5 ($PKG_CONFIG --exists --print-errors "glib-2.0 >= 2.16") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GLIB_CFLAGS=`$PKG_CONFIG --cflags "glib-2.0 >= 2.16" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$GLIB_LIBS"; then pkg_cv_GLIB_LIBS="$GLIB_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0 >= 2.16\""; } >&5 ($PKG_CONFIG --exists --print-errors "glib-2.0 >= 2.16") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GLIB_LIBS=`$PKG_CONFIG --libs "glib-2.0 >= 2.16" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GLIB_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "glib-2.0 >= 2.16" 2>&1` else GLIB_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "glib-2.0 >= 2.16" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$GLIB_PKG_ERRORS" >&5 as_fn_error $? "Either a previously installed pkg-config or \"glib-2.0 >= 2.16\" could not be found. Please set GLIB_CFLAGS and GLIB_LIBS to the correct values or pass --with-internal-glib to configure to use the bundled copy." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } as_fn_error $? "Either a previously installed pkg-config or \"glib-2.0 >= 2.16\" could not be found. Please set GLIB_CFLAGS and GLIB_LIBS to the correct values or pass --with-internal-glib to configure to use the bundled copy." "$LINENO" 5 else GLIB_CFLAGS=$pkg_cv_GLIB_CFLAGS GLIB_LIBS=$pkg_cv_GLIB_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi fi # Check whether --with-gcov was given. if test "${with_gcov+set}" = set; then : withval=$with_gcov; else with_gcov=no fi if test "x$with_gcov" = xyes; then if test "$GCC" = no; then as_fn_error $? "gcov test coverage can only be used with GCC" "$LINENO" 5 fi # Extract the first word of "gcov", so it can be a program name with args. set dummy gcov; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_GCOV+:} false; then : $as_echo_n "(cached) " >&6 else case $GCOV in [\\/]* | ?:[\\/]*) ac_cv_path_GCOV="$GCOV" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_GCOV="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_GCOV" && ac_cv_path_GCOV="as_fn_error $? "could not find gcov program" "$LINENO" 5" ;; esac fi GCOV=$ac_cv_path_GCOV if test -n "$GCOV"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GCOV" >&5 $as_echo "$GCOV" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi GCOV_CFLAGS="-fprofile-arcs -ftest-coverage" # Ensure there's no optimizing since last -O wins and CFLAGS is used # at the end of COMPILE/LTCOMPILE. CFLAGS="${CFLAGS+$CFLAGS }-O0" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if host- prefixed tool should be installed" >&5 $as_echo_n "checking if host- prefixed tool should be installed... " >&6; } # Check whether --enable-host-tool was given. if test "${enable_host_tool+set}" = set; then : enableval=$enable_host_tool; else enable_host_tool=yes fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_host_tool" >&5 $as_echo "$enable_host_tool" >&6; } if test "x$enable_host_tool" = xyes; then HOST_TOOL_TRUE= HOST_TOOL_FALSE='#' else HOST_TOOL_TRUE='#' HOST_TOOL_FALSE= fi ac_config_files="$ac_config_files Makefile pkg.m4 check/Makefile check/config.sh config.h.win32" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs { $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 $as_echo_n "checking that generated files are newer than configure... " >&6; } if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 $as_echo "done" >&6; } if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${NATIVE_WIN32_TRUE}" && test -z "${NATIVE_WIN32_FALSE}"; then as_fn_error $? "conditional \"NATIVE_WIN32\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${INTERNAL_GLIB_TRUE}" && test -z "${INTERNAL_GLIB_FALSE}"; then as_fn_error $? "conditional \"INTERNAL_GLIB\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HOST_TOOL_TRUE}" && test -z "${HOST_TOOL_FALSE}"; then as_fn_error $? "conditional \"HOST_TOOL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by pkg-config $as_me 0.29.1, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration commands: $config_commands Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ pkg-config config.status 0.29.1 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' shared_archive_member_spec='`$ECHO "$shared_archive_member_spec" | $SED "$delay_single_quote_subst"`' SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_import='`$ECHO "$lt_cv_sys_global_symbol_to_import" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' lt_cv_nm_interface='`$ECHO "$lt_cv_nm_interface" | $SED "$delay_single_quote_subst"`' nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' lt_cv_truncate_bin='`$ECHO "$lt_cv_truncate_bin" | $SED "$delay_single_quote_subst"`' objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' configure_time_dlsearch_path='`$ECHO "$configure_time_dlsearch_path" | $SED "$delay_single_quote_subst"`' configure_time_lt_sys_library_path='`$ECHO "$configure_time_lt_sys_library_path" | $SED "$delay_single_quote_subst"`' hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } # Quote evaled strings. for var in SHELL \ ECHO \ PATH_SEPARATOR \ SED \ GREP \ EGREP \ FGREP \ LD \ NM \ LN_S \ lt_SP2NL \ lt_NL2SP \ reload_flag \ OBJDUMP \ deplibs_check_method \ file_magic_cmd \ file_magic_glob \ want_nocaseglob \ DLLTOOL \ sharedlib_from_linklib_cmd \ AR \ AR_FLAGS \ archiver_list_spec \ STRIP \ RANLIB \ CC \ CFLAGS \ compiler \ lt_cv_sys_global_symbol_pipe \ lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_import \ lt_cv_sys_global_symbol_to_c_name_address \ lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ lt_cv_nm_interface \ nm_file_list_spec \ lt_cv_truncate_bin \ lt_prog_compiler_no_builtin_flag \ lt_prog_compiler_pic \ lt_prog_compiler_wl \ lt_prog_compiler_static \ lt_cv_prog_compiler_c_o \ need_locks \ MANIFEST_TOOL \ DSYMUTIL \ NMEDIT \ LIPO \ OTOOL \ OTOOL64 \ shrext_cmds \ export_dynamic_flag_spec \ whole_archive_flag_spec \ compiler_needs_object \ with_gnu_ld \ allow_undefined_flag \ no_undefined_flag \ hardcode_libdir_flag_spec \ hardcode_libdir_separator \ exclude_expsyms \ include_expsyms \ file_list_spec \ variables_saved_for_relink \ libname_spec \ library_names_spec \ soname_spec \ install_override_mode \ finish_eval \ old_striplib \ striplib; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in reload_cmds \ old_postinstall_cmds \ old_postuninstall_cmds \ old_archive_cmds \ extract_expsyms_cmds \ old_archive_from_new_cmds \ old_archive_from_expsyms_cmds \ archive_cmds \ archive_expsym_cmds \ module_cmds \ module_expsym_cmds \ export_symbols_cmds \ prelink_cmds \ postlink_cmds \ postinstall_cmds \ postuninstall_cmds \ finish_cmds \ sys_lib_search_path_spec \ configure_time_dlsearch_path \ configure_time_lt_sys_library_path; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done ac_aux_dir='$ac_aux_dir' # See if we are running on zsh, and set the options that allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi PACKAGE='$PACKAGE' VERSION='$VERSION' RM='$RM' ofile='$ofile' ac_aux_dir='$ac_aux_dir' _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "pkg.m4") CONFIG_FILES="$CONFIG_FILES pkg.m4" ;; "check/Makefile") CONFIG_FILES="$CONFIG_FILES check/Makefile" ;; "check/config.sh") CONFIG_FILES="$CONFIG_FILES check/config.sh" ;; "config.h.win32") CONFIG_FILES="$CONFIG_FILES config.h.win32" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'`/stamp-h$_am_stamp_count ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir=$dirpart/$fdir; as_fn_mkdir_p # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ;; "libtool":C) # See if we are running on zsh, and set the options that allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi cfgfile=${ofile}T trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # Generated automatically by $as_me ($PACKAGE) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # Provide generalized library-building support services. # Written by Gordon Matzigkeit, 1996 # Copyright (C) 2014 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. # GNU Libtool 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 of of the License, or # (at your option) any later version. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program or library that is built # using GNU Libtool, you may include this file under the same # distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that 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, see . # The names of the tagged configurations supported by this script. available_tags='' # Configured defaults for sys_lib_dlsearch_path munging. : \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"} # ### BEGIN LIBTOOL CONFIG # Which release of libtool.m4 was used? macro_version=$macro_version macro_revision=$macro_revision # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # What type of objects to build. pic_mode=$pic_mode # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # Shared archive member basename,for filename based shared library versioning on AIX. shared_archive_member_spec=$shared_archive_member_spec # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # An echo program that protects backslashes. ECHO=$lt_ECHO # The PATH separator for the build system. PATH_SEPARATOR=$lt_PATH_SEPARATOR # The host system. host_alias=$host_alias host=$host host_os=$host_os # The build system. build_alias=$build_alias build=$build build_os=$build_os # A sed program that does not truncate output. SED=$lt_SED # Sed that helps us avoid accidentally triggering echo(1) options like -n. Xsed="\$SED -e 1s/^X//" # A grep program that handles long lines. GREP=$lt_GREP # An ERE matcher. EGREP=$lt_EGREP # A literal string matcher. FGREP=$lt_FGREP # A BSD- or MS-compatible name lister. NM=$lt_NM # Whether we need soft or hard links. LN_S=$lt_LN_S # What is the maximum length of a command? max_cmd_len=$max_cmd_len # Object file suffix (normally "o"). objext=$ac_objext # Executable file suffix (normally ""). exeext=$exeext # whether the shell understands "unset". lt_unset=$lt_unset # turn spaces into newlines. SP2NL=$lt_lt_SP2NL # turn newlines into spaces. NL2SP=$lt_lt_NL2SP # convert \$build file names to \$host format. to_host_file_cmd=$lt_cv_to_host_file_cmd # convert \$build files to toolchain format. to_tool_file_cmd=$lt_cv_to_tool_file_cmd # An object symbol dumper. OBJDUMP=$lt_OBJDUMP # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method = "file_magic". file_magic_cmd=$lt_file_magic_cmd # How to find potential files when deplibs_check_method = "file_magic". file_magic_glob=$lt_file_magic_glob # Find potential files using nocaseglob when deplibs_check_method = "file_magic". want_nocaseglob=$lt_want_nocaseglob # DLL creation program. DLLTOOL=$lt_DLLTOOL # Command to associate shared and link libraries. sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd # The archiver. AR=$lt_AR # Flags to create an archive. AR_FLAGS=$lt_AR_FLAGS # How to feed a file listing to the archiver. archiver_list_spec=$lt_archiver_list_spec # A symbol stripping program. STRIP=$lt_STRIP # Commands used to install an old-style archive. RANLIB=$lt_RANLIB old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Whether to use a lock for old archive extraction. lock_old_archive_extraction=$lock_old_archive_extraction # A C compiler. LTCC=$lt_CC # LTCC compiler flags. LTCFLAGS=$lt_CFLAGS # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration. global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm into a list of symbols to manually relocate. global_symbol_to_import=$lt_lt_cv_sys_global_symbol_to_import # Transform the output of nm in a C name address pair. global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # Transform the output of nm in a C name address pair when lib prefix is needed. global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix # The name lister interface. nm_interface=$lt_lt_cv_nm_interface # Specify filename containing input files for \$NM. nm_file_list_spec=$lt_nm_file_list_spec # The root where to search for dependent libraries,and where our libraries should be installed. lt_sysroot=$lt_sysroot # Command to truncate a binary pipe. lt_truncate_bin=$lt_lt_cv_truncate_bin # The name of the directory that contains temporary libtool files. objdir=$objdir # Used to examine libraries when file_magic_cmd begins with "file". MAGIC_CMD=$MAGIC_CMD # Must we lock files when doing compilation? need_locks=$lt_need_locks # Manifest tool. MANIFEST_TOOL=$lt_MANIFEST_TOOL # Tool to manipulate archived DWARF debug symbol files on Mac OS X. DSYMUTIL=$lt_DSYMUTIL # Tool to change global to local symbols on Mac OS X. NMEDIT=$lt_NMEDIT # Tool to manipulate fat objects and archives on Mac OS X. LIPO=$lt_LIPO # ldd/readelf like tool for Mach-O binaries on Mac OS X. OTOOL=$lt_OTOOL # ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. OTOOL64=$lt_OTOOL64 # Old archive suffix (normally "a"). libext=$libext # Shared library suffix (normally ".so"). shrext_cmds=$lt_shrext_cmds # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Variables whose values should be saved in libtool wrapper scripts and # restored at link time. variables_saved_for_relink=$lt_variables_saved_for_relink # Do we need the "lib" prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Library versioning type. version_type=$version_type # Shared library runtime path variable. runpath_var=$runpath_var # Shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Permission mode override for installation of shared libraries. install_override_mode=$lt_install_override_mode # Command to use after installation of a shared archive. postinstall_cmds=$lt_postinstall_cmds # Command to use after uninstallation of a shared archive. postuninstall_cmds=$lt_postuninstall_cmds # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # As "finish_cmds", except a single script fragment to be evaled but # not shown. finish_eval=$lt_finish_eval # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Compile-time system search path for libraries. sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Detected run-time system search path for libraries. sys_lib_dlsearch_path_spec=$lt_configure_time_dlsearch_path # Explicit LT_SYS_LIBRARY_PATH set during ./configure time. configure_time_lt_sys_library_path=$lt_configure_time_lt_sys_library_path # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # The linker used to build libraries. LD=$lt_LD # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds # A language specific compiler. CC=$lt_compiler # Is the compiler the GNU compiler? with_gcc=$GCC # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds archive_expsym_cmds=$lt_archive_expsym_cmds # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds module_expsym_cmds=$lt_module_expsym_cmds # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator # Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct # Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \$shlibpath_var if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms # Symbols that must always be exported. include_expsyms=$lt_include_expsyms # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds # Specify filename containing input files. file_list_spec=$lt_file_list_spec # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action # ### END LIBTOOL CONFIG _LT_EOF cat <<'_LT_EOF' >> "$cfgfile" # ### BEGIN FUNCTIONS SHARED WITH CONFIGURE # func_munge_path_list VARIABLE PATH # ----------------------------------- # VARIABLE is name of variable containing _space_ separated list of # directories to be munged by the contents of PATH, which is string # having a format: # "DIR[:DIR]:" # string "DIR[ DIR]" will be prepended to VARIABLE # ":DIR[:DIR]" # string "DIR[ DIR]" will be appended to VARIABLE # "DIRP[:DIRP]::[DIRA:]DIRA" # string "DIRP[ DIRP]" will be prepended to VARIABLE and string # "DIRA[ DIRA]" will be appended to VARIABLE # "DIR[:DIR]" # VARIABLE will be replaced by "DIR[ DIR]" func_munge_path_list () { case x$2 in x) ;; *:) eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\" ;; x:*) eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\" ;; *::*) eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\" ;; *) eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\" ;; esac } # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. func_cc_basename () { for cc_temp in $*""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` } # ### END FUNCTIONS SHARED WITH CONFIGURE _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test set != "${COLLECT_NAMES+set}"; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac ltmain=$ac_aux_dir/ltmain.sh # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi # # CONFIG_SUBDIRS section. # if test "$no_recursion" != yes; then # Remove --cache-file, --srcdir, and --disable-option-checking arguments # so they do not pile up. ac_sub_configure_args= ac_prev= eval "set x $ac_configure_args" shift for ac_arg do if test -n "$ac_prev"; then ac_prev= continue fi case $ac_arg in -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* \ | --c=*) ;; --config-cache | -C) ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) ;; --disable-option-checking) ;; *) case $ac_arg in *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append ac_sub_configure_args " '$ac_arg'" ;; esac done # Always prepend --prefix to ensure using the same prefix # in subdir configurations. ac_arg="--prefix=$prefix" case $ac_arg in *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac ac_sub_configure_args="'$ac_arg' $ac_sub_configure_args" # Pass --silent if test "$silent" = yes; then ac_sub_configure_args="--silent $ac_sub_configure_args" fi # Always prepend --disable-option-checking to silence warnings, since # different subdirs can have different --enable and --with options. ac_sub_configure_args="--disable-option-checking $ac_sub_configure_args" ac_popdir=`pwd` for ac_dir in : $subdirs; do test "x$ac_dir" = x: && continue # Do not complain, so a configure script can configure whichever # parts of a large source tree are present. test -d "$srcdir/$ac_dir" || continue ac_msg="=== configuring in $ac_dir (`pwd`/$ac_dir)" $as_echo "$as_me:${as_lineno-$LINENO}: $ac_msg" >&5 $as_echo "$ac_msg" >&6 as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" # Check for guested configure; otherwise get Cygnus style configure. if test -f "$ac_srcdir/configure.gnu"; then ac_sub_configure=$ac_srcdir/configure.gnu elif test -f "$ac_srcdir/configure"; then ac_sub_configure=$ac_srcdir/configure elif test -f "$ac_srcdir/configure.in"; then # This should be Cygnus configure. ac_sub_configure=$ac_aux_dir/configure else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: no configuration information is in $ac_dir" >&5 $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2;} ac_sub_configure= fi # The recursion is here. if test -n "$ac_sub_configure"; then # Make the cache file name correct relative to the subdirectory. case $cache_file in [\\/]* | ?:[\\/]* ) ac_sub_cache_file=$cache_file ;; *) # Relative name. ac_sub_cache_file=$ac_top_build_prefix$cache_file ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: running $SHELL $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&5 $as_echo "$as_me: running $SHELL $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&6;} # The eval makes quoting arguments work. eval "\$SHELL \"\$ac_sub_configure\" $ac_sub_configure_args \ --cache-file=\"\$ac_sub_cache_file\" --srcdir=\"\$ac_srcdir\"" || as_fn_error $? "$ac_sub_configure failed for $ac_dir" "$LINENO" 5 fi cd "$ac_popdir" done fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi pkg-config-0.29.1/pkg.h0000664000175000017500000001066612652722361011523 00000000000000/* * Copyright (C) 2001, 2002 Red Hat 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 of the * License, 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. */ #ifndef PKG_CONFIG_PKG_H #define PKG_CONFIG_PKG_H #include typedef guint8 FlagType; /* bit mask for flag types */ #define LIBS_l (1 << 0) #define LIBS_L (1 << 1) #define LIBS_OTHER (1 << 2) #define CFLAGS_I (1 << 3) #define CFLAGS_OTHER (1 << 4) #define LIBS_ANY (LIBS_l | LIBS_L | LIBS_OTHER) #define CFLAGS_ANY (CFLAGS_I | CFLAGS_OTHER) #define FLAGS_ANY (LIBS_ANY | CFLAGS_ANY) typedef enum { LESS_THAN, GREATER_THAN, LESS_THAN_EQUAL, GREATER_THAN_EQUAL, EQUAL, NOT_EQUAL, ALWAYS_MATCH } ComparisonType; typedef struct Flag_ Flag; typedef struct Package_ Package; typedef struct RequiredVersion_ RequiredVersion; struct Flag_ { FlagType type; char *arg; }; struct RequiredVersion_ { char *name; ComparisonType comparison; char *version; Package *owner; }; struct Package_ { char *key; /* filename name */ char *name; /* human-readable name */ char *version; char *description; char *url; char *pcfiledir; /* directory it was loaded from */ GList *requires_entries; GList *requires; GList *requires_private_entries; GList *requires_private; GList *libs; GList *cflags; GHashTable *vars; GHashTable *required_versions; /* hash from name to RequiredVersion */ GList *conflicts; /* list of RequiredVersion */ gboolean uninstalled; /* used the -uninstalled file */ int path_position; /* used to order packages by position in path of their .pc file, lower number means earlier in path */ int libs_num; /* Number of times the "Libs" header has been seen */ int libs_private_num; /* Number of times the "Libs.private" header has been seen */ gboolean in_requires_chain; /* package is in current Requires chain */ char *orig_prefix; /* original prefix value before redefinition */ }; Package *get_package (const char *name); Package *get_package_quiet (const char *name); char * packages_get_flags (GList *pkgs, FlagType flags); char * package_get_var (Package *pkg, const char *var); char * packages_get_var (GList *pkgs, const char *var); void add_search_dir (const char *path); void add_search_dirs (const char *path, const char *separator); void package_init (void); int compare_versions (const char * a, const char *b); gboolean version_test (ComparisonType comparison, const char *a, const char *b); const char *comparison_to_str (ComparisonType comparison); void print_package_list (void); void define_global_variable (const char *varname, const char *varval); void debug_spew (const char *format, ...); void verbose_error (const char *format, ...); gboolean name_ends_in_uninstalled (const char *str); void enable_private_libs(void); void disable_private_libs(void); void enable_requires(void); void disable_requires(void); void enable_requires_private(void); void disable_requires_private(void); /* If TRUE, do not automatically prefer uninstalled versions */ extern gboolean disable_uninstalled; extern char *pcsysrootdir; /* pkg-config default search path. On Windows the current pkg-config install * directory is used. Otherwise, the build-time defined PKG_CONFIG_PC_PATH. */ extern char *pkg_config_pc_path; /* Exit on parse errors if TRUE. */ extern gboolean parse_strict; /* If TRUE, define "prefix" in .pc files at runtime. */ extern gboolean define_prefix; /* The name of the variable that acts as prefix, unless it is "prefix" */ extern char *prefix_variable; #ifdef G_OS_WIN32 /* If TRUE, output flags in MSVC syntax. */ extern gboolean msvc_syntax; #endif #endif pkg-config-0.29.1/pkg.c0000664000175000017500000007577212664101724011524 00000000000000/* * Copyright (C) 2001, 2002 Red Hat 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 of the * License, 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. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "pkg.h" #include "parse.h" #include "rpmvercmp.h" #ifdef HAVE_MALLOC_H # include #endif #include #include #include #include #ifdef HAVE_UNISTD_H #include #endif #include #include static void verify_package (Package *pkg); static GHashTable *packages = NULL; static GHashTable *locations = NULL; static GHashTable *path_positions = NULL; static GHashTable *globals = NULL; static GList *search_dirs = NULL; static int scanned_dir_count = 0; gboolean disable_uninstalled = FALSE; gboolean ignore_requires = FALSE; gboolean ignore_requires_private = TRUE; gboolean ignore_private_libs = TRUE; void add_search_dir (const char *path) { search_dirs = g_list_append (search_dirs, g_strdup (path)); } void add_search_dirs (const char *path, const char *separator) { char **search_dirs; char **iter; search_dirs = g_strsplit (path, separator, -1); iter = search_dirs; while (*iter) { debug_spew ("Adding directory '%s' from PKG_CONFIG_PATH\n", *iter); add_search_dir (*iter); ++iter; } g_strfreev (search_dirs); } #ifdef G_OS_WIN32 /* Guard against .pc file being installed with UPPER CASE name */ # define FOLD(x) tolower(x) # define FOLDCMP(a, b) g_ascii_strcasecmp (a, b) #else # define FOLD(x) (x) # define FOLDCMP(a, b) strcmp (a, b) #endif #define EXT_LEN 3 static gboolean ends_in_dotpc (const char *str) { int len = strlen (str); if (len > EXT_LEN && str[len - 3] == '.' && FOLD (str[len - 2]) == 'p' && FOLD (str[len - 1]) == 'c') return TRUE; else return FALSE; } /* strlen ("-uninstalled") */ #define UNINSTALLED_LEN 12 gboolean name_ends_in_uninstalled (const char *str) { int len = strlen (str); if (len > UNINSTALLED_LEN && FOLDCMP ((str + len - UNINSTALLED_LEN), "-uninstalled") == 0) return TRUE; else return FALSE; } /* Look for .pc files in the given directory and add them into * locations, ignoring duplicates */ static void scan_dir (char *dirname) { GDir *dir; const gchar *d_name; int dirnamelen = strlen (dirname); /* Use a copy of dirname cause Win32 opendir doesn't like * superfluous trailing (back)slashes in the directory name. */ char *dirname_copy = g_strdup (dirname); if (dirnamelen > 1 && dirname[dirnamelen-1] == G_DIR_SEPARATOR) { dirnamelen--; dirname_copy[dirnamelen] = '\0'; } #ifdef G_OS_WIN32 { gchar *p; /* Turn backslashes into slashes or * g_shell_parse_argv() will eat them when ${prefix} * has been expanded in parse_libs(). */ p = dirname; while (*p) { if (*p == '\\') *p = '/'; p++; } } #endif dir = g_dir_open (dirname_copy, 0 , NULL); g_free (dirname_copy); scanned_dir_count += 1; if (!dir) { debug_spew ("Cannot open directory #%i '%s' in package search path: %s\n", scanned_dir_count, dirname, g_strerror (errno)); return; } debug_spew ("Scanning directory #%i '%s'\n", scanned_dir_count, dirname); while ((d_name = g_dir_read_name(dir))) { int len = strlen (d_name); if (ends_in_dotpc (d_name)) { char *pkgname = g_malloc (len - EXT_LEN + 1); debug_spew ("File '%s' appears to be a .pc file\n", d_name); strncpy (pkgname, d_name, len - EXT_LEN); pkgname[len-EXT_LEN] = '\0'; if (g_hash_table_lookup (locations, pkgname)) { debug_spew ("File '%s' ignored, we already know about package '%s'\n", d_name, pkgname); g_free (pkgname); } else { char *filename = g_malloc (dirnamelen + 1 + len + 1); strncpy (filename, dirname, dirnamelen); filename[dirnamelen] = G_DIR_SEPARATOR; strcpy (filename + dirnamelen + 1, d_name); if (g_file_test(filename, G_FILE_TEST_IS_REGULAR) == TRUE) { g_hash_table_insert (locations, pkgname, filename); g_hash_table_insert (path_positions, pkgname, GINT_TO_POINTER (scanned_dir_count)); debug_spew ("Will find package '%s' in file '%s'\n", pkgname, filename); } else { debug_spew ("Ignoring '%s' while looking for '%s'; not a " "regular file.\n", pkgname, filename); } } } else { debug_spew ("Ignoring file '%s' in search directory; not a .pc file\n", d_name); } } g_dir_close (dir); } static Package * add_virtual_pkgconfig_package (void) { Package *pkg = NULL; pkg = g_new0 (Package, 1); pkg->key = g_strdup ("pkg-config"); pkg->version = g_strdup (VERSION); pkg->name = g_strdup ("pkg-config"); pkg->description = g_strdup ("pkg-config is a system for managing " "compile/link flags for libraries"); pkg->url = g_strdup ("http://pkg-config.freedesktop.org/"); if (pkg->vars == NULL) pkg->vars = g_hash_table_new (g_str_hash, g_str_equal); g_hash_table_insert (pkg->vars, "pc_path", pkg_config_pc_path); debug_spew ("Adding virtual 'pkg-config' package to list of known packages\n"); g_hash_table_insert (packages, pkg->key, pkg); return pkg; } void package_init () { static gboolean initted = FALSE; if (!initted) { initted = TRUE; packages = g_hash_table_new (g_str_hash, g_str_equal); locations = g_hash_table_new (g_str_hash, g_str_equal); path_positions = g_hash_table_new (g_str_hash, g_str_equal); add_virtual_pkgconfig_package (); g_list_foreach (search_dirs, (GFunc)scan_dir, NULL); } } static Package * internal_get_package (const char *name, gboolean warn) { Package *pkg = NULL; char *key; const char *location; GList *iter; pkg = g_hash_table_lookup (packages, name); if (pkg) return pkg; debug_spew ("Looking for package '%s'\n", name); /* treat "name" as a filename if it ends in .pc and exists */ if ( ends_in_dotpc (name) ) { debug_spew ("Considering '%s' to be a filename rather than a package name\n", name); location = name; } else { /* See if we should auto-prefer the uninstalled version */ if (!disable_uninstalled && !name_ends_in_uninstalled (name)) { char *un; un = g_strconcat (name, "-uninstalled", NULL); pkg = internal_get_package (un, FALSE); g_free (un); if (pkg) { debug_spew ("Preferring uninstalled version of package '%s'\n", name); return pkg; } } location = g_hash_table_lookup (locations, name); } if (location == NULL) { if (warn) verbose_error ("Package %s was not found in the pkg-config search path.\n" "Perhaps you should add the directory containing `%s.pc'\n" "to the PKG_CONFIG_PATH environment variable\n", name, name); return NULL; } if (location != name) key = g_strdup (name); else { /* need to strip package name out of the filename */ int len = strlen (name); const char *end = name + (len - EXT_LEN); const char *start = end; while (start != name && *start != G_DIR_SEPARATOR) --start; g_assert (end >= start); key = g_strndup (start, end - start); } debug_spew ("Reading '%s' from file '%s'\n", name, location); pkg = parse_package_file (key, location, ignore_requires, ignore_private_libs, ignore_requires_private); g_free (key); if (pkg == NULL) { debug_spew ("Failed to parse '%s'\n", location); return NULL; } if (strstr (location, "uninstalled.pc")) pkg->uninstalled = TRUE; pkg->path_position = GPOINTER_TO_INT (g_hash_table_lookup (path_positions, pkg->key)); debug_spew ("Path position of '%s' is %d\n", pkg->key, pkg->path_position); debug_spew ("Adding '%s' to list of known packages\n", pkg->key); g_hash_table_insert (packages, pkg->key, pkg); /* pull in Requires packages */ for (iter = pkg->requires_entries; iter != NULL; iter = g_list_next (iter)) { Package *req; RequiredVersion *ver = iter->data; debug_spew ("Searching for '%s' requirement '%s'\n", pkg->key, ver->name); req = internal_get_package (ver->name, warn); if (req == NULL) { verbose_error ("Package '%s', required by '%s', not found\n", ver->name, pkg->key); exit (1); } if (pkg->required_versions == NULL) pkg->required_versions = g_hash_table_new (g_str_hash, g_str_equal); g_hash_table_insert (pkg->required_versions, ver->name, ver); pkg->requires = g_list_prepend (pkg->requires, req); } /* pull in Requires.private packages */ for (iter = pkg->requires_private_entries; iter != NULL; iter = g_list_next (iter)) { Package *req; RequiredVersion *ver = iter->data; debug_spew ("Searching for '%s' private requirement '%s'\n", pkg->key, ver->name); req = internal_get_package (ver->name, warn); if (req == NULL) { verbose_error ("Package '%s', required by '%s', not found\n", ver->name, pkg->key); exit (1); } if (pkg->required_versions == NULL) pkg->required_versions = g_hash_table_new (g_str_hash, g_str_equal); g_hash_table_insert (pkg->required_versions, ver->name, ver); pkg->requires_private = g_list_prepend (pkg->requires_private, req); } /* make requires_private include a copy of the public requires too */ pkg->requires_private = g_list_concat (g_list_copy (pkg->requires), pkg->requires_private); pkg->requires = g_list_reverse (pkg->requires); pkg->requires_private = g_list_reverse (pkg->requires_private); verify_package (pkg); return pkg; } Package * get_package (const char *name) { return internal_get_package (name, TRUE); } Package * get_package_quiet (const char *name) { return internal_get_package (name, FALSE); } /* Strip consecutive duplicate arguments in the flag list. */ static GList * flag_list_strip_duplicates (GList *list) { GList *tmp; /* Start at the 2nd element of the list so we don't have to check for an * existing previous element. */ for (tmp = g_list_next (list); tmp != NULL; tmp = g_list_next (tmp)) { Flag *cur = tmp->data; Flag *prev = tmp->prev->data; if (cur->type == prev->type && g_strcmp0 (cur->arg, prev->arg) == 0) { /* Remove the duplicate flag from the list and move to the last * element to prepare for the next iteration. */ GList *dup = tmp; debug_spew (" removing duplicate \"%s\"\n", cur->arg); tmp = g_list_previous (tmp); list = g_list_remove_link (list, dup); } } return list; } static char * flag_list_to_string (GList *list) { GList *tmp; GString *str = g_string_new (""); char *retval; tmp = list; while (tmp != NULL) { Flag *flag = tmp->data; char *tmpstr = flag->arg; if (pcsysrootdir != NULL && flag->type & (CFLAGS_I | LIBS_L)) { g_string_append_c (str, '-'); g_string_append_c (str, tmpstr[1]); g_string_append (str, pcsysrootdir); g_string_append (str, tmpstr+2); } else { g_string_append (str, tmpstr); } g_string_append_c (str, ' '); tmp = g_list_next (tmp); } retval = str->str; g_string_free (str, FALSE); return retval; } static int pathposcmp (gconstpointer a, gconstpointer b) { const Package *pa = a; const Package *pb = b; if (pa->path_position < pb->path_position) return -1; else if (pa->path_position > pb->path_position) return 1; else return 0; } static void spew_package_list (const char *name, GList *list) { GList *tmp; debug_spew (" %s:", name); tmp = list; while (tmp != NULL) { Package *pkg = tmp->data; debug_spew (" %s", pkg->key); tmp = tmp->next; } debug_spew ("\n"); } static GList * packages_sort_by_path_position (GList *list) { return g_list_sort (list, pathposcmp); } static void recursive_fill_list (Package *pkg, gboolean include_private, GList **listp) { GList *tmp; /* * If the package is one of the parents, we can skip it. This allows * circular requires loops to be broken. */ if (pkg->in_requires_chain) { debug_spew ("Package %s already in requires chain, skipping\n", pkg->key); return; } /* record this package in the dependency chain */ pkg->in_requires_chain = TRUE; /* Start from the end of the required package list to maintain order since * the recursive list is built by prepending. */ tmp = include_private ? pkg->requires_private : pkg->requires; for (tmp = g_list_last (tmp); tmp != NULL; tmp = g_list_previous (tmp)) recursive_fill_list (tmp->data, include_private, listp); *listp = g_list_prepend (*listp, pkg); /* remove this package from the dependency chain now that we've unwound */ pkg->in_requires_chain = FALSE; } /* merge the flags from the individual packages */ static GList * merge_flag_lists (GList *packages, FlagType type) { GList *last = NULL; GList *merged = NULL; /* keep track of the last element to avoid traversing the whole list */ for (; packages != NULL; packages = g_list_next (packages)) { Package *pkg = packages->data; GList *flags = (type & LIBS_ANY) ? pkg->libs : pkg->cflags; /* manually copy the elements so we can keep track of the end */ for (; flags != NULL; flags = g_list_next (flags)) { Flag *flag = flags->data; if (flag->type & type) { if (last == NULL) { merged = g_list_prepend (NULL, flags->data); last = merged; } else last = g_list_next (g_list_append (last, flags->data)); } } } return merged; } /* Work backwards from the end of the package list to remove duplicate * packages. This could happen because the package was specified multiple * times on the command line, or because multiple packages require the same * package. When we have duplicate dependencies, starting from the end of the * list ensures that the dependency shows up later in the package list and * Libs will come out correctly. */ static GList * package_list_strip_duplicates (GList *packages) { GList *cur; GHashTable *requires; requires = g_hash_table_new (g_str_hash, g_str_equal); for (cur = g_list_last (packages); cur != NULL; cur = g_list_previous (cur)) { Package *pkg = cur->data; if (g_hash_table_lookup_extended (requires, pkg->key, NULL, NULL)) { GList *dup = cur; /* Remove the duplicate package from the list */ debug_spew ("Removing duplicate package %s\n", pkg->key); cur = cur->next; packages = g_list_delete_link (packages, dup); } else { /* Unique package. Track it and move to the next. */ g_hash_table_replace (requires, pkg->key, pkg->key); } } g_hash_table_destroy (requires); return packages; } static GList * fill_list (GList *packages, FlagType type, gboolean in_path_order, gboolean include_private) { GList *tmp; GList *expanded = NULL; GList *flags; /* Start from the end of the requested package list to maintain order since * the recursive list is built by prepending. */ for (tmp = g_list_last (packages); tmp != NULL; tmp = g_list_previous (tmp)) recursive_fill_list (tmp->data, include_private, &expanded); /* Remove duplicate packages from the recursive list. This should provide a * serialized package list where all interdependencies are resolved * consistently. */ spew_package_list (" pre-remove", expanded); expanded = package_list_strip_duplicates (expanded); spew_package_list ("post-remove", expanded); if (in_path_order) { spew_package_list ("original", expanded); expanded = packages_sort_by_path_position (expanded); spew_package_list (" sorted", expanded); } flags = merge_flag_lists (expanded, type); g_list_free (expanded); return flags; } static GList * add_env_variable_to_list (GList *list, const gchar *env) { gchar **values; gint i; values = g_strsplit (env, G_SEARCHPATH_SEPARATOR_S, 0); for (i = 0; values[i] != NULL; i++) { list = g_list_append (list, g_strdup (values[i])); } g_strfreev (values); return list; } static void verify_package (Package *pkg) { GList *requires = NULL; GList *conflicts = NULL; GList *system_directories = NULL; GList *iter; GList *requires_iter; GList *conflicts_iter; GList *system_dir_iter = NULL; int count; const gchar *search_path; /* Be sure we have the required fields */ if (pkg->key == NULL) { fprintf (stderr, "Internal pkg-config error, package with no key, please file a bug report\n"); exit (1); } if (pkg->name == NULL) { verbose_error ("Package '%s' has no Name: field\n", pkg->key); exit (1); } if (pkg->version == NULL) { verbose_error ("Package '%s' has no Version: field\n", pkg->key); exit (1); } if (pkg->description == NULL) { verbose_error ("Package '%s' has no Description: field\n", pkg->key); exit (1); } /* Make sure we have the right version for all requirements */ iter = pkg->requires_private; while (iter != NULL) { Package *req = iter->data; RequiredVersion *ver = NULL; if (pkg->required_versions) ver = g_hash_table_lookup (pkg->required_versions, req->key); if (ver) { if (!version_test (ver->comparison, req->version, ver->version)) { verbose_error ("Package '%s' requires '%s %s %s' but version of %s is %s\n", pkg->key, req->key, comparison_to_str (ver->comparison), ver->version, req->key, req->version); if (req->url) verbose_error ("You may find new versions of %s at %s\n", req->name, req->url); exit (1); } } iter = g_list_next (iter); } /* Make sure we didn't drag in any conflicts via Requires * (inefficient algorithm, who cares) */ recursive_fill_list (pkg, TRUE, &requires); conflicts = pkg->conflicts; requires_iter = requires; while (requires_iter != NULL) { Package *req = requires_iter->data; conflicts_iter = conflicts; while (conflicts_iter != NULL) { RequiredVersion *ver = conflicts_iter->data; if (strcmp (ver->name, req->key) == 0 && version_test (ver->comparison, req->version, ver->version)) { verbose_error ("Version %s of %s creates a conflict.\n" "(%s %s %s conflicts with %s %s)\n", req->version, req->key, ver->name, comparison_to_str (ver->comparison), ver->version ? ver->version : "(any)", ver->owner->key, ver->owner->version); exit (1); } conflicts_iter = g_list_next (conflicts_iter); } requires_iter = g_list_next (requires_iter); } g_list_free (requires); /* We make a list of system directories that gcc expects so we can remove * them. */ search_path = g_getenv ("PKG_CONFIG_SYSTEM_INCLUDE_PATH"); if (search_path == NULL) { search_path = PKG_CONFIG_SYSTEM_INCLUDE_PATH; } system_directories = add_env_variable_to_list (system_directories, search_path); search_path = g_getenv ("C_INCLUDE_PATH"); if (search_path != NULL) { system_directories = add_env_variable_to_list (system_directories, search_path); } search_path = g_getenv ("CPLUS_INCLUDE_PATH"); if (search_path != NULL) { system_directories = add_env_variable_to_list (system_directories, search_path); } count = 0; for (iter = pkg->cflags; iter != NULL; iter = g_list_next (iter)) { gint offset = 0; Flag *flag = iter->data; if (!(flag->type & CFLAGS_I)) continue; /* we put things in canonical -I/usr/include (vs. -I /usr/include) format, * but if someone changes it later we may as well be robust */ if (((strncmp (flag->arg, "-I", 2) == 0) && (offset = 2))|| ((strncmp (flag->arg, "-I ", 3) == 0) && (offset = 3))) { if (offset == 0) { iter = iter->next; continue; } system_dir_iter = system_directories; while (system_dir_iter != NULL) { if (strcmp (system_dir_iter->data, ((char*)flag->arg) + offset) == 0) { debug_spew ("Package %s has %s in Cflags\n", pkg->key, (gchar *)flag->arg); if (g_getenv ("PKG_CONFIG_ALLOW_SYSTEM_CFLAGS") == NULL) { debug_spew ("Removing %s from cflags for %s\n", flag->arg, pkg->key); ++count; iter->data = NULL; break; } } system_dir_iter = system_dir_iter->next; } } } while (count) { pkg->cflags = g_list_remove (pkg->cflags, NULL); --count; } g_list_foreach (system_directories, (GFunc) g_free, NULL); g_list_free (system_directories); system_directories = NULL; search_path = g_getenv ("PKG_CONFIG_SYSTEM_LIBRARY_PATH"); if (search_path == NULL) { search_path = PKG_CONFIG_SYSTEM_LIBRARY_PATH; } system_directories = add_env_variable_to_list (system_directories, search_path); count = 0; for (iter = pkg->libs; iter != NULL; iter = g_list_next (iter)) { GList *system_dir_iter = system_directories; Flag *flag = iter->data; if (!(flag->type & LIBS_L)) continue; while (system_dir_iter != NULL) { gboolean is_system = FALSE; const char *linker_arg = flag->arg; const char *system_libpath = system_dir_iter->data; if (strncmp (linker_arg, "-L ", 3) == 0 && strcmp (linker_arg + 3, system_libpath) == 0) is_system = TRUE; else if (strncmp (linker_arg, "-L", 2) == 0 && strcmp (linker_arg + 2, system_libpath) == 0) is_system = TRUE; if (is_system) { debug_spew ("Package %s has -L %s in Libs\n", pkg->key, system_libpath); if (g_getenv ("PKG_CONFIG_ALLOW_SYSTEM_LIBS") == NULL) { iter->data = NULL; ++count; debug_spew ("Removing -L %s from libs for %s\n", system_libpath, pkg->key); break; } } system_dir_iter = system_dir_iter->next; } } g_list_free (system_directories); while (count) { pkg->libs = g_list_remove (pkg->libs, NULL); --count; } } /* Create a merged list of required packages and retrieve the flags from them. * Strip the duplicates from the flags list. The sorting and stripping can be * done in one of two ways: packages sorted by position in the pkg-config path * and stripping done from the beginning of the list, or packages sorted from * most dependent to least dependent and stripping from the end of the list. * The former is done for -I/-L flags, and the latter for all others. */ static char * get_multi_merged (GList *pkgs, FlagType type, gboolean in_path_order, gboolean include_private) { GList *list; char *retval; list = fill_list (pkgs, type, in_path_order, include_private); list = flag_list_strip_duplicates (list); retval = flag_list_to_string (list); g_list_free (list); return retval; } char * packages_get_flags (GList *pkgs, FlagType flags) { GString *str; char *cur; str = g_string_new (NULL); /* sort packages in path order for -L/-I, dependency order otherwise */ if (flags & CFLAGS_OTHER) { cur = get_multi_merged (pkgs, CFLAGS_OTHER, FALSE, TRUE); debug_spew ("adding CFLAGS_OTHER string \"%s\"\n", cur); g_string_append (str, cur); g_free (cur); } if (flags & CFLAGS_I) { cur = get_multi_merged (pkgs, CFLAGS_I, TRUE, TRUE); debug_spew ("adding CFLAGS_I string \"%s\"\n", cur); g_string_append (str, cur); g_free (cur); } if (flags & LIBS_L) { cur = get_multi_merged (pkgs, LIBS_L, TRUE, !ignore_private_libs); debug_spew ("adding LIBS_L string \"%s\"\n", cur); g_string_append (str, cur); g_free (cur); } if (flags & (LIBS_OTHER | LIBS_l)) { cur = get_multi_merged (pkgs, flags & (LIBS_OTHER | LIBS_l), FALSE, !ignore_private_libs); debug_spew ("adding LIBS_OTHER | LIBS_l string \"%s\"\n", cur); g_string_append (str, cur); g_free (cur); } /* Strip trailing space. */ if (str->len > 0 && str->str[str->len - 1] == ' ') g_string_truncate (str, str->len - 1); debug_spew ("returning flags string \"%s\"\n", str->str); return g_string_free (str, FALSE); } void define_global_variable (const char *varname, const char *varval) { if (globals == NULL) globals = g_hash_table_new (g_str_hash, g_str_equal); if (g_hash_table_lookup (globals, varname)) { verbose_error ("Variable '%s' defined twice globally\n", varname); exit (1); } g_hash_table_insert (globals, g_strdup (varname), g_strdup (varval)); debug_spew ("Global variable definition '%s' = '%s'\n", varname, varval); } char * var_to_env_var (const char *pkg, const char *var) { char *new = g_strconcat ("PKG_CONFIG_", pkg, "_", var, NULL); char *p; for (p = new; *p != 0; p++) { char c = g_ascii_toupper (*p); if (!g_ascii_isalnum (c)) c = '_'; *p = c; } return new; } char * package_get_var (Package *pkg, const char *var) { char *varval = NULL; if (globals) varval = g_strdup (g_hash_table_lookup (globals, var)); /* Allow overriding specific variables using an environment variable of the * form PKG_CONFIG_$PACKAGENAME_$VARIABLE */ if (pkg->key) { char *env_var = var_to_env_var (pkg->key, var); const char *env_var_content = g_getenv (env_var); g_free (env_var); if (env_var_content) { debug_spew ("Overriding variable '%s' from environment\n", var); return g_strdup (env_var_content); } } if (varval == NULL && pkg->vars) varval = g_strdup (g_hash_table_lookup (pkg->vars, var)); return varval; } char * packages_get_var (GList *pkgs, const char *varname) { GList *tmp; GString *str; str = g_string_new (NULL); tmp = pkgs; while (tmp != NULL) { Package *pkg = tmp->data; char *var; var = parse_package_variable (pkg, varname); if (var) { if (str->len > 0) g_string_append_c (str, ' '); g_string_append (str, var); g_free (var); } tmp = g_list_next (tmp); } return g_string_free (str, FALSE); } int compare_versions (const char * a, const char *b) { return rpmvercmp (a, b); } gboolean version_test (ComparisonType comparison, const char *a, const char *b) { switch (comparison) { case LESS_THAN: return compare_versions (a, b) < 0; break; case GREATER_THAN: return compare_versions (a, b) > 0; break; case LESS_THAN_EQUAL: return compare_versions (a, b) <= 0; break; case GREATER_THAN_EQUAL: return compare_versions (a, b) >= 0; break; case EQUAL: return compare_versions (a, b) == 0; break; case NOT_EQUAL: return compare_versions (a, b) != 0; break; case ALWAYS_MATCH: return TRUE; break; default: g_assert_not_reached (); break; } return FALSE; } const char * comparison_to_str (ComparisonType comparison) { switch (comparison) { case LESS_THAN: return "<"; break; case GREATER_THAN: return ">"; break; case LESS_THAN_EQUAL: return "<="; break; case GREATER_THAN_EQUAL: return ">="; break; case EQUAL: return "="; break; case NOT_EQUAL: return "!="; break; case ALWAYS_MATCH: return "(any)"; break; default: g_assert_not_reached (); break; } return "???"; } static void max_len_foreach (gpointer key, gpointer value, gpointer data) { int *mlen = data; *mlen = MAX (*mlen, strlen (key)); } static void packages_foreach (gpointer key, gpointer value, gpointer data) { Package *pkg = get_package (key); if (pkg != NULL) { char *pad; pad = g_strnfill (GPOINTER_TO_INT (data) - strlen (pkg->key), ' '); printf ("%s%s%s - %s\n", pkg->key, pad, pkg->name, pkg->description); g_free (pad); } } void print_package_list (void) { int mlen = 0; ignore_requires = TRUE; ignore_requires_private = TRUE; g_hash_table_foreach (locations, max_len_foreach, &mlen); g_hash_table_foreach (locations, packages_foreach, GINT_TO_POINTER (mlen + 1)); } void enable_private_libs(void) { ignore_private_libs = FALSE; } void disable_private_libs(void) { ignore_private_libs = TRUE; } void enable_requires(void) { ignore_requires = FALSE; } void disable_requires(void) { ignore_requires = TRUE; } void enable_requires_private(void) { ignore_requires_private = FALSE; } void disable_requires_private(void) { ignore_requires_private = TRUE; } pkg-config-0.29.1/config.h.in0000664000175000017500000000443712665370327012620 00000000000000/* config.h.in. Generated from configure.ac by autoheader. */ /* Define ${prefix} in .pc files at runtime */ #undef ENABLE_DEFINE_PREFIX /* Link library to all dependent libraries, not only directly needed ones */ #undef ENABLE_INDIRECT_DEPS /* Define to 1 if you have the header file. */ #undef HAVE_DIRENT_H /* Define to 1 if you have the header file. */ #undef HAVE_DLFCN_H /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_MALLOC_H /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_WAIT_H /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to the sub-directory where libtool stores uninstalled libraries. */ #undef LT_OBJDIR /* Name of package */ #undef PACKAGE /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Version number of package */ #undef VERSION /* Enable large inode numbers on Mac OS X 10.5. */ #ifndef _DARWIN_USE_64_BIT_INODE # define _DARWIN_USE_64_BIT_INODE 1 #endif /* Number of bits in a file offset, on hosts where this is settable. */ #undef _FILE_OFFSET_BITS /* Define for large files, on AIX-style hosts. */ #undef _LARGE_FILES pkg-config-0.29.1/missing0000755000175000017500000001533012601774033012154 00000000000000#! /bin/sh # Common wrapper for a few potentially missing GNU programs. scriptversion=2013-10-28.13; # UTC # Copyright (C) 1996-2014 Free Software Foundation, Inc. # Originally written by Fran,cois Pinard , 1996. # 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, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try '$0 --help' for more information" exit 1 fi case $1 in --is-lightweight) # Used by our autoconf macros to check whether the available missing # script is modern enough. exit 0 ;; --run) # Back-compat with the calling convention used by older automake. shift ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due to PROGRAM being missing or too old. Options: -h, --help display this help and exit -v, --version output version information and exit Supported PROGRAM values: aclocal autoconf autoheader autom4te automake makeinfo bison yacc flex lex help2man Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and 'g' are ignored when checking the name. Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: unknown '$1' option" echo 1>&2 "Try '$0 --help' for more information" exit 1 ;; esac # Run the given program, remember its exit status. "$@"; st=$? # If it succeeded, we are done. test $st -eq 0 && exit 0 # Also exit now if we it failed (or wasn't found), and '--version' was # passed; such an option is passed most likely to detect whether the # program is present and works. case $2 in --version|--help) exit $st;; esac # Exit code 63 means version mismatch. This often happens when the user # tries to use an ancient version of a tool on a file that requires a # minimum version. if test $st -eq 63; then msg="probably too old" elif test $st -eq 127; then # Program was missing. msg="missing on your system" else # Program was found and executed, but failed. Give up. exit $st fi perl_URL=http://www.perl.org/ flex_URL=http://flex.sourceforge.net/ gnu_software_URL=http://www.gnu.org/software program_details () { case $1 in aclocal|automake) echo "The '$1' program is part of the GNU Automake package:" echo "<$gnu_software_URL/automake>" echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/autoconf>" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; autoconf|autom4te|autoheader) echo "The '$1' program is part of the GNU Autoconf package:" echo "<$gnu_software_URL/autoconf/>" echo "It also requires GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; esac } give_advice () { # Normalize program name to check for. normalized_program=`echo "$1" | sed ' s/^gnu-//; t s/^gnu//; t s/^g//; t'` printf '%s\n' "'$1' is $msg." configure_deps="'configure.ac' or m4 files included by 'configure.ac'" case $normalized_program in autoconf*) echo "You should only need it if you modified 'configure.ac'," echo "or m4 files included by it." program_details 'autoconf' ;; autoheader*) echo "You should only need it if you modified 'acconfig.h' or" echo "$configure_deps." program_details 'autoheader' ;; automake*) echo "You should only need it if you modified 'Makefile.am' or" echo "$configure_deps." program_details 'automake' ;; aclocal*) echo "You should only need it if you modified 'acinclude.m4' or" echo "$configure_deps." program_details 'aclocal' ;; autom4te*) echo "You might have modified some maintainer files that require" echo "the 'autom4te' program to be rebuilt." program_details 'autom4te' ;; bison*|yacc*) echo "You should only need it if you modified a '.y' file." echo "You may want to install the GNU Bison package:" echo "<$gnu_software_URL/bison/>" ;; lex*|flex*) echo "You should only need it if you modified a '.l' file." echo "You may want to install the Fast Lexical Analyzer package:" echo "<$flex_URL>" ;; help2man*) echo "You should only need it if you modified a dependency" \ "of a man page." echo "You may want to install the GNU Help2man package:" echo "<$gnu_software_URL/help2man/>" ;; makeinfo*) echo "You should only need it if you modified a '.texi' file, or" echo "any other file indirectly affecting the aspect of the manual." echo "You might want to install the Texinfo package:" echo "<$gnu_software_URL/texinfo/>" echo "The spurious makeinfo call might also be the consequence of" echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" echo "want to install GNU make:" echo "<$gnu_software_URL/make/>" ;; *) echo "You might have modified some files without having the proper" echo "tools for further handling them. Check the 'README' file, it" echo "often tells you about the needed prerequisites for installing" echo "this package. You may also peek at any GNU archive site, in" echo "case some other package contains this missing '$1' program." ;; esac } give_advice "$1" | sed -e '1s/^/WARNING: /' \ -e '2,$s/^/ /' >&2 # Propagate the correct exit status (expected to be 127 for a program # not found, 63 for a program that failed due to version mismatch). exit $st # Local variables: # 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: pkg-config-0.29.1/config.h.win32.in0000664000175000017500000000530212651243607013544 00000000000000/* config.h.in. Generated from configure.ac by autoheader. */ /* Define ${prefix} in .pc files at runtime */ #define ENABLE_DEFINE_PREFIX 1 /* Link library to all dependent libraries, not only directly needed ones */ #define ENABLE_INDIRECT_DEPS 1 /* Define to 1 if you have the header file. */ #ifndef _MSC_VER #define HAVE_DIRENT_H 1 #endif /* Define to 1 if you have the header file. */ /* #undef HAVE_DLFCN_H */ /* Define to 1 if you have the header file. */ #if !defined (_MSC_VER) || (_MSC_VER >= 1800) #define HAVE_INTTYPES_H 1 #endif /* Define to 1 if you have the header file. */ #define HAVE_MALLOC_H 1 /* Define to 1 if you have the header file. */ #define HAVE_MEMORY_H 1 /* Define to 1 if you have the header file. */ #if (!defined(_MSC_VER) || (_MSC_VER >= 1600)) #define HAVE_STDINT_H 1 #endif /* Define to 1 if you have the header file. */ #define HAVE_STDLIB_H 1 /* Define to 1 if you have the header file. */ #ifndef _MSC_VER #define HAVE_STRINGS_H 1 #endif /* Define to 1 if you have the header file. */ #define HAVE_STRING_H 1 /* Define to 1 if you have the header file. */ #define HAVE_SYS_STAT_H 1 /* Define to 1 if you have the header file. */ #define HAVE_SYS_TYPES_H 1 /* Define to 1 if you have the header file. */ /* #undef HAVE_SYS_WAIT_H */ /* Define to 1 if you have the header file. */ #ifndef _MSC_VER #define HAVE_UNISTD_H 1 #endif /* Define to the sub-directory in which libtool stores uninstalled libraries. */ #define LT_OBJDIR ".libs/" /* Name of package */ #define PACKAGE "pkg-config" /* Define to the address where bug reports for this package should be sent. */ #define PACKAGE_BUGREPORT "@PACKAGE_BUGREPORT@" /* Define to the full name of this package. */ #define PACKAGE_NAME "@PACKAGE_NAME@" /* Define to the full name and version of this package. */ #define PACKAGE_STRING "@PACKAGE_NAME@ @PACKAGE_VERSION@" /* Define to the one symbol short name of this package. */ #define PACKAGE_TARNAME "@PACKAGE_TARNAME@" /* Define to the home page for this package. */ #define PACKAGE_URL "" /* Define to the version of this package. */ #define PACKAGE_VERSION "@PACKAGE_VERSION@" /* Define to 1 if you have the ANSI C header files. */ #define STDC_HEADERS 1 /* Version number of package */ #define VERSION "@PACKAGE_VERSION@" /* Enable large inode numbers on Mac OS X 10.5. */ #ifndef _DARWIN_USE_64_BIT_INODE # define _DARWIN_USE_64_BIT_INODE 1 #endif /* Number of bits in a file offset, on hosts where this is settable. */ /* #undef _FILE_OFFSET_BITS */ /* Define for large files, on AIX-style hosts. */ /* #undef _LARGE_FILES */ pkg-config-0.29.1/pkg.m4.in0000664000175000017500000002401712651243552012213 00000000000000dnl pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- dnl serial 11 (pkg-config-@VERSION@) dnl dnl Copyright © 2004 Scott James Remnant . dnl Copyright © 2012-2015 Dan Nicholson 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 of the License, or dnl (at your option) any later version. dnl dnl This program is distributed in the hope that it will be useful, but dnl WITHOUT ANY WARRANTY; without even the implied warranty of dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU dnl 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., 59 Temple Place - Suite 330, Boston, MA dnl 02111-1307, USA. dnl dnl As a special exception to the GNU General Public License, if you dnl distribute this file as part of a program that contains a dnl configuration script generated by Autoconf, you may include it under dnl the same distribution terms that you use for the rest of that dnl program. dnl PKG_PREREQ(MIN-VERSION) dnl ----------------------- dnl Since: 0.29 dnl dnl Verify that the version of the pkg-config macros are at least dnl MIN-VERSION. Unlike PKG_PROG_PKG_CONFIG, which checks the user's dnl installed version of pkg-config, this checks the developer's version dnl of pkg.m4 when generating configure. dnl dnl To ensure that this macro is defined, also add: dnl m4_ifndef([PKG_PREREQ], dnl [m4_fatal([must install pkg-config 0.29 or later before running autoconf/autogen])]) dnl dnl See the "Since" comment for each macro you use to see what version dnl of the macros you require. m4_defun([PKG_PREREQ], [m4_define([PKG_MACROS_VERSION], [@VERSION@]) m4_if(m4_version_compare(PKG_MACROS_VERSION, [$1]), -1, [m4_fatal([pkg.m4 version $1 or higher is required but ]PKG_MACROS_VERSION[ found])]) ])dnl PKG_PREREQ dnl PKG_PROG_PKG_CONFIG([MIN-VERSION]) dnl ---------------------------------- dnl Since: 0.16 dnl dnl Search for the pkg-config tool and set the PKG_CONFIG variable to dnl first found in the path. Checks that the version of pkg-config found dnl is at least MIN-VERSION. If MIN-VERSION is not specified, 0.9.0 is dnl used since that's the first version where most current features of dnl pkg-config existed. AC_DEFUN([PKG_PROG_PKG_CONFIG], [m4_pattern_forbid([^_?PKG_[A-Z_]+$]) m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$]) m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$]) AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility]) AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path]) AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path]) if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) fi if test -n "$PKG_CONFIG"; then _pkg_min_version=m4_default([$1], [0.9.0]) AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) PKG_CONFIG="" fi fi[]dnl ])dnl PKG_PROG_PKG_CONFIG dnl PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) dnl ------------------------------------------------------------------- dnl Since: 0.18 dnl dnl Check to see whether a particular set of modules exists. Similar to dnl PKG_CHECK_MODULES(), but does not set variables or print errors. dnl dnl Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) dnl only at the first occurence in configure.ac, so if the first place dnl it's called might be skipped (such as if it is within an "if", you dnl have to call PKG_CHECK_EXISTS manually AC_DEFUN([PKG_CHECK_EXISTS], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl if test -n "$PKG_CONFIG" && \ AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then m4_default([$2], [:]) m4_ifvaln([$3], [else $3])dnl fi]) dnl _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) dnl --------------------------------------------- dnl Internal wrapper calling pkg-config via PKG_CONFIG and setting dnl pkg_failed based on the result. m4_define([_PKG_CONFIG], [if test -n "$$1"; then pkg_cv_[]$1="$$1" elif test -n "$PKG_CONFIG"; then PKG_CHECK_EXISTS([$3], [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes ], [pkg_failed=yes]) else pkg_failed=untried fi[]dnl ])dnl _PKG_CONFIG dnl _PKG_SHORT_ERRORS_SUPPORTED dnl --------------------------- dnl Internal check to see if pkg-config supports short errors. AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], [AC_REQUIRE([PKG_PROG_PKG_CONFIG]) if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi[]dnl ])dnl _PKG_SHORT_ERRORS_SUPPORTED dnl PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], dnl [ACTION-IF-NOT-FOUND]) dnl -------------------------------------------------------------- dnl Since: 0.4.0 dnl dnl Note that if there is a possibility the first call to dnl PKG_CHECK_MODULES might not happen, you should be sure to include an dnl explicit call to PKG_PROG_PKG_CONFIG in your configure.ac AC_DEFUN([PKG_CHECK_MODULES], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl pkg_failed=no AC_MSG_CHECKING([for $1]) _PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) _PKG_CONFIG([$1][_LIBS], [libs], [$2]) m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS and $1[]_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details.]) if test $pkg_failed = yes; then AC_MSG_RESULT([no]) _PKG_SHORT_ERRORS_SUPPORTED if test $_pkg_short_errors_supported = yes; then $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1` else $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD m4_default([$4], [AC_MSG_ERROR( [Package requirements ($2) were not met: $$1_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. _PKG_TEXT])[]dnl ]) elif test $pkg_failed = untried; then AC_MSG_RESULT([no]) m4_default([$4], [AC_MSG_FAILURE( [The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. _PKG_TEXT To get pkg-config, see .])[]dnl ]) else $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS $1[]_LIBS=$pkg_cv_[]$1[]_LIBS AC_MSG_RESULT([yes]) $3 fi[]dnl ])dnl PKG_CHECK_MODULES dnl PKG_CHECK_MODULES_STATIC(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], dnl [ACTION-IF-NOT-FOUND]) dnl --------------------------------------------------------------------- dnl Since: 0.29 dnl dnl Checks for existence of MODULES and gathers its build flags with dnl static libraries enabled. Sets VARIABLE-PREFIX_CFLAGS from --cflags dnl and VARIABLE-PREFIX_LIBS from --libs. dnl dnl Note that if there is a possibility the first call to dnl PKG_CHECK_MODULES_STATIC might not happen, you should be sure to dnl include an explicit call to PKG_PROG_PKG_CONFIG in your dnl configure.ac. AC_DEFUN([PKG_CHECK_MODULES_STATIC], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl _save_PKG_CONFIG=$PKG_CONFIG PKG_CONFIG="$PKG_CONFIG --static" PKG_CHECK_MODULES($@) PKG_CONFIG=$_save_PKG_CONFIG[]dnl ])dnl PKG_CHECK_MODULES_STATIC dnl PKG_INSTALLDIR([DIRECTORY]) dnl ------------------------- dnl Since: 0.27 dnl dnl Substitutes the variable pkgconfigdir as the location where a module dnl should install pkg-config .pc files. By default the directory is dnl $libdir/pkgconfig, but the default can be changed by passing dnl DIRECTORY. The user can override through the --with-pkgconfigdir dnl parameter. AC_DEFUN([PKG_INSTALLDIR], [m4_pushdef([pkg_default], [m4_default([$1], ['${libdir}/pkgconfig'])]) m4_pushdef([pkg_description], [pkg-config installation directory @<:@]pkg_default[@:>@]) AC_ARG_WITH([pkgconfigdir], [AS_HELP_STRING([--with-pkgconfigdir], pkg_description)],, [with_pkgconfigdir=]pkg_default) AC_SUBST([pkgconfigdir], [$with_pkgconfigdir]) m4_popdef([pkg_default]) m4_popdef([pkg_description]) ])dnl PKG_INSTALLDIR dnl PKG_NOARCH_INSTALLDIR([DIRECTORY]) dnl -------------------------------- dnl Since: 0.27 dnl dnl Substitutes the variable noarch_pkgconfigdir as the location where a dnl module should install arch-independent pkg-config .pc files. By dnl default the directory is $datadir/pkgconfig, but the default can be dnl changed by passing DIRECTORY. The user can override through the dnl --with-noarch-pkgconfigdir parameter. AC_DEFUN([PKG_NOARCH_INSTALLDIR], [m4_pushdef([pkg_default], [m4_default([$1], ['${datadir}/pkgconfig'])]) m4_pushdef([pkg_description], [pkg-config arch-independent installation directory @<:@]pkg_default[@:>@]) AC_ARG_WITH([noarch-pkgconfigdir], [AS_HELP_STRING([--with-noarch-pkgconfigdir], pkg_description)],, [with_noarch_pkgconfigdir=]pkg_default) AC_SUBST([noarch_pkgconfigdir], [$with_noarch_pkgconfigdir]) m4_popdef([pkg_default]) m4_popdef([pkg_description]) ])dnl PKG_NOARCH_INSTALLDIR dnl PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE, dnl [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) dnl ------------------------------------------- dnl Since: 0.28 dnl dnl Retrieves the value of the pkg-config variable for the given module. AC_DEFUN([PKG_CHECK_VAR], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl AC_ARG_VAR([$1], [value of $3 for $2, overriding pkg-config])dnl _PKG_CONFIG([$1], [variable="][$3]["], [$2]) AS_VAR_COPY([$1], [pkg_cv_][$1]) AS_VAR_IF([$1], [""], [$5], [$4])dnl ])dnl PKG_CHECK_VAR pkg-config-0.29.1/rpmvercmp.h0000664000175000017500000000115112651243552012741 00000000000000/* * This code is taken from the RPM package manager. * * RPM is Copyright (c) 1998 by Red Hat Software, Inc., * and may be distributed under the terms of the GPL and LGPL. * See http://rpm.org/gitweb?p=rpm.git;a=blob_plain;f=COPYING;hb=HEAD * * The code should follow upstream as closely as possible. * See http://rpm.org/gitweb?p=rpm.git;a=blob_plain;f=lib/rpmlib.h;hb=HEAD */ /* * Segmented string compare for version or release strings. * * @param a 1st string * @param b 2nd string * @return +1 if a is "newer", 0 if equal, -1 if b is "newer" */ int rpmvercmp(const char * a, const char * b); pkg-config-0.29.1/parse.c0000664000175000017500000006663612664101724012054 00000000000000/* * Copyright (C) 2006-2011 Tollef Fog Heen * Copyright (C) 2001, 2002, 2005-2006 Red Hat Inc. * Copyright (C) 2010 Dan Nicholson * * 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 of the * License, 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. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "parse.h" #include #include #include #include #include #ifdef HAVE_SYS_WAIT_H #include #endif #include gboolean parse_strict = TRUE; gboolean define_prefix = ENABLE_DEFINE_PREFIX; char *prefix_variable = "prefix"; #ifdef G_OS_WIN32 gboolean msvc_syntax = FALSE; #endif /** * Read an entire line from a file into a buffer. Lines may * be delimited with '\n', '\r', '\n\r', or '\r\n'. The delimiter * is not written into the buffer. Text after a '#' character is treated as * a comment and skipped. '\' can be used to escape a # character. * '\' proceding a line delimiter combines adjacent lines. A '\' proceding * any other character is ignored and written into the output buffer * unmodified. * * Return value: %FALSE if the stream was already at an EOF character. **/ static gboolean read_one_line (FILE *stream, GString *str) { gboolean quoted = FALSE; gboolean comment = FALSE; int n_read = 0; g_string_truncate (str, 0); while (1) { int c; c = getc (stream); if (c == EOF) { if (quoted) g_string_append_c (str, '\\'); goto done; } else n_read++; if (quoted) { quoted = FALSE; switch (c) { case '#': g_string_append_c (str, '#'); break; case '\r': case '\n': { int next_c = getc (stream); if (!(c == EOF || (c == '\r' && next_c == '\n') || (c == '\n' && next_c == '\r'))) ungetc (next_c, stream); break; } default: g_string_append_c (str, '\\'); g_string_append_c (str, c); } } else { switch (c) { case '#': comment = TRUE; break; case '\\': if (!comment) quoted = TRUE; break; case '\n': { int next_c = getc (stream); if (!(c == EOF || (c == '\r' && next_c == '\n') || (c == '\n' && next_c == '\r'))) ungetc (next_c, stream); goto done; } default: if (!comment) g_string_append_c (str, c); } } } done: return n_read > 0; } static char * trim_string (const char *str) { int len; g_return_val_if_fail (str != NULL, NULL); while (*str && isspace ((guchar)*str)) str++; len = strlen (str); while (len > 0 && isspace ((guchar)str[len-1])) len--; return g_strndup (str, len); } static char * trim_and_sub (Package *pkg, const char *str, const char *path) { char *trimmed; GString *subst; char *p; trimmed = trim_string (str); subst = g_string_new (""); p = trimmed; while (*p) { if (p[0] == '$' && p[1] == '$') { /* escaped $ */ g_string_append_c (subst, '$'); p += 2; } else if (p[0] == '$' && p[1] == '{') { /* variable */ char *var_start; char *varname; char *varval; var_start = &p[2]; /* Get up to close brace. */ while (*p && *p != '}') ++p; varname = g_strndup (var_start, p - var_start); ++p; /* past brace */ varval = package_get_var (pkg, varname); if (varval == NULL) { verbose_error ("Variable '%s' not defined in '%s'\n", varname, path); if (parse_strict) exit (1); } g_free (varname); g_string_append (subst, varval); g_free (varval); } else { g_string_append_c (subst, *p); ++p; } } g_free (trimmed); p = subst->str; g_string_free (subst, FALSE); return p; } static void parse_name (Package *pkg, const char *str, const char *path) { if (pkg->name) { verbose_error ("Name field occurs twice in '%s'\n", path); if (parse_strict) exit (1); else return; } pkg->name = trim_and_sub (pkg, str, path); } static void parse_version (Package *pkg, const char *str, const char *path) { if (pkg->version) { verbose_error ("Version field occurs twice in '%s'\n", path); if (parse_strict) exit (1); else return; } pkg->version = trim_and_sub (pkg, str, path); } static void parse_description (Package *pkg, const char *str, const char *path) { if (pkg->description) { verbose_error ("Description field occurs twice in '%s'\n", path); if (parse_strict) exit (1); else return; } pkg->description = trim_and_sub (pkg, str, path); } #define MODULE_SEPARATOR(c) ((c) == ',' || isspace ((guchar)(c))) #define OPERATOR_CHAR(c) ((c) == '<' || (c) == '>' || (c) == '!' || (c) == '=') /* A module list is a list of modules with optional version specification, * separated by commas and/or spaces. Commas are treated just like whitespace, * in order to allow stuff like: Requires: @FRIBIDI_PC@, glib, gmodule * where @FRIBIDI_PC@ gets substituted to nothing or to 'fribidi' */ typedef enum { /* put numbers to help interpret lame debug spew ;-) */ OUTSIDE_MODULE = 0, IN_MODULE_NAME = 1, BEFORE_OPERATOR = 2, IN_OPERATOR = 3, AFTER_OPERATOR = 4, IN_MODULE_VERSION = 5 } ModuleSplitState; #define PARSE_SPEW 0 static GList * split_module_list (const char *str, const char *path) { GList *retval = NULL; const char *p; const char *start; ModuleSplitState state = OUTSIDE_MODULE; ModuleSplitState last_state = OUTSIDE_MODULE; /* fprintf (stderr, "Parsing: '%s'\n", str); */ start = str; p = str; while (*p) { #if PARSE_SPEW fprintf (stderr, "p: %c state: %d last_state: %d\n", *p, state, last_state); #endif switch (state) { case OUTSIDE_MODULE: if (!MODULE_SEPARATOR (*p)) state = IN_MODULE_NAME; break; case IN_MODULE_NAME: if (isspace ((guchar)*p)) { /* Need to look ahead to determine next state */ const char *s = p; while (*s && isspace ((guchar)*s)) ++s; if (*s == '\0') state = OUTSIDE_MODULE; else if (MODULE_SEPARATOR (*s)) state = OUTSIDE_MODULE; else if (OPERATOR_CHAR (*s)) state = BEFORE_OPERATOR; else state = OUTSIDE_MODULE; } else if (MODULE_SEPARATOR (*p)) state = OUTSIDE_MODULE; /* comma precludes any operators */ break; case BEFORE_OPERATOR: /* We know an operator is coming up here due to lookahead from * IN_MODULE_NAME */ if (isspace ((guchar)*p)) ; /* no change */ else if (OPERATOR_CHAR (*p)) state = IN_OPERATOR; else g_assert_not_reached (); break; case IN_OPERATOR: if (!OPERATOR_CHAR (*p)) state = AFTER_OPERATOR; break; case AFTER_OPERATOR: if (!isspace ((guchar)*p)) state = IN_MODULE_VERSION; break; case IN_MODULE_VERSION: if (MODULE_SEPARATOR (*p)) state = OUTSIDE_MODULE; break; default: g_assert_not_reached (); } if (state == OUTSIDE_MODULE && last_state != OUTSIDE_MODULE) { /* We left a module */ char *module = g_strndup (start, p - start); retval = g_list_prepend (retval, module); #if PARSE_SPEW fprintf (stderr, "found module: '%s'\n", module); #endif /* reset start */ start = p; } last_state = state; ++p; } if (p != start) { /* get the last module */ char *module = g_strndup (start, p - start); retval = g_list_prepend (retval, module); #if PARSE_SPEW fprintf (stderr, "found module: '%s'\n", module); #endif } retval = g_list_reverse (retval); return retval; } GList * parse_module_list (Package *pkg, const char *str, const char *path) { GList *split; GList *iter; GList *retval = NULL; split = split_module_list (str, path); for (iter = split; iter != NULL; iter = g_list_next (iter)) { RequiredVersion *ver; char *p; char *start; p = iter->data; ver = g_new0 (RequiredVersion, 1); ver->comparison = ALWAYS_MATCH; ver->owner = pkg; retval = g_list_prepend (retval, ver); while (*p && MODULE_SEPARATOR (*p)) ++p; start = p; while (*p && !isspace ((guchar)*p)) ++p; while (*p && MODULE_SEPARATOR (*p)) { *p = '\0'; ++p; } if (*start == '\0') { verbose_error ("Empty package name in Requires or Conflicts in file '%s'\n", path); if (parse_strict) exit (1); else continue; } ver->name = g_strdup (start); start = p; while (*p && !isspace ((guchar)*p)) ++p; while (*p && isspace ((guchar)*p)) { *p = '\0'; ++p; } if (*start != '\0') { if (strcmp (start, "=") == 0) ver->comparison = EQUAL; else if (strcmp (start, ">=") == 0) ver->comparison = GREATER_THAN_EQUAL; else if (strcmp (start, "<=") == 0) ver->comparison = LESS_THAN_EQUAL; else if (strcmp (start, ">") == 0) ver->comparison = GREATER_THAN; else if (strcmp (start, "<") == 0) ver->comparison = LESS_THAN; else if (strcmp (start, "!=") == 0) ver->comparison = NOT_EQUAL; else { verbose_error ("Unknown version comparison operator '%s' after " "package name '%s' in file '%s'\n", start, ver->name, path); if (parse_strict) exit (1); else continue; } } start = p; while (*p && !MODULE_SEPARATOR (*p)) ++p; while (*p && MODULE_SEPARATOR (*p)) { *p = '\0'; ++p; } if (ver->comparison != ALWAYS_MATCH && *start == '\0') { verbose_error ("Comparison operator but no version after package " "name '%s' in file '%s'\n", ver->name, path); if (parse_strict) exit (1); else { ver->version = g_strdup ("0"); continue; } } if (*start != '\0') { ver->version = g_strdup (start); } g_assert (ver->name); } g_list_foreach (split, (GFunc) g_free, NULL); g_list_free (split); retval = g_list_reverse (retval); return retval; } static void parse_requires (Package *pkg, const char *str, const char *path) { char *trimmed; if (pkg->requires) { verbose_error ("Requires field occurs twice in '%s'\n", path); if (parse_strict) exit (1); else return; } trimmed = trim_and_sub (pkg, str, path); pkg->requires_entries = parse_module_list (pkg, trimmed, path); g_free (trimmed); } static void parse_requires_private (Package *pkg, const char *str, const char *path) { char *trimmed; if (pkg->requires_private) { verbose_error ("Requires.private field occurs twice in '%s'\n", path); if (parse_strict) exit (1); else return; } trimmed = trim_and_sub (pkg, str, path); pkg->requires_private_entries = parse_module_list (pkg, trimmed, path); g_free (trimmed); } static void parse_conflicts (Package *pkg, const char *str, const char *path) { char *trimmed; if (pkg->conflicts) { verbose_error ("Conflicts field occurs twice in '%s'\n", path); if (parse_strict) exit (1); else return; } trimmed = trim_and_sub (pkg, str, path); pkg->conflicts = parse_module_list (pkg, trimmed, path); g_free (trimmed); } static char *strdup_escape_shell(const char *s) { size_t r_s = strlen(s)+10, c = 0; char *r = g_malloc(r_s); while (s[0]) { if ((s[0] < '$') || (s[0] > '$' && s[0] < '(') || (s[0] > ')' && s[0] < '+') || (s[0] > ':' && s[0] < '=') || (s[0] > '=' && s[0] < '@') || (s[0] > 'Z' && s[0] < '^') || (s[0] == '`') || (s[0] > 'z' && s[0] < '~') || (s[0] > '~')) { r[c] = '\\'; c++; } r[c] = *s; c++; if (c+2 >= r_s) { r_s *= 2; r = g_realloc(r, r_s); } s++; } r[c] = 0; return r; } static void _do_parse_libs (Package *pkg, int argc, char **argv) { int i; #ifdef G_OS_WIN32 char *L_flag = (msvc_syntax ? "/libpath:" : "-L"); char *l_flag = (msvc_syntax ? "" : "-l"); char *lib_suffix = (msvc_syntax ? ".lib" : ""); #else char *L_flag = "-L"; char *l_flag = "-l"; char *lib_suffix = ""; #endif i = 0; while (i < argc) { Flag *flag = g_new (Flag, 1); char *tmp = trim_string (argv[i]); char *arg = strdup_escape_shell(tmp); char *p; p = arg; g_free(tmp); if (p[0] == '-' && p[1] == 'l' && /* -lib: is used by the C# compiler for libs; it's not an -l flag. */ (strncmp(p, "-lib:", 5) != 0)) { p += 2; while (*p && isspace ((guchar)*p)) ++p; flag->type = LIBS_l; flag->arg = g_strconcat (l_flag, p, lib_suffix, NULL); pkg->libs = g_list_prepend (pkg->libs, flag); } else if (p[0] == '-' && p[1] == 'L') { p += 2; while (*p && isspace ((guchar)*p)) ++p; flag->type = LIBS_L; flag->arg = g_strconcat (L_flag, p, NULL); pkg->libs = g_list_prepend (pkg->libs, flag); } else if ((strcmp("-framework", p) == 0 || strcmp("-Wl,-framework", p) == 0) && i+1 < argc) { /* Mac OS X has a -framework Foo which is really one option, * so we join those to avoid having -framework Foo * -framework Bar being changed into -framework Foo Bar * later */ gchar *framework, *tmp = trim_string (argv[i+1]); framework = strdup_escape_shell(tmp); flag->type = LIBS_OTHER; flag->arg = g_strconcat (arg, " ", framework, NULL); pkg->libs = g_list_prepend (pkg->libs, flag); i++; g_free (framework); g_free (tmp); } else if (*arg != '\0') { flag->type = LIBS_OTHER; flag->arg = g_strdup (arg); pkg->libs = g_list_prepend (pkg->libs, flag); } else /* flag wasn't used */ g_free (flag); g_free (arg); ++i; } } static void parse_libs (Package *pkg, const char *str, const char *path) { /* Strip out -l and -L flags, put them in a separate list. */ char *trimmed; char **argv = NULL; int argc = 0; GError *error = NULL; if (pkg->libs_num > 0) { verbose_error ("Libs field occurs twice in '%s'\n", path); if (parse_strict) exit (1); else return; } trimmed = trim_and_sub (pkg, str, path); if (trimmed && *trimmed && !g_shell_parse_argv (trimmed, &argc, &argv, &error)) { verbose_error ("Couldn't parse Libs field into an argument vector: %s\n", error ? error->message : "unknown"); if (parse_strict) exit (1); else { g_free (trimmed); return; } } _do_parse_libs(pkg, argc, argv); g_free (trimmed); g_strfreev (argv); pkg->libs_num++; } static void parse_libs_private (Package *pkg, const char *str, const char *path) { /* List of private libraries. Private libraries are libraries which are needed in the case of static linking or on platforms not supporting inter-library dependencies. They are not supposed to be used for libraries which are exposed through the library in question. An example of an exposed library is GTK+ exposing Glib. A common example of a private library is libm. Generally, if include another library's headers in your own, it's a public dependency and not a private one. */ char *trimmed; char **argv = NULL; int argc = 0; GError *error = NULL; if (pkg->libs_private_num > 0) { verbose_error ("Libs.private field occurs twice in '%s'\n", path); if (parse_strict) exit (1); else return; } trimmed = trim_and_sub (pkg, str, path); if (trimmed && *trimmed && !g_shell_parse_argv (trimmed, &argc, &argv, &error)) { verbose_error ("Couldn't parse Libs.private field into an argument vector: %s\n", error ? error->message : "unknown"); if (parse_strict) exit (1); else { g_free (trimmed); return; } } _do_parse_libs(pkg, argc, argv); g_strfreev (argv); g_free (trimmed); pkg->libs_private_num++; } static void parse_cflags (Package *pkg, const char *str, const char *path) { /* Strip out -I flags, put them in a separate list. */ char *trimmed; char **argv = NULL; int argc = 0; GError *error = NULL; int i; if (pkg->cflags) { verbose_error ("Cflags field occurs twice in '%s'\n", path); if (parse_strict) exit (1); else return; } trimmed = trim_and_sub (pkg, str, path); if (trimmed && *trimmed && !g_shell_parse_argv (trimmed, &argc, &argv, &error)) { verbose_error ("Couldn't parse Cflags field into an argument vector: %s\n", error ? error->message : "unknown"); if (parse_strict) exit (1); else { g_free (trimmed); return; } } i = 0; while (i < argc) { Flag *flag = g_new (Flag, 1); char *tmp = trim_string (argv[i]); char *arg = strdup_escape_shell(tmp); char *p = arg; g_free(tmp); if (p[0] == '-' && p[1] == 'I') { p += 2; while (*p && isspace ((guchar)*p)) ++p; flag->type = CFLAGS_I; flag->arg = g_strconcat ("-I", p, NULL); pkg->cflags = g_list_prepend (pkg->cflags, flag); } else if ((strcmp ("-idirafter", arg) == 0 || strcmp ("-isystem", arg) == 0) && i+1 < argc) { char *option, *tmp; tmp = trim_string (argv[i+1]); option = strdup_escape_shell (tmp); flag->type = CFLAGS_OTHER; flag->arg = g_strconcat (arg, " ", option, NULL); pkg->cflags = g_list_prepend (pkg->cflags, flag); i++; g_free (option); g_free (tmp); } else if (*arg != '\0') { flag->type = CFLAGS_OTHER; flag->arg = g_strdup (arg); pkg->cflags = g_list_prepend (pkg->cflags, flag); } else /* flag wasn't used */ g_free (flag); g_free (arg); ++i; } g_strfreev (argv); g_free (trimmed); } static void parse_url (Package *pkg, const char *str, const char *path) { if (pkg->url != NULL) { verbose_error ("URL field occurs twice in '%s'\n", path); if (parse_strict) exit (1); else return; } pkg->url = trim_and_sub (pkg, str, path); } static void parse_line (Package *pkg, const char *untrimmed, const char *path, gboolean ignore_requires, gboolean ignore_private_libs, gboolean ignore_requires_private) { char *str; char *p; char *tag; debug_spew (" line>%s\n", untrimmed); str = trim_string (untrimmed); if (*str == '\0') /* empty line */ { g_free(str); return; } p = str; /* Get first word */ while ((*p >= 'A' && *p <= 'Z') || (*p >= 'a' && *p <= 'z') || (*p >= '0' && *p <= '9') || *p == '_' || *p == '.') p++; tag = g_strndup (str, p - str); while (*p && isspace ((guchar)*p)) ++p; if (*p == ':') { /* keyword */ ++p; while (*p && isspace ((guchar)*p)) ++p; if (strcmp (tag, "Name") == 0) parse_name (pkg, p, path); else if (strcmp (tag, "Description") == 0) parse_description (pkg, p, path); else if (strcmp (tag, "Version") == 0) parse_version (pkg, p, path); else if (strcmp (tag, "Requires.private") == 0) { if (!ignore_requires_private) parse_requires_private (pkg, p, path); } else if (strcmp (tag, "Requires") == 0) { if (ignore_requires == FALSE) parse_requires (pkg, p, path); else goto cleanup; } else if ((strcmp (tag, "Libs.private") == 0) && ignore_private_libs == FALSE) parse_libs_private (pkg, p, path); else if (strcmp (tag, "Libs") == 0) parse_libs (pkg, p, path); else if (strcmp (tag, "Cflags") == 0 || strcmp (tag, "CFlags") == 0) parse_cflags (pkg, p, path); else if (strcmp (tag, "Conflicts") == 0) parse_conflicts (pkg, p, path); else if (strcmp (tag, "URL") == 0) parse_url (pkg, p, path); else { /* we don't error out on unknown keywords because they may * represent additions to the .pc file format from future * versions of pkg-config. We do make a note of them in the * debug spew though, in order to help catch mistakes in .pc * files. */ debug_spew ("Unknown keyword '%s' in '%s'\n", tag, path); } } else if (*p == '=') { /* variable */ char *varname; char *varval; ++p; while (*p && isspace ((guchar)*p)) ++p; if (define_prefix && strcmp (tag, prefix_variable) == 0) { /* This is the prefix variable. Try to guesstimate a value for it * for this package from the location of the .pc file. */ gchar *base; gboolean is_pkgconfigdir; base = g_path_get_basename (pkg->pcfiledir); is_pkgconfigdir = g_ascii_strcasecmp (base, "pkgconfig") == 0; g_free (base); if (is_pkgconfigdir) { /* It ends in pkgconfig. Good. */ gchar *q; gchar *prefix; /* Keep track of the original prefix value. */ pkg->orig_prefix = g_strdup (p); /* Get grandparent directory for new prefix. */ q = g_path_get_dirname (pkg->pcfiledir); prefix = g_path_get_dirname (q); g_free (q); /* Turn backslashes into slashes or * g_shell_parse_argv() will eat them when ${prefix} * has been expanded in parse_libs(). */ q = prefix; while (*q) { if (*q == '\\') *q = '/'; q++; } /* Now escape the special characters so that there's no danger * of arguments that include the prefix getting split. */ q = prefix; prefix = strdup_escape_shell (prefix); g_free (q); varname = g_strdup (tag); debug_spew (" Variable declaration, '%s' overridden with '%s'\n", tag, prefix); g_hash_table_insert (pkg->vars, varname, prefix); goto cleanup; } } else if (define_prefix && pkg->orig_prefix != NULL && strncmp (p, pkg->orig_prefix, strlen (pkg->orig_prefix)) == 0 && G_IS_DIR_SEPARATOR (p[strlen (pkg->orig_prefix)])) { char *oldstr = str; p = str = g_strconcat (g_hash_table_lookup (pkg->vars, prefix_variable), p + strlen (pkg->orig_prefix), NULL); g_free (oldstr); } if (g_hash_table_lookup (pkg->vars, tag)) { verbose_error ("Duplicate definition of variable '%s' in '%s'\n", tag, path); if (parse_strict) exit (1); else goto cleanup; } varname = g_strdup (tag); varval = trim_and_sub (pkg, p, path); debug_spew (" Variable declaration, '%s' has value '%s'\n", varname, varval); g_hash_table_insert (pkg->vars, varname, varval); } cleanup: g_free (str); g_free (tag); } Package* parse_package_file (const char *key, const char *path, gboolean ignore_requires, gboolean ignore_private_libs, gboolean ignore_requires_private) { FILE *f; Package *pkg; GString *str; gboolean one_line = FALSE; f = fopen (path, "r"); if (f == NULL) { verbose_error ("Failed to open '%s': %s\n", path, strerror (errno)); return NULL; } debug_spew ("Parsing package file '%s'\n", path); pkg = g_new0 (Package, 1); pkg->key = g_strdup (key); if (path) { pkg->pcfiledir = g_dirname (path); } else { debug_spew ("No pcfiledir determined for package\n"); pkg->pcfiledir = g_strdup ("???????"); } if (pkg->vars == NULL) pkg->vars = g_hash_table_new (g_str_hash, g_str_equal); /* Variable storing directory of pc file */ g_hash_table_insert (pkg->vars, "pcfiledir", pkg->pcfiledir); str = g_string_new (""); while (read_one_line (f, str)) { one_line = TRUE; parse_line (pkg, str->str, path, ignore_requires, ignore_private_libs, ignore_requires_private); g_string_truncate (str, 0); } if (!one_line) verbose_error ("Package file '%s' appears to be empty\n", path); g_string_free (str, TRUE); fclose(f); pkg->cflags = g_list_reverse (pkg->cflags); pkg->libs = g_list_reverse (pkg->libs); return pkg; } /* Parse a package variable. When the value appears to be quoted, * unquote it so it can be more easily used in a shell. Otherwise, * return the raw value. */ char * parse_package_variable (Package *pkg, const char *variable) { char *value; char *unquoted; GError *error = NULL; value = package_get_var (pkg, variable); if (!value) return NULL; if (*value != '"' && *value != '\'') /* Not quoted, return raw value */ return value; /* Maybe too naive, but assume a fully quoted variable */ unquoted = g_shell_unquote (value, &error); if (unquoted) { g_free (value); return unquoted; } else { /* Note the issue, but just return the raw value */ debug_spew ("Couldn't unquote value of \"%s\": %s\n", variable, error ? error->message : "unknown"); g_clear_error (&error); return value; } } pkg-config-0.29.1/NEWS0000664000175000017500000002761112665370032011264 00000000000000pkg-config 0.29.1 ================= - Fixed a regression from 0.29 with unquoting values queried with --variable. In some cases, this would cause shell special characters to be escaped in ways they weren't before. Instead, the unquoting only occurs if the value appears to be quoted. (#93284) - Add support for building pkg-config with Microsoft Visual Studio. Thanks to Chun-wei Fan for the fix. (#92489) - Allow overriding pkg-config variables with environment variables. By setting an environment variable of the form PKG_CONFIG_$PACKAGE_$VARIABLE, a pkg-config variable can be set globally without always having to pass --define-variable. Thanks to Alex Larsson for the fix. (#90917) - Honor -Wl,-framework in addition to -framework so that multiple frameworks are handled on OSX. (#1278) - Fix the OSX build using --with-internal-glib. Thanks to Rudá Moura for the initial fix and Adam Mercer for testing the final patch. (#92902) pkg-config 0.29 === - Fixed a regression from 0.28 in system -L flag handling. If the pc file has multiple system -L flags, every other flag will be left as is. Thanks to Andrew Oakley for the fix. (#78077) - Quoting of variables queried through --variable is removed so that the output can be used verbatim in subsequent shell commands. Thanks to Marek Kasik for the fix. (#67904) - Fixed a regression from 0.28 in -L flag handling on Windows. A .libs suffix was inadvertantly being added to the library path. - Added a --validate option to check pc file syntax. This works just like --exists, but package dependencies are disabled. (#7000) - Added the PKG_PREREQ autoconf macro. Whereas PKG_PROG_PKG_CONFIG is used to check the version of the pkg-config tool, this is used to check the version of the pkg-config autoconf macros in use. - Added the PKG_CHECK_MODULES_STATIC autoconf macro. This will temporarily add --static to the pkg-config calls while invoking PKG_CHECK_MODULES. (#19541) - Many fixes to the testsuite for Windows. It should now pass for a MinGW, Cygwin, and cross-compiled MinGW using Wine for test execution. (#66939) - More consistent handling of prefix redefinition. On Windows, the prefix was always being redefined based on the pc file path. This feature can now be enabled or disabled at runtime on all platforms using the --define-prefix and --dont-define-prefix options. (#63602) - Continue listing packages with --list-all even if there are errors in pc files. (#26615) - Various documentation improvements. (#62018, #62374, #66155) - Fixed a bug when multiple -isystem arguments are used. (#72584) - pkg-config is now built with largefile support to ensure that it works correctly on filesystems with 64 bit inodes. Thanks to Peter Jones for the fix. (#90078) - Bugs fixed: 7000, 19541, 26615, 62018, 62374, 63602, 66155, 66939, 67904, 70690, 72584, 78077, 80378, 80380, 89267, 90078, 90437, 92002. pkg-config 0.28 === - Fixed a pair of long-standing and intertwined bugs involving unwanted removal of flags. The first is that other Libs flags like -Wl are now kept in context order with -l flags. The second is that aggressive removal of all duplicate arguments has been scaled back so that just consecutive duplicate arguments are removed. One result of this change is that some flags could be repeated in the final output, especially flags from non-pkg-config packages like -lm. Since pkg-config rarely has enough knowledge here about the right thing to do, we throw the duplicate arguments at the compiler/linker and trust it will do the right thing. - Fixed an old bug to allow circular Requires. This fix brings along a small behavior change in that pkg-config resolves requires depth first, causing some lower level flags to show up earlier in the output than previously. - Cleaned up many corner-case bugs and ambiguous behavior in pkg-config's interface. Thanks to Michał Górny for finding so many of these. - New autoconf macro PKG_CHECK_VAR for reading variables from .pc files. - Default to suppressing -L/lib and/or -L/lib64 like their /usr counterparts. - To help support multiarch scenarios out of the box, $host-pkg-config is now installed unless --disable-host-tool is passed to configure. - Added optional gcov usage through the --with-gcov configure option. As a result, many more tests were added to greatly increase the coverage of the code to 86% of executed lines on a Fedora 18 machine. - Bugs fixed: 130, 7331, 16101, 17053, 19950, 34504, 48098, 54231, 54271, 54379, 54384, 54386, 54388, 54389, 54390, 54391, 54427, 54463, 54716, 57078, 58363, 59435. pkg-config 0.27.1 === - Various fixes for using the internal glib snapshot. It should now be usable pretty much everywhere with the exception that universal builds are not supported on OS X. - Remove usage of gettext from the internal glib to avoid gettext and libintl dependencies. - Update internal glib snapshot to 2.32.4. - Fix check for POSIX shell used in tests to work better. - Handle spaces in autodetected prefix on Windows. - Bugs fixed 3550, 51883, 52031, 53493. pkg-config 0.27 === - Drop usage of popt for equivalent API in glib2. - Add back an internal snapshot of glib2 to break circular dependency. This can be used by passing --with-internal-glib to configure. On Windows it may still be required to use an installed glib. - Fix --exists to check for Requires and Requires.private. This ensures that all necessary packages are installed prior to using --cflags, --libs, etc. - Various fixes for MinGW which should allow it to be used unpatched on that system. - New autoconf macros PKG_INSTALLDIR and PKG_NOARCH_INSTALLDIR to help determine the .pc file install directory. - Fix handling of --exact/atleast/max-version vs. =/>=/<=. - Fix errors in man page source. - Ensure testing only searches in the check directory. - Bump glib requirement to 2.16 to avoid deprecated g_win32_get_package_installation_subdirectory(). - Autotools refresh and update. The required versions now are autoconf-2.62, automake-1.11 and libtool-2.2. - Use g_alloca from glib instead of figuring out alloca ourselves. - Remove search for setresuid & setreuid only needed for internal popt. - Bugs fixed: 833, 2458, 5214, 5326, 5703, 6074, 8653, 9135, 9143, 9584, 10652, 11464, 14396, 17053, 23922, 28776, 29011, 29801, 31699, 31700, 32622, 34382, 37266, 39646, 41081, 43149, 44843, 45599, 45742, 48743 pkg-config 0.26 === - Build system fixes - More tests - pkg.m4 fixups which makes autoconf 2.66 happier. - Drop support for legacy -config scripts. Those should already be gone and cause problems in cross-compilation environments. - Drop embedded glib - Fix up pkg.m4 to handle the case of --exists working and --cflags or --libs failing. - Various documentation updates - Allow $() through without escaping it. - Add --with-system-include-path instead of hard-coding /usr/include. pkg-config 0.25 === - 0.24 included a too strict whitespace/shell metacharacter filter leading to some legal characters like = and : being escaped in the output. This has been fixed. - when building with newer and external libpopt, it would be confused over being asked to split an empty string, leading to errors with packages that included empty fields in their .pc files. - Make the COPYING file explicitly GPLv2. The COPYING file in 0.24 was inadvertently GPLv3 rather than the correct GPLv2. - Minor changes to documentation pkg-config 0.24 === - Fix up bug in PKG_CONFIG_SYSROOT handling which mangled non-I and non-L arguments - Put /usr/lib/pkgconfig and /usr/share/pkgconfig into the default search path when no prefix is passed to configure. - Portability fixes for Windows and NetBSD - Various man page updates - Add logging support to log how pkg-config is being called. - Skip Requires.private unless we need them for Cflags - Add a variable, pc_path to the compiled-in pkg-config package that you can query for the compiled-in PKG_CONFIG_PC_PATH. - Various updates to pkg.m4. - Update rpmvercmp with bugfixes from upstream. - Add introductory guide to pkg-config, thanks to Dan Nicholson for the patch. - Add listing of variables in a package - Make it possible to use external popt. - Add --print-provides and --print-requires(-private) options - Add support for paths containing whitespace and shell metacharacters pkg-config 0.23 === - Add support for setting sysroot through PKG_CONFIG_SYSROOT_DIR in the environment. - Update included glib to 1.2.10. - Other minor fixes, including a segfault. pkg-config 0.22 === - Make Requires.private a whole lot more useful by traversing the whole tree, not just the top-level, for Cflags. - Add support for using the system glib. - Update URL to pkg-config website - Fix some win32 problems. - Other minor fixes. pkg-config 0.21 === - Fix some cosmetic output from pkg.m4 - Fix build problems with !gcc due to always passing -Wall - Documentation fixes - We now always add the Cflags from packages we depend on, whether they are public or private dependencies. The discussion surrouding this change can be found in http://bugs.debian.org/340904 . - Add internal pkg-config package which can be queried for version number and other information. pkg-config 0.20 === - Fix test suite to work on Solaris. Yay non-POSIX /bin/sh :-( - Fix segfault on --help with gcc4. Fix segfault on bigendian arches in some cases. - Win32 fixes - Add --short-errors, now used by pkg.m4 if available. This gives a better error message if some libraries can't be found. pkg-config 0.19 === - Fix a segfault - Fix default search path - Fix cosmetic bug in pkg.m4 where AC_MSG_RESULT wasn't called in some cases. pkg-config 0.18.1 === - Fix up pkg.m4 to not end up with pkg_failed=untried always. pkg-config 0.18 === - The inter-library dependencies check was too tight and caused problems if one used the --no-undefined flag to libtool on Solaris (since it there expands to -Wl,-z,defs which disallows undefined symbols). Add a new name to .pc files: Libs.private which will not be listed in the output of --libs unless --static is also given. Private libraries are libraries which are needed in the case of static linking or on platforms not supporting inter-library dependencies. They are not supposed to be used for libraries which are exposed through the library in question. An example of an exposed library is GTK+ exposing Glib. A common example of a private library is libm. Generally, if include another library's headers in your own, it's a public dependency and not a private one. Thanks a lot to James Henstridge for both the bug and the following discussion. pkg-config 0.17.2 === - Don't go into an infinite loop allocating more and more memory when the same name is specified twice on the command line and we're in "direct dependencies only"-mode. pkg-config 0.17.1 === - Now actually sets CFLAGS and LIBS instead of trying to set those in a subshell. (Only affects if you've autoreconfiscated with 0.17) - Fix detection of inter-library dependencies. pkg-config 0.17 === - Evaluate second argument to PKG_CHECK_MODULES again - Portability fixes (MacOS, BeOS, Cygwin) - Handle inter-library dependencies and assume those are in place if the platform supports them. Disable with --enable-indirect-deps. - Add initial test framework - Build fixes (make distcheck now works) pkg-config 0.16 === - Use a search path, rather than a single default directory. - Fix a bunch of bugs in glib by backporting - More man page fixes - Lots of small fixes and cleanups over the place. - pkg-config now grabs _PKG_* and PKG_*, so don't use variables starting with that in any configure scripts. pkg-config 0.15 === - add PKG_CONFIG_LIBDIR for cross-compiling (David Schleef) - add --libs-only-other/--cflags-only-other (Zack Rusin) - apply man page fixes (Pter Breitenlohner) - C portability fix (David Robins) - fix to win32 build (Tor Lillqvist) pkg-config-0.29.1/Makefile.am0000664000175000017500000000340212651243607012613 00000000000000ACLOCAL_AMFLAGS = ${ACLOCAL_FLAGS} if INTERNAL_GLIB GLIB_SUBDIR = glib endif # Normally we'd want glib to be part of DIST_SUBDIRS unconditionally, # but distclean gets broken unless we always run glib's configure SUBDIRS = $(GLIB_SUBDIR) . check DIST_SUBDIRS = $(SUBDIRS) # Escape paths properly on windows if NATIVE_WIN32 AM_CPPFLAGS = \ -DPKG_CONFIG_PC_PATH="\"$(subst /,\/,$(pc_path))\"" \ -DPKG_CONFIG_SYSTEM_INCLUDE_PATH="\"$(subst /,\/,$(system_include_path))\"" \ -DPKG_CONFIG_SYSTEM_LIBRARY_PATH="\"$(subst /,\/,$(system_library_path))\"" else AM_CPPFLAGS = \ -DPKG_CONFIG_PC_PATH="\"$(pc_path)\"" \ -DPKG_CONFIG_SYSTEM_INCLUDE_PATH="\"$(system_include_path)\"" \ -DPKG_CONFIG_SYSTEM_LIBRARY_PATH="\"$(system_library_path)\"" endif AM_CFLAGS = \ $(WARN_CFLAGS) \ $(GCOV_CFLAGS) \ $(GLIB_CFLAGS) bin_PROGRAMS = pkg-config pkg_config_LDADD = $(GLIB_LIBS) include Makefile.sources if HOST_TOOL host_tool = $(host)-pkg-config$(EXEEXT) install-exec-hook: cd $(DESTDIR)$(bindir) && $(LN) -f pkg-config$(EXEEXT) $(host_tool) uninstall-hook: cd $(DESTDIR)$(bindir) && rm -f $(host_tool) endif # Various data files m4dir = $(datadir)/aclocal m4_DATA = pkg.m4 dist_doc_DATA = pkg-config-guide.html dist_man_MANS = pkg-config.1 EXTRA_DIST = \ README.win32 \ detectenv-msvc.mak \ Makefile.vc \ config.h.win32 # gcov test coverage gcov: -$(MAKE) $(AM_MAKEFLAGS) -k check $(GCOV) $(pkg_config_SOURCES) CLEANFILES = *.gcda *.gcno *.gcov # Since we can't always have glib in DIST_SUBDIRS, we need to make sure # glib is configured when we want to run dist. Unfortunately, there's no # DIST_CONFIGURE_FLAGS. DISTCHECK_CONFIGURE_FLAGS = --with-internal-glib if !INTERNAL_GLIB dist-hook: @echo "error: --with-internal-glib is required to include glib in dist" @exit 1 endif pkg-config-0.29.1/parse.h0000664000175000017500000000234012664101501012030 00000000000000/* * Copyright (C) 2001, 2002 Red Hat 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 of the * License, 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. */ #ifndef PKG_CONFIG_PARSE_H #define PKG_CONFIG_PARSE_H #include "pkg.h" Package *parse_package_file (const char *key, const char *path, gboolean ignore_requires, gboolean ignore_private_libs, gboolean ignore_requires_private); GList *parse_module_list (Package *pkg, const char *str, const char *path); char *parse_package_variable (Package *pkg, const char *variable); #endif pkg-config-0.29.1/pkg-config-guide.html0000664000175000017500000004265012651243552014573 00000000000000 Guide to pkg-config

Guide to pkg-config

Dan Nicholson

Overview

This document aims to give an overview to using the pkg-config tool from the perspective of both a user and a developer. It reviews the concepts behind pkg-config, how to write pkg-config files to support your project, and how to use pkg-config to integrate with 3rd party projects.

More information on pkg-config can be found at the website and in the pkg-config(1) manual page.

This document assumes usage of pkg-config on a Unix-like operating system such as Linux. Some of the details may be different on other platforms.

Why?

Modern computer systems use many layered components to provide applications to the user. One of the difficulties in assembling these parts is properly integrating them. pkg-config collects metadata about the installed libraries on the system and easily provides it to the user.

Without a metadata system such as pkg-config, it can be very difficult to locate and obtain details about the services provided on a given computer. For a developer, installing pkg-config files with your package greatly eases adoption of your API.

Concepts

The primary use of pkg-config is to provide the necessary details for compiling and linking a program to a library. This metadata is stored in pkg-config files. These files have the suffix .pc and reside in specific locations known to the pkg-config tool. This will be described in more detail later.

The file format contains predefined metadata keywords and freeform variables. An example may be illustrative:

prefix=/usr/local
exec_prefix=${prefix}
includedir=${prefix}/include
libdir=${exec_prefix}/lib

Name: foo
Description: The foo library
Version: 1.0.0
Cflags: -I${includedir}/foo
Libs: -L${libdir} -lfoo

The keyword definitions such as Name: begin with a keyword followed by a colon and the value. The variables such as prefix= are a string and value separated by an equals sign. The keywords are defined and exported by pkg-config. The variables are not necessary, but can be used by the keyword definitions for flexibility or to store data not covered by pkg-config.

Here is a short description of the keyword fields. A more in depth description of these fields and how to use them effectively will be given in the Writing pkg-config files section.

  • Name: A human-readable name for the library or package. This does not affect usage of the pkg-config tool, which uses the name of the .pc file.
  • Description: A brief description of the package.
  • URL: An URL where people can get more information about and download the package.
  • Version: A string specifically defining the version of the package.
  • Requires: A list of packages required by this package. The versions of these packages may be specified using the comparison operators =, <, >, <= or >=.
  • Requires.private: A list of private packages required by this package but not exposed to applications. The version specific rules from the Requires field also apply here.
  • Conflicts: An optional field describing packages that this one conflicts with. The version specific rules from the Requires field also apply here. This field also takes multiple instances of the same package. E.g., Conflicts: bar < 1.2.3, bar >= 1.3.0.
  • Cflags: The compiler flags specific to this package and any required libraries that don't support pkg-config. If the required libraries support pkg-config, they should be added to Requires or Requires.private.
  • Libs: The link flags specific to this package and any required libraries that don't support pkg-config. The same rule as Cflags applies here.
  • Libs.private: The link flags for private libraries required by this package but not exposed to applications. The same rule as Cflags applies here.

Writing pkg-config files

When creating pkg-config files for a package, it is first necessary to decide how they will be distributed. Each file is best used to describe a single library, so each package should have at least as many pkg-config files as they do installed libraries.

The package name is determined through the filename of the pkg-config metadata file. This is the portion of the filename prior to the .pc suffix. A common choice is to match the library name to the .pc name. For instance, a package installing libfoo.so would have a corresponding libfoo.pc file containing the pkg-config metadata. This choice is not necessary; the .pc file should simply be a unique identifier for your library. Following the above example, foo.pc or foolib.pc would probably work just as well.

The Name, Description and URL fields are purely informational and should be easy to fill in. The Version field is a bit trickier to ensure that it is usable by consumers of the data. pkg-config uses the algorithm from RPM for version comparisons. This works best with a dotted decimal number such as 1.2.3 since letters can cause unexpected results. The number should be monotonically increasing and be as specific as possible in describing the library. Usually it's sufficient to use the package's version number here since it's easy for consumers to track.

Before describing the more useful fields, it will be helpful to demonstrate variable definitions. The most common usage is to define the installation paths so that they don't clutter the metadata fields. Since the variables are expanded recursively, this is very helpful when used in conjunction with autoconf derived paths.

prefix=/usr/local
includedir=${prefix}/include

Cflags: -I${includedir}/foo

The most important pkg-config metadata fields are Requires, Requires.private, Cflags, Libs and Libs.private. They will define the metadata used by external projects to compile and link with the library.

Requires and Requires.private define other modules needed by the library. It is usually preferred to use the private variant of Requires to avoid exposing unnecessary libraries to the program that is linking with your library. If the program will not be using the symbols of the required library, it should not be linking directly to that library. See the discussion of overlinking for a more thorough explanation.

Since pkg-config always exposes the link flags of the Requires libraries, these modules will become direct dependencies of the program. On the other hand, libraries from Requires.private will only be included when static linking. For this reason, it is usually only appropriate to add modules from the same package in Requires.

The Libs field contains the link flags necessary to use that library. In addition, Libs and Libs.private contain link flags for other libraries not supported by pkg-config. Similar to the Requires field, it is preferred to add link flags for external libraries to the Libs.private field so programs do not acquire an additional direct dependency.

Finally, the Cflags contains the compiler flags for using the library. Unlike the Libs field, there is not a private variant of Cflags. This is because the data types and macro definitions are needed regardless of the linking scenario.

Using pkg-config files

Assuming that there are .pc files installed on the system, the pkg-config tool is used to extract the metadata for usage. A short description of the options can be seen by executing pkg-config --help. A more in depth discussion can be found in the pkg-config(1) manual page. This section will provide a brief explanation of common usages.

Consider a system with two modules, foo and bar. Their .pc files might look like this:

foo.pc:
prefix=/usr
exec_prefix=${prefix}
includedir=${prefix}/include
libdir=${exec_prefix}/lib

Name: foo
Description: The foo library
Version: 1.0.0
Cflags: -I${includedir}/foo
Libs: -L${libdir} -lfoo

bar.pc:
prefix=/usr
exec_prefix=${prefix}
includedir=${prefix}/include
libdir=${exec_prefix}/lib

Name: bar
Description: The bar library
Version: 2.1.2
Requires.private: foo >= 0.7
Cflags: -I${includedir}
Libs: -L${libdir} -lbar

The version of the modules can be obtained with the --modversion option.

$ pkg-config --modversion foo
1.0.0
$ pkg-config --modversion bar
2.1.2

To print the link flags needed for each module, use the --libs option.

$ pkg-config --libs foo
-lfoo
$ pkg-config --libs bar
-lbar

Notice that pkg-config has suppressed part of the Libs field for both modules. This is because it treats the -L flag specially and knows that the ${libdir} directory /usr/lib is part of the system linker search path. This keeps pkg-config from interfering with the linker operation.

Also, although foo is required by bar, the link flags for foo are not output. This is because foo is not directly needed by an application that only wants to use the bar library. For statically linking a bar application, we need both sets of linker flags:

$ pkg-config --libs --static bar
-lbar -lfoo

pkg-config needs to output both sets of link flags in this case to ensure that the statically linked application will find all the necessary symbols. On the other hand, it will always output all the Cflags.

$ pkg-config --cflags bar
-I/usr/include/foo
$ pkg-config --cflags --static bar
-I/usr/include/foo

Another useful option, --exists, can be used to test for a module's availability.

$ pkg-config --exists foo
$ echo $?
0

One of the nicest features of pkg-config is providing version checking. It can be used to determine if a sufficient version is available.

$ pkg-config --libs "bar >= 2.7"
Requested 'bar >= 2.7' but version of bar is 2.1.2

Some commands will provide more verbose output when combined with the --print-errors option.

$ pkg-config --exists --print-errors xoxo
Package xoxo was not found in the pkg-config search path.
Perhaps you should add the directory containing `xoxo.pc'
to the PKG_CONFIG_PATH environment variable
No package 'xoxo' found

The message above references the PKG_CONFIG_PATH environment variable. This variable is used to augment pkg-config's search path. On a typical Unix system, it will search in the directories /usr/lib/pkgconfig and /usr/share/pkgconfig. This will usually cover system installed modules. However, some local modules may be installed in a different prefix such as /usr/local. In that case, it's necessary to prepend the search path so that pkg-config can locate the .pc files.

$ pkg-config --modversion hello
Package hello was not found in the pkg-config search path.
Perhaps you should add the directory containing `hello.pc'
to the PKG_CONFIG_PATH environment variable
No package 'hello' found
$ export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
$ pkg-config --modversion hello
1.0.0

A few autoconf macros are also provided to ease integration of pkg-config modules into projects.

  • PKG_PREREQ(MIN-VERSION): Ensures that the version of the pkg-config autoconf macros in use is at least MIN-VERSION.
  • PKG_PROG_PKG_CONFIG([MIN-VERSION]): Locates the pkg-config tool on the system and checks the version for compatibility.
  • PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]): Checks to see whether a particular set of modules exists.
  • PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]): Checks to see whether a particular set of modules exists. If so, it sets <VARIABLE-PREFIX>_CFLAGS and <VARIABLE-PREFIX>_LIBS according to the output from pkg-config --cflags and pkg-config --libs.

Frequently asked questions

  1. My program uses library x. What do I do?
  2. The pkg-config output can easily be used on the compiler command line. Assuming the x library has a x.pc pkg-config file:

    cc `pkg-config --cflags --libs x` -o myapp myapp.c

    The integration can be more robust when used with autoconf and automake. By using the supplied PKG_CHECK_MODULES macro, the metadata is easily accessed in the build process.

    configure.ac:
    PKG_CHECK_MODULES([X], [x])
    
    Makefile.am:
    myapp_CFLAGS = $(X_CFLAGS)
    myapp_LDADD = $(X_LIBS)

    If the x module is found, the macro will fill and substitute the X_CFLAGS and X_LIBS variables. If the module is not found, an error will be produced. Optional 3rd and 4th arguments can be supplied to PKG_CHECK_MODULES to control actions when the module is found or not.

  3. My library z installs header files which include libx headers. What do I put in my z.pc file?
  4. If the x library has pkg-config support, add it to the Requires.private field. If it does not, augment the Cflags field with the necessary compiler flags for using the libx headers. In either case, pkg-config will output the compiler flags when --static is used or not.

  5. My library z uses libx internally, but does not expose libx data types in its public API. What do I put in my z.pc file?
  6. Again, add the module to Requires.private if it supports pkg-config. In this case, the compiler flags will be emitted unnecessarily, but it ensures that the linker flags will be present when linking statically. If libx does not support pkg-config, add the necessary linker flags to Libs.private.


Dan Nicholson <dbn.lists (at) gmail (dot) com>

Copyright (C) 2010 Dan Nicholson.
This document is licensed under the GNU General Public License, Version 2 or any later version.

pkg-config-0.29.1/install-sh0000755000175000017500000003452312601774033012566 00000000000000#!/bin/sh # install - install a program, script, or datafile scriptversion=2013-12-25.23; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # 'make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. tab=' ' nl=' ' IFS=" $tab$nl" # Set DOITPROG to "echo" to test this script. doit=${DOITPROG-} doit_exec=${doit:-exec} # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false is_target_a_directory=possibly usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) is_target_a_directory=always dst_arg=$2 # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac shift;; -T) is_target_a_directory=never;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done # We allow the use of options -d and -T together, by making -d # take the precedence; this is for compatibility with GNU install. if test -n "$dir_arg"; then if test -n "$dst_arg"; then echo "$0: target directory not allowed when installing a directory." >&2 exit 1 fi fi if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call 'install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then if test $# -gt 1 || test "$is_target_a_directory" = always; then if test ! -d "$dst_arg"; then echo "$0: $dst_arg: Is not a directory." >&2 exit 1 fi fi fi if test -z "$dir_arg"; then do_exit='(exit $ret); exit $ret' trap "ret=129; $do_exit" 1 trap "ret=130; $do_exit" 2 trap "ret=141; $do_exit" 13 trap "ret=143; $do_exit" 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names problematic for 'test' and other utilities. case $src in -* | [=\(\)!]) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test "$is_target_a_directory" = never; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else dstdir=`dirname "$dst"` test -d "$dstdir" dstdir_status=$? fi fi obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 if (umask $mkdir_umask && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. ls_ld_tmpdir=`ls -ld "$tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/d" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; [-=\(\)!]*) prefix='./';; *) prefix='';; esac oIFS=$IFS IFS=/ set -f set fnord $dstdir shift set +f IFS=$oIFS prefixes= for d do test X"$d" = X && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # 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: pkg-config-0.29.1/README0000664000175000017500000000504712275467762011462 00000000000000pkg-config is a script to make putting together all the build flags when compiling/linking a lot easier. Report bugs at http://bugzilla.freedesktop.org/ To use pkg-config, do something like the following in your configure.ac PKG_CHECK_MODULES([GNOME], [gtk > 1.2.8 gnomeui >= 1.2.0]) This puts the neccesary include flags to compile/link something against libgnomeui and all its dependencies in $(GNOME_CFLAGS), and the -L/-l flags for linking in $(GNOME_LIBS). Users can define the PKG_CONFIG environment variable to point at the right one, or if they cross-compile and have a correctly named pkg-config (eg. arm-linux-pkg-config) in their PATH that will be used in preference. Users can also define the GNOME_CFLAGS and GNOME_LIBS environment variables if they think they know better, pkg-config will not be called if they do that. The "gtk > 1.2.8" part is only neccesary if you want to specifically check if libgtk is version 1.2.8 or higher. Otherwise, the flags for gtk will be included automatically, since libgnomeui depends on gtk. So you could just say: PKG_CHECK_MODULES([GNOME], [gnomeui]) for any version of gnomeui. For more info, there's even a man page, try 'man pkg-config' Building ======== pkg-config depends on glib. Note that glib build-depends on pkg-config, but you can just set the corresponding environment variables (ZLIB_LIBS, ZLIB_CFLAGS are the only needed ones when this is written) to build it. pkg-config also either needs an earlier version of itself to find glib or you need to set GLIB_CFLAGS and GLIB_LIBS to the correct values for where it's installed in your system. If this requirement is too cumbersome, a bundled copy of a recent glib stable release is included. Pass --with-internal-glib to configure to use this copy. If you're cross-compiling and you need to build the bundled glib, refer to the glib documentation for cross-compiling glib. In short, this will require setting some autoconf cache variables in cases where glib would need to run a program to determine the correct value. See the glib documentation: http://developer.gnome.org/glib/stable/glib-cross-compiling.html If you need to use the bundled glib on Mac OS X, you'll most likely need to build for a single architecture rather than as a universal binary. This is because glib (as of version 2.32) does not support building for multiple architectures out of the box. The glib2 from MacPorts or Homebrew may be available as a universal binary and usable for pkg-config as described above. Nothing in pkg-config itself precludes being built as a universal binary. pkg-config-0.29.1/Makefile.vc0000664000175000017500000000507412651243607012635 00000000000000# Note: This does assume an existing GLib installation! # Visual Studio builds of GLib does not need an existing pkg-config # installation, so build GLib first before using this. # Change these if necessary. If building from GLib's included # Visual Studio projects, this should be able to locate the GLib build # out-of-the-box if they were not moved. GLib's headers will be found # in $(GLIB_PREFIX)\include\glib-2.0 and $(GLIB_PREFIX)\lib\glib-2.0\include # and its import library will be found in $(GLIB_PREFIX)\lib. GLIB_PREFIX = ..\vs$(VSVER)\$(PLAT) # The items below this line should not be changed, unless one is maintaining # the NMake Makefiles. !include detectenv-msvc.mak !if "$(VALID_CFGSET)" == "TRUE" CFLAGS = $(CFLAGS_ADD) /W3 /Zi /FImsvc_recommended_pragmas.h /I. \ /I$(GLIB_PREFIX)\include\glib-2.0 \ /I$(GLIB_PREFIX)\lib\glib-2.0\include # PKG_CONFIG_SYSTEM_INCLUDE_PATH and PKG_CONFIG_SYSTEM_LIBRARY_PATH only # work for GCC builds for now, so just set this to nothing for now pkg_config_CFLAGS = \ $(CFLAGS) \ /DHAVE_CONFIG_H \ /DPKG_CONFIG_SYSTEM_INCLUDE_PATH="\"\"" \ /DPKG_CONFIG_SYSTEM_LIBRARY_PATH="\"\"" LDFLAGS_BASE = $(LDFLAGS_ARCH) /libpath:$(GLIB_PREFIX)\lib /DEBUG NULL= !if "$(CFG)" == "debug" LDFLAGS = $(LDFLAGS_BASE) !else LDFLAGS = $(LDFLAGS_BASE) /opt:ref /LTCG !endif !include Makefile.sources # Convert the source (*.c) listing to object (.obj) listing in # another NMake Makefile module, include it, and clean it up. !if [echo pkg_config_OBJS = \> objs.mak] !endif !if [for %c in ($(pkg_config_SOURCES)) do @if "%~xc" == ".c" echo. ^$(CFG)\^$(PLAT)\pkg-config\%~nc.obj \>> objs.mak] !endif !if [echo. ^$(NULL)>> objs.mak] !endif !include objs.mak !if [del /f /q objs.mak] !endif pkg_config_LIBS = glib-2.0.lib {}.c{$(CFG)\$(PLAT)\pkg-config\}.obj:: $(CC) $(pkg_config_CFLAGS) /Fo$(CFG)\$(PLAT)\pkg-config\ /c @<< $< << all: $(CFG)\$(PLAT)\pkg-config.exe $(CFG)\$(PLAT)\pkg-config.exe: $(CFG)\$(PLAT)\pkg-config config.h $(pkg_config_OBJS) link $(LDFLAGS) $(pkg_config_LIBS) -out:$@ @<< $(pkg_config_OBJS) << @-if exist $@.manifest mt /manifest $@.manifest /outputresource:$@;1 $(CFG)\$(PLAT)\pkg-config: @-mkdir $@ config.h: config.h.win32 @-copy $@.win32 $@ clean: @-del /f /q $(CFG)\$(PLAT)\*.pdb @-del /f /q $(CFG)\$(PLAT)\*.exe.manifest @-del /f /q $(CFG)\$(PLAT)\*.exe @-del /f /q $(CFG)\$(PLAT)\*.ilk @-del /f /q $(CFG)\$(PLAT)\pkg-config\*.obj @-rmdir /s /q $(CFG)\$(PLAT) @-del vc$(VSVER)0.pdb @-del config.h !else all: @echo You need to specify a valid configuration, via @echo CFG=release or CFG=debug !endif pkg-config-0.29.1/compile0000755000175000017500000001624512601774033012141 00000000000000#! /bin/sh # Wrapper for compilers which do not understand '-c -o'. scriptversion=2012-10-14.11; # UTC # Copyright (C) 1999-2014 Free Software Foundation, Inc. # Written by Tom Tromey . # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . nl=' ' # We need space, tab and new line, in precisely that order. Quoting is # there to prevent tools from complaining about whitespace usage. IFS=" "" $nl" file_conv= # func_file_conv build_file lazy # Convert a $build file to $host form and store it in $file # Currently only supports Windows hosts. If the determined conversion # type is listed in (the comma separated) LAZY, no conversion will # take place. func_file_conv () { file=$1 case $file in / | /[!/]*) # absolute file, and not a UNC file if test -z "$file_conv"; then # lazily determine how to convert abs files case `uname -s` in MINGW*) file_conv=mingw ;; CYGWIN*) file_conv=cygwin ;; *) file_conv=wine ;; esac fi case $file_conv/,$2, in *,$file_conv,*) ;; mingw/*) file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` ;; cygwin/*) file=`cygpath -m "$file" || echo "$file"` ;; wine/*) file=`winepath -w "$file" || echo "$file"` ;; esac ;; esac } # func_cl_dashL linkdir # Make cl look for libraries in LINKDIR func_cl_dashL () { func_file_conv "$1" if test -z "$lib_path"; then lib_path=$file else lib_path="$lib_path;$file" fi linker_opts="$linker_opts -LIBPATH:$file" } # func_cl_dashl library # Do a library search-path lookup for cl func_cl_dashl () { lib=$1 found=no save_IFS=$IFS IFS=';' for dir in $lib_path $LIB do IFS=$save_IFS if $shared && test -f "$dir/$lib.dll.lib"; then found=yes lib=$dir/$lib.dll.lib break fi if test -f "$dir/$lib.lib"; then found=yes lib=$dir/$lib.lib break fi if test -f "$dir/lib$lib.a"; then found=yes lib=$dir/lib$lib.a break fi done IFS=$save_IFS if test "$found" != yes; then lib=$lib.lib fi } # func_cl_wrapper cl arg... # Adjust compile command to suit cl func_cl_wrapper () { # Assume a capable shell lib_path= shared=: linker_opts= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. eat=1 case $2 in *.o | *.[oO][bB][jJ]) func_file_conv "$2" set x "$@" -Fo"$file" shift ;; *) func_file_conv "$2" set x "$@" -Fe"$file" shift ;; esac ;; -I) eat=1 func_file_conv "$2" mingw set x "$@" -I"$file" shift ;; -I*) func_file_conv "${1#-I}" mingw set x "$@" -I"$file" shift ;; -l) eat=1 func_cl_dashl "$2" set x "$@" "$lib" shift ;; -l*) func_cl_dashl "${1#-l}" set x "$@" "$lib" shift ;; -L) eat=1 func_cl_dashL "$2" ;; -L*) func_cl_dashL "${1#-L}" ;; -static) shared=false ;; -Wl,*) arg=${1#-Wl,} save_ifs="$IFS"; IFS=',' for flag in $arg; do IFS="$save_ifs" linker_opts="$linker_opts $flag" done IFS="$save_ifs" ;; -Xlinker) eat=1 linker_opts="$linker_opts $2" ;; -*) set x "$@" "$1" shift ;; *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) func_file_conv "$1" set x "$@" -Tp"$file" shift ;; *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) func_file_conv "$1" mingw set x "$@" "$file" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -n "$linker_opts"; then linker_opts="-link$linker_opts" fi exec "$@" $linker_opts exit 1 } eat= case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: compile [--help] [--version] PROGRAM [ARGS] Wrapper for compilers which do not understand '-c -o'. Remove '-o dest.o' from ARGS, run PROGRAM with the remaining arguments, and rename the output as expected. If you are trying to build a whole package this is not the right script to run: please start by reading the file 'INSTALL'. Report bugs to . EOF exit $? ;; -v | --v*) echo "compile $scriptversion" exit $? ;; cl | *[/\\]cl | cl.exe | *[/\\]cl.exe ) func_cl_wrapper "$@" # Doesn't return... ;; esac ofile= cfile= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. # So we strip '-o arg' only if arg is an object. eat=1 case $2 in *.o | *.obj) ofile=$2 ;; *) set x "$@" -o "$2" shift ;; esac ;; *.c) cfile=$1 set x "$@" "$1" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -z "$ofile" || test -z "$cfile"; then # If no '-o' option was seen then we might have been invoked from a # pattern rule where we don't need one. That is ok -- this is a # normal compilation that the losing compiler can handle. If no # '.c' file was seen then we are probably linking. That is also # ok. exec "$@" fi # Name of file we expect compiler to create. cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` # Create the lock directory. # Note: use '[/\\:.-]' here to ensure that we don't use the same name # that we are using for the .o file. Also, base the name on the expected # object file name, since that is what matters with a parallel build. lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d while true; do if mkdir "$lockdir" >/dev/null 2>&1; then break fi sleep 1 done # FIXME: race condition here if user kills between mkdir and trap. trap "rmdir '$lockdir'; exit 1" 1 2 15 # Run the compile. "$@" ret=$? if test -f "$cofile"; then test "$cofile" = "$ofile" || mv "$cofile" "$ofile" elif test -f "${cofile}bj"; then test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" fi rmdir "$lockdir" exit $ret # 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: pkg-config-0.29.1/ltmain.sh0000644000175000017500000117077112650726036012415 00000000000000#! /bin/sh ## DO NOT EDIT - This file generated from ./build-aux/ltmain.in ## by inline-source v2014-01-03.01 # libtool (GNU libtool) 2.4.6 # Provide generalized library-building support services. # Written by Gordon Matzigkeit , 1996 # Copyright (C) 1996-2015 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. # GNU Libtool 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 of the License, or # (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that 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, see . PROGRAM=libtool PACKAGE=libtool VERSION=2.4.6 package_revision=2.4.6 ## ------ ## ## Usage. ## ## ------ ## # Run './libtool --help' for help with using this script from the # command line. ## ------------------------------- ## ## User overridable command paths. ## ## ------------------------------- ## # After configure completes, it has a better idea of some of the # shell tools we need than the defaults used by the functions shared # with bootstrap, so set those here where they can still be over- # ridden by the user, but otherwise take precedence. : ${AUTOCONF="autoconf"} : ${AUTOMAKE="automake"} ## -------------------------- ## ## Source external libraries. ## ## -------------------------- ## # Much of our low-level functionality needs to be sourced from external # libraries, which are installed to $pkgauxdir. # Set a version string for this script. scriptversion=2015-01-20.17; # UTC # General shell script boiler plate, and helper functions. # Written by Gary V. Vaughan, 2004 # Copyright (C) 2004-2015 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. # 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 3 of the License, or # (at your option) any later version. # As a special exception to the GNU General Public License, if you distribute # this file as part of a program or library that is built using GNU Libtool, # you may include this file under the same distribution terms that you use # for the rest of that program. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNES 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, see . # Please report bugs or propose patches to gary@gnu.org. ## ------ ## ## Usage. ## ## ------ ## # Evaluate this file near the top of your script to gain access to # the functions and variables defined here: # # . `echo "$0" | ${SED-sed} 's|[^/]*$||'`/build-aux/funclib.sh # # If you need to override any of the default environment variable # settings, do that before evaluating this file. ## -------------------- ## ## Shell normalisation. ## ## -------------------- ## # Some shells need a little help to be as Bourne compatible as possible. # Before doing anything else, make sure all that help has been provided! DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac fi # NLS nuisances: We save the old values in case they are required later. _G_user_locale= _G_safe_locale= for _G_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test set = \"\${$_G_var+set}\"; then save_$_G_var=\$$_G_var $_G_var=C export $_G_var _G_user_locale=\"$_G_var=\\\$save_\$_G_var; \$_G_user_locale\" _G_safe_locale=\"$_G_var=C; \$_G_safe_locale\" fi" done # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Make sure IFS has a sensible default sp=' ' nl=' ' IFS="$sp $nl" # There are apparently some retarded systems that use ';' as a PATH separator! if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi ## ------------------------- ## ## Locate command utilities. ## ## ------------------------- ## # func_executable_p FILE # ---------------------- # Check that FILE is an executable regular file. func_executable_p () { test -f "$1" && test -x "$1" } # func_path_progs PROGS_LIST CHECK_FUNC [PATH] # -------------------------------------------- # Search for either a program that responds to --version with output # containing "GNU", or else returned by CHECK_FUNC otherwise, by # trying all the directories in PATH with each of the elements of # PROGS_LIST. # # CHECK_FUNC should accept the path to a candidate program, and # set $func_check_prog_result if it truncates its output less than # $_G_path_prog_max characters. func_path_progs () { _G_progs_list=$1 _G_check_func=$2 _G_PATH=${3-"$PATH"} _G_path_prog_max=0 _G_path_prog_found=false _G_save_IFS=$IFS; IFS=${PATH_SEPARATOR-:} for _G_dir in $_G_PATH; do IFS=$_G_save_IFS test -z "$_G_dir" && _G_dir=. for _G_prog_name in $_G_progs_list; do for _exeext in '' .EXE; do _G_path_prog=$_G_dir/$_G_prog_name$_exeext func_executable_p "$_G_path_prog" || continue case `"$_G_path_prog" --version 2>&1` in *GNU*) func_path_progs_result=$_G_path_prog _G_path_prog_found=: ;; *) $_G_check_func $_G_path_prog func_path_progs_result=$func_check_prog_result ;; esac $_G_path_prog_found && break 3 done done done IFS=$_G_save_IFS test -z "$func_path_progs_result" && { echo "no acceptable sed could be found in \$PATH" >&2 exit 1 } } # We want to be able to use the functions in this file before configure # has figured out where the best binaries are kept, which means we have # to search for them ourselves - except when the results are already set # where we skip the searches. # Unless the user overrides by setting SED, search the path for either GNU # sed, or the sed that truncates its output the least. test -z "$SED" && { _G_sed_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for _G_i in 1 2 3 4 5 6 7; do _G_sed_script=$_G_sed_script$nl$_G_sed_script done echo "$_G_sed_script" 2>/dev/null | sed 99q >conftest.sed _G_sed_script= func_check_prog_sed () { _G_path_prog=$1 _G_count=0 printf 0123456789 >conftest.in while : do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo '' >> conftest.nl "$_G_path_prog" -f conftest.sed conftest.out 2>/dev/null || break diff conftest.out conftest.nl >/dev/null 2>&1 || break _G_count=`expr $_G_count + 1` if test "$_G_count" -gt "$_G_path_prog_max"; then # Best one so far, save it but keep looking for a better one func_check_prog_result=$_G_path_prog _G_path_prog_max=$_G_count fi # 10*(2^10) chars as input seems more than enough test 10 -lt "$_G_count" && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out } func_path_progs "sed gsed" func_check_prog_sed $PATH:/usr/xpg4/bin rm -f conftest.sed SED=$func_path_progs_result } # Unless the user overrides by setting GREP, search the path for either GNU # grep, or the grep that truncates its output the least. test -z "$GREP" && { func_check_prog_grep () { _G_path_prog=$1 _G_count=0 _G_path_prog_max=0 printf 0123456789 >conftest.in while : do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo 'GREP' >> conftest.nl "$_G_path_prog" -e 'GREP$' -e '-(cannot match)-' conftest.out 2>/dev/null || break diff conftest.out conftest.nl >/dev/null 2>&1 || break _G_count=`expr $_G_count + 1` if test "$_G_count" -gt "$_G_path_prog_max"; then # Best one so far, save it but keep looking for a better one func_check_prog_result=$_G_path_prog _G_path_prog_max=$_G_count fi # 10*(2^10) chars as input seems more than enough test 10 -lt "$_G_count" && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out } func_path_progs "grep ggrep" func_check_prog_grep $PATH:/usr/xpg4/bin GREP=$func_path_progs_result } ## ------------------------------- ## ## User overridable command paths. ## ## ------------------------------- ## # All uppercase variable names are used for environment variables. These # variables can be overridden by the user before calling a script that # uses them if a suitable command of that name is not already available # in the command search PATH. : ${CP="cp -f"} : ${ECHO="printf %s\n"} : ${EGREP="$GREP -E"} : ${FGREP="$GREP -F"} : ${LN_S="ln -s"} : ${MAKE="make"} : ${MKDIR="mkdir"} : ${MV="mv -f"} : ${RM="rm -f"} : ${SHELL="${CONFIG_SHELL-/bin/sh}"} ## -------------------- ## ## Useful sed snippets. ## ## -------------------- ## sed_dirname='s|/[^/]*$||' sed_basename='s|^.*/||' # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. sed_quote_subst='s|\([`"$\\]\)|\\\1|g' # Same as above, but do not quote variable references. sed_double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution that turns a string into a regex matching for the # string literally. sed_make_literal_regex='s|[].[^$\\*\/]|\\&|g' # Sed substitution that converts a w32 file name or path # that contains forward slashes, into one that contains # (escaped) backslashes. A very naive implementation. sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' # Re-'\' parameter expansions in output of sed_double_quote_subst that # were '\'-ed in input to the same. If an odd number of '\' preceded a # '$' in input to sed_double_quote_subst, that '$' was protected from # expansion. Since each input '\' is now two '\'s, look for any number # of runs of four '\'s followed by two '\'s and then a '$'. '\' that '$'. _G_bs='\\' _G_bs2='\\\\' _G_bs4='\\\\\\\\' _G_dollar='\$' sed_double_backslash="\ s/$_G_bs4/&\\ /g s/^$_G_bs2$_G_dollar/$_G_bs&/ s/\\([^$_G_bs]\\)$_G_bs2$_G_dollar/\\1$_G_bs2$_G_bs$_G_dollar/g s/\n//g" ## ----------------- ## ## Global variables. ## ## ----------------- ## # Except for the global variables explicitly listed below, the following # functions in the '^func_' namespace, and the '^require_' namespace # variables initialised in the 'Resource management' section, sourcing # this file will not pollute your global namespace with anything # else. There's no portable way to scope variables in Bourne shell # though, so actually running these functions will sometimes place # results into a variable named after the function, and often use # temporary variables in the '^_G_' namespace. If you are careful to # avoid using those namespaces casually in your sourcing script, things # should continue to work as you expect. And, of course, you can freely # overwrite any of the functions or variables defined here before # calling anything to customize them. EXIT_SUCCESS=0 EXIT_FAILURE=1 EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. # Allow overriding, eg assuming that you follow the convention of # putting '$debug_cmd' at the start of all your functions, you can get # bash to show function call trace with: # # debug_cmd='eval echo "${FUNCNAME[0]} $*" >&2' bash your-script-name debug_cmd=${debug_cmd-":"} exit_cmd=: # By convention, finish your script with: # # exit $exit_status # # so that you can set exit_status to non-zero if you want to indicate # something went wrong during execution without actually bailing out at # the point of failure. exit_status=$EXIT_SUCCESS # Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh # is ksh but when the shell is invoked as "sh" and the current value of # the _XPG environment variable is not equal to 1 (one), the special # positional parameter $0, within a function call, is the name of the # function. progpath=$0 # The name of this program. progname=`$ECHO "$progpath" |$SED "$sed_basename"` # Make sure we have an absolute progpath for reexecution: case $progpath in [\\/]*|[A-Za-z]:\\*) ;; *[\\/]*) progdir=`$ECHO "$progpath" |$SED "$sed_dirname"` progdir=`cd "$progdir" && pwd` progpath=$progdir/$progname ;; *) _G_IFS=$IFS IFS=${PATH_SEPARATOR-:} for progdir in $PATH; do IFS=$_G_IFS test -x "$progdir/$progname" && break done IFS=$_G_IFS test -n "$progdir" || progdir=`pwd` progpath=$progdir/$progname ;; esac ## ----------------- ## ## Standard options. ## ## ----------------- ## # The following options affect the operation of the functions defined # below, and should be set appropriately depending on run-time para- # meters passed on the command line. opt_dry_run=false opt_quiet=false opt_verbose=false # Categories 'all' and 'none' are always available. Append any others # you will pass as the first argument to func_warning from your own # code. warning_categories= # By default, display warnings according to 'opt_warning_types'. Set # 'warning_func' to ':' to elide all warnings, or func_fatal_error to # treat the next displayed warning as a fatal error. warning_func=func_warn_and_continue # Set to 'all' to display all warnings, 'none' to suppress all # warnings, or a space delimited list of some subset of # 'warning_categories' to display only the listed warnings. opt_warning_types=all ## -------------------- ## ## Resource management. ## ## -------------------- ## # This section contains definitions for functions that each ensure a # particular resource (a file, or a non-empty configuration variable for # example) is available, and if appropriate to extract default values # from pertinent package files. Call them using their associated # 'require_*' variable to ensure that they are executed, at most, once. # # It's entirely deliberate that calling these functions can set # variables that don't obey the namespace limitations obeyed by the rest # of this file, in order that that they be as useful as possible to # callers. # require_term_colors # ------------------- # Allow display of bold text on terminals that support it. require_term_colors=func_require_term_colors func_require_term_colors () { $debug_cmd test -t 1 && { # COLORTERM and USE_ANSI_COLORS environment variables take # precedence, because most terminfo databases neglect to describe # whether color sequences are supported. test -n "${COLORTERM+set}" && : ${USE_ANSI_COLORS="1"} if test 1 = "$USE_ANSI_COLORS"; then # Standard ANSI escape sequences tc_reset='' tc_bold=''; tc_standout='' tc_red=''; tc_green='' tc_blue=''; tc_cyan='' else # Otherwise trust the terminfo database after all. test -n "`tput sgr0 2>/dev/null`" && { tc_reset=`tput sgr0` test -n "`tput bold 2>/dev/null`" && tc_bold=`tput bold` tc_standout=$tc_bold test -n "`tput smso 2>/dev/null`" && tc_standout=`tput smso` test -n "`tput setaf 1 2>/dev/null`" && tc_red=`tput setaf 1` test -n "`tput setaf 2 2>/dev/null`" && tc_green=`tput setaf 2` test -n "`tput setaf 4 2>/dev/null`" && tc_blue=`tput setaf 4` test -n "`tput setaf 5 2>/dev/null`" && tc_cyan=`tput setaf 5` } fi } require_term_colors=: } ## ----------------- ## ## Function library. ## ## ----------------- ## # This section contains a variety of useful functions to call in your # scripts. Take note of the portable wrappers for features provided by # some modern shells, which will fall back to slower equivalents on # less featureful shells. # func_append VAR VALUE # --------------------- # Append VALUE onto the existing contents of VAR. # We should try to minimise forks, especially on Windows where they are # unreasonably slow, so skip the feature probes when bash or zsh are # being used: if test set = "${BASH_VERSION+set}${ZSH_VERSION+set}"; then : ${_G_HAVE_ARITH_OP="yes"} : ${_G_HAVE_XSI_OPS="yes"} # The += operator was introduced in bash 3.1 case $BASH_VERSION in [12].* | 3.0 | 3.0*) ;; *) : ${_G_HAVE_PLUSEQ_OP="yes"} ;; esac fi # _G_HAVE_PLUSEQ_OP # Can be empty, in which case the shell is probed, "yes" if += is # useable or anything else if it does not work. test -z "$_G_HAVE_PLUSEQ_OP" \ && (eval 'x=a; x+=" b"; test "a b" = "$x"') 2>/dev/null \ && _G_HAVE_PLUSEQ_OP=yes if test yes = "$_G_HAVE_PLUSEQ_OP" then # This is an XSI compatible shell, allowing a faster implementation... eval 'func_append () { $debug_cmd eval "$1+=\$2" }' else # ...otherwise fall back to using expr, which is often a shell builtin. func_append () { $debug_cmd eval "$1=\$$1\$2" } fi # func_append_quoted VAR VALUE # ---------------------------- # Quote VALUE and append to the end of shell variable VAR, separated # by a space. if test yes = "$_G_HAVE_PLUSEQ_OP"; then eval 'func_append_quoted () { $debug_cmd func_quote_for_eval "$2" eval "$1+=\\ \$func_quote_for_eval_result" }' else func_append_quoted () { $debug_cmd func_quote_for_eval "$2" eval "$1=\$$1\\ \$func_quote_for_eval_result" } fi # func_append_uniq VAR VALUE # -------------------------- # Append unique VALUE onto the existing contents of VAR, assuming # entries are delimited by the first character of VALUE. For example: # # func_append_uniq options " --another-option option-argument" # # will only append to $options if " --another-option option-argument " # is not already present somewhere in $options already (note spaces at # each end implied by leading space in second argument). func_append_uniq () { $debug_cmd eval _G_current_value='`$ECHO $'$1'`' _G_delim=`expr "$2" : '\(.\)'` case $_G_delim$_G_current_value$_G_delim in *"$2$_G_delim"*) ;; *) func_append "$@" ;; esac } # func_arith TERM... # ------------------ # Set func_arith_result to the result of evaluating TERMs. test -z "$_G_HAVE_ARITH_OP" \ && (eval 'test 2 = $(( 1 + 1 ))') 2>/dev/null \ && _G_HAVE_ARITH_OP=yes if test yes = "$_G_HAVE_ARITH_OP"; then eval 'func_arith () { $debug_cmd func_arith_result=$(( $* )) }' else func_arith () { $debug_cmd func_arith_result=`expr "$@"` } fi # func_basename FILE # ------------------ # Set func_basename_result to FILE with everything up to and including # the last / stripped. if test yes = "$_G_HAVE_XSI_OPS"; then # If this shell supports suffix pattern removal, then use it to avoid # forking. Hide the definitions single quotes in case the shell chokes # on unsupported syntax... _b='func_basename_result=${1##*/}' _d='case $1 in */*) func_dirname_result=${1%/*}$2 ;; * ) func_dirname_result=$3 ;; esac' else # ...otherwise fall back to using sed. _b='func_basename_result=`$ECHO "$1" |$SED "$sed_basename"`' _d='func_dirname_result=`$ECHO "$1" |$SED "$sed_dirname"` if test "X$func_dirname_result" = "X$1"; then func_dirname_result=$3 else func_append func_dirname_result "$2" fi' fi eval 'func_basename () { $debug_cmd '"$_b"' }' # func_dirname FILE APPEND NONDIR_REPLACEMENT # ------------------------------------------- # Compute the dirname of FILE. If nonempty, add APPEND to the result, # otherwise set result to NONDIR_REPLACEMENT. eval 'func_dirname () { $debug_cmd '"$_d"' }' # func_dirname_and_basename FILE APPEND NONDIR_REPLACEMENT # -------------------------------------------------------- # Perform func_basename and func_dirname in a single function # call: # dirname: Compute the dirname of FILE. If nonempty, # add APPEND to the result, otherwise set result # to NONDIR_REPLACEMENT. # value returned in "$func_dirname_result" # basename: Compute filename of FILE. # value retuned in "$func_basename_result" # For efficiency, we do not delegate to the functions above but instead # duplicate the functionality here. eval 'func_dirname_and_basename () { $debug_cmd '"$_b"' '"$_d"' }' # func_echo ARG... # ---------------- # Echo program name prefixed message. func_echo () { $debug_cmd _G_message=$* func_echo_IFS=$IFS IFS=$nl for _G_line in $_G_message; do IFS=$func_echo_IFS $ECHO "$progname: $_G_line" done IFS=$func_echo_IFS } # func_echo_all ARG... # -------------------- # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } # func_echo_infix_1 INFIX ARG... # ------------------------------ # Echo program name, followed by INFIX on the first line, with any # additional lines not showing INFIX. func_echo_infix_1 () { $debug_cmd $require_term_colors _G_infix=$1; shift _G_indent=$_G_infix _G_prefix="$progname: $_G_infix: " _G_message=$* # Strip color escape sequences before counting printable length for _G_tc in "$tc_reset" "$tc_bold" "$tc_standout" "$tc_red" "$tc_green" "$tc_blue" "$tc_cyan" do test -n "$_G_tc" && { _G_esc_tc=`$ECHO "$_G_tc" | $SED "$sed_make_literal_regex"` _G_indent=`$ECHO "$_G_indent" | $SED "s|$_G_esc_tc||g"` } done _G_indent="$progname: "`echo "$_G_indent" | $SED 's|.| |g'`" " ## exclude from sc_prohibit_nested_quotes func_echo_infix_1_IFS=$IFS IFS=$nl for _G_line in $_G_message; do IFS=$func_echo_infix_1_IFS $ECHO "$_G_prefix$tc_bold$_G_line$tc_reset" >&2 _G_prefix=$_G_indent done IFS=$func_echo_infix_1_IFS } # func_error ARG... # ----------------- # Echo program name prefixed message to standard error. func_error () { $debug_cmd $require_term_colors func_echo_infix_1 " $tc_standout${tc_red}error$tc_reset" "$*" >&2 } # func_fatal_error ARG... # ----------------------- # Echo program name prefixed message to standard error, and exit. func_fatal_error () { $debug_cmd func_error "$*" exit $EXIT_FAILURE } # func_grep EXPRESSION FILENAME # ----------------------------- # Check whether EXPRESSION matches any line of FILENAME, without output. func_grep () { $debug_cmd $GREP "$1" "$2" >/dev/null 2>&1 } # func_len STRING # --------------- # Set func_len_result to the length of STRING. STRING may not # start with a hyphen. test -z "$_G_HAVE_XSI_OPS" \ && (eval 'x=a/b/c; test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ && _G_HAVE_XSI_OPS=yes if test yes = "$_G_HAVE_XSI_OPS"; then eval 'func_len () { $debug_cmd func_len_result=${#1} }' else func_len () { $debug_cmd func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len` } fi # func_mkdir_p DIRECTORY-PATH # --------------------------- # Make sure the entire path to DIRECTORY-PATH is available. func_mkdir_p () { $debug_cmd _G_directory_path=$1 _G_dir_list= if test -n "$_G_directory_path" && test : != "$opt_dry_run"; then # Protect directory names starting with '-' case $_G_directory_path in -*) _G_directory_path=./$_G_directory_path ;; esac # While some portion of DIR does not yet exist... while test ! -d "$_G_directory_path"; do # ...make a list in topmost first order. Use a colon delimited # list incase some portion of path contains whitespace. _G_dir_list=$_G_directory_path:$_G_dir_list # If the last portion added has no slash in it, the list is done case $_G_directory_path in */*) ;; *) break ;; esac # ...otherwise throw away the child directory and loop _G_directory_path=`$ECHO "$_G_directory_path" | $SED -e "$sed_dirname"` done _G_dir_list=`$ECHO "$_G_dir_list" | $SED 's|:*$||'` func_mkdir_p_IFS=$IFS; IFS=: for _G_dir in $_G_dir_list; do IFS=$func_mkdir_p_IFS # mkdir can fail with a 'File exist' error if two processes # try to create one of the directories concurrently. Don't # stop in that case! $MKDIR "$_G_dir" 2>/dev/null || : done IFS=$func_mkdir_p_IFS # Bail out if we (or some other process) failed to create a directory. test -d "$_G_directory_path" || \ func_fatal_error "Failed to create '$1'" fi } # func_mktempdir [BASENAME] # ------------------------- # Make a temporary directory that won't clash with other running # libtool processes, and avoids race conditions if possible. If # given, BASENAME is the basename for that directory. func_mktempdir () { $debug_cmd _G_template=${TMPDIR-/tmp}/${1-$progname} if test : = "$opt_dry_run"; then # Return a directory name, but don't create it in dry-run mode _G_tmpdir=$_G_template-$$ else # If mktemp works, use that first and foremost _G_tmpdir=`mktemp -d "$_G_template-XXXXXXXX" 2>/dev/null` if test ! -d "$_G_tmpdir"; then # Failing that, at least try and use $RANDOM to avoid a race _G_tmpdir=$_G_template-${RANDOM-0}$$ func_mktempdir_umask=`umask` umask 0077 $MKDIR "$_G_tmpdir" umask $func_mktempdir_umask fi # If we're not in dry-run mode, bomb out on failure test -d "$_G_tmpdir" || \ func_fatal_error "cannot create temporary directory '$_G_tmpdir'" fi $ECHO "$_G_tmpdir" } # func_normal_abspath PATH # ------------------------ # Remove doubled-up and trailing slashes, "." path components, # and cancel out any ".." path components in PATH after making # it an absolute path. func_normal_abspath () { $debug_cmd # These SED scripts presuppose an absolute path with a trailing slash. _G_pathcar='s|^/\([^/]*\).*$|\1|' _G_pathcdr='s|^/[^/]*||' _G_removedotparts=':dotsl s|/\./|/|g t dotsl s|/\.$|/|' _G_collapseslashes='s|/\{1,\}|/|g' _G_finalslash='s|/*$|/|' # Start from root dir and reassemble the path. func_normal_abspath_result= func_normal_abspath_tpath=$1 func_normal_abspath_altnamespace= case $func_normal_abspath_tpath in "") # Empty path, that just means $cwd. func_stripname '' '/' "`pwd`" func_normal_abspath_result=$func_stripname_result return ;; # The next three entries are used to spot a run of precisely # two leading slashes without using negated character classes; # we take advantage of case's first-match behaviour. ///*) # Unusual form of absolute path, do nothing. ;; //*) # Not necessarily an ordinary path; POSIX reserves leading '//' # and for example Cygwin uses it to access remote file shares # over CIFS/SMB, so we conserve a leading double slash if found. func_normal_abspath_altnamespace=/ ;; /*) # Absolute path, do nothing. ;; *) # Relative path, prepend $cwd. func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath ;; esac # Cancel out all the simple stuff to save iterations. We also want # the path to end with a slash for ease of parsing, so make sure # there is one (and only one) here. func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$_G_removedotparts" -e "$_G_collapseslashes" -e "$_G_finalslash"` while :; do # Processed it all yet? if test / = "$func_normal_abspath_tpath"; then # If we ascended to the root using ".." the result may be empty now. if test -z "$func_normal_abspath_result"; then func_normal_abspath_result=/ fi break fi func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$_G_pathcar"` func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$_G_pathcdr"` # Figure out what to do with it case $func_normal_abspath_tcomponent in "") # Trailing empty path component, ignore it. ;; ..) # Parent dir; strip last assembled component from result. func_dirname "$func_normal_abspath_result" func_normal_abspath_result=$func_dirname_result ;; *) # Actual path component, append it. func_append func_normal_abspath_result "/$func_normal_abspath_tcomponent" ;; esac done # Restore leading double-slash if one was found on entry. func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result } # func_notquiet ARG... # -------------------- # Echo program name prefixed message only when not in quiet mode. func_notquiet () { $debug_cmd $opt_quiet || func_echo ${1+"$@"} # A bug in bash halts the script if the last line of a function # fails when set -e is in force, so we need another command to # work around that: : } # func_relative_path SRCDIR DSTDIR # -------------------------------- # Set func_relative_path_result to the relative path from SRCDIR to DSTDIR. func_relative_path () { $debug_cmd func_relative_path_result= func_normal_abspath "$1" func_relative_path_tlibdir=$func_normal_abspath_result func_normal_abspath "$2" func_relative_path_tbindir=$func_normal_abspath_result # Ascend the tree starting from libdir while :; do # check if we have found a prefix of bindir case $func_relative_path_tbindir in $func_relative_path_tlibdir) # found an exact match func_relative_path_tcancelled= break ;; $func_relative_path_tlibdir*) # found a matching prefix func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" func_relative_path_tcancelled=$func_stripname_result if test -z "$func_relative_path_result"; then func_relative_path_result=. fi break ;; *) func_dirname $func_relative_path_tlibdir func_relative_path_tlibdir=$func_dirname_result if test -z "$func_relative_path_tlibdir"; then # Have to descend all the way to the root! func_relative_path_result=../$func_relative_path_result func_relative_path_tcancelled=$func_relative_path_tbindir break fi func_relative_path_result=../$func_relative_path_result ;; esac done # Now calculate path; take care to avoid doubling-up slashes. func_stripname '' '/' "$func_relative_path_result" func_relative_path_result=$func_stripname_result func_stripname '/' '/' "$func_relative_path_tcancelled" if test -n "$func_stripname_result"; then func_append func_relative_path_result "/$func_stripname_result" fi # Normalisation. If bindir is libdir, return '.' else relative path. if test -n "$func_relative_path_result"; then func_stripname './' '' "$func_relative_path_result" func_relative_path_result=$func_stripname_result fi test -n "$func_relative_path_result" || func_relative_path_result=. : } # func_quote_for_eval ARG... # -------------------------- # Aesthetically quote ARGs to be evaled later. # This function returns two values: # i) func_quote_for_eval_result # double-quoted, suitable for a subsequent eval # ii) func_quote_for_eval_unquoted_result # has all characters that are still active within double # quotes backslashified. func_quote_for_eval () { $debug_cmd func_quote_for_eval_unquoted_result= func_quote_for_eval_result= while test 0 -lt $#; do case $1 in *[\\\`\"\$]*) _G_unquoted_arg=`printf '%s\n' "$1" |$SED "$sed_quote_subst"` ;; *) _G_unquoted_arg=$1 ;; esac if test -n "$func_quote_for_eval_unquoted_result"; then func_append func_quote_for_eval_unquoted_result " $_G_unquoted_arg" else func_append func_quote_for_eval_unquoted_result "$_G_unquoted_arg" fi case $_G_unquoted_arg in # Double-quote args containing shell metacharacters to delay # word splitting, command substitution and variable expansion # for a subsequent eval. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") _G_quoted_arg=\"$_G_unquoted_arg\" ;; *) _G_quoted_arg=$_G_unquoted_arg ;; esac if test -n "$func_quote_for_eval_result"; then func_append func_quote_for_eval_result " $_G_quoted_arg" else func_append func_quote_for_eval_result "$_G_quoted_arg" fi shift done } # func_quote_for_expand ARG # ------------------------- # Aesthetically quote ARG to be evaled later; same as above, # but do not quote variable references. func_quote_for_expand () { $debug_cmd case $1 in *[\\\`\"]*) _G_arg=`$ECHO "$1" | $SED \ -e "$sed_double_quote_subst" -e "$sed_double_backslash"` ;; *) _G_arg=$1 ;; esac case $_G_arg in # Double-quote args containing shell metacharacters to delay # word splitting and command substitution for a subsequent eval. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") _G_arg=\"$_G_arg\" ;; esac func_quote_for_expand_result=$_G_arg } # func_stripname PREFIX SUFFIX NAME # --------------------------------- # strip PREFIX and SUFFIX from NAME, and store in func_stripname_result. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). if test yes = "$_G_HAVE_XSI_OPS"; then eval 'func_stripname () { $debug_cmd # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are # positional parameters, so assign one to ordinary variable first. func_stripname_result=$3 func_stripname_result=${func_stripname_result#"$1"} func_stripname_result=${func_stripname_result%"$2"} }' else func_stripname () { $debug_cmd case $2 in .*) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%\\\\$2\$%%"`;; *) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%$2\$%%"`;; esac } fi # func_show_eval CMD [FAIL_EXP] # ----------------------------- # Unless opt_quiet is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. func_show_eval () { $debug_cmd _G_cmd=$1 _G_fail_exp=${2-':'} func_quote_for_expand "$_G_cmd" eval "func_notquiet $func_quote_for_expand_result" $opt_dry_run || { eval "$_G_cmd" _G_status=$? if test 0 -ne "$_G_status"; then eval "(exit $_G_status); $_G_fail_exp" fi } } # func_show_eval_locale CMD [FAIL_EXP] # ------------------------------------ # Unless opt_quiet is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. Use the saved locale for evaluation. func_show_eval_locale () { $debug_cmd _G_cmd=$1 _G_fail_exp=${2-':'} $opt_quiet || { func_quote_for_expand "$_G_cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || { eval "$_G_user_locale $_G_cmd" _G_status=$? eval "$_G_safe_locale" if test 0 -ne "$_G_status"; then eval "(exit $_G_status); $_G_fail_exp" fi } } # func_tr_sh # ---------- # Turn $1 into a string suitable for a shell variable name. # Result is stored in $func_tr_sh_result. All characters # not in the set a-zA-Z0-9_ are replaced with '_'. Further, # if $1 begins with a digit, a '_' is prepended as well. func_tr_sh () { $debug_cmd case $1 in [0-9]* | *[!a-zA-Z0-9_]*) func_tr_sh_result=`$ECHO "$1" | $SED -e 's/^\([0-9]\)/_\1/' -e 's/[^a-zA-Z0-9_]/_/g'` ;; * ) func_tr_sh_result=$1 ;; esac } # func_verbose ARG... # ------------------- # Echo program name prefixed message in verbose mode only. func_verbose () { $debug_cmd $opt_verbose && func_echo "$*" : } # func_warn_and_continue ARG... # ----------------------------- # Echo program name prefixed warning message to standard error. func_warn_and_continue () { $debug_cmd $require_term_colors func_echo_infix_1 "${tc_red}warning$tc_reset" "$*" >&2 } # func_warning CATEGORY ARG... # ---------------------------- # Echo program name prefixed warning message to standard error. Warning # messages can be filtered according to CATEGORY, where this function # elides messages where CATEGORY is not listed in the global variable # 'opt_warning_types'. func_warning () { $debug_cmd # CATEGORY must be in the warning_categories list! case " $warning_categories " in *" $1 "*) ;; *) func_internal_error "invalid warning category '$1'" ;; esac _G_category=$1 shift case " $opt_warning_types " in *" $_G_category "*) $warning_func ${1+"$@"} ;; esac } # func_sort_ver VER1 VER2 # ----------------------- # 'sort -V' is not generally available. # Note this deviates from the version comparison in automake # in that it treats 1.5 < 1.5.0, and treats 1.4.4a < 1.4-p3a # but this should suffice as we won't be specifying old # version formats or redundant trailing .0 in bootstrap.conf. # If we did want full compatibility then we should probably # use m4_version_compare from autoconf. func_sort_ver () { $debug_cmd printf '%s\n%s\n' "$1" "$2" \ | sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n -k 5,5n -k 6,6n -k 7,7n -k 8,8n -k 9,9n } # func_lt_ver PREV CURR # --------------------- # Return true if PREV and CURR are in the correct order according to # func_sort_ver, otherwise false. Use it like this: # # func_lt_ver "$prev_ver" "$proposed_ver" || func_fatal_error "..." func_lt_ver () { $debug_cmd test "x$1" = x`func_sort_ver "$1" "$2" | $SED 1q` } # Local variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC" # time-stamp-time-zone: "UTC" # End: #! /bin/sh # Set a version string for this script. scriptversion=2014-01-07.03; # UTC # A portable, pluggable option parser for Bourne shell. # Written by Gary V. Vaughan, 2010 # Copyright (C) 2010-2015 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. # 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 3 of the License, 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, see . # Please report bugs or propose patches to gary@gnu.org. ## ------ ## ## Usage. ## ## ------ ## # This file is a library for parsing options in your shell scripts along # with assorted other useful supporting features that you can make use # of too. # # For the simplest scripts you might need only: # # #!/bin/sh # . relative/path/to/funclib.sh # . relative/path/to/options-parser # scriptversion=1.0 # func_options ${1+"$@"} # eval set dummy "$func_options_result"; shift # ...rest of your script... # # In order for the '--version' option to work, you will need to have a # suitably formatted comment like the one at the top of this file # starting with '# Written by ' and ending with '# warranty; '. # # For '-h' and '--help' to work, you will also need a one line # description of your script's purpose in a comment directly above the # '# Written by ' line, like the one at the top of this file. # # The default options also support '--debug', which will turn on shell # execution tracing (see the comment above debug_cmd below for another # use), and '--verbose' and the func_verbose function to allow your script # to display verbose messages only when your user has specified # '--verbose'. # # After sourcing this file, you can plug processing for additional # options by amending the variables from the 'Configuration' section # below, and following the instructions in the 'Option parsing' # section further down. ## -------------- ## ## Configuration. ## ## -------------- ## # You should override these variables in your script after sourcing this # file so that they reflect the customisations you have added to the # option parser. # The usage line for option parsing errors and the start of '-h' and # '--help' output messages. You can embed shell variables for delayed # expansion at the time the message is displayed, but you will need to # quote other shell meta-characters carefully to prevent them being # expanded when the contents are evaled. usage='$progpath [OPTION]...' # Short help message in response to '-h' and '--help'. Add to this or # override it after sourcing this library to reflect the full set of # options your script accepts. usage_message="\ --debug enable verbose shell tracing -W, --warnings=CATEGORY report the warnings falling in CATEGORY [all] -v, --verbose verbosely report processing --version print version information and exit -h, --help print short or long help message and exit " # Additional text appended to 'usage_message' in response to '--help'. long_help_message=" Warning categories include: 'all' show all warnings 'none' turn off all the warnings 'error' warnings are treated as fatal errors" # Help message printed before fatal option parsing errors. fatal_help="Try '\$progname --help' for more information." ## ------------------------- ## ## Hook function management. ## ## ------------------------- ## # This section contains functions for adding, removing, and running hooks # to the main code. A hook is just a named list of of function, that can # be run in order later on. # func_hookable FUNC_NAME # ----------------------- # Declare that FUNC_NAME will run hooks added with # 'func_add_hook FUNC_NAME ...'. func_hookable () { $debug_cmd func_append hookable_fns " $1" } # func_add_hook FUNC_NAME HOOK_FUNC # --------------------------------- # Request that FUNC_NAME call HOOK_FUNC before it returns. FUNC_NAME must # first have been declared "hookable" by a call to 'func_hookable'. func_add_hook () { $debug_cmd case " $hookable_fns " in *" $1 "*) ;; *) func_fatal_error "'$1' does not accept hook functions." ;; esac eval func_append ${1}_hooks '" $2"' } # func_remove_hook FUNC_NAME HOOK_FUNC # ------------------------------------ # Remove HOOK_FUNC from the list of functions called by FUNC_NAME. func_remove_hook () { $debug_cmd eval ${1}_hooks='`$ECHO "\$'$1'_hooks" |$SED "s| '$2'||"`' } # func_run_hooks FUNC_NAME [ARG]... # --------------------------------- # Run all hook functions registered to FUNC_NAME. # It is assumed that the list of hook functions contains nothing more # than a whitespace-delimited list of legal shell function names, and # no effort is wasted trying to catch shell meta-characters or preserve # whitespace. func_run_hooks () { $debug_cmd case " $hookable_fns " in *" $1 "*) ;; *) func_fatal_error "'$1' does not support hook funcions.n" ;; esac eval _G_hook_fns=\$$1_hooks; shift for _G_hook in $_G_hook_fns; do eval $_G_hook '"$@"' # store returned options list back into positional # parameters for next 'cmd' execution. eval _G_hook_result=\$${_G_hook}_result eval set dummy "$_G_hook_result"; shift done func_quote_for_eval ${1+"$@"} func_run_hooks_result=$func_quote_for_eval_result } ## --------------- ## ## Option parsing. ## ## --------------- ## # In order to add your own option parsing hooks, you must accept the # full positional parameter list in your hook function, remove any # options that you action, and then pass back the remaining unprocessed # options in '_result', escaped suitably for # 'eval'. Like this: # # my_options_prep () # { # $debug_cmd # # # Extend the existing usage message. # usage_message=$usage_message' # -s, --silent don'\''t print informational messages # ' # # func_quote_for_eval ${1+"$@"} # my_options_prep_result=$func_quote_for_eval_result # } # func_add_hook func_options_prep my_options_prep # # # my_silent_option () # { # $debug_cmd # # # Note that for efficiency, we parse as many options as we can # # recognise in a loop before passing the remainder back to the # # caller on the first unrecognised argument we encounter. # while test $# -gt 0; do # opt=$1; shift # case $opt in # --silent|-s) opt_silent=: ;; # # Separate non-argument short options: # -s*) func_split_short_opt "$_G_opt" # set dummy "$func_split_short_opt_name" \ # "-$func_split_short_opt_arg" ${1+"$@"} # shift # ;; # *) set dummy "$_G_opt" "$*"; shift; break ;; # esac # done # # func_quote_for_eval ${1+"$@"} # my_silent_option_result=$func_quote_for_eval_result # } # func_add_hook func_parse_options my_silent_option # # # my_option_validation () # { # $debug_cmd # # $opt_silent && $opt_verbose && func_fatal_help "\ # '--silent' and '--verbose' options are mutually exclusive." # # func_quote_for_eval ${1+"$@"} # my_option_validation_result=$func_quote_for_eval_result # } # func_add_hook func_validate_options my_option_validation # # You'll alse need to manually amend $usage_message to reflect the extra # options you parse. It's preferable to append if you can, so that # multiple option parsing hooks can be added safely. # func_options [ARG]... # --------------------- # All the functions called inside func_options are hookable. See the # individual implementations for details. func_hookable func_options func_options () { $debug_cmd func_options_prep ${1+"$@"} eval func_parse_options \ ${func_options_prep_result+"$func_options_prep_result"} eval func_validate_options \ ${func_parse_options_result+"$func_parse_options_result"} eval func_run_hooks func_options \ ${func_validate_options_result+"$func_validate_options_result"} # save modified positional parameters for caller func_options_result=$func_run_hooks_result } # func_options_prep [ARG]... # -------------------------- # All initialisations required before starting the option parse loop. # Note that when calling hook functions, we pass through the list of # positional parameters. If a hook function modifies that list, and # needs to propogate that back to rest of this script, then the complete # modified list must be put in 'func_run_hooks_result' before # returning. func_hookable func_options_prep func_options_prep () { $debug_cmd # Option defaults: opt_verbose=false opt_warning_types= func_run_hooks func_options_prep ${1+"$@"} # save modified positional parameters for caller func_options_prep_result=$func_run_hooks_result } # func_parse_options [ARG]... # --------------------------- # The main option parsing loop. func_hookable func_parse_options func_parse_options () { $debug_cmd func_parse_options_result= # this just eases exit handling while test $# -gt 0; do # Defer to hook functions for initial option parsing, so they # get priority in the event of reusing an option name. func_run_hooks func_parse_options ${1+"$@"} # Adjust func_parse_options positional parameters to match eval set dummy "$func_run_hooks_result"; shift # Break out of the loop if we already parsed every option. test $# -gt 0 || break _G_opt=$1 shift case $_G_opt in --debug|-x) debug_cmd='set -x' func_echo "enabling shell trace mode" $debug_cmd ;; --no-warnings|--no-warning|--no-warn) set dummy --warnings none ${1+"$@"} shift ;; --warnings|--warning|-W) test $# = 0 && func_missing_arg $_G_opt && break case " $warning_categories $1" in *" $1 "*) # trailing space prevents matching last $1 above func_append_uniq opt_warning_types " $1" ;; *all) opt_warning_types=$warning_categories ;; *none) opt_warning_types=none warning_func=: ;; *error) opt_warning_types=$warning_categories warning_func=func_fatal_error ;; *) func_fatal_error \ "unsupported warning category: '$1'" ;; esac shift ;; --verbose|-v) opt_verbose=: ;; --version) func_version ;; -\?|-h) func_usage ;; --help) func_help ;; # Separate optargs to long options (plugins may need this): --*=*) func_split_equals "$_G_opt" set dummy "$func_split_equals_lhs" \ "$func_split_equals_rhs" ${1+"$@"} shift ;; # Separate optargs to short options: -W*) func_split_short_opt "$_G_opt" set dummy "$func_split_short_opt_name" \ "$func_split_short_opt_arg" ${1+"$@"} shift ;; # Separate non-argument short options: -\?*|-h*|-v*|-x*) func_split_short_opt "$_G_opt" set dummy "$func_split_short_opt_name" \ "-$func_split_short_opt_arg" ${1+"$@"} shift ;; --) break ;; -*) func_fatal_help "unrecognised option: '$_G_opt'" ;; *) set dummy "$_G_opt" ${1+"$@"}; shift; break ;; esac done # save modified positional parameters for caller func_quote_for_eval ${1+"$@"} func_parse_options_result=$func_quote_for_eval_result } # func_validate_options [ARG]... # ------------------------------ # Perform any sanity checks on option settings and/or unconsumed # arguments. func_hookable func_validate_options func_validate_options () { $debug_cmd # Display all warnings if -W was not given. test -n "$opt_warning_types" || opt_warning_types=" $warning_categories" func_run_hooks func_validate_options ${1+"$@"} # Bail if the options were screwed! $exit_cmd $EXIT_FAILURE # save modified positional parameters for caller func_validate_options_result=$func_run_hooks_result } ## ----------------- ## ## Helper functions. ## ## ----------------- ## # This section contains the helper functions used by the rest of the # hookable option parser framework in ascii-betical order. # func_fatal_help ARG... # ---------------------- # Echo program name prefixed message to standard error, followed by # a help hint, and exit. func_fatal_help () { $debug_cmd eval \$ECHO \""Usage: $usage"\" eval \$ECHO \""$fatal_help"\" func_error ${1+"$@"} exit $EXIT_FAILURE } # func_help # --------- # Echo long help message to standard output and exit. func_help () { $debug_cmd func_usage_message $ECHO "$long_help_message" exit 0 } # func_missing_arg ARGNAME # ------------------------ # Echo program name prefixed message to standard error and set global # exit_cmd. func_missing_arg () { $debug_cmd func_error "Missing argument for '$1'." exit_cmd=exit } # func_split_equals STRING # ------------------------ # Set func_split_equals_lhs and func_split_equals_rhs shell variables after # splitting STRING at the '=' sign. test -z "$_G_HAVE_XSI_OPS" \ && (eval 'x=a/b/c; test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ && _G_HAVE_XSI_OPS=yes if test yes = "$_G_HAVE_XSI_OPS" then # This is an XSI compatible shell, allowing a faster implementation... eval 'func_split_equals () { $debug_cmd func_split_equals_lhs=${1%%=*} func_split_equals_rhs=${1#*=} test "x$func_split_equals_lhs" = "x$1" \ && func_split_equals_rhs= }' else # ...otherwise fall back to using expr, which is often a shell builtin. func_split_equals () { $debug_cmd func_split_equals_lhs=`expr "x$1" : 'x\([^=]*\)'` func_split_equals_rhs= test "x$func_split_equals_lhs" = "x$1" \ || func_split_equals_rhs=`expr "x$1" : 'x[^=]*=\(.*\)$'` } fi #func_split_equals # func_split_short_opt SHORTOPT # ----------------------------- # Set func_split_short_opt_name and func_split_short_opt_arg shell # variables after splitting SHORTOPT after the 2nd character. if test yes = "$_G_HAVE_XSI_OPS" then # This is an XSI compatible shell, allowing a faster implementation... eval 'func_split_short_opt () { $debug_cmd func_split_short_opt_arg=${1#??} func_split_short_opt_name=${1%"$func_split_short_opt_arg"} }' else # ...otherwise fall back to using expr, which is often a shell builtin. func_split_short_opt () { $debug_cmd func_split_short_opt_name=`expr "x$1" : 'x-\(.\)'` func_split_short_opt_arg=`expr "x$1" : 'x-.\(.*\)$'` } fi #func_split_short_opt # func_usage # ---------- # Echo short help message to standard output and exit. func_usage () { $debug_cmd func_usage_message $ECHO "Run '$progname --help |${PAGER-more}' for full usage" exit 0 } # func_usage_message # ------------------ # Echo short help message to standard output. func_usage_message () { $debug_cmd eval \$ECHO \""Usage: $usage"\" echo $SED -n 's|^# || /^Written by/{ x;p;x } h /^Written by/q' < "$progpath" echo eval \$ECHO \""$usage_message"\" } # func_version # ------------ # Echo version message to standard output and exit. func_version () { $debug_cmd printf '%s\n' "$progname $scriptversion" $SED -n ' /(C)/!b go :more /\./!{ N s|\n# | | b more } :go /^# Written by /,/# warranty; / { s|^# || s|^# *$|| s|\((C)\)[ 0-9,-]*[ ,-]\([1-9][0-9]* \)|\1 \2| p } /^# Written by / { s|^# || p } /^warranty; /q' < "$progpath" exit $? } # Local variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC" # time-stamp-time-zone: "UTC" # End: # Set a version string. scriptversion='(GNU libtool) 2.4.6' # func_echo ARG... # ---------------- # Libtool also displays the current mode in messages, so override # funclib.sh func_echo with this custom definition. func_echo () { $debug_cmd _G_message=$* func_echo_IFS=$IFS IFS=$nl for _G_line in $_G_message; do IFS=$func_echo_IFS $ECHO "$progname${opt_mode+: $opt_mode}: $_G_line" done IFS=$func_echo_IFS } # func_warning ARG... # ------------------- # Libtool warnings are not categorized, so override funclib.sh # func_warning with this simpler definition. func_warning () { $debug_cmd $warning_func ${1+"$@"} } ## ---------------- ## ## Options parsing. ## ## ---------------- ## # Hook in the functions to make sure our own options are parsed during # the option parsing loop. usage='$progpath [OPTION]... [MODE-ARG]...' # Short help message in response to '-h'. usage_message="Options: --config show all configuration variables --debug enable verbose shell tracing -n, --dry-run display commands without modifying any files --features display basic configuration information and exit --mode=MODE use operation mode MODE --no-warnings equivalent to '-Wnone' --preserve-dup-deps don't remove duplicate dependency libraries --quiet, --silent don't print informational messages --tag=TAG use configuration variables from tag TAG -v, --verbose print more informational messages than default --version print version information -W, --warnings=CATEGORY report the warnings falling in CATEGORY [all] -h, --help, --help-all print short, long, or detailed help message " # Additional text appended to 'usage_message' in response to '--help'. func_help () { $debug_cmd func_usage_message $ECHO "$long_help_message MODE must be one of the following: clean remove files from the build directory compile compile a source file into a libtool object execute automatically set library path, then run a program finish complete the installation of libtool libraries install install libraries or executables link create a library or an executable uninstall remove libraries from an installed directory MODE-ARGS vary depending on the MODE. When passed as first option, '--mode=MODE' may be abbreviated as 'MODE' or a unique abbreviation of that. Try '$progname --help --mode=MODE' for a more detailed description of MODE. When reporting a bug, please describe a test case to reproduce it and include the following information: host-triplet: $host shell: $SHELL compiler: $LTCC compiler flags: $LTCFLAGS linker: $LD (gnu? $with_gnu_ld) version: $progname (GNU libtool) 2.4.6 automake: `($AUTOMAKE --version) 2>/dev/null |$SED 1q` autoconf: `($AUTOCONF --version) 2>/dev/null |$SED 1q` Report bugs to . GNU libtool home page: . General help using GNU software: ." exit 0 } # func_lo2o OBJECT-NAME # --------------------- # Transform OBJECT-NAME from a '.lo' suffix to the platform specific # object suffix. lo2o=s/\\.lo\$/.$objext/ o2lo=s/\\.$objext\$/.lo/ if test yes = "$_G_HAVE_XSI_OPS"; then eval 'func_lo2o () { case $1 in *.lo) func_lo2o_result=${1%.lo}.$objext ;; * ) func_lo2o_result=$1 ;; esac }' # func_xform LIBOBJ-OR-SOURCE # --------------------------- # Transform LIBOBJ-OR-SOURCE from a '.o' or '.c' (or otherwise) # suffix to a '.lo' libtool-object suffix. eval 'func_xform () { func_xform_result=${1%.*}.lo }' else # ...otherwise fall back to using sed. func_lo2o () { func_lo2o_result=`$ECHO "$1" | $SED "$lo2o"` } func_xform () { func_xform_result=`$ECHO "$1" | $SED 's|\.[^.]*$|.lo|'` } fi # func_fatal_configuration ARG... # ------------------------------- # Echo program name prefixed message to standard error, followed by # a configuration failure hint, and exit. func_fatal_configuration () { func__fatal_error ${1+"$@"} \ "See the $PACKAGE documentation for more information." \ "Fatal configuration error." } # func_config # ----------- # Display the configuration for all the tags in this script. func_config () { re_begincf='^# ### BEGIN LIBTOOL' re_endcf='^# ### END LIBTOOL' # Default configuration. $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" # Now print the configurations for the tags. for tagname in $taglist; do $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" done exit $? } # func_features # ------------- # Display the features supported by this script. func_features () { echo "host: $host" if test yes = "$build_libtool_libs"; then echo "enable shared libraries" else echo "disable shared libraries" fi if test yes = "$build_old_libs"; then echo "enable static libraries" else echo "disable static libraries" fi exit $? } # func_enable_tag TAGNAME # ----------------------- # Verify that TAGNAME is valid, and either flag an error and exit, or # enable the TAGNAME tag. We also add TAGNAME to the global $taglist # variable here. func_enable_tag () { # Global variable: tagname=$1 re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" sed_extractcf=/$re_begincf/,/$re_endcf/p # Validate tagname. case $tagname in *[!-_A-Za-z0-9,/]*) func_fatal_error "invalid tag name: $tagname" ;; esac # Don't test for the "default" C tag, as we know it's # there but not specially marked. case $tagname in CC) ;; *) if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then taglist="$taglist $tagname" # Evaluate the configuration. Be careful to quote the path # and the sed script, to avoid splitting on whitespace, but # also don't use non-portable quotes within backquotes within # quotes we have to do it in 2 steps: extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` eval "$extractedcf" else func_error "ignoring unknown tag $tagname" fi ;; esac } # func_check_version_match # ------------------------ # Ensure that we are using m4 macros, and libtool script from the same # release of libtool. func_check_version_match () { if test "$package_revision" != "$macro_revision"; then if test "$VERSION" != "$macro_version"; then if test -z "$macro_version"; then cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from an older release. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from $PACKAGE $macro_version. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF fi else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, $progname: but the definition of this LT_INIT comes from revision $macro_revision. $progname: You should recreate aclocal.m4 with macros from revision $package_revision $progname: of $PACKAGE $VERSION and run autoconf again. _LT_EOF fi exit $EXIT_MISMATCH fi } # libtool_options_prep [ARG]... # ----------------------------- # Preparation for options parsed by libtool. libtool_options_prep () { $debug_mode # Option defaults: opt_config=false opt_dlopen= opt_dry_run=false opt_help=false opt_mode= opt_preserve_dup_deps=false opt_quiet=false nonopt= preserve_args= # Shorthand for --mode=foo, only valid as the first argument case $1 in clean|clea|cle|cl) shift; set dummy --mode clean ${1+"$@"}; shift ;; compile|compil|compi|comp|com|co|c) shift; set dummy --mode compile ${1+"$@"}; shift ;; execute|execut|execu|exec|exe|ex|e) shift; set dummy --mode execute ${1+"$@"}; shift ;; finish|finis|fini|fin|fi|f) shift; set dummy --mode finish ${1+"$@"}; shift ;; install|instal|insta|inst|ins|in|i) shift; set dummy --mode install ${1+"$@"}; shift ;; link|lin|li|l) shift; set dummy --mode link ${1+"$@"}; shift ;; uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) shift; set dummy --mode uninstall ${1+"$@"}; shift ;; esac # Pass back the list of options. func_quote_for_eval ${1+"$@"} libtool_options_prep_result=$func_quote_for_eval_result } func_add_hook func_options_prep libtool_options_prep # libtool_parse_options [ARG]... # --------------------------------- # Provide handling for libtool specific options. libtool_parse_options () { $debug_cmd # Perform our own loop to consume as many options as possible in # each iteration. while test $# -gt 0; do _G_opt=$1 shift case $_G_opt in --dry-run|--dryrun|-n) opt_dry_run=: ;; --config) func_config ;; --dlopen|-dlopen) opt_dlopen="${opt_dlopen+$opt_dlopen }$1" shift ;; --preserve-dup-deps) opt_preserve_dup_deps=: ;; --features) func_features ;; --finish) set dummy --mode finish ${1+"$@"}; shift ;; --help) opt_help=: ;; --help-all) opt_help=': help-all' ;; --mode) test $# = 0 && func_missing_arg $_G_opt && break opt_mode=$1 case $1 in # Valid mode arguments: clean|compile|execute|finish|install|link|relink|uninstall) ;; # Catch anything else as an error *) func_error "invalid argument for $_G_opt" exit_cmd=exit break ;; esac shift ;; --no-silent|--no-quiet) opt_quiet=false func_append preserve_args " $_G_opt" ;; --no-warnings|--no-warning|--no-warn) opt_warning=false func_append preserve_args " $_G_opt" ;; --no-verbose) opt_verbose=false func_append preserve_args " $_G_opt" ;; --silent|--quiet) opt_quiet=: opt_verbose=false func_append preserve_args " $_G_opt" ;; --tag) test $# = 0 && func_missing_arg $_G_opt && break opt_tag=$1 func_append preserve_args " $_G_opt $1" func_enable_tag "$1" shift ;; --verbose|-v) opt_quiet=false opt_verbose=: func_append preserve_args " $_G_opt" ;; # An option not handled by this hook function: *) set dummy "$_G_opt" ${1+"$@"}; shift; break ;; esac done # save modified positional parameters for caller func_quote_for_eval ${1+"$@"} libtool_parse_options_result=$func_quote_for_eval_result } func_add_hook func_parse_options libtool_parse_options # libtool_validate_options [ARG]... # --------------------------------- # Perform any sanity checks on option settings and/or unconsumed # arguments. libtool_validate_options () { # save first non-option argument if test 0 -lt $#; then nonopt=$1 shift fi # preserve --debug test : = "$debug_cmd" || func_append preserve_args " --debug" case $host in # Solaris2 added to fix http://debbugs.gnu.org/cgi/bugreport.cgi?bug=16452 # see also: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59788 *cygwin* | *mingw* | *pw32* | *cegcc* | *solaris2* | *os2*) # don't eliminate duplications in $postdeps and $predeps opt_duplicate_compiler_generated_deps=: ;; *) opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps ;; esac $opt_help || { # Sanity checks first: func_check_version_match test yes != "$build_libtool_libs" \ && test yes != "$build_old_libs" \ && func_fatal_configuration "not configured to build any kind of library" # Darwin sucks eval std_shrext=\"$shrext_cmds\" # Only execute mode is allowed to have -dlopen flags. if test -n "$opt_dlopen" && test execute != "$opt_mode"; then func_error "unrecognized option '-dlopen'" $ECHO "$help" 1>&2 exit $EXIT_FAILURE fi # Change the help message to a mode-specific one. generic_help=$help help="Try '$progname --help --mode=$opt_mode' for more information." } # Pass back the unparsed argument list func_quote_for_eval ${1+"$@"} libtool_validate_options_result=$func_quote_for_eval_result } func_add_hook func_validate_options libtool_validate_options # Process options as early as possible so that --help and --version # can return quickly. func_options ${1+"$@"} eval set dummy "$func_options_result"; shift ## ----------- ## ## Main. ## ## ----------- ## magic='%%%MAGIC variable%%%' magic_exe='%%%MAGIC EXE variable%%%' # Global variables. extracted_archives= extracted_serial=0 # If this variable is set in any of the actions, the command in it # will be execed at the end. This prevents here-documents from being # left over by shells. exec_cmd= # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } # func_generated_by_libtool # True iff stdin has been generated by Libtool. This function is only # a basic sanity check; it will hardly flush out determined imposters. func_generated_by_libtool_p () { $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 } # func_lalib_p file # True iff FILE is a libtool '.la' library or '.lo' object file. # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_lalib_p () { test -f "$1" && $SED -e 4q "$1" 2>/dev/null | func_generated_by_libtool_p } # func_lalib_unsafe_p file # True iff FILE is a libtool '.la' library or '.lo' object file. # This function implements the same check as func_lalib_p without # resorting to external programs. To this end, it redirects stdin and # closes it afterwards, without saving the original file descriptor. # As a safety measure, use it only where a negative result would be # fatal anyway. Works if 'file' does not exist. func_lalib_unsafe_p () { lalib_p=no if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then for lalib_p_l in 1 2 3 4 do read lalib_p_line case $lalib_p_line in \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; esac done exec 0<&5 5<&- fi test yes = "$lalib_p" } # func_ltwrapper_script_p file # True iff FILE is a libtool wrapper script # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_script_p () { test -f "$1" && $lt_truncate_bin < "$1" 2>/dev/null | func_generated_by_libtool_p } # func_ltwrapper_executable_p file # True iff FILE is a libtool wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_executable_p () { func_ltwrapper_exec_suffix= case $1 in *.exe) ;; *) func_ltwrapper_exec_suffix=.exe ;; esac $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 } # func_ltwrapper_scriptname file # Assumes file is an ltwrapper_executable # uses $file to determine the appropriate filename for a # temporary ltwrapper_script. func_ltwrapper_scriptname () { func_dirname_and_basename "$1" "" "." func_stripname '' '.exe' "$func_basename_result" func_ltwrapper_scriptname_result=$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper } # func_ltwrapper_p file # True iff FILE is a libtool wrapper script or wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_p () { func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" } # func_execute_cmds commands fail_cmd # Execute tilde-delimited COMMANDS. # If FAIL_CMD is given, eval that upon failure. # FAIL_CMD may read-access the current command in variable CMD! func_execute_cmds () { $debug_cmd save_ifs=$IFS; IFS='~' for cmd in $1; do IFS=$sp$nl eval cmd=\"$cmd\" IFS=$save_ifs func_show_eval "$cmd" "${2-:}" done IFS=$save_ifs } # func_source file # Source FILE, adding directory component if necessary. # Note that it is not necessary on cygwin/mingw to append a dot to # FILE even if both FILE and FILE.exe exist: automatic-append-.exe # behavior happens only for exec(3), not for open(2)! Also, sourcing # 'FILE.' does not work on cygwin managed mounts. func_source () { $debug_cmd case $1 in */* | *\\*) . "$1" ;; *) . "./$1" ;; esac } # func_resolve_sysroot PATH # Replace a leading = in PATH with a sysroot. Store the result into # func_resolve_sysroot_result func_resolve_sysroot () { func_resolve_sysroot_result=$1 case $func_resolve_sysroot_result in =*) func_stripname '=' '' "$func_resolve_sysroot_result" func_resolve_sysroot_result=$lt_sysroot$func_stripname_result ;; esac } # func_replace_sysroot PATH # If PATH begins with the sysroot, replace it with = and # store the result into func_replace_sysroot_result. func_replace_sysroot () { case $lt_sysroot:$1 in ?*:"$lt_sysroot"*) func_stripname "$lt_sysroot" '' "$1" func_replace_sysroot_result='='$func_stripname_result ;; *) # Including no sysroot. func_replace_sysroot_result=$1 ;; esac } # func_infer_tag arg # Infer tagged configuration to use if any are available and # if one wasn't chosen via the "--tag" command line option. # Only attempt this if the compiler in the base compile # command doesn't match the default compiler. # arg is usually of the form 'gcc ...' func_infer_tag () { $debug_cmd if test -n "$available_tags" && test -z "$tagname"; then CC_quoted= for arg in $CC; do func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` case $@ in # Blanks in the command may have been stripped by the calling shell, # but not from the CC environment variable when configure was run. " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; # Blanks at the start of $base_compile will cause this to fail # if we don't check for them as well. *) for z in $available_tags; do if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then # Evaluate the configuration. eval "`$SED -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" CC_quoted= for arg in $CC; do # Double-quote args containing other shell metacharacters. func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` case "$@ " in " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) # The compiler in the base compile command matches # the one in the tagged configuration. # Assume this is the tagged configuration we want. tagname=$z break ;; esac fi done # If $tagname still isn't set, then no tagged configuration # was found and let the user know that the "--tag" command # line option must be used. if test -z "$tagname"; then func_echo "unable to infer tagged configuration" func_fatal_error "specify a tag with '--tag'" # else # func_verbose "using $tagname tagged configuration" fi ;; esac fi } # func_write_libtool_object output_name pic_name nonpic_name # Create a libtool object file (analogous to a ".la" file), # but don't create it if we're doing a dry run. func_write_libtool_object () { write_libobj=$1 if test yes = "$build_libtool_libs"; then write_lobj=\'$2\' else write_lobj=none fi if test yes = "$build_old_libs"; then write_oldobj=\'$3\' else write_oldobj=none fi $opt_dry_run || { cat >${write_libobj}T </dev/null` if test "$?" -eq 0 && test -n "$func_convert_core_file_wine_to_w32_tmp"; then func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | $SED -e "$sed_naive_backslashify"` else func_convert_core_file_wine_to_w32_result= fi fi } # end: func_convert_core_file_wine_to_w32 # func_convert_core_path_wine_to_w32 ARG # Helper function used by path conversion functions when $build is *nix, and # $host is mingw, cygwin, or some other w32 environment. Relies on a correctly # configured wine environment available, with the winepath program in $build's # $PATH. Assumes ARG has no leading or trailing path separator characters. # # ARG is path to be converted from $build format to win32. # Result is available in $func_convert_core_path_wine_to_w32_result. # Unconvertible file (directory) names in ARG are skipped; if no directory names # are convertible, then the result may be empty. func_convert_core_path_wine_to_w32 () { $debug_cmd # unfortunately, winepath doesn't convert paths, only file names func_convert_core_path_wine_to_w32_result= if test -n "$1"; then oldIFS=$IFS IFS=: for func_convert_core_path_wine_to_w32_f in $1; do IFS=$oldIFS func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" if test -n "$func_convert_core_file_wine_to_w32_result"; then if test -z "$func_convert_core_path_wine_to_w32_result"; then func_convert_core_path_wine_to_w32_result=$func_convert_core_file_wine_to_w32_result else func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" fi fi done IFS=$oldIFS fi } # end: func_convert_core_path_wine_to_w32 # func_cygpath ARGS... # Wrapper around calling the cygpath program via LT_CYGPATH. This is used when # when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) # $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or # (2), returns the Cygwin file name or path in func_cygpath_result (input # file name or path is assumed to be in w32 format, as previously converted # from $build's *nix or MSYS format). In case (3), returns the w32 file name # or path in func_cygpath_result (input file name or path is assumed to be in # Cygwin format). Returns an empty string on error. # # ARGS are passed to cygpath, with the last one being the file name or path to # be converted. # # Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH # environment variable; do not put it in $PATH. func_cygpath () { $debug_cmd if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` if test "$?" -ne 0; then # on failure, ensure result is empty func_cygpath_result= fi else func_cygpath_result= func_error "LT_CYGPATH is empty or specifies non-existent file: '$LT_CYGPATH'" fi } #end: func_cygpath # func_convert_core_msys_to_w32 ARG # Convert file name or path ARG from MSYS format to w32 format. Return # result in func_convert_core_msys_to_w32_result. func_convert_core_msys_to_w32 () { $debug_cmd # awkward: cmd appends spaces to result func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | $SED -e 's/[ ]*$//' -e "$sed_naive_backslashify"` } #end: func_convert_core_msys_to_w32 # func_convert_file_check ARG1 ARG2 # Verify that ARG1 (a file name in $build format) was converted to $host # format in ARG2. Otherwise, emit an error message, but continue (resetting # func_to_host_file_result to ARG1). func_convert_file_check () { $debug_cmd if test -z "$2" && test -n "$1"; then func_error "Could not determine host file name corresponding to" func_error " '$1'" func_error "Continuing, but uninstalled executables may not work." # Fallback: func_to_host_file_result=$1 fi } # end func_convert_file_check # func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH # Verify that FROM_PATH (a path in $build format) was converted to $host # format in TO_PATH. Otherwise, emit an error message, but continue, resetting # func_to_host_file_result to a simplistic fallback value (see below). func_convert_path_check () { $debug_cmd if test -z "$4" && test -n "$3"; then func_error "Could not determine the host path corresponding to" func_error " '$3'" func_error "Continuing, but uninstalled executables may not work." # Fallback. This is a deliberately simplistic "conversion" and # should not be "improved". See libtool.info. if test "x$1" != "x$2"; then lt_replace_pathsep_chars="s|$1|$2|g" func_to_host_path_result=`echo "$3" | $SED -e "$lt_replace_pathsep_chars"` else func_to_host_path_result=$3 fi fi } # end func_convert_path_check # func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG # Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT # and appending REPL if ORIG matches BACKPAT. func_convert_path_front_back_pathsep () { $debug_cmd case $4 in $1 ) func_to_host_path_result=$3$func_to_host_path_result ;; esac case $4 in $2 ) func_append func_to_host_path_result "$3" ;; esac } # end func_convert_path_front_back_pathsep ################################################## # $build to $host FILE NAME CONVERSION FUNCTIONS # ################################################## # invoked via '$to_host_file_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # Result will be available in $func_to_host_file_result. # func_to_host_file ARG # Converts the file name ARG from $build format to $host format. Return result # in func_to_host_file_result. func_to_host_file () { $debug_cmd $to_host_file_cmd "$1" } # end func_to_host_file # func_to_tool_file ARG LAZY # converts the file name ARG from $build format to toolchain format. Return # result in func_to_tool_file_result. If the conversion in use is listed # in (the comma separated) LAZY, no conversion takes place. func_to_tool_file () { $debug_cmd case ,$2, in *,"$to_tool_file_cmd",*) func_to_tool_file_result=$1 ;; *) $to_tool_file_cmd "$1" func_to_tool_file_result=$func_to_host_file_result ;; esac } # end func_to_tool_file # func_convert_file_noop ARG # Copy ARG to func_to_host_file_result. func_convert_file_noop () { func_to_host_file_result=$1 } # end func_convert_file_noop # func_convert_file_msys_to_w32 ARG # Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_file_result. func_convert_file_msys_to_w32 () { $debug_cmd func_to_host_file_result=$1 if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_to_host_file_result=$func_convert_core_msys_to_w32_result fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_w32 # func_convert_file_cygwin_to_w32 ARG # Convert file name ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_file_cygwin_to_w32 () { $debug_cmd func_to_host_file_result=$1 if test -n "$1"; then # because $build is cygwin, we call "the" cygpath in $PATH; no need to use # LT_CYGPATH in this case. func_to_host_file_result=`cygpath -m "$1"` fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_cygwin_to_w32 # func_convert_file_nix_to_w32 ARG # Convert file name ARG from *nix to w32 format. Requires a wine environment # and a working winepath. Returns result in func_to_host_file_result. func_convert_file_nix_to_w32 () { $debug_cmd func_to_host_file_result=$1 if test -n "$1"; then func_convert_core_file_wine_to_w32 "$1" func_to_host_file_result=$func_convert_core_file_wine_to_w32_result fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_w32 # func_convert_file_msys_to_cygwin ARG # Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_file_msys_to_cygwin () { $debug_cmd func_to_host_file_result=$1 if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_cygpath -u "$func_convert_core_msys_to_w32_result" func_to_host_file_result=$func_cygpath_result fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_cygwin # func_convert_file_nix_to_cygwin ARG # Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed # in a wine environment, working winepath, and LT_CYGPATH set. Returns result # in func_to_host_file_result. func_convert_file_nix_to_cygwin () { $debug_cmd func_to_host_file_result=$1 if test -n "$1"; then # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. func_convert_core_file_wine_to_w32 "$1" func_cygpath -u "$func_convert_core_file_wine_to_w32_result" func_to_host_file_result=$func_cygpath_result fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_cygwin ############################################# # $build to $host PATH CONVERSION FUNCTIONS # ############################################# # invoked via '$to_host_path_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # The result will be available in $func_to_host_path_result. # # Path separators are also converted from $build format to $host format. If # ARG begins or ends with a path separator character, it is preserved (but # converted to $host format) on output. # # All path conversion functions are named using the following convention: # file name conversion function : func_convert_file_X_to_Y () # path conversion function : func_convert_path_X_to_Y () # where, for any given $build/$host combination the 'X_to_Y' value is the # same. If conversion functions are added for new $build/$host combinations, # the two new functions must follow this pattern, or func_init_to_host_path_cmd # will break. # func_init_to_host_path_cmd # Ensures that function "pointer" variable $to_host_path_cmd is set to the # appropriate value, based on the value of $to_host_file_cmd. to_host_path_cmd= func_init_to_host_path_cmd () { $debug_cmd if test -z "$to_host_path_cmd"; then func_stripname 'func_convert_file_' '' "$to_host_file_cmd" to_host_path_cmd=func_convert_path_$func_stripname_result fi } # func_to_host_path ARG # Converts the path ARG from $build format to $host format. Return result # in func_to_host_path_result. func_to_host_path () { $debug_cmd func_init_to_host_path_cmd $to_host_path_cmd "$1" } # end func_to_host_path # func_convert_path_noop ARG # Copy ARG to func_to_host_path_result. func_convert_path_noop () { func_to_host_path_result=$1 } # end func_convert_path_noop # func_convert_path_msys_to_w32 ARG # Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_path_result. func_convert_path_msys_to_w32 () { $debug_cmd func_to_host_path_result=$1 if test -n "$1"; then # Remove leading and trailing path separator characters from ARG. MSYS # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; # and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result=$func_convert_core_msys_to_w32_result func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_msys_to_w32 # func_convert_path_cygwin_to_w32 ARG # Convert path ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_path_cygwin_to_w32 () { $debug_cmd func_to_host_path_result=$1 if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_cygwin_to_w32 # func_convert_path_nix_to_w32 ARG # Convert path ARG from *nix to w32 format. Requires a wine environment and # a working winepath. Returns result in func_to_host_file_result. func_convert_path_nix_to_w32 () { $debug_cmd func_to_host_path_result=$1 if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result=$func_convert_core_path_wine_to_w32_result func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_nix_to_w32 # func_convert_path_msys_to_cygwin ARG # Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_path_msys_to_cygwin () { $debug_cmd func_to_host_path_result=$1 if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_msys_to_w32_result" func_to_host_path_result=$func_cygpath_result func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_msys_to_cygwin # func_convert_path_nix_to_cygwin ARG # Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a # a wine environment, working winepath, and LT_CYGPATH set. Returns result in # func_to_host_file_result. func_convert_path_nix_to_cygwin () { $debug_cmd func_to_host_path_result=$1 if test -n "$1"; then # Remove leading and trailing path separator characters from # ARG. msys behavior is inconsistent here, cygpath turns them # into '.;' and ';.', and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" func_to_host_path_result=$func_cygpath_result func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_nix_to_cygwin # func_dll_def_p FILE # True iff FILE is a Windows DLL '.def' file. # Keep in sync with _LT_DLL_DEF_P in libtool.m4 func_dll_def_p () { $debug_cmd func_dll_def_p_tmp=`$SED -n \ -e 's/^[ ]*//' \ -e '/^\(;.*\)*$/d' \ -e 's/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p' \ -e q \ "$1"` test DEF = "$func_dll_def_p_tmp" } # func_mode_compile arg... func_mode_compile () { $debug_cmd # Get the compilation command and the source file. base_compile= srcfile=$nonopt # always keep a non-empty value in "srcfile" suppress_opt=yes suppress_output= arg_mode=normal libobj= later= pie_flag= for arg do case $arg_mode in arg ) # do not "continue". Instead, add this to base_compile lastarg=$arg arg_mode=normal ;; target ) libobj=$arg arg_mode=normal continue ;; normal ) # Accept any command-line options. case $arg in -o) test -n "$libobj" && \ func_fatal_error "you cannot specify '-o' more than once" arg_mode=target continue ;; -pie | -fpie | -fPIE) func_append pie_flag " $arg" continue ;; -shared | -static | -prefer-pic | -prefer-non-pic) func_append later " $arg" continue ;; -no-suppress) suppress_opt=no continue ;; -Xcompiler) arg_mode=arg # the next one goes into the "base_compile" arg list continue # The current "srcfile" will either be retained or ;; # replaced later. I would guess that would be a bug. -Wc,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result lastarg= save_ifs=$IFS; IFS=, for arg in $args; do IFS=$save_ifs func_append_quoted lastarg "$arg" done IFS=$save_ifs func_stripname ' ' '' "$lastarg" lastarg=$func_stripname_result # Add the arguments to base_compile. func_append base_compile " $lastarg" continue ;; *) # Accept the current argument as the source file. # The previous "srcfile" becomes the current argument. # lastarg=$srcfile srcfile=$arg ;; esac # case $arg ;; esac # case $arg_mode # Aesthetically quote the previous argument. func_append_quoted base_compile "$lastarg" done # for arg case $arg_mode in arg) func_fatal_error "you must specify an argument for -Xcompile" ;; target) func_fatal_error "you must specify a target with '-o'" ;; *) # Get the name of the library object. test -z "$libobj" && { func_basename "$srcfile" libobj=$func_basename_result } ;; esac # Recognize several different file suffixes. # If the user specifies -o file.o, it is replaced with file.lo case $libobj in *.[cCFSifmso] | \ *.ada | *.adb | *.ads | *.asm | \ *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup) func_xform "$libobj" libobj=$func_xform_result ;; esac case $libobj in *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; *) func_fatal_error "cannot determine name of library object from '$libobj'" ;; esac func_infer_tag $base_compile for arg in $later; do case $arg in -shared) test yes = "$build_libtool_libs" \ || func_fatal_configuration "cannot build a shared library" build_old_libs=no continue ;; -static) build_libtool_libs=no build_old_libs=yes continue ;; -prefer-pic) pic_mode=yes continue ;; -prefer-non-pic) pic_mode=no continue ;; esac done func_quote_for_eval "$libobj" test "X$libobj" != "X$func_quote_for_eval_result" \ && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ && func_warning "libobj name '$libobj' may not contain shell special characters." func_dirname_and_basename "$obj" "/" "" objname=$func_basename_result xdir=$func_dirname_result lobj=$xdir$objdir/$objname test -z "$base_compile" && \ func_fatal_help "you must specify a compilation command" # Delete any leftover library objects. if test yes = "$build_old_libs"; then removelist="$obj $lobj $libobj ${libobj}T" else removelist="$lobj $libobj ${libobj}T" fi # On Cygwin there's no "real" PIC flag so we must build both object types case $host_os in cygwin* | mingw* | pw32* | os2* | cegcc*) pic_mode=default ;; esac if test no = "$pic_mode" && test pass_all != "$deplibs_check_method"; then # non-PIC code in shared libraries is not supported pic_mode=default fi # Calculate the filename of the output object if compiler does # not support -o with -c if test no = "$compiler_c_o"; then output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.$objext lockfile=$output_obj.lock else output_obj= need_locks=no lockfile= fi # Lock this critical section if it is needed # We use this script file to make the link, it avoids creating a new file if test yes = "$need_locks"; then until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done elif test warn = "$need_locks"; then if test -f "$lockfile"; then $ECHO "\ *** ERROR, $lockfile exists and contains: `cat $lockfile 2>/dev/null` This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support '-c' and '-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi func_append removelist " $output_obj" $ECHO "$srcfile" > "$lockfile" fi $opt_dry_run || $RM $removelist func_append removelist " $lockfile" trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 srcfile=$func_to_tool_file_result func_quote_for_eval "$srcfile" qsrcfile=$func_quote_for_eval_result # Only build a PIC object if we are building libtool libraries. if test yes = "$build_libtool_libs"; then # Without this assignment, base_compile gets emptied. fbsd_hideous_sh_bug=$base_compile if test no != "$pic_mode"; then command="$base_compile $qsrcfile $pic_flag" else # Don't build PIC code command="$base_compile $qsrcfile" fi func_mkdir_p "$xdir$objdir" if test -z "$output_obj"; then # Place PIC objects in $objdir func_append command " -o $lobj" fi func_show_eval_locale "$command" \ 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' if test warn = "$need_locks" && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support '-c' and '-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed, then go on to compile the next one if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then func_show_eval '$MV "$output_obj" "$lobj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi # Allow error messages only from the first compilation. if test yes = "$suppress_opt"; then suppress_output=' >/dev/null 2>&1' fi fi # Only build a position-dependent object if we build old libraries. if test yes = "$build_old_libs"; then if test yes != "$pic_mode"; then # Don't build PIC code command="$base_compile $qsrcfile$pie_flag" else command="$base_compile $qsrcfile $pic_flag" fi if test yes = "$compiler_c_o"; then func_append command " -o $obj" fi # Suppress compiler output if we already did a PIC compilation. func_append command "$suppress_output" func_show_eval_locale "$command" \ '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' if test warn = "$need_locks" && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support '-c' and '-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then func_show_eval '$MV "$output_obj" "$obj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi fi $opt_dry_run || { func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" # Unlock the critical section if it was locked if test no != "$need_locks"; then removelist=$lockfile $RM "$lockfile" fi } exit $EXIT_SUCCESS } $opt_help || { test compile = "$opt_mode" && func_mode_compile ${1+"$@"} } func_mode_help () { # We need to display help for each of the modes. case $opt_mode in "") # Generic help is extracted from the usage comments # at the start of this file. func_help ;; clean) $ECHO \ "Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... Remove files from the build directory. RM is the name of the program to use to delete files associated with each FILE (typically '/bin/rm'). RM-OPTIONS are options (such as '-f') to be passed to RM. If FILE is a libtool library, object or program, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; compile) $ECHO \ "Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE Compile a source file into a libtool library object. This mode accepts the following additional options: -o OUTPUT-FILE set the output file name to OUTPUT-FILE -no-suppress do not suppress compiler output for multiple passes -prefer-pic try to build PIC objects only -prefer-non-pic try to build non-PIC objects only -shared do not build a '.o' file suitable for static linking -static only build a '.o' file suitable for static linking -Wc,FLAG pass FLAG directly to the compiler COMPILE-COMMAND is a command to be used in creating a 'standard' object file from the given SOURCEFILE. The output file name is determined by removing the directory component from SOURCEFILE, then substituting the C source code suffix '.c' with the library object suffix, '.lo'." ;; execute) $ECHO \ "Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... Automatically set library path, then run a program. This mode accepts the following additional options: -dlopen FILE add the directory containing FILE to the library path This mode sets the library path environment variable according to '-dlopen' flags. If any of the ARGS are libtool executable wrappers, then they are translated into their corresponding uninstalled binary, and any of their required library directories are added to the library path. Then, COMMAND is executed, with ARGS as arguments." ;; finish) $ECHO \ "Usage: $progname [OPTION]... --mode=finish [LIBDIR]... Complete the installation of libtool libraries. Each LIBDIR is a directory that contains libtool libraries. The commands that this mode executes may require superuser privileges. Use the '--dry-run' option if you just want to see what would be executed." ;; install) $ECHO \ "Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... Install executables or libraries. INSTALL-COMMAND is the installation command. The first component should be either the 'install' or 'cp' program. The following components of INSTALL-COMMAND are treated specially: -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation The rest of the components are interpreted as arguments to that command (only BSD-compatible install options are recognized)." ;; link) $ECHO \ "Usage: $progname [OPTION]... --mode=link LINK-COMMAND... Link object files or libraries together to form another library, or to create an executable program. LINK-COMMAND is a command using the C compiler that you would use to create a program from several object files. The following components of LINK-COMMAND are treated specially: -all-static do not do any dynamic linking at all -avoid-version do not add a version suffix if possible -bindir BINDIR specify path to binaries directory (for systems where libraries must be found in the PATH setting at runtime) -dlopen FILE '-dlpreopen' FILE if it cannot be dlopened at runtime -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) -export-symbols SYMFILE try to export only the symbols listed in SYMFILE -export-symbols-regex REGEX try to export only the symbols matching REGEX -LLIBDIR search LIBDIR for required installed libraries -lNAME OUTPUT-FILE requires the installed library libNAME -module build a library that can dlopened -no-fast-install disable the fast-install mode -no-install link a not-installable executable -no-undefined declare that a library does not refer to external symbols -o OUTPUT-FILE create OUTPUT-FILE from the specified objects -objectlist FILE use a list of object files found in FILE to specify objects -os2dllname NAME force a short DLL name on OS/2 (no effect on other OSes) -precious-files-regex REGEX don't remove output files matching REGEX -release RELEASE specify package release information -rpath LIBDIR the created library will eventually be installed in LIBDIR -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries -shared only do dynamic linking of libtool libraries -shrext SUFFIX override the standard shared library file extension -static do not do any dynamic linking of uninstalled libtool libraries -static-libtool-libs do not do any dynamic linking of libtool libraries -version-info CURRENT[:REVISION[:AGE]] specify library version info [each variable defaults to 0] -weak LIBNAME declare that the target provides the LIBNAME interface -Wc,FLAG -Xcompiler FLAG pass linker-specific FLAG directly to the compiler -Wl,FLAG -Xlinker FLAG pass linker-specific FLAG directly to the linker -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) All other options (arguments beginning with '-') are ignored. Every other argument is treated as a filename. Files ending in '.la' are treated as uninstalled libtool libraries, other files are standard or library object files. If the OUTPUT-FILE ends in '.la', then a libtool library is created, only library objects ('.lo' files) may be specified, and '-rpath' is required, except when creating a convenience library. If OUTPUT-FILE ends in '.a' or '.lib', then a standard library is created using 'ar' and 'ranlib', or on Windows using 'lib'. If OUTPUT-FILE ends in '.lo' or '.$objext', then a reloadable object file is created, otherwise an executable program is created." ;; uninstall) $ECHO \ "Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... Remove libraries from an installation directory. RM is the name of the program to use to delete files associated with each FILE (typically '/bin/rm'). RM-OPTIONS are options (such as '-f') to be passed to RM. If FILE is a libtool library, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; *) func_fatal_help "invalid operation mode '$opt_mode'" ;; esac echo $ECHO "Try '$progname --help' for more information about other modes." } # Now that we've collected a possible --mode arg, show help if necessary if $opt_help; then if test : = "$opt_help"; then func_mode_help else { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do func_mode_help done } | $SED -n '1p; 2,$s/^Usage:/ or: /p' { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do echo func_mode_help done } | $SED '1d /^When reporting/,/^Report/{ H d } $x /information about other modes/d /more detailed .*MODE/d s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' fi exit $? fi # func_mode_execute arg... func_mode_execute () { $debug_cmd # The first argument is the command name. cmd=$nonopt test -z "$cmd" && \ func_fatal_help "you must specify a COMMAND" # Handle -dlopen flags immediately. for file in $opt_dlopen; do test -f "$file" \ || func_fatal_help "'$file' is not a file" dir= case $file in *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "'$lib' is not a valid libtool archive" # Read the libtool library. dlname= library_names= func_source "$file" # Skip this library if it cannot be dlopened. if test -z "$dlname"; then # Warn if it was a shared library. test -n "$library_names" && \ func_warning "'$file' was not linked with '-export-dynamic'" continue fi func_dirname "$file" "" "." dir=$func_dirname_result if test -f "$dir/$objdir/$dlname"; then func_append dir "/$objdir" else if test ! -f "$dir/$dlname"; then func_fatal_error "cannot find '$dlname' in '$dir' or '$dir/$objdir'" fi fi ;; *.lo) # Just add the directory containing the .lo file. func_dirname "$file" "" "." dir=$func_dirname_result ;; *) func_warning "'-dlopen' is ignored for non-libtool libraries and objects" continue ;; esac # Get the absolute pathname. absdir=`cd "$dir" && pwd` test -n "$absdir" && dir=$absdir # Now add the directory to shlibpath_var. if eval "test -z \"\$$shlibpath_var\""; then eval "$shlibpath_var=\"\$dir\"" else eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" fi done # This variable tells wrapper scripts just to set shlibpath_var # rather than running their programs. libtool_execute_magic=$magic # Check if any of the arguments is a wrapper script. args= for file do case $file in -* | *.la | *.lo ) ;; *) # Do a test to see if this is really a libtool program. if func_ltwrapper_script_p "$file"; then func_source "$file" # Transform arg to wrapped name. file=$progdir/$program elif func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" func_source "$func_ltwrapper_scriptname_result" # Transform arg to wrapped name. file=$progdir/$program fi ;; esac # Quote arguments (to preserve shell metacharacters). func_append_quoted args "$file" done if $opt_dry_run; then # Display what would be done. if test -n "$shlibpath_var"; then eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" echo "export $shlibpath_var" fi $ECHO "$cmd$args" exit $EXIT_SUCCESS else if test -n "$shlibpath_var"; then # Export the shlibpath_var. eval "export $shlibpath_var" fi # Restore saved environment variables for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test \"\${save_$lt_var+set}\" = set; then $lt_var=\$save_$lt_var; export $lt_var else $lt_unset $lt_var fi" done # Now prepare to actually exec the command. exec_cmd=\$cmd$args fi } test execute = "$opt_mode" && func_mode_execute ${1+"$@"} # func_mode_finish arg... func_mode_finish () { $debug_cmd libs= libdirs= admincmds= for opt in "$nonopt" ${1+"$@"} do if test -d "$opt"; then func_append libdirs " $opt" elif test -f "$opt"; then if func_lalib_unsafe_p "$opt"; then func_append libs " $opt" else func_warning "'$opt' is not a valid libtool archive" fi else func_fatal_error "invalid argument '$opt'" fi done if test -n "$libs"; then if test -n "$lt_sysroot"; then sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" else sysroot_cmd= fi # Remove sysroot references if $opt_dry_run; then for lib in $libs; do echo "removing references to $lt_sysroot and '=' prefixes from $lib" done else tmpdir=`func_mktempdir` for lib in $libs; do $SED -e "$sysroot_cmd s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ > $tmpdir/tmp-la mv -f $tmpdir/tmp-la $lib done ${RM}r "$tmpdir" fi fi if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then for libdir in $libdirs; do if test -n "$finish_cmds"; then # Do each command in the finish commands. func_execute_cmds "$finish_cmds" 'admincmds="$admincmds '"$cmd"'"' fi if test -n "$finish_eval"; then # Do the single finish_eval. eval cmds=\"$finish_eval\" $opt_dry_run || eval "$cmds" || func_append admincmds " $cmds" fi done fi # Exit here if they wanted silent mode. $opt_quiet && exit $EXIT_SUCCESS if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then echo "----------------------------------------------------------------------" echo "Libraries have been installed in:" for libdir in $libdirs; do $ECHO " $libdir" done echo echo "If you ever happen to want to link against installed libraries" echo "in a given directory, LIBDIR, you must either use libtool, and" echo "specify the full pathname of the library, or use the '-LLIBDIR'" echo "flag during linking and do at least one of the following:" if test -n "$shlibpath_var"; then echo " - add LIBDIR to the '$shlibpath_var' environment variable" echo " during execution" fi if test -n "$runpath_var"; then echo " - add LIBDIR to the '$runpath_var' environment variable" echo " during linking" fi if test -n "$hardcode_libdir_flag_spec"; then libdir=LIBDIR eval flag=\"$hardcode_libdir_flag_spec\" $ECHO " - use the '$flag' linker flag" fi if test -n "$admincmds"; then $ECHO " - have your system administrator run these commands:$admincmds" fi if test -f /etc/ld.so.conf; then echo " - have your system administrator add LIBDIR to '/etc/ld.so.conf'" fi echo echo "See any operating system documentation about shared libraries for" case $host in solaris2.[6789]|solaris2.1[0-9]) echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" echo "pages." ;; *) echo "more information, such as the ld(1) and ld.so(8) manual pages." ;; esac echo "----------------------------------------------------------------------" fi exit $EXIT_SUCCESS } test finish = "$opt_mode" && func_mode_finish ${1+"$@"} # func_mode_install arg... func_mode_install () { $debug_cmd # There may be an optional sh(1) argument at the beginning of # install_prog (especially on Windows NT). if test "$SHELL" = "$nonopt" || test /bin/sh = "$nonopt" || # Allow the use of GNU shtool's install command. case $nonopt in *shtool*) :;; *) false;; esac then # Aesthetically quote it. func_quote_for_eval "$nonopt" install_prog="$func_quote_for_eval_result " arg=$1 shift else install_prog= arg=$nonopt fi # The real first argument should be the name of the installation program. # Aesthetically quote it. func_quote_for_eval "$arg" func_append install_prog "$func_quote_for_eval_result" install_shared_prog=$install_prog case " $install_prog " in *[\\\ /]cp\ *) install_cp=: ;; *) install_cp=false ;; esac # We need to accept at least all the BSD install flags. dest= files= opts= prev= install_type= isdir=false stripme= no_mode=: for arg do arg2= if test -n "$dest"; then func_append files " $dest" dest=$arg continue fi case $arg in -d) isdir=: ;; -f) if $install_cp; then :; else prev=$arg fi ;; -g | -m | -o) prev=$arg ;; -s) stripme=" -s" continue ;; -*) ;; *) # If the previous option needed an argument, then skip it. if test -n "$prev"; then if test X-m = "X$prev" && test -n "$install_override_mode"; then arg2=$install_override_mode no_mode=false fi prev= else dest=$arg continue fi ;; esac # Aesthetically quote the argument. func_quote_for_eval "$arg" func_append install_prog " $func_quote_for_eval_result" if test -n "$arg2"; then func_quote_for_eval "$arg2" fi func_append install_shared_prog " $func_quote_for_eval_result" done test -z "$install_prog" && \ func_fatal_help "you must specify an install program" test -n "$prev" && \ func_fatal_help "the '$prev' option requires an argument" if test -n "$install_override_mode" && $no_mode; then if $install_cp; then :; else func_quote_for_eval "$install_override_mode" func_append install_shared_prog " -m $func_quote_for_eval_result" fi fi if test -z "$files"; then if test -z "$dest"; then func_fatal_help "no file or destination specified" else func_fatal_help "you must specify a destination" fi fi # Strip any trailing slash from the destination. func_stripname '' '/' "$dest" dest=$func_stripname_result # Check to see that the destination is a directory. test -d "$dest" && isdir=: if $isdir; then destdir=$dest destname= else func_dirname_and_basename "$dest" "" "." destdir=$func_dirname_result destname=$func_basename_result # Not a directory, so check to see that there is only one file specified. set dummy $files; shift test "$#" -gt 1 && \ func_fatal_help "'$dest' is not a directory" fi case $destdir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) for file in $files; do case $file in *.lo) ;; *) func_fatal_help "'$destdir' must be an absolute directory name" ;; esac done ;; esac # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic=$magic staticlibs= future_libdirs= current_libdirs= for file in $files; do # Do each installation. case $file in *.$libext) # Do the static libraries later. func_append staticlibs " $file" ;; *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "'$file' is not a valid libtool archive" library_names= old_library= relink_command= func_source "$file" # Add the libdir to current_libdirs if it is the destination. if test "X$destdir" = "X$libdir"; then case "$current_libdirs " in *" $libdir "*) ;; *) func_append current_libdirs " $libdir" ;; esac else # Note the libdir as a future libdir. case "$future_libdirs " in *" $libdir "*) ;; *) func_append future_libdirs " $libdir" ;; esac fi func_dirname "$file" "/" "" dir=$func_dirname_result func_append dir "$objdir" if test -n "$relink_command"; then # Determine the prefix the user has applied to our future dir. inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` # Don't allow the user to place us outside of our expected # location b/c this prevents finding dependent libraries that # are installed to the same prefix. # At present, this check doesn't affect windows .dll's that # are installed into $libdir/../bin (currently, that works fine) # but it's something to keep an eye on. test "$inst_prefix_dir" = "$destdir" && \ func_fatal_error "error: cannot install '$file' to a directory not ending in $libdir" if test -n "$inst_prefix_dir"; then # Stick the inst_prefix_dir data into the link command. relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` else relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` fi func_warning "relinking '$file'" func_show_eval "$relink_command" \ 'func_fatal_error "error: relink '\''$file'\'' with the above command before installing it"' fi # See the names of the shared library. set dummy $library_names; shift if test -n "$1"; then realname=$1 shift srcname=$realname test -n "$relink_command" && srcname=${realname}T # Install the shared library and build the symlinks. func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ 'exit $?' tstripme=$stripme case $host_os in cygwin* | mingw* | pw32* | cegcc*) case $realname in *.dll.a) tstripme= ;; esac ;; os2*) case $realname in *_dll.a) tstripme= ;; esac ;; esac if test -n "$tstripme" && test -n "$striplib"; then func_show_eval "$striplib $destdir/$realname" 'exit $?' fi if test "$#" -gt 0; then # Delete the old symlinks, and create new ones. # Try 'ln -sf' first, because the 'ln' binary might depend on # the symlink we replace! Solaris /bin/ln does not understand -f, # so we also need to try rm && ln -s. for linkname do test "$linkname" != "$realname" \ && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" done fi # Do each command in the postinstall commands. lib=$destdir/$realname func_execute_cmds "$postinstall_cmds" 'exit $?' fi # Install the pseudo-library for information purposes. func_basename "$file" name=$func_basename_result instname=$dir/${name}i func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' # Maybe install the static library, too. test -n "$old_library" && func_append staticlibs " $dir/$old_library" ;; *.lo) # Install (i.e. copy) a libtool object. # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile=$destdir/$destname else func_basename "$file" destfile=$func_basename_result destfile=$destdir/$destfile fi # Deduce the name of the destination old-style object file. case $destfile in *.lo) func_lo2o "$destfile" staticdest=$func_lo2o_result ;; *.$objext) staticdest=$destfile destfile= ;; *) func_fatal_help "cannot copy a libtool object to '$destfile'" ;; esac # Install the libtool object if requested. test -n "$destfile" && \ func_show_eval "$install_prog $file $destfile" 'exit $?' # Install the old object if enabled. if test yes = "$build_old_libs"; then # Deduce the name of the old-style object file. func_lo2o "$file" staticobj=$func_lo2o_result func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' fi exit $EXIT_SUCCESS ;; *) # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile=$destdir/$destname else func_basename "$file" destfile=$func_basename_result destfile=$destdir/$destfile fi # If the file is missing, and there is a .exe on the end, strip it # because it is most likely a libtool script we actually want to # install stripped_ext= case $file in *.exe) if test ! -f "$file"; then func_stripname '' '.exe' "$file" file=$func_stripname_result stripped_ext=.exe fi ;; esac # Do a test to see if this is really a libtool program. case $host in *cygwin* | *mingw*) if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" wrapper=$func_ltwrapper_scriptname_result else func_stripname '' '.exe' "$file" wrapper=$func_stripname_result fi ;; *) wrapper=$file ;; esac if func_ltwrapper_script_p "$wrapper"; then notinst_deplibs= relink_command= func_source "$wrapper" # Check the variables that should have been set. test -z "$generated_by_libtool_version" && \ func_fatal_error "invalid libtool wrapper script '$wrapper'" finalize=: for lib in $notinst_deplibs; do # Check to see that each library is installed. libdir= if test -f "$lib"; then func_source "$lib" fi libfile=$libdir/`$ECHO "$lib" | $SED 's%^.*/%%g'` if test -n "$libdir" && test ! -f "$libfile"; then func_warning "'$lib' has not been installed in '$libdir'" finalize=false fi done relink_command= func_source "$wrapper" outputname= if test no = "$fast_install" && test -n "$relink_command"; then $opt_dry_run || { if $finalize; then tmpdir=`func_mktempdir` func_basename "$file$stripped_ext" file=$func_basename_result outputname=$tmpdir/$file # Replace the output file specification. relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` $opt_quiet || { func_quote_for_expand "$relink_command" eval "func_echo $func_quote_for_expand_result" } if eval "$relink_command"; then : else func_error "error: relink '$file' with the above command before installing it" $opt_dry_run || ${RM}r "$tmpdir" continue fi file=$outputname else func_warning "cannot relink '$file'" fi } else # Install the binary that we compiled earlier. file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` fi fi # remove .exe since cygwin /usr/bin/install will append another # one anyway case $install_prog,$host in */usr/bin/install*,*cygwin*) case $file:$destfile in *.exe:*.exe) # this is ok ;; *.exe:*) destfile=$destfile.exe ;; *:*.exe) func_stripname '' '.exe' "$destfile" destfile=$func_stripname_result ;; esac ;; esac func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' $opt_dry_run || if test -n "$outputname"; then ${RM}r "$tmpdir" fi ;; esac done for file in $staticlibs; do func_basename "$file" name=$func_basename_result # Set up the ranlib parameters. oldlib=$destdir/$name func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 tool_oldlib=$func_to_tool_file_result func_show_eval "$install_prog \$file \$oldlib" 'exit $?' if test -n "$stripme" && test -n "$old_striplib"; then func_show_eval "$old_striplib $tool_oldlib" 'exit $?' fi # Do each command in the postinstall commands. func_execute_cmds "$old_postinstall_cmds" 'exit $?' done test -n "$future_libdirs" && \ func_warning "remember to run '$progname --finish$future_libdirs'" if test -n "$current_libdirs"; then # Maybe just do a dry run. $opt_dry_run && current_libdirs=" -n$current_libdirs" exec_cmd='$SHELL "$progpath" $preserve_args --finish$current_libdirs' else exit $EXIT_SUCCESS fi } test install = "$opt_mode" && func_mode_install ${1+"$@"} # func_generate_dlsyms outputname originator pic_p # Extract symbols from dlprefiles and create ${outputname}S.o with # a dlpreopen symbol table. func_generate_dlsyms () { $debug_cmd my_outputname=$1 my_originator=$2 my_pic_p=${3-false} my_prefix=`$ECHO "$my_originator" | $SED 's%[^a-zA-Z0-9]%_%g'` my_dlsyms= if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then if test -n "$NM" && test -n "$global_symbol_pipe"; then my_dlsyms=${my_outputname}S.c else func_error "not configured to extract global symbols from dlpreopened files" fi fi if test -n "$my_dlsyms"; then case $my_dlsyms in "") ;; *.c) # Discover the nlist of each of the dlfiles. nlist=$output_objdir/$my_outputname.nm func_show_eval "$RM $nlist ${nlist}S ${nlist}T" # Parse the name list into a source file. func_verbose "creating $output_objdir/$my_dlsyms" $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ /* $my_dlsyms - symbol resolution table for '$my_outputname' dlsym emulation. */ /* Generated by $PROGRAM (GNU $PACKAGE) $VERSION */ #ifdef __cplusplus extern \"C\" { #endif #if defined __GNUC__ && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) #pragma GCC diagnostic ignored \"-Wstrict-prototypes\" #endif /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE /* DATA imports from DLLs on WIN32 can't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined __osf__ /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif #define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) /* External symbol declarations for the compiler. */\ " if test yes = "$dlself"; then func_verbose "generating symbol list for '$output'" $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" # Add our own program objects to the symbol list. progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` for progfile in $progfiles; do func_to_tool_file "$progfile" func_convert_file_msys_to_w32 func_verbose "extracting global C symbols from '$func_to_tool_file_result'" $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" done if test -n "$exclude_expsyms"; then $opt_dry_run || { eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi if test -n "$export_symbols_regex"; then $opt_dry_run || { eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi # Prepare the list of exported symbols if test -z "$export_symbols"; then export_symbols=$output_objdir/$outputname.exp $opt_dry_run || { $RM $export_symbols eval "$SED -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' case $host in *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' ;; esac } else $opt_dry_run || { eval "$SED -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' case $host in *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' ;; esac } fi fi for dlprefile in $dlprefiles; do func_verbose "extracting global C symbols from '$dlprefile'" func_basename "$dlprefile" name=$func_basename_result case $host in *cygwin* | *mingw* | *cegcc* ) # if an import library, we need to obtain dlname if func_win32_import_lib_p "$dlprefile"; then func_tr_sh "$dlprefile" eval "curr_lafile=\$libfile_$func_tr_sh_result" dlprefile_dlbasename= if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then # Use subshell, to avoid clobbering current variable values dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` if test -n "$dlprefile_dlname"; then func_basename "$dlprefile_dlname" dlprefile_dlbasename=$func_basename_result else # no lafile. user explicitly requested -dlpreopen . $sharedlib_from_linklib_cmd "$dlprefile" dlprefile_dlbasename=$sharedlib_from_linklib_result fi fi $opt_dry_run || { if test -n "$dlprefile_dlbasename"; then eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' else func_warning "Could not compute DLL name from $name" eval '$ECHO ": $name " >> "$nlist"' fi func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" } else # not an import lib $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } fi ;; *) $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } ;; esac done $opt_dry_run || { # Make sure we have at least an empty file. test -f "$nlist" || : > "$nlist" if test -n "$exclude_expsyms"; then $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T $MV "$nlist"T "$nlist" fi # Try sorting and uniquifying the output. if $GREP -v "^: " < "$nlist" | if sort -k 3 /dev/null 2>&1; then sort -k 3 else sort +2 fi | uniq > "$nlist"S; then : else $GREP -v "^: " < "$nlist" > "$nlist"S fi if test -f "$nlist"S; then eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' else echo '/* NONE */' >> "$output_objdir/$my_dlsyms" fi func_show_eval '$RM "${nlist}I"' if test -n "$global_symbol_to_import"; then eval "$global_symbol_to_import"' < "$nlist"S > "$nlist"I' fi echo >> "$output_objdir/$my_dlsyms" "\ /* The mapping between symbol names and symbols. */ typedef struct { const char *name; void *address; } lt_dlsymlist; extern LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[];\ " if test -s "$nlist"I; then echo >> "$output_objdir/$my_dlsyms" "\ static void lt_syminit(void) { LT_DLSYM_CONST lt_dlsymlist *symbol = lt_${my_prefix}_LTX_preloaded_symbols; for (; symbol->name; ++symbol) {" $SED 's/.*/ if (STREQ (symbol->name, \"&\")) symbol->address = (void *) \&&;/' < "$nlist"I >> "$output_objdir/$my_dlsyms" echo >> "$output_objdir/$my_dlsyms" "\ } }" fi echo >> "$output_objdir/$my_dlsyms" "\ LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[] = { {\"$my_originator\", (void *) 0}," if test -s "$nlist"I; then echo >> "$output_objdir/$my_dlsyms" "\ {\"@INIT@\", (void *) <_syminit}," fi case $need_lib_prefix in no) eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; *) eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; esac echo >> "$output_objdir/$my_dlsyms" "\ {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt_${my_prefix}_LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif\ " } # !$opt_dry_run pic_flag_for_symtable= case "$compile_command " in *" -static "*) ;; *) case $host in # compiling the symbol table file with pic_flag works around # a FreeBSD bug that causes programs to crash when -lm is # linked before any other PIC object. But we must not use # pic_flag when linking with -static. The problem exists in # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; *-*-hpux*) pic_flag_for_symtable=" $pic_flag" ;; *) $my_pic_p && pic_flag_for_symtable=" $pic_flag" ;; esac ;; esac symtab_cflags= for arg in $LTCFLAGS; do case $arg in -pie | -fpie | -fPIE) ;; *) func_append symtab_cflags " $arg" ;; esac done # Now compile the dynamic symbol file. func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' # Clean up the generated files. func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T" "${nlist}I"' # Transform the symbol file into the correct name. symfileobj=$output_objdir/${my_outputname}S.$objext case $host in *cygwin* | *mingw* | *cegcc* ) if test -f "$output_objdir/$my_outputname.def"; then compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` else compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` fi ;; *) compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` ;; esac ;; *) func_fatal_error "unknown suffix for '$my_dlsyms'" ;; esac else # We keep going just in case the user didn't refer to # lt_preloaded_symbols. The linker will fail if global_symbol_pipe # really was required. # Nullify the symbol file. compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"` finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` fi } # func_cygming_gnu_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is a GNU/binutils-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_gnu_implib_p () { $debug_cmd func_to_tool_file "$1" func_convert_file_msys_to_w32 func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` test -n "$func_cygming_gnu_implib_tmp" } # func_cygming_ms_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is an MS-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_ms_implib_p () { $debug_cmd func_to_tool_file "$1" func_convert_file_msys_to_w32 func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` test -n "$func_cygming_ms_implib_tmp" } # func_win32_libid arg # return the library type of file 'arg' # # Need a lot of goo to handle *both* DLLs and import libs # Has to be a shell function in order to 'eat' the argument # that is supplied when $file_magic_command is called. # Despite the name, also deal with 64 bit binaries. func_win32_libid () { $debug_cmd win32_libid_type=unknown win32_fileres=`file -L $1 2>/dev/null` case $win32_fileres in *ar\ archive\ import\ library*) # definitely import win32_libid_type="x86 archive import" ;; *ar\ archive*) # could be an import, or static # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then case $nm_interface in "MS dumpbin") if func_cygming_ms_implib_p "$1" || func_cygming_gnu_implib_p "$1" then win32_nmres=import else win32_nmres= fi ;; *) func_to_tool_file "$1" func_convert_file_msys_to_w32 win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | $SED -n -e ' 1,100{ / I /{ s|.*|import| p q } }'` ;; esac case $win32_nmres in import*) win32_libid_type="x86 archive import";; *) win32_libid_type="x86 archive static";; esac fi ;; *DLL*) win32_libid_type="x86 DLL" ;; *executable*) # but shell scripts are "executable" too... case $win32_fileres in *MS\ Windows\ PE\ Intel*) win32_libid_type="x86 DLL" ;; esac ;; esac $ECHO "$win32_libid_type" } # func_cygming_dll_for_implib ARG # # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib () { $debug_cmd sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` } # func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs # # The is the core of a fallback implementation of a # platform-specific function to extract the name of the # DLL associated with the specified import library LIBNAME. # # SECTION_NAME is either .idata$6 or .idata$7, depending # on the platform and compiler that created the implib. # # Echos the name of the DLL associated with the # specified import library. func_cygming_dll_for_implib_fallback_core () { $debug_cmd match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` $OBJDUMP -s --section "$1" "$2" 2>/dev/null | $SED '/^Contents of section '"$match_literal"':/{ # Place marker at beginning of archive member dllname section s/.*/====MARK====/ p d } # These lines can sometimes be longer than 43 characters, but # are always uninteresting /:[ ]*file format pe[i]\{,1\}-/d /^In archive [^:]*:/d # Ensure marker is printed /^====MARK====/p # Remove all lines with less than 43 characters /^.\{43\}/!d # From remaining lines, remove first 43 characters s/^.\{43\}//' | $SED -n ' # Join marker and all lines until next marker into a single line /^====MARK====/ b para H $ b para b :para x s/\n//g # Remove the marker s/^====MARK====// # Remove trailing dots and whitespace s/[\. \t]*$// # Print /./p' | # we now have a list, one entry per line, of the stringified # contents of the appropriate section of all members of the # archive that possess that section. Heuristic: eliminate # all those that have a first or second character that is # a '.' (that is, objdump's representation of an unprintable # character.) This should work for all archives with less than # 0x302f exports -- but will fail for DLLs whose name actually # begins with a literal '.' or a single character followed by # a '.'. # # Of those that remain, print the first one. $SED -e '/^\./d;/^.\./d;q' } # func_cygming_dll_for_implib_fallback ARG # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # # This fallback implementation is for use when $DLLTOOL # does not support the --identify-strict option. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib_fallback () { $debug_cmd if func_cygming_gnu_implib_p "$1"; then # binutils import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` elif func_cygming_ms_implib_p "$1"; then # ms-generated import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` else # unknown sharedlib_from_linklib_result= fi } # func_extract_an_archive dir oldlib func_extract_an_archive () { $debug_cmd f_ex_an_ar_dir=$1; shift f_ex_an_ar_oldlib=$1 if test yes = "$lock_old_archive_extraction"; then lockfile=$f_ex_an_ar_oldlib.lock until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done fi func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ 'stat=$?; rm -f "$lockfile"; exit $stat' if test yes = "$lock_old_archive_extraction"; then $opt_dry_run || rm -f "$lockfile" fi if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then : else func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" fi } # func_extract_archives gentop oldlib ... func_extract_archives () { $debug_cmd my_gentop=$1; shift my_oldlibs=${1+"$@"} my_oldobjs= my_xlib= my_xabs= my_xdir= for my_xlib in $my_oldlibs; do # Extract the objects. case $my_xlib in [\\/]* | [A-Za-z]:[\\/]*) my_xabs=$my_xlib ;; *) my_xabs=`pwd`"/$my_xlib" ;; esac func_basename "$my_xlib" my_xlib=$func_basename_result my_xlib_u=$my_xlib while :; do case " $extracted_archives " in *" $my_xlib_u "*) func_arith $extracted_serial + 1 extracted_serial=$func_arith_result my_xlib_u=lt$extracted_serial-$my_xlib ;; *) break ;; esac done extracted_archives="$extracted_archives $my_xlib_u" my_xdir=$my_gentop/$my_xlib_u func_mkdir_p "$my_xdir" case $host in *-darwin*) func_verbose "Extracting $my_xabs" # Do not bother doing anything if just a dry run $opt_dry_run || { darwin_orig_dir=`pwd` cd $my_xdir || exit $? darwin_archive=$my_xabs darwin_curdir=`pwd` func_basename "$darwin_archive" darwin_base_archive=$func_basename_result darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` if test -n "$darwin_arches"; then darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` darwin_arch= func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" for darwin_arch in $darwin_arches; do func_mkdir_p "unfat-$$/$darwin_base_archive-$darwin_arch" $LIPO -thin $darwin_arch -output "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" "$darwin_archive" cd "unfat-$$/$darwin_base_archive-$darwin_arch" func_extract_an_archive "`pwd`" "$darwin_base_archive" cd "$darwin_curdir" $RM "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" done # $darwin_arches ## Okay now we've a bunch of thin objects, gotta fatten them up :) darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$sed_basename" | sort -u` darwin_file= darwin_files= for darwin_file in $darwin_filelist; do darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` $LIPO -create -output "$darwin_file" $darwin_files done # $darwin_filelist $RM -rf unfat-$$ cd "$darwin_orig_dir" else cd $darwin_orig_dir func_extract_an_archive "$my_xdir" "$my_xabs" fi # $darwin_arches } # !$opt_dry_run ;; *) func_extract_an_archive "$my_xdir" "$my_xabs" ;; esac my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` done func_extract_archives_result=$my_oldobjs } # func_emit_wrapper [arg=no] # # Emit a libtool wrapper script on stdout. # Don't directly open a file because we may want to # incorporate the script contents within a cygwin/mingw # wrapper executable. Must ONLY be called from within # func_mode_link because it depends on a number of variables # set therein. # # ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR # variable will take. If 'yes', then the emitted script # will assume that the directory where it is stored is # the $objdir directory. This is a cygwin/mingw-specific # behavior. func_emit_wrapper () { func_emit_wrapper_arg1=${1-no} $ECHO "\ #! $SHELL # $output - temporary wrapper script for $objdir/$outputname # Generated by $PROGRAM (GNU $PACKAGE) $VERSION # # The $output program cannot be directly executed until all the libtool # libraries that it depends on are installed. # # This wrapper script should never be moved out of the build directory. # If it is, it will not operate correctly. # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. sed_quote_subst='$sed_quote_subst' # Be Bourne compatible if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH relink_command=\"$relink_command\" # This environment variable determines our operation mode. if test \"\$libtool_install_magic\" = \"$magic\"; then # install mode needs the following variables: generated_by_libtool_version='$macro_version' notinst_deplibs='$notinst_deplibs' else # When we are sourced in execute mode, \$file and \$ECHO are already set. if test \"\$libtool_execute_magic\" != \"$magic\"; then file=\"\$0\"" qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"` $ECHO "\ # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } ECHO=\"$qECHO\" fi # Very basic option parsing. These options are (a) specific to # the libtool wrapper, (b) are identical between the wrapper # /script/ and the wrapper /executable/ that is used only on # windows platforms, and (c) all begin with the string "--lt-" # (application programs are unlikely to have options that match # this pattern). # # There are only two supported options: --lt-debug and # --lt-dump-script. There is, deliberately, no --lt-help. # # The first argument to this parsing function should be the # script's $0 value, followed by "$@". lt_option_debug= func_parse_lt_options () { lt_script_arg0=\$0 shift for lt_opt do case \"\$lt_opt\" in --lt-debug) lt_option_debug=1 ;; --lt-dump-script) lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` cat \"\$lt_dump_D/\$lt_dump_F\" exit 0 ;; --lt-*) \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 exit 1 ;; esac done # Print the debug banner immediately: if test -n \"\$lt_option_debug\"; then echo \"$outputname:$output:\$LINENO: libtool wrapper (GNU $PACKAGE) $VERSION\" 1>&2 fi } # Used when --lt-debug. Prints its arguments to stdout # (redirection is the responsibility of the caller) func_lt_dump_args () { lt_dump_args_N=1; for lt_arg do \$ECHO \"$outputname:$output:\$LINENO: newargv[\$lt_dump_args_N]: \$lt_arg\" lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` done } # Core function for launching the target application func_exec_program_core () { " case $host in # Backslashes separate directories on plain windows *-*-mingw | *-*-os2* | *-cegcc*) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir\\\\\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} " ;; *) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir/\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir/\$program\" \${1+\"\$@\"} " ;; esac $ECHO "\ \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 exit 1 } # A function to encapsulate launching the target application # Strips options in the --lt-* namespace from \$@ and # launches target application with the remaining arguments. func_exec_program () { case \" \$* \" in *\\ --lt-*) for lt_wr_arg do case \$lt_wr_arg in --lt-*) ;; *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; esac shift done ;; esac func_exec_program_core \${1+\"\$@\"} } # Parse options func_parse_lt_options \"\$0\" \${1+\"\$@\"} # Find the directory that this script lives in. thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\` test \"x\$thisdir\" = \"x\$file\" && thisdir=. # Follow symbolic links until we get to the real thisdir. file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\` while test -n \"\$file\"; do destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\` # If there was a directory component, then change thisdir. if test \"x\$destdir\" != \"x\$file\"; then case \"\$destdir\" in [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; *) thisdir=\"\$thisdir/\$destdir\" ;; esac fi file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\` file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` done # Usually 'no', except on cygwin/mingw when embedded into # the cwrapper. WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then # special case for '.' if test \"\$thisdir\" = \".\"; then thisdir=\`pwd\` fi # remove .libs from thisdir case \"\$thisdir\" in *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; $objdir ) thisdir=. ;; esac fi # Try to get the absolute directory name. absdir=\`cd \"\$thisdir\" && pwd\` test -n \"\$absdir\" && thisdir=\"\$absdir\" " if test yes = "$fast_install"; then $ECHO "\ program=lt-'$outputname'$exeext progdir=\"\$thisdir/$objdir\" if test ! -f \"\$progdir/\$program\" || { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | $SED 1q\`; \\ test \"X\$file\" != \"X\$progdir/\$program\"; }; then file=\"\$\$-\$program\" if test ! -d \"\$progdir\"; then $MKDIR \"\$progdir\" else $RM \"\$progdir/\$file\" fi" $ECHO "\ # relink executable if necessary if test -n \"\$relink_command\"; then if relink_command_output=\`eval \$relink_command 2>&1\`; then : else \$ECHO \"\$relink_command_output\" >&2 $RM \"\$progdir/\$file\" exit 1 fi fi $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || { $RM \"\$progdir/\$program\"; $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } $RM \"\$progdir/\$file\" fi" else $ECHO "\ program='$outputname' progdir=\"\$thisdir/$objdir\" " fi $ECHO "\ if test -f \"\$progdir/\$program\"; then" # fixup the dll searchpath if we need to. # # Fix the DLL searchpath if we need to. Do this before prepending # to shlibpath, because on Windows, both are PATH and uninstalled # libraries must come first. if test -n "$dllsearchpath"; then $ECHO "\ # Add the dll search path components to the executable PATH PATH=$dllsearchpath:\$PATH " fi # Export our shlibpath_var if we have one. if test yes = "$shlibpath_overrides_runpath" && test -n "$shlibpath_var" && test -n "$temp_rpath"; then $ECHO "\ # Add our own library path to $shlibpath_var $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" # Some systems cannot cope with colon-terminated $shlibpath_var # The second colon is a workaround for a bug in BeOS R4 sed $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\` export $shlibpath_var " fi $ECHO "\ if test \"\$libtool_execute_magic\" != \"$magic\"; then # Run the actual program with our arguments. func_exec_program \${1+\"\$@\"} fi else # The program doesn't exist. \$ECHO \"\$0: error: '\$progdir/\$program' does not exist\" 1>&2 \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 exit 1 fi fi\ " } # func_emit_cwrapperexe_src # emit the source code for a wrapper executable on stdout # Must ONLY be called from within func_mode_link because # it depends on a number of variable set therein. func_emit_cwrapperexe_src () { cat < #include #ifdef _MSC_VER # include # include # include #else # include # include # ifdef __CYGWIN__ # include # endif #endif #include #include #include #include #include #include #include #include #define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) /* declarations of non-ANSI functions */ #if defined __MINGW32__ # ifdef __STRICT_ANSI__ int _putenv (const char *); # endif #elif defined __CYGWIN__ # ifdef __STRICT_ANSI__ char *realpath (const char *, char *); int putenv (char *); int setenv (const char *, const char *, int); # endif /* #elif defined other_platform || defined ... */ #endif /* portability defines, excluding path handling macros */ #if defined _MSC_VER # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv # define S_IXUSR _S_IEXEC #elif defined __MINGW32__ # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv #elif defined __CYGWIN__ # define HAVE_SETENV # define FOPEN_WB "wb" /* #elif defined other platforms ... */ #endif #if defined PATH_MAX # define LT_PATHMAX PATH_MAX #elif defined MAXPATHLEN # define LT_PATHMAX MAXPATHLEN #else # define LT_PATHMAX 1024 #endif #ifndef S_IXOTH # define S_IXOTH 0 #endif #ifndef S_IXGRP # define S_IXGRP 0 #endif /* path handling portability macros */ #ifndef DIR_SEPARATOR # define DIR_SEPARATOR '/' # define PATH_SEPARATOR ':' #endif #if defined _WIN32 || defined __MSDOS__ || defined __DJGPP__ || \ defined __OS2__ # define HAVE_DOS_BASED_FILE_SYSTEM # define FOPEN_WB "wb" # ifndef DIR_SEPARATOR_2 # define DIR_SEPARATOR_2 '\\' # endif # ifndef PATH_SEPARATOR_2 # define PATH_SEPARATOR_2 ';' # endif #endif #ifndef DIR_SEPARATOR_2 # define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) #else /* DIR_SEPARATOR_2 */ # define IS_DIR_SEPARATOR(ch) \ (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) #endif /* DIR_SEPARATOR_2 */ #ifndef PATH_SEPARATOR_2 # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) #else /* PATH_SEPARATOR_2 */ # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) #endif /* PATH_SEPARATOR_2 */ #ifndef FOPEN_WB # define FOPEN_WB "w" #endif #ifndef _O_BINARY # define _O_BINARY 0 #endif #define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) #define XFREE(stale) do { \ if (stale) { free (stale); stale = 0; } \ } while (0) #if defined LT_DEBUGWRAPPER static int lt_debug = 1; #else static int lt_debug = 0; #endif const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ void *xmalloc (size_t num); char *xstrdup (const char *string); const char *base_name (const char *name); char *find_executable (const char *wrapper); char *chase_symlinks (const char *pathspec); int make_executable (const char *path); int check_executable (const char *path); char *strendzap (char *str, const char *pat); void lt_debugprintf (const char *file, int line, const char *fmt, ...); void lt_fatal (const char *file, int line, const char *message, ...); static const char *nonnull (const char *s); static const char *nonempty (const char *s); void lt_setenv (const char *name, const char *value); char *lt_extend_str (const char *orig_value, const char *add, int to_end); void lt_update_exe_path (const char *name, const char *value); void lt_update_lib_path (const char *name, const char *value); char **prepare_spawn (char **argv); void lt_dump_script (FILE *f); EOF cat <= 0) && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) return 1; else return 0; } int make_executable (const char *path) { int rval = 0; struct stat st; lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", nonempty (path)); if ((!path) || (!*path)) return 0; if (stat (path, &st) >= 0) { rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); } return rval; } /* Searches for the full path of the wrapper. Returns newly allocated full path name if found, NULL otherwise Does not chase symlinks, even on platforms that support them. */ char * find_executable (const char *wrapper) { int has_slash = 0; const char *p; const char *p_next; /* static buffer for getcwd */ char tmp[LT_PATHMAX + 1]; size_t tmp_len; char *concat_name; lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", nonempty (wrapper)); if ((wrapper == NULL) || (*wrapper == '\0')) return NULL; /* Absolute path? */ #if defined HAVE_DOS_BASED_FILE_SYSTEM if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } else { #endif if (IS_DIR_SEPARATOR (wrapper[0])) { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } #if defined HAVE_DOS_BASED_FILE_SYSTEM } #endif for (p = wrapper; *p; p++) if (*p == '/') { has_slash = 1; break; } if (!has_slash) { /* no slashes; search PATH */ const char *path = getenv ("PATH"); if (path != NULL) { for (p = path; *p; p = p_next) { const char *q; size_t p_len; for (q = p; *q; q++) if (IS_PATH_SEPARATOR (*q)) break; p_len = (size_t) (q - p); p_next = (*q == '\0' ? q : q + 1); if (p_len == 0) { /* empty path: current directory */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); } else { concat_name = XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, p, p_len); concat_name[p_len] = '/'; strcpy (concat_name + p_len + 1, wrapper); } if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } } /* not found in PATH; assume curdir */ } /* Relative path | not found in path: prepend cwd */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); return NULL; } char * chase_symlinks (const char *pathspec) { #ifndef S_ISLNK return xstrdup (pathspec); #else char buf[LT_PATHMAX]; struct stat s; char *tmp_pathspec = xstrdup (pathspec); char *p; int has_symlinks = 0; while (strlen (tmp_pathspec) && !has_symlinks) { lt_debugprintf (__FILE__, __LINE__, "checking path component for symlinks: %s\n", tmp_pathspec); if (lstat (tmp_pathspec, &s) == 0) { if (S_ISLNK (s.st_mode) != 0) { has_symlinks = 1; break; } /* search backwards for last DIR_SEPARATOR */ p = tmp_pathspec + strlen (tmp_pathspec) - 1; while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) p--; if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) { /* no more DIR_SEPARATORS left */ break; } *p = '\0'; } else { lt_fatal (__FILE__, __LINE__, "error accessing file \"%s\": %s", tmp_pathspec, nonnull (strerror (errno))); } } XFREE (tmp_pathspec); if (!has_symlinks) { return xstrdup (pathspec); } tmp_pathspec = realpath (pathspec, buf); if (tmp_pathspec == 0) { lt_fatal (__FILE__, __LINE__, "could not follow symlinks for %s", pathspec); } return xstrdup (tmp_pathspec); #endif } char * strendzap (char *str, const char *pat) { size_t len, patlen; assert (str != NULL); assert (pat != NULL); len = strlen (str); patlen = strlen (pat); if (patlen <= len) { str += len - patlen; if (STREQ (str, pat)) *str = '\0'; } return str; } void lt_debugprintf (const char *file, int line, const char *fmt, ...) { va_list args; if (lt_debug) { (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); va_start (args, fmt); (void) vfprintf (stderr, fmt, args); va_end (args); } } static void lt_error_core (int exit_status, const char *file, int line, const char *mode, const char *message, va_list ap) { fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); vfprintf (stderr, message, ap); fprintf (stderr, ".\n"); if (exit_status >= 0) exit (exit_status); } void lt_fatal (const char *file, int line, const char *message, ...) { va_list ap; va_start (ap, message); lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); va_end (ap); } static const char * nonnull (const char *s) { return s ? s : "(null)"; } static const char * nonempty (const char *s) { return (s && !*s) ? "(empty)" : nonnull (s); } void lt_setenv (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_setenv) setting '%s' to '%s'\n", nonnull (name), nonnull (value)); { #ifdef HAVE_SETENV /* always make a copy, for consistency with !HAVE_SETENV */ char *str = xstrdup (value); setenv (name, str, 1); #else size_t len = strlen (name) + 1 + strlen (value) + 1; char *str = XMALLOC (char, len); sprintf (str, "%s=%s", name, value); if (putenv (str) != EXIT_SUCCESS) { XFREE (str); } #endif } } char * lt_extend_str (const char *orig_value, const char *add, int to_end) { char *new_value; if (orig_value && *orig_value) { size_t orig_value_len = strlen (orig_value); size_t add_len = strlen (add); new_value = XMALLOC (char, add_len + orig_value_len + 1); if (to_end) { strcpy (new_value, orig_value); strcpy (new_value + orig_value_len, add); } else { strcpy (new_value, add); strcpy (new_value + add_len, orig_value); } } else { new_value = xstrdup (add); } return new_value; } void lt_update_exe_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); /* some systems can't cope with a ':'-terminated path #' */ size_t len = strlen (new_value); while ((len > 0) && IS_PATH_SEPARATOR (new_value[len-1])) { new_value[--len] = '\0'; } lt_setenv (name, new_value); XFREE (new_value); } } void lt_update_lib_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); lt_setenv (name, new_value); XFREE (new_value); } } EOF case $host_os in mingw*) cat <<"EOF" /* Prepares an argument vector before calling spawn(). Note that spawn() does not by itself call the command interpreter (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&v); v.dwPlatformId == VER_PLATFORM_WIN32_NT; }) ? "cmd.exe" : "command.com"). Instead it simply concatenates the arguments, separated by ' ', and calls CreateProcess(). We must quote the arguments since Win32 CreateProcess() interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a special way: - Space and tab are interpreted as delimiters. They are not treated as delimiters if they are surrounded by double quotes: "...". - Unescaped double quotes are removed from the input. Their only effect is that within double quotes, space and tab are treated like normal characters. - Backslashes not followed by double quotes are not special. - But 2*n+1 backslashes followed by a double quote become n backslashes followed by a double quote (n >= 0): \" -> " \\\" -> \" \\\\\" -> \\" */ #define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" #define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" char ** prepare_spawn (char **argv) { size_t argc; char **new_argv; size_t i; /* Count number of arguments. */ for (argc = 0; argv[argc] != NULL; argc++) ; /* Allocate new argument vector. */ new_argv = XMALLOC (char *, argc + 1); /* Put quoted arguments into the new argument vector. */ for (i = 0; i < argc; i++) { const char *string = argv[i]; if (string[0] == '\0') new_argv[i] = xstrdup ("\"\""); else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) { int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); size_t length; unsigned int backslashes; const char *s; char *quoted_string; char *p; length = 0; backslashes = 0; if (quote_around) length++; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') length += backslashes + 1; length++; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) length += backslashes + 1; quoted_string = XMALLOC (char, length + 1); p = quoted_string; backslashes = 0; if (quote_around) *p++ = '"'; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') { unsigned int j; for (j = backslashes + 1; j > 0; j--) *p++ = '\\'; } *p++ = c; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) { unsigned int j; for (j = backslashes; j > 0; j--) *p++ = '\\'; *p++ = '"'; } *p = '\0'; new_argv[i] = quoted_string; } else new_argv[i] = (char *) string; } new_argv[argc] = NULL; return new_argv; } EOF ;; esac cat <<"EOF" void lt_dump_script (FILE* f) { EOF func_emit_wrapper yes | $SED -n -e ' s/^\(.\{79\}\)\(..*\)/\1\ \2/ h s/\([\\"]\)/\\\1/g s/$/\\n/ s/\([^\n]*\).*/ fputs ("\1", f);/p g D' cat <<"EOF" } EOF } # end: func_emit_cwrapperexe_src # func_win32_import_lib_p ARG # True if ARG is an import lib, as indicated by $file_magic_cmd func_win32_import_lib_p () { $debug_cmd case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in *import*) : ;; *) false ;; esac } # func_suncc_cstd_abi # !!ONLY CALL THIS FOR SUN CC AFTER $compile_command IS FULLY EXPANDED!! # Several compiler flags select an ABI that is incompatible with the # Cstd library. Avoid specifying it if any are in CXXFLAGS. func_suncc_cstd_abi () { $debug_cmd case " $compile_command " in *" -compat=g "*|*\ -std=c++[0-9][0-9]\ *|*" -library=stdcxx4 "*|*" -library=stlport4 "*) suncc_use_cstd_abi=no ;; *) suncc_use_cstd_abi=yes ;; esac } # func_mode_link arg... func_mode_link () { $debug_cmd case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) # It is impossible to link a dll without this setting, and # we shouldn't force the makefile maintainer to figure out # what system we are compiling for in order to pass an extra # flag for every libtool invocation. # allow_undefined=no # FIXME: Unfortunately, there are problems with the above when trying # to make a dll that has undefined symbols, in which case not # even a static library is built. For now, we need to specify # -no-undefined on the libtool link line when we can be certain # that all symbols are satisfied, otherwise we get a static library. allow_undefined=yes ;; *) allow_undefined=yes ;; esac libtool_args=$nonopt base_compile="$nonopt $@" compile_command=$nonopt finalize_command=$nonopt compile_rpath= finalize_rpath= compile_shlibpath= finalize_shlibpath= convenience= old_convenience= deplibs= old_deplibs= compiler_flags= linker_flags= dllsearchpath= lib_search_path=`pwd` inst_prefix_dir= new_inherited_linker_flags= avoid_version=no bindir= dlfiles= dlprefiles= dlself=no export_dynamic=no export_symbols= export_symbols_regex= generated= libobjs= ltlibs= module=no no_install=no objs= os2dllname= non_pic_objects= precious_files_regex= prefer_static_libs=no preload=false prev= prevarg= release= rpath= xrpath= perm_rpath= temp_rpath= thread_safe=no vinfo= vinfo_number=no weak_libs= single_module=$wl-single_module func_infer_tag $base_compile # We need to know -static, to get the right output filenames. for arg do case $arg in -shared) test yes != "$build_libtool_libs" \ && func_fatal_configuration "cannot build a shared library" build_old_libs=no break ;; -all-static | -static | -static-libtool-libs) case $arg in -all-static) if test yes = "$build_libtool_libs" && test -z "$link_static_flag"; then func_warning "complete static linking is impossible in this configuration" fi if test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; -static) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=built ;; -static-libtool-libs) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; esac build_libtool_libs=no build_old_libs=yes break ;; esac done # See if our shared archives depend on static archives. test -n "$old_archive_from_new_cmds" && build_old_libs=yes # Go through the arguments, transforming them on the way. while test "$#" -gt 0; do arg=$1 shift func_quote_for_eval "$arg" qarg=$func_quote_for_eval_unquoted_result func_append libtool_args " $func_quote_for_eval_result" # If the previous option needs an argument, assign it. if test -n "$prev"; then case $prev in output) func_append compile_command " @OUTPUT@" func_append finalize_command " @OUTPUT@" ;; esac case $prev in bindir) bindir=$arg prev= continue ;; dlfiles|dlprefiles) $preload || { # Add the symbol object into the linking commands. func_append compile_command " @SYMFILE@" func_append finalize_command " @SYMFILE@" preload=: } case $arg in *.la | *.lo) ;; # We handle these cases below. force) if test no = "$dlself"; then dlself=needless export_dynamic=yes fi prev= continue ;; self) if test dlprefiles = "$prev"; then dlself=yes elif test dlfiles = "$prev" && test yes != "$dlopen_self"; then dlself=yes else dlself=needless export_dynamic=yes fi prev= continue ;; *) if test dlfiles = "$prev"; then func_append dlfiles " $arg" else func_append dlprefiles " $arg" fi prev= continue ;; esac ;; expsyms) export_symbols=$arg test -f "$arg" \ || func_fatal_error "symbol file '$arg' does not exist" prev= continue ;; expsyms_regex) export_symbols_regex=$arg prev= continue ;; framework) case $host in *-*-darwin*) case "$deplibs " in *" $qarg.ltframework "*) ;; *) func_append deplibs " $qarg.ltframework" # this is fixed later ;; esac ;; esac prev= continue ;; inst_prefix) inst_prefix_dir=$arg prev= continue ;; mllvm) # Clang does not use LLVM to link, so we can simply discard any # '-mllvm $arg' options when doing the link step. prev= continue ;; objectlist) if test -f "$arg"; then save_arg=$arg moreargs= for fil in `cat "$save_arg"` do # func_append moreargs " $fil" arg=$fil # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test none = "$pic_object" && test none = "$non_pic_object"; then func_fatal_error "cannot find name of object for '$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir=$func_dirname_result if test none != "$pic_object"; then # Prepend the subdirectory the object is found in. pic_object=$xdir$pic_object if test dlfiles = "$prev"; then if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then func_append dlfiles " $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test dlprefiles = "$prev"; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg=$pic_object fi # Non-PIC object. if test none != "$non_pic_object"; then # Prepend the subdirectory the object is found in. non_pic_object=$xdir$non_pic_object # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test none = "$pic_object"; then arg=$non_pic_object fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object=$pic_object func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir=$func_dirname_result func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "'$arg' is not a valid libtool object" fi fi done else func_fatal_error "link input file '$arg' does not exist" fi arg=$save_arg prev= continue ;; os2dllname) os2dllname=$arg prev= continue ;; precious_regex) precious_files_regex=$arg prev= continue ;; release) release=-$arg prev= continue ;; rpath | xrpath) # We need an absolute path. case $arg in [\\/]* | [A-Za-z]:[\\/]*) ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac if test rpath = "$prev"; then case "$rpath " in *" $arg "*) ;; *) func_append rpath " $arg" ;; esac else case "$xrpath " in *" $arg "*) ;; *) func_append xrpath " $arg" ;; esac fi prev= continue ;; shrext) shrext_cmds=$arg prev= continue ;; weak) func_append weak_libs " $arg" prev= continue ;; xcclinker) func_append linker_flags " $qarg" func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xcompiler) func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xlinker) func_append linker_flags " $qarg" func_append compiler_flags " $wl$qarg" prev= func_append compile_command " $wl$qarg" func_append finalize_command " $wl$qarg" continue ;; *) eval "$prev=\"\$arg\"" prev= continue ;; esac fi # test -n "$prev" prevarg=$arg case $arg in -all-static) if test -n "$link_static_flag"; then # See comment for -static flag below, for more details. func_append compile_command " $link_static_flag" func_append finalize_command " $link_static_flag" fi continue ;; -allow-undefined) # FIXME: remove this flag sometime in the future. func_fatal_error "'-allow-undefined' must not be used because it is the default" ;; -avoid-version) avoid_version=yes continue ;; -bindir) prev=bindir continue ;; -dlopen) prev=dlfiles continue ;; -dlpreopen) prev=dlprefiles continue ;; -export-dynamic) export_dynamic=yes continue ;; -export-symbols | -export-symbols-regex) if test -n "$export_symbols" || test -n "$export_symbols_regex"; then func_fatal_error "more than one -exported-symbols argument is not allowed" fi if test X-export-symbols = "X$arg"; then prev=expsyms else prev=expsyms_regex fi continue ;; -framework) prev=framework continue ;; -inst-prefix-dir) prev=inst_prefix continue ;; # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* # so, if we see these flags be careful not to treat them like -L -L[A-Z][A-Z]*:*) case $with_gcc/$host in no/*-*-irix* | /*-*-irix*) func_append compile_command " $arg" func_append finalize_command " $arg" ;; esac continue ;; -L*) func_stripname "-L" '' "$arg" if test -z "$func_stripname_result"; then if test "$#" -gt 0; then func_fatal_error "require no space between '-L' and '$1'" else func_fatal_error "need path for '-L' option" fi fi func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) absdir=`cd "$dir" && pwd` test -z "$absdir" && \ func_fatal_error "cannot determine absolute directory name of '$dir'" dir=$absdir ;; esac case "$deplibs " in *" -L$dir "* | *" $arg "*) # Will only happen for absolute or sysroot arguments ;; *) # Preserve sysroot, but never include relative directories case $dir in [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; *) func_append deplibs " -L$dir" ;; esac func_append lib_search_path " $dir" ;; esac case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` case :$dllsearchpath: in *":$dir:"*) ;; ::) dllsearchpath=$dir;; *) func_append dllsearchpath ":$dir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) func_append dllsearchpath ":$testbindir";; esac ;; esac continue ;; -l*) if test X-lc = "X$arg" || test X-lm = "X$arg"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) # These systems don't actually have a C or math library (as such) continue ;; *-*-os2*) # These systems don't actually have a C library (as such) test X-lc = "X$arg" && continue ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*) # Do not include libc due to us having libc/libc_r. test X-lc = "X$arg" && continue ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C and math libraries are in the System framework func_append deplibs " System.ltframework" continue ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype test X-lc = "X$arg" && continue ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work test X-lc = "X$arg" && continue ;; esac elif test X-lc_r = "X$arg"; then case $host in *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*) # Do not include libc_r directly, use -pthread flag. continue ;; esac fi func_append deplibs " $arg" continue ;; -mllvm) prev=mllvm continue ;; -module) module=yes continue ;; # Tru64 UNIX uses -model [arg] to determine the layout of C++ # classes, name mangling, and exception handling. # Darwin uses the -arch flag to determine output architecture. -model|-arch|-isysroot|--sysroot) func_append compiler_flags " $arg" func_append compile_command " $arg" func_append finalize_command " $arg" prev=xcompiler continue ;; -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) func_append compiler_flags " $arg" func_append compile_command " $arg" func_append finalize_command " $arg" case "$new_inherited_linker_flags " in *" $arg "*) ;; * ) func_append new_inherited_linker_flags " $arg" ;; esac continue ;; -multi_module) single_module=$wl-multi_module continue ;; -no-fast-install) fast_install=no continue ;; -no-install) case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) # The PATH hackery in wrapper scripts is required on Windows # and Darwin in order for the loader to find any dlls it needs. func_warning "'-no-install' is ignored for $host" func_warning "assuming '-no-fast-install' instead" fast_install=no ;; *) no_install=yes ;; esac continue ;; -no-undefined) allow_undefined=no continue ;; -objectlist) prev=objectlist continue ;; -os2dllname) prev=os2dllname continue ;; -o) prev=output ;; -precious-files-regex) prev=precious_regex continue ;; -release) prev=release continue ;; -rpath) prev=rpath continue ;; -R) prev=xrpath continue ;; -R*) func_stripname '-R' '' "$arg" dir=$func_stripname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; =*) func_stripname '=' '' "$dir" dir=$lt_sysroot$func_stripname_result ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac case "$xrpath " in *" $dir "*) ;; *) func_append xrpath " $dir" ;; esac continue ;; -shared) # The effects of -shared are defined in a previous loop. continue ;; -shrext) prev=shrext continue ;; -static | -static-libtool-libs) # The effects of -static are defined in a previous loop. # We used to do the same as -all-static on platforms that # didn't have a PIC flag, but the assumption that the effects # would be equivalent was wrong. It would break on at least # Digital Unix and AIX. continue ;; -thread-safe) thread_safe=yes continue ;; -version-info) prev=vinfo continue ;; -version-number) prev=vinfo vinfo_number=yes continue ;; -weak) prev=weak continue ;; -Wc,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result arg= save_ifs=$IFS; IFS=, for flag in $args; do IFS=$save_ifs func_quote_for_eval "$flag" func_append arg " $func_quote_for_eval_result" func_append compiler_flags " $func_quote_for_eval_result" done IFS=$save_ifs func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Wl,*) func_stripname '-Wl,' '' "$arg" args=$func_stripname_result arg= save_ifs=$IFS; IFS=, for flag in $args; do IFS=$save_ifs func_quote_for_eval "$flag" func_append arg " $wl$func_quote_for_eval_result" func_append compiler_flags " $wl$func_quote_for_eval_result" func_append linker_flags " $func_quote_for_eval_result" done IFS=$save_ifs func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Xcompiler) prev=xcompiler continue ;; -Xlinker) prev=xlinker continue ;; -XCClinker) prev=xcclinker continue ;; # -msg_* for osf cc -msg_*) func_quote_for_eval "$arg" arg=$func_quote_for_eval_result ;; # Flags to be passed through unchanged, with rationale: # -64, -mips[0-9] enable 64-bit mode for the SGI compiler # -r[0-9][0-9]* specify processor for the SGI compiler # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler # +DA*, +DD* enable 64-bit mode for the HP compiler # -q* compiler args for the IBM compiler # -m*, -t[45]*, -txscale* architecture-specific flags for GCC # -F/path path to uninstalled frameworks, gcc on darwin # -p, -pg, --coverage, -fprofile-* profiling flags for GCC # -fstack-protector* stack protector flags for GCC # @file GCC response files # -tp=* Portland pgcc target processor selection # --sysroot=* for sysroot support # -O*, -g*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization # -stdlib=* select c++ std lib with clang -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ -O*|-g*|-flto*|-fwhopr*|-fuse-linker-plugin|-fstack-protector*|-stdlib=*) func_quote_for_eval "$arg" arg=$func_quote_for_eval_result func_append compile_command " $arg" func_append finalize_command " $arg" func_append compiler_flags " $arg" continue ;; -Z*) if test os2 = "`expr $host : '.*\(os2\)'`"; then # OS/2 uses -Zxxx to specify OS/2-specific options compiler_flags="$compiler_flags $arg" func_append compile_command " $arg" func_append finalize_command " $arg" case $arg in -Zlinker | -Zstack) prev=xcompiler ;; esac continue else # Otherwise treat like 'Some other compiler flag' below func_quote_for_eval "$arg" arg=$func_quote_for_eval_result fi ;; # Some other compiler flag. -* | +*) func_quote_for_eval "$arg" arg=$func_quote_for_eval_result ;; *.$objext) # A standard object. func_append objs " $arg" ;; *.lo) # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test none = "$pic_object" && test none = "$non_pic_object"; then func_fatal_error "cannot find name of object for '$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir=$func_dirname_result test none = "$pic_object" || { # Prepend the subdirectory the object is found in. pic_object=$xdir$pic_object if test dlfiles = "$prev"; then if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then func_append dlfiles " $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test dlprefiles = "$prev"; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg=$pic_object } # Non-PIC object. if test none != "$non_pic_object"; then # Prepend the subdirectory the object is found in. non_pic_object=$xdir$non_pic_object # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test none = "$pic_object"; then arg=$non_pic_object fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object=$pic_object func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir=$func_dirname_result func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "'$arg' is not a valid libtool object" fi fi ;; *.$libext) # An archive. func_append deplibs " $arg" func_append old_deplibs " $arg" continue ;; *.la) # A libtool-controlled library. func_resolve_sysroot "$arg" if test dlfiles = "$prev"; then # This library was specified with -dlopen. func_append dlfiles " $func_resolve_sysroot_result" prev= elif test dlprefiles = "$prev"; then # The library was specified with -dlpreopen. func_append dlprefiles " $func_resolve_sysroot_result" prev= else func_append deplibs " $func_resolve_sysroot_result" fi continue ;; # Some other compiler argument. *) # Unknown arguments in both finalize_command and compile_command need # to be aesthetically quoted because they are evaled later. func_quote_for_eval "$arg" arg=$func_quote_for_eval_result ;; esac # arg # Now actually substitute the argument into the commands. if test -n "$arg"; then func_append compile_command " $arg" func_append finalize_command " $arg" fi done # argument parsing loop test -n "$prev" && \ func_fatal_help "the '$prevarg' option requires an argument" if test yes = "$export_dynamic" && test -n "$export_dynamic_flag_spec"; then eval arg=\"$export_dynamic_flag_spec\" func_append compile_command " $arg" func_append finalize_command " $arg" fi oldlibs= # calculate the name of the file, without its directory func_basename "$output" outputname=$func_basename_result libobjs_save=$libobjs if test -n "$shlibpath_var"; then # get the directories listed in $shlibpath_var eval shlib_search_path=\`\$ECHO \"\$$shlibpath_var\" \| \$SED \'s/:/ /g\'\` else shlib_search_path= fi eval sys_lib_search_path=\"$sys_lib_search_path_spec\" eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" # Definition is injected by LT_CONFIG during libtool generation. func_munge_path_list sys_lib_dlsearch_path "$LT_SYS_LIBRARY_PATH" func_dirname "$output" "/" "" output_objdir=$func_dirname_result$objdir func_to_tool_file "$output_objdir/" tool_output_objdir=$func_to_tool_file_result # Create the object directory. func_mkdir_p "$output_objdir" # Determine the type of output case $output in "") func_fatal_help "you must specify an output file" ;; *.$libext) linkmode=oldlib ;; *.lo | *.$objext) linkmode=obj ;; *.la) linkmode=lib ;; *) linkmode=prog ;; # Anything else should be a program. esac specialdeplibs= libs= # Find all interdependent deplibs by searching for libraries # that are linked more than once (e.g. -la -lb -la) for deplib in $deplibs; do if $opt_preserve_dup_deps; then case "$libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append libs " $deplib" done if test lib = "$linkmode"; then libs="$predeps $libs $compiler_lib_search_path $postdeps" # Compute libraries that are listed more than once in $predeps # $postdeps and mark them as special (i.e., whose duplicates are # not to be eliminated). pre_post_deps= if $opt_duplicate_compiler_generated_deps; then for pre_post_dep in $predeps $postdeps; do case "$pre_post_deps " in *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;; esac func_append pre_post_deps " $pre_post_dep" done fi pre_post_deps= fi deplibs= newdependency_libs= newlib_search_path= need_relink=no # whether we're linking any uninstalled libtool libraries notinst_deplibs= # not-installed libtool libraries notinst_path= # paths that contain not-installed libtool libraries case $linkmode in lib) passes="conv dlpreopen link" for file in $dlfiles $dlprefiles; do case $file in *.la) ;; *) func_fatal_help "libraries can '-dlopen' only libtool libraries: $file" ;; esac done ;; prog) compile_deplibs= finalize_deplibs= alldeplibs=false newdlfiles= newdlprefiles= passes="conv scan dlopen dlpreopen link" ;; *) passes="conv" ;; esac for pass in $passes; do # The preopen pass in lib mode reverses $deplibs; put it back here # so that -L comes before libs that need it for instance... if test lib,link = "$linkmode,$pass"; then ## FIXME: Find the place where the list is rebuilt in the wrong ## order, and fix it there properly tmp_deplibs= for deplib in $deplibs; do tmp_deplibs="$deplib $tmp_deplibs" done deplibs=$tmp_deplibs fi if test lib,link = "$linkmode,$pass" || test prog,scan = "$linkmode,$pass"; then libs=$deplibs deplibs= fi if test prog = "$linkmode"; then case $pass in dlopen) libs=$dlfiles ;; dlpreopen) libs=$dlprefiles ;; link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; esac fi if test lib,dlpreopen = "$linkmode,$pass"; then # Collect and forward deplibs of preopened libtool libs for lib in $dlprefiles; do # Ignore non-libtool-libs dependency_libs= func_resolve_sysroot "$lib" case $lib in *.la) func_source "$func_resolve_sysroot_result" ;; esac # Collect preopened libtool deplibs, except any this library # has declared as weak libs for deplib in $dependency_libs; do func_basename "$deplib" deplib_base=$func_basename_result case " $weak_libs " in *" $deplib_base "*) ;; *) func_append deplibs " $deplib" ;; esac done done libs=$dlprefiles fi if test dlopen = "$pass"; then # Collect dlpreopened libraries save_deplibs=$deplibs deplibs= fi for deplib in $libs; do lib= found=false case $deplib in -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) if test prog,link = "$linkmode,$pass"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append compiler_flags " $deplib" if test lib = "$linkmode"; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; esac fi fi continue ;; -l*) if test lib != "$linkmode" && test prog != "$linkmode"; then func_warning "'-l' is ignored for archives/objects" continue fi func_stripname '-l' '' "$deplib" name=$func_stripname_result if test lib = "$linkmode"; then searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" else searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" fi for searchdir in $searchdirs; do for search_ext in .la $std_shrext .so .a; do # Search the libtool library lib=$searchdir/lib$name$search_ext if test -f "$lib"; then if test .la = "$search_ext"; then found=: else found=false fi break 2 fi done done if $found; then # deplib is a libtool library # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, # We need to do some special things here, and not later. if test yes = "$allow_libtool_libs_with_static_runtimes"; then case " $predeps $postdeps " in *" $deplib "*) if func_lalib_p "$lib"; then library_names= old_library= func_source "$lib" for l in $old_library $library_names; do ll=$l done if test "X$ll" = "X$old_library"; then # only static version available found=false func_dirname "$lib" "" "." ladir=$func_dirname_result lib=$ladir/$old_library if test prog,link = "$linkmode,$pass"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs" fi continue fi fi ;; *) ;; esac fi else # deplib doesn't seem to be a libtool library if test prog,link = "$linkmode,$pass"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs" fi continue fi ;; # -l *.ltframework) if test prog,link = "$linkmode,$pass"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" if test lib = "$linkmode"; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; esac fi fi continue ;; -L*) case $linkmode in lib) deplibs="$deplib $deplibs" test conv = "$pass" && continue newdependency_libs="$deplib $newdependency_libs" func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; prog) if test conv = "$pass"; then deplibs="$deplib $deplibs" continue fi if test scan = "$pass"; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; *) func_warning "'-L' is ignored for archives/objects" ;; esac # linkmode continue ;; # -L -R*) if test link = "$pass"; then func_stripname '-R' '' "$deplib" func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result # Make sure the xrpath contains only unique directories. case "$xrpath " in *" $dir "*) ;; *) func_append xrpath " $dir" ;; esac fi deplibs="$deplib $deplibs" continue ;; *.la) func_resolve_sysroot "$deplib" lib=$func_resolve_sysroot_result ;; *.$libext) if test conv = "$pass"; then deplibs="$deplib $deplibs" continue fi case $linkmode in lib) # Linking convenience modules into shared libraries is allowed, # but linking other static libraries is non-portable. case " $dlpreconveniencelibs " in *" $deplib "*) ;; *) valid_a_lib=false case $deplibs_check_method in match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ | $EGREP "$match_pattern_regex" > /dev/null; then valid_a_lib=: fi ;; pass_all) valid_a_lib=: ;; esac if $valid_a_lib; then echo $ECHO "*** Warning: Linking the shared library $output against the" $ECHO "*** static library $deplib is not portable!" deplibs="$deplib $deplibs" else echo $ECHO "*** Warning: Trying to link with static lib archive $deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because the file extensions .$libext of this argument makes me believe" echo "*** that it is just a static archive that I should not use here." fi ;; esac continue ;; prog) if test link != "$pass"; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi continue ;; esac # linkmode ;; # *.$libext *.lo | *.$objext) if test conv = "$pass"; then deplibs="$deplib $deplibs" elif test prog = "$linkmode"; then if test dlpreopen = "$pass" || test yes != "$dlopen_support" || test no = "$build_libtool_libs"; then # If there is no dlopen support or we're linking statically, # we need to preload. func_append newdlprefiles " $deplib" compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append newdlfiles " $deplib" fi fi continue ;; %DEPLIBS%) alldeplibs=: continue ;; esac # case $deplib $found || test -f "$lib" \ || func_fatal_error "cannot find the library '$lib' or unhandled argument '$deplib'" # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$lib" \ || func_fatal_error "'$lib' is not a valid libtool archive" func_dirname "$lib" "" "." ladir=$func_dirname_result dlname= dlopen= dlpreopen= libdir= library_names= old_library= inherited_linker_flags= # If the library was installed with an old release of libtool, # it will not redefine variables installed, or shouldnotlink installed=yes shouldnotlink=no avoidtemprpath= # Read the .la file func_source "$lib" # Convert "-framework foo" to "foo.ltframework" if test -n "$inherited_linker_flags"; then tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do case " $new_inherited_linker_flags " in *" $tmp_inherited_linker_flag "*) ;; *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";; esac done fi dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` if test lib,link = "$linkmode,$pass" || test prog,scan = "$linkmode,$pass" || { test prog != "$linkmode" && test lib != "$linkmode"; }; then test -n "$dlopen" && func_append dlfiles " $dlopen" test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" fi if test conv = "$pass"; then # Only check for convenience libraries deplibs="$lib $deplibs" if test -z "$libdir"; then if test -z "$old_library"; then func_fatal_error "cannot find name of link library for '$lib'" fi # It is a libtool convenience library, so add in its objects. func_append convenience " $ladir/$objdir/$old_library" func_append old_convenience " $ladir/$objdir/$old_library" elif test prog != "$linkmode" && test lib != "$linkmode"; then func_fatal_error "'$lib' is not a convenience library" fi tmp_libs= for deplib in $dependency_libs; do deplibs="$deplib $deplibs" if $opt_preserve_dup_deps; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append tmp_libs " $deplib" done continue fi # $pass = conv # Get the name of the library we link against. linklib= if test -n "$old_library" && { test yes = "$prefer_static_libs" || test built,no = "$prefer_static_libs,$installed"; }; then linklib=$old_library else for l in $old_library $library_names; do linklib=$l done fi if test -z "$linklib"; then func_fatal_error "cannot find name of link library for '$lib'" fi # This library was specified with -dlopen. if test dlopen = "$pass"; then test -z "$libdir" \ && func_fatal_error "cannot -dlopen a convenience library: '$lib'" if test -z "$dlname" || test yes != "$dlopen_support" || test no = "$build_libtool_libs" then # If there is no dlname, no dlopen support or we're linking # statically, we need to preload. We also need to preload any # dependent libraries so libltdl's deplib preloader doesn't # bomb out in the load deplibs phase. func_append dlprefiles " $lib $dependency_libs" else func_append newdlfiles " $lib" fi continue fi # $pass = dlopen # We need an absolute path. case $ladir in [\\/]* | [A-Za-z]:[\\/]*) abs_ladir=$ladir ;; *) abs_ladir=`cd "$ladir" && pwd` if test -z "$abs_ladir"; then func_warning "cannot determine absolute directory name of '$ladir'" func_warning "passing it literally to the linker, although it might fail" abs_ladir=$ladir fi ;; esac func_basename "$lib" laname=$func_basename_result # Find the relevant object directory and library name. if test yes = "$installed"; then if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then func_warning "library '$lib' was moved." dir=$ladir absdir=$abs_ladir libdir=$abs_ladir else dir=$lt_sysroot$libdir absdir=$lt_sysroot$libdir fi test yes = "$hardcode_automatic" && avoidtemprpath=yes else if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then dir=$ladir absdir=$abs_ladir # Remove this search path later func_append notinst_path " $abs_ladir" else dir=$ladir/$objdir absdir=$abs_ladir/$objdir # Remove this search path later func_append notinst_path " $abs_ladir" fi fi # $installed = yes func_stripname 'lib' '.la' "$laname" name=$func_stripname_result # This library was specified with -dlpreopen. if test dlpreopen = "$pass"; then if test -z "$libdir" && test prog = "$linkmode"; then func_fatal_error "only libraries may -dlpreopen a convenience library: '$lib'" fi case $host in # special handling for platforms with PE-DLLs. *cygwin* | *mingw* | *cegcc* ) # Linker will automatically link against shared library if both # static and shared are present. Therefore, ensure we extract # symbols from the import library if a shared library is present # (otherwise, the dlopen module name will be incorrect). We do # this by putting the import library name into $newdlprefiles. # We recover the dlopen module name by 'saving' the la file # name in a special purpose variable, and (later) extracting the # dlname from the la file. if test -n "$dlname"; then func_tr_sh "$dir/$linklib" eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" func_append newdlprefiles " $dir/$linklib" else func_append newdlprefiles " $dir/$old_library" # Keep a list of preopened convenience libraries to check # that they are being used correctly in the link pass. test -z "$libdir" && \ func_append dlpreconveniencelibs " $dir/$old_library" fi ;; * ) # Prefer using a static library (so that no silly _DYNAMIC symbols # are required to link). if test -n "$old_library"; then func_append newdlprefiles " $dir/$old_library" # Keep a list of preopened convenience libraries to check # that they are being used correctly in the link pass. test -z "$libdir" && \ func_append dlpreconveniencelibs " $dir/$old_library" # Otherwise, use the dlname, so that lt_dlopen finds it. elif test -n "$dlname"; then func_append newdlprefiles " $dir/$dlname" else func_append newdlprefiles " $dir/$linklib" fi ;; esac fi # $pass = dlpreopen if test -z "$libdir"; then # Link the convenience library if test lib = "$linkmode"; then deplibs="$dir/$old_library $deplibs" elif test prog,link = "$linkmode,$pass"; then compile_deplibs="$dir/$old_library $compile_deplibs" finalize_deplibs="$dir/$old_library $finalize_deplibs" else deplibs="$lib $deplibs" # used for prog,scan pass fi continue fi if test prog = "$linkmode" && test link != "$pass"; then func_append newlib_search_path " $ladir" deplibs="$lib $deplibs" linkalldeplibs=false if test no != "$link_all_deplibs" || test -z "$library_names" || test no = "$build_libtool_libs"; then linkalldeplibs=: fi tmp_libs= for deplib in $dependency_libs; do case $deplib in -L*) func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; esac # Need to link against all dependency_libs? if $linkalldeplibs; then deplibs="$deplib $deplibs" else # Need to hardcode shared library paths # or/and link against static libraries newdependency_libs="$deplib $newdependency_libs" fi if $opt_preserve_dup_deps; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append tmp_libs " $deplib" done # for deplib continue fi # $linkmode = prog... if test prog,link = "$linkmode,$pass"; then if test -n "$library_names" && { { test no = "$prefer_static_libs" || test built,yes = "$prefer_static_libs,$installed"; } || test -z "$old_library"; }; then # We need to hardcode the library path if test -n "$shlibpath_var" && test -z "$avoidtemprpath"; then # Make sure the rpath contains only unique directories. case $temp_rpath: in *"$absdir:"*) ;; *) func_append temp_rpath "$absdir:" ;; esac fi # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) func_append compile_rpath " $absdir" ;; esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac ;; esac fi # $linkmode,$pass = prog,link... if $alldeplibs && { test pass_all = "$deplibs_check_method" || { test yes = "$build_libtool_libs" && test -n "$library_names"; }; }; then # We only need to search for static libraries continue fi fi link_static=no # Whether the deplib will be linked statically use_static_libs=$prefer_static_libs if test built = "$use_static_libs" && test yes = "$installed"; then use_static_libs=no fi if test -n "$library_names" && { test no = "$use_static_libs" || test -z "$old_library"; }; then case $host in *cygwin* | *mingw* | *cegcc* | *os2*) # No point in relinking DLLs because paths are not encoded func_append notinst_deplibs " $lib" need_relink=no ;; *) if test no = "$installed"; then func_append notinst_deplibs " $lib" need_relink=yes fi ;; esac # This is a shared library # Warn about portability, can't link against -module's on some # systems (darwin). Don't bleat about dlopened modules though! dlopenmodule= for dlpremoduletest in $dlprefiles; do if test "X$dlpremoduletest" = "X$lib"; then dlopenmodule=$dlpremoduletest break fi done if test -z "$dlopenmodule" && test yes = "$shouldnotlink" && test link = "$pass"; then echo if test prog = "$linkmode"; then $ECHO "*** Warning: Linking the executable $output against the loadable module" else $ECHO "*** Warning: Linking the shared library $output against the loadable module" fi $ECHO "*** $linklib is not portable!" fi if test lib = "$linkmode" && test yes = "$hardcode_into_libs"; then # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) func_append compile_rpath " $absdir" ;; esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac ;; esac fi if test -n "$old_archive_from_expsyms_cmds"; then # figure out the soname set dummy $library_names shift realname=$1 shift libname=`eval "\\$ECHO \"$libname_spec\""` # use dlname if we got it. it's perfectly good, no? if test -n "$dlname"; then soname=$dlname elif test -n "$soname_spec"; then # bleh windows case $host in *cygwin* | mingw* | *cegcc* | *os2*) func_arith $current - $age major=$func_arith_result versuffix=-$major ;; esac eval soname=\"$soname_spec\" else soname=$realname fi # Make a new name for the extract_expsyms_cmds to use soroot=$soname func_basename "$soroot" soname=$func_basename_result func_stripname 'lib' '.dll' "$soname" newlib=libimp-$func_stripname_result.a # If the library has no export list, then create one now if test -f "$output_objdir/$soname-def"; then : else func_verbose "extracting exported symbol list from '$soname'" func_execute_cmds "$extract_expsyms_cmds" 'exit $?' fi # Create $newlib if test -f "$output_objdir/$newlib"; then :; else func_verbose "generating import library for '$soname'" func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' fi # make sure the library variables are pointing to the new library dir=$output_objdir linklib=$newlib fi # test -n "$old_archive_from_expsyms_cmds" if test prog = "$linkmode" || test relink != "$opt_mode"; then add_shlibpath= add_dir= add= lib_linked=yes case $hardcode_action in immediate | unsupported) if test no = "$hardcode_direct"; then add=$dir/$linklib case $host in *-*-sco3.2v5.0.[024]*) add_dir=-L$dir ;; *-*-sysv4*uw2*) add_dir=-L$dir ;; *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ *-*-unixware7*) add_dir=-L$dir ;; *-*-darwin* ) # if the lib is a (non-dlopened) module then we cannot # link against it, someone is ignoring the earlier warnings if /usr/bin/file -L $add 2> /dev/null | $GREP ": [^:]* bundle" >/dev/null; then if test "X$dlopenmodule" != "X$lib"; then $ECHO "*** Warning: lib $linklib is a module, not a shared library" if test -z "$old_library"; then echo echo "*** And there doesn't seem to be a static archive available" echo "*** The link will probably fail, sorry" else add=$dir/$old_library fi elif test -n "$old_library"; then add=$dir/$old_library fi fi esac elif test no = "$hardcode_minus_L"; then case $host in *-*-sunos*) add_shlibpath=$dir ;; esac add_dir=-L$dir add=-l$name elif test no = "$hardcode_shlibpath_var"; then add_shlibpath=$dir add=-l$name else lib_linked=no fi ;; relink) if test yes = "$hardcode_direct" && test no = "$hardcode_direct_absolute"; then add=$dir/$linklib elif test yes = "$hardcode_minus_L"; then add_dir=-L$absdir # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) func_append add_dir " -L$inst_prefix_dir$libdir" ;; esac fi add=-l$name elif test yes = "$hardcode_shlibpath_var"; then add_shlibpath=$dir add=-l$name else lib_linked=no fi ;; *) lib_linked=no ;; esac if test yes != "$lib_linked"; then func_fatal_configuration "unsupported hardcode properties" fi if test -n "$add_shlibpath"; then case :$compile_shlibpath: in *":$add_shlibpath:"*) ;; *) func_append compile_shlibpath "$add_shlibpath:" ;; esac fi if test prog = "$linkmode"; then test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" test -n "$add" && compile_deplibs="$add $compile_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" if test yes != "$hardcode_direct" && test yes != "$hardcode_minus_L" && test yes = "$hardcode_shlibpath_var"; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac fi fi fi if test prog = "$linkmode" || test relink = "$opt_mode"; then add_shlibpath= add_dir= add= # Finalize command for both is simple: just hardcode it. if test yes = "$hardcode_direct" && test no = "$hardcode_direct_absolute"; then add=$libdir/$linklib elif test yes = "$hardcode_minus_L"; then add_dir=-L$libdir add=-l$name elif test yes = "$hardcode_shlibpath_var"; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac add=-l$name elif test yes = "$hardcode_automatic"; then if test -n "$inst_prefix_dir" && test -f "$inst_prefix_dir$libdir/$linklib"; then add=$inst_prefix_dir$libdir/$linklib else add=$libdir/$linklib fi else # We cannot seem to hardcode it, guess we'll fake it. add_dir=-L$libdir # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) func_append add_dir " -L$inst_prefix_dir$libdir" ;; esac fi add=-l$name fi if test prog = "$linkmode"; then test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" test -n "$add" && finalize_deplibs="$add $finalize_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" fi fi elif test prog = "$linkmode"; then # Here we assume that one of hardcode_direct or hardcode_minus_L # is not unsupported. This is valid on all known static and # shared platforms. if test unsupported != "$hardcode_direct"; then test -n "$old_library" && linklib=$old_library compile_deplibs="$dir/$linklib $compile_deplibs" finalize_deplibs="$dir/$linklib $finalize_deplibs" else compile_deplibs="-l$name -L$dir $compile_deplibs" finalize_deplibs="-l$name -L$dir $finalize_deplibs" fi elif test yes = "$build_libtool_libs"; then # Not a shared library if test pass_all != "$deplibs_check_method"; then # We're trying link a shared library against a static one # but the system doesn't support it. # Just print a warning and add the library to dependency_libs so # that the program can be linked against the static library. echo $ECHO "*** Warning: This system cannot link to static lib archive $lib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have." if test yes = "$module"; then echo "*** But as you try to build a module library, libtool will still create " echo "*** a static module, that should work as long as the dlopening application" echo "*** is linked with the -dlopen flag to resolve symbols at runtime." if test -z "$global_symbol_pipe"; then echo echo "*** However, this would only work if libtool was able to extract symbol" echo "*** lists from a program, using 'nm' or equivalent, but libtool could" echo "*** not find such a program. So, this module is probably useless." echo "*** 'nm' from GNU binutils and a full rebuild may help." fi if test no = "$build_old_libs"; then build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi else deplibs="$dir/$old_library $deplibs" link_static=yes fi fi # link shared/static library? if test lib = "$linkmode"; then if test -n "$dependency_libs" && { test yes != "$hardcode_into_libs" || test yes = "$build_old_libs" || test yes = "$link_static"; }; then # Extract -R from dependency_libs temp_deplibs= for libdir in $dependency_libs; do case $libdir in -R*) func_stripname '-R' '' "$libdir" temp_xrpath=$func_stripname_result case " $xrpath " in *" $temp_xrpath "*) ;; *) func_append xrpath " $temp_xrpath";; esac;; *) func_append temp_deplibs " $libdir";; esac done dependency_libs=$temp_deplibs fi func_append newlib_search_path " $absdir" # Link against this library test no = "$link_static" && newdependency_libs="$abs_ladir/$laname $newdependency_libs" # ... and its dependency_libs tmp_libs= for deplib in $dependency_libs; do newdependency_libs="$deplib $newdependency_libs" case $deplib in -L*) func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result";; *) func_resolve_sysroot "$deplib" ;; esac if $opt_preserve_dup_deps; then case "$tmp_libs " in *" $func_resolve_sysroot_result "*) func_append specialdeplibs " $func_resolve_sysroot_result" ;; esac fi func_append tmp_libs " $func_resolve_sysroot_result" done if test no != "$link_all_deplibs"; then # Add the search paths of all dependency libraries for deplib in $dependency_libs; do path= case $deplib in -L*) path=$deplib ;; *.la) func_resolve_sysroot "$deplib" deplib=$func_resolve_sysroot_result func_dirname "$deplib" "" "." dir=$func_dirname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) absdir=$dir ;; *) absdir=`cd "$dir" && pwd` if test -z "$absdir"; then func_warning "cannot determine absolute directory name of '$dir'" absdir=$dir fi ;; esac if $GREP "^installed=no" $deplib > /dev/null; then case $host in *-*-darwin*) depdepl= eval deplibrary_names=`$SED -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` if test -n "$deplibrary_names"; then for tmp in $deplibrary_names; do depdepl=$tmp done if test -f "$absdir/$objdir/$depdepl"; then depdepl=$absdir/$objdir/$depdepl darwin_install_name=`$OTOOL -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` if test -z "$darwin_install_name"; then darwin_install_name=`$OTOOL64 -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` fi func_append compiler_flags " $wl-dylib_file $wl$darwin_install_name:$depdepl" func_append linker_flags " -dylib_file $darwin_install_name:$depdepl" path= fi fi ;; *) path=-L$absdir/$objdir ;; esac else eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` test -z "$libdir" && \ func_fatal_error "'$deplib' is not a valid libtool archive" test "$absdir" != "$libdir" && \ func_warning "'$deplib' seems to be moved" path=-L$absdir fi ;; esac case " $deplibs " in *" $path "*) ;; *) deplibs="$path $deplibs" ;; esac done fi # link_all_deplibs != no fi # linkmode = lib done # for deplib in $libs if test link = "$pass"; then if test prog = "$linkmode"; then compile_deplibs="$new_inherited_linker_flags $compile_deplibs" finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" else compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` fi fi dependency_libs=$newdependency_libs if test dlpreopen = "$pass"; then # Link the dlpreopened libraries before other libraries for deplib in $save_deplibs; do deplibs="$deplib $deplibs" done fi if test dlopen != "$pass"; then test conv = "$pass" || { # Make sure lib_search_path contains only unique directories. lib_search_path= for dir in $newlib_search_path; do case "$lib_search_path " in *" $dir "*) ;; *) func_append lib_search_path " $dir" ;; esac done newlib_search_path= } if test prog,link = "$linkmode,$pass"; then vars="compile_deplibs finalize_deplibs" else vars=deplibs fi for var in $vars dependency_libs; do # Add libraries to $var in reverse order eval tmp_libs=\"\$$var\" new_libs= for deplib in $tmp_libs; do # FIXME: Pedantically, this is the right thing to do, so # that some nasty dependency loop isn't accidentally # broken: #new_libs="$deplib $new_libs" # Pragmatically, this seems to cause very few problems in # practice: case $deplib in -L*) new_libs="$deplib $new_libs" ;; -R*) ;; *) # And here is the reason: when a library appears more # than once as an explicit dependence of a library, or # is implicitly linked in more than once by the # compiler, it is considered special, and multiple # occurrences thereof are not removed. Compare this # with having the same library being listed as a # dependency of multiple other libraries: in this case, # we know (pedantically, we assume) the library does not # need to be listed more than once, so we keep only the # last copy. This is not always right, but it is rare # enough that we require users that really mean to play # such unportable linking tricks to link the library # using -Wl,-lname, so that libtool does not consider it # for duplicate removal. case " $specialdeplibs " in *" $deplib "*) new_libs="$deplib $new_libs" ;; *) case " $new_libs " in *" $deplib "*) ;; *) new_libs="$deplib $new_libs" ;; esac ;; esac ;; esac done tmp_libs= for deplib in $new_libs; do case $deplib in -L*) case " $tmp_libs " in *" $deplib "*) ;; *) func_append tmp_libs " $deplib" ;; esac ;; *) func_append tmp_libs " $deplib" ;; esac done eval $var=\"$tmp_libs\" done # for var fi # Add Sun CC postdeps if required: test CXX = "$tagname" && { case $host_os in linux*) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 func_suncc_cstd_abi if test no != "$suncc_use_cstd_abi"; then func_append postdeps ' -library=Cstd -library=Crun' fi ;; esac ;; solaris*) func_cc_basename "$CC" case $func_cc_basename_result in CC* | sunCC*) func_suncc_cstd_abi if test no != "$suncc_use_cstd_abi"; then func_append postdeps ' -library=Cstd -library=Crun' fi ;; esac ;; esac } # Last step: remove runtime libs from dependency_libs # (they stay in deplibs) tmp_libs= for i in $dependency_libs; do case " $predeps $postdeps $compiler_lib_search_path " in *" $i "*) i= ;; esac if test -n "$i"; then func_append tmp_libs " $i" fi done dependency_libs=$tmp_libs done # for pass if test prog = "$linkmode"; then dlfiles=$newdlfiles fi if test prog = "$linkmode" || test lib = "$linkmode"; then dlprefiles=$newdlprefiles fi case $linkmode in oldlib) if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then func_warning "'-dlopen' is ignored for archives" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "'-l' and '-L' are ignored for archives" ;; esac test -n "$rpath" && \ func_warning "'-rpath' is ignored for archives" test -n "$xrpath" && \ func_warning "'-R' is ignored for archives" test -n "$vinfo" && \ func_warning "'-version-info/-version-number' is ignored for archives" test -n "$release" && \ func_warning "'-release' is ignored for archives" test -n "$export_symbols$export_symbols_regex" && \ func_warning "'-export-symbols' is ignored for archives" # Now set the variables for building old libraries. build_libtool_libs=no oldlibs=$output func_append objs "$old_deplibs" ;; lib) # Make sure we only generate libraries of the form 'libNAME.la'. case $outputname in lib*) func_stripname 'lib' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" ;; *) test no = "$module" \ && func_fatal_help "libtool library '$output' must begin with 'lib'" if test no != "$need_lib_prefix"; then # Add the "lib" prefix for modules if required func_stripname '' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" else func_stripname '' '.la' "$outputname" libname=$func_stripname_result fi ;; esac if test -n "$objs"; then if test pass_all != "$deplibs_check_method"; then func_fatal_error "cannot build libtool library '$output' from non-libtool objects on this host:$objs" else echo $ECHO "*** Warning: Linking the shared library $output against the non-libtool" $ECHO "*** objects $objs is not portable!" func_append libobjs " $objs" fi fi test no = "$dlself" \ || func_warning "'-dlopen self' is ignored for libtool libraries" set dummy $rpath shift test 1 -lt "$#" \ && func_warning "ignoring multiple '-rpath's for a libtool library" install_libdir=$1 oldlibs= if test -z "$rpath"; then if test yes = "$build_libtool_libs"; then # Building a libtool convenience library. # Some compilers have problems with a '.al' extension so # convenience libraries should have the same extension an # archive normally would. oldlibs="$output_objdir/$libname.$libext $oldlibs" build_libtool_libs=convenience build_old_libs=yes fi test -n "$vinfo" && \ func_warning "'-version-info/-version-number' is ignored for convenience libraries" test -n "$release" && \ func_warning "'-release' is ignored for convenience libraries" else # Parse the version information argument. save_ifs=$IFS; IFS=: set dummy $vinfo 0 0 0 shift IFS=$save_ifs test -n "$7" && \ func_fatal_help "too many parameters to '-version-info'" # convert absolute version numbers to libtool ages # this retains compatibility with .la files and attempts # to make the code below a bit more comprehensible case $vinfo_number in yes) number_major=$1 number_minor=$2 number_revision=$3 # # There are really only two kinds -- those that # use the current revision as the major version # and those that subtract age and use age as # a minor version. But, then there is irix # that has an extra 1 added just for fun # case $version_type in # correct linux to gnu/linux during the next big refactor darwin|freebsd-elf|linux|osf|windows|none) func_arith $number_major + $number_minor current=$func_arith_result age=$number_minor revision=$number_revision ;; freebsd-aout|qnx|sunos) current=$number_major revision=$number_minor age=0 ;; irix|nonstopux) func_arith $number_major + $number_minor current=$func_arith_result age=$number_minor revision=$number_minor lt_irix_increment=no ;; esac ;; no) current=$1 revision=$2 age=$3 ;; esac # Check that each of the things are valid numbers. case $current in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "CURRENT '$current' must be a nonnegative integer" func_fatal_error "'$vinfo' is not valid version information" ;; esac case $revision in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "REVISION '$revision' must be a nonnegative integer" func_fatal_error "'$vinfo' is not valid version information" ;; esac case $age in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "AGE '$age' must be a nonnegative integer" func_fatal_error "'$vinfo' is not valid version information" ;; esac if test "$age" -gt "$current"; then func_error "AGE '$age' is greater than the current interface number '$current'" func_fatal_error "'$vinfo' is not valid version information" fi # Calculate the version variables. major= versuffix= verstring= case $version_type in none) ;; darwin) # Like Linux, but with the current version available in # verstring for coding it into the library header func_arith $current - $age major=.$func_arith_result versuffix=$major.$age.$revision # Darwin ld doesn't like 0 for these options... func_arith $current + 1 minor_current=$func_arith_result xlcverstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision" verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" # On Darwin other compilers case $CC in nagfor*) verstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision" ;; *) verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" ;; esac ;; freebsd-aout) major=.$current versuffix=.$current.$revision ;; freebsd-elf) func_arith $current - $age major=.$func_arith_result versuffix=$major.$age.$revision ;; irix | nonstopux) if test no = "$lt_irix_increment"; then func_arith $current - $age else func_arith $current - $age + 1 fi major=$func_arith_result case $version_type in nonstopux) verstring_prefix=nonstopux ;; *) verstring_prefix=sgi ;; esac verstring=$verstring_prefix$major.$revision # Add in all the interfaces that we are compatible with. loop=$revision while test 0 -ne "$loop"; do func_arith $revision - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring=$verstring_prefix$major.$iface:$verstring done # Before this point, $major must not contain '.'. major=.$major versuffix=$major.$revision ;; linux) # correct to gnu/linux during the next big refactor func_arith $current - $age major=.$func_arith_result versuffix=$major.$age.$revision ;; osf) func_arith $current - $age major=.$func_arith_result versuffix=.$current.$age.$revision verstring=$current.$age.$revision # Add in all the interfaces that we are compatible with. loop=$age while test 0 -ne "$loop"; do func_arith $current - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring=$verstring:$iface.0 done # Make executables depend on our current version. func_append verstring ":$current.0" ;; qnx) major=.$current versuffix=.$current ;; sco) major=.$current versuffix=.$current ;; sunos) major=.$current versuffix=.$current.$revision ;; windows) # Use '-' rather than '.', since we only want one # extension on DOS 8.3 file systems. func_arith $current - $age major=$func_arith_result versuffix=-$major ;; *) func_fatal_configuration "unknown library version type '$version_type'" ;; esac # Clear the version info if we defaulted, and they specified a release. if test -z "$vinfo" && test -n "$release"; then major= case $version_type in darwin) # we can't check for "0.0" in archive_cmds due to quoting # problems, so we reset it completely verstring= ;; *) verstring=0.0 ;; esac if test no = "$need_version"; then versuffix= else versuffix=.0.0 fi fi # Remove version info from name if versioning should be avoided if test yes,no = "$avoid_version,$need_version"; then major= versuffix= verstring= fi # Check to see if the archive will have undefined symbols. if test yes = "$allow_undefined"; then if test unsupported = "$allow_undefined_flag"; then if test yes = "$build_old_libs"; then func_warning "undefined symbols not allowed in $host shared libraries; building static only" build_libtool_libs=no else func_fatal_error "can't build $host shared library unless -no-undefined is specified" fi fi else # Don't allow undefined symbols. allow_undefined_flag=$no_undefined_flag fi fi func_generate_dlsyms "$libname" "$libname" : func_append libobjs " $symfileobj" test " " = "$libobjs" && libobjs= if test relink != "$opt_mode"; then # Remove our outputs, but don't remove object files since they # may have been created when compiling PIC objects. removelist= tempremovelist=`$ECHO "$output_objdir/*"` for p in $tempremovelist; do case $p in *.$objext | *.gcno) ;; $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/$libname$release.*) if test -n "$precious_files_regex"; then if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 then continue fi fi func_append removelist " $p" ;; *) ;; esac done test -n "$removelist" && \ func_show_eval "${RM}r \$removelist" fi # Now set the variables for building old libraries. if test yes = "$build_old_libs" && test convenience != "$build_libtool_libs"; then func_append oldlibs " $output_objdir/$libname.$libext" # Transform .lo files to .o files. oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; $lo2o" | $NL2SP` fi # Eliminate all temporary directories. #for path in $notinst_path; do # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"` #done if test -n "$xrpath"; then # If the user specified any rpath flags, then add them. temp_xrpath= for libdir in $xrpath; do func_replace_sysroot "$libdir" func_append temp_xrpath " -R$func_replace_sysroot_result" case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac done if test yes != "$hardcode_into_libs" || test yes = "$build_old_libs"; then dependency_libs="$temp_xrpath $dependency_libs" fi fi # Make sure dlfiles contains only unique files that won't be dlpreopened old_dlfiles=$dlfiles dlfiles= for lib in $old_dlfiles; do case " $dlprefiles $dlfiles " in *" $lib "*) ;; *) func_append dlfiles " $lib" ;; esac done # Make sure dlprefiles contains only unique files old_dlprefiles=$dlprefiles dlprefiles= for lib in $old_dlprefiles; do case "$dlprefiles " in *" $lib "*) ;; *) func_append dlprefiles " $lib" ;; esac done if test yes = "$build_libtool_libs"; then if test -n "$rpath"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) # these systems don't actually have a c library (as such)! ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C library is in the System framework func_append deplibs " System.ltframework" ;; *-*-netbsd*) # Don't link with libc until the a.out ld.so is fixed. ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc due to us having libc/libc_r. ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work ;; *) # Add libc to deplibs on all other systems if necessary. if test yes = "$build_libtool_need_lc"; then func_append deplibs " -lc" fi ;; esac fi # Transform deplibs into only deplibs that can be linked in shared. name_save=$name libname_save=$libname release_save=$release versuffix_save=$versuffix major_save=$major # I'm not sure if I'm treating the release correctly. I think # release should show up in the -l (ie -lgmp5) so we don't want to # add it in twice. Is that correct? release= versuffix= major= newdeplibs= droppeddeps=no case $deplibs_check_method in pass_all) # Don't check for shared/static. Everything works. # This might be a little naive. We might want to check # whether the library exists or not. But this is on # osf3 & osf4 and I'm not really sure... Just # implementing what was already the behavior. newdeplibs=$deplibs ;; test_compile) # This code stresses the "libraries are programs" paradigm to its # limits. Maybe even breaks it. We compile a program, linking it # against the deplibs as a proxy for the library. Then we can check # whether they linked in statically or dynamically with ldd. $opt_dry_run || $RM conftest.c cat > conftest.c </dev/null` $nocaseglob else potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` fi for potent_lib in $potential_libs; do # Follow soft links. if ls -lLd "$potent_lib" 2>/dev/null | $GREP " -> " >/dev/null; then continue fi # The statement above tries to avoid entering an # endless loop below, in case of cyclic links. # We might still enter an endless loop, since a link # loop can be closed while we follow links, # but so what? potlib=$potent_lib while test -h "$potlib" 2>/dev/null; do potliblink=`ls -ld $potlib | $SED 's/.* -> //'` case $potliblink in [\\/]* | [A-Za-z]:[\\/]*) potlib=$potliblink;; *) potlib=`$ECHO "$potlib" | $SED 's|[^/]*$||'`"$potliblink";; esac done if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | $SED -e 10q | $EGREP "$file_magic_regex" > /dev/null; then func_append newdeplibs " $a_deplib" a_deplib= break 2 fi done done fi if test -n "$a_deplib"; then droppeddeps=yes echo $ECHO "*** Warning: linker path does not have real file for library $a_deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib"; then $ECHO "*** with $libname but no candidates were found. (...for file magic test)" else $ECHO "*** with $libname and none of the candidates passed a file format test" $ECHO "*** using a file magic. Last file checked: $potlib" fi fi ;; *) # Add a -L argument. func_append newdeplibs " $a_deplib" ;; esac done # Gone through all deplibs. ;; match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` for a_deplib in $deplibs; do case $a_deplib in -l*) func_stripname -l '' "$a_deplib" name=$func_stripname_result if test yes = "$allow_libtool_libs_with_static_runtimes"; then case " $predeps $postdeps " in *" $a_deplib "*) func_append newdeplibs " $a_deplib" a_deplib= ;; esac fi if test -n "$a_deplib"; then libname=`eval "\\$ECHO \"$libname_spec\""` for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do potential_libs=`ls $i/$libname[.-]* 2>/dev/null` for potent_lib in $potential_libs; do potlib=$potent_lib # see symlink-check above in file_magic test if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ $EGREP "$match_pattern_regex" > /dev/null; then func_append newdeplibs " $a_deplib" a_deplib= break 2 fi done done fi if test -n "$a_deplib"; then droppeddeps=yes echo $ECHO "*** Warning: linker path does not have real file for library $a_deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib"; then $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" else $ECHO "*** with $libname and none of the candidates passed a file format test" $ECHO "*** using a regex pattern. Last file checked: $potlib" fi fi ;; *) # Add a -L argument. func_append newdeplibs " $a_deplib" ;; esac done # Gone through all deplibs. ;; none | unknown | *) newdeplibs= tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` if test yes = "$allow_libtool_libs_with_static_runtimes"; then for i in $predeps $postdeps; do # can't use Xsed below, because $i might contain '/' tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s|$i||"` done fi case $tmp_deplibs in *[!\ \ ]*) echo if test none = "$deplibs_check_method"; then echo "*** Warning: inter-library dependencies are not supported in this platform." else echo "*** Warning: inter-library dependencies are not known to be supported." fi echo "*** All declared inter-library dependencies are being dropped." droppeddeps=yes ;; esac ;; esac versuffix=$versuffix_save major=$major_save release=$release_save libname=$libname_save name=$name_save case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library with the System framework newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` ;; esac if test yes = "$droppeddeps"; then if test yes = "$module"; then echo echo "*** Warning: libtool could not satisfy all declared inter-library" $ECHO "*** dependencies of module $libname. Therefore, libtool will create" echo "*** a static module, that should work as long as the dlopening" echo "*** application is linked with the -dlopen flag." if test -z "$global_symbol_pipe"; then echo echo "*** However, this would only work if libtool was able to extract symbol" echo "*** lists from a program, using 'nm' or equivalent, but libtool could" echo "*** not find such a program. So, this module is probably useless." echo "*** 'nm' from GNU binutils and a full rebuild may help." fi if test no = "$build_old_libs"; then oldlibs=$output_objdir/$libname.$libext build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi else echo "*** The inter-library dependencies that have been dropped here will be" echo "*** automatically added whenever a program is linked with this library" echo "*** or is declared to -dlopen it." if test no = "$allow_undefined"; then echo echo "*** Since this library must not contain undefined symbols," echo "*** because either the platform does not support them or" echo "*** it was explicitly requested with -no-undefined," echo "*** libtool will only create a static version of it." if test no = "$build_old_libs"; then oldlibs=$output_objdir/$libname.$libext build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi fi fi # Done checking deplibs! deplibs=$newdeplibs fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" case $host in *-*-darwin*) newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $deplibs " in *" -L$path/$objdir "*) func_append new_libs " -L$path/$objdir" ;; esac ;; esac done for deplib in $deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) func_append new_libs " $deplib" ;; esac ;; *) func_append new_libs " $deplib" ;; esac done deplibs=$new_libs # All the library-specific variables (install_libdir is set above). library_names= old_library= dlname= # Test again, we may have decided not to build it any more if test yes = "$build_libtool_libs"; then # Remove $wl instances when linking with ld. # FIXME: should test the right _cmds variable. case $archive_cmds in *\$LD\ *) wl= ;; esac if test yes = "$hardcode_into_libs"; then # Hardcode the library paths hardcode_libdirs= dep_rpath= rpath=$finalize_rpath test relink = "$opt_mode" || rpath=$compile_rpath$rpath for libdir in $rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then func_replace_sysroot "$libdir" libdir=$func_replace_sysroot_result if test -z "$hardcode_libdirs"; then hardcode_libdirs=$libdir else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append dep_rpath " $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) func_append perm_rpath " $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir=$hardcode_libdirs eval "dep_rpath=\"$hardcode_libdir_flag_spec\"" fi if test -n "$runpath_var" && test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do func_append rpath "$dir:" done eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" fi test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" fi shlibpath=$finalize_shlibpath test relink = "$opt_mode" || shlibpath=$compile_shlibpath$shlibpath if test -n "$shlibpath"; then eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" fi # Get the real and link names of the library. eval shared_ext=\"$shrext_cmds\" eval library_names=\"$library_names_spec\" set dummy $library_names shift realname=$1 shift if test -n "$soname_spec"; then eval soname=\"$soname_spec\" else soname=$realname fi if test -z "$dlname"; then dlname=$soname fi lib=$output_objdir/$realname linknames= for link do func_append linknames " $link" done # Use standard objects if they are pic test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` test "X$libobjs" = "X " && libobjs= delfiles= if test -n "$export_symbols" && test -n "$include_expsyms"; then $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" export_symbols=$output_objdir/$libname.uexp func_append delfiles " $export_symbols" fi orig_export_symbols= case $host_os in cygwin* | mingw* | cegcc*) if test -n "$export_symbols" && test -z "$export_symbols_regex"; then # exporting using user supplied symfile func_dll_def_p "$export_symbols" || { # and it's NOT already a .def file. Must figure out # which of the given symbols are data symbols and tag # them as such. So, trigger use of export_symbols_cmds. # export_symbols gets reassigned inside the "prepare # the list of exported symbols" if statement, so the # include_expsyms logic still works. orig_export_symbols=$export_symbols export_symbols= always_export_symbols=yes } fi ;; esac # Prepare the list of exported symbols if test -z "$export_symbols"; then if test yes = "$always_export_symbols" || test -n "$export_symbols_regex"; then func_verbose "generating symbol list for '$libname.la'" export_symbols=$output_objdir/$libname.exp $opt_dry_run || $RM $export_symbols cmds=$export_symbols_cmds save_ifs=$IFS; IFS='~' for cmd1 in $cmds; do IFS=$save_ifs # Take the normal branch if the nm_file_list_spec branch # doesn't work or if tool conversion is not needed. case $nm_file_list_spec~$to_tool_file_cmd in *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) try_normal_branch=yes eval cmd=\"$cmd1\" func_len " $cmd" len=$func_len_result ;; *) try_normal_branch=no ;; esac if test yes = "$try_normal_branch" \ && { test "$len" -lt "$max_cmd_len" \ || test "$max_cmd_len" -le -1; } then func_show_eval "$cmd" 'exit $?' skipped_export=false elif test -n "$nm_file_list_spec"; then func_basename "$output" output_la=$func_basename_result save_libobjs=$libobjs save_output=$output output=$output_objdir/$output_la.nm func_to_tool_file "$output" libobjs=$nm_file_list_spec$func_to_tool_file_result func_append delfiles " $output" func_verbose "creating $NM input file list: $output" for obj in $save_libobjs; do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" done > "$output" eval cmd=\"$cmd1\" func_show_eval "$cmd" 'exit $?' output=$save_output libobjs=$save_libobjs skipped_export=false else # The command line is too long to execute in one step. func_verbose "using reloadable object file for export list..." skipped_export=: # Break out early, otherwise skipped_export may be # set to false by a later but shorter cmd. break fi done IFS=$save_ifs if test -n "$export_symbols_regex" && test : != "$skipped_export"; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi fi if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols=$export_symbols test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test : != "$skipped_export" && test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for '$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands, which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter func_append delfiles " $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi tmp_deplibs= for test_deplib in $deplibs; do case " $convenience " in *" $test_deplib "*) ;; *) func_append tmp_deplibs " $test_deplib" ;; esac done deplibs=$tmp_deplibs if test -n "$convenience"; then if test -n "$whole_archive_flag_spec" && test yes = "$compiler_needs_object" && test -z "$libobjs"; then # extract the archives, so we have objects to list. # TODO: could optimize this to just extract one archive. whole_archive_flag_spec= fi if test -n "$whole_archive_flag_spec"; then save_libobjs=$libobjs eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= else gentop=$output_objdir/${outputname}x func_append generated " $gentop" func_extract_archives $gentop $convenience func_append libobjs " $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi fi if test yes = "$thread_safe" && test -n "$thread_safe_flag_spec"; then eval flag=\"$thread_safe_flag_spec\" func_append linker_flags " $flag" fi # Make a backup of the uninstalled library when relinking if test relink = "$opt_mode"; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? fi # Do each of the archive commands. if test yes = "$module" && test -n "$module_cmds"; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then eval test_cmds=\"$module_expsym_cmds\" cmds=$module_expsym_cmds else eval test_cmds=\"$module_cmds\" cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then eval test_cmds=\"$archive_expsym_cmds\" cmds=$archive_expsym_cmds else eval test_cmds=\"$archive_cmds\" cmds=$archive_cmds fi fi if test : != "$skipped_export" && func_len " $test_cmds" && len=$func_len_result && test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then : else # The command line is too long to link in one step, link piecewise # or, if using GNU ld and skipped_export is not :, use a linker # script. # Save the value of $output and $libobjs because we want to # use them later. If we have whole_archive_flag_spec, we # want to use save_libobjs as it was before # whole_archive_flag_spec was expanded, because we can't # assume the linker understands whole_archive_flag_spec. # This may have to be revisited, in case too many # convenience libraries get linked in and end up exceeding # the spec. if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then save_libobjs=$libobjs fi save_output=$output func_basename "$output" output_la=$func_basename_result # Clear the reloadable object creation command queue and # initialize k to one. test_cmds= concat_cmds= objlist= last_robj= k=1 if test -n "$save_libobjs" && test : != "$skipped_export" && test yes = "$with_gnu_ld"; then output=$output_objdir/$output_la.lnkscript func_verbose "creating GNU ld script: $output" echo 'INPUT (' > $output for obj in $save_libobjs do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" >> $output done echo ')' >> $output func_append delfiles " $output" func_to_tool_file "$output" output=$func_to_tool_file_result elif test -n "$save_libobjs" && test : != "$skipped_export" && test -n "$file_list_spec"; then output=$output_objdir/$output_la.lnk func_verbose "creating linker input file list: $output" : > $output set x $save_libobjs shift firstobj= if test yes = "$compiler_needs_object"; then firstobj="$1 " shift fi for obj do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" >> $output done func_append delfiles " $output" func_to_tool_file "$output" output=$firstobj\"$file_list_spec$func_to_tool_file_result\" else if test -n "$save_libobjs"; then func_verbose "creating reloadable object files..." output=$output_objdir/$output_la-$k.$objext eval test_cmds=\"$reload_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 # Loop over the list of objects to be linked. for obj in $save_libobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result if test -z "$objlist" || test "$len" -lt "$max_cmd_len"; then func_append objlist " $obj" else # The command $test_cmds is almost too long, add a # command to the queue. if test 1 -eq "$k"; then # The first file doesn't have a previous command to add. reload_objs=$objlist eval concat_cmds=\"$reload_cmds\" else # All subsequent reloadable object files will link in # the last one created. reload_objs="$objlist $last_robj" eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" fi last_robj=$output_objdir/$output_la-$k.$objext func_arith $k + 1 k=$func_arith_result output=$output_objdir/$output_la-$k.$objext objlist=" $obj" func_len " $last_robj" func_arith $len0 + $func_len_result len=$func_arith_result fi done # Handle the remaining objects by creating one last # reloadable object file. All subsequent reloadable object # files will link in the last one created. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ reload_objs="$objlist $last_robj" eval concat_cmds=\"\$concat_cmds$reload_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" fi func_append delfiles " $output" else output= fi ${skipped_export-false} && { func_verbose "generating symbol list for '$libname.la'" export_symbols=$output_objdir/$libname.exp $opt_dry_run || $RM $export_symbols libobjs=$output # Append the command to create the export file. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" fi } test -n "$save_libobjs" && func_verbose "creating a temporary reloadable object file: $output" # Loop through the commands generated above and execute them. save_ifs=$IFS; IFS='~' for cmd in $concat_cmds; do IFS=$save_ifs $opt_quiet || { func_quote_for_expand "$cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test relink = "$opt_mode"; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS=$save_ifs if test -n "$export_symbols_regex" && ${skipped_export-false}; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi ${skipped_export-false} && { if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols=$export_symbols test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for '$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands, which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter func_append delfiles " $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi } libobjs=$output # Restore the value of output. output=$save_output if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= fi # Expand the library linking commands again to reset the # value of $libobjs for piecewise linking. # Do each of the archive commands. if test yes = "$module" && test -n "$module_cmds"; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then cmds=$module_expsym_cmds else cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then cmds=$archive_expsym_cmds else cmds=$archive_cmds fi fi fi if test -n "$delfiles"; then # Append the command to remove temporary files to $cmds. eval cmds=\"\$cmds~\$RM $delfiles\" fi # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop=$output_objdir/${outputname}x func_append generated " $gentop" func_extract_archives $gentop $dlprefiles func_append libobjs " $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi save_ifs=$IFS; IFS='~' for cmd in $cmds; do IFS=$sp$nl eval cmd=\"$cmd\" IFS=$save_ifs $opt_quiet || { func_quote_for_expand "$cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test relink = "$opt_mode"; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS=$save_ifs # Restore the uninstalled library and exit if test relink = "$opt_mode"; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? if test -n "$convenience"; then if test -z "$whole_archive_flag_spec"; then func_show_eval '${RM}r "$gentop"' fi fi exit $EXIT_SUCCESS fi # Create links to the real library. for linkname in $linknames; do if test "$realname" != "$linkname"; then func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' fi done # If -module or -export-dynamic was specified, set the dlname. if test yes = "$module" || test yes = "$export_dynamic"; then # On all known operating systems, these are identical. dlname=$soname fi fi ;; obj) if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then func_warning "'-dlopen' is ignored for objects" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "'-l' and '-L' are ignored for objects" ;; esac test -n "$rpath" && \ func_warning "'-rpath' is ignored for objects" test -n "$xrpath" && \ func_warning "'-R' is ignored for objects" test -n "$vinfo" && \ func_warning "'-version-info' is ignored for objects" test -n "$release" && \ func_warning "'-release' is ignored for objects" case $output in *.lo) test -n "$objs$old_deplibs" && \ func_fatal_error "cannot build library object '$output' from non-libtool objects" libobj=$output func_lo2o "$libobj" obj=$func_lo2o_result ;; *) libobj= obj=$output ;; esac # Delete the old objects. $opt_dry_run || $RM $obj $libobj # Objects from convenience libraries. This assumes # single-version convenience libraries. Whenever we create # different ones for PIC/non-PIC, this we'll have to duplicate # the extraction. reload_conv_objs= gentop= # if reload_cmds runs $LD directly, get rid of -Wl from # whole_archive_flag_spec and hope we can get by with turning comma # into space. case $reload_cmds in *\$LD[\ \$]*) wl= ;; esac if test -n "$convenience"; then if test -n "$whole_archive_flag_spec"; then eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" test -n "$wl" || tmp_whole_archive_flags=`$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` reload_conv_objs=$reload_objs\ $tmp_whole_archive_flags else gentop=$output_objdir/${obj}x func_append generated " $gentop" func_extract_archives $gentop $convenience reload_conv_objs="$reload_objs $func_extract_archives_result" fi fi # If we're not building shared, we need to use non_pic_objs test yes = "$build_libtool_libs" || libobjs=$non_pic_objects # Create the old-style object. reload_objs=$objs$old_deplibs' '`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; /\.lib$/d; $lo2o" | $NL2SP`' '$reload_conv_objs output=$obj func_execute_cmds "$reload_cmds" 'exit $?' # Exit if we aren't doing a library object file. if test -z "$libobj"; then if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS fi test yes = "$build_libtool_libs" || { if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi # Create an invalid libtool object if no PIC, so that we don't # accidentally link it into a program. # $show "echo timestamp > $libobj" # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? exit $EXIT_SUCCESS } if test -n "$pic_flag" || test default != "$pic_mode"; then # Only do commands if we really have different PIC objects. reload_objs="$libobjs $reload_conv_objs" output=$libobj func_execute_cmds "$reload_cmds" 'exit $?' fi if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS ;; prog) case $host in *cygwin*) func_stripname '' '.exe' "$output" output=$func_stripname_result.exe;; esac test -n "$vinfo" && \ func_warning "'-version-info' is ignored for programs" test -n "$release" && \ func_warning "'-release' is ignored for programs" $preload \ && test unknown,unknown,unknown = "$dlopen_support,$dlopen_self,$dlopen_self_static" \ && func_warning "'LT_INIT([dlopen])' not used. Assuming no dlopen support." case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library is the System framework compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` ;; esac case $host in *-*-darwin*) # Don't allow lazy linking, it breaks C++ global constructors # But is supposedly fixed on 10.4 or later (yay!). if test CXX = "$tagname"; then case ${MACOSX_DEPLOYMENT_TARGET-10.0} in 10.[0123]) func_append compile_command " $wl-bind_at_load" func_append finalize_command " $wl-bind_at_load" ;; esac fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $compile_deplibs " in *" -L$path/$objdir "*) func_append new_libs " -L$path/$objdir" ;; esac ;; esac done for deplib in $compile_deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) func_append new_libs " $deplib" ;; esac ;; *) func_append new_libs " $deplib" ;; esac done compile_deplibs=$new_libs func_append compile_command " $compile_deplibs" func_append finalize_command " $finalize_deplibs" if test -n "$rpath$xrpath"; then # If the user specified any rpath flags, then add them. for libdir in $rpath $xrpath; do # This is the magic to use -rpath. case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac done fi # Now hardcode the library paths rpath= hardcode_libdirs= for libdir in $compile_rpath $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs=$libdir else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append rpath " $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) func_append perm_rpath " $libdir" ;; esac fi case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`$ECHO "$libdir" | $SED -e 's*/lib$*/bin*'` case :$dllsearchpath: in *":$libdir:"*) ;; ::) dllsearchpath=$libdir;; *) func_append dllsearchpath ":$libdir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) func_append dllsearchpath ":$testbindir";; esac ;; esac done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir=$hardcode_libdirs eval rpath=\" $hardcode_libdir_flag_spec\" fi compile_rpath=$rpath rpath= hardcode_libdirs= for libdir in $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs=$libdir else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append rpath " $flag" fi elif test -n "$runpath_var"; then case "$finalize_perm_rpath " in *" $libdir "*) ;; *) func_append finalize_perm_rpath " $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir=$hardcode_libdirs eval rpath=\" $hardcode_libdir_flag_spec\" fi finalize_rpath=$rpath if test -n "$libobjs" && test yes = "$build_old_libs"; then # Transform all the library objects into standard objects. compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` fi func_generate_dlsyms "$outputname" "@PROGRAM@" false # template prelinking step if test -n "$prelink_cmds"; then func_execute_cmds "$prelink_cmds" 'exit $?' fi wrappers_required=: case $host in *cegcc* | *mingw32ce*) # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. wrappers_required=false ;; *cygwin* | *mingw* ) test yes = "$build_libtool_libs" || wrappers_required=false ;; *) if test no = "$need_relink" || test yes != "$build_libtool_libs"; then wrappers_required=false fi ;; esac $wrappers_required || { # Replace the output file specification. compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` link_command=$compile_command$compile_rpath # We have no uninstalled library dependencies, so finalize right now. exit_status=0 func_show_eval "$link_command" 'exit_status=$?' if test -n "$postlink_cmds"; then func_to_tool_file "$output" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi # Delete the generated files. if test -f "$output_objdir/${outputname}S.$objext"; then func_show_eval '$RM "$output_objdir/${outputname}S.$objext"' fi exit $exit_status } if test -n "$compile_shlibpath$finalize_shlibpath"; then compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" fi if test -n "$finalize_shlibpath"; then finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" fi compile_var= finalize_var= if test -n "$runpath_var"; then if test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do func_append rpath "$dir:" done compile_var="$runpath_var=\"$rpath\$$runpath_var\" " fi if test -n "$finalize_perm_rpath"; then # We should set the runpath_var. rpath= for dir in $finalize_perm_rpath; do func_append rpath "$dir:" done finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " fi fi if test yes = "$no_install"; then # We don't need to create a wrapper script. link_command=$compile_var$compile_command$compile_rpath # Replace the output file specification. link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` # Delete the old output file. $opt_dry_run || $RM $output # Link the executable and exit func_show_eval "$link_command" 'exit $?' if test -n "$postlink_cmds"; then func_to_tool_file "$output" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi exit $EXIT_SUCCESS fi case $hardcode_action,$fast_install in relink,*) # Fast installation is not supported link_command=$compile_var$compile_command$compile_rpath relink_command=$finalize_var$finalize_command$finalize_rpath func_warning "this platform does not like uninstalled shared libraries" func_warning "'$output' will be relinked during installation" ;; *,yes) link_command=$finalize_var$compile_command$finalize_rpath relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` ;; *,no) link_command=$compile_var$compile_command$compile_rpath relink_command=$finalize_var$finalize_command$finalize_rpath ;; *,needless) link_command=$finalize_var$compile_command$finalize_rpath relink_command= ;; esac # Replace the output file specification. link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` # Delete the old output files. $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname func_show_eval "$link_command" 'exit $?' if test -n "$postlink_cmds"; then func_to_tool_file "$output_objdir/$outputname" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi # Now create the wrapper script. func_verbose "creating $output" # Quote the relink command for shipping. if test -n "$relink_command"; then # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else func_quote_for_eval "$var_value" relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" fi done relink_command="(cd `pwd`; $relink_command)" relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` fi # Only actually do things if not in dry run mode. $opt_dry_run || { # win32 will think the script is a binary if it has # a .exe suffix, so we strip it off here. case $output in *.exe) func_stripname '' '.exe' "$output" output=$func_stripname_result ;; esac # test for cygwin because mv fails w/o .exe extensions case $host in *cygwin*) exeext=.exe func_stripname '' '.exe' "$outputname" outputname=$func_stripname_result ;; *) exeext= ;; esac case $host in *cygwin* | *mingw* ) func_dirname_and_basename "$output" "" "." output_name=$func_basename_result output_path=$func_dirname_result cwrappersource=$output_path/$objdir/lt-$output_name.c cwrapper=$output_path/$output_name.exe $RM $cwrappersource $cwrapper trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 func_emit_cwrapperexe_src > $cwrappersource # The wrapper executable is built using the $host compiler, # because it contains $host paths and files. If cross- # compiling, it, like the target executable, must be # executed on the $host or under an emulation environment. $opt_dry_run || { $LTCC $LTCFLAGS -o $cwrapper $cwrappersource $STRIP $cwrapper } # Now, create the wrapper script for func_source use: func_ltwrapper_scriptname $cwrapper $RM $func_ltwrapper_scriptname_result trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 $opt_dry_run || { # note: this script will not be executed, so do not chmod. if test "x$build" = "x$host"; then $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result else func_emit_wrapper no > $func_ltwrapper_scriptname_result fi } ;; * ) $RM $output trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 func_emit_wrapper no > $output chmod +x $output ;; esac } exit $EXIT_SUCCESS ;; esac # See if we need to build an old-fashioned archive. for oldlib in $oldlibs; do case $build_libtool_libs in convenience) oldobjs="$libobjs_save $symfileobj" addlibs=$convenience build_libtool_libs=no ;; module) oldobjs=$libobjs_save addlibs=$old_convenience build_libtool_libs=no ;; *) oldobjs="$old_deplibs $non_pic_objects" $preload && test -f "$symfileobj" \ && func_append oldobjs " $symfileobj" addlibs=$old_convenience ;; esac if test -n "$addlibs"; then gentop=$output_objdir/${outputname}x func_append generated " $gentop" func_extract_archives $gentop $addlibs func_append oldobjs " $func_extract_archives_result" fi # Do each command in the archive commands. if test -n "$old_archive_from_new_cmds" && test yes = "$build_libtool_libs"; then cmds=$old_archive_from_new_cmds else # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop=$output_objdir/${outputname}x func_append generated " $gentop" func_extract_archives $gentop $dlprefiles func_append oldobjs " $func_extract_archives_result" fi # POSIX demands no paths to be encoded in archives. We have # to avoid creating archives with duplicate basenames if we # might have to extract them afterwards, e.g., when creating a # static archive out of a convenience library, or when linking # the entirety of a libtool archive into another (currently # not supported by libtool). if (for obj in $oldobjs do func_basename "$obj" $ECHO "$func_basename_result" done | sort | sort -uc >/dev/null 2>&1); then : else echo "copying selected object files to avoid basename conflicts..." gentop=$output_objdir/${outputname}x func_append generated " $gentop" func_mkdir_p "$gentop" save_oldobjs=$oldobjs oldobjs= counter=1 for obj in $save_oldobjs do func_basename "$obj" objbase=$func_basename_result case " $oldobjs " in " ") oldobjs=$obj ;; *[\ /]"$objbase "*) while :; do # Make sure we don't pick an alternate name that also # overlaps. newobj=lt$counter-$objbase func_arith $counter + 1 counter=$func_arith_result case " $oldobjs " in *[\ /]"$newobj "*) ;; *) if test ! -f "$gentop/$newobj"; then break; fi ;; esac done func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" func_append oldobjs " $gentop/$newobj" ;; *) func_append oldobjs " $obj" ;; esac done fi func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 tool_oldlib=$func_to_tool_file_result eval cmds=\"$old_archive_cmds\" func_len " $cmds" len=$func_len_result if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then cmds=$old_archive_cmds elif test -n "$archiver_list_spec"; then func_verbose "using command file archive linking..." for obj in $oldobjs do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" done > $output_objdir/$libname.libcmd func_to_tool_file "$output_objdir/$libname.libcmd" oldobjs=" $archiver_list_spec$func_to_tool_file_result" cmds=$old_archive_cmds else # the command line is too long to link in one step, link in parts func_verbose "using piecewise archive linking..." save_RANLIB=$RANLIB RANLIB=: objlist= concat_cmds= save_oldobjs=$oldobjs oldobjs= # Is there a better way of finding the last object in the list? for obj in $save_oldobjs do last_oldobj=$obj done eval test_cmds=\"$old_archive_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 for obj in $save_oldobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result func_append objlist " $obj" if test "$len" -lt "$max_cmd_len"; then : else # the above command should be used before it gets too long oldobjs=$objlist if test "$obj" = "$last_oldobj"; then RANLIB=$save_RANLIB fi test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\$concat_cmds$old_archive_cmds\" objlist= len=$len0 fi done RANLIB=$save_RANLIB oldobjs=$objlist if test -z "$oldobjs"; then eval cmds=\"\$concat_cmds\" else eval cmds=\"\$concat_cmds~\$old_archive_cmds\" fi fi fi func_execute_cmds "$cmds" 'exit $?' done test -n "$generated" && \ func_show_eval "${RM}r$generated" # Now create the libtool archive. case $output in *.la) old_library= test yes = "$build_old_libs" && old_library=$libname.$libext func_verbose "creating $output" # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else func_quote_for_eval "$var_value" relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" fi done # Quote the link command for shipping. relink_command="(cd `pwd`; $SHELL \"$progpath\" $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` if test yes = "$hardcode_automatic"; then relink_command= fi # Only create the output if not a dry run. $opt_dry_run || { for installed in no yes; do if test yes = "$installed"; then if test -z "$install_libdir"; then break fi output=$output_objdir/${outputname}i # Replace all uninstalled libtool libraries with the installed ones newdependency_libs= for deplib in $dependency_libs; do case $deplib in *.la) func_basename "$deplib" name=$func_basename_result func_resolve_sysroot "$deplib" eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result` test -z "$libdir" && \ func_fatal_error "'$deplib' is not a valid libtool archive" func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" ;; -L*) func_stripname -L '' "$deplib" func_replace_sysroot "$func_stripname_result" func_append newdependency_libs " -L$func_replace_sysroot_result" ;; -R*) func_stripname -R '' "$deplib" func_replace_sysroot "$func_stripname_result" func_append newdependency_libs " -R$func_replace_sysroot_result" ;; *) func_append newdependency_libs " $deplib" ;; esac done dependency_libs=$newdependency_libs newdlfiles= for lib in $dlfiles; do case $lib in *.la) func_basename "$lib" name=$func_basename_result eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "'$lib' is not a valid libtool archive" func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" ;; *) func_append newdlfiles " $lib" ;; esac done dlfiles=$newdlfiles newdlprefiles= for lib in $dlprefiles; do case $lib in *.la) # Only pass preopened files to the pseudo-archive (for # eventual linking with the app. that links it) if we # didn't already link the preopened objects directly into # the library: func_basename "$lib" name=$func_basename_result eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "'$lib' is not a valid libtool archive" func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" ;; esac done dlprefiles=$newdlprefiles else newdlfiles= for lib in $dlfiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlfiles " $abs" done dlfiles=$newdlfiles newdlprefiles= for lib in $dlprefiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlprefiles " $abs" done dlprefiles=$newdlprefiles fi $RM $output # place dlname in correct position for cygwin # In fact, it would be nice if we could use this code for all target # systems that can't hard-code library paths into their executables # and that have no shared library path variable independent of PATH, # but it turns out we can't easily determine that from inspecting # libtool variables, so we have to hard-code the OSs to which it # applies here; at the moment, that means platforms that use the PE # object format with DLL files. See the long comment at the top of # tests/bindir.at for full details. tdlname=$dlname case $host,$output,$installed,$module,$dlname in *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) # If a -bindir argument was supplied, place the dll there. if test -n "$bindir"; then func_relative_path "$install_libdir" "$bindir" tdlname=$func_relative_path_result/$dlname else # Otherwise fall back on heuristic. tdlname=../bin/$dlname fi ;; esac $ECHO > $output "\ # $outputname - a libtool library file # Generated by $PROGRAM (GNU $PACKAGE) $VERSION # # Please DO NOT delete this file! # It is necessary for linking the library. # The name that we can dlopen(3). dlname='$tdlname' # Names of this library. library_names='$library_names' # The name of the static archive. old_library='$old_library' # Linker flags that cannot go in dependency_libs. inherited_linker_flags='$new_inherited_linker_flags' # Libraries that this one depends upon. dependency_libs='$dependency_libs' # Names of additional weak libraries provided by this library weak_library_names='$weak_libs' # Version information for $libname. current=$current age=$age revision=$revision # Is this an already installed library? installed=$installed # Should we warn about portability when linking against -modules? shouldnotlink=$module # Files to dlopen/dlpreopen dlopen='$dlfiles' dlpreopen='$dlprefiles' # Directory that this library needs to be installed in: libdir='$install_libdir'" if test no,yes = "$installed,$need_relink"; then $ECHO >> $output "\ relink_command=\"$relink_command\"" fi done } # Do a symbolic link so that the libtool archive can be found in # LD_LIBRARY_PATH before the program is installed. func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' ;; esac exit $EXIT_SUCCESS } if test link = "$opt_mode" || test relink = "$opt_mode"; then func_mode_link ${1+"$@"} fi # func_mode_uninstall arg... func_mode_uninstall () { $debug_cmd RM=$nonopt files= rmforce=false exit_status=0 # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic=$magic for arg do case $arg in -f) func_append RM " $arg"; rmforce=: ;; -*) func_append RM " $arg" ;; *) func_append files " $arg" ;; esac done test -z "$RM" && \ func_fatal_help "you must specify an RM program" rmdirs= for file in $files; do func_dirname "$file" "" "." dir=$func_dirname_result if test . = "$dir"; then odir=$objdir else odir=$dir/$objdir fi func_basename "$file" name=$func_basename_result test uninstall = "$opt_mode" && odir=$dir # Remember odir for removal later, being careful to avoid duplicates if test clean = "$opt_mode"; then case " $rmdirs " in *" $odir "*) ;; *) func_append rmdirs " $odir" ;; esac fi # Don't error if the file doesn't exist and rm -f was used. if { test -L "$file"; } >/dev/null 2>&1 || { test -h "$file"; } >/dev/null 2>&1 || test -f "$file"; then : elif test -d "$file"; then exit_status=1 continue elif $rmforce; then continue fi rmfiles=$file case $name in *.la) # Possibly a libtool archive, so verify it. if func_lalib_p "$file"; then func_source $dir/$name # Delete the libtool libraries and symlinks. for n in $library_names; do func_append rmfiles " $odir/$n" done test -n "$old_library" && func_append rmfiles " $odir/$old_library" case $opt_mode in clean) case " $library_names " in *" $dlname "*) ;; *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; esac test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" ;; uninstall) if test -n "$library_names"; then # Do each command in the postuninstall commands. func_execute_cmds "$postuninstall_cmds" '$rmforce || exit_status=1' fi if test -n "$old_library"; then # Do each command in the old_postuninstall commands. func_execute_cmds "$old_postuninstall_cmds" '$rmforce || exit_status=1' fi # FIXME: should reinstall the best remaining shared library. ;; esac fi ;; *.lo) # Possibly a libtool object, so verify it. if func_lalib_p "$file"; then # Read the .lo file func_source $dir/$name # Add PIC object to the list of files to remove. if test -n "$pic_object" && test none != "$pic_object"; then func_append rmfiles " $dir/$pic_object" fi # Add non-PIC object to the list of files to remove. if test -n "$non_pic_object" && test none != "$non_pic_object"; then func_append rmfiles " $dir/$non_pic_object" fi fi ;; *) if test clean = "$opt_mode"; then noexename=$name case $file in *.exe) func_stripname '' '.exe' "$file" file=$func_stripname_result func_stripname '' '.exe' "$name" noexename=$func_stripname_result # $file with .exe has already been added to rmfiles, # add $file without .exe func_append rmfiles " $file" ;; esac # Do a test to see if this is a libtool program. if func_ltwrapper_p "$file"; then if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" relink_command= func_source $func_ltwrapper_scriptname_result func_append rmfiles " $func_ltwrapper_scriptname_result" else relink_command= func_source $dir/$noexename fi # note $name still contains .exe if it was in $file originally # as does the version of $file that was added into $rmfiles func_append rmfiles " $odir/$name $odir/${name}S.$objext" if test yes = "$fast_install" && test -n "$relink_command"; then func_append rmfiles " $odir/lt-$name" fi if test "X$noexename" != "X$name"; then func_append rmfiles " $odir/lt-$noexename.c" fi fi fi ;; esac func_show_eval "$RM $rmfiles" 'exit_status=1' done # Try to remove the $objdir's in the directories where we deleted files for dir in $rmdirs; do if test -d "$dir"; then func_show_eval "rmdir $dir >/dev/null 2>&1" fi done exit $exit_status } if test uninstall = "$opt_mode" || test clean = "$opt_mode"; then func_mode_uninstall ${1+"$@"} fi test -z "$opt_mode" && { help=$generic_help func_fatal_help "you must specify a MODE" } test -z "$exec_cmd" && \ func_fatal_help "invalid operation mode '$opt_mode'" if test -n "$exec_cmd"; then eval exec "$exec_cmd" exit $EXIT_FAILURE fi exit $exit_status # The TAGs below are defined such that we never get into a situation # where we disable both kinds of libraries. Given conflicting # choices, we go for a static library, that is the most portable, # since we can't tell whether shared libraries were disabled because # the user asked for that or because the platform doesn't support # them. This is particularly important on AIX, because we don't # support having both static and shared libraries enabled at the same # time on that platform, so we default to a shared-only configuration. # If a disable-shared tag is given, we'll fallback to a static-only # configuration. But we'll never go from static-only to shared-only. # ### BEGIN LIBTOOL TAG CONFIG: disable-shared build_libtool_libs=no build_old_libs=yes # ### END LIBTOOL TAG CONFIG: disable-shared # ### BEGIN LIBTOOL TAG CONFIG: disable-static build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` # ### END LIBTOOL TAG CONFIG: disable-static # Local Variables: # mode:shell-script # sh-indentation:2 # End: pkg-config-0.29.1/ChangeLog0000664000175000017500000013431112275467762012351 00000000000000 ************************************************************************* This file is no longer kept up to date, please see git commit logs instead. ************************************************************************* 2009-06-30 Tollef Fog Heen * pkg.m4: Add patch from Peter Rosin for somewhat nicer output if you use the four-clause form of PKG_CHECK_MODULES. 2009-06-12 Tor Lillqvist * parse.c: On Win32, if the value of a a variable other than the "prefix" one starts with the non-overridden value of "prefix", then replace that prefix, too, with the run-time one. To avoid shadowing warnings, rename a 'p' variable to 'q'. * pkg-config.1: Corresponding update. * main.c * pkg.h: Move the Win32 redefinition of PKG_CONFIG_PC_PATH from main.c to pkg.h as it now is needed in pkg.c, too. 2009-03-30 Tollef Fog Heen * autogen.sh: Allow not running configure, wanted by cygwin. * check/check-missing, check/check-libs, check/check-requires-private: Handle the case of indirect being enabled correctly in checks. * check/common, check/config.sh.in, check/Makefile.am, configure.in: Make it possible to check for configure variables in the check scripts. So far, only direct/indirect is exposed. * pkg.c (add_virtual_pkgconfig_package): Add pc_path as a variable which you can use to get at the compiled-in PKG_CONFIG_PC_PATH. * pkg.h: Fix up path to glib.h * pkg.c (add_virtual_pkgconfig_package): Fix URL to pkg-config. * partial-glib.[ch]: Get rid of those, they are no longer in use. * poptparse.c, popthelp.c, poptconfig.c, popt.c, pkg.c, findme.c, configure.in: Check for malloc.h and use that if it exists. Apparently this makes Win32 happier. Thanks to Carlo Bramini for the patch. * pkg-config.1: Verbosify the text about Libs.private a bit. Patch from Loïc Minier. * pkg-config.1: Add documentation for --cflags-only-I, patch from Loïc Minier. * pkg.[ch], main.c, check/check-missing: Don't recurse Requires at all unless we need to. Add check. Again, thanks to Loïc Minier for most of the idea and the implementation. * pkg.[ch], parse.[ch], main.c, check/Makefile.am, check/check-missing, check/missing-requires-private.pc: Skip Requires.private unless we need to look at them for cflags. Add test case. Thanks to Loïc Minier for most of the idea and the implementation. Debian #475031 * check/common: Run all tests in the C locale * check/common: Add support for non-zero return codes to test framework. Thanks to Loïc Minier for the idea. * pkg.m4: Add PKG_CONFIG_PATH and PKG_CONFIG_LIBDIR to the list of precious directories. (AC_ARG_VAR) * popthelp.c (poptPrintUsage,poptPrintHelp): Add [LIBRARIES] to help output. Debian #389066 2008-04-28 Tollef Fog Heen * parse.c Add my name to the copyright header, mainly to prevent emacs from being stupid and updating RH's copyright year. * parse.c (_do_parse_libs): Special-case "-lib:" in the Libs field; it's not an -l. Yes, this breaks if your library is called libib:$something, in which case you lose. Gnome #142952 * main.c (main): Make sure log is initialized to prevent segfaults. 2008-03-23 Tollef Fog Heen * check/check-conflicts, check/conflicts-test.pc: New test, testing that conflicts work as they should. * pkg.c (verify_package): Make the conflicts check not only check package versions, but also package names. This makes conflicts functional, something they were not before. * check/check-requires-private: Remove unnecessary set -x * check/check-cflags, check/check-define-variable, check/check-includedir, check/check-libs, check/check-libs-private, check/check-requires-private: Replace the crazy -d ~root check with a more proper way to just make sure we are running under a POSIX shell. Thanks to Kjetil Torgrim Homme for the tip about using getconf PATH. * main.c (main): Add logging support from NetBSD. Thanks to Julio M. Merino Vidal for forwarding the patch from ages ago. 2008-03-23 Stepan Kasal * pkg-config.1: Document "Requires.private" and recommend it for libraries. Freedesktop #13188 * pkg-config.1: Fix a few typos--add two omitted .TP tags and two omitted full stops; and empty lines do influence the formatting in nroff. 2008-03-23 Tollef Fog Heen * main.c (main): Fix small portability problem by defining all the variables in main that are used in the static initialiser as static variables. This makes the IRIX/mipseb compiler happier. Thanks to Roland Illig of NetBSD for the patch. This doesn't apply to some of the Win32 variables, but I don't believe that is a problem with the existing compilers there. 2008-02-19 Tor Lillqvist * main.c: Remove the possibility to have a default PKG_CONFIG_PATH in the Registry. It is much more flexible to just use environment variables. In general the Registry is not used in the ports of GTK+ or GNOME libraries and software to Windows. * parse.c (parse_line): On Windows, handle also .pc files found in a share/pkgconfig folder when automatically redefining a prefix variable for the package. * pkg-config.1: Corresponding changes. 2008-02-18 Tor Lillqvist * main.c: Fix some bitrot: On Windows, don't use the compile-time PKG_CONFIG_PC_PATH, but deduce a default one at run-time based on the location of the executable. This was originally what pkg-config did on Windows, but it had bit-rotted. 2008-01-31 Tollef Fog Heen * configure.in: If prefix is unset, add /usr/lib/pkgconfig and /usr/share/pkgconfig to default search path. Based on patch by Damjan Jovanovic. Also, make configure always print the path it is defaulting to. * pkg.c (string_list_to_string): Patch from Paul Bender so flags other than -I and -L are passed through (with mangling) when PKG_CONFIG_SYSROOT_DIR is set. 2008-01-16 Tollef Fog Heen * NEWS, configure.in: Release 0.23 * check/check-requires-private: Fix up test case. We want to get the private -I option in all cases. * pkg.h, pkg.c (string_list_to_string), pkg-config.1, main.c (main): Add sysroot support and document same. Triggered by setting PKG_CONFIG_SYSROOT_DIR in the environment. 2007-12-29 Tollef Fog Heen * pkg.c (internal_get_package): Don't add the internal-only pkg-config package twice. * pkg.c (verify_package): Apply patch from Matthias Clasen of RedHat to prevent segfaults if a Conflicts line is encountered. * popthelp.c: Apply patch from Tom Tromey to make pkg-config --help print to stdout, not stderr. Gnome #127314. * pkg.m4: Don't use --errors-to-stdout in pkg.m4, but rather redirect stderr to stdout. This makes pkg.m4 with old (pre 0.15) pkg-config look good, and it makes newer pkg-config with ancient pkg.m4 work well. Gnome #111054 * Update to glib 1.2.10, adjust lots of the glib patches. Gnome #81847. 2007-06-19 Tollef Fog Heen * pkg.m4: Fix bug so it's possible to override variables in case pkg-config is not installed. Thanks to Thomas Klausner for the patch. 2007-06-18 Tollef Fog Heen * configure.in: Release 0.22 * NEWS: Update for 0.22 * configure.in: Fix expansion of default pc_path as per GNU coding standards. Thanks to Andreas Hanke for the fix. Freedesktop #10326 * pkg.c (recursive_fill_list): Make sure to act recursively with Requires.private, making them much more useful. Special thanks to Matthias Clasen for lots and lots of nagging. Freedesktop #8788 * glib-patches/remove-strsignal-prototype.diff: define _GNU_SOURCE there to get strsignal prototype, addresses the rest of Freedesktop 10652. * popt.c: Remove code calling setresuid and setreuid, pkg-config should not ever be suid. Partially addresses Freedesktop #10652 * glib-patches/autoconf-warning.diff, glib-patches/automake-warning.diff Fix path prefix so it applies. Also fix automake-warning.diff to not patch on top of another patch from glib-patches. * glib-patches/no-dist-distclean-files.diff: Fix prefix. 2007-05-30 Tor Lillqvist * parse.c: Fix problem on Win32 where the automagic prefix replacement logic didn't work. I don't know what change had broken it. (pathnamecmp): New Win32-only function. Compares two file paths case insensitively and treating backslashes as equal to slashes. (parse_line): Use it instead of g_ascii_strcasecmp(). 2007-05-29 Tollef Fog Heen * pkg.m4: Update URL to pkg-config website. Thanks to Peter Eisentraut. 2007-02-25 Tollef Fog Heen * pkg.c (scan_dir): Use g_malloc, not malloc for pkgname. * Makefile.am: Add support for using the system glib. Thanks to Peter Breitenlohner for the bug and the patch. Freedesktop #9708 * configure.in: Add support for using the system glib. * glib-patches/no-dist-distclean-files.diff, glib-patches/automake-warning.diff, glib-patches/autoconf-warning.diff: Get rid of some warnings when configuring glib. 2007-02-21 Tollef Fog Heen * parse.c (parse_package_file and others): Move the reversal of the _libs lists to the end to avoid double-reversing either. Thanks to J. Scott Berg for both the bug and the fix. Freedesktop #9132 * configure.in: remove AC_CONFIG_AUX_DIR as it makes newer automakes unhappy. Freedesktop #10028. 2006-08-16 Tollef Fog Heen * configure.in: Release 0.21 * NEWS: Update for 0.21 * pkg.c: Add internal pkg-config package which can be queried for version number, name and URL for now. More information will be added later. Debian #254289, #287339 * parse.c (trim_and_sub): Since %{...} has not been used for a long time, there is no point in being able to escape %. However, make the code able to escape $ by doubling the $ to $$. Debian #378570 * pkg.c (packages_get_other_cflags, package_get_other_cflags) (packages_get_I_cflags): Always add all cflags. Debian #340904 * main.c (main): Always add the elements from PKG_CONFIG_PATH. Freedesktop #4795. * pkg-config.1: Apply patch from Ed Catmur to document PKG_PROG_PKG_CONFIG and that it should be used if the first call to PKG_CHECK_MODULES might not happen. Freedesktop #7742 * pkg-config.1: Apply patch from Ed Catmur to document PKG_CHECK_EXIST. Thanks a lot for both patches. Freedesktop #7741 2005-12-28 Tollef Fog Heen * configure.in, Makefile.am: Only use -Wall and other gcc-only flags when we don't have a set of CFLAGS already set and we're using gcc. Freedesktop #4888. 2005-10-17 Tollef Fog Heen * pkg.m4: Do AC_MSG_RESULT([no]) even if $4 is set (so we don't fail). Gnome #166537. * NEWS: Add missing news and really release 0.20, since I didn't get around to actually uploading last night. 2005-10-16 Tollef Fog Heen * configure.in: Release 0.20 * pkg.m4: use m4_define to avoid duplication of text. * pkg.m4: Minor cleanups, use m4_default rather than m4_ifval and echo 1>&FD is silly, just use echo >&FD * main.c (main): Try to print out all the errors and not just the first. * pkg.m4: Use --short-errors if it's available. * pkg.c (get_package_quiet): Add get_package_quiet which is just the same as get_package except it sets warn to false. * pkg.h: Add prototype for get_package_quiet. * main.c (main): Add --short-errors flag to suppress most of the output when a module is not found. 2005-10-01 Tollef Fog Heen * pkg.c (packages_get_var): Don't try to chop if string length is zero. Freedesktop #4034. (scan_dir): Turn backslashes into slashes or poptParseArgvString() will eat them when ${prefix} has been expanded in parse_libs(). Thanks to j^ for the patch. Freedesktop #4267 2005-09-21 Tollef Fog Heen * pkg.m4: Apply patch from Roberto Huelga to look at XXX_CFLAGS and XXX_LIBS which got lost somewhere. 2005-08-27 Tollef Fog Heen * Makefile.am (AM_CFLAGS): Add default CFLAGS * pkg.h: Add missing prototype for enable_private_libs and disable_private_libs. 2005-08-23 Tollef Fog Heen * popthelp.c: char format[10] overflowed always with gcc4, so use positional parameters instead. Thanks to Scott James Remnant for pointing me to that solution. Debian #321961, Ubuntu #13950, Freedesktop #2661 2005-08-22 Tollef Fog Heen * check/check-cflags, check/check-define-variable, check/check-libs, check/check-libs-private, check/check-requires-private: Exec POSIX compatible shell on Solaris 2005-07-16 Tollef Fog Heen * configure.in: Release 0.19 2005-07-15 Tollef Fog Heen * pkg.c (package_get_var): Make sure to g_strdup all the return values and not return some values which should not be freed and some which should. Yay valgrind. Freedesktop #3682 * configure.in: Fix default search path to be pkgconfig rather than pkg-config again. Freedesktop #3662 * pkg.m4: Add a missing AC_MSG_RESULT. Thanks to Gary Kramlich for noticing this and harassing me to fix it. 2005-06-29 Tollef Fog Heen * configure.in: Release 0.18.1 * pkg.m4: Brown bag fix. pkg_failed was always set to “untriedâ€. Debian #316181. 2005-06-27 Tollef Fog Heen * configure.in: Rename to pkg-config. * configure.in: Release 0.18 All those Requires.private changes are thanks to James Henstridge. Thanks! Freedesktop #3097 * check/private-dep.pc, check/public-dep.pc, check/requires-test.pc: New files, data for the check-requires-private test. * check/check-requires-private: New test to check for Requires.private support. * check/Makefile.am (EXTRA_DIST, TESTS): Add Requires.private test. * pkg.h (struct _Package): Add requires_private * pkg.c (get_requires_private, fill_list_single_package) (fill_list, verify_package, verify_package, get_merged) (get_merged_from_back, get_multi_merged) (get_multi_merged_from_back, package_get_l_libs) (packages_get_l_libs, package_get_L_libs, packages_get_L_libs) (package_get_other_libs, packages_get_other_libs) (package_get_I_cflags, packages_get_I_cflags) (package_get_other_cflags, packages_get_other_cflags): Handle private requires and cascading changes. * parse.c (parse_requires_private, parse_conflicts) (parse_package_file): Handle Requires.private * pkg.m4: Add PKG_CHECK_EXISTS to check if a module exists. Thanks to James Henstridge for the patch. Freedesktop #3530 2005-06-26 Tollef Fog Heen * pkg.m4: Get rid of caching again. This breaks too much stuff, and pkg-config doesn't take much time to run. Freedesktop #3550 * glib-patches/configure.in-fd_set.diff: Patch to grep for fd_set rather than fd_mask. Thanks to David Wolfe for the fix. This should make pkg-config happier on QNX. Gnome #129687 2005-06-03 Tollef Fog Heen * pkg.m4, README, pkg-config.1: s/configure.in/configure.ac/, thanks to Morten Brix Pedersen 2005-05-21 Tollef Fog Heen * check/check-libs-private: New test to check for support for private libraries. * check/simple.pc (prefix): Add Libs.private header. * check/Makefile.am (TESTS): Add check-libs-private test * pkg.h: Adjust function prototypes. * pkg.c: Add global ignore_private_libs variable. (scan_dir): Use the correct free function. Stop leaking file descriptors. (package_get_l_libs, packages_get_l_libs, package_get_L_libs, packages_get_L_libs): Stop the recursive silliness and go back to old behaviour. (packages_get_all_libs): Adjust parameters to packages_get_*_libs (enable_private_libs, disable_private_libs): Trivial helper functions. * pkg-config.1: Update documentation wrt search path (Debian #308942), update docs for Libs.private and add the problematic handling of mixing = and non-= arguments to the bugs section. * parse.h: Adjust parameters for parse_package_file to get private libs or not. * parse.c (trim_and_sub): Fix memory leak. (_do_parse_libs): New function including what's common between parse_libs and parse_private_libs. (parse_libs_private): New function. Handle private libraries. (parse_line): Add . to the list of valid characters in headers (so Libs.private works correctly. (parse_line): Fix memory leaks. (parse_line): Handle Libs.private. (parse_package_file): Fix memory leak. * main.c (main): Fix memory leak. * NEWS: Document changes to inter-library handling. * main.c (main): Handle inter-library dependencies old-style, but do private libraries too. Adjust parameters to packages_get_*_libs. * configure.in: Change comment wrt inter-library handling to talk about private libraries instead. 2005-04-22 Tollef Fog Heen * main.c (main): Re-add PKG_CONFIG_LIBDIR support which was removed by mistake. 2005-04-14 Tollef Fog Heen * configure.in: Bump to 0.17.2 * NEWS: Update for 0.17.2 2005-04-13 Tollef Fog Heen * pkg.c (packages_get_l_libs, packages_get_L_libs): Duplicate singly linked list before putting it on list passed to string_list_strip_duplicates_from_back to avoid infinite loop when g_slist_copy tries to copy self-linked list. This happens if the user specifies the same name on the command line twice. (Freedesktop #3006) 2005-04-12 Tollef Fog Heen * configure.in: 0.17.1 * NEWS: document changes for 0.17.1 * configure.in: Fix up AC_MSG_RESULT for indirect deps. Also fix so the test no longer is inverted and auto works properly. * configure.in: capitalisation-typo * pkg.m4: Apply patch from James Henstridge to have AC_RUN_LOG in the right place. (Freedesktop #2992) * pkg.m4: Add note that PKG_PROG_PKG_CONFIG must be called explicitly if the first call to PKG_CHECK_MODULES might not happen. (Debian #303211) 2005-04-12 Tollef Fog Heen * configure.in: Bump to 0.17 * NEWS: Update for 0.17 * NEWS: Add note saying that we've now grabbed _PKG_* and PKG_*. (Freedesktop #2962) * pkg.m4: wrap running pkg-config in AC_RUN_LOG per James Henstridge's suggestion. * pkg.m4: Patch from James Henstridge to evaluate second argument again. (Freedesktop #2987, Gnome #300232, Debian #303878, #303969) 2005-04-02 Tollef Fog Heen * glib-patches/remove-strsignal-prototype.diff: Remove strsignal prototype from gstrfuncs.c, it is included in string.h. This fixes a compilation issue on cygwin. (Freedesktop #2598) * glib-patches/distcheckfix.diff: Move glibconfig.h.win32 and config.h.win32 too. * glib-patches/distcheckfix.diff: Move glibconfig-sysdefs.h and glibconfig.h to DISTCLEANFILES since they're made by configure. * parse.c (parse_libs): Handle -framework as a single argument. (Freedesktop #1278) * configure.in: Remove extraneous " from --with-pc-path's help * glib-patches/mkinstalldirs.update.diff: cvs admin -ko to avoid having the Id CVS keyword being expanded, which broke the application of the patch. 2005-04-01 Tollef Fog Heen Patches provided by Steve Langasek * configure.in: Try to detect whether this architecture supports inter-library dependencies. If so, we default to assuming that this support is used and link to the minimal set of libraries rather than traversing the full depends set. * main.c (main): Only recurse if we want a static library list or if this architecture doesn't support inter-library dependencies. This will probably expose bugs for libraries which declare dependencies in their .pc files but don't actually link against each other. * pkg.c (packages_get_all_libs): Add recurse option (packages_get_L_libs): Add recurse option (package_get_L_libs): Add recurse option (packages_get_l_libs): Add recurse option (package_get_l_libs): Add recurse option * pkg.h: Update prototypes to handle the recurse option. 2005-03-29 Tollef Fog Heen * check/check-cflags, check/check-define-variable, check/check-libs, check/common, check/Makefile.am, check/simple.pc: Add simple test framework and begin writing tests. * Makefile.am, configure.in: Make in check/ as well. 2005-03-28 Tollef Fog Heen * glib-patches/distcheckfix.diff: Add some files to CLEANFILES so make distcheck now works. 2005-03-28 Tollef Fog Heen * autogen.sh: Extra paranoia -- fail if running auto* fails or if patching fails. * glib-patches/mkinstalldirs.update.diff: Update patch so it applies cleanly * glib-patches/pthread-config-fix.diff: adjust offsets so patch is quiet again 2005-03-26 Tollef Fog Heen * configure.in: Bump to 0.16 * NEWS: update for 0.16 2005-03-26 Tollef Fog Heen * configure.in: Fix default search path for .pc files. (This was done after the change above but before tagging. Put here to avoid confusion whether this went into the release). 2005-03-26 Tollef Fog Heen * AUTHORS: Add myself. 2005-03-18 Tollef Fog Heen * pkg.c (print_package_list): Ignore requires when just listing the available packages. (internal_get_package): Pass ignore_requires on. * parse.h: update prototype for parse_package_file. * parse.c (parse_line): Ignore Requires when told so. (parse_package_file): Pass ingore_requires on to parse_line. (Freedesktop #191, Debian #232719) 2005-03-18 Tollef Fog Heen * main.c (main): Use add_search_dirs for both the compile-time defined pc_path and the run-time defined PKG_CONFIG_PATH. * pkg.h: Add prototype for add_search_dirs. * pkg.c (add_search_dirs): Add new function which takes a delimiter-separated list as input and add_search_dir's it. (package_init): Remove knowledge about which dirs should be initially added. Moved this to main.c(main) * ChangeLog: Add emacs variables to set the date to this ChangeLog's standard format * Makefile.am (INCLUDES): Pass PKG_CONFIG_PCPATH on to main.c * configure.in: Add --with-pc-path to define the default search path for .pc files. (Freedesktop #119, #648) 2005-03-18 Tollef Fog Heen * glib-patches/pthread-config-fix.diff: Add patch to detect pthreads properly on some architectures. Thanks to Michael Haubenwallner for reporting this bug and providing a patch. (Freedesktop #1617) 2005-02-21 Tollef Fog Heen * parse.c (parse_package_file): Stop leaking file descriptors. (Freedesktop #1006) 2005-02-21 Tollef Fog Heen * pkg-config.1: Get rid of groff warnings when formatting pkg-config(1) on an 80-column terminal. Thanks to Colin Watson and Ubuntu for the fix. (Freedesktop #148) 2005-02-21 Tollef Fog Heen * glib-patches/*: Add patches for compiling with modern autotools. * autogen.sh: Use said patches. (Freedesktop #134) 2005-02-20 Tollef Fog Heen * main.c (main): Unstaticify variables. (Freedesktop #2459) 2004-07-18 Scott James Remnant * pkg.m4: Fix a bad patch causing duplication in one of the error messages. 2004-07-06 Scott James Remnant * pkg.m4: Correct quoting brackets to correctly split the words. 2004-06-08 Scott James Remnant * README: Change gnome.org reference to freedesktop.org * AUTHORS: Add myself here, I guess. * pkg.m4: Mine! (fix copyright) 2004-05-08 Scott James Remnant Improve pkg-config's configure instructure and bring it bang up to date. * pkg.m4: Complete rewrite. (PKG_PROG_PKG_CONFIG): if PKG_CONFIG not defined, find the pkg-config in the path or $host-pkg-config if cross-compiling, check that is of at least version 0.9.0 or one given. (_PKG_CONFIG): internal macro to call pkg-config. (PKG_CHECK_MODULES): same semantics as the previous incarnation except you can prevent pkg-config from being called by defining xxx_CFLAGS and xxx_LIBS yourself, additionally all results are cached. * README, pkg-config.1: Adjust documentation to match. 2003-05-09 Havoc Pennington * pkg.m4: improve error message a bit, from Tim Janik 2003-04-30 James Henstridge * pkg.c (verify_package): fix up error messages. * parse.c (parse_line): don't error out on unknown keywords, as they may represent future extensions to the file format. 2003-02-22 James Henstridge * pkg.c (add_virtual_pkgconfig_package): function to add a virtual "pkg-config" package to the packages hash table. (package_init): add the "pkg-config" package while initing the hash table. * pkg.h: add missing prototype. * main.c (main): print the url if the package is too old, to match the output of verify_package(). * popthelp.c, poptint.h, poptconfig.c, findme.h, popt.h: * poptparse.c: expand licensing header to the version found in the Popt distribution's COPYING file. See discussion in bug 84804 for details. 2003-02-21 James Henstridge * pkg.m4: split macro into two parts. The check for presence of pkg-config is now in a helper macro. The main PKG_CHECK_MODULES macro now AC_REQUIRES() it, so that the pkg-config check is only performed once. Also update quoting to match current practices. 2003-02-19 Tor Lillqvist * pkg.c (add_env_variable_to_list): Use G_SEARCHPATH_SEPARATOR_S instead of hardcoded ":". (verify_package): Don't use /usr/include on Win32. 2003-02-15 Havoc Pennington * pkg.c (verify_package): patch from Nalin to use /usr/lib64 as the system libdir on systems where that's appropriate 2003-02-15 Havoc Pennington Fixes suggested by Werner Trobin * main.c (verbose_error): honor --errors-to-stdout and flush the same stream we write to * parse.c (parse_url): support an "url" field so if someone has a .pc file they can figure out where to go for newer versions and such 2003-01-16 Havoc Pennington * configure.in: 0.15 2003-01-15 Havoc Pennington * pkg.c (package_init): honor a PKG_CONFIG_LIBDIR to move default search dir, useful in cross-compilation for example, bug #103545 fix from David Schleef 2003-01-01 Zack Rusin * main.c (main): added --libs-only-other and --cflags-only-other arguments, thanks to which a more obscure dependencies can be retrieved, e.g. -pthread 2002-11-19 Havoc Pennington * pkg-config.1: apply formatting fixes from Peter Breitenlohner 2002-10-24 Tor Lillqvist * configure.in: Move the check for Win32 (which tests the $host variable) and dependent code later, as it turns out that $host isn't normally yet set at that point... (I hadn't noticed as I by habit always pass --host=i386-pc-mingw32 to the configure script, which sets $host.) 2002-10-11 Havoc Pennington * pkg.c (verify_package): fix to properly cast iter->data to char* before doing pointer arithmetic, from David Robins 2002-10-10 Havoc Pennington * configure.in: 0.14 2002-10-02 Anders Carlsson * pkg.c (add_env_variable_to_list): Don't return NULL, return the new list. (verify_package): break if we've removed the variable. 2002-09-26 Tor Lillqvist * parse.c (get_compat_package): Return NULL right away on Windows. There has never been any of these legacy *-config scripts distributed for Windows as far as I know. 2002-09-26 Anders Carlsson * pkg.c (verify_package): Use strncmp when checking for the -I prefix. 2002-09-19 Havoc Pennington * configure.in: 0.13 2002-09-19 Anders Carlsson * pkg.c: (verify_package): Don't call g_free on strings returned from g_getenv. Tue Sep 17 14:11:51 2002 Jonathan Blandford * pkg.c: strip out C_INCLUDE_PATH and CPLUS_INCLUDE_PATH if they exist, as this can break -Werror on some newer gcc versions. 2002-09-13 Tor Lillqvist * Makefile.am (USE_INSTALLED_GLIB): Seems that the automake version used by Havoc doesn't recognize pkg_config_CFLAGS and pkg_config_LDFLAGS, thus failing builds on Win32 directly from the tarball. Set included_glib_includes and pkg_config_LDADD instead, then, like in the !USE_INSTALLED_GLIB branch. * findme.c (X_OK): If X_OK undefined, define as 1, always, not only if G_OS_WIN32, which is never defined here. Fixes a corner case on Win32 with MSYS and mingw where configure as included in the release tarball for some reason doesn't find unistd.h. 2002-09-09 Havoc Pennington * pkg.c (fill_list_single_package): fix uninitialized variable, patch from Andrea Suatoni 2002-09-06 Havoc Pennington * parse.c, pkg.c: handle other_libs other_cflags same as -l/-L/-I flags, so we pull in from dependent packages. Closes #85244, #90706, #89851 2002-03-27 Havoc Pennington * pkg.c (verify_package): fix a typo 2002-03-07 Havoc Pennington * configure.in: 0.12.0 2002-03-06 Tor Lillqvist * configure.in: Use GLib 2.x on Win32. 2002-02-28 Havoc Pennington * pkg-config.1: add a note about the need for AC_SUBST with PKG_CHECK_MODULES. Stefan Kost pointed this out. 2002-02-28 Havoc Pennington Fix for static linking, -l flag order for libs in multiple prefixes * pkg.c: only sort -L/-I by PKG_CONFIG_PATH order, don't sort -l flags. (fill_list_single_package): make whether to path sort controlled by a boolean arg (fill_list): ditto 2002-02-13 Havoc Pennington * pkg.c (internal_get_package): look up path position by package key, not package name 2002-02-12 Havoc Pennington * pkg.c (scan_dir): use g_strdup, and fix the location where we assign the nul byte, so we don't mangle things for directories that end in '/' - reported by Enrico Scholz 2002-02-07 Havoc Pennington * configure.in: 0.11.0 2002-02-07 Havoc Pennington * autogen.sh: patch gslist.c so that it has a stable sort function, so we don't utterly mangle the order of the libraries on the link line. 2002-02-03 Havoc Pennington * configure.in: 0.10.0 Redo distribution with autoconf 2.13 2002-02-03 Havoc Pennington * pkg.m4: require 0.9.0 * configure.in: increment version to 0.9.0 2002-02-01 Havoc Pennington * pkg.c (verify_package): don't warn about /usr/include /usr/lib in cflags/libs, too annoying to fix 2002-02-01 Havoc Pennington Throughout: cast chars to guchar before passing to isspace, etc., noted by Morten Welinder * pkg.c (verify_package): actually strip system -I/-L out of the cflags/libs, unless you set an environment variable asking to leave them in. 2002-02-01 Havoc Pennington * pkg.m4: fix shell portability issue, reported by Morten Welinder 2002-01-24 Havoc Pennington * pkg.c (print_package_list): make the output halfway attractive * autogen.sh: use automake-1.4 aclocal-1.4 if found * pkg.c (verify_package): add a warning about -I/usr/include in cflags 2001-10-28 Havoc Pennington * pkg.c: track position of package in the path search order, and sort packages accordingly before assembling flags lists, reported by Jacob Berkman * parse.c (get_compat_package): set path position to maxint, always at end of path 2001-10-28 Havoc Pennington * pkg.c (add_search_dir): put the search path in the right order 2001-10-28 Havoc Pennington * configure.in: reorder things so they work on unix 2001-10-27 Tor Lillqvist New Win32 feature to make pkg-config useful for users of MSVC: with the flag --msvc-syntax, munge -L and -l flags appropriately for the MSVC command-line compiler. (-I flags are the same.) * README.win32: Update. * main.c (main): Add --msvc-syntax flag. * pkg-config.1: Document it. * pkg.h: Declare msvc_syntax. * parse.c (parse_libs): Obey msvc_syntax. 2001-10-25 Tor Lillqvist Improve Windows behaviour: Make it even easier to install developer packages in random locations, without having to modify the .pc files. Don't set "prefix" globally, instead override it for each .pc file parsed, if the path where the .pc file is seems to be the standard .../lib/pkgconfig. * main.c (main): Add search directories also from two Registry keys, in addition to the PKG_CONFIG_PATH environment variable. Don't define prefix globally. * parse.c (parse_line): Instead, if a .pc file is in /foo/bar/lib/pkgconfig, define prefix as /foo/bar for that package only. * pkg.c: Case-fold file names on Windows, in case they have been uppercasified by some tool. * pkg-config.1: Document Windows behaviour. 2001-10-21 Tor Lillqvist * Makefile.am (EXTRA_DIST): Distribute README.win32. * main.c (main): (Win32): Add option --prefix-variable in case the variable used in a .pc file as "prefix" isn't called "prefix". * pkg-config.1: Document it. * README.win32: Describe the behaviour in more detail. 2001-10-19 Tor Lillqvist * main.c: (Win32): Add option --dont-define-prefix on Windows. The option prevents pkg-config from automatically defining an overriding value for the "prefix" variable. Unless this option is used, set "prefix" to pkg-config's installation directory, i.e. assume that the packages whose configuration files are found in the same tree where pkg-config.exe itself is, also have been configured to use the same prefix. This means that a typical "developer package" containg a subtree of headers, libraries, etc, including .pc files, can be installed in any random location. As long as pkg-config.exe is installed the same tree, things just should work. * pkg-config.1: Document it. 2001-09-30 Tor Lillqvist Changes for "pure" Win32 (without Cygwin or similar) support. The most important differences compared to pkg-config on Unix are: We don't use hardcoded PKGLIBDIR paths but deduce the installation prefix at runtime. Use the normal GLib DLL, not a private copy. Yes, this does introduce a circular dependency, but that can be worked around. * README.win32: New file. * configure.in: Check for Win32. If so, define USE_INSTALLED_GLIB, and don't configure in the included glib-1.2.8. Set GLIB_CFLAGS and GLIB_LIBS assuming that GLib is installed in the same location pkgconfig will be. Check for dirent.h, unistd.h and sys/wait.h headers. * Makefile.am: If USE_INSTALLED_GLIB, use the GLIB_* values set above, and don't make in the glib-1.2.8 subdir. * autogen.sh: Use perl -p -i.bak, works better on Win32 (and Cygwin). * *.c: Conditionalize inclusions of unistd.h and sys/wait.h. * findme.c: Define X_OK on Win32 if necessary. * parse.c * popthelp.c: Minor Win32 portability ifdefs. * parse.c: No need to include . * pkg.c: Don't hardcode PKGLIBDIR, but use g_win32_get_package_installation_directory() to deduce it. (scan_dir): Make a temp copy of dirname with potential superfluous trailing slash removed. The Win32 opendir implementation doesn't always like those. * pkg.h: If USE_INSTALLED_GLIB, include instead of partial-glib.h. * popt.c (execCommand): Don't compile on Win32. * poptconfig.c (configLine): Don't bother with the "exec" stuff on Win32, too complex to port, at least for now. (poptReadDefaultConfig) Don't bother compiling on Win32, this function isn't even called. 2001-07-11 Havoc Pennington * pkg.c: include sys/types.h to avoid warnings about dirent on some systems. 2001-07-11 Havoc Pennington * parse.c (parse_cflags): fix failure to put space between cflags, reported by Chema (parse_line): allow spelling Cflags as CFlags, pointed out by Tim (get_compat_package): support legacy script gnome-vfs-config for package name "libgnomevfs" (read_one_line): just blow away all the stupid getc_unlocked crap 2001-06-18 Havoc Pennington * pkg.m4: print the error, not the name of the variable containing it, doh Sun Jun 17 17:48:45 2001 Tim Janik * pkg.c (internal_get_package): fix check before parsing a file at "location" to read (location==NULL) instead of (pkg==NULL). 2001-06-14 Havoc Pennington * pkg.c (internal_get_package): don't fall back to legacy -config scripts for the -uninstalled case. 2001-06-07 Havoc Pennington * pkg.m4: add URL to no-pkg-config error message 2001-06-06 Havoc Pennington * pkg.m4: Fix mismatched backtick 2001-06-05 Havoc Pennington * main.c: add --errors-to-stdout so you can capture them with backticks * pkg.m4: set FOO_PKG_ERRORS after a failed check, so people can print the errors. 2001-06-05 Havoc Pennington * parse.c: never use flockfile, getc_unlocked 2001-06-05 Havoc Pennington * pkg.m4: remove unrelated macros * README, AUTHORS: updates 2001-05-20 Havoc Pennington * configure.in: revert package name change, just screwing things up. 2001-05-18 Havoc Pennington * main.c (main): Change default to print errors on --cflags, --libs, etc., just not on the predicate-style args 2001-05-18 Havoc Pennington * pkg.m4: always AC_SUBST the cflags/libs * pkg-config.1: updates * configure.in: call the package 'pkg-config' instead of pkgconfig, for consistency * popt.c: conditionalize on HAVE_SETRESUID, HAVE_SETREUID maybe this will help with windows, and improves the #ifdef __hpux test in any case. * parse.c: use HAVE_FLOCKFILE to try for windows portability * configure.in: check for flockfile 2001-05-17 Havoc Pennington * pkg.m4: change to print errors only if no custom not-found action is specified * main.c (main): add PKG_CONFIG_DEBUG_SPEW environment variable (main): implement --print-errors where errors are printed, and otherwise don't print errors related to packages, just usage errors; pointed out by Raja (main): rename pcbuilddir to pc_top_builddir 2001-05-17 Havoc Pennington Changes to support building against uninstalled packages. * ${pcfiledir} variable used to locate builddir by locating the .pc file * ${pcbuilddir} variable set by the PKG_CONFIG_BUILD_DIR variable, used for the name of the build directory where the cflags/libs will be used, defaults to '$(top_builddir)' * "uninstalled" feature looks for foo-uninstalled.pc before foo.pc, unless PKG_CONFIG_DISABLE_UNINSTALLED is set * --uninstalled option used to see if foo-uninstalled.pc is in use * --define-variable option added, but turned out to be unused for this 2001-05-09 Havoc Pennington * main.c, findme.c, parse.c, pkg.c, poptconfig.c, popthelp.c, poptparse.c: portability fixes from Tomas Ogren 2001-05-09 Havoc Pennington * Makefile.am (EXTRA_DIST): put the m4 files in the distribution 2001-05-09 Havoc Pennington * pkg.m4: switch to double quotes for module list, so you can use a variable there. 2001-05-09 Havoc Pennington * pkg.c (verify_package): fix error message on missing Name field, so that it doesn't try to use the name field to report which package was broken * parse.c (parse_package_file): change a debug spew to an actual error message 2001-04-13 Havoc Pennington * pkg.m4: fixed this up * main.c (main): remove --check-requires, instead allow version predicates in the module list. 2001-04-12 Havoc Pennington * main.c (main): Implement --check-requires='gtk+-2.0 = 1.3.4' option 2001-01-24 Havoc Pennington Implement --debug spew option. * main.c: add debug_spew function and an option --debug 2001-01-06 Havoc Pennington * pkg.c (scan_dir): fail silently if we can't open a directory in the PKG_CONFIG_PATH 2001-01-02 Havoc Pennington * configure.in: bump version 2001-01-02 Havoc Pennington * parse.c (parse_package_file): return NULL instead of exiting if we can't open the file. * main.c (main): Add options to check the version of pkg-config itself, and to list all known packages * parse.c (split_module_list): fix to work properly (parse_module_list): pass variable-substituted string to split_module_list(), silly typo * pkg.c (get_package): Add ability to pass a filename instead of a package name, if you want to use a specific pkg-config file (used for configure.in in GTK+ for example, where you can build against an uninstalled copy of GLib). 2000-11-29 Havoc Pennington * parse.c (parse_module_list): Allow commas before/after the module list, and allow spaces instead of commas to be used as separators. This leniency makes it a lot easier to conditionally build the module list according to configure.in checks. 2000-11-29 Havoc Pennington * pkg.c (packages_get_other_libs): put a space after the other_libs (packages_get_other_cflags): put a space after the other_cflags 2000-11-27 Havoc Pennington * main.c (main): don't print space after variable values * pkg.c (packages_get_var): don't add space after last variable 2000-11-22 Martijn van Beers * main.c: added a --version option for martin * parse.c: added jamesh's patch release 0.4.1 2000-10-17 Martijn van Beers * configure.in: * Makefile.am: Change to use C version only. release 0.4.0 2000-09-15 Havoc Pennington * configure.in: AM_PROG_LIBTOOL * Makefile.am (experimental_pkg_config_LDADD): Link with .la, not .a 2000-08-10 Havoc Pennington * pkg.c (verify_package): Bugfix from Anders 2000-07-24 Havoc Pennington * parse.c (get_compat_package): Add support for imlib-config and orbit-config 2000-07-22 Havoc Pennington * parse.c (get_compat_package): Make it work with any gnome-config package name. 2000-07-22 Havoc Pennington * parse.c, pkg.c, pkg.h: Add Conflicts: keyword, and do version-checking for Requires: line. Untested. 2000-07-21 Havoc Pennington * parse.c (get_compat_package): Add some compat stuff (execs gnome-config, gtk-config, etc.). We don't yet support all the modules we might want to support. 2000-07-20 Havoc Pennington * pkg.c (get_package): fix error message formatting 2000-07-20 Havoc Pennington * pkg.c (recursive_fill_list): append rather than prepend the current libs to the required libs. * parse.c (trim_and_sub): Make variables use ${} instead of %{} so we can accept "shell variables" subbed by configure 2000-07-20 Havoc Pennington * autogen.sh: Run perl on the Makefile.am in the glib tarball to keep it from doing anything in 'make install' * pkg.c (scan_dir): Revert to .pc extension 2000-07-20 Havoc Pennington * glib-1.2.8.tar.gz: Decided it was easier to just stick in a copy of the tarball instead of hacking up glib; this way we get bugfixes. If distribution size is a problem, we can hack on it later. Rerun autogen.sh to get the tarball unpacked and configured. * configure.in: AC_CONFIG_SUBDIRS(glib-1.2.8) * main.c: Add version-comparison * Makefile.am: use new glib tarball 2000-07-18 Havoc Pennington * pkg.c: When removing -l duplicates, keep the last not the first -l * main.c (main): Added --variable and --module-exists options. * Wrote an experimental version of pkg-config in C. For now, glib is required, until I get a cut-and-pasted subset of glib up and running. C version is not finished, don't release a tarball yet. ;-) * configure.in, Makefile.am: stuff to build the C version of pkg-config 2000-07-10 Martijn van Beers * pkg-config.in: remove -I/usr/include and -L/usr/lib from the flags we output * pkg.m4: add a PKG_ACLOCALFLAGS macro add a _DEPENDS output variable 2000-07-01 Martijn van Beers * data/gnomeconfig.pce: make output of --modversion be like the output of .pc files 2000-07-01 Martijn van Beers * pkg.m4: clean up PKG_CHECK_CFLAG 2000-06-27 Martijn van Beers * data/gnomeconfig.pce: check for existance with --cflags instead of --libs * pkg.m4: remove stray debug echo command add PKG_CHECK_CFLAGS macro 2000-06-23 Martijn van Beers * data/gnomeconfig.pce, * pkg-config.in: - add checks to see if we're properly installed - bug fixes for sh on Tru64 Wed Jun 21 2000 Martijn van Beers * added support for extension modules that will be called if a module doesn't have a .pc file * added a gnomeconfig.pce extension module to allow for old gnome-libs stuff to be used (at the request of hp) * made CFLAGS be like the LIBS_* variables in that you need to do the adding in the .pc file Thu Jun 15 2000 Martijn van Beers * add a --print-pc-dir that prints the default search dir * only use the default search dir when nothing else is specified Sat Jun 10 2000 Martijn van Beers * made the duplication removing code in a function * fix the duplication code so that it checks $* correctly while we have IFS=":$IFS" * splitted up --libs into --libs-only-L, --libs-only-l-self and --libs-only-l-system, as suggested by Tim Janik Thu Jun 8 2000 Martijn van Beers * made it use autoconf/automake * pkg-config: removed in favour of a .in equivalent which generates pkg-config from configure * pkg-config.in: new file, mostly a copy from pkg-config * pkg-config.in: get the prefix for the default pc_path from configure Wed Jun 7 2000 Martijn van Beers * pkg.m4: new file, contains a macro that checks for packages and whether they're the right version * pkg-config: added a --modversion flag to get the version of the module (needs a VERSION var in the .pc files) Tue Jun 6 2000 Martijn van Beers * pkg-config: removed the pc_name_pkg functionality * pkg-config: show help and error out when there are no arguments * pkg-config: get the version from configure ;; ;; Local variables: ;; add-log-time-format: add-log-iso8601-time-string ;; End: pkg-config-0.29.1/check/0000775000175000017500000000000012665370350011716 500000000000000pkg-config-0.29.1/check/check-variables0000775000175000017500000000075012664101724014605 00000000000000#! /bin/sh set -e . ${srcdir}/common # Check quoted variables are stripped. In 0.28 and earlier, this would # contain the "" quotes. RESULT='/local/include' run_test --variable=includedir variables # Non-quoted variables are output as is. In 0.29, the \ would be stripped. RESULT='-I"/local/include"/foo -DFOO=\"/bar\"' run_test --variable=cppflags variables # Check the entire cflags output RESULT='-DFOO=\"/bar\" -I/local/include -I/local/include/foo' run_test --cflags variables pkg-config-0.29.1/check/sub/0000775000175000017500000000000012665370350012507 500000000000000pkg-config-0.29.1/check/sub/sub1.pc0000664000175000017500000000021012275467762013631 00000000000000Name: Subdirectory package 1 Description: Test package 1 for subdirectory Version: 1.0.0 Libs: -L/sub/lib -lsub1 Cflags: -I/sub/include pkg-config-0.29.1/check/sub/broken.pc0000664000175000017500000000013212651243552014225 00000000000000Name: Broken package Description: Module with broken .pc file Version: 1.0 Name: 2nd name pkg-config-0.29.1/check/sub/sub2.pc0000664000175000017500000000021012275467762013632 00000000000000Name: Subdirectory package 2 Description: Test package 2 for subdirectory Version: 2.0.0 Libs: -L/sub/lib -lsub2 Cflags: -I/sub/include pkg-config-0.29.1/check/circular-3.pc0000664000175000017500000000040212275467762014135 00000000000000prefix=/usr exec_prefix=${prefix} libdir=${exec_prefix}/lib includedir=${prefix}/include/circ3 Name: Circular Requires test 3 Description: Dummy package for testing circular Requires Version: 1.0.0 Requires: circular-1 Libs: -lcirc3 Cflags: -I${includedir} pkg-config-0.29.1/check/check-whitespace0000775000175000017500000000100112664101724014757 00000000000000#! /bin/sh set -e . ${srcdir}/common # variables come out unquoted. In 0.28 and earlier, this would also # contain the ""s quoting the variable. RESULT='/usr/white space/include' run_test --variable=includedir whitespace # expect cflags from whitespace RESULT='-Dlala=misc -I/usr/white\ space/include -I$(top_builddir) -Iinclude\ dir -Iother\ include\ dir' run_test --cflags whitespace # expect libs from whitespace RESULT="-L/usr/white\\ space/lib -lfoo\\ bar -lbar\\ baz -r:foo" run_test --libs whitespace pkg-config-0.29.1/check/simple.pc0000664000175000017500000000037612275467762013474 00000000000000prefix=/usr exec_prefix=${prefix} libdir=${exec_prefix}/lib includedir=${prefix}/include Name: Simple test Description: Dummy pkgconfig test package for testing pkgconfig Version: 1.0.0 Requires: Libs: -lsimple Libs.private: -lm Cflags: -I${includedir} pkg-config-0.29.1/check/check-libs0000775000175000017500000000230412275467762013602 00000000000000#! /bin/sh set -e . ${srcdir}/common RESULT="-lsimple" if [ "$list_indirect_deps" = no ]; then run_test --libs simple fi RESULT="-lsimple -lm" if [ "$list_indirect_deps" = yes ]; then run_test --libs simple fi run_test --libs --static simple RESULT="" run_test --libs fields-blank RESULT="-L/other/lib -Wl,--as-needed -lother" run_test --libs other RESULT="-lother" run_test --libs-only-l other RESULT="-L/other/lib" run_test --libs-only-L other RESULT="-Wl,--as-needed" run_test --libs-only-other other # Try various mixed combinations RESULT="-L/other/lib -lother" run_test --libs-only-l --libs-only-L other run_test --libs-only-L --libs-only-l other RESULT="-Wl,--as-needed -lother" run_test --libs-only-l --libs-only-other other run_test --libs-only-other --libs-only-l other RESULT="-L/other/lib -Wl,--as-needed" run_test --libs-only-L --libs-only-other other run_test --libs-only-other --libs-only-L other RESULT="-L/other/lib -Wl,--as-needed -lother" run_test --libs-only-l --libs-only-L --libs-only-other other run_test --libs --libs-only-l --libs-only-L --libs-only-other other run_test --libs --libs-only-l other run_test --libs --libs-only-L other run_test --libs --libs-only-other other pkg-config-0.29.1/check/gtk/0000775000175000017500000000000012665370350012503 500000000000000pkg-config-0.29.1/check/gtk/glib-2.0.pc0000664000175000017500000000053212275467762014174 00000000000000prefix=/gtk exec_prefix=${prefix} libdir=${exec_prefix}/lib includedir=${prefix}/include glib_genmarshal=glib-genmarshal gobject_query=gobject-query glib_mkenums=glib-mkenums Name: GLib Description: C Utility Library Version: 2.30.3 Libs: -L${libdir} -lglib-2.0 Libs.private: -lrt Cflags: -I${includedir}/glib-2.0 -I${libdir}/glib-2.0/include pkg-config-0.29.1/check/gtk/gthread-2.0.pc0000664000175000017500000000036012275467762014674 00000000000000prefix=/gtk exec_prefix=${prefix} libdir=${exec_prefix}/lib includedir=${prefix}/include Name: GThread Description: Thread support for GLib Requires: glib-2.0 Version: 2.30.3 Libs: -L${libdir} -lgthread-2.0 -pthread -lrt Cflags: -pthread pkg-config-0.29.1/check/gtk/cairo-gobject.pc0000664000175000017500000000043712275467762015476 00000000000000prefix=/gtk exec_prefix=${prefix} libdir=${exec_prefix}/lib includedir=${prefix}/include Name: cairo-gobject Description: gobject functions for cairo graphics library Version: 1.10.2 Requires: cairo gobject-2.0 glib-2.0 Libs: -L${libdir} -lcairo-gobject Cflags: -I${includedir}/cairo pkg-config-0.29.1/check/gtk/gio-2.0.pc0000664000175000017500000000055112275467762014036 00000000000000prefix=/gtk exec_prefix=${prefix} libdir=${exec_prefix}/lib includedir=${prefix}/include giomoduledir=${libdir}/gio/modules glib_compile_schemas=${exec_prefix}/bin/glib-compile-schemas Name: GIO Description: glib I/O library Version: 2.30.3 Requires: glib-2.0,gobject-2.0,gmodule-no-export-2.0 Libs: -L${libdir} -lgio-2.0 Libs.private: -lz -lresolv Cflags: pkg-config-0.29.1/check/gtk/gdk-pixbuf-2.0.pc0000664000175000017500000000101612275467762015315 00000000000000prefix=/gtk exec_prefix=${prefix} libdir=${exec_prefix}/lib includedir=${prefix}/include gdk_pixbuf_binary_version=2.10.0 gdk_pixbuf_binarydir=${libdir}/gdk-pixbuf-2.0/2.10.0 gdk_pixbuf_moduledir=${gdk_pixbuf_binarydir}/loaders gdk_pixbuf_cache_file=${gdk_pixbuf_binarydir}/loaders.cache Name: GdkPixbuf Description: Image loading and scaling Version: 2.24.1 Requires: gobject-2.0 Requires.private: gmodule-no-export-2.0 libpng12 Libs: -L${libdir} -lgdk_pixbuf-2.0 Libs.private: -lm Cflags: -I${includedir}/gdk-pixbuf-2.0 pkg-config-0.29.1/check/gtk/pixman-1.pc0000664000175000017500000000034212275467762014413 00000000000000prefix=/gtk exec_prefix=${prefix} libdir=${exec_prefix}/lib includedir=${prefix}/include Name: Pixman Description: The pixman library (version 1) Version: 0.24.4 Cflags: -I${includedir}/pixman-1 Libs: -L${libdir} -lpixman-1 pkg-config-0.29.1/check/gtk/gmodule-no-export-2.0.pc0000664000175000017500000000044212275467762016644 00000000000000prefix=/gtk exec_prefix=${prefix} libdir=${exec_prefix}/lib includedir=${prefix}/include gmodule_supported=true Name: GModule Description: Dynamic module loader for GLib Requires: glib-2.0 Version: 2.30.3 Libs: -L${libdir} -lgmodule-2.0 -pthread -lrt Libs.private: -ldl Cflags: -pthread pkg-config-0.29.1/check/gtk/x11.pc0000664000175000017500000000044112275467762013372 00000000000000prefix=/gtk exec_prefix=${prefix} libdir=${exec_prefix}/lib includedir=${prefix}/include xthreadlib=-lpthread Name: X11 Description: X Library Version: 1.4.3 Requires: xproto kbproto Requires.private: xcb >= 1.1.92 Cflags: -I${includedir} Libs: -L${libdir} -lX11 Libs.private: -lpthread pkg-config-0.29.1/check/gtk/gobject-2.0.pc0000664000175000017500000000042012275467762014670 00000000000000prefix=/gtk exec_prefix=${prefix} libdir=${exec_prefix}/lib includedir=${prefix}/include Name: GObject Description: GLib Type, Object, Parameter and Signal Library Requires: glib-2.0,gthread-2.0 Version: 2.30.3 Libs: -L${libdir} -lgobject-2.0 Libs.private: -lffi Cflags: pkg-config-0.29.1/check/gtk/gdk-3.0.pc0000664000175000017500000000041712275467762014027 00000000000000prefix=/gtk exec_prefix=${prefix} libdir=${exec_prefix}/lib includedir=${prefix}/include targets=x11 Name: GDK Description: GTK+ Drawing Kit Version: 3.2.4 Requires: pango pangocairo gdk-pixbuf-2.0 cairo-gobject Libs: -L${libdir} -lgdk-3 Cflags: -I${includedir}/gtk-3.0 pkg-config-0.29.1/check/gtk/libpng.pc0000664000175000017500000000034612275467762014240 00000000000000prefix=/gtk exec_prefix=${prefix} libdir=${exec_prefix}/lib includedir=${prefix}/include Name: libpng Description: Loads and saves PNG files Version: 1.2.49 Libs: -L${libdir} -lpng12 Libs.private: -lz -lm Cflags: -I${includedir} pkg-config-0.29.1/check/gtk/xcb.pc0000664000175000017500000000040612275467762013536 00000000000000prefix=/gtk exec_prefix=${prefix} libdir=${exec_prefix}/lib includedir=${prefix}/include xcbproto_version=1.6 Name: XCB Description: X-protocol C Binding Version: 1.7 Requires.private: xau >= 0.99.2 Libs: -L${libdir} -lxcb Libs.private: Cflags: -I${includedir} pkg-config-0.29.1/check/gtk/cairo.pc0000664000175000017500000000060412275467762014057 00000000000000prefix=/gtk exec_prefix=${prefix} libdir=${exec_prefix}/lib includedir=${prefix}/include Name: cairo Description: Multi-platform 2D graphics library Version: 1.10.2 Requires.private: gobject-2.0 glib-2.0 pixman-1 >= 0.18.4 fontconfig >= 2.2.95 freetype2 >= 9.7.3 libpng xrender >= 0.6 x11 Libs: -L${libdir} -lcairo Libs.private: -lz -lz Cflags: -I${includedir}/cairo pkg-config-0.29.1/check/gtk/xproto.pc0000664000175000017500000000031312275467762014312 00000000000000prefix=/gtk exec_prefix=${prefix} libdir=${exec_prefix}/lib includedir=${prefix}/include includex11dir=${includedir}/X11 Name: Xproto Description: Xproto headers Version: 7.0.22 Cflags: -I${includedir} pkg-config-0.29.1/check/gtk/freetype2.pc0000664000175000017500000000043712275467762014673 00000000000000prefix=/gtk exec_prefix=${prefix} libdir=${exec_prefix}/lib includedir=${prefix}/include Name: FreeType 2 Description: A free, high-quality, and portable font engine. Version: 13.1.7 Requires: Libs: -L${libdir} -lfreetype Libs.private: Cflags: -I${includedir}/freetype2 -I${includedir} pkg-config-0.29.1/check/gtk/pangoft2.pc0000664000175000017500000000045712275467762014510 00000000000000prefix=/gtk exec_prefix=${prefix} libdir=${exec_prefix}/lib includedir=${prefix}/include Name: Pango FT2 and Pango Fc Description: Freetype 2.0 and fontconfig font support for Pango Version: 1.29.4 Requires: pango freetype2 fontconfig Libs: -L${libdir} -lpangoft2-1.0 Cflags: -I${includedir}/pango-1.0 pkg-config-0.29.1/check/gtk/renderproto.pc0000664000175000017500000000027212275467762015326 00000000000000prefix=/gtk exec_prefix=${prefix} libdir=${exec_prefix}/lib includedir=${prefix}/include Name: RenderProto Description: Render extension headers Version: 0.11.1 Cflags: -I${includedir} pkg-config-0.29.1/check/gtk/kbproto.pc0000664000175000017500000000026112275467762014441 00000000000000prefix=/gtk exec_prefix=${prefix} libdir=${exec_prefix}/lib includedir=${prefix}/include Name: KBProto Description: KB extension headers Version: 1.0.5 Cflags: -I${includedir} pkg-config-0.29.1/check/gtk/pangocairo.pc0000664000175000017500000000040612275467762015104 00000000000000prefix=/gtk exec_prefix=${prefix} libdir=${exec_prefix}/lib includedir=${prefix}/include Name: Pango Cairo Description: Cairo rendering support for Pango Version: 1.29.4 Requires: pango cairo Libs: -L${libdir} -lpangocairo-1.0 Cflags: -I${includedir}/pango-1.0 pkg-config-0.29.1/check/gtk/pango.pc0000664000175000017500000000046412275467762014072 00000000000000prefix=/gtk exec_prefix=${prefix} libdir=${exec_prefix}/lib includedir=${prefix}/include pango_module_version=1.6.0 Name: Pango Description: Internationalized text handling Version: 1.29.4 Requires: glib-2.0,gobject-2.0,gmodule-no-export-2.0 Libs: -L${libdir} -lpango-1.0 Cflags: -I${includedir}/pango-1.0 pkg-config-0.29.1/check/gtk/xrender.pc0000664000175000017500000000040712275467762014432 00000000000000prefix=/gtk exec_prefix=${prefix} libdir=${exec_prefix}/lib includedir=${prefix}/include Name: Xrender Description: X Render Library Version: 0.9.6 Requires: xproto renderproto >= 0.9 x11 Requires.private: x11 Cflags: -I${includedir} Libs: -L${libdir} -lXrender pkg-config-0.29.1/check/gtk/atk.pc0000664000175000017500000000035012275467762013537 00000000000000prefix=/gtk exec_prefix=${prefix} libdir=${exec_prefix}/lib includedir=${prefix}/include Name: Atk Description: Accessibility Toolkit Version: 2.2.0 Requires: gobject-2.0 Libs: -L${libdir} -latk-1.0 Cflags: -I${includedir}/atk-1.0 pkg-config-0.29.1/check/gtk/xau.pc0000664000175000017500000000035012275467762013555 00000000000000prefix=/gtk exec_prefix=${prefix} libdir=${exec_prefix}/lib includedir=${prefix}/include Name: Xau Description: X authorization file management libary Version: 1.0.6 Requires: xproto Cflags: -I${includedir} Libs: -L${libdir} -lXau pkg-config-0.29.1/check/gtk/libpng12.pc0000664000175000017500000000034612275467762014403 00000000000000prefix=/gtk exec_prefix=${prefix} libdir=${exec_prefix}/lib includedir=${prefix}/include Name: libpng Description: Loads and saves PNG files Version: 1.2.49 Libs: -L${libdir} -lpng12 Libs.private: -lz -lm Cflags: -I${includedir} pkg-config-0.29.1/check/gtk/gtk+-3.0.pc0000664000175000017500000000056612275467762014127 00000000000000prefix=/gtk exec_prefix=${prefix} libdir=${exec_prefix}/lib includedir=${prefix}/include targets=x11 gtk_binary_version=3.0.0 gtk_host=x86_64-redhat-linux-gnu Name: GTK+ Description: GTK+ Graphical UI Library Version: 3.2.4 Requires: gdk-3.0 atk cairo cairo-gobject gdk-pixbuf-2.0 gio-2.0 pangoft2 Libs: -L${libdir} -lgtk-3 Cflags: -I${includedir}/gtk-3.0 -DGSEAL_ENABLE pkg-config-0.29.1/check/gtk/fontconfig.pc0000664000175000017500000000041512275467762015116 00000000000000prefix=/gtk exec_prefix=${prefix} libdir=${exec_prefix}/lib includedir=${prefix}/include Name: Fontconfig Description: Font configuration and customization library Version: 2.8.0 Libs: -L${libdir} -lfontconfig Libs.private: -lexpat -lfreetype Cflags: -I${includedir} pkg-config-0.29.1/check/private-dep.pc0000664000175000017500000000030212275467762014410 00000000000000Name: Requires test package Description: Dummy pkgconfig test package for testing Requires/Requires.private Version: 1.0.0 Libs: -L/private-dep/lib -lprivate-dep Cflags: -I/private-dep/include pkg-config-0.29.1/check/check-missing0000775000175000017500000000365612275467762014335 00000000000000#! /bin/sh set -e . ${srcdir}/common # non-existent package; call should fail and cause no output EXPECT_RETURN=1 RESULT="" run_test --exists pkg-non-existent # existing package, but with missing Requires EXPECT_RETURN=1 RESULT="" run_test --exists missing-requires # tests below are on an existing package, but with missing Requires.private; # when pkg-config outputs error, the actual error text isn't checked # package exists, but should fail since deps can't be resolved EXPECT_RETURN=1 RESULT="" run_test --exists missing-requires-private # get Libs EXPECT_RETURN=0 RESULT="-L/missing-requires-private/lib -lmissing-requires-private" if [ "$list_indirect_deps" = no ]; then run_test --libs missing-requires-private fi # Libs.private should fail (verbosely, but the output isn't verified) EXPECT_RETURN=1 RESULT="" if [ "$list_indirect_deps" = yes ]; then run_test --silence-errors --libs missing-requires-private fi run_test --silence-errors --static --libs missing-requires-private # Cflags.private should fail (verbosely, but the output isn't verified) EXPECT_RETURN=1 RESULT="" run_test --silence-errors --static --cflags missing-requires-private # Cflags should fail (verbosely, but the output isn't verified) EXPECT_RETURN=1 RESULT="" run_test --silence-errors --cflags missing-requires-private # get includedir var EXPECT_RETURN=0 RESULT="/usr/include/somedir" run_test --variable includedir missing-requires-private # tests below are on an existing package, but with missing Requires; # when pkg-config outputs error, the actual error text isn't checked # package exists EXPECT_RETURN=1 RESULT="" run_test missing-requires # Libs should fail EXPECT_RETURN=1 RESULT="" run_test --silence-errors --libs missing-requires # Cflags should fail EXPECT_RETURN=1 RESULT="" run_test --silence-errors --cflags missing-requires # get includedir var EXPECT_RETURN=0 RESULT="/usr/include/somedir" run_test --variable includedir missing-requires pkg-config-0.29.1/check/check-relocatable0000775000175000017500000000335012651243552015113 00000000000000#! /bin/sh set -e . ${srcdir}/common # Convert absolute directories to Windows format if necessary. if [ "$native_win32" = yes ]; then # Assume we have cmd to do the conversion, except we have to escape # the command switch on MSYS. [ "$OSTYPE" = msys ] && opt="\\/C" || opt="/C" abs_top_srcdir=$($WINE cmd $opt echo "$abs_top_srcdir" | tr -d '\r') abs_srcdir=$($WINE cmd $opt echo "$abs_srcdir" | tr -d '\r') fi # See if the pcfiledir variable is defined. First, with the path # built from the relative PKG_CONFIG_LIBDIR. Second, with the path # built from the full path to the pc file. RESULT=$srcdir run_test --variable=pcfiledir pcfiledir RESULT=$abs_srcdir run_test --variable=pcfiledir "$abs_srcdir/pcfiledir.pc" # Test if pcfiledir metadata variable is substituted correctly RESULT="-I${srcdir}/include -L${srcdir}/lib -lfoo" run_test --cflags --libs pcfiledir # Test prefix redefinition for .pc files in pkgconfig directory. Try .pc # files with both unexpanded and expanded variables. Use the absolute # directory for the search path so that pkg-config can strip enough # components of the file directory to be useful. PKG_CONFIG_LIBDIR="${abs_srcdir}/pkgconfig" for pkg in prefixdef prefixdef-expanded; do # Typical redefinition RESULT="-I${abs_top_srcdir}/include -L${abs_top_srcdir}/lib -lfoo" run_test --define-prefix --cflags --libs $pkg RESULT="-I/reloc/include -L/reloc/lib -lfoo" run_test --dont-define-prefix --cflags --libs $pkg # Non-standard redefinition RESULT="-I/reloc/include -L${abs_top_srcdir} -lfoo" run_test --define-prefix --prefix-variable=libdir --cflags --libs $pkg RESULT="-I/reloc/include -L/reloc/lib -lfoo" run_test --dont-define-prefix --cflags --libs $pkg done pkg-config-0.29.1/check/pcfiledir.pc0000664000175000017500000000040412651243552014117 00000000000000prefix=${pcfiledir} exec_prefix=${prefix} libdir=${exec_prefix}/lib includedir=${prefix}/include Name: pcfiledir relocation test Description: Test pkg-config pcfiledir metadata variable Version: 1.0.0 Requires: Libs: -L${libdir} -lfoo Cflags: -I${includedir} pkg-config-0.29.1/check/requires-version-3.pc0000664000175000017500000000026712275467762015664 00000000000000Name: Requires version test package 3 Description: Test version comparisons in Requires Version: 1.0.0 Requires: public-dep <= 1.0.0 simple < 999 Requires.private: private-dep != 4.0 pkg-config-0.29.1/check/sort-order-1-3.pc0000664000175000017500000000045212275467762014574 00000000000000prefix=/path1 exec_prefix=${prefix} libdir="${exec_prefix}/lib" includedir="${prefix}/include" Name: Sort order Cflags and Libs test 1-3 Description: Test package for testing flag sort order Version: 1.0.0 Libs: -L${libdir} -Wl,-O1 -lpath1 Cflags: -I${includedir} -DPATH1 Requires: sort-order-2-3 pkg-config-0.29.1/check/sort-order-1-1.pc0000664000175000017500000000042112275467762014566 00000000000000prefix=/path1 exec_prefix=${prefix} libdir="${exec_prefix}/lib" includedir="${prefix}/include" Name: Sort order Cflags and Libs test 1-1 Description: Test package for testing flag sort order Version: 1.0.0 Libs: -L${libdir} -Wl,-O1 -lpath1 Cflags: -I${includedir} -DPATH1 pkg-config-0.29.1/check/common0000664000175000017500000000127512441612376013055 00000000000000# -*- sh -*- # # This file is sourced by the different test scripts. It needs to be # valid POSIX sh. # pkgconfig=${PKG_CONFIG-../pkg-config} . ./config.sh unset PKG_CONFIG_PATH PKG_CONFIG_LIBDIR=$srcdir export PKG_CONFIG_LIBDIR export LC_ALL=C run_test () { set +e ${pkgconfig} "$@" >/dev/null 2>&1 R=$? if [ "$R" -ne "${EXPECT_RETURN:-0}" ]; then ${pkgconfig} --print-errors "$@" echo "${pkgconfig} $@ exited with $R (expected ${EXPECT_RETURN:-0})" 1>&2 exit 1 fi R=$(${pkgconfig} "$@" 2>&1 | sed -e 's,^[[:space:]]*,,' -e 's,[[:space:]]*$,,') if [ "$R" != "$RESULT" ]; then echo "${pkgconfig} $@ :" echo "'$R' != '$RESULT'" exit 1 fi return } pkg-config-0.29.1/check/check-cmd-options0000775000175000017500000000123312275467762015105 00000000000000#! /bin/sh set -e . ${srcdir}/common # non-existent option should fail EXPECT_RETURN=1 RESULT="Unknown option --blah" run_test --blah # all of these should fail, but when '=' or ' ' aren't used consistently # between the two options, broken popt sets the version to compare to be # "a=b" EXPECT_RETURN=1 RESULT="" run_test --define-variable=a=b --atleast-pkgconfig-version=999.999 EXPECT_RETURN=1 RESULT="" run_test --define-variable=a=b --atleast-pkgconfig-version 999.999 EXPECT_RETURN=1 RESULT="" run_test --define-variable a=b --atleast-pkgconfig-version 999.999 EXPECT_RETURN=1 RESULT="" run_test --define-variable a=b --atleast-pkgconfig-version=999.999 pkg-config-0.29.1/check/check-sort-order0000775000175000017500000002163612651243552014745 00000000000000#! /bin/sh # These tests check that the order of the flags in .pc files are correct # after resolving the package list. There are two things that are # critical in the current algorithm: the ordering of packages on the # command line, the ordering of packages based on Requires and the place # in the pkg-config path the .pc file was found, with packages earlier # in the path getting higher priority. There is one other factor that # makes the output currently work correctly that's only implicitly # tested here: stripping of all duplicates from the output string. # # There are 3 sets of packages here: # # 1. A typical setup where highest level package is earliest in the path # and has a straight dependency chain. 3-1 -> 2-1 -> 1-1 with 3-1 in the # first part of the user supplied path, 2-1 in the second part, and 1-1 # found from the system path. # # 2. A similar setup to 1 except that now both 3-2 and 2-2 depend on # 1-2. This has a subtle effect on the algorithm when combined with the # order of the command line arguments. It only currently works because # duplicates get strip out in (hopefully) the correct order, so 1-2's # flags come out in the appropriate spot even though it was in the # package list twice. # # 3. Reverse the order of requirements so that the system level package # (1-3) depends on something in the user's path (2-3), which depends on # something earlier in the user's path (3-3). This is pretty unusual # since the user is typically overriding something higher in the stack # rather than lower, but it does illustrate the path ordering vs. # dependency ordering. set -e . ${srcdir}/common [ "$native_win32" = yes ] && sep=';' || sep=':' order1="${srcdir}/sort/sort${sep}${srcdir}/sort" order2="${srcdir}/sort${sep}${srcdir}/sort/sort" export PKG_CONFIG_PATH PKG_CONFIG_PATH="$order1" # Check package set -1 RESULT="-DPATH3 -DPATH2 -DPATH1 -I/path3/include -I/path2/include \ -I/path1/include" run_test --cflags sort-order-3-1 run_test --cflags sort-order-3-1 sort-order-2-1 run_test --cflags sort-order-2-1 sort-order-3-1 run_test --cflags sort-order-3-1 sort-order-2-1 sort-order-1-1 run_test --cflags sort-order-3-1 sort-order-1-1 sort-order-2-1 run_test --cflags sort-order-2-1 sort-order-3-1 sort-order-1-1 run_test --cflags sort-order-2-1 sort-order-1-1 sort-order-3-1 run_test --cflags sort-order-1-1 sort-order-3-1 sort-order-2-1 run_test --cflags sort-order-1-1 sort-order-2-1 sort-order-3-1 RESULT="-L/path3/lib -L/path2/lib -L/path1/lib -Wl,-O3 -lpath3 -Wl,-O2 \ -lpath2 -Wl,-O1 -lpath1" run_test --libs sort-order-3-1 run_test --libs sort-order-3-1 sort-order-2-1 run_test --libs sort-order-2-1 sort-order-3-1 run_test --libs sort-order-3-1 sort-order-2-1 sort-order-1-1 run_test --libs sort-order-3-1 sort-order-1-1 sort-order-2-1 run_test --libs sort-order-2-1 sort-order-3-1 sort-order-1-1 run_test --libs sort-order-2-1 sort-order-1-1 sort-order-3-1 run_test --libs sort-order-1-1 sort-order-3-1 sort-order-2-1 run_test --libs sort-order-1-1 sort-order-2-1 sort-order-3-1 # Check package set -2 RESULT="-DPATH3 -DPATH2 -DPATH1 -I/path3/include -I/path2/include \ -I/path1/include" run_test --cflags sort-order-3-2 run_test --cflags sort-order-3-2 sort-order-2-2 run_test --cflags sort-order-2-2 sort-order-3-2 run_test --cflags sort-order-3-2 sort-order-2-2 sort-order-1-2 run_test --cflags sort-order-3-2 sort-order-1-2 sort-order-2-2 run_test --cflags sort-order-2-2 sort-order-3-2 sort-order-1-2 run_test --cflags sort-order-2-2 sort-order-1-2 sort-order-3-2 run_test --cflags sort-order-1-2 sort-order-3-2 sort-order-2-2 run_test --cflags sort-order-1-2 sort-order-2-2 sort-order-3-2 RESULT="-L/path3/lib -L/path2/lib -L/path1/lib -Wl,-O3 -lpath3 -Wl,-O2 \ -lpath2 -Wl,-O1 -lpath1" run_test --libs sort-order-3-2 run_test --libs sort-order-3-2 sort-order-2-2 run_test --libs sort-order-2-2 sort-order-3-2 run_test --libs sort-order-3-2 sort-order-2-2 sort-order-1-2 run_test --libs sort-order-3-2 sort-order-1-2 sort-order-2-2 run_test --libs sort-order-2-2 sort-order-3-2 sort-order-1-2 run_test --libs sort-order-2-2 sort-order-1-2 sort-order-3-2 run_test --libs sort-order-1-2 sort-order-3-2 sort-order-2-2 run_test --libs sort-order-1-2 sort-order-2-2 sort-order-3-2 # Check package set -3 RESULT="-DPATH1 -DPATH2 -DPATH3 -I/path3/include -I/path2/include \ -I/path1/include" run_test --cflags sort-order-1-3 run_test --cflags sort-order-1-3 sort-order-2-3 run_test --cflags sort-order-2-3 sort-order-1-3 run_test --cflags sort-order-3-3 sort-order-2-3 sort-order-1-3 run_test --cflags sort-order-3-3 sort-order-1-3 sort-order-2-3 run_test --cflags sort-order-2-3 sort-order-3-3 sort-order-1-3 run_test --cflags sort-order-2-3 sort-order-1-3 sort-order-3-3 run_test --cflags sort-order-1-3 sort-order-3-3 sort-order-2-3 run_test --cflags sort-order-1-3 sort-order-2-3 sort-order-3-3 RESULT="-L/path3/lib -L/path2/lib -L/path1/lib -Wl,-O1 -lpath1 -Wl,-O2 \ -lpath2 -Wl,-O3 -lpath3" run_test --libs sort-order-1-3 run_test --libs sort-order-1-3 sort-order-2-3 run_test --libs sort-order-2-3 sort-order-1-3 run_test --libs sort-order-3-3 sort-order-2-3 sort-order-1-3 run_test --libs sort-order-3-3 sort-order-1-3 sort-order-2-3 run_test --libs sort-order-2-3 sort-order-3-3 sort-order-1-3 run_test --libs sort-order-2-3 sort-order-1-3 sort-order-3-3 run_test --libs sort-order-1-3 sort-order-3-3 sort-order-2-3 run_test --libs sort-order-1-3 sort-order-2-3 sort-order-3-3 # Switch pkg-config path order PKG_CONFIG_PATH="$order2" # Check package set -1 RESULT="-DPATH3 -DPATH2 -DPATH1 -I/path2/include -I/path3/include \ -I/path1/include" run_test --cflags sort-order-3-1 run_test --cflags sort-order-3-1 sort-order-2-1 run_test --cflags sort-order-2-1 sort-order-3-1 run_test --cflags sort-order-3-1 sort-order-2-1 sort-order-1-1 run_test --cflags sort-order-3-1 sort-order-1-1 sort-order-2-1 run_test --cflags sort-order-2-1 sort-order-3-1 sort-order-1-1 run_test --cflags sort-order-2-1 sort-order-1-1 sort-order-3-1 run_test --cflags sort-order-1-1 sort-order-3-1 sort-order-2-1 run_test --cflags sort-order-1-1 sort-order-2-1 sort-order-3-1 RESULT="-L/path2/lib -L/path3/lib -L/path1/lib -Wl,-O3 -lpath3 -Wl,-O2 \ -lpath2 -Wl,-O1 -lpath1" run_test --libs sort-order-3-1 run_test --libs sort-order-3-1 sort-order-2-1 run_test --libs sort-order-2-1 sort-order-3-1 run_test --libs sort-order-3-1 sort-order-2-1 sort-order-1-1 run_test --libs sort-order-3-1 sort-order-1-1 sort-order-2-1 run_test --libs sort-order-2-1 sort-order-3-1 sort-order-1-1 run_test --libs sort-order-2-1 sort-order-1-1 sort-order-3-1 run_test --libs sort-order-1-1 sort-order-3-1 sort-order-2-1 run_test --libs sort-order-1-1 sort-order-2-1 sort-order-3-1 # Check package set -2 RESULT="-DPATH3 -DPATH2 -DPATH1 -I/path2/include -I/path3/include \ -I/path1/include" run_test --cflags sort-order-3-2 run_test --cflags sort-order-3-2 sort-order-2-2 run_test --cflags sort-order-2-2 sort-order-3-2 run_test --cflags sort-order-3-2 sort-order-2-2 sort-order-1-2 run_test --cflags sort-order-3-2 sort-order-1-2 sort-order-2-2 run_test --cflags sort-order-2-2 sort-order-3-2 sort-order-1-2 run_test --cflags sort-order-2-2 sort-order-1-2 sort-order-3-2 run_test --cflags sort-order-1-2 sort-order-3-2 sort-order-2-2 run_test --cflags sort-order-1-2 sort-order-2-2 sort-order-3-2 RESULT="-L/path2/lib -L/path3/lib -L/path1/lib -Wl,-O3 -lpath3 -Wl,-O2 \ -lpath2 -Wl,-O1 -lpath1" run_test --libs sort-order-3-2 run_test --libs sort-order-3-2 sort-order-2-2 run_test --libs sort-order-2-2 sort-order-3-2 run_test --libs sort-order-3-2 sort-order-2-2 sort-order-1-2 run_test --libs sort-order-3-2 sort-order-1-2 sort-order-2-2 run_test --libs sort-order-2-2 sort-order-3-2 sort-order-1-2 run_test --libs sort-order-2-2 sort-order-1-2 sort-order-3-2 run_test --libs sort-order-1-2 sort-order-3-2 sort-order-2-2 run_test --libs sort-order-1-2 sort-order-2-2 sort-order-3-2 # Check package set -3 RESULT="-DPATH1 -DPATH2 -DPATH3 -I/path2/include -I/path3/include \ -I/path1/include" run_test --cflags sort-order-1-3 run_test --cflags sort-order-1-3 sort-order-2-3 run_test --cflags sort-order-2-3 sort-order-1-3 run_test --cflags sort-order-3-3 sort-order-2-3 sort-order-1-3 run_test --cflags sort-order-3-3 sort-order-1-3 sort-order-2-3 run_test --cflags sort-order-2-3 sort-order-3-3 sort-order-1-3 run_test --cflags sort-order-2-3 sort-order-1-3 sort-order-3-3 run_test --cflags sort-order-1-3 sort-order-3-3 sort-order-2-3 run_test --cflags sort-order-1-3 sort-order-2-3 sort-order-3-3 RESULT="-L/path2/lib -L/path3/lib -L/path1/lib -Wl,-O1 -lpath1 -Wl,-O2 \ -lpath2 -Wl,-O3 -lpath3" run_test --libs sort-order-1-3 run_test --libs sort-order-1-3 sort-order-2-3 run_test --libs sort-order-2-3 sort-order-1-3 run_test --libs sort-order-3-3 sort-order-2-3 sort-order-1-3 run_test --libs sort-order-3-3 sort-order-1-3 sort-order-2-3 run_test --libs sort-order-2-3 sort-order-3-3 sort-order-1-3 run_test --libs sort-order-2-3 sort-order-1-3 sort-order-3-3 run_test --libs sort-order-1-3 sort-order-3-3 sort-order-2-3 run_test --libs sort-order-1-3 sort-order-2-3 sort-order-3-3 pkg-config-0.29.1/check/conflicts-test.pc0000664000175000017500000000022412275467762015134 00000000000000Name: Conflicts test package Description: Dummy pkgconfig test package for testing Conflicts Version: 1.0.0 Requires: public-dep Conflicts: simple pkg-config-0.29.1/check/check-cflags0000775000175000017500000000113112275467762014105 00000000000000#! /bin/sh set -e . ${srcdir}/common RESULT="" run_test --cflags simple RESULT="" run_test --cflags fields-blank RESULT="-DOTHER -I/other/include" run_test --cflags other RESULT="-I/other/include" run_test --cflags-only-I other RESULT="-DOTHER" run_test --cflags-only-other other # Try various mixed combinations RESULT="-DOTHER -I/other/include" run_test --cflags-only-I --cflags-only-other other run_test --cflags-only-other --cflags-only-I other run_test --cflags --cflags-only-I --cflags-only-other other run_test --cflags --cflags-only-I other run_test --cflags --cflags-only-other other pkg-config-0.29.1/check/sort-order-1-2.pc0000664000175000017500000000042112275467762014567 00000000000000prefix=/path1 exec_prefix=${prefix} libdir="${exec_prefix}/lib" includedir="${prefix}/include" Name: Sort order Cflags and Libs test 1-2 Description: Test package for testing flag sort order Version: 1.0.0 Libs: -L${libdir} -Wl,-O1 -lpath1 Cflags: -I${includedir} -DPATH1 pkg-config-0.29.1/check/check-mixed-flags0000775000175000017500000000556012275467762015060 00000000000000#! /bin/sh set -e . ${srcdir}/common RESULT="-DOTHER -I/other/include -L/other/lib -Wl,--as-needed -lother" run_test --cflags --libs other run_test --libs --cflags other run_test --cflags-only-I --cflags-only-other --libs-only-l --libs-only-L \ --libs-only-other other RESULT="-I/other/include -lother" run_test --cflags-only-I --libs-only-l other run_test --libs-only-l --cflags-only-I other RESULT="-DOTHER -lother" run_test --cflags-only-other --libs-only-l other run_test --libs-only-l --cflags-only-other other RESULT="-I/other/include -L/other/lib" run_test --cflags-only-I --libs-only-L other run_test --libs-only-L --cflags-only-I other RESULT="-DOTHER -L/other/lib" run_test --cflags-only-other --libs-only-L other run_test --libs-only-L --cflags-only-other other RESULT="-I/other/include -Wl,--as-needed" run_test --cflags-only-I --libs-only-other other run_test --libs-only-other --cflags-only-I other RESULT="-DOTHER -Wl,--as-needed" run_test --cflags-only-other --libs-only-other other run_test --libs-only-other --cflags-only-other other RESULT="-I/other/include -L/other/lib -lother" run_test --cflags-only-I --libs-only-L --libs-only-l other run_test --libs-only-l --libs-only-L --cflags-only-I other RESULT="-DOTHER -L/other/lib -lother" run_test --cflags-only-other --libs-only-L --libs-only-l other run_test --libs-only-l --libs-only-L --cflags-only-other other RESULT="-I/other/include -Wl,--as-needed -lother" run_test --cflags-only-I --libs-only-other --libs-only-l other run_test --libs-only-l --libs-only-other --cflags-only-I other RESULT="-DOTHER -Wl,--as-needed -lother" run_test --cflags-only-other --libs-only-other --libs-only-l other run_test --libs-only-l --libs-only-other --cflags-only-other other RESULT="-I/other/include -L/other/lib -Wl,--as-needed" run_test --cflags-only-I --libs-only-other --libs-only-L other run_test --libs-only-L --libs-only-other --cflags-only-I other RESULT="-DOTHER -L/other/lib -Wl,--as-needed" run_test --cflags-only-other --libs-only-other --libs-only-L other run_test --libs-only-L --libs-only-other --cflags-only-other other RESULT="-DOTHER -I/other/include -lother" run_test --cflags --libs-only-l other run_test --cflags-only-I --cflags-only-other --libs-only-l other RESULT="-DOTHER -I/other/include -L/other/lib" run_test --cflags --libs-only-L other run_test --cflags-only-I --cflags-only-other --libs-only-L other RESULT="-DOTHER -I/other/include -Wl,--as-needed" run_test --cflags --libs-only-other other run_test --cflags-only-I --cflags-only-other --libs-only-other other RESULT="-I/other/include -L/other/lib -Wl,--as-needed -lother" run_test --cflags-only-I --libs other run_test --cflags-only-I --libs-only-l --libs-only-L --libs-only-other other RESULT="-DOTHER -L/other/lib -Wl,--as-needed -lother" run_test --cflags-only-other --libs other run_test --cflags-only-other --libs-only-l --libs-only-L --libs-only-other other pkg-config-0.29.1/check/check-conflicts0000775000175000017500000000016012275467762014633 00000000000000#! /bin/sh set -e . ${srcdir}/common RESULT="-L/public-dep/lib -lpublic-dep" run_test --libs conflicts-test pkg-config-0.29.1/check/flag-dup-2.pc0000664000175000017500000000056212275467762014036 00000000000000prefix=/path exec_prefix=${prefix} libdir="${exec_prefix}/lib" includedir="${prefix}/include" Name: Flag duplicate test 2 Description: Test package for checking stripping of duplicate flags Version: 1.0.0 Libs: -L${libdir} -lpath2 -Wl,--whole-archive -lm --Wl,--no-whole-archive -Xlinker -R -Xlinker ${libdir} Cflags: -I${includedir} -DPATH2 -DFOO Requires: flag-dup-1 pkg-config-0.29.1/check/inst.pc0000664000175000017500000000037712275467762013161 00000000000000prefix=/inst exec_prefix=${prefix} libdir=${exec_prefix}/lib includedir=${prefix}/include Name: Installed test package Description: Test package for checking -uninstalled behavior Version: 1.0.0 Requires: Libs: -L${libdir} -linst Cflags: -I${includedir} pkg-config-0.29.1/check/special-flags.pc0000664000175000017500000000056012664101311014661 00000000000000prefix=/usr exec_prefix=${prefix} libdir=${exec_prefix}/lib includedir=${prefix}/include Name: Special flags test Description: Dummy pkgconfig test package for testing pkgconfig Version: 1.0.0 Requires: Libs: -framework Foo -lsimple -framework Bar -Wl,-framework -Wl,Baz Cflags: -I/foo -isystem /system1 -idirafter /after1 -I/bar -idirafter /after2 -isystem /system2 pkg-config-0.29.1/check/check-includedir0000775000175000017500000000014512275467762014774 00000000000000#! /bin/sh set -e . ${srcdir}/common RESULT="-I/usr/include/somedir" run_test --cflags includedir pkg-config-0.29.1/check/whitespace.pc0000664000175000017500000000056112275467762014333 00000000000000prefix=/usr exec_prefix=${prefix} libdir="${exec_prefix}/white space/lib" includedir="${prefix}/white space/include" Name: Whitespace test Description: Dummy pkgconfig test package for testing pkgconfig Version: 1.0.0 Requires: Libs: -L${libdir} -lfoo\ bar "-lbar baz" -r:foo Cflags: -I${includedir} -I$(top_builddir) -Iinclude\ dir "-Iother include dir" -Dlala=misc pkg-config-0.29.1/check/check-libs-private0000775000175000017500000000013612275467762015253 00000000000000#! /bin/sh set -e . ${srcdir}/common RESULT="-lsimple -lm" run_test --static --libs simple pkg-config-0.29.1/check/non-l.pc0000664000175000017500000000026312275467762013221 00000000000000Name: Non-l flags test package Description: Test package for checking order of non-L Libs & Cflags Version: 1.0.0 Requires: non-l-required Libs: /non-l.a Cflags: -I/non-l/include pkg-config-0.29.1/check/check-debug0000775000175000017500000000147112651243552013726 00000000000000#! /bin/sh set -e . ${srcdir}/common # Check that debug output works with minimal output. This is still much # more than desirable. RESULT="PKG_CONFIG_DEBUG_SPEW variable enabling debug spew Adding directory '$srcdir' from PKG_CONFIG_PATH Global variable definition 'pc_sysrootdir' = '/' Global variable definition 'pc_top_builddir' = '\$(top_builddir)' Error printing enabled by default due to use of output options besides --exists, --atleast/exact/max-version or --list-all. Value of --silence-errors: 0 Error printing enabled $PACKAGE_VERSION" PKG_CONFIG_DEBUG_SPEW=1 run_test --version RESULT="Error printing enabled by default due to use of output options besides --exists, --atleast/exact/max-version or --list-all. Value of --silence-errors: 0 Error printing enabled $PACKAGE_VERSION" run_test --debug --version pkg-config-0.29.1/check/sort/0000775000175000017500000000000012665370350012705 500000000000000pkg-config-0.29.1/check/sort/sort-order-2-1.pc0000664000175000017500000000045212275467762015562 00000000000000prefix=/path2 exec_prefix=${prefix} libdir="${exec_prefix}/lib" includedir="${prefix}/include" Name: Sort order Cflags and Libs test 2-1 Description: Test package for testing flag sort order Version: 1.0.0 Libs: -L${libdir} -Wl,-O2 -lpath2 Cflags: -I${includedir} -DPATH2 Requires: sort-order-1-1 pkg-config-0.29.1/check/sort/sort-order-2-2.pc0000664000175000017500000000045212275467762015563 00000000000000prefix=/path2 exec_prefix=${prefix} libdir="${exec_prefix}/lib" includedir="${prefix}/include" Name: Sort order Cflags and Libs test 2-2 Description: Test package for testing flag sort order Version: 1.0.0 Libs: -L${libdir} -Wl,-O2 -lpath2 Cflags: -I${includedir} -DPATH2 Requires: sort-order-1-2 pkg-config-0.29.1/check/sort/sort/0000775000175000017500000000000012665370350013674 500000000000000pkg-config-0.29.1/check/sort/sort/sort-order-3-2.pc0000664000175000017500000000047112275467762016554 00000000000000prefix=/path3 exec_prefix=${prefix} libdir="${exec_prefix}/lib" includedir="${prefix}/include" Name: Sort order Cflags and Libs test 3-2 Description: Test package for testing flag sort order Version: 1.0.0 Libs: -L${libdir} -Wl,-O3 -lpath3 Cflags: -I${includedir} -DPATH3 Requires: sort-order-2-2 sort-order-1-2 pkg-config-0.29.1/check/sort/sort/sort-order-3-3.pc0000664000175000017500000000042112275467762016550 00000000000000prefix=/path3 exec_prefix=${prefix} libdir="${exec_prefix}/lib" includedir="${prefix}/include" Name: Sort order Cflags and Libs test 3-3 Description: Test package for testing flag sort order Version: 1.0.0 Libs: -L${libdir} -Wl,-O3 -lpath3 Cflags: -I${includedir} -DPATH3 pkg-config-0.29.1/check/sort/sort/sort-order-3-1.pc0000664000175000017500000000045212275467762016552 00000000000000prefix=/path3 exec_prefix=${prefix} libdir="${exec_prefix}/lib" includedir="${prefix}/include" Name: Sort order Cflags and Libs test 3-1 Description: Test package for testing flag sort order Version: 1.0.0 Libs: -L${libdir} -Wl,-O3 -lpath3 Cflags: -I${includedir} -DPATH3 Requires: sort-order-2-1 pkg-config-0.29.1/check/sort/sort-order-2-3.pc0000664000175000017500000000045212275467762015564 00000000000000prefix=/path2 exec_prefix=${prefix} libdir="${exec_prefix}/lib" includedir="${prefix}/include" Name: Sort order Cflags and Libs test 2-3 Description: Test package for testing flag sort order Version: 1.0.0 Libs: -L${libdir} -Wl,-O2 -lpath2 Cflags: -I${includedir} -DPATH2 Requires: sort-order-3-3 pkg-config-0.29.1/check/requires-test.pc0000664000175000017500000000040512275467762015010 00000000000000Name: Requires test package Description: Dummy pkgconfig test package for testing Requires/Requires.private Version: 1.0.0 Requires: public-dep >= 1 Requires.private: private-dep >= 1 Libs: -L/requires-test/lib -lrequires-test Cflags: -I/requires-test/include pkg-config-0.29.1/check/check-path0000775000175000017500000000223412651243552013572 00000000000000#! /bin/sh set -e . ${srcdir}/common # PKG_CONFIG_PATH RESULT="" PKG_CONFIG_PATH="$srcdir/sub" run_test --exists sub1 # default pkg-config path, making sure to resolve the variables fully eval pc_path="$pc_path" if [ "$native_win32" = yes ]; then # This is pretty hacky. On native win32 (MSYS/MINGW), pkg-config # builds the default path from the installation directory. It # then adds lib/pkgconfig and share/pkgconfig to it. Normally, # the autoconf build directory would be used, but that path is in # Unix format. if [ "$OSTYPE" = msys ]; then # MSYS has "pwd -W" to get the current directory in Windows format pcdir=$(cd $top_builddir/.libs && pwd -W) else # Assume we have cmd somewhere to get variable %cd%. Make sure # to strip carriage returns. pcdir=$(cd $top_builddir/.libs && $WINE cmd /C echo %cd% | sed -r 's/\r//g') fi win_path="$pcdir/lib/pkgconfig;$pcdir/share/pkgconfig" # Convert from forward slashes to Windows backslashes RESULT=$(echo $win_path | sed 's,/,\\,g') else RESULT=$pc_path fi unset PKG_CONFIG_LIBDIR run_test --variable=pc_path pkg-config pkg-config-0.29.1/check/check-circular-requires0000775000175000017500000000014412275467762016312 00000000000000#! /bin/sh set -e . ${srcdir}/common RESULT="-lcirc1 -lcirc2 -lcirc3" run_test --libs circular-1 pkg-config-0.29.1/check/public-dep.pc0000664000175000017500000000032012275467762014214 00000000000000Name: Requires test package Description: Dummy pkgconfig test package for testing Requires/Requires.private Version: 1.0.0 Requires.private: Libs: -L/public-dep/lib -lpublic-dep Cflags: -I/public-dep/include pkg-config-0.29.1/check/other.pc0000664000175000017500000000044012275467762013314 00000000000000prefix=/other exec_prefix=${prefix} libdir="${exec_prefix}/lib" includedir="${prefix}/include" Name: Other Cflags and Libs test Description: Test package for testing variants of --cflags and --libs Version: 1.0.0 Libs: -L${libdir} -Wl,--as-needed -lother Cflags: -I${includedir} -DOTHER pkg-config-0.29.1/check/missing-requires-private.pc0000664000175000017500000000061412275467762017154 00000000000000prefix=/usr exec_prefix=${prefix} libdir=${exec_prefix}/lib includedir=${prefix}/include/somedir Name: Missing Requires.private test package Description: Dummy package for testing with a missing Requires.private Version: 1.0.0 Requires.private: pkg-non-existent-private-dep Libs: -L/missing-requires-private/lib -lmissing-requires-private Cflags: -I/missing-requires-private/include foodir: bar pkg-config-0.29.1/check/requires-version-2.pc0000664000175000017500000000026212275467762015656 00000000000000Name: Requires version test package 2 Description: Test version comparisons in Requires Version: 1.0.0 Requires: public-dep >= 1 simple > 0 Requires.private: private-dep = 1.0.0 pkg-config-0.29.1/check/Makefile.am0000664000175000017500000000401212664101724013663 00000000000000TESTS_ENVIRONMENT = PKG_CONFIG='$(TESTS_PKG_CONFIG)' $(TESTS_SHELL) TESTS = \ check-cflags \ check-libs \ check-mixed-flags \ check-non-l-flags \ check-define-variable \ check-libs-private \ check-requires-private \ check-circular-requires \ check-includedir \ check-conflicts \ check-missing \ check-special-flags \ check-sort-order \ check-duplicate-flags \ check-whitespace \ check-cmd-options \ check-version \ check-requires-version \ check-print-options \ check-path \ check-sysroot \ check-uninstalled \ check-debug \ check-gtk \ check-tilde \ check-relocatable \ check-variable-override \ check-variables \ $(NULL) EXTRA_DIST = \ $(TESTS) \ common \ simple.pc \ requires-test.pc \ public-dep.pc \ private-dep.pc \ includedir.pc \ missing-requires-private.pc \ missing-requires.pc \ special-flags.pc \ conflicts-test.pc \ whitespace.pc \ fields-blank.pc \ sub/sub1.pc \ sub/sub2.pc \ sub/broken.pc \ inst.pc \ inst-uninstalled.pc \ other.pc \ requires-version-1.pc \ requires-version-2.pc \ requires-version-3.pc \ non-l.pc \ non-l-required.pc \ circular-1.pc \ circular-2.pc \ circular-3.pc \ no-variables.pc \ sort-order-1-1.pc \ sort/sort-order-2-1.pc \ sort/sort/sort-order-3-1.pc \ sort-order-1-2.pc \ sort/sort-order-2-2.pc \ sort/sort/sort-order-3-2.pc \ sort-order-1-3.pc \ sort/sort-order-2-3.pc \ sort/sort/sort-order-3-3.pc \ flag-dup-1.pc \ flag-dup-2.pc \ gtk/atk.pc \ gtk/cairo-gobject.pc \ gtk/cairo.pc \ gtk/fontconfig.pc \ gtk/freetype2.pc \ gtk/gdk-3.0.pc \ gtk/gdk-pixbuf-2.0.pc \ gtk/gio-2.0.pc \ gtk/glib-2.0.pc \ gtk/gmodule-no-export-2.0.pc \ gtk/gobject-2.0.pc \ gtk/gthread-2.0.pc \ gtk/gtk+-3.0.pc \ gtk/kbproto.pc \ gtk/libpng12.pc \ gtk/libpng.pc \ gtk/pangocairo.pc \ gtk/pangoft2.pc \ gtk/pango.pc \ gtk/pixman-1.pc \ gtk/renderproto.pc \ gtk/x11.pc \ gtk/xau.pc \ gtk/xcb.pc \ gtk/xproto.pc \ gtk/xrender.pc \ tilde.pc \ pkgconfig/prefixdef.pc \ pkgconfig/prefixdef-expanded.pc \ pcfiledir.pc \ variables.pc \ $(NULL) pkg-config-0.29.1/check/includedir.pc0000664000175000017500000000040612275467762014317 00000000000000prefix=/usr exec_prefix=${prefix} libdir=${exec_prefix}/lib includedir=${prefix}/include/somedir Name: Simple test Description: Dummy pkgconfig test package for testing pkgconfig Version: 1.0.0 Requires: Libs: -lsimple Libs.private: -lm Cflags: -I${includedir} pkg-config-0.29.1/check/non-l-required.pc0000664000175000017500000000027612275467762015043 00000000000000Name: Non-l flags required test package Description: Test package for checking order of non-L Libs & Cflags Version: 1.0.0 Libs: /non-l-required.a -pthread Cflags: -I/non-l-required/include pkg-config-0.29.1/check/config.sh.in0000664000175000017500000000106112651243552014040 00000000000000# # Settings from the configure script # abs_srcdir=@abs_srcdir@ top_srcdir=@top_srcdir@ abs_top_srcdir=@abs_top_srcdir@ abs_builddir=@abs_builddir@ top_builddir=@top_builddir@ abs_top_builddir=@abs_top_builddir@ prefix=@prefix@ exec_prefix=@exec_prefix@ includedir=@includedir@ libdir=@libdir@ datarootdir=@datarootdir@ datadir=@datadir@ pc_path="@pc_path@" system_include_path="@system_include_path@" system_library_path="@system_library_path@" list_indirect_deps=@use_indirect_deps@ PACKAGE_VERSION=@PACKAGE_VERSION@ native_win32=@native_win32@ WINE=@WINE@ pkg-config-0.29.1/check/check-gtk0000775000175000017500000000543112275467762013442 00000000000000#! /bin/sh set -e . ${srcdir}/common # Limit pkg-config files to gtk subdir PKG_CONFIG_LIBDIR=${srcdir}/gtk # Fetch Cflags of gtk+-3.0. Prior results to check for regressions. # pkg-config-0.21 - pkg-config-0.27.1 # -DGSEAL_ENABLE -pthread -I/gtk/include/gtk-3.0 -I/gtk/include/atk-1.0 \ # -I/gtk/include/cairo -I/gtk/include/gdk-pixbuf-2.0 -I/gtk/include/pango-1.0 \ # -I/gtk/include/glib-2.0 -I/gtk/lib/glib-2.0/include -I/gtk/include/pixman-1 \ # -I/gtk/include -I/gtk/include/freetype2 RESULT="-DGSEAL_ENABLE -pthread -I/gtk/include/gtk-3.0 \ -I/gtk/include/pango-1.0 -I/gtk/include/atk-1.0 -I/gtk/include/cairo \ -I/gtk/include/pixman-1 -I/gtk/include -I/gtk/include/gdk-pixbuf-2.0 \ -I/gtk/include -I/gtk/include/pango-1.0 -I/gtk/include/glib-2.0 \ -I/gtk/lib/glib-2.0/include -I/gtk/include/freetype2 -I/gtk/include" run_test --cflags gtk+-3.0 run_test --cflags --static gtk+-3.0 # Fetch Libs of gtk+-3.0. Prior results to check for regressions. # pkg-config-0.21 - pkg-config-0.27.1 # -pthread -L/gtk/lib -lgtk-3 -lgdk-3 -latk-1.0 -lgio-2.0 -lpangoft2-1.0 \ # -lpangocairo-1.0 -lgdk_pixbuf-2.0 -lcairo-gobject -lcairo -lpango-1.0 \ # -lfreetype -lfontconfig -lgobject-2.0 -lgmodule-2.0 -lgthread-2.0 -lrt \ # -lglib-2.0 RESULT="-L/gtk/lib -lgtk-3 -lgdk-3 -lpangocairo-1.0 -latk-1.0 -lcairo-gobject \ -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lpangoft2-1.0 -lpango-1.0 -lgobject-2.0 \ -lgthread-2.0 -pthread -lrt -lgmodule-2.0 -pthread -lrt -lglib-2.0 -lfreetype \ -lfontconfig" if [ "$list_indirect_deps" = no ]; then run_test --libs gtk+-3.0 fi # Fetch static Libs of gtk+-3.0. Prior results to check for regressions. # pkg-config-0.21 # -pthread -L/gtk/lib -lgtk-3 -lgdk-3 -latk-1.0 -lgio-2.0 -lresolv \ # -lpangoft2-1.0 -lpangocairo-1.0 -lgdk_pixbuf-2.0 -lcairo-gobject -lcairo \ # -lpixman-1 -lXrender -lX11 -lpthread -lpng12 -lz -lm -lpango-1.0 \ # -lfontconfig -lexpat -lfreetype -lgobject-2.0 -lffi -lgmodule-2.0 -ldl \ # -lgthread-2.0 -lglib-2.0 -lrt # pkg-config-0.22 - pkg-config-0.27.1 # -pthread -L/gtk/lib -lgtk-3 -lgdk-3 -latk-1.0 -lgio-2.0 -lresolv \ # -lpangoft2-1.0 -lpangocairo-1.0 -lgdk_pixbuf-2.0 -lcairo-gobject -lcairo \ # -lpixman-1 -lXrender -lX11 -lpthread -lxcb -lXau -lpng12 -lz -lm \ # -lpango-1.0 -lfontconfig -lexpat -lfreetype -lgobject-2.0 -lffi \ # -lgmodule-2.0 -ldl -lgthread-2.0 -lglib-2.0 -lrt RESULT="-L/gtk/lib -lgtk-3 -lgdk-3 -lpangocairo-1.0 -latk-1.0 -lcairo-gobject \ -lcairo -lz -lpixman-1 -lpng12 -lz -lm -lXrender -lX11 -lpthread -lxcb -lXau \ -lgdk_pixbuf-2.0 -lm -lpng12 -lz -lm -lgio-2.0 -lz -lresolv -lpangoft2-1.0 \ -lpango-1.0 -lgobject-2.0 -lffi -lgthread-2.0 -pthread -lrt -lgmodule-2.0 \ -pthread -lrt -ldl -lglib-2.0 -lrt -lfreetype -lfontconfig -lexpat -lfreetype" if [ "$list_indirect_deps" = yes ]; then run_test --libs gtk+-3.0 fi run_test --libs --static gtk+-3.0 pkg-config-0.29.1/check/check-version0000775000175000017500000000431212275467762014337 00000000000000#! /bin/sh set -e . ${srcdir}/common # --atleast-pkgconfig-version RESULT="" run_test --atleast-pkgconfig-version=$PACKAGE_VERSION EXPECT_RETURN=1 RESULT="" run_test --atleast-pkgconfig-version=999 v1=0.9.9 v2=1.0.0 v3=1.0.1 # exact version testing EXPECT_RETURN=1 RESULT="Requested 'simple = $v1' but version of Simple test is $v2" run_test --print-errors simple = $v1 EXPECT_RETURN=1 RESULT="Requested 'simple = $v1' but version of Simple test is $v2" run_test --print-errors --exact-version=$v1 simple EXPECT_RETURN=0 RESULT="" run_test --print-errors simple = $v2 EXPECT_RETURN=0 RESULT="" run_test --print-errors --exact-version=$v2 simple EXPECT_RETURN=1 RESULT="Requested 'simple = $v3' but version of Simple test is $v2" run_test --print-errors simple = $v3 EXPECT_RETURN=1 RESULT="Requested 'simple = $v3' but version of Simple test is $v2" run_test --print-errors --exact-version=$v3 simple # atleast version testing EXPECT_RETURN=0 RESULT="" run_test --print-errors simple \>= $v1 EXPECT_RETURN=0 RESULT="" run_test --print-errors --atleast-version=$v1 simple EXPECT_RETURN=0 RESULT="" run_test --print-errors simple \>= $v2 EXPECT_RETURN=0 RESULT="" run_test --print-errors --atleast-version=$v2 simple EXPECT_RETURN=1 RESULT="Requested 'simple >= $v3' but version of Simple test is $v2" run_test --print-errors simple \>= $v3 EXPECT_RETURN=1 RESULT="Requested 'simple >= $v3' but version of Simple test is $v2" run_test --print-errors --atleast-version=$v3 simple # max version testing EXPECT_RETURN=1 RESULT="Requested 'simple <= $v1' but version of Simple test is $v2" run_test --print-errors simple \<= $v1 EXPECT_RETURN=1 RESULT="Requested 'simple <= $v1' but version of Simple test is $v2" run_test --print-errors --max-version=$v1 simple EXPECT_RETURN=0 RESULT="" run_test --print-errors simple \<= $v2 EXPECT_RETURN=0 RESULT="" run_test --print-errors --max-version=$v2 simple EXPECT_RETURN=0 RESULT="" run_test --print-errors simple \<= $v3 EXPECT_RETURN=0 RESULT="" run_test --print-errors --max-version=$v3 simple # mixing version compare testing is not allowed EXPECT_RETURN=0 RESULT='Ignoring incompatible output option "--exact-version"' run_test --atleast-version=1.0.0 --exact-version=1.0.0 simple pkg-config-0.29.1/check/check-define-variable0000775000175000017500000000117212275467762015670 00000000000000#! /bin/sh set -e . ${srcdir}/common RESULT="-I/includedir/" case ${MACHTYPE} in *-msys) # Make sure path doesn't get mangled on MSYS run_test --define-variable=includedir=\\/includedir/ --cflags simple ;; *) run_test --define-variable=includedir=/includedir/ --cflags simple ;; esac # Spaces before/after the variable name and value should be stripped RESULT="bar" run_test --define-variable=' foo = bar ' --variable=foo simple # Should fail when no value set EXPECT_RETURN=1 RESULT="--define-variable argument does not have a value for the variable" run_test --define-variable=foo= --variable=foo simple pkg-config-0.29.1/check/check-sysroot0000775000175000017500000000127212651243552014361 00000000000000#! /bin/sh set -e . ${srcdir}/common export PKG_CONFIG_SYSROOT_DIR=/sysroot # MSYS mangles / paths to its own root in windows format. This probably # means sysroot doesn't work there, but match what pkg-config passes # back anyway. [ "$OSTYPE" = msys ] && root=$(cd / && pwd -W) || root= RESULT="" run_test --cflags simple RESULT="-lsimple" if [ "$list_indirect_deps" = no ]; then run_test --libs simple fi RESULT="-lsimple -lm" if [ "$list_indirect_deps" = yes ]; then run_test --libs simple fi run_test --libs --static simple RESULT="-I$root/sysroot/public-dep/include" run_test --cflags public-dep RESULT="-L$root/sysroot/public-dep/lib -lpublic-dep" run_test --libs public-dep pkg-config-0.29.1/check/check-requires-private0000775000175000017500000000136212275467762016163 00000000000000#! /bin/sh set -e . ${srcdir}/common # expect cflags from requires-test and public-dep RESULT="-I/requires-test/include -I/private-dep/include -I/public-dep/include" run_test --cflags requires-test run_test --static --cflags requires-test # expect libs for just requires-test and public-dep RESULT="-L/requires-test/lib -L/public-dep/lib -lrequires-test -lpublic-dep" if [ "$list_indirect_deps" = no ]; then run_test --libs requires-test fi # expect libs for requires-test, public-dep and private-dep in static case RESULT="-L/requires-test/lib -L/private-dep/lib -L/public-dep/lib \ -lrequires-test -lprivate-dep -lpublic-dep" if [ "$list_indirect_deps" = yes ]; then run_test --libs requires-test fi run_test --static --libs requires-test pkg-config-0.29.1/check/check-duplicate-flags0000775000175000017500000000070112275467762015714 00000000000000#! /bin/sh set -e . ${srcdir}/common RESULT="-DPATH2 -DFOO -DPATH1 -DFOO -I/path/include" run_test --cflags flag-dup-1 flag-dup-2 run_test --cflags flag-dup-2 flag-dup-1 RESULT="-L/path/lib -lpath2 -Wl,--whole-archive -lm --Wl,--no-whole-archive \ -Xlinker -R -Xlinker /path/lib -lpath1 -Wl,--whole-archive -lm \ --Wl,--no-whole-archive -Xlinker -R -Xlinker /path/lib" run_test --libs flag-dup-1 flag-dup-2 run_test --libs flag-dup-2 flag-dup-1 pkg-config-0.29.1/check/circular-1.pc0000664000175000017500000000040212275467762014133 00000000000000prefix=/usr exec_prefix=${prefix} libdir=${exec_prefix}/lib includedir=${prefix}/include/circ1 Name: Circular Requires test 1 Description: Dummy package for testing circular Requires Version: 1.0.0 Requires: circular-2 Libs: -lcirc1 Cflags: -I${includedir} pkg-config-0.29.1/check/check-non-l-flags0000775000175000017500000000046412275467762014773 00000000000000#! /bin/sh set -e . ${srcdir}/common RESULT="-I/non-l/include -I/non-l-required/include" run_test --cflags non-l-required non-l run_test --cflags --static non-l-required non-l RESULT="/non-l.a /non-l-required.a -pthread" run_test --libs non-l-required non-l run_test --libs --static non-l-required non-l pkg-config-0.29.1/check/no-variables.pc0000664000175000017500000000015112275467762014554 00000000000000Name: No Variables Description: Test package having no variables to check --print-variables Version: 4.2 pkg-config-0.29.1/check/missing-requires.pc0000664000175000017500000000054312275467762015505 00000000000000prefix=/usr exec_prefix=${prefix} libdir=${exec_prefix}/lib includedir=${prefix}/include/somedir Name: Missing Requires test package Description: Dummy pkgconfig test package for testing with a missing Requires Version: 1.0.0 Requires: pkg-non-existent-dep Libs: -L/missing-requires/lib -lmissing-requires Cflags: -I/missing-requires/include foodir: bar pkg-config-0.29.1/check/check-print-options0000775000175000017500000000314612651243552015466 00000000000000#! /bin/sh set -e . ${srcdir}/common # --version RESULT=$PACKAGE_VERSION run_test --version # --modversion RESULT=1.0.0 run_test --modversion simple # --print-variables, make sure having no variables doesn't crash RESULT="pcfiledir" run_test --print-variables no-variables RESULT="exec_prefix includedir libdir pcfiledir prefix" run_test --print-variables simple # --print-provides RESULT="simple = 1.0.0" run_test --print-provides simple # --print-requires RESULT="public-dep >= 1" run_test --print-requires requires-test # --print-requires-private RESULT="private-dep >= 1" run_test --print-requires-private requires-test # --list-all, limit to a subdirectory RESULT="sub1 Subdirectory package 1 - Test package 1 for subdirectory sub2 Subdirectory package 2 - Test package 2 for subdirectory broken Broken package - Module with broken .pc file" PKG_CONFIG_LIBDIR="$srcdir/sub" run_test --list-all # Check handling when multiple incompatible options are set RESULT="Ignoring incompatible output option \"--modversion\" $PACKAGE_VERSION" run_test --version --modversion simple RESULT="Ignoring incompatible output option \"--version\" 1.0.0" run_test --modversion --version simple # --print-requires/--print-requires-private allowed together RESULT="public-dep >= 1 private-dep >= 1" run_test --print-requires --print-requires-private requires-test run_test --print-requires-private --print-requires requires-test # --exists and --atleast/exact/max-version can be mixed RESULT="" run_test --exists --atleast-version=1.0.0 simple run_test --exists --exact-version=1.0.0 simple run_test --exists --max-version=1.0.0 simple pkg-config-0.29.1/check/variables.pc0000664000175000017500000000040012664101724014120 00000000000000prefix=/local exec_prefix=${prefix} libdir=${exec_prefix}/lib includedir="${prefix}/include" cppflags=-I${includedir}/foo \ -DFOO=\"/bar\" Name: Complex variables Description: Test complex variable output Version: 1.0 Cflags: -I${includedir} ${cppflags} pkg-config-0.29.1/check/inst-uninstalled.pc0000664000175000017500000000041612275467762015473 00000000000000prefix=${pc_top_builddir} exec_prefix=${prefix} libdir=${exec_prefix}/lib includedir=${prefix}/include Name: Uninstalled test package Description: Test package for checking -uninstalled behavior Version: 2.0.0 Requires: Libs: -L${libdir} -linst Cflags: -I${includedir} pkg-config-0.29.1/check/check-special-flags0000775000175000017500000000041712664101311015337 00000000000000#! /bin/sh set -e . ${srcdir}/common RESULT="-isystem /system1 -idirafter /after1 -idirafter /after2 -isystem /system2 -I/foo -I/bar" run_test --cflags special-flags RESULT="-framework Foo -lsimple -framework Bar -Wl,-framework -Wl,Baz" run_test --libs special-flags pkg-config-0.29.1/check/pkgconfig/0000775000175000017500000000000012665370350013665 500000000000000pkg-config-0.29.1/check/pkgconfig/prefixdef-expanded.pc0000664000175000017500000000042212651243552017667 00000000000000prefix=/reloc exec_prefix=/reloc libdir=/reloc/lib includedir=/reloc/include Name: Prefix redefinition with expanded variables test Description: Test magic prefix redefinition when variables expanded Version: 1.0.0 Requires: Libs: -L${libdir} -lfoo Cflags: -I${includedir} pkg-config-0.29.1/check/pkgconfig/prefixdef.pc0000664000175000017500000000037312651243552016106 00000000000000prefix=/reloc exec_prefix=${prefix} libdir=${exec_prefix}/lib includedir=${prefix}/include Name: Prefix redefinition test Description: Test pkg-config magic prefix redefinition Version: 1.0.0 Requires: Libs: -L${libdir} -lfoo Cflags: -I${includedir} pkg-config-0.29.1/check/check-requires-version0000775000175000017500000000043112275467762016172 00000000000000#! /bin/sh set -e . ${srcdir}/common # Test != comparison fails RESULT="" EXPECT_RETURN=1 run_test --exists requires-version-1 # Test >=, > and = succeed RESULT="" run_test --exists requires-version-2 # Test <=, < and != succeed RESULT="" run_test --exists requires-version-3 pkg-config-0.29.1/check/circular-2.pc0000664000175000017500000000040212275467762014134 00000000000000prefix=/usr exec_prefix=${prefix} libdir=${exec_prefix}/lib includedir=${prefix}/include/circ2 Name: Circular Requires test 2 Description: Dummy package for testing circular Requires Version: 1.0.0 Requires: circular-3 Libs: -lcirc2 Cflags: -I${includedir} pkg-config-0.29.1/check/flag-dup-1.pc0000664000175000017500000000053512275467762014035 00000000000000prefix=/path exec_prefix=${prefix} libdir="${exec_prefix}/lib" includedir="${prefix}/include" Name: Flag duplicate test 1 Description: Test package for checking stripping of duplicate flags Version: 1.0.0 Libs: -L${libdir} -lpath1 -Wl,--whole-archive -lm --Wl,--no-whole-archive -Xlinker -R -Xlinker ${libdir} Cflags: -I${includedir} -DPATH1 -DFOO pkg-config-0.29.1/check/requires-version-1.pc0000664000175000017500000000020512275467762015652 00000000000000Name: Requires version test package 1 Description: Test version comparisons in Requires Version: 1.0.0 Requires: public-dep != 1.0.0 pkg-config-0.29.1/check/check-variable-override0000775000175000017500000000154012664101311016225 00000000000000#! /bin/sh set -e . ${srcdir}/common # Check the normal behavior RESULT="/usr" run_test --variable=prefix simple RESULT="/usr/lib" run_test --variable=libdir simple # Override prefix with correct environment variable export PKG_CONFIG_SIMPLE_PREFIX="/foo" RESULT="/foo" run_test --variable=prefix simple RESULT="/foo/lib" run_test --variable=libdir simple RESULT="-I/foo/include" run_test --cflags simple unset PKG_CONFIG_SIMPLE_PREFIX # Override prefix with incorrect environment variable case. On Windows # this will have no effect as environment variables are case # insensitive. if [ "$native_win32" != yes ]; then export PKG_CONFIG_SIMPLE_prefix="/foo" RESULT="/usr" run_test --variable=prefix simple RESULT="/usr/lib" run_test --variable=libdir simple RESULT="" run_test --cflags simple unset PKG_CONFIG_SIMPLE_prefix fi pkg-config-0.29.1/check/check-uninstalled0000775000175000017500000000154612275467762015202 00000000000000#! /bin/sh set -e . ${srcdir}/common # Check to see if we find the uninstalled version RESULT='' run_test --uninstalled inst RESULT='' run_test --exists inst \>= 2.0 RESULT='-I$(top_builddir)/include' run_test --cflags inst RESULT='-L$(top_builddir)/lib -linst' run_test --libs inst # Alter PKG_CONFIG_TOP_BUILD_DIR export PKG_CONFIG_TOP_BUILD_DIR='$(abs_top_builddir)' RESULT='-I$(abs_top_builddir)/include' run_test --cflags inst RESULT='-L$(abs_top_builddir)/lib -linst' run_test --libs inst unset PKG_CONFIG_TOP_BUILD_DIR # Check to see if we get the original back export PKG_CONFIG_DISABLE_UNINSTALLED=1 RESULT='' EXPECT_RETURN=1 run_test --uninstalled inst RESULT='' EXPECT_RETURN=1 run_test --exists inst \>= 2.0 RESULT='-I/inst/include' run_test --cflags inst RESULT='-L/inst/lib -linst' run_test --libs inst unset PKG_CONFIG_DISABLE_UNINSTALLED pkg-config-0.29.1/check/check-tilde0000775000175000017500000000027112651243552013736 00000000000000#! /bin/sh set -e . ${srcdir}/common # expect unescaped tilde from cflags RESULT='-I~' run_test --cflags tilde # expect unescaped tilde from libs RESULT='-L~' run_test --libs tilde pkg-config-0.29.1/check/Makefile.in0000664000175000017500000004273312665370325013716 00000000000000# Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ TESTS = check-cflags check-libs check-mixed-flags check-non-l-flags \ check-define-variable check-libs-private \ check-requires-private check-circular-requires \ check-includedir check-conflicts check-missing \ check-special-flags check-sort-order check-duplicate-flags \ check-whitespace check-cmd-options check-version \ check-requires-version check-print-options check-path \ check-sysroot check-uninstalled check-debug check-gtk \ check-tilde check-relocatable check-variable-override \ check-variables subdir = check ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/pkg.m4.in \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = config.sh CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/config.sh.in DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN = @LN@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TESTS_PKG_CONFIG = @TESTS_PKG_CONFIG@ TESTS_SHELL = @TESTS_SHELL@ VERSION = @VERSION@ WARN_CFLAGS = @WARN_CFLAGS@ WINE = @WINE@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ native_win32 = @native_win32@ oldincludedir = @oldincludedir@ pc_path = @pc_path@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ system_include_path = @system_include_path@ system_library_path = @system_library_path@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ use_indirect_deps = @use_indirect_deps@ TESTS_ENVIRONMENT = PKG_CONFIG='$(TESTS_PKG_CONFIG)' $(TESTS_SHELL) EXTRA_DIST = \ $(TESTS) \ common \ simple.pc \ requires-test.pc \ public-dep.pc \ private-dep.pc \ includedir.pc \ missing-requires-private.pc \ missing-requires.pc \ special-flags.pc \ conflicts-test.pc \ whitespace.pc \ fields-blank.pc \ sub/sub1.pc \ sub/sub2.pc \ sub/broken.pc \ inst.pc \ inst-uninstalled.pc \ other.pc \ requires-version-1.pc \ requires-version-2.pc \ requires-version-3.pc \ non-l.pc \ non-l-required.pc \ circular-1.pc \ circular-2.pc \ circular-3.pc \ no-variables.pc \ sort-order-1-1.pc \ sort/sort-order-2-1.pc \ sort/sort/sort-order-3-1.pc \ sort-order-1-2.pc \ sort/sort-order-2-2.pc \ sort/sort/sort-order-3-2.pc \ sort-order-1-3.pc \ sort/sort-order-2-3.pc \ sort/sort/sort-order-3-3.pc \ flag-dup-1.pc \ flag-dup-2.pc \ gtk/atk.pc \ gtk/cairo-gobject.pc \ gtk/cairo.pc \ gtk/fontconfig.pc \ gtk/freetype2.pc \ gtk/gdk-3.0.pc \ gtk/gdk-pixbuf-2.0.pc \ gtk/gio-2.0.pc \ gtk/glib-2.0.pc \ gtk/gmodule-no-export-2.0.pc \ gtk/gobject-2.0.pc \ gtk/gthread-2.0.pc \ gtk/gtk+-3.0.pc \ gtk/kbproto.pc \ gtk/libpng12.pc \ gtk/libpng.pc \ gtk/pangocairo.pc \ gtk/pangoft2.pc \ gtk/pango.pc \ gtk/pixman-1.pc \ gtk/renderproto.pc \ gtk/x11.pc \ gtk/xau.pc \ gtk/xcb.pc \ gtk/xproto.pc \ gtk/xrender.pc \ tilde.pc \ pkgconfig/prefixdef.pc \ pkgconfig/prefixdef-expanded.pc \ pcfiledir.pc \ variables.pc \ $(NULL) all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu check/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu check/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): config.sh: $(top_builddir)/config.status $(srcdir)/config.sh.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags TAGS: ctags CTAGS: cscope cscopelist: check-TESTS: $(TESTS) @failed=0; all=0; xfail=0; xpass=0; skip=0; \ srcdir=$(srcdir); export srcdir; \ list=' $(TESTS) '; \ $(am__tty_colors); \ if test -n "$$list"; then \ for tst in $$list; do \ if test -f ./$$tst; then dir=./; \ elif test -f $$tst; then dir=; \ else dir="$(srcdir)/"; fi; \ if $(TESTS_ENVIRONMENT) $${dir}$$tst $(AM_TESTS_FD_REDIRECT); then \ all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$tst[\ \ ]*) \ xpass=`expr $$xpass + 1`; \ failed=`expr $$failed + 1`; \ col=$$red; res=XPASS; \ ;; \ *) \ col=$$grn; res=PASS; \ ;; \ esac; \ elif test $$? -ne 77; then \ all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$tst[\ \ ]*) \ xfail=`expr $$xfail + 1`; \ col=$$lgn; res=XFAIL; \ ;; \ *) \ failed=`expr $$failed + 1`; \ col=$$red; res=FAIL; \ ;; \ esac; \ else \ skip=`expr $$skip + 1`; \ col=$$blu; res=SKIP; \ fi; \ echo "$${col}$$res$${std}: $$tst"; \ done; \ if test "$$all" -eq 1; then \ tests="test"; \ All=""; \ else \ tests="tests"; \ All="All "; \ fi; \ if test "$$failed" -eq 0; then \ if test "$$xfail" -eq 0; then \ banner="$$All$$all $$tests passed"; \ else \ if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \ banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \ fi; \ else \ if test "$$xpass" -eq 0; then \ banner="$$failed of $$all $$tests failed"; \ else \ if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \ banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \ fi; \ fi; \ dashes="$$banner"; \ skipped=""; \ if test "$$skip" -ne 0; then \ if test "$$skip" -eq 1; then \ skipped="($$skip test was not run)"; \ else \ skipped="($$skip tests were not run)"; \ fi; \ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ dashes="$$skipped"; \ fi; \ report=""; \ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ report="Please report to $(PACKAGE_BUGREPORT)"; \ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ dashes="$$report"; \ fi; \ dashes=`echo "$$dashes" | sed s/./=/g`; \ if test "$$failed" -eq 0; then \ col="$$grn"; \ else \ col="$$red"; \ fi; \ echo "$${col}$$dashes$${std}"; \ echo "$${col}$$banner$${std}"; \ test -z "$$skipped" || echo "$${col}$$skipped$${std}"; \ test -z "$$report" || echo "$${col}$$report$${std}"; \ echo "$${col}$$dashes$${std}"; \ test "$$failed" -eq 0; \ else :; fi distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: check-am install-am install-strip .PHONY: all all-am check check-TESTS check-am clean clean-generic \ clean-libtool cscopelist-am ctags-am distclean \ distclean-generic distclean-libtool distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags-am uninstall \ uninstall-am .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: pkg-config-0.29.1/check/tilde.pc0000664000175000017500000000011612275467762013274 00000000000000Name: tilde Description: tilde test module Version: 1.0 Libs: -L~ Cflags: -I~ pkg-config-0.29.1/check/fields-blank.pc0000664000175000017500000000032512275467762014530 00000000000000prefix=/usr exec_prefix=${prefix} libdir=${exec_prefix}/lib includedir=${prefix}/include Name: Simple test Description: Dummy pkgconfig test package for testing pkgconfig Version: 1.0.0 Requires: Libs: Cflags: pkg-config-0.29.1/config.sub0000755000175000017500000010624612601774033012547 00000000000000#! /bin/sh # Configuration validation subroutine script. # Copyright 1992-2015 Free Software Foundation, Inc. timestamp='2015-01-01' # This file 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 3 of the License, 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, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # Please send patches to . # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright 1992-2015 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." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ knetbsd*-gnu* | netbsd*-gnu* | \ kopensolaris*-gnu* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; android-linux) os=-linux-android basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray | -microblaze*) os= basic_machine=$1 ;; -bluegene*) os=-cnk ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco6) os=-sco5v6 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5v6*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*178) os=-lynxos178 ;; -lynx*5) os=-lynxos5 ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | aarch64 | aarch64_be \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arceb \ | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ | avr | avr32 \ | be32 | be64 \ | bfin \ | c4x | c8051 | clipper \ | d10v | d30v | dlx | dsp16xx \ | epiphany \ | fido | fr30 | frv | ft32 \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | hexagon \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | k1om \ | le32 | le64 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64octeon | mips64octeonel \ | mips64orion | mips64orionel \ | mips64r5900 | mips64r5900el \ | mips64vr | mips64vrel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa32r6 | mipsisa32r6el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64r6 | mipsisa64r6el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipsr5900 | mipsr5900el \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ | nds32 | nds32le | nds32be \ | nios | nios2 | nios2eb | nios2el \ | ns16k | ns32k \ | open8 | or1k | or1knd | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle \ | pyramid \ | riscv32 | riscv64 \ | rl78 | rx \ | score \ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu \ | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ | ubicom32 \ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ | visium \ | we32k \ | x86 | xc16x | xstormy16 | xtensa \ | z8k | z80) basic_machine=$basic_machine-unknown ;; c54x) basic_machine=tic54x-unknown ;; c55x) basic_machine=tic55x-unknown ;; c6x) basic_machine=tic6x-unknown ;; leon|leon[3-9]) basic_machine=sparc-$basic_machine ;; m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip) basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; ms1) basic_machine=mt-unknown ;; strongarm | thumb | xscale) basic_machine=arm-unknown ;; xgate) basic_machine=$basic_machine-unknown os=-none ;; xscaleeb) basic_machine=armeb-unknown ;; xscaleel) basic_machine=armel-unknown ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | aarch64-* | aarch64_be-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | be32-* | be64-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* \ | c8051-* | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | hexagon-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | k1om-* \ | le32-* | le64-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ | microblaze-* | microblazeel-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64octeon-* | mips64octeonel-* \ | mips64orion-* | mips64orionel-* \ | mips64r5900-* | mips64r5900el-* \ | mips64vr-* | mips64vrel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa32r6-* | mipsisa32r6el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64r6-* | mipsisa64r6el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipsr5900-* | mipsr5900el-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nds32-* | nds32le-* | nds32be-* \ | nios-* | nios2-* | nios2eb-* | nios2el-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | open8-* \ | or1k*-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ | pyramid-* \ | rl78-* | romp-* | rs6000-* | rx-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \ | tahoe-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tile*-* \ | tron-* \ | ubicom32-* \ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ | vax-* \ | visium-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* \ | xstormy16-* | xtensa*-* \ | ymp-* \ | z8k-* | z80-*) ;; # Recognize the basic CPU types without company name, with glob match. xtensa*) basic_machine=$basic_machine-unknown ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aros) basic_machine=i386-pc os=-aros ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; blackfin) basic_machine=bfin-unknown os=-linux ;; blackfin-*) basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; bluegene*) basic_machine=powerpc-ibm os=-cnk ;; c54x-*) basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c55x-*) basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c6x-*) basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c90) basic_machine=c90-cray os=-unicos ;; cegcc) basic_machine=arm-unknown os=-cegcc ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16 | cr16-*) basic_machine=cr16-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; dicos) basic_machine=i686-pc os=-dicos ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; leon-*|leon[3-9]-*) basic_machine=sparc-`echo $basic_machine | sed 's/-.*//'` ;; m68knommu) basic_machine=m68k-unknown os=-linux ;; m68knommu-*) basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; microblaze*) basic_machine=microblaze-xilinx ;; mingw64) basic_machine=x86_64-pc os=-mingw64 ;; mingw32) basic_machine=i686-pc os=-mingw32 ;; mingw32ce) basic_machine=arm-unknown os=-mingw32ce ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; moxiebox) basic_machine=moxie-unknown os=-moxiebox ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; msys) basic_machine=i686-pc os=-msys ;; mvs) basic_machine=i370-ibm os=-mvs ;; nacl) basic_machine=le32-unknown os=-nacl ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; neo-tandem) basic_machine=neo-tandem ;; nse-tandem) basic_machine=nse-tandem ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; parisc) basic_machine=hppa-unknown os=-linux ;; parisc-*) basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc | ppcbe) basic_machine=powerpc-unknown ;; ppc-* | ppcbe-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-* | ppc64p7-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rdos | rdos64) basic_machine=x86_64-pc os=-rdos ;; rdos32) basic_machine=i386-pc os=-rdos ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sde) basic_machine=mipsisa32-sde os=-elf ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh5el) basic_machine=sh5le-unknown ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; strongarm-* | thumb-*) basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tile*) basic_machine=$basic_machine-unknown os=-linux-gnu ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; xscale-* | xscalee[bl]-*) basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; z80-*-coff) basic_machine=z80-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -auroraux) os=-auroraux ;; -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ | -sym* | -kopensolaris* | -plan9* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* | -aros* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ | -bitrig* | -openbsd* | -solidbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* | -cegcc* \ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ | -linux-newlib* | -linux-musl* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* | -tirtos*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -zvmoe) os=-zvmoe ;; -dicos*) os=-dicos ;; -nacl*) ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in score-*) os=-elf ;; spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; c8051-*) os=-elf ;; hexagon-*) os=-elf ;; tic54x-*) os=-coff ;; tic55x-*) os=-coff ;; tic6x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 ;; m68*-cisco) os=-aout ;; mep-*) os=-elf ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-haiku) os=-haiku ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -cnk*|-aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: pkg-config-0.29.1/AUTHORS0000664000175000017500000000054712275467762011652 00000000000000Original authors ---------------- James Henstridge original pkg-config Tim Janik the PKG_CHECK_VERSION macro Havoc Pennington rewrite in C Scott James Remnant m4 cleanups and maintainer for a while Maintainer ---------- Tollef Fog Heen pkg-config-0.29.1/Makefile.sources0000664000175000017500000000014512651243607013702 00000000000000pkg_config_SOURCES = \ pkg.h \ pkg.c \ parse.h \ parse.c \ rpmvercmp.c \ rpmvercmp.h \ main.c pkg-config-0.29.1/configure.ac0000664000175000017500000002061112665367716013063 00000000000000AC_PREREQ([2.62]) AC_INIT([pkg-config], [0.29.1], [https://bugs.freedesktop.org/enter_bug.cgi?product=pkg-config], [pkg-config]) AC_CONFIG_HEADERS([config.h]) AC_CONFIG_SRCDIR([main.c]) dnl Initialize automake. Sadly, we have to kludge around the automake dnl test driver here. We need to use the serial driver (for now), but dnl the parallel driver is the default in 1.13. So, we want to specify dnl the serial driver. Unfortunately, the option to specify that driver dnl didn't exist until 1.12. m4_define([automake_version], [m4_esyscmd([${AUTOMAKE-automake} --version | awk '/^automake/{print $NF}'])]) m4_define([automake_serial_tests], [m4_if(m4_version_compare(automake_version, [1.12]), [-1], [], [serial-tests])]) AM_INIT_AUTOMAKE([1.11 ]automake_serial_tests) dnl Initialize libtool LT_PREREQ([2.2]) LT_INIT dnl Support silent build rules, requires at least automake-1.11. Disable dnl by either passing --disable-silent-rules to configure or passing V=1 dnl to make m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) dnl Enable large file support AC_SYS_LARGEFILE dnl Check for programs AC_PROG_CC AC_CHECK_PROG([LN], [ln], [ln], [cp -Rp]) dnl Check for headers AC_CHECK_HEADERS([dirent.h unistd.h sys/wait.h malloc.h]) dnl A POSIX shell is required for the tests. If TEST_SHELL hasn't been dnl set on the command line then we try to find bash or ksh or sh from dnl the path. If none of those are available, we just use whatever dnl autoconf detected for configure. AC_ARG_VAR([TESTS_SHELL], [Path to a POSIX shell to be used for testing]) conf_path="$PATH:`getconf PATH 2>/dev/null`" AC_PATH_PROGS([TESTS_SHELL], [bash ksh sh], [$CONFIG_SHELL], [$conf_path]) dnl The built pkg-config to use for testing. This allows it to be set dnl from the make command line if necessary. AC_SUBST([TESTS_PKG_CONFIG], ['${top_builddir}/pkg-config${EXEEXT}']) dnl dnl Default pkg-config search path dnl AC_MSG_CHECKING([for default search path for .pc files]) AC_ARG_WITH([pc_path], [AS_HELP_STRING([--with-pc-path], [default search path for .pc files])], [pc_path="$withval"], [ # This is slightly wrong, but hopefully causes less confusion than # people being unable to find their .pc files in the standard location. if test "${prefix}" = "NONE"; then pc_path='${libdir}/pkgconfig:${datadir}/pkgconfig:/usr/lib/pkgconfig:/usr/share/pkgconfig' else pc_path='${libdir}/pkgconfig:${datadir}/pkgconfig' fi ]) AC_MSG_RESULT([$pc_path]) AC_SUBST([pc_path]) dnl dnl System default -I paths dnl AC_MSG_CHECKING([for system include path to avoid -I flags]) AC_ARG_WITH([system_include_path], [AS_HELP_STRING([--with-system-include-path], [avoid -I flags from the given path])], [system_include_path="$withval"], [system_include_path="/usr/include"]) AC_MSG_RESULT([$system_include_path]) AC_SUBST([system_include_path]) dnl dnl System default -L paths dnl AC_MSG_CHECKING([for system library path to avoid -L flags]) AC_ARG_WITH([system_library_path], [AS_HELP_STRING([--with-system-library-path], [avoid -L flags from the given path])], [system_library_path="$withval"], [ pc_lib_sfx=`echo "$libdir" | sed 's:.*/lib::'` case "$pc_lib_sfx" in */*|"") system_library_path="/usr/lib:/lib" ;; *) system_library_path="/usr/lib$pc_lib_sfx:/lib$pc_lib_sfx:/usr/lib:/lib" ;; esac ]) AC_MSG_RESULT([$system_library_path]) AC_SUBST([system_library_path]) dnl Code taken from gtk+-2.0's configure.in. dnl dnl This causes pkg-config to not list private dependencies (a very dnl common example is libm) on platforms which support inter-library dnl dependencies. dnl dnl When using libtool 2.x, we need to force libtool to be created dnl early so we can use it here. m4_ifdef([LT_OUTPUT], [LT_OUTPUT]) AC_ARG_ENABLE([indirect-deps], [AS_HELP_STRING([--enable-indirect-deps], [list both direct and indirect dependencies.]) AS_HELP_STRING([--disable-indirect-deps], [only list direct dependencies.]) [default=auto]], [use_indirect_deps=$enableval], [use_indirect_deps=auto]) echo use_indirect_deps=$use_indirect_deps >&AS_MESSAGE_LOG_FD AC_MSG_CHECKING([whether to list both direct and indirect dependencies]) case $use_indirect_deps in auto) deplibs_check_method=`(./libtool --config; echo eval echo '\"$deplibs_check_method\"') | sh` if test "X$deplibs_check_method" = Xnone; then echo "foo: $deplibs_check_method" >&AS_MESSAGE_LOG_FD use_indirect_deps=yes else use_indirect_deps=no fi ;; yes|no) ;; *) AC_MSG_ERROR([Value given to --enable-indirect-deps must be one of yes, no or auto]) ;; esac AC_MSG_RESULT($use_indirect_deps) AC_DEFINE_UNQUOTED([ENABLE_INDIRECT_DEPS], [`test $use_indirect_deps = yes && echo TRUE || echo FALSE`], [Link library to all dependent libraries, not only directly needed ones]) AC_SUBST([use_indirect_deps]) dnl dnl Choose default CFLAGS and warnings depending on compiler. dnl WARN_CFLAGS="" if test "${GCC}" = "yes" && test "${ac_env_CFLAGS_set}" != "set"; then WARN_CFLAGS="-g -Wall -O2" fi AC_SUBST(WARN_CFLAGS) AC_MSG_CHECKING([for Win32]) case "$host" in *-*-mingw*) native_win32=yes ;; *) native_win32=no ;; esac AC_MSG_RESULT([$native_win32]) AC_SUBST([native_win32]) AM_CONDITIONAL(NATIVE_WIN32, [test "x$native_win32" = xyes]) dnl When cross compiling to Windows, Wine might be available to help dnl for testing. if test "$cross_compiling" = yes && test "$native_win32" = yes; then AC_CHECK_PROG([WINE], [wine], [wine]) test "x$WINE" != x && TESTS_PKG_CONFIG='${WINE} '"$TESTS_PKG_CONFIG" fi dnl On Windows, the prefix variable in .pc files can be redfined at dnl runtime. Allow the default behavior to be controlled. AC_MSG_CHECKING([if prefix should be redefined at runtime]) AC_ARG_ENABLE([define_prefix], [AS_HELP_STRING([--enable-define-prefix], [redefine prefix in .pc files @<:@default=yes on Win32@:>@])], [], [enable_define_prefix=$native_win32]) AC_MSG_RESULT([$enable_define_prefix]) AC_DEFINE_UNQUOTED([ENABLE_DEFINE_PREFIX], [`test "x$enable_define_prefix" = xyes && echo TRUE || echo FALSE`], [Define ${prefix} in .pc files at runtime]) dnl dnl Find glib or use internal copy. Required version is 2.16 for dnl g_win32_get_package_installation_directory_of_module(). dnl dnl Pull in pkg-config macros to find external glib. dnl m4_include([pkg.m4.in]) m4_define([glib_module], [glib-2.0 >= 2.16]) AC_ARG_WITH([internal-glib], [AS_HELP_STRING([--with-internal-glib], [use internal glib])], [with_internal_glib="$withval"], [with_internal_glib=no]) AM_CONDITIONAL([INTERNAL_GLIB], [test "x$with_internal_glib" = xyes]) AC_MSG_CHECKING([if internal glib should be used]) if test "x$with_internal_glib" = xyes; then AC_MSG_RESULT([yes]) GLIB_CFLAGS='-I$(top_srcdir)/glib -I$(top_srcdir)/glib/glib \ -I$(top_builddir)/glib/glib' GLIB_LIBS='$(top_builddir)/glib/glib/libglib-2.0.la' AC_CONFIG_SUBDIRS([glib]) else AC_MSG_RESULT([no]) PKG_CHECK_MODULES([GLIB], glib_module, [], [AC_MSG_ERROR([]dnl [m4_normalize([Either a previously installed pkg-config or "]glib_module[" could not be found. Please set GLIB_CFLAGS and GLIB_LIBS to the correct values or pass --with-internal-glib to configure to use the bundled copy.])])]) fi AC_SUBST(GLIB_LIBS) AC_SUBST(GLIB_CFLAGS) dnl dnl Optional gcov test coverage usage dnl AC_ARG_WITH([gcov], [AS_HELP_STRING([--with-gcov], [gcov test coverage @<:@default=no@:>@])], [], [with_gcov=no]) if test "x$with_gcov" = xyes; then if test "$GCC" = no; then AC_MSG_ERROR([gcov test coverage can only be used with GCC]) fi AC_PATH_PROG([GCOV], [gcov], [AC_MSG_ERROR([could not find gcov program])]) GCOV_CFLAGS="-fprofile-arcs -ftest-coverage" # Ensure there's no optimizing since last -O wins and CFLAGS is used # at the end of COMPILE/LTCOMPILE. CFLAGS="${CFLAGS+$CFLAGS }-O0" fi AC_SUBST([GCOV_CFLAGS]) dnl See if the user wants a host- prefixed tool dnl (e.g. i686-pc-linux-gnu-pkg-config) to be installed. dnl AC_MSG_CHECKING([if host- prefixed tool should be installed]) AC_ARG_ENABLE([host-tool], [AS_HELP_STRING([--disable-host-tool], [install link to pkg-config with $host- prefix @<:@default=yes@:>@])], [], [enable_host_tool=yes]) AC_MSG_RESULT([$enable_host_tool]) AM_CONDITIONAL([HOST_TOOL], [test "x$enable_host_tool" = xyes]) AC_CONFIG_FILES([ Makefile pkg.m4 check/Makefile check/config.sh config.h.win32 ]) AC_OUTPUT pkg-config-0.29.1/Makefile.in0000664000175000017500000011373512665370325012642 00000000000000# Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ bin_PROGRAMS = pkg-config$(EXEEXT) subdir = . ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/pkg.m4.in \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \ $(am__configure_deps) $(dist_doc_DATA) $(am__DIST_COMMON) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_HEADER = config.h CONFIG_CLEAN_FILES = pkg.m4 config.h.win32 CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" \ "$(DESTDIR)$(docdir)" "$(DESTDIR)$(m4dir)" PROGRAMS = $(bin_PROGRAMS) am_pkg_config_OBJECTS = pkg.$(OBJEXT) parse.$(OBJEXT) \ rpmvercmp.$(OBJEXT) main.$(OBJEXT) pkg_config_OBJECTS = $(am_pkg_config_OBJECTS) am__DEPENDENCIES_1 = pkg_config_DEPENDENCIES = $(am__DEPENDENCIES_1) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(pkg_config_SOURCES) DIST_SOURCES = $(pkg_config_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } man1dir = $(mandir)/man1 NROFF = nroff MANS = $(dist_man_MANS) DATA = $(dist_doc_DATA) $(m4_DATA) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ cscope distdir dist dist-all distcheck am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \ $(LISP)config.h.in # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags CSCOPE = cscope am__DIST_COMMON = $(dist_man_MANS) $(srcdir)/Makefile.in \ $(srcdir)/Makefile.sources $(srcdir)/config.h.in \ $(srcdir)/config.h.win32.in $(srcdir)/pkg.m4.in AUTHORS \ COPYING ChangeLog INSTALL NEWS README compile config.guess \ config.sub depcomp install-sh ltmain.sh missing DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ if test -d "$(distdir)"; then \ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -rf "$(distdir)" \ || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi am__post_remove_distdir = $(am__remove_distdir) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best DIST_TARGETS = dist-gzip distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN = @LN@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TESTS_PKG_CONFIG = @TESTS_PKG_CONFIG@ TESTS_SHELL = @TESTS_SHELL@ VERSION = @VERSION@ WARN_CFLAGS = @WARN_CFLAGS@ WINE = @WINE@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ native_win32 = @native_win32@ oldincludedir = @oldincludedir@ pc_path = @pc_path@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ system_include_path = @system_include_path@ system_library_path = @system_library_path@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ use_indirect_deps = @use_indirect_deps@ ACLOCAL_AMFLAGS = ${ACLOCAL_FLAGS} @INTERNAL_GLIB_TRUE@GLIB_SUBDIR = glib # Normally we'd want glib to be part of DIST_SUBDIRS unconditionally, # but distclean gets broken unless we always run glib's configure SUBDIRS = $(GLIB_SUBDIR) . check DIST_SUBDIRS = $(SUBDIRS) @NATIVE_WIN32_FALSE@AM_CPPFLAGS = \ @NATIVE_WIN32_FALSE@ -DPKG_CONFIG_PC_PATH="\"$(pc_path)\"" \ @NATIVE_WIN32_FALSE@ -DPKG_CONFIG_SYSTEM_INCLUDE_PATH="\"$(system_include_path)\"" \ @NATIVE_WIN32_FALSE@ -DPKG_CONFIG_SYSTEM_LIBRARY_PATH="\"$(system_library_path)\"" # Escape paths properly on windows @NATIVE_WIN32_TRUE@AM_CPPFLAGS = \ @NATIVE_WIN32_TRUE@ -DPKG_CONFIG_PC_PATH="\"$(subst /,\/,$(pc_path))\"" \ @NATIVE_WIN32_TRUE@ -DPKG_CONFIG_SYSTEM_INCLUDE_PATH="\"$(subst /,\/,$(system_include_path))\"" \ @NATIVE_WIN32_TRUE@ -DPKG_CONFIG_SYSTEM_LIBRARY_PATH="\"$(subst /,\/,$(system_library_path))\"" AM_CFLAGS = \ $(WARN_CFLAGS) \ $(GCOV_CFLAGS) \ $(GLIB_CFLAGS) pkg_config_LDADD = $(GLIB_LIBS) pkg_config_SOURCES = \ pkg.h \ pkg.c \ parse.h \ parse.c \ rpmvercmp.c \ rpmvercmp.h \ main.c @HOST_TOOL_TRUE@host_tool = $(host)-pkg-config$(EXEEXT) # Various data files m4dir = $(datadir)/aclocal m4_DATA = pkg.m4 dist_doc_DATA = pkg-config-guide.html dist_man_MANS = pkg-config.1 EXTRA_DIST = \ README.win32 \ detectenv-msvc.mak \ Makefile.vc \ config.h.win32 CLEANFILES = *.gcda *.gcno *.gcov # Since we can't always have glib in DIST_SUBDIRS, we need to make sure # glib is configured when we want to run dist. Unfortunately, there's no # DIST_CONFIGURE_FLAGS. DISTCHECK_CONFIGURE_FLAGS = --with-internal-glib all: config.h $(MAKE) $(AM_MAKEFLAGS) all-recursive .SUFFIXES: .SUFFIXES: .c .lo .o .obj am--refresh: Makefile @: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/Makefile.sources $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --gnu'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ esac; $(srcdir)/Makefile.sources $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: $(am__configure_deps) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): config.h: stamp-h1 @test -f $@ || rm -f stamp-h1 @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1 stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status @rm -f stamp-h1 cd $(top_builddir) && $(SHELL) ./config.status config.h $(srcdir)/config.h.in: $(am__configure_deps) ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) rm -f stamp-h1 touch $@ distclean-hdr: -rm -f config.h stamp-h1 pkg.m4: $(top_builddir)/config.status $(srcdir)/pkg.m4.in cd $(top_builddir) && $(SHELL) ./config.status $@ config.h.win32: $(top_builddir)/config.status $(srcdir)/config.h.win32.in cd $(top_builddir) && $(SHELL) ./config.status $@ install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ || test -f $$p1 \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list pkg-config$(EXEEXT): $(pkg_config_OBJECTS) $(pkg_config_DEPENDENCIES) $(EXTRA_pkg_config_DEPENDENCIES) @rm -f pkg-config$(EXEEXT) $(AM_V_CCLD)$(LINK) $(pkg_config_OBJECTS) $(pkg_config_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parse.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pkg.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rpmvercmp.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs distclean-libtool: -rm -f libtool config.lt install-man1: $(dist_man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(dist_man_MANS)'; \ test -n "$(man1dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.1[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ done; } uninstall-man1: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man1dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(dist_man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.1[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) install-dist_docDATA: $(dist_doc_DATA) @$(NORMAL_INSTALL) @list='$(dist_doc_DATA)'; test -n "$(docdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(docdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(docdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(docdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(docdir)" || exit $$?; \ done uninstall-dist_docDATA: @$(NORMAL_UNINSTALL) @list='$(dist_doc_DATA)'; test -n "$(docdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(docdir)'; $(am__uninstall_files_from_dir) install-m4DATA: $(m4_DATA) @$(NORMAL_INSTALL) @list='$(m4_DATA)'; test -n "$(m4dir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(m4dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(m4dir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(m4dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(m4dir)" || exit $$?; \ done uninstall-m4DATA: @$(NORMAL_UNINSTALL) @list='$(m4_DATA)'; test -n "$(m4dir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(m4dir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscope: cscope.files test ! -s cscope.files \ || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) clean-cscope: -rm -f cscope.files cscope.files: clean-cscope cscopelist cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags -rm -f cscope.out cscope.in.out cscope.po.out cscope.files @INTERNAL_GLIB_TRUE@dist-hook: distdir: $(DISTFILES) $(am__remove_distdir) test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$(top_distdir)" distdir="$(distdir)" \ dist-hook -test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__post_remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(am__post_remove_distdir) dist-lzip: distdir tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz $(am__post_remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(am__post_remove_distdir) dist-tarZ: distdir @echo WARNING: "Support for distribution archives compressed with" \ "legacy program 'compress' is deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__post_remove_distdir) dist-shar: distdir @echo WARNING: "Support for shar distribution archives is" \ "deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__post_remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__post_remove_distdir) dist dist-all: $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' $(am__post_remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lz*) \ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir) chmod u+w $(distdir) mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build/sub \ && ../../configure \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ --srcdir=../.. --prefix="$$dc_install_base" \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 $(am__post_remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @test -n '$(distuninstallcheck_dir)' || { \ echo 'ERROR: trying to run $@ with an empty' \ '$$(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ $(am__cd) '$(distuninstallcheck_dir)' || { \ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am check: check-recursive all-am: Makefile $(PROGRAMS) $(MANS) $(DATA) config.h installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(docdir)" "$(DESTDIR)$(m4dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." @HOST_TOOL_FALSE@install-exec-hook: @HOST_TOOL_FALSE@uninstall-hook: clean: clean-recursive clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-hdr distclean-libtool distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dist_docDATA install-m4DATA install-man install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-binPROGRAMS @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) install-exec-hook install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-man1 install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-binPROGRAMS uninstall-dist_docDATA \ uninstall-m4DATA uninstall-man @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) uninstall-hook uninstall-man: uninstall-man1 .MAKE: $(am__recursive_targets) all install-am install-exec-am \ install-strip uninstall-am .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ am--refresh check check-am clean clean-binPROGRAMS \ clean-cscope clean-generic clean-libtool cscope cscopelist-am \ ctags ctags-am dist dist-all dist-bzip2 dist-gzip dist-hook \ dist-lzip dist-shar dist-tarZ dist-xz dist-zip distcheck \ distclean distclean-compile distclean-generic distclean-hdr \ distclean-libtool distclean-tags distcleancheck distdir \ distuninstallcheck dvi dvi-am html html-am info info-am \ install install-am install-binPROGRAMS install-data \ install-data-am install-dist_docDATA install-dvi \ install-dvi-am install-exec install-exec-am install-exec-hook \ install-html install-html-am install-info install-info-am \ install-m4DATA install-man install-man1 install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs installdirs-am \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \ uninstall-binPROGRAMS uninstall-dist_docDATA uninstall-hook \ uninstall-m4DATA uninstall-man uninstall-man1 .PRECIOUS: Makefile @HOST_TOOL_TRUE@install-exec-hook: @HOST_TOOL_TRUE@ cd $(DESTDIR)$(bindir) && $(LN) -f pkg-config$(EXEEXT) $(host_tool) @HOST_TOOL_TRUE@uninstall-hook: @HOST_TOOL_TRUE@ cd $(DESTDIR)$(bindir) && rm -f $(host_tool) # gcov test coverage gcov: -$(MAKE) $(AM_MAKEFLAGS) -k check $(GCOV) $(pkg_config_SOURCES) @INTERNAL_GLIB_FALSE@dist-hook: @INTERNAL_GLIB_FALSE@ @echo "error: --with-internal-glib is required to include glib in dist" @INTERNAL_GLIB_FALSE@ @exit 1 # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: pkg-config-0.29.1/COPYING0000664000175000017500000004325412275467762011637 00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 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 of the License, 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License.