aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKhem Raj <raj.khem@gmail.com>2019-12-07 00:57:23 -0800
committerKhem Raj <raj.khem@gmail.com>2019-12-08 23:00:57 -0800
commitc55a5670227fd02385350493b53dba79f3d21fe4 (patch)
treec5b33f4653ec104f8463586521e2326686f2b446
parent53e62e4e57c701dd546a2e27d8b72b7a4698551a (diff)
downloadmeta-openembedded-contrib-c55a5670227fd02385350493b53dba79f3d21fe4.tar.gz
libnih: Fix build with latest gettext
Run gettextize and fix up the resulting problems so that it builds Fixes | make[2]: *** No rule to make target 'libgnuintl.@INTL_LIBTOOL_SUFFIX_PREFIX@a', needed by 'all-no-yes'. Stop. Signed-off-by: Khem Raj <raj.khem@gmail.com>
-rw-r--r--meta-oe/recipes-support/libnih/libnih-1.0.3/0001-Update-autotool-files-also-make-it-work-with-latest-.patch24310
-rw-r--r--meta-oe/recipes-support/libnih/libnih_1.0.3.bb8
2 files changed, 24314 insertions, 4 deletions
diff --git a/meta-oe/recipes-support/libnih/libnih-1.0.3/0001-Update-autotool-files-also-make-it-work-with-latest-.patch b/meta-oe/recipes-support/libnih/libnih-1.0.3/0001-Update-autotool-files-also-make-it-work-with-latest-.patch
new file mode 100644
index 0000000000..2c857c26fe
--- /dev/null
+++ b/meta-oe/recipes-support/libnih/libnih-1.0.3/0001-Update-autotool-files-also-make-it-work-with-latest-.patch
@@ -0,0 +1,24310 @@
+From 0f1cc1bc615807e81fd2709d4177ca41168446c0 Mon Sep 17 00:00:00 2001
+From: Khem Raj <raj.khem@gmail.com>
+Date: Sat, 7 Dec 2019 00:45:23 -0800
+Subject: [PATCH] Update autotool files, also make it work with latest gettext
+
+Upstream-Status: Inappropriate [Dead upstream]
+Signed-off-by: Khem Raj <raj.khem@gmail.com>
+---
+ ABOUT-NLS | 1069 +--
+ ChangeLog | 7 +
+ Makefile.am | 2 +-
+ configure.ac | 6 +-
+ intl/ChangeLog | 4 -
+ intl/Makefile.in | 587 --
+ intl/VERSION | 1 -
+ intl/bindtextdom.c | 340 -
+ intl/config.charset | 640 --
+ intl/dcgettext.c | 56 -
+ intl/dcigettext.c | 1689 -----
+ intl/dcngettext.c | 57 -
+ intl/dgettext.c | 58 -
+ intl/dngettext.c | 59 -
+ intl/eval-plural.h | 108 -
+ intl/explodename.c | 135 -
+ intl/export.h | 6 -
+ intl/finddomain.c | 212 -
+ intl/gettext.c | 63 -
+ intl/gettextP.h | 297 -
+ intl/gmo.h | 152 -
+ intl/hash-string.c | 51 -
+ intl/hash-string.h | 36 -
+ intl/intl-compat.c | 133 -
+ intl/intl-exports.c | 36 -
+ intl/l10nflist.c | 400 --
+ intl/langprefs.c | 130 -
+ intl/libgnuintl.h.in | 419 --
+ intl/libintl.rc | 38 -
+ intl/loadinfo.h | 132 -
+ intl/loadmsgcat.c | 1336 ----
+ intl/localcharset.c | 461 --
+ intl/localcharset.h | 42 -
+ intl/locale.alias | 77 -
+ intl/localealias.c | 439 --
+ intl/localename.c | 1507 ----
+ intl/lock.c | 922 ---
+ intl/lock.h | 1105 ---
+ intl/log.c | 116 -
+ intl/ngettext.c | 65 -
+ intl/os2compat.c | 98 -
+ intl/os2compat.h | 46 -
+ intl/osdep.c | 26 -
+ intl/plural-exp.c | 155 -
+ intl/plural-exp.h | 129 -
+ intl/plural.c | 1981 ------
+ intl/plural.y | 385 --
+ intl/printf-args.c | 188 -
+ intl/printf-args.h | 155 -
+ intl/printf-parse.c | 590 --
+ intl/printf-parse.h | 75 -
+ intl/printf.c | 427 --
+ intl/ref-add.sin | 31 -
+ intl/ref-del.sin | 26 -
+ intl/relocatable.c | 468 --
+ intl/relocatable.h | 79 -
+ intl/textdomain.c | 127 -
+ intl/tsearch.c | 684 --
+ intl/tsearch.h | 83 -
+ intl/vasnprintf.c | 4677 -------------
+ intl/vasnprintf.h | 78 -
+ intl/vasnwprintf.h | 46 -
+ intl/version.c | 26 -
+ intl/wprintf-parse.h | 75 -
+ intl/xsize.h | 109 -
+ m4/intlmacosx.m4 | 55 +-
+ po/ChangeLog | 8 +
+ po/Rules-quot | 19 +-
+ po/en@boldquot.header | 2 +-
+ po/en@quot.header | 2 +-
+ po/insert-header.sin | 5 +
+ po/remove-potcdate.sin | 8 +-
+ 74 files changed, 1335 insertions(+), 38646 deletions(-)
+ delete mode 100644 intl/ChangeLog
+ delete mode 100644 intl/Makefile.in
+ delete mode 100644 intl/VERSION
+ delete mode 100644 intl/bindtextdom.c
+ delete mode 100755 intl/config.charset
+ delete mode 100644 intl/dcgettext.c
+ delete mode 100644 intl/dcigettext.c
+ delete mode 100644 intl/dcngettext.c
+ delete mode 100644 intl/dgettext.c
+ delete mode 100644 intl/dngettext.c
+ delete mode 100644 intl/eval-plural.h
+ delete mode 100644 intl/explodename.c
+ delete mode 100644 intl/export.h
+ delete mode 100644 intl/finddomain.c
+ delete mode 100644 intl/gettext.c
+ delete mode 100644 intl/gettextP.h
+ delete mode 100644 intl/gmo.h
+ delete mode 100644 intl/hash-string.c
+ delete mode 100644 intl/hash-string.h
+ delete mode 100644 intl/intl-compat.c
+ delete mode 100644 intl/intl-exports.c
+ delete mode 100644 intl/l10nflist.c
+ delete mode 100644 intl/langprefs.c
+ delete mode 100644 intl/libgnuintl.h.in
+ delete mode 100644 intl/libintl.rc
+ delete mode 100644 intl/loadinfo.h
+ delete mode 100644 intl/loadmsgcat.c
+ delete mode 100644 intl/localcharset.c
+ delete mode 100644 intl/localcharset.h
+ delete mode 100644 intl/locale.alias
+ delete mode 100644 intl/localealias.c
+ delete mode 100644 intl/localename.c
+ delete mode 100644 intl/lock.c
+ delete mode 100644 intl/lock.h
+ delete mode 100644 intl/log.c
+ delete mode 100644 intl/ngettext.c
+ delete mode 100644 intl/os2compat.c
+ delete mode 100644 intl/os2compat.h
+ delete mode 100644 intl/osdep.c
+ delete mode 100644 intl/plural-exp.c
+ delete mode 100644 intl/plural-exp.h
+ delete mode 100644 intl/plural.c
+ delete mode 100644 intl/plural.y
+ delete mode 100644 intl/printf-args.c
+ delete mode 100644 intl/printf-args.h
+ delete mode 100644 intl/printf-parse.c
+ delete mode 100644 intl/printf-parse.h
+ delete mode 100644 intl/printf.c
+ delete mode 100644 intl/ref-add.sin
+ delete mode 100644 intl/ref-del.sin
+ delete mode 100644 intl/relocatable.c
+ delete mode 100644 intl/relocatable.h
+ delete mode 100644 intl/textdomain.c
+ delete mode 100644 intl/tsearch.c
+ delete mode 100644 intl/tsearch.h
+ delete mode 100644 intl/vasnprintf.c
+ delete mode 100644 intl/vasnprintf.h
+ delete mode 100644 intl/vasnwprintf.h
+ delete mode 100644 intl/version.c
+ delete mode 100644 intl/wprintf-parse.h
+ delete mode 100644 intl/xsize.h
+
+--- a/ABOUT-NLS
++++ b/ABOUT-NLS
+@@ -1,1068 +1 @@
+-1 Notes on the Free Translation Project
+-***************************************
+-
+-Free software is going international! The Free Translation Project is
+-a way to get maintainers of free software, translators, and users all
+-together, so that free software will gradually become able to speak many
+-languages. A few packages already provide translations for their
+-messages.
+-
+- If you found this `ABOUT-NLS' file inside a distribution, you may
+-assume that the distributed package does use GNU `gettext' internally,
+-itself available at your nearest GNU archive site. But you do _not_
+-need to install GNU `gettext' prior to configuring, installing or using
+-this package with messages translated.
+-
+- Installers will find here some useful hints. These notes also
+-explain how users should proceed for getting the programs to use the
+-available translations. They tell how people wanting to contribute and
+-work on translations can contact the appropriate team.
+-
+- When reporting bugs in the `intl/' directory or bugs which may be
+-related to internationalization, you should tell about the version of
+-`gettext' which is used. The information can be found in the
+-`intl/VERSION' file, in internationalized packages.
+-
+-1.1 Quick configuration advice
+-==============================
+-
+-If you want to exploit the full power of internationalization, you
+-should configure it using
+-
+- ./configure --with-included-gettext
+-
+-to force usage of internationalizing routines provided within this
+-package, despite the existence of internationalizing capabilities in the
+-operating system where this package is being installed. So far, only
+-the `gettext' implementation in the GNU C library version 2 provides as
+-many features (such as locale alias, message inheritance, automatic
+-charset conversion or plural form handling) as the implementation here.
+-It is also not possible to offer this additional functionality on top
+-of a `catgets' implementation. Future versions of GNU `gettext' will
+-very likely convey even more functionality. So it might be a good idea
+-to change to GNU `gettext' as soon as possible.
+-
+- So you need _not_ provide this option if you are using GNU libc 2 or
+-you have installed a recent copy of the GNU gettext package with the
+-included `libintl'.
+-
+-1.2 INSTALL Matters
+-===================
+-
+-Some packages are "localizable" when properly installed; the programs
+-they contain can be made to speak your own native language. Most such
+-packages use GNU `gettext'. Other packages have their own ways to
+-internationalization, predating GNU `gettext'.
+-
+- By default, this package will be installed to allow translation of
+-messages. It will automatically detect whether the system already
+-provides the GNU `gettext' functions. If not, the included GNU
+-`gettext' library will be used. This library is wholly contained
+-within this package, usually in the `intl/' subdirectory, so prior
+-installation of the GNU `gettext' package is _not_ required.
+-Installers may use special options at configuration time for changing
+-the default behaviour. The commands:
+-
+- ./configure --with-included-gettext
+- ./configure --disable-nls
+-
+-will, respectively, bypass any pre-existing `gettext' to use the
+-internationalizing routines provided within this package, or else,
+-_totally_ disable translation of messages.
+-
+- When you already have GNU `gettext' installed on your system and run
+-configure without an option for your new package, `configure' will
+-probably detect the previously built and installed `libintl.a' file and
+-will decide to use this. This might not be desirable. You should use
+-the more recent version of the GNU `gettext' library. I.e. if the file
+-`intl/VERSION' shows that the library which comes with this package is
+-more recent, you should use
+-
+- ./configure --with-included-gettext
+-
+-to prevent auto-detection.
+-
+- The configuration process will not test for the `catgets' function
+-and therefore it will not be used. The reason is that even an
+-emulation of `gettext' on top of `catgets' could not provide all the
+-extensions of the GNU `gettext' library.
+-
+- Internationalized packages usually have many `po/LL.po' files, where
+-LL gives an ISO 639 two-letter code identifying the language. Unless
+-translations have been forbidden at `configure' time by using the
+-`--disable-nls' switch, all available translations are installed
+-together with the package. However, the environment variable `LINGUAS'
+-may be set, prior to configuration, to limit the installed set.
+-`LINGUAS' should then contain a space separated list of two-letter
+-codes, stating which languages are allowed.
+-
+-1.3 Using This Package
+-======================
+-
+-As a user, if your language has been installed for this package, you
+-only have to set the `LANG' environment variable to the appropriate
+-`LL_CC' combination. If you happen to have the `LC_ALL' or some other
+-`LC_xxx' environment variables set, you should unset them before
+-setting `LANG', otherwise the setting of `LANG' will not have the
+-desired effect. Here `LL' is an ISO 639 two-letter language code, and
+-`CC' is an ISO 3166 two-letter country code. For example, let's
+-suppose that you speak German and live in Germany. At the shell
+-prompt, merely execute `setenv LANG de_DE' (in `csh'),
+-`export LANG; LANG=de_DE' (in `sh') or `export LANG=de_DE' (in `bash').
+-This can be done from your `.login' or `.profile' file, once and for
+-all.
+-
+- You might think that the country code specification is redundant.
+-But in fact, some languages have dialects in different countries. For
+-example, `de_AT' is used for Austria, and `pt_BR' for Brazil. The
+-country code serves to distinguish the dialects.
+-
+- The locale naming convention of `LL_CC', with `LL' denoting the
+-language and `CC' denoting the country, is the one use on systems based
+-on GNU libc. On other systems, some variations of this scheme are
+-used, such as `LL' or `LL_CC.ENCODING'. You can get the list of
+-locales supported by your system for your language by running the
+-command `locale -a | grep '^LL''.
+-
+- Not all programs have translations for all languages. By default, an
+-English message is shown in place of a nonexistent translation. If you
+-understand other languages, you can set up a priority list of languages.
+-This is done through a different environment variable, called
+-`LANGUAGE'. GNU `gettext' gives preference to `LANGUAGE' over `LANG'
+-for the purpose of message handling, but you still need to have `LANG'
+-set to the primary language; this is required by other parts of the
+-system libraries. For example, some Swedish users who would rather
+-read translations in German than English for when Swedish is not
+-available, set `LANGUAGE' to `sv:de' while leaving `LANG' to `sv_SE'.
+-
+- Special advice for Norwegian users: The language code for Norwegian
+-bokma*l changed from `no' to `nb' recently (in 2003). During the
+-transition period, while some message catalogs for this language are
+-installed under `nb' and some older ones under `no', it's recommended
+-for Norwegian users to set `LANGUAGE' to `nb:no' so that both newer and
+-older translations are used.
+-
+- In the `LANGUAGE' environment variable, but not in the `LANG'
+-environment variable, `LL_CC' combinations can be abbreviated as `LL'
+-to denote the language's main dialect. For example, `de' is equivalent
+-to `de_DE' (German as spoken in Germany), and `pt' to `pt_PT'
+-(Portuguese as spoken in Portugal) in this context.
+-
+-1.4 Translating Teams
+-=====================
+-
+-For the Free Translation Project to be a success, we need interested
+-people who like their own language and write it well, and who are also
+-able to synergize with other translators speaking the same language.
+-Each translation team has its own mailing list. The up-to-date list of
+-teams can be found at the Free Translation Project's homepage,
+-`http://translationproject.org/', in the "Teams" area.
+-
+- If you'd like to volunteer to _work_ at translating messages, you
+-should become a member of the translating team for your own language.
+-The subscribing address is _not_ the same as the list itself, it has
+-`-request' appended. For example, speakers of Swedish can send a
+-message to `sv-request@li.org', having this message body:
+-
+- subscribe
+-
+- Keep in mind that team members are expected to participate
+-_actively_ in translations, or at solving translational difficulties,
+-rather than merely lurking around. If your team does not exist yet and
+-you want to start one, or if you are unsure about what to do or how to
+-get started, please write to `coordinator@translationproject.org' to
+-reach the coordinator for all translator teams.
+-
+- The English team is special. It works at improving and uniformizing
+-the terminology in use. Proven linguistic skills are praised more than
+-programming skills, here.
+-
+-1.5 Available Packages
+-======================
+-
+-Languages are not equally supported in all packages. The following
+-matrix shows the current state of internationalization, as of November
+-2007. The matrix shows, in regard of each package, for which languages
+-PO files have been submitted to translation coordination, with a
+-translation percentage of at least 50%.
+-
+- Ready PO files af am ar az be bg bs ca cs cy da de el en en_GB eo
+- +----------------------------------------------------+
+- Compendium | [] [] [] [] |
+- a2ps | [] [] [] [] [] |
+- aegis | () |
+- ant-phone | () |
+- anubis | [] |
+- ap-utils | |
+- aspell | [] [] [] [] [] |
+- bash | [] |
+- bfd | |
+- bibshelf | [] |
+- binutils | |
+- bison | [] [] |
+- bison-runtime | [] |
+- bluez-pin | [] [] [] [] [] |
+- cflow | [] |
+- clisp | [] [] [] |
+- console-tools | [] [] |
+- coreutils | [] [] [] [] |
+- cpio | |
+- cpplib | [] [] [] |
+- cryptonit | [] |
+- dialog | |
+- diffutils | [] [] [] [] [] [] |
+- doodle | [] |
+- e2fsprogs | [] [] |
+- enscript | [] [] [] [] |
+- fetchmail | [] [] () [] [] |
+- findutils | [] |
+- findutils_stable | [] [] [] |
+- flex | [] [] [] |
+- fslint | |
+- gas | |
+- gawk | [] [] [] |
+- gcal | [] |
+- gcc | [] |
+- gettext-examples | [] [] [] [] [] |
+- gettext-runtime | [] [] [] [] [] |
+- gettext-tools | [] [] |
+- gip | [] |
+- gliv | [] [] |
+- glunarclock | [] |
+- gmult | [] [] |
+- gnubiff | () |
+- gnucash | [] [] () () [] |
+- gnuedu | |
+- gnulib | [] |
+- gnunet | |
+- gnunet-gtk | |
+- gnutls | [] |
+- gpe-aerial | [] [] |
+- gpe-beam | [] [] |
+- gpe-calendar | |
+- gpe-clock | [] [] |
+- gpe-conf | [] [] |
+- gpe-contacts | |
+- gpe-edit | [] |
+- gpe-filemanager | |
+- gpe-go | [] |
+- gpe-login | [] [] |
+- gpe-ownerinfo | [] [] |
+- gpe-package | |
+- gpe-sketchbook | [] [] |
+- gpe-su | [] [] |
+- gpe-taskmanager | [] [] |
+- gpe-timesheet | [] |
+- gpe-today | [] [] |
+- gpe-todo | |
+- gphoto2 | [] [] [] [] |
+- gprof | [] [] |
+- gpsdrive | |
+- gramadoir | [] [] |
+- grep | [] [] |
+- gretl | () |
+- gsasl | |
+- gss | |
+- gst-plugins-bad | [] [] |
+- gst-plugins-base | [] [] |
+- gst-plugins-good | [] [] [] |
+- gst-plugins-ugly | [] [] |
+- gstreamer | [] [] [] [] [] [] [] |
+- gtick | () |
+- gtkam | [] [] [] [] |
+- gtkorphan | [] [] |
+- gtkspell | [] [] [] [] |
+- gutenprint | [] |
+- hello | [] [] [] [] [] |
+- herrie | [] |
+- hylafax | |
+- idutils | [] [] |
+- indent | [] [] [] [] |
+- iso_15924 | |
+- iso_3166 | [] [] [] [] [] [] [] [] [] [] [] |
+- iso_3166_2 | |
+- iso_4217 | [] [] [] |
+- iso_639 | [] [] [] [] |
+- jpilot | [] |
+- jtag | |
+- jwhois | |
+- kbd | [] [] [] [] |
+- keytouch | [] [] |
+- keytouch-editor | [] |
+- keytouch-keyboa... | [] |
+- latrine | () |
+- ld | [] |
+- leafpad | [] [] [] [] [] |
+- libc | [] [] [] [] |
+- libexif | [] |
+- libextractor | [] |
+- libgpewidget | [] [] [] |
+- libgpg-error | [] |
+- libgphoto2 | [] [] |
+- libgphoto2_port | [] [] |
+- libgsasl | |
+- libiconv | [] [] |
+- libidn | [] [] [] |
+- lifelines | [] () |
+- lilypond | [] |
+- lingoteach | |
+- lprng | |
+- lynx | [] [] [] [] |
+- m4 | [] [] [] [] |
+- mailfromd | |
+- mailutils | [] |
+- make | [] [] |
+- man-db | [] [] [] |
+- minicom | [] [] [] |
+- nano | [] [] [] |
+- opcodes | [] |
+- parted | [] [] |
+- pilot-qof | |
+- popt | [] [] [] |
+- psmisc | [] |
+- pwdutils | |
+- qof | |
+- radius | [] |
+- recode | [] [] [] [] [] [] |
+- rpm | [] |
+- screem | |
+- scrollkeeper | [] [] [] [] [] [] [] [] |
+- sed | [] [] [] |
+- shared-mime-info | [] [] [] [] () [] [] [] |
+- sharutils | [] [] [] [] [] [] |
+- shishi | |
+- skencil | [] () |
+- solfege | |
+- soundtracker | [] [] |
+- sp | [] |
+- system-tools-ba... | [] [] [] [] [] [] [] [] [] |
+- tar | [] [] |
+- texinfo | [] [] [] |
+- tin | () () |
+- tuxpaint | [] [] [] [] [] [] |
+- unicode-han-tra... | |
+- unicode-transla... | |
+- util-linux | [] [] [] [] |
+- util-linux-ng | [] [] [] [] |
+- vorbis-tools | [] |
+- wastesedge | () |
+- wdiff | [] [] [] [] |
+- wget | [] [] [] |
+- xchat | [] [] [] [] [] [] [] |
+- xkeyboard-config | [] |
+- xpad | [] [] [] |
+- +----------------------------------------------------+
+- af am ar az be bg bs ca cs cy da de el en en_GB eo
+- 6 0 2 1 8 26 2 40 48 2 56 88 15 1 15 18
+-
+- es et eu fa fi fr ga gl gu he hi hr hu id is it
+- +--------------------------------------------------+
+- Compendium | [] [] [] [] [] |
+- a2ps | [] [] [] () |
+- aegis | |
+- ant-phone | [] |
+- anubis | [] |
+- ap-utils | [] [] |
+- aspell | [] [] [] |
+- bash | [] |
+- bfd | [] [] |
+- bibshelf | [] [] [] |
+- binutils | [] [] [] |
+- bison | [] [] [] [] [] [] |
+- bison-runtime | [] [] [] [] [] |
+- bluez-pin | [] [] [] [] [] |
+- cflow | [] |
+- clisp | [] [] |
+- console-tools | |
+- coreutils | [] [] [] [] [] [] |
+- cpio | [] [] [] |
+- cpplib | [] [] |
+- cryptonit | [] |
+- dialog | [] [] [] |
+- diffutils | [] [] [] [] [] [] [] [] [] |
+- doodle | [] [] |
+- e2fsprogs | [] [] [] |
+- enscript | [] [] [] |
+- fetchmail | [] |
+- findutils | [] [] [] |
+- findutils_stable | [] [] [] [] |
+- flex | [] [] [] |
+- fslint | |
+- gas | [] [] |
+- gawk | [] [] [] [] () |
+- gcal | [] [] |
+- gcc | [] |
+- gettext-examples | [] [] [] [] [] [] [] |
+- gettext-runtime | [] [] [] [] [] [] |
+- gettext-tools | [] [] [] [] |
+- gip | [] [] [] [] |
+- gliv | () |
+- glunarclock | [] [] [] |
+- gmult | [] [] [] |
+- gnubiff | () () |
+- gnucash | () () () |
+- gnuedu | [] |
+- gnulib | [] [] [] |
+- gnunet | |
+- gnunet-gtk | |
+- gnutls | |
+- gpe-aerial | [] [] |
+- gpe-beam | [] [] |
+- gpe-calendar | |
+- gpe-clock | [] [] [] [] |
+- gpe-conf | [] |
+- gpe-contacts | [] [] |
+- gpe-edit | [] [] [] [] |
+- gpe-filemanager | [] |
+- gpe-go | [] [] [] |
+- gpe-login | [] [] [] |
+- gpe-ownerinfo | [] [] [] [] [] |
+- gpe-package | [] |
+- gpe-sketchbook | [] [] |
+- gpe-su | [] [] [] [] |
+- gpe-taskmanager | [] [] [] |
+- gpe-timesheet | [] [] [] [] |
+- gpe-today | [] [] [] [] |
+- gpe-todo | [] |
+- gphoto2 | [] [] [] [] [] |
+- gprof | [] [] [] [] [] |
+- gpsdrive | [] |
+- gramadoir | [] [] |
+- grep | [] [] [] |
+- gretl | [] [] [] () |
+- gsasl | [] [] |
+- gss | [] [] |
+- gst-plugins-bad | [] [] [] [] |
+- gst-plugins-base | [] [] [] [] |
+- gst-plugins-good | [] [] [] [] [] |
+- gst-plugins-ugly | [] [] [] [] |
+- gstreamer | [] [] [] |
+- gtick | [] [] [] |
+- gtkam | [] [] [] [] |
+- gtkorphan | [] [] |
+- gtkspell | [] [] [] [] [] [] [] |
+- gutenprint | [] |
+- hello | [] [] [] [] [] [] [] [] [] [] [] [] [] |
+- herrie | [] |
+- hylafax | |
+- idutils | [] [] [] [] [] |
+- indent | [] [] [] [] [] [] [] [] [] [] |
+- iso_15924 | [] |
+- iso_3166 | [] [] [] [] [] [] [] [] [] [] [] [] [] |
+- iso_3166_2 | [] |
+- iso_4217 | [] [] [] [] [] [] |
+- iso_639 | [] [] [] [] [] [] |
+- jpilot | [] [] |
+- jtag | [] |
+- jwhois | [] [] [] [] [] |
+- kbd | [] [] |
+- keytouch | [] [] [] |
+- keytouch-editor | [] |
+- keytouch-keyboa... | [] [] |
+- latrine | [] [] |
+- ld | [] [] [] [] |
+- leafpad | [] [] [] [] [] [] |
+- libc | [] [] [] [] [] |
+- libexif | [] |
+- libextractor | [] |
+- libgpewidget | [] [] [] [] [] |
+- libgpg-error | [] |
+- libgphoto2 | [] [] [] |
+- libgphoto2_port | [] [] |
+- libgsasl | [] [] |
+- libiconv | [] [] [] |
+- libidn | [] [] |
+- lifelines | () |
+- lilypond | [] [] [] |
+- lingoteach | [] [] [] |
+- lprng | |
+- lynx | [] [] [] |
+- m4 | [] [] [] [] |
+- mailfromd | |
+- mailutils | [] [] |
+- make | [] [] [] [] [] [] [] [] |
+- man-db | [] |
+- minicom | [] [] [] [] |
+- nano | [] [] [] [] [] [] [] |
+- opcodes | [] [] [] [] |
+- parted | [] [] [] |
+- pilot-qof | |
+- popt | [] [] [] [] |
+- psmisc | [] [] |
+- pwdutils | |
+- qof | [] |
+- radius | [] [] |
+- recode | [] [] [] [] [] [] [] [] |
+- rpm | [] [] |
+- screem | |
+- scrollkeeper | [] [] [] |
+- sed | [] [] [] [] [] |
+- shared-mime-info | [] [] [] [] [] [] |
+- sharutils | [] [] [] [] [] [] [] [] |
+- shishi | [] |
+- skencil | [] [] |
+- solfege | [] |
+- soundtracker | [] [] [] |
+- sp | [] |
+- system-tools-ba... | [] [] [] [] [] [] [] [] [] |
+- tar | [] [] [] [] [] |
+- texinfo | [] [] [] |
+- tin | [] () |
+- tuxpaint | [] [] |
+- unicode-han-tra... | |
+- unicode-transla... | [] [] |
+- util-linux | [] [] [] [] [] [] [] |
+- util-linux-ng | [] [] [] [] [] [] [] |
+- vorbis-tools | |
+- wastesedge | () |
+- wdiff | [] [] [] [] [] [] [] [] |
+- wget | [] [] [] [] [] [] [] [] |
+- xchat | [] [] [] [] [] [] [] |
+- xkeyboard-config | [] [] [] [] |
+- xpad | [] [] [] |
+- +--------------------------------------------------+
+- es et eu fa fi fr ga gl gu he hi hr hu id is it
+- 85 22 14 2 48 101 61 12 2 8 2 6 53 29 1 52
+-
+- ja ka ko ku ky lg lt lv mk mn ms mt nb ne nl nn
+- +--------------------------------------------------+
+- Compendium | [] |
+- a2ps | () [] [] |
+- aegis | () |
+- ant-phone | [] |
+- anubis | [] [] [] |
+- ap-utils | [] |
+- aspell | [] [] |
+- bash | [] |
+- bfd | |
+- bibshelf | [] |
+- binutils | |
+- bison | [] [] [] |
+- bison-runtime | [] [] [] |
+- bluez-pin | [] [] [] |
+- cflow | |
+- clisp | [] |
+- console-tools | |
+- coreutils | [] |
+- cpio | [] |
+- cpplib | [] |
+- cryptonit | [] |
+- dialog | [] [] |
+- diffutils | [] [] [] |
+- doodle | |
+- e2fsprogs | [] |
+- enscript | [] |
+- fetchmail | [] [] |
+- findutils | [] |
+- findutils_stable | [] |
+- flex | [] [] |
+- fslint | |
+- gas | |
+- gawk | [] [] |
+- gcal | |
+- gcc | |
+- gettext-examples | [] [] [] |
+- gettext-runtime | [] [] [] |
+- gettext-tools | [] [] |
+- gip | [] [] |
+- gliv | [] |
+- glunarclock | [] [] |
+- gmult | [] [] [] |
+- gnubiff | |
+- gnucash | () () () |
+- gnuedu | |
+- gnulib | [] [] |
+- gnunet | |
+- gnunet-gtk | |
+- gnutls | [] |
+- gpe-aerial | [] |
+- gpe-beam | [] |
+- gpe-calendar | [] |
+- gpe-clock | [] [] [] |
+- gpe-conf | [] [] [] |
+- gpe-contacts | [] |
+- gpe-edit | [] [] [] |
+- gpe-filemanager | [] [] |
+- gpe-go | [] [] [] |
+- gpe-login | [] [] [] |
+- gpe-ownerinfo | [] [] |
+- gpe-package | [] [] |
+- gpe-sketchbook | [] [] |
+- gpe-su | [] [] [] |
+- gpe-taskmanager | [] [] [] [] |
+- gpe-timesheet | [] |
+- gpe-today | [] [] |
+- gpe-todo | [] |
+- gphoto2 | [] [] |
+- gprof | [] |
+- gpsdrive | [] |
+- gramadoir | () |
+- grep | [] [] |
+- gretl | |
+- gsasl | [] |
+- gss | |
+- gst-plugins-bad | [] |
+- gst-plugins-base | [] |
+- gst-plugins-good | [] |
+- gst-plugins-ugly | [] |
+- gstreamer | [] |
+- gtick | [] |
+- gtkam | [] [] |
+- gtkorphan | [] |
+- gtkspell | [] [] |
+- gutenprint | [] |
+- hello | [] [] [] [] [] [] [] |
+- herrie | [] |
+- hylafax | |
+- idutils | [] |
+- indent | [] [] |
+- iso_15924 | [] |
+- iso_3166 | [] [] [] [] [] [] [] [] |
+- iso_3166_2 | [] |
+- iso_4217 | [] [] [] |
+- iso_639 | [] [] [] [] |
+- jpilot | () () |
+- jtag | |
+- jwhois | [] |
+- kbd | [] |
+- keytouch | [] |
+- keytouch-editor | [] |
+- keytouch-keyboa... | |
+- latrine | [] |
+- ld | |
+- leafpad | [] [] |
+- libc | [] [] [] |
+- libexif | |
+- libextractor | |
+- libgpewidget | [] |
+- libgpg-error | |
+- libgphoto2 | [] |
+- libgphoto2_port | [] |
+- libgsasl | [] |
+- libiconv | [] |
+- libidn | [] [] |
+- lifelines | [] |
+- lilypond | [] |
+- lingoteach | [] |
+- lprng | |
+- lynx | [] [] |
+- m4 | [] [] |
+- mailfromd | |
+- mailutils | |
+- make | [] [] [] |
+- man-db | |
+- minicom | [] |
+- nano | [] [] [] |
+- opcodes | [] |
+- parted | [] [] |
+- pilot-qof | |
+- popt | [] [] [] |
+- psmisc | [] [] [] |
+- pwdutils | |
+- qof | |
+- radius | |
+- recode | [] |
+- rpm | [] [] |
+- screem | [] |
+- scrollkeeper | [] [] [] [] |
+- sed | [] [] |
+- shared-mime-info | [] [] [] [] [] [] [] |
+- sharutils | [] [] |
+- shishi | |
+- skencil | |
+- solfege | () () |
+- soundtracker | |
+- sp | () |
+- system-tools-ba... | [] [] [] [] |
+- tar | [] [] [] |
+- texinfo | [] [] |
+- tin | |
+- tuxpaint | () [] [] |
+- unicode-han-tra... | |
+- unicode-transla... | |
+- util-linux | [] [] |
+- util-linux-ng | [] [] |
+- vorbis-tools | |
+- wastesedge | [] |
+- wdiff | [] [] |
+- wget | [] [] |
+- xchat | [] [] [] [] |
+- xkeyboard-config | [] [] [] |
+- xpad | [] [] [] |
+- +--------------------------------------------------+
+- ja ka ko ku ky lg lt lv mk mn ms mt nb ne nl nn
+- 51 2 25 3 2 0 6 0 2 2 20 0 11 1 103 6
+-
+- or pa pl pt pt_BR rm ro ru rw sk sl sq sr sv ta
+- +--------------------------------------------------+
+- Compendium | [] [] [] [] [] |
+- a2ps | () [] [] [] [] [] [] |
+- aegis | () () |
+- ant-phone | [] [] |
+- anubis | [] [] [] |
+- ap-utils | () |
+- aspell | [] [] [] |
+- bash | [] [] |
+- bfd | |
+- bibshelf | [] |
+- binutils | [] [] |
+- bison | [] [] [] [] [] |
+- bison-runtime | [] [] [] [] [] |
+- bluez-pin | [] [] [] [] [] [] [] [] [] |
+- cflow | [] |
+- clisp | [] |
+- console-tools | [] |
+- coreutils | [] [] [] [] |
+- cpio | [] [] [] |
+- cpplib | [] |
+- cryptonit | [] [] |
+- dialog | [] |
+- diffutils | [] [] [] [] [] [] |
+- doodle | [] [] |
+- e2fsprogs | [] [] |
+- enscript | [] [] [] [] [] |
+- fetchmail | [] [] [] |
+- findutils | [] [] [] |
+- findutils_stable | [] [] [] [] [] [] |
+- flex | [] [] [] [] [] |
+- fslint | [] |
+- gas | |
+- gawk | [] [] [] [] |
+- gcal | [] |
+- gcc | [] [] |
+- gettext-examples | [] [] [] [] [] [] [] [] |
+- gettext-runtime | [] [] [] [] [] [] [] [] |
+- gettext-tools | [] [] [] [] [] [] [] |
+- gip | [] [] [] [] |
+- gliv | [] [] [] [] [] [] |
+- glunarclock | [] [] [] [] [] [] |
+- gmult | [] [] [] [] |
+- gnubiff | () [] |
+- gnucash | () [] |
+- gnuedu | |
+- gnulib | [] [] [] |
+- gnunet | |
+- gnunet-gtk | [] |
+- gnutls | [] [] |
+- gpe-aerial | [] [] [] [] [] [] [] |
+- gpe-beam | [] [] [] [] [] [] [] |
+- gpe-calendar | [] [] [] [] |
+- gpe-clock | [] [] [] [] [] [] [] [] |
+- gpe-conf | [] [] [] [] [] [] [] |
+- gpe-contacts | [] [] [] [] [] |
+- gpe-edit | [] [] [] [] [] [] [] [] [] |
+- gpe-filemanager | [] [] |
+- gpe-go | [] [] [] [] [] [] [] [] |
+- gpe-login | [] [] [] [] [] [] [] [] |
+- gpe-ownerinfo | [] [] [] [] [] [] [] [] |
+- gpe-package | [] [] |
+- gpe-sketchbook | [] [] [] [] [] [] [] [] |
+- gpe-su | [] [] [] [] [] [] [] [] |
+- gpe-taskmanager | [] [] [] [] [] [] [] [] |
+- gpe-timesheet | [] [] [] [] [] [] [] [] |
+- gpe-today | [] [] [] [] [] [] [] [] |
+- gpe-todo | [] [] [] [] |
+- gphoto2 | [] [] [] [] [] [] |
+- gprof | [] [] [] |
+- gpsdrive | [] [] |
+- gramadoir | [] [] |
+- grep | [] [] [] [] |
+- gretl | [] [] [] |
+- gsasl | [] [] [] |
+- gss | [] [] [] [] |
+- gst-plugins-bad | [] [] [] |
+- gst-plugins-base | [] [] |
+- gst-plugins-good | [] [] |
+- gst-plugins-ugly | [] [] [] |
+- gstreamer | [] [] [] [] |
+- gtick | [] |
+- gtkam | [] [] [] [] [] |
+- gtkorphan | [] |
+- gtkspell | [] [] [] [] [] [] [] [] |
+- gutenprint | [] |
+- hello | [] [] [] [] [] [] [] [] |
+- herrie | [] [] [] |
+- hylafax | |
+- idutils | [] [] [] [] [] |
+- indent | [] [] [] [] [] [] [] |
+- iso_15924 | |
+- iso_3166 | [] [] [] [] [] [] [] [] [] [] [] [] [] |
+- iso_3166_2 | |
+- iso_4217 | [] [] [] [] [] [] [] |
+- iso_639 | [] [] [] [] [] [] [] |
+- jpilot | |
+- jtag | [] |
+- jwhois | [] [] [] [] |
+- kbd | [] [] [] |
+- keytouch | [] |
+- keytouch-editor | [] |
+- keytouch-keyboa... | [] |
+- latrine | |
+- ld | [] |
+- leafpad | [] [] [] [] [] [] |
+- libc | [] [] [] [] |
+- libexif | [] [] |
+- libextractor | [] [] |
+- libgpewidget | [] [] [] [] [] [] [] [] |
+- libgpg-error | [] [] [] |
+- libgphoto2 | [] |
+- libgphoto2_port | [] [] [] |
+- libgsasl | [] [] [] [] |
+- libiconv | [] [] [] |
+- libidn | [] [] () |
+- lifelines | [] [] |
+- lilypond | |
+- lingoteach | [] |
+- lprng | [] |
+- lynx | [] [] [] |
+- m4 | [] [] [] [] [] |
+- mailfromd | [] |
+- mailutils | [] [] [] |
+- make | [] [] [] [] |
+- man-db | [] [] [] [] |
+- minicom | [] [] [] [] [] |
+- nano | [] [] [] [] |
+- opcodes | [] [] |
+- parted | [] |
+- pilot-qof | |
+- popt | [] [] [] [] |
+- psmisc | [] [] |
+- pwdutils | [] [] |
+- qof | [] [] |
+- radius | [] [] |
+- recode | [] [] [] [] [] [] [] |
+- rpm | [] [] [] [] |
+- screem | |
+- scrollkeeper | [] [] [] [] [] [] [] |
+- sed | [] [] [] [] [] [] [] [] [] |
+- shared-mime-info | [] [] [] [] [] [] |
+- sharutils | [] [] [] [] |
+- shishi | [] |
+- skencil | [] [] [] |
+- solfege | [] |
+- soundtracker | [] [] |
+- sp | |
+- system-tools-ba... | [] [] [] [] [] [] [] [] [] |
+- tar | [] [] [] [] |
+- texinfo | [] [] [] [] |
+- tin | () |
+- tuxpaint | [] [] [] [] [] [] |
+- unicode-han-tra... | |
+- unicode-transla... | |
+- util-linux | [] [] [] [] |
+- util-linux-ng | [] [] [] [] |
+- vorbis-tools | [] |
+- wastesedge | |
+- wdiff | [] [] [] [] [] [] [] |
+- wget | [] [] [] [] |
+- xchat | [] [] [] [] [] [] [] |
+- xkeyboard-config | [] [] [] |
+- xpad | [] [] [] |
+- +--------------------------------------------------+
+- or pa pl pt pt_BR rm ro ru rw sk sl sq sr sv ta
+- 0 5 77 31 53 4 58 72 3 45 46 9 45 122 3
+-
+- tg th tk tr uk ven vi wa xh zh_CN zh_HK zh_TW zu
+- +---------------------------------------------------+
+- Compendium | [] [] [] [] | 19
+- a2ps | [] [] [] | 19
+- aegis | [] | 1
+- ant-phone | [] [] | 6
+- anubis | [] [] [] | 11
+- ap-utils | () [] | 4
+- aspell | [] [] [] | 16
+- bash | [] | 6
+- bfd | | 2
+- bibshelf | [] | 7
+- binutils | [] [] [] [] | 9
+- bison | [] [] [] [] | 20
+- bison-runtime | [] [] [] [] | 18
+- bluez-pin | [] [] [] [] [] [] | 28
+- cflow | [] [] | 5
+- clisp | | 9
+- console-tools | [] [] | 5
+- coreutils | [] [] [] | 18
+- cpio | [] [] [] [] | 11
+- cpplib | [] [] [] [] [] | 12
+- cryptonit | [] | 6
+- dialog | [] [] [] | 9
+- diffutils | [] [] [] [] [] | 29
+- doodle | [] | 6
+- e2fsprogs | [] [] | 10
+- enscript | [] [] [] | 16
+- fetchmail | [] [] | 12
+- findutils | [] [] [] | 11
+- findutils_stable | [] [] [] [] | 18
+- flex | [] [] | 15
+- fslint | [] | 2
+- gas | [] | 3
+- gawk | [] [] [] | 16
+- gcal | [] | 5
+- gcc | [] [] [] | 7
+- gettext-examples | [] [] [] [] [] [] | 29
+- gettext-runtime | [] [] [] [] [] [] | 28
+- gettext-tools | [] [] [] [] [] | 20
+- gip | [] [] | 13
+- gliv | [] [] | 11
+- glunarclock | [] [] [] | 15
+- gmult | [] [] [] [] | 16
+- gnubiff | [] | 2
+- gnucash | () [] | 5
+- gnuedu | [] | 2
+- gnulib | [] | 10
+- gnunet | | 0
+- gnunet-gtk | [] [] | 3
+- gnutls | | 4
+- gpe-aerial | [] [] | 14
+- gpe-beam | [] [] | 14
+- gpe-calendar | [] [] | 7
+- gpe-clock | [] [] [] [] | 21
+- gpe-conf | [] [] [] | 16
+- gpe-contacts | [] [] | 10
+- gpe-edit | [] [] [] [] [] | 22
+- gpe-filemanager | [] [] | 7
+- gpe-go | [] [] [] [] | 19
+- gpe-login | [] [] [] [] [] | 21
+- gpe-ownerinfo | [] [] [] [] | 21
+- gpe-package | [] | 6
+- gpe-sketchbook | [] [] | 16
+- gpe-su | [] [] [] [] | 21
+- gpe-taskmanager | [] [] [] [] | 21
+- gpe-timesheet | [] [] [] [] | 18
+- gpe-today | [] [] [] [] [] | 21
+- gpe-todo | [] [] | 8
+- gphoto2 | [] [] [] [] | 21
+- gprof | [] [] | 13
+- gpsdrive | [] | 5
+- gramadoir | [] | 7
+- grep | [] | 12
+- gretl | | 6
+- gsasl | [] [] [] | 9
+- gss | [] | 7
+- gst-plugins-bad | [] [] [] | 13
+- gst-plugins-base | [] [] | 11
+- gst-plugins-good | [] [] [] [] [] | 16
+- gst-plugins-ugly | [] [] [] | 13
+- gstreamer | [] [] [] | 18
+- gtick | [] [] | 7
+- gtkam | [] | 16
+- gtkorphan | [] | 7
+- gtkspell | [] [] [] [] [] [] | 27
+- gutenprint | | 4
+- hello | [] [] [] [] [] | 38
+- herrie | [] [] | 8
+- hylafax | | 0
+- idutils | [] [] | 15
+- indent | [] [] [] [] [] | 28
+- iso_15924 | [] [] | 4
+- iso_3166 | [] [] [] [] [] [] [] [] [] | 54
+- iso_3166_2 | [] [] | 4
+- iso_4217 | [] [] [] [] [] | 24
+- iso_639 | [] [] [] [] [] | 26
+- jpilot | [] [] [] [] | 7
+- jtag | [] | 3
+- jwhois | [] [] [] | 13
+- kbd | [] [] [] | 13
+- keytouch | [] | 8
+- keytouch-editor | [] | 5
+- keytouch-keyboa... | [] | 5
+- latrine | [] [] | 5
+- ld | [] [] [] [] | 10
+- leafpad | [] [] [] [] [] | 24
+- libc | [] [] [] | 19
+- libexif | [] | 5
+- libextractor | [] | 5
+- libgpewidget | [] [] [] | 20
+- libgpg-error | [] | 6
+- libgphoto2 | [] [] | 9
+- libgphoto2_port | [] [] [] | 11
+- libgsasl | [] | 8
+- libiconv | [] [] | 11
+- libidn | [] [] | 11
+- lifelines | | 4
+- lilypond | [] | 6
+- lingoteach | [] | 6
+- lprng | [] | 2
+- lynx | [] [] [] | 15
+- m4 | [] [] [] | 18
+- mailfromd | [] [] | 3
+- mailutils | [] [] | 8
+- make | [] [] [] | 20
+- man-db | [] | 9
+- minicom | [] | 14
+- nano | [] [] [] | 20
+- opcodes | [] [] | 10
+- parted | [] [] [] | 11
+- pilot-qof | [] | 1
+- popt | [] [] [] [] | 18
+- psmisc | [] [] | 10
+- pwdutils | [] | 3
+- qof | [] | 4
+- radius | [] [] | 7
+- recode | [] [] [] | 25
+- rpm | [] [] [] [] | 13
+- screem | [] | 2
+- scrollkeeper | [] [] [] [] | 26
+- sed | [] [] [] [] | 23
+- shared-mime-info | [] [] [] | 29
+- sharutils | [] [] [] | 23
+- shishi | [] | 3
+- skencil | [] | 7
+- solfege | [] | 3
+- soundtracker | [] [] | 9
+- sp | [] | 3
+- system-tools-ba... | [] [] [] [] [] [] [] | 38
+- tar | [] [] [] | 17
+- texinfo | [] [] [] | 15
+- tin | | 1
+- tuxpaint | [] [] [] | 19
+- unicode-han-tra... | | 0
+- unicode-transla... | | 2
+- util-linux | [] [] [] | 20
+- util-linux-ng | [] [] [] | 20
+- vorbis-tools | [] [] | 4
+- wastesedge | | 1
+- wdiff | [] [] | 23
+- wget | [] [] [] | 20
+- xchat | [] [] [] [] | 29
+- xkeyboard-config | [] [] [] | 14
+- xpad | [] [] [] | 15
+- +---------------------------------------------------+
+- 76 teams tg th tk tr uk ven vi wa xh zh_CN zh_HK zh_TW zu
+- 163 domains 0 3 1 74 51 0 143 21 1 57 7 45 0 2036
+-
+- Some counters in the preceding matrix are higher than the number of
+-visible blocks let us expect. This is because a few extra PO files are
+-used for implementing regional variants of languages, or language
+-dialects.
+-
+- For a PO file in the matrix above to be effective, the package to
+-which it applies should also have been internationalized and
+-distributed as such by its maintainer. There might be an observable
+-lag between the mere existence a PO file and its wide availability in a
+-distribution.
+-
+- If November 2007 seems to be old, you may fetch a more recent copy
+-of this `ABOUT-NLS' file on most GNU archive sites. The most
+-up-to-date matrix with full percentage details can be found at
+-`http://translationproject.org/extra/matrix.html'.
+-
+-1.6 Using `gettext' in new packages
+-===================================
+-
+-If you are writing a freely available program and want to
+-internationalize it you are welcome to use GNU `gettext' in your
+-package. Of course you have to respect the GNU Library General Public
+-License which covers the use of the GNU `gettext' library. This means
+-in particular that even non-free programs can use `libintl' as a shared
+-library, whereas only free software can use `libintl' as a static
+-library or use modified versions of `libintl'.
+-
+- Once the sources are changed appropriately and the setup can handle
+-the use of `gettext' the only thing missing are the translations. The
+-Free Translation Project is also available for packages which are not
+-developed inside the GNU project. Therefore the information given above
+-applies also for every other Free Software Project. Contact
+-`coordinator@translationproject.org' to make the `.pot' files available
+-to the translation teams.
+-
++<https://www.gnu.org/software/gettext/manual/html_node/Users.html>
+--- a/ChangeLog
++++ b/ChangeLog
+@@ -1,3 +1,10 @@
++2019-12-07 gettextize <bug-gnu-gettext@gnu.org>
++
++ * m4/intlmacosx.m4: Upgrade to gettext-0.20.1.
++ * Makefile.am (SUBDIRS): Remove intl.
++ * configure.ac (AC_CONFIG_FILES): Remove intl/Makefile.
++ (AM_GNU_GETTEXT_VERSION): Bump to 0.20.
++
+ 2013-03-13 Steve Langasek <steve.langasek@ubuntu.com>
+
+ * nih/watch.c (nih_watch_walk_filter): New NihFileFilter function
+--- a/Makefile.am
++++ b/Makefile.am
+@@ -1,6 +1,6 @@
+ ## Process this file with automake to produce Makefile.in
+
+-SUBDIRS = m4 intl nih nih-dbus nih-dbus-tool po
++SUBDIRS = m4 nih nih-dbus nih-dbus-tool po
+
+ EXTRA_DIST = HACKING
+
+--- a/configure.ac
++++ b/configure.ac
+@@ -15,8 +15,8 @@ AM_MAINTAINER_MODE([enable])
+ LT_PREREQ(2.2.4)
+ LT_INIT
+
+-AM_GNU_GETTEXT_VERSION([0.17])
+-AM_GNU_GETTEXT()
++AM_GNU_GETTEXT_VERSION([0.20])
++AM_GNU_GETTEXT([external])
+
+ # Checks for programs.
+ AC_PROG_CC
+@@ -58,7 +58,7 @@ AS_IF([test "$cross_compiling" = "yes"],
+ AC_SUBST([NIH_DBUS_TOOL], ["\${top_builddir}/nih-dbus-tool/nih-dbus-tool"])])],
+ [AC_SUBST([NIH_DBUS_TOOL], ["\${top_builddir}/nih-dbus-tool/nih-dbus-tool"])])
+
+-AC_CONFIG_FILES([ Makefile m4/Makefile intl/Makefile
++AC_CONFIG_FILES([ Makefile m4/Makefile
+ nih/Makefile nih/libnih.pc
+ nih-dbus/Makefile nih-dbus/libnih-dbus.pc
+ nih-dbus-tool/Makefile
+--- a/intl/ChangeLog
++++ /dev/null
+@@ -1,4 +0,0 @@
+-2007-11-07 GNU <bug-gnu-gettext@gnu.org>
+-
+- * Version 0.17 released.
+-
+--- a/intl/Makefile.in
++++ /dev/null
+@@ -1,587 +0,0 @@
+-# Makefile for directory with message catalog handling library of GNU gettext
+-# Copyright (C) 1995-1998, 2000-2007 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.
+-
+-PACKAGE = @PACKAGE@
+-VERSION = @VERSION@
+-
+-SHELL = /bin/sh
+-
+-srcdir = @srcdir@
+-top_srcdir = @top_srcdir@
+-top_builddir = ..
+-
+-# The VPATH variables allows builds with $builddir != $srcdir, assuming a
+-# 'make' program that supports VPATH (such as GNU make). This line is removed
+-# by autoconf automatically when "$(srcdir)" = ".".
+-# In this directory, the VPATH handling is particular:
+-# 1. If INTL_LIBTOOL_SUFFIX_PREFIX is 'l' (indicating a build with libtool),
+-# the .c -> .lo rules carefully use $(srcdir), so that VPATH can be omitted.
+-# 2. If PACKAGE = gettext-tools, VPATH _must_ be omitted, because otherwise
+-# 'make' does the wrong thing if GNU gettext was configured with
+-# "./configure --srcdir=`pwd`", namely it gets confused by the .lo and .la
+-# files it finds in srcdir = ../../gettext-runtime/intl.
+-VPATH = $(srcdir)
+-
+-prefix = @prefix@
+-exec_prefix = @exec_prefix@
+-transform = @program_transform_name@
+-libdir = @libdir@
+-includedir = @includedir@
+-datarootdir = @datarootdir@
+-datadir = @datadir@
+-localedir = $(datadir)/locale
+-gettextsrcdir = $(datadir)/gettext/intl
+-aliaspath = $(localedir)
+-subdir = intl
+-
+-INSTALL = @INSTALL@
+-INSTALL_DATA = @INSTALL_DATA@
+-
+-# We use $(mkdir_p).
+-# In automake <= 1.9.x, $(mkdir_p) is defined either as "mkdir -p --" or as
+-# "$(mkinstalldirs)" or as "$(install_sh) -d". For these automake versions,
+-# @install_sh@ does not start with $(SHELL), so we add it.
+-# In automake >= 1.10, @mkdir_p@ is derived from ${MKDIR_P}, which is defined
+-# either as "/path/to/mkdir -p" or ".../install-sh -c -d". For these automake
+-# versions, $(mkinstalldirs) and $(install_sh) are unused.
+-mkinstalldirs = $(SHELL) @install_sh@ -d
+-install_sh = $(SHELL) @install_sh@
+-MKDIR_P = @MKDIR_P@
+-mkdir_p = @mkdir_p@
+-
+-l = @INTL_LIBTOOL_SUFFIX_PREFIX@
+-
+-AR = ar
+-CC = @CC@
+-LIBTOOL = @LIBTOOL@
+-RANLIB = @RANLIB@
+-YACC = @INTLBISON@ -y -d
+-YFLAGS = --name-prefix=__gettext
+-WINDRES = @WINDRES@
+-
+-# -DBUILDING_LIBINTL: Change expansion of LIBINTL_DLL_EXPORTED macro.
+-# -DBUILDING_DLL: Change expansion of RELOCATABLE_DLL_EXPORTED macro.
+-DEFS = -DLOCALEDIR=\"$(localedir)\" -DLOCALE_ALIAS_PATH=\"$(aliaspath)\" \
+--DLIBDIR=\"$(libdir)\" -DBUILDING_LIBINTL -DBUILDING_DLL -DIN_LIBINTL \
+--DENABLE_RELOCATABLE=1 -DIN_LIBRARY -DINSTALLDIR=\"$(libdir)\" -DNO_XMALLOC \
+--Dset_relocation_prefix=libintl_set_relocation_prefix \
+--Drelocate=libintl_relocate \
+--DDEPENDS_ON_LIBICONV=1 @DEFS@
+-CPPFLAGS = @CPPFLAGS@
+-CFLAGS = @CFLAGS@ @CFLAG_VISIBILITY@
+-LDFLAGS = @LDFLAGS@ $(LDFLAGS_@WOE32DLL@)
+-LDFLAGS_yes = -Wl,--export-all-symbols
+-LDFLAGS_no =
+-LIBS = @LIBS@
+-
+-COMPILE = $(CC) -c $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) $(XCFLAGS)
+-
+-HEADERS = \
+- gmo.h \
+- gettextP.h \
+- hash-string.h \
+- loadinfo.h \
+- plural-exp.h \
+- eval-plural.h \
+- localcharset.h \
+- lock.h \
+- relocatable.h \
+- tsearch.h tsearch.c \
+- xsize.h \
+- printf-args.h printf-args.c \
+- printf-parse.h wprintf-parse.h printf-parse.c \
+- vasnprintf.h vasnwprintf.h vasnprintf.c \
+- os2compat.h \
+- libgnuintl.h.in
+-SOURCES = \
+- bindtextdom.c \
+- dcgettext.c \
+- dgettext.c \
+- gettext.c \
+- finddomain.c \
+- hash-string.c \
+- loadmsgcat.c \
+- localealias.c \
+- textdomain.c \
+- l10nflist.c \
+- explodename.c \
+- dcigettext.c \
+- dcngettext.c \
+- dngettext.c \
+- ngettext.c \
+- plural.y \
+- plural-exp.c \
+- localcharset.c \
+- lock.c \
+- relocatable.c \
+- langprefs.c \
+- localename.c \
+- log.c \
+- printf.c \
+- version.c \
+- osdep.c \
+- os2compat.c \
+- intl-exports.c \
+- intl-compat.c
+-OBJECTS = \
+- bindtextdom.$lo \
+- dcgettext.$lo \
+- dgettext.$lo \
+- gettext.$lo \
+- finddomain.$lo \
+- hash-string.$lo \
+- loadmsgcat.$lo \
+- localealias.$lo \
+- textdomain.$lo \
+- l10nflist.$lo \
+- explodename.$lo \
+- dcigettext.$lo \
+- dcngettext.$lo \
+- dngettext.$lo \
+- ngettext.$lo \
+- plural.$lo \
+- plural-exp.$lo \
+- localcharset.$lo \
+- lock.$lo \
+- relocatable.$lo \
+- langprefs.$lo \
+- localename.$lo \
+- log.$lo \
+- printf.$lo \
+- version.$lo \
+- osdep.$lo \
+- intl-compat.$lo
+-OBJECTS_RES_yes = libintl.res
+-OBJECTS_RES_no =
+-DISTFILES.common = Makefile.in \
+-config.charset locale.alias ref-add.sin ref-del.sin export.h libintl.rc \
+-$(HEADERS) $(SOURCES)
+-DISTFILES.generated = plural.c
+-DISTFILES.normal = VERSION
+-DISTFILES.gettext = COPYING.LIB-2.0 COPYING.LIB-2.1 libintl.glibc README.woe32
+-DISTFILES.obsolete = xopen-msg.sed linux-msg.sed po2tbl.sed.in cat-compat.c \
+-COPYING.LIB-2 gettext.h libgettext.h plural-eval.c libgnuintl.h \
+-libgnuintl.h_vms Makefile.vms libgnuintl.h.msvc-static \
+-libgnuintl.h.msvc-shared Makefile.msvc
+-
+-all: all-@USE_INCLUDED_LIBINTL@
+-all-yes: libintl.$la libintl.h charset.alias ref-add.sed ref-del.sed
+-all-no: all-no-@BUILD_INCLUDED_LIBINTL@
+-all-no-yes: libgnuintl.$la
+-all-no-no:
+-
+-libintl.a libgnuintl.a: $(OBJECTS)
+- rm -f $@
+- $(AR) cru $@ $(OBJECTS)
+- $(RANLIB) $@
+-
+-libintl.la libgnuintl.la: $(OBJECTS) $(OBJECTS_RES_@WOE32@)
+- $(LIBTOOL) --mode=link \
+- $(CC) $(CPPFLAGS) $(CFLAGS) $(XCFLAGS) $(LDFLAGS) -o $@ \
+- $(OBJECTS) @LTLIBICONV@ @INTL_MACOSX_LIBS@ $(LIBS) @LTLIBTHREAD@ @LTLIBC@ \
+- $(OBJECTS_RES_@WOE32@) \
+- -version-info $(LTV_CURRENT):$(LTV_REVISION):$(LTV_AGE) \
+- -rpath $(libdir) \
+- -no-undefined
+-
+-# Libtool's library version information for libintl.
+-# Before making a gettext release, the gettext maintainer must change this
+-# according to the libtool documentation, section "Library interface versions".
+-# Maintainers of other packages that include the intl directory must *not*
+-# change these values.
+-LTV_CURRENT=8
+-LTV_REVISION=2
+-LTV_AGE=0
+-
+-.SUFFIXES:
+-.SUFFIXES: .c .y .o .lo .sin .sed
+-
+-.c.o:
+- $(COMPILE) $<
+-
+-.y.c:
+- $(YACC) $(YFLAGS) --output $@ $<
+- rm -f $*.h
+-
+-bindtextdom.lo: $(srcdir)/bindtextdom.c
+- $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/bindtextdom.c
+-dcgettext.lo: $(srcdir)/dcgettext.c
+- $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/dcgettext.c
+-dgettext.lo: $(srcdir)/dgettext.c
+- $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/dgettext.c
+-gettext.lo: $(srcdir)/gettext.c
+- $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/gettext.c
+-finddomain.lo: $(srcdir)/finddomain.c
+- $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/finddomain.c
+-hash-string.lo: $(srcdir)/hash-string.c
+- $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/hash-string.c
+-loadmsgcat.lo: $(srcdir)/loadmsgcat.c
+- $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/loadmsgcat.c
+-localealias.lo: $(srcdir)/localealias.c
+- $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/localealias.c
+-textdomain.lo: $(srcdir)/textdomain.c
+- $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/textdomain.c
+-l10nflist.lo: $(srcdir)/l10nflist.c
+- $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/l10nflist.c
+-explodename.lo: $(srcdir)/explodename.c
+- $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/explodename.c
+-dcigettext.lo: $(srcdir)/dcigettext.c
+- $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/dcigettext.c
+-dcngettext.lo: $(srcdir)/dcngettext.c
+- $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/dcngettext.c
+-dngettext.lo: $(srcdir)/dngettext.c
+- $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/dngettext.c
+-ngettext.lo: $(srcdir)/ngettext.c
+- $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/ngettext.c
+-plural.lo: $(srcdir)/plural.c
+- $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/plural.c
+-plural-exp.lo: $(srcdir)/plural-exp.c
+- $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/plural-exp.c
+-localcharset.lo: $(srcdir)/localcharset.c
+- $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/localcharset.c
+-lock.lo: $(srcdir)/lock.c
+- $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/lock.c
+-relocatable.lo: $(srcdir)/relocatable.c
+- $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/relocatable.c
+-langprefs.lo: $(srcdir)/langprefs.c
+- $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/langprefs.c
+-localename.lo: $(srcdir)/localename.c
+- $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/localename.c
+-log.lo: $(srcdir)/log.c
+- $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/log.c
+-printf.lo: $(srcdir)/printf.c
+- $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/printf.c
+-version.lo: $(srcdir)/version.c
+- $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/version.c
+-osdep.lo: $(srcdir)/osdep.c
+- $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/osdep.c
+-intl-compat.lo: $(srcdir)/intl-compat.c
+- $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/intl-compat.c
+-
+-# This rule is executed only on Woe32 systems.
+-# The following sed expressions come from the windres-options script. They are
+-# inlined here, so that they can be written in a Makefile without requiring a
+-# temporary file. They must contain literal newlines rather than semicolons,
+-# so that they work with the sed-3.02 that is shipped with MSYS. We can use
+-# GNU bash's $'\n' syntax to obtain such a newline.
+-libintl.res: $(srcdir)/libintl.rc
+- nl=$$'\n'; \
+- sed_extract_major='/^[0-9]/{'$${nl}'s/^\([0-9]*\).*/\1/p'$${nl}q$${nl}'}'$${nl}'c\'$${nl}0$${nl}q; \
+- sed_extract_minor='/^[0-9][0-9]*[.][0-9]/{'$${nl}'s/^[0-9]*[.]\([0-9]*\).*/\1/p'$${nl}q$${nl}'}'$${nl}'c\'$${nl}0$${nl}q; \
+- sed_extract_subminor='/^[0-9][0-9]*[.][0-9][0-9]*[.][0-9]/{'$${nl}'s/^[0-9]*[.][0-9]*[.]\([0-9]*\).*/\1/p'$${nl}q$${nl}'}'$${nl}'c\'$${nl}0$${nl}q; \
+- $(WINDRES) \
+- "-DPACKAGE_VERSION_STRING=\\\"$(VERSION)\\\"" \
+- "-DPACKAGE_VERSION_MAJOR="`echo '$(VERSION)' | sed -n -e "$$sed_extract_major"` \
+- "-DPACKAGE_VERSION_MINOR="`echo '$(VERSION)' | sed -n -e "$$sed_extract_minor"` \
+- "-DPACKAGE_VERSION_SUBMINOR="`echo '$(VERSION)' | sed -n -e "$$sed_extract_subminor"` \
+- -i $(srcdir)/libintl.rc -o libintl.res --output-format=coff
+-
+-ref-add.sed: $(srcdir)/ref-add.sin
+- sed -e '/^#/d' -e 's/@''PACKAGE''@/@PACKAGE@/g' $(srcdir)/ref-add.sin > t-ref-add.sed
+- mv t-ref-add.sed ref-add.sed
+-ref-del.sed: $(srcdir)/ref-del.sin
+- sed -e '/^#/d' -e 's/@''PACKAGE''@/@PACKAGE@/g' $(srcdir)/ref-del.sin > t-ref-del.sed
+- mv t-ref-del.sed ref-del.sed
+-
+-INCLUDES = -I. -I$(srcdir) -I..
+-
+-libgnuintl.h: $(srcdir)/libgnuintl.h.in
+- sed -e '/IN_LIBGLOCALE/d' \
+- -e 's,@''HAVE_POSIX_PRINTF''@,@HAVE_POSIX_PRINTF@,g' \
+- -e 's,@''HAVE_ASPRINTF''@,@HAVE_ASPRINTF@,g' \
+- -e 's,@''HAVE_SNPRINTF''@,@HAVE_SNPRINTF@,g' \
+- -e 's,@''HAVE_WPRINTF''@,@HAVE_WPRINTF@,g' \
+- < $(srcdir)/libgnuintl.h.in \
+- | if test '@WOE32DLL@' = yes; then \
+- sed -e 's/extern \([^()]*\);/extern __declspec (dllimport) \1;/'; \
+- else \
+- cat; \
+- fi \
+- | sed -e 's/extern \([^"]\)/extern LIBINTL_DLL_EXPORTED \1/' \
+- -e "/#define _LIBINTL_H/r $(srcdir)/export.h" \
+- | sed -e 's,@''HAVE_VISIBILITY''@,@HAVE_VISIBILITY@,g' \
+- > libgnuintl.h
+-
+-libintl.h: $(srcdir)/libgnuintl.h.in
+- sed -e '/IN_LIBGLOCALE/d' \
+- -e 's,@''HAVE_POSIX_PRINTF''@,@HAVE_POSIX_PRINTF@,g' \
+- -e 's,@''HAVE_ASPRINTF''@,@HAVE_ASPRINTF@,g' \
+- -e 's,@''HAVE_SNPRINTF''@,@HAVE_SNPRINTF@,g' \
+- -e 's,@''HAVE_WPRINTF''@,@HAVE_WPRINTF@,g' \
+- < $(srcdir)/libgnuintl.h.in > libintl.h
+-
+-charset.alias: $(srcdir)/config.charset
+- $(SHELL) $(srcdir)/config.charset '@host@' > t-$@
+- mv t-$@ $@
+-
+-check: all
+-
+-# We must not install the libintl.h/libintl.a files if we are on a
+-# system which has the GNU gettext() function in its C library or in a
+-# separate library.
+-# If you want to use the one which comes with this version of the
+-# package, you have to use `configure --with-included-gettext'.
+-install: install-exec install-data
+-install-exec: all
+- if { test "$(PACKAGE)" = "gettext-runtime" || test "$(PACKAGE)" = "gettext-tools"; } \
+- && test '@USE_INCLUDED_LIBINTL@' = yes; then \
+- $(mkdir_p) $(DESTDIR)$(libdir) $(DESTDIR)$(includedir); \
+- $(INSTALL_DATA) libintl.h $(DESTDIR)$(includedir)/libintl.h; \
+- $(LIBTOOL) --mode=install \
+- $(INSTALL_DATA) libintl.$la $(DESTDIR)$(libdir)/libintl.$la; \
+- if test "@RELOCATABLE@" = yes; then \
+- dependencies=`sed -n -e 's,^dependency_libs=\(.*\),\1,p' < $(DESTDIR)$(libdir)/libintl.la | sed -e "s,^',," -e "s,'\$$,,"`; \
+- if test -n "$$dependencies"; then \
+- rm -f $(DESTDIR)$(libdir)/libintl.la; \
+- fi; \
+- fi; \
+- else \
+- : ; \
+- fi
+- if test "$(PACKAGE)" = "gettext-tools" \
+- && test '@USE_INCLUDED_LIBINTL@' = no \
+- && test @GLIBC2@ != no; then \
+- $(mkdir_p) $(DESTDIR)$(libdir); \
+- $(LIBTOOL) --mode=install \
+- $(INSTALL_DATA) libgnuintl.$la $(DESTDIR)$(libdir)/libgnuintl.$la; \
+- rm -f $(DESTDIR)$(libdir)/preloadable_libintl.so; \
+- $(INSTALL_DATA) $(DESTDIR)$(libdir)/libgnuintl.so $(DESTDIR)$(libdir)/preloadable_libintl.so; \
+- $(LIBTOOL) --mode=uninstall \
+- rm -f $(DESTDIR)$(libdir)/libgnuintl.$la; \
+- else \
+- : ; \
+- fi
+- if test '@USE_INCLUDED_LIBINTL@' = yes; then \
+- test @GLIBC21@ != no || $(mkdir_p) $(DESTDIR)$(libdir); \
+- temp=$(DESTDIR)$(libdir)/t-charset.alias; \
+- dest=$(DESTDIR)$(libdir)/charset.alias; \
+- if test -f $(DESTDIR)$(libdir)/charset.alias; then \
+- orig=$(DESTDIR)$(libdir)/charset.alias; \
+- sed -f ref-add.sed $$orig > $$temp; \
+- $(INSTALL_DATA) $$temp $$dest; \
+- rm -f $$temp; \
+- else \
+- if test @GLIBC21@ = no; then \
+- orig=charset.alias; \
+- sed -f ref-add.sed $$orig > $$temp; \
+- $(INSTALL_DATA) $$temp $$dest; \
+- rm -f $$temp; \
+- fi; \
+- fi; \
+- $(mkdir_p) $(DESTDIR)$(localedir); \
+- test -f $(DESTDIR)$(localedir)/locale.alias \
+- && orig=$(DESTDIR)$(localedir)/locale.alias \
+- || orig=$(srcdir)/locale.alias; \
+- temp=$(DESTDIR)$(localedir)/t-locale.alias; \
+- dest=$(DESTDIR)$(localedir)/locale.alias; \
+- sed -f ref-add.sed $$orig > $$temp; \
+- $(INSTALL_DATA) $$temp $$dest; \
+- rm -f $$temp; \
+- else \
+- : ; \
+- fi
+-install-data: all
+- if test "$(PACKAGE)" = "gettext-tools"; then \
+- $(mkdir_p) $(DESTDIR)$(gettextsrcdir); \
+- $(INSTALL_DATA) VERSION $(DESTDIR)$(gettextsrcdir)/VERSION; \
+- $(INSTALL_DATA) ChangeLog.inst $(DESTDIR)$(gettextsrcdir)/ChangeLog; \
+- dists="COPYING.LIB-2.0 COPYING.LIB-2.1 $(DISTFILES.common)"; \
+- for file in $$dists; do \
+- $(INSTALL_DATA) $(srcdir)/$$file \
+- $(DESTDIR)$(gettextsrcdir)/$$file; \
+- done; \
+- chmod a+x $(DESTDIR)$(gettextsrcdir)/config.charset; \
+- dists="$(DISTFILES.generated)"; \
+- for file in $$dists; do \
+- if test -f $$file; then dir=.; else dir=$(srcdir); fi; \
+- $(INSTALL_DATA) $$dir/$$file \
+- $(DESTDIR)$(gettextsrcdir)/$$file; \
+- done; \
+- dists="$(DISTFILES.obsolete)"; \
+- for file in $$dists; do \
+- rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \
+- done; \
+- else \
+- : ; \
+- fi
+-
+-install-strip: install
+-
+-install-dvi install-html install-info install-ps install-pdf:
+-
+-installdirs:
+- if { test "$(PACKAGE)" = "gettext-runtime" || test "$(PACKAGE)" = "gettext-tools"; } \
+- && test '@USE_INCLUDED_LIBINTL@' = yes; then \
+- $(mkdir_p) $(DESTDIR)$(libdir) $(DESTDIR)$(includedir); \
+- else \
+- : ; \
+- fi
+- if test "$(PACKAGE)" = "gettext-tools" \
+- && test '@USE_INCLUDED_LIBINTL@' = no \
+- && test @GLIBC2@ != no; then \
+- $(mkdir_p) $(DESTDIR)$(libdir); \
+- else \
+- : ; \
+- fi
+- if test '@USE_INCLUDED_LIBINTL@' = yes; then \
+- test @GLIBC21@ != no || $(mkdir_p) $(DESTDIR)$(libdir); \
+- $(mkdir_p) $(DESTDIR)$(localedir); \
+- else \
+- : ; \
+- fi
+- if test "$(PACKAGE)" = "gettext-tools"; then \
+- $(mkdir_p) $(DESTDIR)$(gettextsrcdir); \
+- else \
+- : ; \
+- fi
+-
+-# Define this as empty until I found a useful application.
+-installcheck:
+-
+-uninstall:
+- if { test "$(PACKAGE)" = "gettext-runtime" || test "$(PACKAGE)" = "gettext-tools"; } \
+- && test '@USE_INCLUDED_LIBINTL@' = yes; then \
+- rm -f $(DESTDIR)$(includedir)/libintl.h; \
+- $(LIBTOOL) --mode=uninstall \
+- rm -f $(DESTDIR)$(libdir)/libintl.$la; \
+- else \
+- : ; \
+- fi
+- if test "$(PACKAGE)" = "gettext-tools" \
+- && test '@USE_INCLUDED_LIBINTL@' = no \
+- && test @GLIBC2@ != no; then \
+- rm -f $(DESTDIR)$(libdir)/preloadable_libintl.so; \
+- else \
+- : ; \
+- fi
+- if test '@USE_INCLUDED_LIBINTL@' = yes; then \
+- if test -f $(DESTDIR)$(libdir)/charset.alias; then \
+- temp=$(DESTDIR)$(libdir)/t-charset.alias; \
+- dest=$(DESTDIR)$(libdir)/charset.alias; \
+- sed -f ref-del.sed $$dest > $$temp; \
+- if grep '^# Packages using this file: $$' $$temp > /dev/null; then \
+- rm -f $$dest; \
+- else \
+- $(INSTALL_DATA) $$temp $$dest; \
+- fi; \
+- rm -f $$temp; \
+- fi; \
+- if test -f $(DESTDIR)$(localedir)/locale.alias; then \
+- temp=$(DESTDIR)$(localedir)/t-locale.alias; \
+- dest=$(DESTDIR)$(localedir)/locale.alias; \
+- sed -f ref-del.sed $$dest > $$temp; \
+- if grep '^# Packages using this file: $$' $$temp > /dev/null; then \
+- rm -f $$dest; \
+- else \
+- $(INSTALL_DATA) $$temp $$dest; \
+- fi; \
+- rm -f $$temp; \
+- fi; \
+- else \
+- : ; \
+- fi
+- if test "$(PACKAGE)" = "gettext-tools"; then \
+- for file in VERSION ChangeLog COPYING.LIB-2.0 COPYING.LIB-2.1 $(DISTFILES.common) $(DISTFILES.generated); do \
+- rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \
+- done; \
+- else \
+- : ; \
+- fi
+-
+-info dvi ps pdf html:
+-
+-$(OBJECTS): ../config.h libgnuintl.h
+-bindtextdom.$lo dcgettext.$lo dcigettext.$lo dcngettext.$lo dgettext.$lo dngettext.$lo finddomain.$lo gettext.$lo intl-compat.$lo loadmsgcat.$lo localealias.$lo ngettext.$lo textdomain.$lo: $(srcdir)/gettextP.h $(srcdir)/gmo.h $(srcdir)/loadinfo.h
+-hash-string.$lo dcigettext.$lo loadmsgcat.$lo: $(srcdir)/hash-string.h
+-explodename.$lo l10nflist.$lo: $(srcdir)/loadinfo.h
+-dcigettext.$lo loadmsgcat.$lo plural.$lo plural-exp.$lo: $(srcdir)/plural-exp.h
+-dcigettext.$lo: $(srcdir)/eval-plural.h
+-localcharset.$lo: $(srcdir)/localcharset.h
+-bindtextdom.$lo dcigettext.$lo finddomain.$lo loadmsgcat.$lo localealias.$lo lock.$lo log.$lo: $(srcdir)/lock.h
+-localealias.$lo localcharset.$lo relocatable.$lo: $(srcdir)/relocatable.h
+-printf.$lo: $(srcdir)/printf-args.h $(srcdir)/printf-args.c $(srcdir)/printf-parse.h $(srcdir)/wprintf-parse.h $(srcdir)/xsize.h $(srcdir)/printf-parse.c $(srcdir)/vasnprintf.h $(srcdir)/vasnwprintf.h $(srcdir)/vasnprintf.c
+-
+-# A bison-2.1 generated plural.c includes <libintl.h> if ENABLE_NLS.
+-PLURAL_DEPS_yes = libintl.h
+-PLURAL_DEPS_no =
+-plural.$lo: $(PLURAL_DEPS_@USE_INCLUDED_LIBINTL@)
+-
+-tags: TAGS
+-
+-TAGS: $(HEADERS) $(SOURCES)
+- here=`pwd`; cd $(srcdir) && etags -o $$here/TAGS $(HEADERS) $(SOURCES)
+-
+-ctags: CTAGS
+-
+-CTAGS: $(HEADERS) $(SOURCES)
+- here=`pwd`; cd $(srcdir) && ctags -o $$here/CTAGS $(HEADERS) $(SOURCES)
+-
+-id: ID
+-
+-ID: $(HEADERS) $(SOURCES)
+- here=`pwd`; cd $(srcdir) && mkid -f$$here/ID $(HEADERS) $(SOURCES)
+-
+-
+-mostlyclean:
+- rm -f *.a *.la *.o *.obj *.lo libintl.res core core.*
+- rm -f libgnuintl.h libintl.h charset.alias ref-add.sed ref-del.sed
+- rm -f -r .libs _libs
+-
+-clean: mostlyclean
+-
+-distclean: clean
+- rm -f Makefile ID TAGS
+- if test "$(PACKAGE)" = "gettext-runtime" || test "$(PACKAGE)" = "gettext-tools"; then \
+- rm -f ChangeLog.inst $(DISTFILES.normal); \
+- else \
+- : ; \
+- fi
+-
+-maintainer-clean: distclean
+- @echo "This command is intended for maintainers to use;"
+- @echo "it deletes files that may require special tools to rebuild."
+-
+-
+-# GNU gettext needs not contain the file `VERSION' but contains some
+-# other files which should not be distributed in other packages.
+-distdir = ../$(PACKAGE)-$(VERSION)/$(subdir)
+-dist distdir: Makefile
+- if test "$(PACKAGE)" = "gettext-tools"; then \
+- : ; \
+- else \
+- if test "$(PACKAGE)" = "gettext-runtime"; then \
+- additional="$(DISTFILES.gettext)"; \
+- else \
+- additional="$(DISTFILES.normal)"; \
+- fi; \
+- $(MAKE) $(DISTFILES.common) $(DISTFILES.generated) $$additional; \
+- for file in ChangeLog $(DISTFILES.common) $(DISTFILES.generated) $$additional; do \
+- if test -f $$file; then dir=.; else dir=$(srcdir); fi; \
+- cp -p $$dir/$$file $(distdir) || test $$file = Makefile.in || exit 1; \
+- done; \
+- fi
+-
+-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+- cd $(top_builddir) && $(SHELL) ./config.status
+-# This would be more efficient, but doesn't work any more with autoconf-2.57,
+-# when AC_CONFIG_FILES([intl/Makefile:somedir/Makefile.in]) is used.
+-# cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+-
+-# Tell versions [3.59,3.63) of GNU make not to export all variables.
+-# Otherwise a system limit (for SysV at least) may be exceeded.
+-.NOEXPORT:
+--- a/intl/VERSION
++++ /dev/null
+@@ -1 +0,0 @@
+-GNU gettext library from gettext-0.17
+--- a/intl/bindtextdom.c
++++ /dev/null
+@@ -1,340 +0,0 @@
+-/* Implementation of the bindtextdomain(3) function
+- Copyright (C) 1995-1998, 2000-2003, 2005-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. */
+-
+-#ifdef HAVE_CONFIG_H
+-# include <config.h>
+-#endif
+-
+-#include <stddef.h>
+-#include <stdlib.h>
+-#include <string.h>
+-
+-#include "gettextP.h"
+-#ifdef _LIBC
+-# include <libintl.h>
+-#else
+-# include "libgnuintl.h"
+-#endif
+-
+-/* Handle multi-threaded applications. */
+-#ifdef _LIBC
+-# include <bits/libc-lock.h>
+-# define gl_rwlock_define __libc_rwlock_define
+-# define gl_rwlock_wrlock __libc_rwlock_wrlock
+-# define gl_rwlock_unlock __libc_rwlock_unlock
+-#else
+-# include "lock.h"
+-#endif
+-
+-/* Some compilers, like SunOS4 cc, don't have offsetof in <stddef.h>. */
+-#ifndef offsetof
+-# define offsetof(type,ident) ((size_t)&(((type*)0)->ident))
+-#endif
+-
+-/* @@ end of prolog @@ */
+-
+-/* Lock variable to protect the global data in the gettext implementation. */
+-gl_rwlock_define (extern, _nl_state_lock attribute_hidden)
+-
+-
+-/* Names for the libintl functions are a problem. They must not clash
+- with existing names and they should follow ANSI C. But this source
+- code is also used in GNU C Library where the names have a __
+- prefix. So we have to make a difference here. */
+-#ifdef _LIBC
+-# define BINDTEXTDOMAIN __bindtextdomain
+-# define BIND_TEXTDOMAIN_CODESET __bind_textdomain_codeset
+-# ifndef strdup
+-# define strdup(str) __strdup (str)
+-# endif
+-#else
+-# define BINDTEXTDOMAIN libintl_bindtextdomain
+-# define BIND_TEXTDOMAIN_CODESET libintl_bind_textdomain_codeset
+-#endif
+-
+-/* Specifies the directory name *DIRNAMEP and the output codeset *CODESETP
+- to be used for the DOMAINNAME message catalog.
+- If *DIRNAMEP or *CODESETP is NULL, the corresponding attribute is not
+- modified, only the current value is returned.
+- If DIRNAMEP or CODESETP is NULL, the corresponding attribute is neither
+- modified nor returned. */
+-static void
+-set_binding_values (const char *domainname,
+- const char **dirnamep, const char **codesetp)
+-{
+- struct binding *binding;
+- int modified;
+-
+- /* Some sanity checks. */
+- if (domainname == NULL || domainname[0] == '\0')
+- {
+- if (dirnamep)
+- *dirnamep = NULL;
+- if (codesetp)
+- *codesetp = NULL;
+- return;
+- }
+-
+- gl_rwlock_wrlock (_nl_state_lock);
+-
+- modified = 0;
+-
+- for (binding = _nl_domain_bindings; binding != NULL; binding = binding->next)
+- {
+- int compare = strcmp (domainname, binding->domainname);
+- if (compare == 0)
+- /* We found it! */
+- break;
+- if (compare < 0)
+- {
+- /* It is not in the list. */
+- binding = NULL;
+- break;
+- }
+- }
+-
+- if (binding != NULL)
+- {
+- if (dirnamep)
+- {
+- const char *dirname = *dirnamep;
+-
+- if (dirname == NULL)
+- /* The current binding has be to returned. */
+- *dirnamep = binding->dirname;
+- else
+- {
+- /* The domain is already bound. If the new value and the old
+- one are equal we simply do nothing. Otherwise replace the
+- old binding. */
+- char *result = binding->dirname;
+- if (strcmp (dirname, result) != 0)
+- {
+- if (strcmp (dirname, _nl_default_dirname) == 0)
+- result = (char *) _nl_default_dirname;
+- else
+- {
+-#if defined _LIBC || defined HAVE_STRDUP
+- result = strdup (dirname);
+-#else
+- size_t len = strlen (dirname) + 1;
+- result = (char *) malloc (len);
+- if (__builtin_expect (result != NULL, 1))
+- memcpy (result, dirname, len);
+-#endif
+- }
+-
+- if (__builtin_expect (result != NULL, 1))
+- {
+- if (binding->dirname != _nl_default_dirname)
+- free (binding->dirname);
+-
+- binding->dirname = result;
+- modified = 1;
+- }
+- }
+- *dirnamep = result;
+- }
+- }
+-
+- if (codesetp)
+- {
+- const char *codeset = *codesetp;
+-
+- if (codeset == NULL)
+- /* The current binding has be to returned. */
+- *codesetp = binding->codeset;
+- else
+- {
+- /* The domain is already bound. If the new value and the old
+- one are equal we simply do nothing. Otherwise replace the
+- old binding. */
+- char *result = binding->codeset;
+- if (result == NULL || strcmp (codeset, result) != 0)
+- {
+-#if defined _LIBC || defined HAVE_STRDUP
+- result = strdup (codeset);
+-#else
+- size_t len = strlen (codeset) + 1;
+- result = (char *) malloc (len);
+- if (__builtin_expect (result != NULL, 1))
+- memcpy (result, codeset, len);
+-#endif
+-
+- if (__builtin_expect (result != NULL, 1))
+- {
+- if (binding->codeset != NULL)
+- free (binding->codeset);
+-
+- binding->codeset = result;
+- modified = 1;
+- }
+- }
+- *codesetp = result;
+- }
+- }
+- }
+- else if ((dirnamep == NULL || *dirnamep == NULL)
+- && (codesetp == NULL || *codesetp == NULL))
+- {
+- /* Simply return the default values. */
+- if (dirnamep)
+- *dirnamep = _nl_default_dirname;
+- if (codesetp)
+- *codesetp = NULL;
+- }
+- else
+- {
+- /* We have to create a new binding. */
+- size_t len = strlen (domainname) + 1;
+- struct binding *new_binding =
+- (struct binding *) malloc (offsetof (struct binding, domainname) + len);
+-
+- if (__builtin_expect (new_binding == NULL, 0))
+- goto failed;
+-
+- memcpy (new_binding->domainname, domainname, len);
+-
+- if (dirnamep)
+- {
+- const char *dirname = *dirnamep;
+-
+- if (dirname == NULL)
+- /* The default value. */
+- dirname = _nl_default_dirname;
+- else
+- {
+- if (strcmp (dirname, _nl_default_dirname) == 0)
+- dirname = _nl_default_dirname;
+- else
+- {
+- char *result;
+-#if defined _LIBC || defined HAVE_STRDUP
+- result = strdup (dirname);
+- if (__builtin_expect (result == NULL, 0))
+- goto failed_dirname;
+-#else
+- size_t len = strlen (dirname) + 1;
+- result = (char *) malloc (len);
+- if (__builtin_expect (result == NULL, 0))
+- goto failed_dirname;
+- memcpy (result, dirname, len);
+-#endif
+- dirname = result;
+- }
+- }
+- *dirnamep = dirname;
+- new_binding->dirname = (char *) dirname;
+- }
+- else
+- /* The default value. */
+- new_binding->dirname = (char *) _nl_default_dirname;
+-
+- if (codesetp)
+- {
+- const char *codeset = *codesetp;
+-
+- if (codeset != NULL)
+- {
+- char *result;
+-
+-#if defined _LIBC || defined HAVE_STRDUP
+- result = strdup (codeset);
+- if (__builtin_expect (result == NULL, 0))
+- goto failed_codeset;
+-#else
+- size_t len = strlen (codeset) + 1;
+- result = (char *) malloc (len);
+- if (__builtin_expect (result == NULL, 0))
+- goto failed_codeset;
+- memcpy (result, codeset, len);
+-#endif
+- codeset = result;
+- }
+- *codesetp = codeset;
+- new_binding->codeset = (char *) codeset;
+- }
+- else
+- new_binding->codeset = NULL;
+-
+- /* Now enqueue it. */
+- if (_nl_domain_bindings == NULL
+- || strcmp (domainname, _nl_domain_bindings->domainname) < 0)
+- {
+- new_binding->next = _nl_domain_bindings;
+- _nl_domain_bindings = new_binding;
+- }
+- else
+- {
+- binding = _nl_domain_bindings;
+- while (binding->next != NULL
+- && strcmp (domainname, binding->next->domainname) > 0)
+- binding = binding->next;
+-
+- new_binding->next = binding->next;
+- binding->next = new_binding;
+- }
+-
+- modified = 1;
+-
+- /* Here we deal with memory allocation failures. */
+- if (0)
+- {
+- failed_codeset:
+- if (new_binding->dirname != _nl_default_dirname)
+- free (new_binding->dirname);
+- failed_dirname:
+- free (new_binding);
+- failed:
+- if (dirnamep)
+- *dirnamep = NULL;
+- if (codesetp)
+- *codesetp = NULL;
+- }
+- }
+-
+- /* If we modified any binding, we flush the caches. */
+- if (modified)
+- ++_nl_msg_cat_cntr;
+-
+- gl_rwlock_unlock (_nl_state_lock);
+-}
+-
+-/* Specify that the DOMAINNAME message catalog will be found
+- in DIRNAME rather than in the system locale data base. */
+-char *
+-BINDTEXTDOMAIN (const char *domainname, const char *dirname)
+-{
+- set_binding_values (domainname, &dirname, NULL);
+- return (char *) dirname;
+-}
+-
+-/* Specify the character encoding in which the messages from the
+- DOMAINNAME message catalog will be returned. */
+-char *
+-BIND_TEXTDOMAIN_CODESET (const char *domainname, const char *codeset)
+-{
+- set_binding_values (domainname, NULL, &codeset);
+- return (char *) codeset;
+-}
+-
+-#ifdef _LIBC
+-/* Aliases for function names in GNU C Library. */
+-weak_alias (__bindtextdomain, bindtextdomain);
+-weak_alias (__bind_textdomain_codeset, bind_textdomain_codeset);
+-#endif
+--- a/intl/config.charset
++++ /dev/null
+@@ -1,640 +0,0 @@
+-#! /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.
+- 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 <juan.guerrero@gmx.de>"
+- echo "# and Bruno Haible <bruno@clisp.org>."
+- echo "#"
+- echo "C ASCII"
+- # ISO-8859-1 languages
+- echo "ca CP850"
+- echo "ca_ES CP850"
+- echo "da CP865" # not CP850 ??
+- echo "da_DK CP865" # not CP850 ??
+- echo "de CP850"
+- echo "de_AT CP850"
+- echo "de_CH CP850"
+- echo "de_DE CP850"
+- echo "en CP850"
+- echo "en_AU CP850" # not CP437 ??
+- echo "en_CA CP850"
+- echo "en_GB CP850"
+- echo "en_NZ CP437"
+- echo "en_US CP437"
+- echo "en_ZA CP850" # not CP437 ??
+- echo "es CP850"
+- echo "es_AR CP850"
+- echo "es_BO CP850"
+- echo "es_CL CP850"
+- echo "es_CO CP850"
+- echo "es_CR CP850"
+- echo "es_CU CP850"
+- echo "es_DO CP850"
+- echo "es_EC CP850"
+- echo "es_ES CP850"
+- echo "es_GT CP850"
+- echo "es_HN CP850"
+- echo "es_MX CP850"
+- echo "es_NI CP850"
+- echo "es_PA CP850"
+- echo "es_PY CP850"
+- echo "es_PE CP850"
+- echo "es_SV CP850"
+- echo "es_UY CP850"
+- echo "es_VE CP850"
+- echo "et CP850"
+- echo "et_EE CP850"
+- echo "eu CP850"
+- echo "eu_ES CP850"
+- echo "fi CP850"
+- echo "fi_FI CP850"
+- echo "fr CP850"
+- echo "fr_BE CP850"
+- echo "fr_CA CP850"
+- echo "fr_CH CP850"
+- echo "fr_FR CP850"
+- echo "ga CP850"
+- echo "ga_IE CP850"
+- echo "gd CP850"
+- echo "gd_GB CP850"
+- echo "gl CP850"
+- echo "gl_ES CP850"
+- echo "id CP850" # not CP437 ??
+- echo "id_ID CP850" # not CP437 ??
+- echo "is CP861" # not CP850 ??
+- echo "is_IS CP861" # not CP850 ??
+- echo "it CP850"
+- echo "it_CH CP850"
+- echo "it_IT CP850"
+- echo "lt CP775"
+- echo "lt_LT CP775"
+- echo "lv CP775"
+- echo "lv_LV CP775"
+- echo "nb CP865" # not CP850 ??
+- echo "nb_NO CP865" # not CP850 ??
+- echo "nl CP850"
+- echo "nl_BE CP850"
+- echo "nl_NL CP850"
+- echo "nn CP865" # not CP850 ??
+- echo "nn_NO CP865" # not CP850 ??
+- echo "no CP865" # not CP850 ??
+- echo "no_NO CP865" # not CP850 ??
+- echo "pt CP850"
+- echo "pt_BR CP850"
+- echo "pt_PT CP850"
+- echo "sv CP850"
+- echo "sv_SE CP850"
+- # ISO-8859-2 languages
+- echo "cs CP852"
+- echo "cs_CZ CP852"
+- echo "hr CP852"
+- echo "hr_HR CP852"
+- echo "hu CP852"
+- echo "hu_HU CP852"
+- echo "pl CP852"
+- echo "pl_PL CP852"
+- echo "ro CP852"
+- echo "ro_RO CP852"
+- echo "sk CP852"
+- echo "sk_SK CP852"
+- echo "sl CP852"
+- echo "sl_SI CP852"
+- echo "sq CP852"
+- echo "sq_AL CP852"
+- echo "sr CP852" # CP852 or CP866 or CP855 ??
+- echo "sr_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
+--- a/intl/dcgettext.c
++++ /dev/null
+@@ -1,56 +0,0 @@
+-/* Implementation of the dcgettext(3) function.
+- Copyright (C) 1995-1999, 2000-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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+- USA. */
+-
+-#ifdef HAVE_CONFIG_H
+-# include <config.h>
+-#endif
+-
+-#include "gettextP.h"
+-#ifdef _LIBC
+-# include <libintl.h>
+-#else
+-# include "libgnuintl.h"
+-#endif
+-
+-/* @@ end of prolog @@ */
+-
+-/* Names for the libintl functions are a problem. They must not clash
+- with existing names and they should follow ANSI C. But this source
+- code is also used in GNU C Library where the names have a __
+- prefix. So we have to make a difference here. */
+-#ifdef _LIBC
+-# define DCGETTEXT __dcgettext
+-# define DCIGETTEXT __dcigettext
+-#else
+-# define DCGETTEXT libintl_dcgettext
+-# define DCIGETTEXT libintl_dcigettext
+-#endif
+-
+-/* Look up MSGID in the DOMAINNAME message catalog for the current CATEGORY
+- locale. */
+-char *
+-DCGETTEXT (const char *domainname, const char *msgid, int category)
+-{
+- return DCIGETTEXT (domainname, msgid, NULL, 0, 0, category);
+-}
+-
+-#ifdef _LIBC
+-/* Alias for function name in GNU C Library. */
+-INTDEF(__dcgettext)
+-weak_alias (__dcgettext, dcgettext);
+-#endif
+--- a/intl/dcigettext.c
++++ /dev/null
+@@ -1,1689 +0,0 @@
+-/* Implementation of the internal dcigettext function.
+- Copyright (C) 1995-1999, 2000-2007 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. */
+-
+-/* Tell glibc's <string.h> to provide a prototype for mempcpy().
+- This must come before <config.h> because <config.h> may include
+- <features.h>, and once <features.h> has been included, it's too late. */
+-#ifndef _GNU_SOURCE
+-# define _GNU_SOURCE 1
+-#endif
+-
+-#ifdef HAVE_CONFIG_H
+-# include <config.h>
+-#endif
+-
+-/* NL_LOCALE_NAME does not work in glibc-2.4. Ignore it. */
+-#undef HAVE_NL_LOCALE_NAME
+-
+-#include <sys/types.h>
+-
+-#ifdef __GNUC__
+-# define alloca __builtin_alloca
+-# define HAVE_ALLOCA 1
+-#else
+-# ifdef _MSC_VER
+-# include <malloc.h>
+-# define alloca _alloca
+-# else
+-# if defined HAVE_ALLOCA_H || defined _LIBC
+-# include <alloca.h>
+-# else
+-# ifdef _AIX
+- #pragma alloca
+-# else
+-# ifndef alloca
+-char *alloca ();
+-# endif
+-# endif
+-# endif
+-# endif
+-#endif
+-
+-#include <errno.h>
+-#ifndef errno
+-extern int errno;
+-#endif
+-#ifndef __set_errno
+-# define __set_errno(val) errno = (val)
+-#endif
+-
+-#include <stddef.h>
+-#include <stdlib.h>
+-#include <string.h>
+-
+-#if defined HAVE_UNISTD_H || defined _LIBC
+-# include <unistd.h>
+-#endif
+-
+-#include <locale.h>
+-
+-#ifdef _LIBC
+- /* Guess whether integer division by zero raises signal SIGFPE.
+- Set to 1 only if you know for sure. In case of doubt, set to 0. */
+-# if defined __alpha__ || defined __arm__ || defined __i386__ \
+- || defined __m68k__ || defined __s390__
+-# define INTDIV0_RAISES_SIGFPE 1
+-# else
+-# define INTDIV0_RAISES_SIGFPE 0
+-# endif
+-#endif
+-#if !INTDIV0_RAISES_SIGFPE
+-# include <signal.h>
+-#endif
+-
+-#if defined HAVE_SYS_PARAM_H || defined _LIBC
+-# include <sys/param.h>
+-#endif
+-
+-#if !defined _LIBC
+-# if HAVE_NL_LOCALE_NAME
+-# include <langinfo.h>
+-# endif
+-# include "localcharset.h"
+-#endif
+-
+-#include "gettextP.h"
+-#include "plural-exp.h"
+-#ifdef _LIBC
+-# include <libintl.h>
+-#else
+-# ifdef IN_LIBGLOCALE
+-# include <libintl.h>
+-# endif
+-# include "libgnuintl.h"
+-#endif
+-#include "hash-string.h"
+-
+-/* Handle multi-threaded applications. */
+-#ifdef _LIBC
+-# include <bits/libc-lock.h>
+-# define gl_rwlock_define_initialized __libc_rwlock_define_initialized
+-# define gl_rwlock_rdlock __libc_rwlock_rdlock
+-# define gl_rwlock_wrlock __libc_rwlock_wrlock
+-# define gl_rwlock_unlock __libc_rwlock_unlock
+-#else
+-# include "lock.h"
+-#endif
+-
+-/* Alignment of types. */
+-#if defined __GNUC__ && __GNUC__ >= 2
+-# define alignof(TYPE) __alignof__ (TYPE)
+-#else
+-# define alignof(TYPE) \
+- ((int) &((struct { char dummy1; TYPE dummy2; } *) 0)->dummy2)
+-#endif
+-
+-/* Some compilers, like SunOS4 cc, don't have offsetof in <stddef.h>. */
+-#ifndef offsetof
+-# define offsetof(type,ident) ((size_t)&(((type*)0)->ident))
+-#endif
+-
+-/* @@ end of prolog @@ */
+-
+-#ifdef _LIBC
+-/* Rename the non ANSI C functions. This is required by the standard
+- because some ANSI C functions will require linking with this object
+- file and the name space must not be polluted. */
+-# define getcwd __getcwd
+-# ifndef stpcpy
+-# define stpcpy __stpcpy
+-# endif
+-# define tfind __tfind
+-#else
+-# if !defined HAVE_GETCWD
+-char *getwd ();
+-# define getcwd(buf, max) getwd (buf)
+-# else
+-# if VMS
+-# define getcwd(buf, max) (getcwd) (buf, max, 0)
+-# else
+-char *getcwd ();
+-# endif
+-# endif
+-# ifndef HAVE_STPCPY
+-static char *stpcpy (char *dest, const char *src);
+-# endif
+-# ifndef HAVE_MEMPCPY
+-static void *mempcpy (void *dest, const void *src, size_t n);
+-# endif
+-#endif
+-
+-/* Use a replacement if the system does not provide the `tsearch' function
+- family. */
+-#if HAVE_TSEARCH || defined _LIBC
+-# include <search.h>
+-#else
+-# define tsearch libintl_tsearch
+-# define tfind libintl_tfind
+-# define tdelete libintl_tdelete
+-# define twalk libintl_twalk
+-# include "tsearch.h"
+-#endif
+-
+-#ifdef _LIBC
+-# define tsearch __tsearch
+-#endif
+-
+-/* Amount to increase buffer size by in each try. */
+-#define PATH_INCR 32
+-
+-/* The following is from pathmax.h. */
+-/* Non-POSIX BSD systems might have gcc's limits.h, which doesn't define
+- PATH_MAX but might cause redefinition warnings when sys/param.h is
+- later included (as on MORE/BSD 4.3). */
+-#if defined _POSIX_VERSION || (defined HAVE_LIMITS_H && !defined __GNUC__)
+-# include <limits.h>
+-#endif
+-
+-#ifndef _POSIX_PATH_MAX
+-# define _POSIX_PATH_MAX 255
+-#endif
+-
+-#if !defined PATH_MAX && defined _PC_PATH_MAX
+-# define PATH_MAX (pathconf ("/", _PC_PATH_MAX) < 1 ? 1024 : pathconf ("/", _PC_PATH_MAX))
+-#endif
+-
+-/* Don't include sys/param.h if it already has been. */
+-#if defined HAVE_SYS_PARAM_H && !defined PATH_MAX && !defined MAXPATHLEN
+-# include <sys/param.h>
+-#endif
+-
+-#if !defined PATH_MAX && defined MAXPATHLEN
+-# define PATH_MAX MAXPATHLEN
+-#endif
+-
+-#ifndef PATH_MAX
+-# define PATH_MAX _POSIX_PATH_MAX
+-#endif
+-
+-/* Pathname support.
+- ISSLASH(C) tests whether C is a directory separator character.
+- IS_ABSOLUTE_PATH(P) tests whether P is an absolute path. If it is not,
+- it may be concatenated to a directory pathname.
+- IS_PATH_WITH_DIR(P) tests whether P contains a directory specification.
+- */
+-#if defined _WIN32 || defined __WIN32__ || defined __CYGWIN__ || defined __EMX__ || defined __DJGPP__
+- /* Win32, Cygwin, OS/2, DOS */
+-# define ISSLASH(C) ((C) == '/' || (C) == '\\')
+-# define HAS_DEVICE(P) \
+- ((((P)[0] >= 'A' && (P)[0] <= 'Z') || ((P)[0] >= 'a' && (P)[0] <= 'z')) \
+- && (P)[1] == ':')
+-# define IS_ABSOLUTE_PATH(P) (ISSLASH ((P)[0]) || HAS_DEVICE (P))
+-# define IS_PATH_WITH_DIR(P) \
+- (strchr (P, '/') != NULL || strchr (P, '\\') != NULL || HAS_DEVICE (P))
+-#else
+- /* Unix */
+-# define ISSLASH(C) ((C) == '/')
+-# define IS_ABSOLUTE_PATH(P) ISSLASH ((P)[0])
+-# define IS_PATH_WITH_DIR(P) (strchr (P, '/') != NULL)
+-#endif
+-
+-/* Whether to support different locales in different threads. */
+-#if defined _LIBC || HAVE_NL_LOCALE_NAME || (HAVE_STRUCT___LOCALE_STRUCT___NAMES && defined USE_IN_GETTEXT_TESTS) || defined IN_LIBGLOCALE
+-# define HAVE_PER_THREAD_LOCALE
+-#endif
+-
+-/* This is the type used for the search tree where known translations
+- are stored. */
+-struct known_translation_t
+-{
+- /* Domain in which to search. */
+- const char *domainname;
+-
+- /* The category. */
+- int category;
+-
+-#ifdef HAVE_PER_THREAD_LOCALE
+- /* Name of the relevant locale category, or "" for the global locale. */
+- const char *localename;
+-#endif
+-
+-#ifdef IN_LIBGLOCALE
+- /* The character encoding. */
+- const char *encoding;
+-#endif
+-
+- /* State of the catalog counter at the point the string was found. */
+- int counter;
+-
+- /* Catalog where the string was found. */
+- struct loaded_l10nfile *domain;
+-
+- /* And finally the translation. */
+- const char *translation;
+- size_t translation_length;
+-
+- /* Pointer to the string in question. */
+- char msgid[ZERO];
+-};
+-
+-gl_rwlock_define_initialized (static, tree_lock)
+-
+-/* Root of the search tree with known translations. */
+-static void *root;
+-
+-/* Function to compare two entries in the table of known translations. */
+-static int
+-transcmp (const void *p1, const void *p2)
+-{
+- const struct known_translation_t *s1;
+- const struct known_translation_t *s2;
+- int result;
+-
+- s1 = (const struct known_translation_t *) p1;
+- s2 = (const struct known_translation_t *) p2;
+-
+- result = strcmp (s1->msgid, s2->msgid);
+- if (result == 0)
+- {
+- result = strcmp (s1->domainname, s2->domainname);
+- if (result == 0)
+- {
+-#ifdef HAVE_PER_THREAD_LOCALE
+- result = strcmp (s1->localename, s2->localename);
+- if (result == 0)
+-#endif
+- {
+-#ifdef IN_LIBGLOCALE
+- result = strcmp (s1->encoding, s2->encoding);
+- if (result == 0)
+-#endif
+- /* We compare the category last (though this is the cheapest
+- operation) since it is hopefully always the same (namely
+- LC_MESSAGES). */
+- result = s1->category - s2->category;
+- }
+- }
+- }
+-
+- return result;
+-}
+-
+-/* Name of the default domain used for gettext(3) prior any call to
+- textdomain(3). The default value for this is "messages". */
+-const char _nl_default_default_domain[] attribute_hidden = "messages";
+-
+-#ifndef IN_LIBGLOCALE
+-/* Value used as the default domain for gettext(3). */
+-const char *_nl_current_default_domain attribute_hidden
+- = _nl_default_default_domain;
+-#endif
+-
+-/* Contains the default location of the message catalogs. */
+-#if defined __EMX__
+-extern const char _nl_default_dirname[];
+-#else
+-# ifdef _LIBC
+-extern const char _nl_default_dirname[];
+-libc_hidden_proto (_nl_default_dirname)
+-# endif
+-const char _nl_default_dirname[] = LOCALEDIR;
+-# ifdef _LIBC
+-libc_hidden_data_def (_nl_default_dirname)
+-# endif
+-#endif
+-
+-#ifndef IN_LIBGLOCALE
+-/* List with bindings of specific domains created by bindtextdomain()
+- calls. */
+-struct binding *_nl_domain_bindings;
+-#endif
+-
+-/* Prototypes for local functions. */
+-static char *plural_lookup (struct loaded_l10nfile *domain,
+- unsigned long int n,
+- const char *translation, size_t translation_len)
+- internal_function;
+-
+-#ifdef IN_LIBGLOCALE
+-static const char *guess_category_value (int category,
+- const char *categoryname,
+- const char *localename)
+- internal_function;
+-#else
+-static const char *guess_category_value (int category,
+- const char *categoryname)
+- internal_function;
+-#endif
+-
+-#ifdef _LIBC
+-# include "../locale/localeinfo.h"
+-# define category_to_name(category) \
+- _nl_category_names.str + _nl_category_name_idxs[category]
+-#else
+-static const char *category_to_name (int category) internal_function;
+-#endif
+-#if (defined _LIBC || HAVE_ICONV) && !defined IN_LIBGLOCALE
+-static const char *get_output_charset (struct binding *domainbinding)
+- internal_function;
+-#endif
+-
+-
+-/* For those loosing systems which don't have `alloca' we have to add
+- some additional code emulating it. */
+-#ifdef HAVE_ALLOCA
+-/* Nothing has to be done. */
+-# define freea(p) /* nothing */
+-# define ADD_BLOCK(list, address) /* nothing */
+-# define FREE_BLOCKS(list) /* nothing */
+-#else
+-struct block_list
+-{
+- void *address;
+- struct block_list *next;
+-};
+-# define ADD_BLOCK(list, addr) \
+- do { \
+- struct block_list *newp = (struct block_list *) malloc (sizeof (*newp)); \
+- /* If we cannot get a free block we cannot add the new element to \
+- the list. */ \
+- if (newp != NULL) { \
+- newp->address = (addr); \
+- newp->next = (list); \
+- (list) = newp; \
+- } \
+- } while (0)
+-# define FREE_BLOCKS(list) \
+- do { \
+- while (list != NULL) { \
+- struct block_list *old = list; \
+- list = list->next; \
+- free (old->address); \
+- free (old); \
+- } \
+- } while (0)
+-# undef alloca
+-# define alloca(size) (malloc (size))
+-# define freea(p) free (p)
+-#endif /* have alloca */
+-
+-
+-#ifdef _LIBC
+-/* List of blocks allocated for translations. */
+-typedef struct transmem_list
+-{
+- struct transmem_list *next;
+- char data[ZERO];
+-} transmem_block_t;
+-static struct transmem_list *transmem_list;
+-#else
+-typedef unsigned char transmem_block_t;
+-#endif
+-
+-
+-/* Names for the libintl functions are a problem. They must not clash
+- with existing names and they should follow ANSI C. But this source
+- code is also used in GNU C Library where the names have a __
+- prefix. So we have to make a difference here. */
+-#ifdef _LIBC
+-# define DCIGETTEXT __dcigettext
+-#else
+-# define DCIGETTEXT libintl_dcigettext
+-#endif
+-
+-/* Lock variable to protect the global data in the gettext implementation. */
+-gl_rwlock_define_initialized (, _nl_state_lock attribute_hidden)
+-
+-/* Checking whether the binaries runs SUID must be done and glibc provides
+- easier methods therefore we make a difference here. */
+-#ifdef _LIBC
+-# define ENABLE_SECURE __libc_enable_secure
+-# define DETERMINE_SECURE
+-#else
+-# ifndef HAVE_GETUID
+-# define getuid() 0
+-# endif
+-# ifndef HAVE_GETGID
+-# define getgid() 0
+-# endif
+-# ifndef HAVE_GETEUID
+-# define geteuid() getuid()
+-# endif
+-# ifndef HAVE_GETEGID
+-# define getegid() getgid()
+-# endif
+-static int enable_secure;
+-# define ENABLE_SECURE (enable_secure == 1)
+-# define DETERMINE_SECURE \
+- if (enable_secure == 0) \
+- { \
+- if (getuid () != geteuid () || getgid () != getegid ()) \
+- enable_secure = 1; \
+- else \
+- enable_secure = -1; \
+- }
+-#endif
+-
+-/* Get the function to evaluate the plural expression. */
+-#include "eval-plural.h"
+-
+-/* Look up MSGID in the DOMAINNAME message catalog for the current
+- CATEGORY locale and, if PLURAL is nonzero, search over string
+- depending on the plural form determined by N. */
+-#ifdef IN_LIBGLOCALE
+-char *
+-gl_dcigettext (const char *domainname,
+- const char *msgid1, const char *msgid2,
+- int plural, unsigned long int n,
+- int category,
+- const char *localename, const char *encoding)
+-#else
+-char *
+-DCIGETTEXT (const char *domainname, const char *msgid1, const char *msgid2,
+- int plural, unsigned long int n, int category)
+-#endif
+-{
+-#ifndef HAVE_ALLOCA
+- struct block_list *block_list = NULL;
+-#endif
+- struct loaded_l10nfile *domain;
+- struct binding *binding;
+- const char *categoryname;
+- const char *categoryvalue;
+- const char *dirname;
+- char *xdomainname;
+- char *single_locale;
+- char *retval;
+- size_t retlen;
+- int saved_errno;
+- struct known_translation_t *search;
+- struct known_translation_t **foundp = NULL;
+- size_t msgid_len;
+-#if defined HAVE_PER_THREAD_LOCALE && !defined IN_LIBGLOCALE
+- const char *localename;
+-#endif
+- size_t domainname_len;
+-
+- /* If no real MSGID is given return NULL. */
+- if (msgid1 == NULL)
+- return NULL;
+-
+-#ifdef _LIBC
+- if (category < 0 || category >= __LC_LAST || category == LC_ALL)
+- /* Bogus. */
+- return (plural == 0
+- ? (char *) msgid1
+- /* Use the Germanic plural rule. */
+- : n == 1 ? (char *) msgid1 : (char *) msgid2);
+-#endif
+-
+- /* Preserve the `errno' value. */
+- saved_errno = errno;
+-
+- gl_rwlock_rdlock (_nl_state_lock);
+-
+- /* If DOMAINNAME is NULL, we are interested in the default domain. If
+- CATEGORY is not LC_MESSAGES this might not make much sense but the
+- definition left this undefined. */
+- if (domainname == NULL)
+- domainname = _nl_current_default_domain;
+-
+- /* OS/2 specific: backward compatibility with older libintl versions */
+-#ifdef LC_MESSAGES_COMPAT
+- if (category == LC_MESSAGES_COMPAT)
+- category = LC_MESSAGES;
+-#endif
+-
+- msgid_len = strlen (msgid1) + 1;
+-
+- /* Try to find the translation among those which we found at
+- some time. */
+- search = (struct known_translation_t *)
+- alloca (offsetof (struct known_translation_t, msgid) + msgid_len);
+- memcpy (search->msgid, msgid1, msgid_len);
+- search->domainname = domainname;
+- search->category = category;
+-#ifdef HAVE_PER_THREAD_LOCALE
+-# ifndef IN_LIBGLOCALE
+-# ifdef _LIBC
+- localename = __current_locale_name (category);
+-# else
+-# if HAVE_NL_LOCALE_NAME
+- /* NL_LOCALE_NAME is public glibc API introduced in glibc-2.4. */
+- localename = nl_langinfo (NL_LOCALE_NAME (category));
+-# else
+-# if HAVE_STRUCT___LOCALE_STRUCT___NAMES && defined USE_IN_GETTEXT_TESTS
+- /* The __names field is not public glibc API and must therefore not be used
+- in code that is installed in public locations. */
+- {
+- locale_t thread_locale = uselocale (NULL);
+- if (thread_locale != LC_GLOBAL_LOCALE)
+- localename = thread_locale->__names[category];
+- else
+- localename = "";
+- }
+-# endif
+-# endif
+-# endif
+-# endif
+- search->localename = localename;
+-# ifdef IN_LIBGLOCALE
+- search->encoding = encoding;
+-# endif
+-
+- /* Since tfind/tsearch manage a balanced tree, concurrent tfind and
+- tsearch calls can be fatal. */
+- gl_rwlock_rdlock (tree_lock);
+-
+- foundp = (struct known_translation_t **) tfind (search, &root, transcmp);
+-
+- gl_rwlock_unlock (tree_lock);
+-
+- freea (search);
+- if (foundp != NULL && (*foundp)->counter == _nl_msg_cat_cntr)
+- {
+- /* Now deal with plural. */
+- if (plural)
+- retval = plural_lookup ((*foundp)->domain, n, (*foundp)->translation,
+- (*foundp)->translation_length);
+- else
+- retval = (char *) (*foundp)->translation;
+-
+- gl_rwlock_unlock (_nl_state_lock);
+- __set_errno (saved_errno);
+- return retval;
+- }
+-#endif
+-
+- /* See whether this is a SUID binary or not. */
+- DETERMINE_SECURE;
+-
+- /* First find matching binding. */
+-#ifdef IN_LIBGLOCALE
+- /* We can use a trivial binding, since _nl_find_msg will ignore it anyway,
+- and _nl_load_domain and _nl_find_domain just pass it through. */
+- binding = NULL;
+- dirname = bindtextdomain (domainname, NULL);
+-#else
+- for (binding = _nl_domain_bindings; binding != NULL; binding = binding->next)
+- {
+- int compare = strcmp (domainname, binding->domainname);
+- if (compare == 0)
+- /* We found it! */
+- break;
+- if (compare < 0)
+- {
+- /* It is not in the list. */
+- binding = NULL;
+- break;
+- }
+- }
+-
+- if (binding == NULL)
+- dirname = _nl_default_dirname;
+- else
+- {
+- dirname = binding->dirname;
+-#endif
+- if (!IS_ABSOLUTE_PATH (dirname))
+- {
+- /* We have a relative path. Make it absolute now. */
+- size_t dirname_len = strlen (dirname) + 1;
+- size_t path_max;
+- char *resolved_dirname;
+- char *ret;
+-
+- path_max = (unsigned int) PATH_MAX;
+- path_max += 2; /* The getcwd docs say to do this. */
+-
+- for (;;)
+- {
+- resolved_dirname = (char *) alloca (path_max + dirname_len);
+- ADD_BLOCK (block_list, tmp_dirname);
+-
+- __set_errno (0);
+- ret = getcwd (resolved_dirname, path_max);
+- if (ret != NULL || errno != ERANGE)
+- break;
+-
+- path_max += path_max / 2;
+- path_max += PATH_INCR;
+- }
+-
+- if (ret == NULL)
+- /* We cannot get the current working directory. Don't signal an
+- error but simply return the default string. */
+- goto return_untranslated;
+-
+- stpcpy (stpcpy (strchr (resolved_dirname, '\0'), "/"), dirname);
+- dirname = resolved_dirname;
+- }
+-#ifndef IN_LIBGLOCALE
+- }
+-#endif
+-
+- /* Now determine the symbolic name of CATEGORY and its value. */
+- categoryname = category_to_name (category);
+-#ifdef IN_LIBGLOCALE
+- categoryvalue = guess_category_value (category, categoryname, localename);
+-#else
+- categoryvalue = guess_category_value (category, categoryname);
+-#endif
+-
+- domainname_len = strlen (domainname);
+- xdomainname = (char *) alloca (strlen (categoryname)
+- + domainname_len + 5);
+- ADD_BLOCK (block_list, xdomainname);
+-
+- stpcpy ((char *) mempcpy (stpcpy (stpcpy (xdomainname, categoryname), "/"),
+- domainname, domainname_len),
+- ".mo");
+-
+- /* Creating working area. */
+- single_locale = (char *) alloca (strlen (categoryvalue) + 1);
+- ADD_BLOCK (block_list, single_locale);
+-
+-
+- /* Search for the given string. This is a loop because we perhaps
+- got an ordered list of languages to consider for the translation. */
+- while (1)
+- {
+- /* Make CATEGORYVALUE point to the next element of the list. */
+- while (categoryvalue[0] != '\0' && categoryvalue[0] == ':')
+- ++categoryvalue;
+- if (categoryvalue[0] == '\0')
+- {
+- /* The whole contents of CATEGORYVALUE has been searched but
+- no valid entry has been found. We solve this situation
+- by implicitly appending a "C" entry, i.e. no translation
+- will take place. */
+- single_locale[0] = 'C';
+- single_locale[1] = '\0';
+- }
+- else
+- {
+- char *cp = single_locale;
+- while (categoryvalue[0] != '\0' && categoryvalue[0] != ':')
+- *cp++ = *categoryvalue++;
+- *cp = '\0';
+-
+- /* When this is a SUID binary we must not allow accessing files
+- outside the dedicated directories. */
+- if (ENABLE_SECURE && IS_PATH_WITH_DIR (single_locale))
+- /* Ingore this entry. */
+- continue;
+- }
+-
+- /* If the current locale value is C (or POSIX) we don't load a
+- domain. Return the MSGID. */
+- if (strcmp (single_locale, "C") == 0
+- || strcmp (single_locale, "POSIX") == 0)
+- break;
+-
+- /* Find structure describing the message catalog matching the
+- DOMAINNAME and CATEGORY. */
+- domain = _nl_find_domain (dirname, single_locale, xdomainname, binding);
+-
+- if (domain != NULL)
+- {
+-#if defined IN_LIBGLOCALE
+- retval = _nl_find_msg (domain, binding, encoding, msgid1, &retlen);
+-#else
+- retval = _nl_find_msg (domain, binding, msgid1, 1, &retlen);
+-#endif
+-
+- if (retval == NULL)
+- {
+- int cnt;
+-
+- for (cnt = 0; domain->successor[cnt] != NULL; ++cnt)
+- {
+-#if defined IN_LIBGLOCALE
+- retval = _nl_find_msg (domain->successor[cnt], binding,
+- encoding, msgid1, &retlen);
+-#else
+- retval = _nl_find_msg (domain->successor[cnt], binding,
+- msgid1, 1, &retlen);
+-#endif
+-
+- if (retval != NULL)
+- {
+- domain = domain->successor[cnt];
+- break;
+- }
+- }
+- }
+-
+- /* Returning -1 means that some resource problem exists
+- (likely memory) and that the strings could not be
+- converted. Return the original strings. */
+- if (__builtin_expect (retval == (char *) -1, 0))
+- break;
+-
+- if (retval != NULL)
+- {
+- /* Found the translation of MSGID1 in domain DOMAIN:
+- starting at RETVAL, RETLEN bytes. */
+- FREE_BLOCKS (block_list);
+- if (foundp == NULL)
+- {
+- /* Create a new entry and add it to the search tree. */
+- size_t size;
+- struct known_translation_t *newp;
+-
+- size = offsetof (struct known_translation_t, msgid)
+- + msgid_len + domainname_len + 1;
+-#ifdef HAVE_PER_THREAD_LOCALE
+- size += strlen (localename) + 1;
+-#endif
+- newp = (struct known_translation_t *) malloc (size);
+- if (newp != NULL)
+- {
+- char *new_domainname;
+-#ifdef HAVE_PER_THREAD_LOCALE
+- char *new_localename;
+-#endif
+-
+- new_domainname =
+- (char *) mempcpy (newp->msgid, msgid1, msgid_len);
+- memcpy (new_domainname, domainname, domainname_len + 1);
+-#ifdef HAVE_PER_THREAD_LOCALE
+- new_localename = new_domainname + domainname_len + 1;
+- strcpy (new_localename, localename);
+-#endif
+- newp->domainname = new_domainname;
+- newp->category = category;
+-#ifdef HAVE_PER_THREAD_LOCALE
+- newp->localename = new_localename;
+-#endif
+-#ifdef IN_LIBGLOCALE
+- newp->encoding = encoding;
+-#endif
+- newp->counter = _nl_msg_cat_cntr;
+- newp->domain = domain;
+- newp->translation = retval;
+- newp->translation_length = retlen;
+-
+- gl_rwlock_wrlock (tree_lock);
+-
+- /* Insert the entry in the search tree. */
+- foundp = (struct known_translation_t **)
+- tsearch (newp, &root, transcmp);
+-
+- gl_rwlock_unlock (tree_lock);
+-
+- if (foundp == NULL
+- || __builtin_expect (*foundp != newp, 0))
+- /* The insert failed. */
+- free (newp);
+- }
+- }
+- else
+- {
+- /* We can update the existing entry. */
+- (*foundp)->counter = _nl_msg_cat_cntr;
+- (*foundp)->domain = domain;
+- (*foundp)->translation = retval;
+- (*foundp)->translation_length = retlen;
+- }
+-
+- __set_errno (saved_errno);
+-
+- /* Now deal with plural. */
+- if (plural)
+- retval = plural_lookup (domain, n, retval, retlen);
+-
+- gl_rwlock_unlock (_nl_state_lock);
+- return retval;
+- }
+- }
+- }
+-
+- return_untranslated:
+- /* Return the untranslated MSGID. */
+- FREE_BLOCKS (block_list);
+- gl_rwlock_unlock (_nl_state_lock);
+-#ifndef _LIBC
+- if (!ENABLE_SECURE)
+- {
+- extern void _nl_log_untranslated (const char *logfilename,
+- const char *domainname,
+- const char *msgid1, const char *msgid2,
+- int plural);
+- const char *logfilename = getenv ("GETTEXT_LOG_UNTRANSLATED");
+-
+- if (logfilename != NULL && logfilename[0] != '\0')
+- _nl_log_untranslated (logfilename, domainname, msgid1, msgid2, plural);
+- }
+-#endif
+- __set_errno (saved_errno);
+- return (plural == 0
+- ? (char *) msgid1
+- /* Use the Germanic plural rule. */
+- : n == 1 ? (char *) msgid1 : (char *) msgid2);
+-}
+-
+-
+-/* Look up the translation of msgid within DOMAIN_FILE and DOMAINBINDING.
+- Return it if found. Return NULL if not found or in case of a conversion
+- failure (problem in the particular message catalog). Return (char *) -1
+- in case of a memory allocation failure during conversion (only if
+- ENCODING != NULL resp. CONVERT == true). */
+-char *
+-internal_function
+-#ifdef IN_LIBGLOCALE
+-_nl_find_msg (struct loaded_l10nfile *domain_file,
+- struct binding *domainbinding, const char *encoding,
+- const char *msgid,
+- size_t *lengthp)
+-#else
+-_nl_find_msg (struct loaded_l10nfile *domain_file,
+- struct binding *domainbinding,
+- const char *msgid, int convert,
+- size_t *lengthp)
+-#endif
+-{
+- struct loaded_domain *domain;
+- nls_uint32 nstrings;
+- size_t act;
+- char *result;
+- size_t resultlen;
+-
+- if (domain_file->decided <= 0)
+- _nl_load_domain (domain_file, domainbinding);
+-
+- if (domain_file->data == NULL)
+- return NULL;
+-
+- domain = (struct loaded_domain *) domain_file->data;
+-
+- nstrings = domain->nstrings;
+-
+- /* Locate the MSGID and its translation. */
+- if (domain->hash_tab != NULL)
+- {
+- /* Use the hashing table. */
+- nls_uint32 len = strlen (msgid);
+- nls_uint32 hash_val = __hash_string (msgid);
+- nls_uint32 idx = hash_val % domain->hash_size;
+- nls_uint32 incr = 1 + (hash_val % (domain->hash_size - 2));
+-
+- while (1)
+- {
+- nls_uint32 nstr =
+- W (domain->must_swap_hash_tab, domain->hash_tab[idx]);
+-
+- if (nstr == 0)
+- /* Hash table entry is empty. */
+- return NULL;
+-
+- nstr--;
+-
+- /* Compare msgid with the original string at index nstr.
+- We compare the lengths with >=, not ==, because plural entries
+- are represented by strings with an embedded NUL. */
+- if (nstr < nstrings
+- ? W (domain->must_swap, domain->orig_tab[nstr].length) >= len
+- && (strcmp (msgid,
+- domain->data + W (domain->must_swap,
+- domain->orig_tab[nstr].offset))
+- == 0)
+- : domain->orig_sysdep_tab[nstr - nstrings].length > len
+- && (strcmp (msgid,
+- domain->orig_sysdep_tab[nstr - nstrings].pointer)
+- == 0))
+- {
+- act = nstr;
+- goto found;
+- }
+-
+- if (idx >= domain->hash_size - incr)
+- idx -= domain->hash_size - incr;
+- else
+- idx += incr;
+- }
+- /* NOTREACHED */
+- }
+- else
+- {
+- /* Try the default method: binary search in the sorted array of
+- messages. */
+- size_t top, bottom;
+-
+- bottom = 0;
+- top = nstrings;
+- while (bottom < top)
+- {
+- int cmp_val;
+-
+- act = (bottom + top) / 2;
+- cmp_val = strcmp (msgid, (domain->data
+- + W (domain->must_swap,
+- domain->orig_tab[act].offset)));
+- if (cmp_val < 0)
+- top = act;
+- else if (cmp_val > 0)
+- bottom = act + 1;
+- else
+- goto found;
+- }
+- /* No translation was found. */
+- return NULL;
+- }
+-
+- found:
+- /* The translation was found at index ACT. If we have to convert the
+- string to use a different character set, this is the time. */
+- if (act < nstrings)
+- {
+- result = (char *)
+- (domain->data + W (domain->must_swap, domain->trans_tab[act].offset));
+- resultlen = W (domain->must_swap, domain->trans_tab[act].length) + 1;
+- }
+- else
+- {
+- result = (char *) domain->trans_sysdep_tab[act - nstrings].pointer;
+- resultlen = domain->trans_sysdep_tab[act - nstrings].length;
+- }
+-
+-#if defined _LIBC || HAVE_ICONV
+-# ifdef IN_LIBGLOCALE
+- if (encoding != NULL)
+-# else
+- if (convert)
+-# endif
+- {
+- /* We are supposed to do a conversion. */
+-# ifndef IN_LIBGLOCALE
+- const char *encoding = get_output_charset (domainbinding);
+-# endif
+- size_t nconversions;
+- struct converted_domain *convd;
+- size_t i;
+-
+- /* Protect against reallocation of the table. */
+- gl_rwlock_rdlock (domain->conversions_lock);
+-
+- /* Search whether a table with converted translations for this
+- encoding has already been allocated. */
+- nconversions = domain->nconversions;
+- convd = NULL;
+-
+- for (i = nconversions; i > 0; )
+- {
+- i--;
+- if (strcmp (domain->conversions[i].encoding, encoding) == 0)
+- {
+- convd = &domain->conversions[i];
+- break;
+- }
+- }
+-
+- gl_rwlock_unlock (domain->conversions_lock);
+-
+- if (convd == NULL)
+- {
+- /* We have to allocate a new conversions table. */
+- gl_rwlock_wrlock (domain->conversions_lock);
+-
+- /* Maybe in the meantime somebody added the translation.
+- Recheck. */
+- for (i = nconversions; i > 0; )
+- {
+- i--;
+- if (strcmp (domain->conversions[i].encoding, encoding) == 0)
+- {
+- convd = &domain->conversions[i];
+- goto found_convd;
+- }
+- }
+-
+- {
+- /* Allocate a table for the converted translations for this
+- encoding. */
+- struct converted_domain *new_conversions =
+- (struct converted_domain *)
+- (domain->conversions != NULL
+- ? realloc (domain->conversions,
+- (nconversions + 1) * sizeof (struct converted_domain))
+- : malloc ((nconversions + 1) * sizeof (struct converted_domain)));
+-
+- if (__builtin_expect (new_conversions == NULL, 0))
+- {
+- /* Nothing we can do, no more memory. We cannot use the
+- translation because it might be encoded incorrectly. */
+- unlock_fail:
+- gl_rwlock_unlock (domain->conversions_lock);
+- return (char *) -1;
+- }
+-
+- domain->conversions = new_conversions;
+-
+- /* Copy the 'encoding' string to permanent storage. */
+- encoding = strdup (encoding);
+- if (__builtin_expect (encoding == NULL, 0))
+- /* Nothing we can do, no more memory. We cannot use the
+- translation because it might be encoded incorrectly. */
+- goto unlock_fail;
+-
+- convd = &new_conversions[nconversions];
+- convd->encoding = encoding;
+-
+- /* Find out about the character set the file is encoded with.
+- This can be found (in textual form) in the entry "". If this
+- entry does not exist or if this does not contain the 'charset='
+- information, we will assume the charset matches the one the
+- current locale and we don't have to perform any conversion. */
+-# ifdef _LIBC
+- convd->conv = (__gconv_t) -1;
+-# else
+-# if HAVE_ICONV
+- convd->conv = (iconv_t) -1;
+-# endif
+-# endif
+- {
+- char *nullentry;
+- size_t nullentrylen;
+-
+- /* Get the header entry. This is a recursion, but it doesn't
+- reallocate domain->conversions because we pass
+- encoding = NULL or convert = 0, respectively. */
+- nullentry =
+-# ifdef IN_LIBGLOCALE
+- _nl_find_msg (domain_file, domainbinding, NULL, "",
+- &nullentrylen);
+-# else
+- _nl_find_msg (domain_file, domainbinding, "", 0, &nullentrylen);
+-# endif
+-
+- if (nullentry != NULL)
+- {
+- const char *charsetstr;
+-
+- charsetstr = strstr (nullentry, "charset=");
+- if (charsetstr != NULL)
+- {
+- size_t len;
+- char *charset;
+- const char *outcharset;
+-
+- charsetstr += strlen ("charset=");
+- len = strcspn (charsetstr, " \t\n");
+-
+- charset = (char *) alloca (len + 1);
+-# if defined _LIBC || HAVE_MEMPCPY
+- *((char *) mempcpy (charset, charsetstr, len)) = '\0';
+-# else
+- memcpy (charset, charsetstr, len);
+- charset[len] = '\0';
+-# endif
+-
+- outcharset = encoding;
+-
+-# ifdef _LIBC
+- /* We always want to use transliteration. */
+- outcharset = norm_add_slashes (outcharset, "TRANSLIT");
+- charset = norm_add_slashes (charset, "");
+- int r = __gconv_open (outcharset, charset, &convd->conv,
+- GCONV_AVOID_NOCONV);
+- if (__builtin_expect (r != __GCONV_OK, 0))
+- {
+- /* If the output encoding is the same there is
+- nothing to do. Otherwise do not use the
+- translation at all. */
+- if (__builtin_expect (r != __GCONV_NULCONV, 1))
+- {
+- gl_rwlock_unlock (domain->conversions_lock);
+- free ((char *) encoding);
+- return NULL;
+- }
+-
+- convd->conv = (__gconv_t) -1;
+- }
+-# else
+-# if HAVE_ICONV
+- /* When using GNU libc >= 2.2 or GNU libiconv >= 1.5,
+- we want to use transliteration. */
+-# if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2) || __GLIBC__ > 2 \
+- || _LIBICONV_VERSION >= 0x0105
+- if (strchr (outcharset, '/') == NULL)
+- {
+- char *tmp;
+-
+- len = strlen (outcharset);
+- tmp = (char *) alloca (len + 10 + 1);
+- memcpy (tmp, outcharset, len);
+- memcpy (tmp + len, "//TRANSLIT", 10 + 1);
+- outcharset = tmp;
+-
+- convd->conv = iconv_open (outcharset, charset);
+-
+- freea (outcharset);
+- }
+- else
+-# endif
+- convd->conv = iconv_open (outcharset, charset);
+-# endif
+-# endif
+-
+- freea (charset);
+- }
+- }
+- }
+- convd->conv_tab = NULL;
+- /* Here domain->conversions is still == new_conversions. */
+- domain->nconversions++;
+- }
+-
+- found_convd:
+- gl_rwlock_unlock (domain->conversions_lock);
+- }
+-
+- if (
+-# ifdef _LIBC
+- convd->conv != (__gconv_t) -1
+-# else
+-# if HAVE_ICONV
+- convd->conv != (iconv_t) -1
+-# endif
+-# endif
+- )
+- {
+- /* We are supposed to do a conversion. First allocate an
+- appropriate table with the same structure as the table
+- of translations in the file, where we can put the pointers
+- to the converted strings in.
+- There is a slight complication with plural entries. They
+- are represented by consecutive NUL terminated strings. We
+- handle this case by converting RESULTLEN bytes, including
+- NULs. */
+-
+- if (convd->conv_tab == NULL
+- && ((convd->conv_tab =
+- (char **) calloc (nstrings + domain->n_sysdep_strings,
+- sizeof (char *)))
+- == NULL))
+- /* Mark that we didn't succeed allocating a table. */
+- convd->conv_tab = (char **) -1;
+-
+- if (__builtin_expect (convd->conv_tab == (char **) -1, 0))
+- /* Nothing we can do, no more memory. We cannot use the
+- translation because it might be encoded incorrectly. */
+- return (char *) -1;
+-
+- if (convd->conv_tab[act] == NULL)
+- {
+- /* We haven't used this string so far, so it is not
+- translated yet. Do this now. */
+- /* We use a bit more efficient memory handling.
+- We allocate always larger blocks which get used over
+- time. This is faster than many small allocations. */
+- __libc_lock_define_initialized (static, lock)
+-# define INITIAL_BLOCK_SIZE 4080
+- static unsigned char *freemem;
+- static size_t freemem_size;
+-
+- const unsigned char *inbuf;
+- unsigned char *outbuf;
+- int malloc_count;
+-# ifndef _LIBC
+- transmem_block_t *transmem_list = NULL;
+-# endif
+-
+- __libc_lock_lock (lock);
+-
+- inbuf = (const unsigned char *) result;
+- outbuf = freemem + sizeof (size_t);
+-
+- malloc_count = 0;
+- while (1)
+- {
+- transmem_block_t *newmem;
+-# ifdef _LIBC
+- size_t non_reversible;
+- int res;
+-
+- if (freemem_size < sizeof (size_t))
+- goto resize_freemem;
+-
+- res = __gconv (convd->conv,
+- &inbuf, inbuf + resultlen,
+- &outbuf,
+- outbuf + freemem_size - sizeof (size_t),
+- &non_reversible);
+-
+- if (res == __GCONV_OK || res == __GCONV_EMPTY_INPUT)
+- break;
+-
+- if (res != __GCONV_FULL_OUTPUT)
+- {
+- /* We should not use the translation at all, it
+- is incorrectly encoded. */
+- __libc_lock_unlock (lock);
+- return NULL;
+- }
+-
+- inbuf = (const unsigned char *) result;
+-# else
+-# if HAVE_ICONV
+- const char *inptr = (const char *) inbuf;
+- size_t inleft = resultlen;
+- char *outptr = (char *) outbuf;
+- size_t outleft;
+-
+- if (freemem_size < sizeof (size_t))
+- goto resize_freemem;
+-
+- outleft = freemem_size - sizeof (size_t);
+- if (iconv (convd->conv,
+- (ICONV_CONST char **) &inptr, &inleft,
+- &outptr, &outleft)
+- != (size_t) (-1))
+- {
+- outbuf = (unsigned char *) outptr;
+- break;
+- }
+- if (errno != E2BIG)
+- {
+- __libc_lock_unlock (lock);
+- return NULL;
+- }
+-# endif
+-# endif
+-
+- resize_freemem:
+- /* We must allocate a new buffer or resize the old one. */
+- if (malloc_count > 0)
+- {
+- ++malloc_count;
+- freemem_size = malloc_count * INITIAL_BLOCK_SIZE;
+- newmem = (transmem_block_t *) realloc (transmem_list,
+- freemem_size);
+-# ifdef _LIBC
+- if (newmem != NULL)
+- transmem_list = transmem_list->next;
+- else
+- {
+- struct transmem_list *old = transmem_list;
+-
+- transmem_list = transmem_list->next;
+- free (old);
+- }
+-# endif
+- }
+- else
+- {
+- malloc_count = 1;
+- freemem_size = INITIAL_BLOCK_SIZE;
+- newmem = (transmem_block_t *) malloc (freemem_size);
+- }
+- if (__builtin_expect (newmem == NULL, 0))
+- {
+- freemem = NULL;
+- freemem_size = 0;
+- __libc_lock_unlock (lock);
+- return (char *) -1;
+- }
+-
+-# ifdef _LIBC
+- /* Add the block to the list of blocks we have to free
+- at some point. */
+- newmem->next = transmem_list;
+- transmem_list = newmem;
+-
+- freemem = (unsigned char *) newmem->data;
+- freemem_size -= offsetof (struct transmem_list, data);
+-# else
+- transmem_list = newmem;
+- freemem = newmem;
+-# endif
+-
+- outbuf = freemem + sizeof (size_t);
+- }
+-
+- /* We have now in our buffer a converted string. Put this
+- into the table of conversions. */
+- *(size_t *) freemem = outbuf - freemem - sizeof (size_t);
+- convd->conv_tab[act] = (char *) freemem;
+- /* Shrink freemem, but keep it aligned. */
+- freemem_size -= outbuf - freemem;
+- freemem = outbuf;
+- freemem += freemem_size & (alignof (size_t) - 1);
+- freemem_size = freemem_size & ~ (alignof (size_t) - 1);
+-
+- __libc_lock_unlock (lock);
+- }
+-
+- /* Now convd->conv_tab[act] contains the translation of all
+- the plural variants. */
+- result = convd->conv_tab[act] + sizeof (size_t);
+- resultlen = *(size_t *) convd->conv_tab[act];
+- }
+- }
+-
+- /* The result string is converted. */
+-
+-#endif /* _LIBC || HAVE_ICONV */
+-
+- *lengthp = resultlen;
+- return result;
+-}
+-
+-
+-/* Look up a plural variant. */
+-static char *
+-internal_function
+-plural_lookup (struct loaded_l10nfile *domain, unsigned long int n,
+- const char *translation, size_t translation_len)
+-{
+- struct loaded_domain *domaindata = (struct loaded_domain *) domain->data;
+- unsigned long int index;
+- const char *p;
+-
+- index = plural_eval (domaindata->plural, n);
+- if (index >= domaindata->nplurals)
+- /* This should never happen. It means the plural expression and the
+- given maximum value do not match. */
+- index = 0;
+-
+- /* Skip INDEX strings at TRANSLATION. */
+- p = translation;
+- while (index-- > 0)
+- {
+-#ifdef _LIBC
+- p = __rawmemchr (p, '\0');
+-#else
+- p = strchr (p, '\0');
+-#endif
+- /* And skip over the NUL byte. */
+- p++;
+-
+- if (p >= translation + translation_len)
+- /* This should never happen. It means the plural expression
+- evaluated to a value larger than the number of variants
+- available for MSGID1. */
+- return (char *) translation;
+- }
+- return (char *) p;
+-}
+-
+-#ifndef _LIBC
+-/* Return string representation of locale CATEGORY. */
+-static const char *
+-internal_function
+-category_to_name (int category)
+-{
+- const char *retval;
+-
+- switch (category)
+- {
+-#ifdef LC_COLLATE
+- case LC_COLLATE:
+- retval = "LC_COLLATE";
+- break;
+-#endif
+-#ifdef LC_CTYPE
+- case LC_CTYPE:
+- retval = "LC_CTYPE";
+- break;
+-#endif
+-#ifdef LC_MONETARY
+- case LC_MONETARY:
+- retval = "LC_MONETARY";
+- break;
+-#endif
+-#ifdef LC_NUMERIC
+- case LC_NUMERIC:
+- retval = "LC_NUMERIC";
+- break;
+-#endif
+-#ifdef LC_TIME
+- case LC_TIME:
+- retval = "LC_TIME";
+- break;
+-#endif
+-#ifdef LC_MESSAGES
+- case LC_MESSAGES:
+- retval = "LC_MESSAGES";
+- break;
+-#endif
+-#ifdef LC_RESPONSE
+- case LC_RESPONSE:
+- retval = "LC_RESPONSE";
+- break;
+-#endif
+-#ifdef LC_ALL
+- case LC_ALL:
+- /* This might not make sense but is perhaps better than any other
+- value. */
+- retval = "LC_ALL";
+- break;
+-#endif
+- default:
+- /* If you have a better idea for a default value let me know. */
+- retval = "LC_XXX";
+- }
+-
+- return retval;
+-}
+-#endif
+-
+-/* Guess value of current locale from value of the environment variables
+- or system-dependent defaults. */
+-static const char *
+-internal_function
+-#ifdef IN_LIBGLOCALE
+-guess_category_value (int category, const char *categoryname,
+- const char *locale)
+-
+-#else
+-guess_category_value (int category, const char *categoryname)
+-#endif
+-{
+- const char *language;
+-#ifndef IN_LIBGLOCALE
+- const char *locale;
+-# ifndef _LIBC
+- const char *language_default;
+- int locale_defaulted;
+-# endif
+-#endif
+-
+- /* We use the settings in the following order:
+- 1. The value of the environment variable 'LANGUAGE'. This is a GNU
+- extension. Its value can be a colon-separated list of locale names.
+- 2. The value of the environment variable 'LC_ALL', 'LC_xxx', or 'LANG'.
+- More precisely, the first among these that is set to a non-empty value.
+- This is how POSIX specifies it. The value is a single locale name.
+- 3. A system-dependent preference list of languages. Its value can be a
+- colon-separated list of locale names.
+- 4. A system-dependent default locale name.
+- This way:
+- - System-dependent settings can be overridden by environment variables.
+- - If the system provides both a list of languages and a default locale,
+- the former is used. */
+-
+-#ifndef IN_LIBGLOCALE
+- /* Fetch the locale name, through the POSIX method of looking to `LC_ALL',
+- `LC_xxx', and `LANG'. On some systems this can be done by the
+- `setlocale' function itself. */
+-# ifdef _LIBC
+- locale = __current_locale_name (category);
+-# else
+-# if HAVE_STRUCT___LOCALE_STRUCT___NAMES && defined USE_IN_GETTEXT_TESTS
+- /* The __names field is not public glibc API and must therefore not be used
+- in code that is installed in public locations. */
+- locale_t thread_locale = uselocale (NULL);
+- if (thread_locale != LC_GLOBAL_LOCALE)
+- {
+- locale = thread_locale->__names[category];
+- locale_defaulted = 0;
+- }
+- else
+-# endif
+- {
+- locale = _nl_locale_name_posix (category, categoryname);
+- locale_defaulted = 0;
+- if (locale == NULL)
+- {
+- locale = _nl_locale_name_default ();
+- locale_defaulted = 1;
+- }
+- }
+-# endif
+-#endif
+-
+- /* Ignore LANGUAGE and its system-dependent analogon if the locale is set
+- to "C" because
+- 1. "C" locale usually uses the ASCII encoding, and most international
+- messages use non-ASCII characters. These characters get displayed
+- as question marks (if using glibc's iconv()) or as invalid 8-bit
+- characters (because other iconv()s refuse to convert most non-ASCII
+- characters to ASCII). In any case, the output is ugly.
+- 2. The precise output of some programs in the "C" locale is specified
+- by POSIX and should not depend on environment variables like
+- "LANGUAGE" or system-dependent information. We allow such programs
+- to use gettext(). */
+- if (strcmp (locale, "C") == 0)
+- return locale;
+-
+- /* The highest priority value is the value of the 'LANGUAGE' environment
+- variable. */
+- language = getenv ("LANGUAGE");
+- if (language != NULL && language[0] != '\0')
+- return language;
+-#if !defined IN_LIBGLOCALE && !defined _LIBC
+- /* The next priority value is the locale name, if not defaulted. */
+- if (locale_defaulted)
+- {
+- /* The next priority value is the default language preferences list. */
+- language_default = _nl_language_preferences_default ();
+- if (language_default != NULL)
+- return language_default;
+- }
+- /* The least priority value is the locale name, if defaulted. */
+-#endif
+- return locale;
+-}
+-
+-#if (defined _LIBC || HAVE_ICONV) && !defined IN_LIBGLOCALE
+-/* Returns the output charset. */
+-static const char *
+-internal_function
+-get_output_charset (struct binding *domainbinding)
+-{
+- /* The output charset should normally be determined by the locale. But
+- sometimes the locale is not used or not correctly set up, so we provide
+- a possibility for the user to override this: the OUTPUT_CHARSET
+- environment variable. Moreover, the value specified through
+- bind_textdomain_codeset overrides both. */
+- if (domainbinding != NULL && domainbinding->codeset != NULL)
+- return domainbinding->codeset;
+- else
+- {
+- /* For speed reasons, we look at the value of OUTPUT_CHARSET only
+- once. This is a user variable that is not supposed to change
+- during a program run. */
+- static char *output_charset_cache;
+- static int output_charset_cached;
+-
+- if (!output_charset_cached)
+- {
+- const char *value = getenv ("OUTPUT_CHARSET");
+-
+- if (value != NULL && value[0] != '\0')
+- {
+- size_t len = strlen (value) + 1;
+- char *value_copy = (char *) malloc (len);
+-
+- if (value_copy != NULL)
+- memcpy (value_copy, value, len);
+- output_charset_cache = value_copy;
+- }
+- output_charset_cached = 1;
+- }
+-
+- if (output_charset_cache != NULL)
+- return output_charset_cache;
+- else
+- {
+-# ifdef _LIBC
+- return _NL_CURRENT (LC_CTYPE, CODESET);
+-# else
+-# if HAVE_ICONV
+- return locale_charset ();
+-# endif
+-# endif
+- }
+- }
+-}
+-#endif
+-
+-/* @@ begin of epilog @@ */
+-
+-/* We don't want libintl.a to depend on any other library. So we
+- avoid the non-standard function stpcpy. In GNU C Library this
+- function is available, though. Also allow the symbol HAVE_STPCPY
+- to be defined. */
+-#if !_LIBC && !HAVE_STPCPY
+-static char *
+-stpcpy (char *dest, const char *src)
+-{
+- while ((*dest++ = *src++) != '\0')
+- /* Do nothing. */ ;
+- return dest - 1;
+-}
+-#endif
+-
+-#if !_LIBC && !HAVE_MEMPCPY
+-static void *
+-mempcpy (void *dest, const void *src, size_t n)
+-{
+- return (void *) ((char *) memcpy (dest, src, n) + n);
+-}
+-#endif
+-
+-#if !_LIBC && !HAVE_TSEARCH
+-# include "tsearch.c"
+-#endif
+-
+-
+-#ifdef _LIBC
+-/* If we want to free all resources we have to do some work at
+- program's end. */
+-libc_freeres_fn (free_mem)
+-{
+- void *old;
+-
+- while (_nl_domain_bindings != NULL)
+- {
+- struct binding *oldp = _nl_domain_bindings;
+- _nl_domain_bindings = _nl_domain_bindings->next;
+- if (oldp->dirname != _nl_default_dirname)
+- /* Yes, this is a pointer comparison. */
+- free (oldp->dirname);
+- free (oldp->codeset);
+- free (oldp);
+- }
+-
+- if (_nl_current_default_domain != _nl_default_default_domain)
+- /* Yes, again a pointer comparison. */
+- free ((char *) _nl_current_default_domain);
+-
+- /* Remove the search tree with the known translations. */
+- __tdestroy (root, free);
+- root = NULL;
+-
+- while (transmem_list != NULL)
+- {
+- old = transmem_list;
+- transmem_list = transmem_list->next;
+- free (old);
+- }
+-}
+-#endif
+--- a/intl/dcngettext.c
++++ /dev/null
+@@ -1,57 +0,0 @@
+-/* Implementation of the dcngettext(3) function.
+- Copyright (C) 1995-1999, 2000-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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+- USA. */
+-
+-#ifdef HAVE_CONFIG_H
+-# include <config.h>
+-#endif
+-
+-#include "gettextP.h"
+-#ifdef _LIBC
+-# include <libintl.h>
+-#else
+-# include "libgnuintl.h"
+-#endif
+-
+-/* @@ end of prolog @@ */
+-
+-/* Names for the libintl functions are a problem. They must not clash
+- with existing names and they should follow ANSI C. But this source
+- code is also used in GNU C Library where the names have a __
+- prefix. So we have to make a difference here. */
+-#ifdef _LIBC
+-# define DCNGETTEXT __dcngettext
+-# define DCIGETTEXT __dcigettext
+-#else
+-# define DCNGETTEXT libintl_dcngettext
+-# define DCIGETTEXT libintl_dcigettext
+-#endif
+-
+-/* Look up MSGID in the DOMAINNAME message catalog for the current CATEGORY
+- locale. */
+-char *
+-DCNGETTEXT (const char *domainname,
+- const char *msgid1, const char *msgid2, unsigned long int n,
+- int category)
+-{
+- return DCIGETTEXT (domainname, msgid1, msgid2, 1, n, category);
+-}
+-
+-#ifdef _LIBC
+-/* Alias for function name in GNU C Library. */
+-weak_alias (__dcngettext, dcngettext);
+-#endif
+--- a/intl/dgettext.c
++++ /dev/null
+@@ -1,58 +0,0 @@
+-/* Implementation of the dgettext(3) function.
+- Copyright (C) 1995-1997, 2000-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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+- USA. */
+-
+-#ifdef HAVE_CONFIG_H
+-# include <config.h>
+-#endif
+-
+-#include "gettextP.h"
+-
+-#include <locale.h>
+-
+-#ifdef _LIBC
+-# include <libintl.h>
+-#else
+-# include "libgnuintl.h"
+-#endif
+-
+-/* @@ end of prolog @@ */
+-
+-/* Names for the libintl functions are a problem. They must not clash
+- with existing names and they should follow ANSI C. But this source
+- code is also used in GNU C Library where the names have a __
+- prefix. So we have to make a difference here. */
+-#ifdef _LIBC
+-# define DGETTEXT __dgettext
+-# define DCGETTEXT INTUSE(__dcgettext)
+-#else
+-# define DGETTEXT libintl_dgettext
+-# define DCGETTEXT libintl_dcgettext
+-#endif
+-
+-/* Look up MSGID in the DOMAINNAME message catalog of the current
+- LC_MESSAGES locale. */
+-char *
+-DGETTEXT (const char *domainname, const char *msgid)
+-{
+- return DCGETTEXT (domainname, msgid, LC_MESSAGES);
+-}
+-
+-#ifdef _LIBC
+-/* Alias for function name in GNU C Library. */
+-weak_alias (__dgettext, dgettext);
+-#endif
+--- a/intl/dngettext.c
++++ /dev/null
+@@ -1,59 +0,0 @@
+-/* Implementation of the dngettext(3) function.
+- Copyright (C) 1995-1997, 2000-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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+- USA. */
+-
+-#ifdef HAVE_CONFIG_H
+-# include <config.h>
+-#endif
+-
+-#include "gettextP.h"
+-
+-#include <locale.h>
+-
+-#ifdef _LIBC
+-# include <libintl.h>
+-#else
+-# include "libgnuintl.h"
+-#endif
+-
+-/* @@ end of prolog @@ */
+-
+-/* Names for the libintl functions are a problem. They must not clash
+- with existing names and they should follow ANSI C. But this source
+- code is also used in GNU C Library where the names have a __
+- prefix. So we have to make a difference here. */
+-#ifdef _LIBC
+-# define DNGETTEXT __dngettext
+-# define DCNGETTEXT __dcngettext
+-#else
+-# define DNGETTEXT libintl_dngettext
+-# define DCNGETTEXT libintl_dcngettext
+-#endif
+-
+-/* Look up MSGID in the DOMAINNAME message catalog of the current
+- LC_MESSAGES locale and skip message according to the plural form. */
+-char *
+-DNGETTEXT (const char *domainname,
+- const char *msgid1, const char *msgid2, unsigned long int n)
+-{
+- return DCNGETTEXT (domainname, msgid1, msgid2, n, LC_MESSAGES);
+-}
+-
+-#ifdef _LIBC
+-/* Alias for function name in GNU C Library. */
+-weak_alias (__dngettext, dngettext);
+-#endif
+--- a/intl/eval-plural.h
++++ /dev/null
+@@ -1,108 +0,0 @@
+-/* Plural expression evaluation.
+- Copyright (C) 2000-2003, 2007 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. */
+-
+-#ifndef STATIC
+-#define STATIC static
+-#endif
+-
+-/* Evaluate the plural expression and return an index value. */
+-STATIC
+-unsigned long int
+-internal_function
+-plural_eval (const struct expression *pexp, unsigned long int n)
+-{
+- switch (pexp->nargs)
+- {
+- case 0:
+- switch (pexp->operation)
+- {
+- case var:
+- return n;
+- case num:
+- return pexp->val.num;
+- default:
+- break;
+- }
+- /* NOTREACHED */
+- break;
+- case 1:
+- {
+- /* pexp->operation must be lnot. */
+- unsigned long int arg = plural_eval (pexp->val.args[0], n);
+- return ! arg;
+- }
+- case 2:
+- {
+- unsigned long int leftarg = plural_eval (pexp->val.args[0], n);
+- if (pexp->operation == lor)
+- return leftarg || plural_eval (pexp->val.args[1], n);
+- else if (pexp->operation == land)
+- return leftarg && plural_eval (pexp->val.args[1], n);
+- else
+- {
+- unsigned long int rightarg = plural_eval (pexp->val.args[1], n);
+-
+- switch (pexp->operation)
+- {
+- case mult:
+- return leftarg * rightarg;
+- case divide:
+-#if !INTDIV0_RAISES_SIGFPE
+- if (rightarg == 0)
+- raise (SIGFPE);
+-#endif
+- return leftarg / rightarg;
+- case module:
+-#if !INTDIV0_RAISES_SIGFPE
+- if (rightarg == 0)
+- raise (SIGFPE);
+-#endif
+- return leftarg % rightarg;
+- case plus:
+- return leftarg + rightarg;
+- case minus:
+- return leftarg - rightarg;
+- case less_than:
+- return leftarg < rightarg;
+- case greater_than:
+- return leftarg > rightarg;
+- case less_or_equal:
+- return leftarg <= rightarg;
+- case greater_or_equal:
+- return leftarg >= rightarg;
+- case equal:
+- return leftarg == rightarg;
+- case not_equal:
+- return leftarg != rightarg;
+- default:
+- break;
+- }
+- }
+- /* NOTREACHED */
+- break;
+- }
+- case 3:
+- {
+- /* pexp->operation must be qmop. */
+- unsigned long int boolarg = plural_eval (pexp->val.args[0], n);
+- return plural_eval (pexp->val.args[boolarg ? 1 : 2], n);
+- }
+- }
+- /* NOTREACHED */
+- return 0;
+-}
+--- a/intl/explodename.c
++++ /dev/null
+@@ -1,135 +0,0 @@
+-/* Copyright (C) 1995-1998, 2000-2001, 2003, 2005, 2007 Free Software Foundation, Inc.
+- Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
+-
+- This program is free software; you can redistribute it and/or modify it
+- under the terms of the GNU 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. */
+-
+-#ifdef HAVE_CONFIG_H
+-# include <config.h>
+-#endif
+-
+-#include <stdlib.h>
+-#include <string.h>
+-#include <sys/types.h>
+-
+-#include "loadinfo.h"
+-
+-/* On some strange systems still no definition of NULL is found. Sigh! */
+-#ifndef NULL
+-# if defined __STDC__ && __STDC__
+-# define NULL ((void *) 0)
+-# else
+-# define NULL 0
+-# endif
+-#endif
+-
+-/* @@ end of prolog @@ */
+-
+-/* Split a locale name NAME into a leading language part and all the
+- rest. Return a pointer to the first character after the language,
+- i.e. to the first byte of the rest. */
+-static char *_nl_find_language (const char *name);
+-
+-static char *
+-_nl_find_language (const char *name)
+-{
+- while (name[0] != '\0' && name[0] != '_' && name[0] != '@' && name[0] != '.')
+- ++name;
+-
+- return (char *) name;
+-}
+-
+-
+-int
+-_nl_explode_name (char *name,
+- const char **language, const char **modifier,
+- const char **territory, const char **codeset,
+- const char **normalized_codeset)
+-{
+- char *cp;
+- int mask;
+-
+- *modifier = NULL;
+- *territory = NULL;
+- *codeset = NULL;
+- *normalized_codeset = NULL;
+-
+- /* Now we determine the single parts of the locale name. First
+- look for the language. Termination symbols are `_', '.', and `@'. */
+- mask = 0;
+- *language = cp = name;
+- cp = _nl_find_language (*language);
+-
+- if (*language == cp)
+- /* This does not make sense: language has to be specified. Use
+- this entry as it is without exploding. Perhaps it is an alias. */
+- cp = strchr (*language, '\0');
+- else
+- {
+- if (cp[0] == '_')
+- {
+- /* Next is the territory. */
+- cp[0] = '\0';
+- *territory = ++cp;
+-
+- while (cp[0] != '\0' && cp[0] != '.' && cp[0] != '@')
+- ++cp;
+-
+- mask |= XPG_TERRITORY;
+- }
+-
+- if (cp[0] == '.')
+- {
+- /* Next is the codeset. */
+- cp[0] = '\0';
+- *codeset = ++cp;
+-
+- while (cp[0] != '\0' && cp[0] != '@')
+- ++cp;
+-
+- mask |= XPG_CODESET;
+-
+- if (*codeset != cp && (*codeset)[0] != '\0')
+- {
+- *normalized_codeset = _nl_normalize_codeset (*codeset,
+- cp - *codeset);
+- if (*normalized_codeset == NULL)
+- return -1;
+- else if (strcmp (*codeset, *normalized_codeset) == 0)
+- free ((char *) *normalized_codeset);
+- else
+- mask |= XPG_NORM_CODESET;
+- }
+- }
+- }
+-
+- if (cp[0] == '@')
+- {
+- /* Next is the modifier. */
+- cp[0] = '\0';
+- *modifier = ++cp;
+-
+- if (cp[0] != '\0')
+- mask |= XPG_MODIFIER;
+- }
+-
+- if (*territory != NULL && (*territory)[0] == '\0')
+- mask &= ~XPG_TERRITORY;
+-
+- if (*codeset != NULL && (*codeset)[0] == '\0')
+- mask &= ~XPG_CODESET;
+-
+- return mask;
+-}
+--- a/intl/export.h
++++ /dev/null
+@@ -1,6 +0,0 @@
+-
+-#if @HAVE_VISIBILITY@ && BUILDING_LIBINTL
+-#define LIBINTL_DLL_EXPORTED __attribute__((__visibility__("default")))
+-#else
+-#define LIBINTL_DLL_EXPORTED
+-#endif
+--- a/intl/finddomain.c
++++ /dev/null
+@@ -1,212 +0,0 @@
+-/* Handle list of needed message catalogs
+- Copyright (C) 1995-1999, 2000-2001, 2003-2007 Free Software Foundation, Inc.
+- Written by Ulrich Drepper <drepper@gnu.org>, 1995.
+-
+- 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. */
+-
+-#ifdef HAVE_CONFIG_H
+-# include <config.h>
+-#endif
+-
+-#include <stdio.h>
+-#include <sys/types.h>
+-#include <stdlib.h>
+-#include <string.h>
+-
+-#if defined HAVE_UNISTD_H || defined _LIBC
+-# include <unistd.h>
+-#endif
+-
+-#include "gettextP.h"
+-#ifdef _LIBC
+-# include <libintl.h>
+-#else
+-# include "libgnuintl.h"
+-#endif
+-
+-/* Handle multi-threaded applications. */
+-#ifdef _LIBC
+-# include <bits/libc-lock.h>
+-# define gl_rwlock_define_initialized __libc_rwlock_define_initialized
+-# define gl_rwlock_rdlock __libc_rwlock_rdlock
+-# define gl_rwlock_wrlock __libc_rwlock_wrlock
+-# define gl_rwlock_unlock __libc_rwlock_unlock
+-#else
+-# include "lock.h"
+-#endif
+-
+-/* @@ end of prolog @@ */
+-/* List of already loaded domains. */
+-static struct loaded_l10nfile *_nl_loaded_domains;
+-
+-
+-/* Return a data structure describing the message catalog described by
+- the DOMAINNAME and CATEGORY parameters with respect to the currently
+- established bindings. */
+-struct loaded_l10nfile *
+-internal_function
+-_nl_find_domain (const char *dirname, char *locale,
+- const char *domainname, struct binding *domainbinding)
+-{
+- struct loaded_l10nfile *retval;
+- const char *language;
+- const char *modifier;
+- const char *territory;
+- const char *codeset;
+- const char *normalized_codeset;
+- const char *alias_value;
+- int mask;
+-
+- /* LOCALE can consist of up to four recognized parts for the XPG syntax:
+-
+- language[_territory][.codeset][@modifier]
+-
+- Beside the first part all of them are allowed to be missing. If
+- the full specified locale is not found, the less specific one are
+- looked for. The various parts will be stripped off according to
+- the following order:
+- (1) codeset
+- (2) normalized codeset
+- (3) territory
+- (4) modifier
+- */
+-
+- /* We need to protect modifying the _NL_LOADED_DOMAINS data. */
+- gl_rwlock_define_initialized (static, lock);
+- gl_rwlock_rdlock (lock);
+-
+- /* If we have already tested for this locale entry there has to
+- be one data set in the list of loaded domains. */
+- retval = _nl_make_l10nflist (&_nl_loaded_domains, dirname,
+- strlen (dirname) + 1, 0, locale, NULL, NULL,
+- NULL, NULL, domainname, 0);
+-
+- gl_rwlock_unlock (lock);
+-
+- if (retval != NULL)
+- {
+- /* We know something about this locale. */
+- int cnt;
+-
+- if (retval->decided <= 0)
+- _nl_load_domain (retval, domainbinding);
+-
+- if (retval->data != NULL)
+- return retval;
+-
+- for (cnt = 0; retval->successor[cnt] != NULL; ++cnt)
+- {
+- if (retval->successor[cnt]->decided <= 0)
+- _nl_load_domain (retval->successor[cnt], domainbinding);
+-
+- if (retval->successor[cnt]->data != NULL)
+- break;
+- }
+-
+- return retval;
+- /* NOTREACHED */
+- }
+-
+- /* See whether the locale value is an alias. If yes its value
+- *overwrites* the alias name. No test for the original value is
+- done. */
+- alias_value = _nl_expand_alias (locale);
+- if (alias_value != NULL)
+- {
+-#if defined _LIBC || defined HAVE_STRDUP
+- locale = strdup (alias_value);
+- if (locale == NULL)
+- return NULL;
+-#else
+- size_t len = strlen (alias_value) + 1;
+- locale = (char *) malloc (len);
+- if (locale == NULL)
+- return NULL;
+-
+- memcpy (locale, alias_value, len);
+-#endif
+- }
+-
+- /* Now we determine the single parts of the locale name. First
+- look for the language. Termination symbols are `_', '.', and `@'. */
+- mask = _nl_explode_name (locale, &language, &modifier, &territory,
+- &codeset, &normalized_codeset);
+- if (mask == -1)
+- /* This means we are out of core. */
+- return NULL;
+-
+- /* We need to protect modifying the _NL_LOADED_DOMAINS data. */
+- gl_rwlock_wrlock (lock);
+-
+- /* Create all possible locale entries which might be interested in
+- generalization. */
+- retval = _nl_make_l10nflist (&_nl_loaded_domains, dirname,
+- strlen (dirname) + 1, mask, language, territory,
+- codeset, normalized_codeset, modifier,
+- domainname, 1);
+-
+- gl_rwlock_unlock (lock);
+-
+- if (retval == NULL)
+- /* This means we are out of core. */
+- goto out;
+-
+- if (retval->decided <= 0)
+- _nl_load_domain (retval, domainbinding);
+- if (retval->data == NULL)
+- {
+- int cnt;
+- for (cnt = 0; retval->successor[cnt] != NULL; ++cnt)
+- {
+- if (retval->successor[cnt]->decided <= 0)
+- _nl_load_domain (retval->successor[cnt], domainbinding);
+- if (retval->successor[cnt]->data != NULL)
+- break;
+- }
+- }
+-
+- /* The room for an alias was dynamically allocated. Free it now. */
+- if (alias_value != NULL)
+- free (locale);
+-
+-out:
+- /* The space for normalized_codeset is dynamically allocated. Free it. */
+- if (mask & XPG_NORM_CODESET)
+- free ((void *) normalized_codeset);
+-
+- return retval;
+-}
+-
+-
+-#ifdef _LIBC
+-/* This is called from iconv/gconv_db.c's free_mem, as locales must
+- be freed before freeing gconv steps arrays. */
+-void __libc_freeres_fn_section
+-_nl_finddomain_subfreeres ()
+-{
+- struct loaded_l10nfile *runp = _nl_loaded_domains;
+-
+- while (runp != NULL)
+- {
+- struct loaded_l10nfile *here = runp;
+- if (runp->data != NULL)
+- _nl_unload_domain ((struct loaded_domain *) runp->data);
+- runp = runp->next;
+- free ((char *) here->filename);
+- free (here);
+- }
+-}
+-#endif
+--- a/intl/gettext.c
++++ /dev/null
+@@ -1,63 +0,0 @@
+-/* Implementation of gettext(3) function.
+- Copyright (C) 1995, 1997, 2000-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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+- USA. */
+-
+-#ifdef HAVE_CONFIG_H
+-# include <config.h>
+-#endif
+-
+-#ifdef _LIBC
+-# define __need_NULL
+-# include <stddef.h>
+-#else
+-# include <stdlib.h> /* Just for NULL. */
+-#endif
+-
+-#include "gettextP.h"
+-#ifdef _LIBC
+-# include <libintl.h>
+-#else
+-# include "libgnuintl.h"
+-#endif
+-
+-/* @@ end of prolog @@ */
+-
+-/* Names for the libintl functions are a problem. They must not clash
+- with existing names and they should follow ANSI C. But this source
+- code is also used in GNU C Library where the names have a __
+- prefix. So we have to make a difference here. */
+-#ifdef _LIBC
+-# define GETTEXT __gettext
+-# define DCGETTEXT INTUSE(__dcgettext)
+-#else
+-# define GETTEXT libintl_gettext
+-# define DCGETTEXT libintl_dcgettext
+-#endif
+-
+-/* Look up MSGID in the current default message catalog for the current
+- LC_MESSAGES locale. If not found, returns MSGID itself (the default
+- text). */
+-char *
+-GETTEXT (const char *msgid)
+-{
+- return DCGETTEXT (NULL, msgid, LC_MESSAGES);
+-}
+-
+-#ifdef _LIBC
+-/* Alias for function name in GNU C Library. */
+-weak_alias (__gettext, gettext);
+-#endif
+--- a/intl/gettextP.h
++++ /dev/null
+@@ -1,297 +0,0 @@
+-/* Header describing internals of libintl library.
+- Copyright (C) 1995-1999, 2000-2007 Free Software Foundation, Inc.
+- Written by Ulrich Drepper <drepper@cygnus.com>, 1995.
+-
+- 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 _GETTEXTP_H
+-#define _GETTEXTP_H
+-
+-#include <stddef.h> /* Get size_t. */
+-
+-#ifdef _LIBC
+-# include "../iconv/gconv_int.h"
+-#else
+-# if HAVE_ICONV
+-# include <iconv.h>
+-# endif
+-#endif
+-
+-/* Handle multi-threaded applications. */
+-#ifdef _LIBC
+-# include <bits/libc-lock.h>
+-# define gl_rwlock_define __libc_rwlock_define
+-#else
+-# include "lock.h"
+-#endif
+-
+-#ifdef _LIBC
+-extern char *__gettext (const char *__msgid);
+-extern char *__dgettext (const char *__domainname, const char *__msgid);
+-extern char *__dcgettext (const char *__domainname, const char *__msgid,
+- int __category);
+-extern char *__ngettext (const char *__msgid1, const char *__msgid2,
+- unsigned long int __n);
+-extern char *__dngettext (const char *__domainname,
+- const char *__msgid1, const char *__msgid2,
+- unsigned long int n);
+-extern char *__dcngettext (const char *__domainname,
+- const char *__msgid1, const char *__msgid2,
+- unsigned long int __n, int __category);
+-extern char *__dcigettext (const char *__domainname,
+- const char *__msgid1, const char *__msgid2,
+- int __plural, unsigned long int __n,
+- int __category);
+-extern char *__textdomain (const char *__domainname);
+-extern char *__bindtextdomain (const char *__domainname,
+- const char *__dirname);
+-extern char *__bind_textdomain_codeset (const char *__domainname,
+- const char *__codeset);
+-extern void _nl_finddomain_subfreeres (void) attribute_hidden;
+-extern void _nl_unload_domain (struct loaded_domain *__domain)
+- internal_function attribute_hidden;
+-#else
+-/* Declare the exported libintl_* functions, in a way that allows us to
+- call them under their real name. */
+-# undef _INTL_REDIRECT_INLINE
+-# undef _INTL_REDIRECT_MACROS
+-# define _INTL_REDIRECT_MACROS
+-# include "libgnuintl.h"
+-# ifdef IN_LIBGLOCALE
+-extern char *gl_dcigettext (const char *__domainname,
+- const char *__msgid1, const char *__msgid2,
+- int __plural, unsigned long int __n,
+- int __category,
+- const char *__localename, const char *__encoding);
+-# else
+-extern char *libintl_dcigettext (const char *__domainname,
+- const char *__msgid1, const char *__msgid2,
+- int __plural, unsigned long int __n,
+- int __category);
+-# endif
+-#endif
+-
+-#include "loadinfo.h"
+-
+-#include "gmo.h" /* Get nls_uint32. */
+-
+-/* @@ end of prolog @@ */
+-
+-#ifndef internal_function
+-# define internal_function
+-#endif
+-
+-#ifndef attribute_hidden
+-# define attribute_hidden
+-#endif
+-
+-/* Tell the compiler when a conditional or integer expression is
+- almost always true or almost always false. */
+-#ifndef HAVE_BUILTIN_EXPECT
+-# define __builtin_expect(expr, val) (expr)
+-#endif
+-
+-#ifndef W
+-# define W(flag, data) ((flag) ? SWAP (data) : (data))
+-#endif
+-
+-
+-#ifdef _LIBC
+-# include <byteswap.h>
+-# define SWAP(i) bswap_32 (i)
+-#else
+-static inline nls_uint32
+-# ifdef __cplusplus
+-SWAP (nls_uint32 i)
+-# else
+-SWAP (i)
+- nls_uint32 i;
+-# endif
+-{
+- return (i << 24) | ((i & 0xff00) << 8) | ((i >> 8) & 0xff00) | (i >> 24);
+-}
+-#endif
+-
+-
+-/* In-memory representation of system dependent string. */
+-struct sysdep_string_desc
+-{
+- /* Length of addressed string, including the trailing NUL. */
+- size_t length;
+- /* Pointer to addressed string. */
+- const char *pointer;
+-};
+-
+-/* Cache of translated strings after charset conversion.
+- Note: The strings are converted to the target encoding only on an as-needed
+- basis. */
+-struct converted_domain
+-{
+- /* The target encoding name. */
+- const char *encoding;
+- /* The descriptor for conversion from the message catalog's encoding to
+- this target encoding. */
+-#ifdef _LIBC
+- __gconv_t conv;
+-#else
+-# if HAVE_ICONV
+- iconv_t conv;
+-# endif
+-#endif
+- /* The table of translated strings after charset conversion. */
+- char **conv_tab;
+-};
+-
+-/* The representation of an opened message catalog. */
+-struct loaded_domain
+-{
+- /* Pointer to memory containing the .mo file. */
+- const char *data;
+- /* 1 if the memory is mmap()ed, 0 if the memory is malloc()ed. */
+- int use_mmap;
+- /* Size of mmap()ed memory. */
+- size_t mmap_size;
+- /* 1 if the .mo file uses a different endianness than this machine. */
+- int must_swap;
+- /* Pointer to additional malloc()ed memory. */
+- void *malloced;
+-
+- /* Number of static strings pairs. */
+- nls_uint32 nstrings;
+- /* Pointer to descriptors of original strings in the file. */
+- const struct string_desc *orig_tab;
+- /* Pointer to descriptors of translated strings in the file. */
+- const struct string_desc *trans_tab;
+-
+- /* Number of system dependent strings pairs. */
+- nls_uint32 n_sysdep_strings;
+- /* Pointer to descriptors of original sysdep strings. */
+- const struct sysdep_string_desc *orig_sysdep_tab;
+- /* Pointer to descriptors of translated sysdep strings. */
+- const struct sysdep_string_desc *trans_sysdep_tab;
+-
+- /* Size of hash table. */
+- nls_uint32 hash_size;
+- /* Pointer to hash table. */
+- const nls_uint32 *hash_tab;
+- /* 1 if the hash table uses a different endianness than this machine. */
+- int must_swap_hash_tab;
+-
+- /* Cache of charset conversions of the translated strings. */
+- struct converted_domain *conversions;
+- size_t nconversions;
+- gl_rwlock_define (, conversions_lock)
+-
+- const struct expression *plural;
+- unsigned long int nplurals;
+-};
+-
+-/* We want to allocate a string at the end of the struct. But ISO C
+- doesn't allow zero sized arrays. */
+-#ifdef __GNUC__
+-# define ZERO 0
+-#else
+-# define ZERO 1
+-#endif
+-
+-/* A set of settings bound to a message domain. Used to store settings
+- from bindtextdomain() and bind_textdomain_codeset(). */
+-struct binding
+-{
+- struct binding *next;
+- char *dirname;
+- char *codeset;
+- char domainname[ZERO];
+-};
+-
+-/* A counter which is incremented each time some previous translations
+- become invalid.
+- This variable is part of the external ABI of the GNU libintl. */
+-#ifdef IN_LIBGLOCALE
+-# include <glocale/config.h>
+-extern LIBGLOCALE_DLL_EXPORTED int _nl_msg_cat_cntr;
+-#else
+-extern LIBINTL_DLL_EXPORTED int _nl_msg_cat_cntr;
+-#endif
+-
+-#ifndef _LIBC
+-extern const char *_nl_language_preferences_default (void);
+-# define gl_locale_name_canonicalize _nl_locale_name_canonicalize
+-extern void _nl_locale_name_canonicalize (char *name);
+-# define gl_locale_name_posix _nl_locale_name_posix
+-extern const char *_nl_locale_name_posix (int category,
+- const char *categoryname);
+-# define gl_locale_name_default _nl_locale_name_default
+-extern const char *_nl_locale_name_default (void);
+-# define gl_locale_name _nl_locale_name
+-extern const char *_nl_locale_name (int category, const char *categoryname);
+-#endif
+-
+-struct loaded_l10nfile *_nl_find_domain (const char *__dirname, char *__locale,
+- const char *__domainname,
+- struct binding *__domainbinding)
+- internal_function;
+-void _nl_load_domain (struct loaded_l10nfile *__domain,
+- struct binding *__domainbinding)
+- internal_function;
+-
+-#ifdef IN_LIBGLOCALE
+-char *_nl_find_msg (struct loaded_l10nfile *domain_file,
+- struct binding *domainbinding, const char *encoding,
+- const char *msgid,
+- size_t *lengthp)
+- internal_function;
+-#else
+-char *_nl_find_msg (struct loaded_l10nfile *domain_file,
+- struct binding *domainbinding, const char *msgid,
+- int convert, size_t *lengthp)
+- internal_function;
+-#endif
+-
+-/* The internal variables in the standalone libintl.a must have different
+- names than the internal variables in GNU libc, otherwise programs
+- using libintl.a cannot be linked statically. */
+-#if !defined _LIBC
+-# define _nl_default_dirname libintl_nl_default_dirname
+-# define _nl_domain_bindings libintl_nl_domain_bindings
+-#endif
+-
+-/* Contains the default location of the message catalogs. */
+-extern const char _nl_default_dirname[];
+-#ifdef _LIBC
+-libc_hidden_proto (_nl_default_dirname)
+-#endif
+-
+-/* List with bindings of specific domains. */
+-extern struct binding *_nl_domain_bindings;
+-
+-/* The internal variables in the standalone libintl.a must have different
+- names than the internal variables in GNU libc, otherwise programs
+- using libintl.a cannot be linked statically. */
+-#if !defined _LIBC
+-# define _nl_default_default_domain libintl_nl_default_default_domain
+-# define _nl_current_default_domain libintl_nl_current_default_domain
+-#endif
+-
+-/* Name of the default text domain. */
+-extern const char _nl_default_default_domain[] attribute_hidden;
+-
+-/* Default text domain in which entries for gettext(3) are to be found. */
+-extern const char *_nl_current_default_domain attribute_hidden;
+-
+-/* @@ begin of epilog @@ */
+-
+-#endif /* gettextP.h */
+--- a/intl/gmo.h
++++ /dev/null
+@@ -1,152 +0,0 @@
+-/* Description of GNU message catalog format: general file layout.
+- Copyright (C) 1995, 1997, 2000-2002, 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. */
+-
+-#ifndef _GETTEXT_H
+-#define _GETTEXT_H 1
+-
+-#include <limits.h>
+-
+-/* @@ end of prolog @@ */
+-
+-/* The magic number of the GNU message catalog format. */
+-#define _MAGIC 0x950412de
+-#define _MAGIC_SWAPPED 0xde120495
+-
+-/* Revision number of the currently used .mo (binary) file format. */
+-#define MO_REVISION_NUMBER 0
+-#define MO_REVISION_NUMBER_WITH_SYSDEP_I 1
+-
+-/* The following contortions are an attempt to use the C preprocessor
+- to determine an unsigned integral type that is 32 bits wide. An
+- alternative approach is to use autoconf's AC_CHECK_SIZEOF macro, but
+- as of version autoconf-2.13, the AC_CHECK_SIZEOF macro doesn't work
+- when cross-compiling. */
+-
+-#if __STDC__
+-# define UINT_MAX_32_BITS 4294967295U
+-#else
+-# define UINT_MAX_32_BITS 0xFFFFFFFF
+-#endif
+-
+-/* If UINT_MAX isn't defined, assume it's a 32-bit type.
+- This should be valid for all systems GNU cares about because
+- that doesn't include 16-bit systems, and only modern systems
+- (that certainly have <limits.h>) have 64+-bit integral types. */
+-
+-#ifndef UINT_MAX
+-# define UINT_MAX UINT_MAX_32_BITS
+-#endif
+-
+-#if UINT_MAX == UINT_MAX_32_BITS
+-typedef unsigned nls_uint32;
+-#else
+-# if USHRT_MAX == UINT_MAX_32_BITS
+-typedef unsigned short nls_uint32;
+-# else
+-# if ULONG_MAX == UINT_MAX_32_BITS
+-typedef unsigned long nls_uint32;
+-# else
+- /* The following line is intended to throw an error. Using #error is
+- not portable enough. */
+- "Cannot determine unsigned 32-bit data type."
+-# endif
+-# endif
+-#endif
+-
+-
+-/* Header for binary .mo file format. */
+-struct mo_file_header
+-{
+- /* The magic number. */
+- nls_uint32 magic;
+- /* The revision number of the file format. */
+- nls_uint32 revision;
+-
+- /* The following are only used in .mo files with major revision 0 or 1. */
+-
+- /* The number of strings pairs. */
+- nls_uint32 nstrings;
+- /* Offset of table with start offsets of original strings. */
+- nls_uint32 orig_tab_offset;
+- /* Offset of table with start offsets of translated strings. */
+- nls_uint32 trans_tab_offset;
+- /* Size of hash table. */
+- nls_uint32 hash_tab_size;
+- /* Offset of first hash table entry. */
+- nls_uint32 hash_tab_offset;
+-
+- /* The following are only used in .mo files with minor revision >= 1. */
+-
+- /* The number of system dependent segments. */
+- nls_uint32 n_sysdep_segments;
+- /* Offset of table describing system dependent segments. */
+- nls_uint32 sysdep_segments_offset;
+- /* The number of system dependent strings pairs. */
+- nls_uint32 n_sysdep_strings;
+- /* Offset of table with start offsets of original sysdep strings. */
+- nls_uint32 orig_sysdep_tab_offset;
+- /* Offset of table with start offsets of translated sysdep strings. */
+- nls_uint32 trans_sysdep_tab_offset;
+-};
+-
+-/* Descriptor for static string contained in the binary .mo file. */
+-struct string_desc
+-{
+- /* Length of addressed string, not including the trailing NUL. */
+- nls_uint32 length;
+- /* Offset of string in file. */
+- nls_uint32 offset;
+-};
+-
+-/* The following are only used in .mo files with minor revision >= 1. */
+-
+-/* Descriptor for system dependent string segment. */
+-struct sysdep_segment
+-{
+- /* Length of addressed string, including the trailing NUL. */
+- nls_uint32 length;
+- /* Offset of string in file. */
+- nls_uint32 offset;
+-};
+-
+-/* Pair of a static and a system dependent segment, in struct sysdep_string. */
+-struct segment_pair
+-{
+- /* Size of static segment. */
+- nls_uint32 segsize;
+- /* Reference to system dependent string segment, or ~0 at the end. */
+- nls_uint32 sysdepref;
+-};
+-
+-/* Descriptor for system dependent string. */
+-struct sysdep_string
+-{
+- /* Offset of static string segments in file. */
+- nls_uint32 offset;
+- /* Alternating sequence of static and system dependent segments.
+- The last segment is a static segment, including the trailing NUL. */
+- struct segment_pair segments[1];
+-};
+-
+-/* Marker for the end of the segments[] array. This has the value 0xFFFFFFFF,
+- regardless whether 'int' is 16 bit, 32 bit, or 64 bit. */
+-#define SEGMENTS_END ((nls_uint32) ~0)
+-
+-/* @@ begin of epilog @@ */
+-
+-#endif /* gettext.h */
+--- a/intl/hash-string.c
++++ /dev/null
+@@ -1,51 +0,0 @@
+-/* Implements a string hashing function.
+- Copyright (C) 1995, 1997, 1998, 2000, 2003 Free Software Foundation, Inc.
+- This file is part of the GNU C Library.
+-
+- 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, write to the Free
+- Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+- Boston, MA 02110-1301, USA. */
+-
+-#ifdef HAVE_CONFIG_H
+-# include <config.h>
+-#endif
+-
+-/* Specification. */
+-#include "hash-string.h"
+-
+-
+-/* Defines the so called `hashpjw' function by P.J. Weinberger
+- [see Aho/Sethi/Ullman, COMPILERS: Principles, Techniques and Tools,
+- 1986, 1987 Bell Telephone Laboratories, Inc.] */
+-unsigned long int
+-__hash_string (const char *str_param)
+-{
+- unsigned long int hval, g;
+- const char *str = str_param;
+-
+- /* Compute the hash value for the given string. */
+- hval = 0;
+- while (*str != '\0')
+- {
+- hval <<= 4;
+- hval += (unsigned char) *str++;
+- g = hval & ((unsigned long int) 0xf << (HASHWORDBITS - 4));
+- if (g != 0)
+- {
+- hval ^= g >> (HASHWORDBITS - 8);
+- hval ^= g;
+- }
+- }
+- return hval;
+-}
+--- a/intl/hash-string.h
++++ /dev/null
+@@ -1,36 +0,0 @@
+-/* Description of GNU message catalog format: string hashing function.
+- Copyright (C) 1995, 1997-1998, 2000-2003, 2005 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. */
+-
+-/* @@ end of prolog @@ */
+-
+-/* We assume to have `unsigned long int' value with at least 32 bits. */
+-#define HASHWORDBITS 32
+-
+-
+-#ifndef _LIBC
+-# ifdef IN_LIBINTL
+-# define __hash_string libintl_hash_string
+-# else
+-# define __hash_string hash_string
+-# endif
+-#endif
+-
+-/* Defines the so called `hashpjw' function by P.J. Weinberger
+- [see Aho/Sethi/Ullman, COMPILERS: Principles, Techniques and Tools,
+- 1986, 1987 Bell Telephone Laboratories, Inc.] */
+-extern unsigned long int __hash_string (const char *str_param);
+--- a/intl/intl-compat.c
++++ /dev/null
+@@ -1,133 +0,0 @@
+-/* intl-compat.c - Stub functions to call gettext functions from GNU gettext
+- Library.
+- Copyright (C) 1995, 2000-2003, 2005 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. */
+-
+-#ifdef HAVE_CONFIG_H
+-# include <config.h>
+-#endif
+-
+-#include "gettextP.h"
+-
+-/* @@ end of prolog @@ */
+-
+-/* This file redirects the gettext functions (without prefix) to those
+- defined in the included GNU libintl library (with "libintl_" prefix).
+- It is compiled into libintl in order to make the AM_GNU_GETTEXT test
+- of gettext <= 0.11.2 work with the libintl library >= 0.11.3 which
+- has the redirections primarily in the <libintl.h> include file.
+- It is also compiled into libgnuintl so that libgnuintl.so can be used
+- as LD_PRELOADable library on glibc systems, to provide the extra
+- features that the functions in the libc don't have (namely, logging). */
+-
+-
+-#undef gettext
+-#undef dgettext
+-#undef dcgettext
+-#undef ngettext
+-#undef dngettext
+-#undef dcngettext
+-#undef textdomain
+-#undef bindtextdomain
+-#undef bind_textdomain_codeset
+-
+-
+-/* When building a DLL, we must export some functions. Note that because
+- the functions are only defined for binary backward compatibility, we
+- don't need to use __declspec(dllimport) in any case. */
+-#if HAVE_VISIBILITY && BUILDING_DLL
+-# define DLL_EXPORTED __attribute__((__visibility__("default")))
+-#elif defined _MSC_VER && BUILDING_DLL
+-# define DLL_EXPORTED __declspec(dllexport)
+-#else
+-# define DLL_EXPORTED
+-#endif
+-
+-
+-DLL_EXPORTED
+-char *
+-gettext (const char *msgid)
+-{
+- return libintl_gettext (msgid);
+-}
+-
+-
+-DLL_EXPORTED
+-char *
+-dgettext (const char *domainname, const char *msgid)
+-{
+- return libintl_dgettext (domainname, msgid);
+-}
+-
+-
+-DLL_EXPORTED
+-char *
+-dcgettext (const char *domainname, const char *msgid, int category)
+-{
+- return libintl_dcgettext (domainname, msgid, category);
+-}
+-
+-
+-DLL_EXPORTED
+-char *
+-ngettext (const char *msgid1, const char *msgid2, unsigned long int n)
+-{
+- return libintl_ngettext (msgid1, msgid2, n);
+-}
+-
+-
+-DLL_EXPORTED
+-char *
+-dngettext (const char *domainname,
+- const char *msgid1, const char *msgid2, unsigned long int n)
+-{
+- return libintl_dngettext (domainname, msgid1, msgid2, n);
+-}
+-
+-
+-DLL_EXPORTED
+-char *
+-dcngettext (const char *domainname,
+- const char *msgid1, const char *msgid2, unsigned long int n,
+- int category)
+-{
+- return libintl_dcngettext (domainname, msgid1, msgid2, n, category);
+-}
+-
+-
+-DLL_EXPORTED
+-char *
+-textdomain (const char *domainname)
+-{
+- return libintl_textdomain (domainname);
+-}
+-
+-
+-DLL_EXPORTED
+-char *
+-bindtextdomain (const char *domainname, const char *dirname)
+-{
+- return libintl_bindtextdomain (domainname, dirname);
+-}
+-
+-
+-DLL_EXPORTED
+-char *
+-bind_textdomain_codeset (const char *domainname, const char *codeset)
+-{
+- return libintl_bind_textdomain_codeset (domainname, codeset);
+-}
+--- a/intl/intl-exports.c
++++ /dev/null
+@@ -1,36 +0,0 @@
+-/* List of exported symbols of libintl on Cygwin.
+- Copyright (C) 2006 Free Software Foundation, Inc.
+- Written by Bruno Haible <bruno@clisp.org>, 2006.
+-
+- 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. */
+-
+- /* IMP(x) is a symbol that contains the address of x. */
+-#define IMP(x) _imp__##x
+-
+- /* Ensure that the variable x is exported from the library, and that a
+- pseudo-variable IMP(x) is available. */
+-#define VARIABLE(x) \
+- /* Export x without redefining x. This code was found by compiling a \
+- snippet: \
+- extern __declspec(dllexport) int x; int x = 42; */ \
+- asm (".section .drectve\n"); \
+- asm (".ascii \" -export:" #x ",data\"\n"); \
+- asm (".data\n"); \
+- /* Allocate a pseudo-variable IMP(x). */ \
+- extern int x; \
+- void * IMP(x) = &x;
+-
+-VARIABLE(libintl_version)
+--- a/intl/l10nflist.c
++++ /dev/null
+@@ -1,400 +0,0 @@
+-/* Copyright (C) 1995-1999, 2000-2006 Free Software Foundation, Inc.
+- Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
+-
+- This program is free software; you can redistribute it and/or modify it
+- under the terms of the GNU 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. */
+-
+-/* Tell glibc's <string.h> to provide a prototype for stpcpy().
+- This must come before <config.h> because <config.h> may include
+- <features.h>, and once <features.h> has been included, it's too late. */
+-#ifndef _GNU_SOURCE
+-# define _GNU_SOURCE 1
+-#endif
+-
+-#ifdef HAVE_CONFIG_H
+-# include <config.h>
+-#endif
+-
+-#include <string.h>
+-
+-#if defined _LIBC || defined HAVE_ARGZ_H
+-# include <argz.h>
+-#endif
+-#include <ctype.h>
+-#include <sys/types.h>
+-#include <stdlib.h>
+-
+-#include "loadinfo.h"
+-
+-/* On some strange systems still no definition of NULL is found. Sigh! */
+-#ifndef NULL
+-# if defined __STDC__ && __STDC__
+-# define NULL ((void *) 0)
+-# else
+-# define NULL 0
+-# endif
+-#endif
+-
+-/* @@ end of prolog @@ */
+-
+-#ifdef _LIBC
+-/* Rename the non ANSI C functions. This is required by the standard
+- because some ANSI C functions will require linking with this object
+- file and the name space must not be polluted. */
+-# ifndef stpcpy
+-# define stpcpy(dest, src) __stpcpy(dest, src)
+-# endif
+-#else
+-# ifndef HAVE_STPCPY
+-static char *stpcpy (char *dest, const char *src);
+-# endif
+-#endif
+-
+-/* Pathname support.
+- ISSLASH(C) tests whether C is a directory separator character.
+- IS_ABSOLUTE_PATH(P) tests whether P is an absolute path. If it is not,
+- it may be concatenated to a directory pathname.
+- */
+-#if defined _WIN32 || defined __WIN32__ || defined __CYGWIN__ || defined __EMX__ || defined __DJGPP__
+- /* Win32, Cygwin, OS/2, DOS */
+-# define ISSLASH(C) ((C) == '/' || (C) == '\\')
+-# define HAS_DEVICE(P) \
+- ((((P)[0] >= 'A' && (P)[0] <= 'Z') || ((P)[0] >= 'a' && (P)[0] <= 'z')) \
+- && (P)[1] == ':')
+-# define IS_ABSOLUTE_PATH(P) (ISSLASH ((P)[0]) || HAS_DEVICE (P))
+-#else
+- /* Unix */
+-# define ISSLASH(C) ((C) == '/')
+-# define IS_ABSOLUTE_PATH(P) ISSLASH ((P)[0])
+-#endif
+-
+-/* Define function which are usually not available. */
+-
+-#ifdef _LIBC
+-# define __argz_count(argz, len) INTUSE(__argz_count) (argz, len)
+-#elif defined HAVE_ARGZ_COUNT
+-# undef __argz_count
+-# define __argz_count argz_count
+-#else
+-/* Returns the number of strings in ARGZ. */
+-static size_t
+-argz_count__ (const char *argz, size_t len)
+-{
+- size_t count = 0;
+- while (len > 0)
+- {
+- size_t part_len = strlen (argz);
+- argz += part_len + 1;
+- len -= part_len + 1;
+- count++;
+- }
+- return count;
+-}
+-# undef __argz_count
+-# define __argz_count(argz, len) argz_count__ (argz, len)
+-#endif /* !_LIBC && !HAVE_ARGZ_COUNT */
+-
+-#ifdef _LIBC
+-# define __argz_stringify(argz, len, sep) \
+- INTUSE(__argz_stringify) (argz, len, sep)
+-#elif defined HAVE_ARGZ_STRINGIFY
+-# undef __argz_stringify
+-# define __argz_stringify argz_stringify
+-#else
+-/* Make '\0' separated arg vector ARGZ printable by converting all the '\0's
+- except the last into the character SEP. */
+-static void
+-argz_stringify__ (char *argz, size_t len, int sep)
+-{
+- while (len > 0)
+- {
+- size_t part_len = strlen (argz);
+- argz += part_len;
+- len -= part_len + 1;
+- if (len > 0)
+- *argz++ = sep;
+- }
+-}
+-# undef __argz_stringify
+-# define __argz_stringify(argz, len, sep) argz_stringify__ (argz, len, sep)
+-#endif /* !_LIBC && !HAVE_ARGZ_STRINGIFY */
+-
+-#ifdef _LIBC
+-#elif defined HAVE_ARGZ_NEXT
+-# undef __argz_next
+-# define __argz_next argz_next
+-#else
+-static char *
+-argz_next__ (char *argz, size_t argz_len, const char *entry)
+-{
+- if (entry)
+- {
+- if (entry < argz + argz_len)
+- entry = strchr (entry, '\0') + 1;
+-
+- return entry >= argz + argz_len ? NULL : (char *) entry;
+- }
+- else
+- if (argz_len > 0)
+- return argz;
+- else
+- return 0;
+-}
+-# undef __argz_next
+-# define __argz_next(argz, len, entry) argz_next__ (argz, len, entry)
+-#endif /* !_LIBC && !HAVE_ARGZ_NEXT */
+-
+-
+-/* Return number of bits set in X. */
+-static inline int
+-pop (int x)
+-{
+- /* We assume that no more than 16 bits are used. */
+- x = ((x & ~0x5555) >> 1) + (x & 0x5555);
+- x = ((x & ~0x3333) >> 2) + (x & 0x3333);
+- x = ((x >> 4) + x) & 0x0f0f;
+- x = ((x >> 8) + x) & 0xff;
+-
+- return x;
+-}
+-
+-
+-struct loaded_l10nfile *
+-_nl_make_l10nflist (struct loaded_l10nfile **l10nfile_list,
+- const char *dirlist, size_t dirlist_len,
+- int mask, const char *language, const char *territory,
+- const char *codeset, const char *normalized_codeset,
+- const char *modifier,
+- const char *filename, int do_allocate)
+-{
+- char *abs_filename;
+- struct loaded_l10nfile **lastp;
+- struct loaded_l10nfile *retval;
+- char *cp;
+- size_t dirlist_count;
+- size_t entries;
+- int cnt;
+-
+- /* If LANGUAGE contains an absolute directory specification, we ignore
+- DIRLIST. */
+- if (IS_ABSOLUTE_PATH (language))
+- dirlist_len = 0;
+-
+- /* Allocate room for the full file name. */
+- abs_filename = (char *) malloc (dirlist_len
+- + strlen (language)
+- + ((mask & XPG_TERRITORY) != 0
+- ? strlen (territory) + 1 : 0)
+- + ((mask & XPG_CODESET) != 0
+- ? strlen (codeset) + 1 : 0)
+- + ((mask & XPG_NORM_CODESET) != 0
+- ? strlen (normalized_codeset) + 1 : 0)
+- + ((mask & XPG_MODIFIER) != 0
+- ? strlen (modifier) + 1 : 0)
+- + 1 + strlen (filename) + 1);
+-
+- if (abs_filename == NULL)
+- return NULL;
+-
+- /* Construct file name. */
+- cp = abs_filename;
+- if (dirlist_len > 0)
+- {
+- memcpy (cp, dirlist, dirlist_len);
+- __argz_stringify (cp, dirlist_len, PATH_SEPARATOR);
+- cp += dirlist_len;
+- cp[-1] = '/';
+- }
+-
+- cp = stpcpy (cp, language);
+-
+- if ((mask & XPG_TERRITORY) != 0)
+- {
+- *cp++ = '_';
+- cp = stpcpy (cp, territory);
+- }
+- if ((mask & XPG_CODESET) != 0)
+- {
+- *cp++ = '.';
+- cp = stpcpy (cp, codeset);
+- }
+- if ((mask & XPG_NORM_CODESET) != 0)
+- {
+- *cp++ = '.';
+- cp = stpcpy (cp, normalized_codeset);
+- }
+- if ((mask & XPG_MODIFIER) != 0)
+- {
+- *cp++ = '@';
+- cp = stpcpy (cp, modifier);
+- }
+-
+- *cp++ = '/';
+- stpcpy (cp, filename);
+-
+- /* Look in list of already loaded domains whether it is already
+- available. */
+- lastp = l10nfile_list;
+- for (retval = *l10nfile_list; retval != NULL; retval = retval->next)
+- if (retval->filename != NULL)
+- {
+- int compare = strcmp (retval->filename, abs_filename);
+- if (compare == 0)
+- /* We found it! */
+- break;
+- if (compare < 0)
+- {
+- /* It's not in the list. */
+- retval = NULL;
+- break;
+- }
+-
+- lastp = &retval->next;
+- }
+-
+- if (retval != NULL || do_allocate == 0)
+- {
+- free (abs_filename);
+- return retval;
+- }
+-
+- dirlist_count = (dirlist_len > 0 ? __argz_count (dirlist, dirlist_len) : 1);
+-
+- /* Allocate a new loaded_l10nfile. */
+- retval =
+- (struct loaded_l10nfile *)
+- malloc (sizeof (*retval)
+- + (((dirlist_count << pop (mask)) + (dirlist_count > 1 ? 1 : 0))
+- * sizeof (struct loaded_l10nfile *)));
+- if (retval == NULL)
+- {
+- free (abs_filename);
+- return NULL;
+- }
+-
+- retval->filename = abs_filename;
+-
+- /* We set retval->data to NULL here; it is filled in later.
+- Setting retval->decided to 1 here means that retval does not
+- correspond to a real file (dirlist_count > 1) or is not worth
+- looking up (if an unnormalized codeset was specified). */
+- retval->decided = (dirlist_count > 1
+- || ((mask & XPG_CODESET) != 0
+- && (mask & XPG_NORM_CODESET) != 0));
+- retval->data = NULL;
+-
+- retval->next = *lastp;
+- *lastp = retval;
+-
+- entries = 0;
+- /* Recurse to fill the inheritance list of RETVAL.
+- If the DIRLIST is a real list (i.e. DIRLIST_COUNT > 1), the RETVAL
+- entry does not correspond to a real file; retval->filename contains
+- colons. In this case we loop across all elements of DIRLIST and
+- across all bit patterns dominated by MASK.
+- If the DIRLIST is a single directory or entirely redundant (i.e.
+- DIRLIST_COUNT == 1), we loop across all bit patterns dominated by
+- MASK, excluding MASK itself.
+- In either case, we loop down from MASK to 0. This has the effect
+- that the extra bits in the locale name are dropped in this order:
+- first the modifier, then the territory, then the codeset, then the
+- normalized_codeset. */
+- for (cnt = dirlist_count > 1 ? mask : mask - 1; cnt >= 0; --cnt)
+- if ((cnt & ~mask) == 0
+- && !((cnt & XPG_CODESET) != 0 && (cnt & XPG_NORM_CODESET) != 0))
+- {
+- if (dirlist_count > 1)
+- {
+- /* Iterate over all elements of the DIRLIST. */
+- char *dir = NULL;
+-
+- while ((dir = __argz_next ((char *) dirlist, dirlist_len, dir))
+- != NULL)
+- retval->successor[entries++]
+- = _nl_make_l10nflist (l10nfile_list, dir, strlen (dir) + 1,
+- cnt, language, territory, codeset,
+- normalized_codeset, modifier, filename,
+- 1);
+- }
+- else
+- retval->successor[entries++]
+- = _nl_make_l10nflist (l10nfile_list, dirlist, dirlist_len,
+- cnt, language, territory, codeset,
+- normalized_codeset, modifier, filename, 1);
+- }
+- retval->successor[entries] = NULL;
+-
+- return retval;
+-}
+-
+-/* Normalize codeset name. There is no standard for the codeset
+- names. Normalization allows the user to use any of the common
+- names. The return value is dynamically allocated and has to be
+- freed by the caller. */
+-const char *
+-_nl_normalize_codeset (const char *codeset, size_t name_len)
+-{
+- int len = 0;
+- int only_digit = 1;
+- char *retval;
+- char *wp;
+- size_t cnt;
+-
+- for (cnt = 0; cnt < name_len; ++cnt)
+- if (isalnum ((unsigned char) codeset[cnt]))
+- {
+- ++len;
+-
+- if (isalpha ((unsigned char) codeset[cnt]))
+- only_digit = 0;
+- }
+-
+- retval = (char *) malloc ((only_digit ? 3 : 0) + len + 1);
+-
+- if (retval != NULL)
+- {
+- if (only_digit)
+- wp = stpcpy (retval, "iso");
+- else
+- wp = retval;
+-
+- for (cnt = 0; cnt < name_len; ++cnt)
+- if (isalpha ((unsigned char) codeset[cnt]))
+- *wp++ = tolower ((unsigned char) codeset[cnt]);
+- else if (isdigit ((unsigned char) codeset[cnt]))
+- *wp++ = codeset[cnt];
+-
+- *wp = '\0';
+- }
+-
+- return (const char *) retval;
+-}
+-
+-
+-/* @@ begin of epilog @@ */
+-
+-/* We don't want libintl.a to depend on any other library. So we
+- avoid the non-standard function stpcpy. In GNU C Library this
+- function is available, though. Also allow the symbol HAVE_STPCPY
+- to be defined. */
+-#if !_LIBC && !HAVE_STPCPY
+-static char *
+-stpcpy (char *dest, const char *src)
+-{
+- while ((*dest++ = *src++) != '\0')
+- /* Do nothing. */ ;
+- return dest - 1;
+-}
+-#endif
+--- a/intl/langprefs.c
++++ /dev/null
+@@ -1,130 +0,0 @@
+-/* Determine the user's language preferences.
+- Copyright (C) 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. */
+-
+-/* Written by Bruno Haible <bruno@clisp.org>. */
+-
+-#ifdef HAVE_CONFIG_H
+-# include <config.h>
+-#endif
+-
+-#include <stdlib.h>
+-
+-#if HAVE_CFPREFERENCESCOPYAPPVALUE
+-# include <string.h>
+-# include <CoreFoundation/CFPreferences.h>
+-# include <CoreFoundation/CFPropertyList.h>
+-# include <CoreFoundation/CFArray.h>
+-# include <CoreFoundation/CFString.h>
+-extern void _nl_locale_name_canonicalize (char *name);
+-#endif
+-
+-/* Determine the user's language preferences, as a colon separated list of
+- locale names in XPG syntax
+- language[_territory][.codeset][@modifier]
+- The result must not be freed; it is statically allocated.
+- The LANGUAGE environment variable does not need to be considered; it is
+- already taken into account by the caller. */
+-
+-const char *
+-_nl_language_preferences_default (void)
+-{
+-#if HAVE_CFPREFERENCESCOPYAPPVALUE /* MacOS X 10.2 or newer */
+- {
+- /* Cache the preferences list, since CoreFoundation calls are expensive. */
+- static const char *cached_languages;
+- static int cache_initialized;
+-
+- if (!cache_initialized)
+- {
+- CFTypeRef preferences =
+- CFPreferencesCopyAppValue (CFSTR ("AppleLanguages"),
+- kCFPreferencesCurrentApplication);
+- if (preferences != NULL
+- && CFGetTypeID (preferences) == CFArrayGetTypeID ())
+- {
+- CFArrayRef prefArray = (CFArrayRef)preferences;
+- int n = CFArrayGetCount (prefArray);
+- char buf[256];
+- size_t size = 0;
+- int i;
+-
+- for (i = 0; i < n; i++)
+- {
+- CFTypeRef element = CFArrayGetValueAtIndex (prefArray, i);
+- if (element != NULL
+- && CFGetTypeID (element) == CFStringGetTypeID ()
+- && CFStringGetCString ((CFStringRef)element,
+- buf, sizeof (buf),
+- kCFStringEncodingASCII))
+- {
+- _nl_locale_name_canonicalize (buf);
+- size += strlen (buf) + 1;
+- /* Most GNU programs use msgids in English and don't ship
+- an en.mo message catalog. Therefore when we see "en"
+- in the preferences list, arrange for gettext() to
+- return the msgid, and ignore all further elements of
+- the preferences list. */
+- if (strcmp (buf, "en") == 0)
+- break;
+- }
+- else
+- break;
+- }
+- if (size > 0)
+- {
+- char *languages = (char *) malloc (size);
+-
+- if (languages != NULL)
+- {
+- char *p = languages;
+-
+- for (i = 0; i < n; i++)
+- {
+- CFTypeRef element =
+- CFArrayGetValueAtIndex (prefArray, i);
+- if (element != NULL
+- && CFGetTypeID (element) == CFStringGetTypeID ()
+- && CFStringGetCString ((CFStringRef)element,
+- buf, sizeof (buf),
+- kCFStringEncodingASCII))
+- {
+- _nl_locale_name_canonicalize (buf);
+- strcpy (p, buf);
+- p += strlen (buf);
+- *p++ = ':';
+- if (strcmp (buf, "en") == 0)
+- break;
+- }
+- else
+- break;
+- }
+- *--p = '\0';
+-
+- cached_languages = languages;
+- }
+- }
+- }
+- cache_initialized = 1;
+- }
+- if (cached_languages != NULL)
+- return cached_languages;
+- }
+-#endif
+-
+- return NULL;
+-}
+--- a/intl/libgnuintl.h.in
++++ /dev/null
+@@ -1,419 +0,0 @@
+-/* Message catalogs for internationalization.
+- Copyright (C) 1995-1997, 2000-2007 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. */
+-
+-#ifndef _LIBINTL_H
+-#define _LIBINTL_H 1
+-
+-#include <locale.h>
+-
+-/* The LC_MESSAGES locale category is the category used by the functions
+- gettext() and dgettext(). It is specified in POSIX, but not in ANSI C.
+- On systems that don't define it, use an arbitrary value instead.
+- On Solaris, <locale.h> defines __LOCALE_H (or _LOCALE_H in Solaris 2.5)
+- then includes <libintl.h> (i.e. this file!) and then only defines
+- LC_MESSAGES. To avoid a redefinition warning, don't define LC_MESSAGES
+- in this case. */
+-#if !defined LC_MESSAGES && !(defined __LOCALE_H || (defined _LOCALE_H && defined __sun))
+-# define LC_MESSAGES 1729
+-#endif
+-
+-/* We define an additional symbol to signal that we use the GNU
+- implementation of gettext. */
+-#define __USE_GNU_GETTEXT 1
+-
+-/* Provide information about the supported file formats. Returns the
+- maximum minor revision number supported for a given major revision. */
+-#define __GNU_GETTEXT_SUPPORTED_REVISION(major) \
+- ((major) == 0 || (major) == 1 ? 1 : -1)
+-
+-/* Resolve a platform specific conflict on DJGPP. GNU gettext takes
+- precedence over _conio_gettext. */
+-#ifdef __DJGPP__
+-# undef gettext
+-#endif
+-
+-#ifdef __cplusplus
+-extern "C" {
+-#endif
+-
+-
+-/* Version number: (major<<16) + (minor<<8) + subminor */
+-#define LIBINTL_VERSION 0x001100
+-extern int libintl_version;
+-
+-
+-/* We redirect the functions to those prefixed with "libintl_". This is
+- necessary, because some systems define gettext/textdomain/... in the C
+- library (namely, Solaris 2.4 and newer, and GNU libc 2.0 and newer).
+- If we used the unprefixed names, there would be cases where the
+- definition in the C library would override the one in the libintl.so
+- shared library. Recall that on ELF systems, the symbols are looked
+- up in the following order:
+- 1. in the executable,
+- 2. in the shared libraries specified on the link command line, in order,
+- 3. in the dependencies of the shared libraries specified on the link
+- command line,
+- 4. in the dlopen()ed shared libraries, in the order in which they were
+- dlopen()ed.
+- The definition in the C library would override the one in libintl.so if
+- either
+- * -lc is given on the link command line and -lintl isn't, or
+- * -lc is given on the link command line before -lintl, or
+- * libintl.so is a dependency of a dlopen()ed shared library but not
+- linked to the executable at link time.
+- Since Solaris gettext() behaves differently than GNU gettext(), this
+- would be unacceptable.
+-
+- The redirection happens by default through macros in C, so that &gettext
+- is independent of the compilation unit, but through inline functions in
+- C++, in order not to interfere with the name mangling of class fields or
+- class methods called 'gettext'. */
+-
+-/* The user can define _INTL_REDIRECT_INLINE or _INTL_REDIRECT_MACROS.
+- If he doesn't, we choose the method. A third possible method is
+- _INTL_REDIRECT_ASM, supported only by GCC. */
+-#if !(defined _INTL_REDIRECT_INLINE || defined _INTL_REDIRECT_MACROS)
+-# if __GNUC__ >= 2 && !(__APPLE_CC__ > 1) && !defined __MINGW32__ && !(__GNUC__ == 2 && defined _AIX) && (defined __STDC__ || defined __cplusplus)
+-# define _INTL_REDIRECT_ASM
+-# else
+-# ifdef __cplusplus
+-# define _INTL_REDIRECT_INLINE
+-# else
+-# define _INTL_REDIRECT_MACROS
+-# endif
+-# endif
+-#endif
+-/* Auxiliary macros. */
+-#ifdef _INTL_REDIRECT_ASM
+-# define _INTL_ASM(cname) __asm__ (_INTL_ASMNAME (__USER_LABEL_PREFIX__, #cname))
+-# define _INTL_ASMNAME(prefix,cnamestring) _INTL_STRINGIFY (prefix) cnamestring
+-# define _INTL_STRINGIFY(prefix) #prefix
+-#else
+-# define _INTL_ASM(cname)
+-#endif
+-
+-/* _INTL_MAY_RETURN_STRING_ARG(n) declares that the given function may return
+- its n-th argument literally. This enables GCC to warn for example about
+- printf (gettext ("foo %y")). */
+-#if __GNUC__ >= 3 && !(__APPLE_CC__ > 1 && defined __cplusplus)
+-# define _INTL_MAY_RETURN_STRING_ARG(n) __attribute__ ((__format_arg__ (n)))
+-#else
+-# define _INTL_MAY_RETURN_STRING_ARG(n)
+-#endif
+-
+-/* Look up MSGID in the current default message catalog for the current
+- LC_MESSAGES locale. If not found, returns MSGID itself (the default
+- text). */
+-#ifdef _INTL_REDIRECT_INLINE
+-extern char *libintl_gettext (const char *__msgid)
+- _INTL_MAY_RETURN_STRING_ARG (1);
+-static inline char *gettext (const char *__msgid)
+-{
+- return libintl_gettext (__msgid);
+-}
+-#else
+-#ifdef _INTL_REDIRECT_MACROS
+-# define gettext libintl_gettext
+-#endif
+-extern char *gettext (const char *__msgid)
+- _INTL_ASM (libintl_gettext)
+- _INTL_MAY_RETURN_STRING_ARG (1);
+-#endif
+-
+-/* Look up MSGID in the DOMAINNAME message catalog for the current
+- LC_MESSAGES locale. */
+-#ifdef _INTL_REDIRECT_INLINE
+-extern char *libintl_dgettext (const char *__domainname, const char *__msgid)
+- _INTL_MAY_RETURN_STRING_ARG (2);
+-static inline char *dgettext (const char *__domainname, const char *__msgid)
+-{
+- return libintl_dgettext (__domainname, __msgid);
+-}
+-#else
+-#ifdef _INTL_REDIRECT_MACROS
+-# define dgettext libintl_dgettext
+-#endif
+-extern char *dgettext (const char *__domainname, const char *__msgid)
+- _INTL_ASM (libintl_dgettext)
+- _INTL_MAY_RETURN_STRING_ARG (2);
+-#endif
+-
+-/* Look up MSGID in the DOMAINNAME message catalog for the current CATEGORY
+- locale. */
+-#ifdef _INTL_REDIRECT_INLINE
+-extern char *libintl_dcgettext (const char *__domainname, const char *__msgid,
+- int __category)
+- _INTL_MAY_RETURN_STRING_ARG (2);
+-static inline char *dcgettext (const char *__domainname, const char *__msgid,
+- int __category)
+-{
+- return libintl_dcgettext (__domainname, __msgid, __category);
+-}
+-#else
+-#ifdef _INTL_REDIRECT_MACROS
+-# define dcgettext libintl_dcgettext
+-#endif
+-extern char *dcgettext (const char *__domainname, const char *__msgid,
+- int __category)
+- _INTL_ASM (libintl_dcgettext)
+- _INTL_MAY_RETURN_STRING_ARG (2);
+-#endif
+-
+-
+-/* Similar to `gettext' but select the plural form corresponding to the
+- number N. */
+-#ifdef _INTL_REDIRECT_INLINE
+-extern char *libintl_ngettext (const char *__msgid1, const char *__msgid2,
+- unsigned long int __n)
+- _INTL_MAY_RETURN_STRING_ARG (1) _INTL_MAY_RETURN_STRING_ARG (2);
+-static inline char *ngettext (const char *__msgid1, const char *__msgid2,
+- unsigned long int __n)
+-{
+- return libintl_ngettext (__msgid1, __msgid2, __n);
+-}
+-#else
+-#ifdef _INTL_REDIRECT_MACROS
+-# define ngettext libintl_ngettext
+-#endif
+-extern char *ngettext (const char *__msgid1, const char *__msgid2,
+- unsigned long int __n)
+- _INTL_ASM (libintl_ngettext)
+- _INTL_MAY_RETURN_STRING_ARG (1) _INTL_MAY_RETURN_STRING_ARG (2);
+-#endif
+-
+-/* Similar to `dgettext' but select the plural form corresponding to the
+- number N. */
+-#ifdef _INTL_REDIRECT_INLINE
+-extern char *libintl_dngettext (const char *__domainname, const char *__msgid1,
+- const char *__msgid2, unsigned long int __n)
+- _INTL_MAY_RETURN_STRING_ARG (2) _INTL_MAY_RETURN_STRING_ARG (3);
+-static inline char *dngettext (const char *__domainname, const char *__msgid1,
+- const char *__msgid2, unsigned long int __n)
+-{
+- return libintl_dngettext (__domainname, __msgid1, __msgid2, __n);
+-}
+-#else
+-#ifdef _INTL_REDIRECT_MACROS
+-# define dngettext libintl_dngettext
+-#endif
+-extern char *dngettext (const char *__domainname,
+- const char *__msgid1, const char *__msgid2,
+- unsigned long int __n)
+- _INTL_ASM (libintl_dngettext)
+- _INTL_MAY_RETURN_STRING_ARG (2) _INTL_MAY_RETURN_STRING_ARG (3);
+-#endif
+-
+-/* Similar to `dcgettext' but select the plural form corresponding to the
+- number N. */
+-#ifdef _INTL_REDIRECT_INLINE
+-extern char *libintl_dcngettext (const char *__domainname,
+- const char *__msgid1, const char *__msgid2,
+- unsigned long int __n, int __category)
+- _INTL_MAY_RETURN_STRING_ARG (2) _INTL_MAY_RETURN_STRING_ARG (3);
+-static inline char *dcngettext (const char *__domainname,
+- const char *__msgid1, const char *__msgid2,
+- unsigned long int __n, int __category)
+-{
+- return libintl_dcngettext (__domainname, __msgid1, __msgid2, __n, __category);
+-}
+-#else
+-#ifdef _INTL_REDIRECT_MACROS
+-# define dcngettext libintl_dcngettext
+-#endif
+-extern char *dcngettext (const char *__domainname,
+- const char *__msgid1, const char *__msgid2,
+- unsigned long int __n, int __category)
+- _INTL_ASM (libintl_dcngettext)
+- _INTL_MAY_RETURN_STRING_ARG (2) _INTL_MAY_RETURN_STRING_ARG (3);
+-#endif
+-
+-
+-#ifndef IN_LIBGLOCALE
+-
+-/* Set the current default message catalog to DOMAINNAME.
+- If DOMAINNAME is null, return the current default.
+- If DOMAINNAME is "", reset to the default of "messages". */
+-#ifdef _INTL_REDIRECT_INLINE
+-extern char *libintl_textdomain (const char *__domainname);
+-static inline char *textdomain (const char *__domainname)
+-{
+- return libintl_textdomain (__domainname);
+-}
+-#else
+-#ifdef _INTL_REDIRECT_MACROS
+-# define textdomain libintl_textdomain
+-#endif
+-extern char *textdomain (const char *__domainname)
+- _INTL_ASM (libintl_textdomain);
+-#endif
+-
+-/* Specify that the DOMAINNAME message catalog will be found
+- in DIRNAME rather than in the system locale data base. */
+-#ifdef _INTL_REDIRECT_INLINE
+-extern char *libintl_bindtextdomain (const char *__domainname,
+- const char *__dirname);
+-static inline char *bindtextdomain (const char *__domainname,
+- const char *__dirname)
+-{
+- return libintl_bindtextdomain (__domainname, __dirname);
+-}
+-#else
+-#ifdef _INTL_REDIRECT_MACROS
+-# define bindtextdomain libintl_bindtextdomain
+-#endif
+-extern char *bindtextdomain (const char *__domainname, const char *__dirname)
+- _INTL_ASM (libintl_bindtextdomain);
+-#endif
+-
+-/* Specify the character encoding in which the messages from the
+- DOMAINNAME message catalog will be returned. */
+-#ifdef _INTL_REDIRECT_INLINE
+-extern char *libintl_bind_textdomain_codeset (const char *__domainname,
+- const char *__codeset);
+-static inline char *bind_textdomain_codeset (const char *__domainname,
+- const char *__codeset)
+-{
+- return libintl_bind_textdomain_codeset (__domainname, __codeset);
+-}
+-#else
+-#ifdef _INTL_REDIRECT_MACROS
+-# define bind_textdomain_codeset libintl_bind_textdomain_codeset
+-#endif
+-extern char *bind_textdomain_codeset (const char *__domainname,
+- const char *__codeset)
+- _INTL_ASM (libintl_bind_textdomain_codeset);
+-#endif
+-
+-#endif /* IN_LIBGLOCALE */
+-
+-
+-/* Support for format strings with positions in *printf(), following the
+- POSIX/XSI specification.
+- Note: These replacements for the *printf() functions are visible only
+- in source files that #include <libintl.h> or #include "gettext.h".
+- Packages that use *printf() in source files that don't refer to _()
+- or gettext() but for which the format string could be the return value
+- of _() or gettext() need to add this #include. Oh well. */
+-
+-#if !@HAVE_POSIX_PRINTF@
+-
+-#include <stdio.h>
+-#include <stddef.h>
+-
+-/* Get va_list. */
+-#if __STDC__ || defined __cplusplus || defined _MSC_VER
+-# include <stdarg.h>
+-#else
+-# include <varargs.h>
+-#endif
+-
+-#undef fprintf
+-#define fprintf libintl_fprintf
+-extern int fprintf (FILE *, const char *, ...);
+-#undef vfprintf
+-#define vfprintf libintl_vfprintf
+-extern int vfprintf (FILE *, const char *, va_list);
+-
+-#undef printf
+-#if defined __NetBSD__ || defined __BEOS__ || defined __CYGWIN__ || defined __MINGW32__
+-/* Don't break __attribute__((format(printf,M,N))).
+- This redefinition is only possible because the libc in NetBSD, Cygwin,
+- mingw does not have a function __printf__. */
+-# define libintl_printf __printf__
+-#endif
+-#define printf libintl_printf
+-extern int printf (const char *, ...);
+-#undef vprintf
+-#define vprintf libintl_vprintf
+-extern int vprintf (const char *, va_list);
+-
+-#undef sprintf
+-#define sprintf libintl_sprintf
+-extern int sprintf (char *, const char *, ...);
+-#undef vsprintf
+-#define vsprintf libintl_vsprintf
+-extern int vsprintf (char *, const char *, va_list);
+-
+-#if @HAVE_SNPRINTF@
+-
+-#undef snprintf
+-#define snprintf libintl_snprintf
+-extern int snprintf (char *, size_t, const char *, ...);
+-#undef vsnprintf
+-#define vsnprintf libintl_vsnprintf
+-extern int vsnprintf (char *, size_t, const char *, va_list);
+-
+-#endif
+-
+-#if @HAVE_ASPRINTF@
+-
+-#undef asprintf
+-#define asprintf libintl_asprintf
+-extern int asprintf (char **, const char *, ...);
+-#undef vasprintf
+-#define vasprintf libintl_vasprintf
+-extern int vasprintf (char **, const char *, va_list);
+-
+-#endif
+-
+-#if @HAVE_WPRINTF@
+-
+-#undef fwprintf
+-#define fwprintf libintl_fwprintf
+-extern int fwprintf (FILE *, const wchar_t *, ...);
+-#undef vfwprintf
+-#define vfwprintf libintl_vfwprintf
+-extern int vfwprintf (FILE *, const wchar_t *, va_list);
+-
+-#undef wprintf
+-#define wprintf libintl_wprintf
+-extern int wprintf (const wchar_t *, ...);
+-#undef vwprintf
+-#define vwprintf libintl_vwprintf
+-extern int vwprintf (const wchar_t *, va_list);
+-
+-#undef swprintf
+-#define swprintf libintl_swprintf
+-extern int swprintf (wchar_t *, size_t, const wchar_t *, ...);
+-#undef vswprintf
+-#define vswprintf libintl_vswprintf
+-extern int vswprintf (wchar_t *, size_t, const wchar_t *, va_list);
+-
+-#endif
+-
+-#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 "/"). */
+-#define libintl_set_relocation_prefix libintl_set_relocation_prefix
+-extern void
+- libintl_set_relocation_prefix (const char *orig_prefix,
+- const char *curr_prefix);
+-
+-
+-#ifdef __cplusplus
+-}
+-#endif
+-
+-#endif /* libintl.h */
+--- a/intl/libintl.rc
++++ /dev/null
+@@ -1,38 +0,0 @@
+-/* Resources for intl.dll */
+-
+-#include <winver.h>
+-
+-VS_VERSION_INFO VERSIONINFO
+- FILEVERSION PACKAGE_VERSION_MAJOR,PACKAGE_VERSION_MINOR,PACKAGE_VERSION_SUBMINOR,0
+- PRODUCTVERSION PACKAGE_VERSION_MAJOR,PACKAGE_VERSION_MINOR,PACKAGE_VERSION_SUBMINOR,0
+- FILEFLAGSMASK 0x3fL /* VS_FFI_FILEFLAGSMASK */
+-#ifdef _DEBUG
+- FILEFLAGS 0x1L /* VS_FF_DEBUG */
+-#else
+- FILEFLAGS 0x0L
+-#endif
+- FILEOS 0x10004L /* VOS_DOS_WINDOWS32 */
+- FILETYPE 0x2L /* VFT_DLL */
+- FILESUBTYPE 0x0L /* VFT2_UNKNOWN */
+-BEGIN
+- BLOCK "StringFileInfo"
+- BEGIN
+- BLOCK "04090000" /* Lang = US English, Charset = ASCII */
+- BEGIN
+- VALUE "Comments", "This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA\0"
+- VALUE "CompanyName", "Free Software Foundation\0"
+- VALUE "FileDescription", "LGPLed libintl for Windows NT/2000/XP/Vista and Windows 95/98/ME\0"
+- VALUE "FileVersion", PACKAGE_VERSION_STRING "\0"
+- VALUE "InternalName", "intl.dll\0"
+- VALUE "LegalCopyright", "Copyright (C) 1995-2007\0"
+- VALUE "LegalTrademarks", "\0"
+- VALUE "OriginalFilename", "intl.dll\0"
+- VALUE "ProductName", "libintl: accessing NLS message catalogs\0"
+- VALUE "ProductVersion", PACKAGE_VERSION_STRING "\0"
+- END
+- END
+- BLOCK "VarFileInfo"
+- BEGIN
+- VALUE "Translation", 0x0409, 0 /* US English, ASCII */
+- END
+-END
+--- a/intl/loadinfo.h
++++ /dev/null
+@@ -1,132 +0,0 @@
+-/* Copyright (C) 1996-1999, 2000-2003, 2005-2006 Free Software Foundation, Inc.
+- This file is part of the GNU C Library.
+- Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
+-
+- 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 _LOADINFO_H
+-#define _LOADINFO_H 1
+-
+-/* Declarations of locale dependent catalog lookup functions.
+- Implemented in
+-
+- localealias.c Possibly replace a locale name by another.
+- explodename.c Split a locale name into its various fields.
+- l10nflist.c Generate a list of filenames of possible message catalogs.
+- finddomain.c Find and open the relevant message catalogs.
+-
+- The main function _nl_find_domain() in finddomain.c is declared
+- in gettextP.h.
+- */
+-
+-#ifndef internal_function
+-# define internal_function
+-#endif
+-
+-#ifndef LIBINTL_DLL_EXPORTED
+-# define LIBINTL_DLL_EXPORTED
+-#endif
+-
+-/* Tell the compiler when a conditional or integer expression is
+- almost always true or almost always false. */
+-#ifndef HAVE_BUILTIN_EXPECT
+-# define __builtin_expect(expr, val) (expr)
+-#endif
+-
+-/* Separator in PATH like lists of pathnames. */
+-#if ((defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__) || defined __EMX__ || defined __DJGPP__
+- /* Win32, OS/2, DOS */
+-# define PATH_SEPARATOR ';'
+-#else
+- /* Unix */
+-# define PATH_SEPARATOR ':'
+-#endif
+-
+-/* Encoding of locale name parts. */
+-#define XPG_NORM_CODESET 1
+-#define XPG_CODESET 2
+-#define XPG_TERRITORY 4
+-#define XPG_MODIFIER 8
+-
+-
+-struct loaded_l10nfile
+-{
+- const char *filename;
+- int decided;
+-
+- const void *data;
+-
+- struct loaded_l10nfile *next;
+- struct loaded_l10nfile *successor[1];
+-};
+-
+-
+-/* Normalize codeset name. There is no standard for the codeset
+- names. Normalization allows the user to use any of the common
+- names. The return value is dynamically allocated and has to be
+- freed by the caller. */
+-extern const char *_nl_normalize_codeset (const char *codeset,
+- size_t name_len);
+-
+-/* Lookup a locale dependent file.
+- *L10NFILE_LIST denotes a pool of lookup results of locale dependent
+- files of the same kind, sorted in decreasing order of ->filename.
+- DIRLIST and DIRLIST_LEN are an argz list of directories in which to
+- look, containing at least one directory (i.e. DIRLIST_LEN > 0).
+- MASK, LANGUAGE, TERRITORY, CODESET, NORMALIZED_CODESET, MODIFIER
+- are the pieces of the locale name, as produced by _nl_explode_name().
+- FILENAME is the filename suffix.
+- The return value is the lookup result, either found in *L10NFILE_LIST,
+- or - if DO_ALLOCATE is nonzero - freshly allocated, or possibly NULL.
+- If the return value is non-NULL, it is added to *L10NFILE_LIST, and
+- its ->next field denotes the chaining inside *L10NFILE_LIST, and
+- furthermore its ->successor[] field contains a list of other lookup
+- results from which this lookup result inherits. */
+-extern struct loaded_l10nfile *
+-_nl_make_l10nflist (struct loaded_l10nfile **l10nfile_list,
+- const char *dirlist, size_t dirlist_len, int mask,
+- const char *language, const char *territory,
+- const char *codeset, const char *normalized_codeset,
+- const char *modifier,
+- const char *filename, int do_allocate);
+-
+-/* Lookup the real locale name for a locale alias NAME, or NULL if
+- NAME is not a locale alias (but possibly a real locale name).
+- The return value is statically allocated and must not be freed. */
+-/* Part of the libintl ABI only for the sake of the gettext.m4 macro. */
+-extern LIBINTL_DLL_EXPORTED const char *_nl_expand_alias (const char *name);
+-
+-/* Split a locale name NAME into its pieces: language, modifier,
+- territory, codeset.
+- NAME gets destructively modified: NUL bytes are inserted here and
+- there. *LANGUAGE gets assigned NAME. Each of *MODIFIER, *TERRITORY,
+- *CODESET gets assigned either a pointer into the old NAME string, or
+- NULL. *NORMALIZED_CODESET gets assigned the expanded *CODESET, if it
+- is different from *CODESET; this one is dynamically allocated and has
+- to be freed by the caller.
+- The return value is a bitmask, where each bit corresponds to one
+- filled-in value:
+- XPG_MODIFIER for *MODIFIER,
+- XPG_TERRITORY for *TERRITORY,
+- XPG_CODESET for *CODESET,
+- XPG_NORM_CODESET for *NORMALIZED_CODESET.
+- */
+-extern int _nl_explode_name (char *name, const char **language,
+- const char **modifier, const char **territory,
+- const char **codeset,
+- const char **normalized_codeset);
+-
+-#endif /* loadinfo.h */
+--- a/intl/loadmsgcat.c
++++ /dev/null
+@@ -1,1336 +0,0 @@
+-/* Load needed message catalogs.
+- Copyright (C) 1995-1999, 2000-2007 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. */
+-
+-/* Tell glibc's <string.h> to provide a prototype for mempcpy().
+- This must come before <config.h> because <config.h> may include
+- <features.h>, and once <features.h> has been included, it's too late. */
+-#ifndef _GNU_SOURCE
+-# define _GNU_SOURCE 1
+-#endif
+-
+-#ifdef HAVE_CONFIG_H
+-# include <config.h>
+-#endif
+-
+-#include <ctype.h>
+-#include <errno.h>
+-#include <fcntl.h>
+-#include <sys/types.h>
+-#include <sys/stat.h>
+-
+-#ifdef __GNUC__
+-# undef alloca
+-# define alloca __builtin_alloca
+-# define HAVE_ALLOCA 1
+-#else
+-# ifdef _MSC_VER
+-# include <malloc.h>
+-# define alloca _alloca
+-# else
+-# if defined HAVE_ALLOCA_H || defined _LIBC
+-# include <alloca.h>
+-# else
+-# ifdef _AIX
+- #pragma alloca
+-# else
+-# ifndef alloca
+-char *alloca ();
+-# endif
+-# endif
+-# endif
+-# endif
+-#endif
+-
+-#include <stdlib.h>
+-#include <string.h>
+-
+-#if defined HAVE_UNISTD_H || defined _LIBC
+-# include <unistd.h>
+-#endif
+-
+-#ifdef _LIBC
+-# include <langinfo.h>
+-# include <locale.h>
+-#endif
+-
+-#if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) \
+- || (defined _LIBC && defined _POSIX_MAPPED_FILES)
+-# include <sys/mman.h>
+-# undef HAVE_MMAP
+-# define HAVE_MMAP 1
+-#else
+-# undef HAVE_MMAP
+-#endif
+-
+-#if defined HAVE_STDINT_H_WITH_UINTMAX || defined _LIBC
+-# include <stdint.h>
+-#endif
+-#if defined HAVE_INTTYPES_H || defined _LIBC
+-# include <inttypes.h>
+-#endif
+-
+-#include "gmo.h"
+-#include "gettextP.h"
+-#include "hash-string.h"
+-#include "plural-exp.h"
+-
+-#ifdef _LIBC
+-# include "../locale/localeinfo.h"
+-# include <not-cancel.h>
+-#endif
+-
+-/* Handle multi-threaded applications. */
+-#ifdef _LIBC
+-# include <bits/libc-lock.h>
+-#else
+-# include "lock.h"
+-#endif
+-
+-/* Provide fallback values for macros that ought to be defined in <inttypes.h>.
+- Note that our fallback values need not be literal strings, because we don't
+- use them with preprocessor string concatenation. */
+-#if !defined PRId8 || PRI_MACROS_BROKEN
+-# undef PRId8
+-# define PRId8 "d"
+-#endif
+-#if !defined PRIi8 || PRI_MACROS_BROKEN
+-# undef PRIi8
+-# define PRIi8 "i"
+-#endif
+-#if !defined PRIo8 || PRI_MACROS_BROKEN
+-# undef PRIo8
+-# define PRIo8 "o"
+-#endif
+-#if !defined PRIu8 || PRI_MACROS_BROKEN
+-# undef PRIu8
+-# define PRIu8 "u"
+-#endif
+-#if !defined PRIx8 || PRI_MACROS_BROKEN
+-# undef PRIx8
+-# define PRIx8 "x"
+-#endif
+-#if !defined PRIX8 || PRI_MACROS_BROKEN
+-# undef PRIX8
+-# define PRIX8 "X"
+-#endif
+-#if !defined PRId16 || PRI_MACROS_BROKEN
+-# undef PRId16
+-# define PRId16 "d"
+-#endif
+-#if !defined PRIi16 || PRI_MACROS_BROKEN
+-# undef PRIi16
+-# define PRIi16 "i"
+-#endif
+-#if !defined PRIo16 || PRI_MACROS_BROKEN
+-# undef PRIo16
+-# define PRIo16 "o"
+-#endif
+-#if !defined PRIu16 || PRI_MACROS_BROKEN
+-# undef PRIu16
+-# define PRIu16 "u"
+-#endif
+-#if !defined PRIx16 || PRI_MACROS_BROKEN
+-# undef PRIx16
+-# define PRIx16 "x"
+-#endif
+-#if !defined PRIX16 || PRI_MACROS_BROKEN
+-# undef PRIX16
+-# define PRIX16 "X"
+-#endif
+-#if !defined PRId32 || PRI_MACROS_BROKEN
+-# undef PRId32
+-# define PRId32 "d"
+-#endif
+-#if !defined PRIi32 || PRI_MACROS_BROKEN
+-# undef PRIi32
+-# define PRIi32 "i"
+-#endif
+-#if !defined PRIo32 || PRI_MACROS_BROKEN
+-# undef PRIo32
+-# define PRIo32 "o"
+-#endif
+-#if !defined PRIu32 || PRI_MACROS_BROKEN
+-# undef PRIu32
+-# define PRIu32 "u"
+-#endif
+-#if !defined PRIx32 || PRI_MACROS_BROKEN
+-# undef PRIx32
+-# define PRIx32 "x"
+-#endif
+-#if !defined PRIX32 || PRI_MACROS_BROKEN
+-# undef PRIX32
+-# define PRIX32 "X"
+-#endif
+-#if !defined PRId64 || PRI_MACROS_BROKEN
+-# undef PRId64
+-# define PRId64 (sizeof (long) == 8 ? "ld" : "lld")
+-#endif
+-#if !defined PRIi64 || PRI_MACROS_BROKEN
+-# undef PRIi64
+-# define PRIi64 (sizeof (long) == 8 ? "li" : "lli")
+-#endif
+-#if !defined PRIo64 || PRI_MACROS_BROKEN
+-# undef PRIo64
+-# define PRIo64 (sizeof (long) == 8 ? "lo" : "llo")
+-#endif
+-#if !defined PRIu64 || PRI_MACROS_BROKEN
+-# undef PRIu64
+-# define PRIu64 (sizeof (long) == 8 ? "lu" : "llu")
+-#endif
+-#if !defined PRIx64 || PRI_MACROS_BROKEN
+-# undef PRIx64
+-# define PRIx64 (sizeof (long) == 8 ? "lx" : "llx")
+-#endif
+-#if !defined PRIX64 || PRI_MACROS_BROKEN
+-# undef PRIX64
+-# define PRIX64 (sizeof (long) == 8 ? "lX" : "llX")
+-#endif
+-#if !defined PRIdLEAST8 || PRI_MACROS_BROKEN
+-# undef PRIdLEAST8
+-# define PRIdLEAST8 "d"
+-#endif
+-#if !defined PRIiLEAST8 || PRI_MACROS_BROKEN
+-# undef PRIiLEAST8
+-# define PRIiLEAST8 "i"
+-#endif
+-#if !defined PRIoLEAST8 || PRI_MACROS_BROKEN
+-# undef PRIoLEAST8
+-# define PRIoLEAST8 "o"
+-#endif
+-#if !defined PRIuLEAST8 || PRI_MACROS_BROKEN
+-# undef PRIuLEAST8
+-# define PRIuLEAST8 "u"
+-#endif
+-#if !defined PRIxLEAST8 || PRI_MACROS_BROKEN
+-# undef PRIxLEAST8
+-# define PRIxLEAST8 "x"
+-#endif
+-#if !defined PRIXLEAST8 || PRI_MACROS_BROKEN
+-# undef PRIXLEAST8
+-# define PRIXLEAST8 "X"
+-#endif
+-#if !defined PRIdLEAST16 || PRI_MACROS_BROKEN
+-# undef PRIdLEAST16
+-# define PRIdLEAST16 "d"
+-#endif
+-#if !defined PRIiLEAST16 || PRI_MACROS_BROKEN
+-# undef PRIiLEAST16
+-# define PRIiLEAST16 "i"
+-#endif
+-#if !defined PRIoLEAST16 || PRI_MACROS_BROKEN
+-# undef PRIoLEAST16
+-# define PRIoLEAST16 "o"
+-#endif
+-#if !defined PRIuLEAST16 || PRI_MACROS_BROKEN
+-# undef PRIuLEAST16
+-# define PRIuLEAST16 "u"
+-#endif
+-#if !defined PRIxLEAST16 || PRI_MACROS_BROKEN
+-# undef PRIxLEAST16
+-# define PRIxLEAST16 "x"
+-#endif
+-#if !defined PRIXLEAST16 || PRI_MACROS_BROKEN
+-# undef PRIXLEAST16
+-# define PRIXLEAST16 "X"
+-#endif
+-#if !defined PRIdLEAST32 || PRI_MACROS_BROKEN
+-# undef PRIdLEAST32
+-# define PRIdLEAST32 "d"
+-#endif
+-#if !defined PRIiLEAST32 || PRI_MACROS_BROKEN
+-# undef PRIiLEAST32
+-# define PRIiLEAST32 "i"
+-#endif
+-#if !defined PRIoLEAST32 || PRI_MACROS_BROKEN
+-# undef PRIoLEAST32
+-# define PRIoLEAST32 "o"
+-#endif
+-#if !defined PRIuLEAST32 || PRI_MACROS_BROKEN
+-# undef PRIuLEAST32
+-# define PRIuLEAST32 "u"
+-#endif
+-#if !defined PRIxLEAST32 || PRI_MACROS_BROKEN
+-# undef PRIxLEAST32
+-# define PRIxLEAST32 "x"
+-#endif
+-#if !defined PRIXLEAST32 || PRI_MACROS_BROKEN
+-# undef PRIXLEAST32
+-# define PRIXLEAST32 "X"
+-#endif
+-#if !defined PRIdLEAST64 || PRI_MACROS_BROKEN
+-# undef PRIdLEAST64
+-# define PRIdLEAST64 PRId64
+-#endif
+-#if !defined PRIiLEAST64 || PRI_MACROS_BROKEN
+-# undef PRIiLEAST64
+-# define PRIiLEAST64 PRIi64
+-#endif
+-#if !defined PRIoLEAST64 || PRI_MACROS_BROKEN
+-# undef PRIoLEAST64
+-# define PRIoLEAST64 PRIo64
+-#endif
+-#if !defined PRIuLEAST64 || PRI_MACROS_BROKEN
+-# undef PRIuLEAST64
+-# define PRIuLEAST64 PRIu64
+-#endif
+-#if !defined PRIxLEAST64 || PRI_MACROS_BROKEN
+-# undef PRIxLEAST64
+-# define PRIxLEAST64 PRIx64
+-#endif
+-#if !defined PRIXLEAST64 || PRI_MACROS_BROKEN
+-# undef PRIXLEAST64
+-# define PRIXLEAST64 PRIX64
+-#endif
+-#if !defined PRIdFAST8 || PRI_MACROS_BROKEN
+-# undef PRIdFAST8
+-# define PRIdFAST8 "d"
+-#endif
+-#if !defined PRIiFAST8 || PRI_MACROS_BROKEN
+-# undef PRIiFAST8
+-# define PRIiFAST8 "i"
+-#endif
+-#if !defined PRIoFAST8 || PRI_MACROS_BROKEN
+-# undef PRIoFAST8
+-# define PRIoFAST8 "o"
+-#endif
+-#if !defined PRIuFAST8 || PRI_MACROS_BROKEN
+-# undef PRIuFAST8
+-# define PRIuFAST8 "u"
+-#endif
+-#if !defined PRIxFAST8 || PRI_MACROS_BROKEN
+-# undef PRIxFAST8
+-# define PRIxFAST8 "x"
+-#endif
+-#if !defined PRIXFAST8 || PRI_MACROS_BROKEN
+-# undef PRIXFAST8
+-# define PRIXFAST8 "X"
+-#endif
+-#if !defined PRIdFAST16 || PRI_MACROS_BROKEN
+-# undef PRIdFAST16
+-# define PRIdFAST16 "d"
+-#endif
+-#if !defined PRIiFAST16 || PRI_MACROS_BROKEN
+-# undef PRIiFAST16
+-# define PRIiFAST16 "i"
+-#endif
+-#if !defined PRIoFAST16 || PRI_MACROS_BROKEN
+-# undef PRIoFAST16
+-# define PRIoFAST16 "o"
+-#endif
+-#if !defined PRIuFAST16 || PRI_MACROS_BROKEN
+-# undef PRIuFAST16
+-# define PRIuFAST16 "u"
+-#endif
+-#if !defined PRIxFAST16 || PRI_MACROS_BROKEN
+-# undef PRIxFAST16
+-# define PRIxFAST16 "x"
+-#endif
+-#if !defined PRIXFAST16 || PRI_MACROS_BROKEN
+-# undef PRIXFAST16
+-# define PRIXFAST16 "X"
+-#endif
+-#if !defined PRIdFAST32 || PRI_MACROS_BROKEN
+-# undef PRIdFAST32
+-# define PRIdFAST32 "d"
+-#endif
+-#if !defined PRIiFAST32 || PRI_MACROS_BROKEN
+-# undef PRIiFAST32
+-# define PRIiFAST32 "i"
+-#endif
+-#if !defined PRIoFAST32 || PRI_MACROS_BROKEN
+-# undef PRIoFAST32
+-# define PRIoFAST32 "o"
+-#endif
+-#if !defined PRIuFAST32 || PRI_MACROS_BROKEN
+-# undef PRIuFAST32
+-# define PRIuFAST32 "u"
+-#endif
+-#if !defined PRIxFAST32 || PRI_MACROS_BROKEN
+-# undef PRIxFAST32
+-# define PRIxFAST32 "x"
+-#endif
+-#if !defined PRIXFAST32 || PRI_MACROS_BROKEN
+-# undef PRIXFAST32
+-# define PRIXFAST32 "X"
+-#endif
+-#if !defined PRIdFAST64 || PRI_MACROS_BROKEN
+-# undef PRIdFAST64
+-# define PRIdFAST64 PRId64
+-#endif
+-#if !defined PRIiFAST64 || PRI_MACROS_BROKEN
+-# undef PRIiFAST64
+-# define PRIiFAST64 PRIi64
+-#endif
+-#if !defined PRIoFAST64 || PRI_MACROS_BROKEN
+-# undef PRIoFAST64
+-# define PRIoFAST64 PRIo64
+-#endif
+-#if !defined PRIuFAST64 || PRI_MACROS_BROKEN
+-# undef PRIuFAST64
+-# define PRIuFAST64 PRIu64
+-#endif
+-#if !defined PRIxFAST64 || PRI_MACROS_BROKEN
+-# undef PRIxFAST64
+-# define PRIxFAST64 PRIx64
+-#endif
+-#if !defined PRIXFAST64 || PRI_MACROS_BROKEN
+-# undef PRIXFAST64
+-# define PRIXFAST64 PRIX64
+-#endif
+-#if !defined PRIdMAX || PRI_MACROS_BROKEN
+-# undef PRIdMAX
+-# define PRIdMAX (sizeof (uintmax_t) == sizeof (long) ? "ld" : "lld")
+-#endif
+-#if !defined PRIiMAX || PRI_MACROS_BROKEN
+-# undef PRIiMAX
+-# define PRIiMAX (sizeof (uintmax_t) == sizeof (long) ? "li" : "lli")
+-#endif
+-#if !defined PRIoMAX || PRI_MACROS_BROKEN
+-# undef PRIoMAX
+-# define PRIoMAX (sizeof (uintmax_t) == sizeof (long) ? "lo" : "llo")
+-#endif
+-#if !defined PRIuMAX || PRI_MACROS_BROKEN
+-# undef PRIuMAX
+-# define PRIuMAX (sizeof (uintmax_t) == sizeof (long) ? "lu" : "llu")
+-#endif
+-#if !defined PRIxMAX || PRI_MACROS_BROKEN
+-# undef PRIxMAX
+-# define PRIxMAX (sizeof (uintmax_t) == sizeof (long) ? "lx" : "llx")
+-#endif
+-#if !defined PRIXMAX || PRI_MACROS_BROKEN
+-# undef PRIXMAX
+-# define PRIXMAX (sizeof (uintmax_t) == sizeof (long) ? "lX" : "llX")
+-#endif
+-#if !defined PRIdPTR || PRI_MACROS_BROKEN
+-# undef PRIdPTR
+-# define PRIdPTR \
+- (sizeof (void *) == sizeof (long) ? "ld" : \
+- sizeof (void *) == sizeof (int) ? "d" : \
+- "lld")
+-#endif
+-#if !defined PRIiPTR || PRI_MACROS_BROKEN
+-# undef PRIiPTR
+-# define PRIiPTR \
+- (sizeof (void *) == sizeof (long) ? "li" : \
+- sizeof (void *) == sizeof (int) ? "i" : \
+- "lli")
+-#endif
+-#if !defined PRIoPTR || PRI_MACROS_BROKEN
+-# undef PRIoPTR
+-# define PRIoPTR \
+- (sizeof (void *) == sizeof (long) ? "lo" : \
+- sizeof (void *) == sizeof (int) ? "o" : \
+- "llo")
+-#endif
+-#if !defined PRIuPTR || PRI_MACROS_BROKEN
+-# undef PRIuPTR
+-# define PRIuPTR \
+- (sizeof (void *) == sizeof (long) ? "lu" : \
+- sizeof (void *) == sizeof (int) ? "u" : \
+- "llu")
+-#endif
+-#if !defined PRIxPTR || PRI_MACROS_BROKEN
+-# undef PRIxPTR
+-# define PRIxPTR \
+- (sizeof (void *) == sizeof (long) ? "lx" : \
+- sizeof (void *) == sizeof (int) ? "x" : \
+- "llx")
+-#endif
+-#if !defined PRIXPTR || PRI_MACROS_BROKEN
+-# undef PRIXPTR
+-# define PRIXPTR \
+- (sizeof (void *) == sizeof (long) ? "lX" : \
+- sizeof (void *) == sizeof (int) ? "X" : \
+- "llX")
+-#endif
+-
+-/* @@ end of prolog @@ */
+-
+-#ifdef _LIBC
+-/* Rename the non ISO C functions. This is required by the standard
+- because some ISO C functions will require linking with this object
+- file and the name space must not be polluted. */
+-# define open(name, flags) open_not_cancel_2 (name, flags)
+-# define close(fd) close_not_cancel_no_status (fd)
+-# define read(fd, buf, n) read_not_cancel (fd, buf, n)
+-# define mmap(addr, len, prot, flags, fd, offset) \
+- __mmap (addr, len, prot, flags, fd, offset)
+-# define munmap(addr, len) __munmap (addr, len)
+-#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
+-
+-/* For systems that distinguish between text and binary I/O.
+- O_BINARY is usually declared in <fcntl.h>. */
+-#if !defined O_BINARY && defined _O_BINARY
+- /* For MSC-compatible compilers. */
+-# define O_BINARY _O_BINARY
+-# define O_TEXT _O_TEXT
+-#endif
+-#ifdef __BEOS__
+- /* BeOS 5 has O_BINARY and O_TEXT, but they have no effect. */
+-# undef O_BINARY
+-# undef O_TEXT
+-#endif
+-/* On reasonable systems, binary I/O is the default. */
+-#ifndef O_BINARY
+-# define O_BINARY 0
+-#endif
+-
+-
+-/* We need a sign, whether a new catalog was loaded, which can be associated
+- with all translations. This is important if the translations are
+- cached by one of GCC's features. */
+-int _nl_msg_cat_cntr;
+-
+-
+-/* Expand a system dependent string segment. Return NULL if unsupported. */
+-static const char *
+-get_sysdep_segment_value (const char *name)
+-{
+- /* Test for an ISO C 99 section 7.8.1 format string directive.
+- Syntax:
+- P R I { d | i | o | u | x | X }
+- { { | LEAST | FAST } { 8 | 16 | 32 | 64 } | MAX | PTR } */
+- /* We don't use a table of 14 times 6 'const char *' strings here, because
+- data relocations cost startup time. */
+- if (name[0] == 'P' && name[1] == 'R' && name[2] == 'I')
+- {
+- if (name[3] == 'd' || name[3] == 'i' || name[3] == 'o' || name[3] == 'u'
+- || name[3] == 'x' || name[3] == 'X')
+- {
+- if (name[4] == '8' && name[5] == '\0')
+- {
+- if (name[3] == 'd')
+- return PRId8;
+- if (name[3] == 'i')
+- return PRIi8;
+- if (name[3] == 'o')
+- return PRIo8;
+- if (name[3] == 'u')
+- return PRIu8;
+- if (name[3] == 'x')
+- return PRIx8;
+- if (name[3] == 'X')
+- return PRIX8;
+- abort ();
+- }
+- if (name[4] == '1' && name[5] == '6' && name[6] == '\0')
+- {
+- if (name[3] == 'd')
+- return PRId16;
+- if (name[3] == 'i')
+- return PRIi16;
+- if (name[3] == 'o')
+- return PRIo16;
+- if (name[3] == 'u')
+- return PRIu16;
+- if (name[3] == 'x')
+- return PRIx16;
+- if (name[3] == 'X')
+- return PRIX16;
+- abort ();
+- }
+- if (name[4] == '3' && name[5] == '2' && name[6] == '\0')
+- {
+- if (name[3] == 'd')
+- return PRId32;
+- if (name[3] == 'i')
+- return PRIi32;
+- if (name[3] == 'o')
+- return PRIo32;
+- if (name[3] == 'u')
+- return PRIu32;
+- if (name[3] == 'x')
+- return PRIx32;
+- if (name[3] == 'X')
+- return PRIX32;
+- abort ();
+- }
+- if (name[4] == '6' && name[5] == '4' && name[6] == '\0')
+- {
+- if (name[3] == 'd')
+- return PRId64;
+- if (name[3] == 'i')
+- return PRIi64;
+- if (name[3] == 'o')
+- return PRIo64;
+- if (name[3] == 'u')
+- return PRIu64;
+- if (name[3] == 'x')
+- return PRIx64;
+- if (name[3] == 'X')
+- return PRIX64;
+- abort ();
+- }
+- if (name[4] == 'L' && name[5] == 'E' && name[6] == 'A'
+- && name[7] == 'S' && name[8] == 'T')
+- {
+- if (name[9] == '8' && name[10] == '\0')
+- {
+- if (name[3] == 'd')
+- return PRIdLEAST8;
+- if (name[3] == 'i')
+- return PRIiLEAST8;
+- if (name[3] == 'o')
+- return PRIoLEAST8;
+- if (name[3] == 'u')
+- return PRIuLEAST8;
+- if (name[3] == 'x')
+- return PRIxLEAST8;
+- if (name[3] == 'X')
+- return PRIXLEAST8;
+- abort ();
+- }
+- if (name[9] == '1' && name[10] == '6' && name[11] == '\0')
+- {
+- if (name[3] == 'd')
+- return PRIdLEAST16;
+- if (name[3] == 'i')
+- return PRIiLEAST16;
+- if (name[3] == 'o')
+- return PRIoLEAST16;
+- if (name[3] == 'u')
+- return PRIuLEAST16;
+- if (name[3] == 'x')
+- return PRIxLEAST16;
+- if (name[3] == 'X')
+- return PRIXLEAST16;
+- abort ();
+- }
+- if (name[9] == '3' && name[10] == '2' && name[11] == '\0')
+- {
+- if (name[3] == 'd')
+- return PRIdLEAST32;
+- if (name[3] == 'i')
+- return PRIiLEAST32;
+- if (name[3] == 'o')
+- return PRIoLEAST32;
+- if (name[3] == 'u')
+- return PRIuLEAST32;
+- if (name[3] == 'x')
+- return PRIxLEAST32;
+- if (name[3] == 'X')
+- return PRIXLEAST32;
+- abort ();
+- }
+- if (name[9] == '6' && name[10] == '4' && name[11] == '\0')
+- {
+- if (name[3] == 'd')
+- return PRIdLEAST64;
+- if (name[3] == 'i')
+- return PRIiLEAST64;
+- if (name[3] == 'o')
+- return PRIoLEAST64;
+- if (name[3] == 'u')
+- return PRIuLEAST64;
+- if (name[3] == 'x')
+- return PRIxLEAST64;
+- if (name[3] == 'X')
+- return PRIXLEAST64;
+- abort ();
+- }
+- }
+- if (name[4] == 'F' && name[5] == 'A' && name[6] == 'S'
+- && name[7] == 'T')
+- {
+- if (name[8] == '8' && name[9] == '\0')
+- {
+- if (name[3] == 'd')
+- return PRIdFAST8;
+- if (name[3] == 'i')
+- return PRIiFAST8;
+- if (name[3] == 'o')
+- return PRIoFAST8;
+- if (name[3] == 'u')
+- return PRIuFAST8;
+- if (name[3] == 'x')
+- return PRIxFAST8;
+- if (name[3] == 'X')
+- return PRIXFAST8;
+- abort ();
+- }
+- if (name[8] == '1' && name[9] == '6' && name[10] == '\0')
+- {
+- if (name[3] == 'd')
+- return PRIdFAST16;
+- if (name[3] == 'i')
+- return PRIiFAST16;
+- if (name[3] == 'o')
+- return PRIoFAST16;
+- if (name[3] == 'u')
+- return PRIuFAST16;
+- if (name[3] == 'x')
+- return PRIxFAST16;
+- if (name[3] == 'X')
+- return PRIXFAST16;
+- abort ();
+- }
+- if (name[8] == '3' && name[9] == '2' && name[10] == '\0')
+- {
+- if (name[3] == 'd')
+- return PRIdFAST32;
+- if (name[3] == 'i')
+- return PRIiFAST32;
+- if (name[3] == 'o')
+- return PRIoFAST32;
+- if (name[3] == 'u')
+- return PRIuFAST32;
+- if (name[3] == 'x')
+- return PRIxFAST32;
+- if (name[3] == 'X')
+- return PRIXFAST32;
+- abort ();
+- }
+- if (name[8] == '6' && name[9] == '4' && name[10] == '\0')
+- {
+- if (name[3] == 'd')
+- return PRIdFAST64;
+- if (name[3] == 'i')
+- return PRIiFAST64;
+- if (name[3] == 'o')
+- return PRIoFAST64;
+- if (name[3] == 'u')
+- return PRIuFAST64;
+- if (name[3] == 'x')
+- return PRIxFAST64;
+- if (name[3] == 'X')
+- return PRIXFAST64;
+- abort ();
+- }
+- }
+- if (name[4] == 'M' && name[5] == 'A' && name[6] == 'X'
+- && name[7] == '\0')
+- {
+- if (name[3] == 'd')
+- return PRIdMAX;
+- if (name[3] == 'i')
+- return PRIiMAX;
+- if (name[3] == 'o')
+- return PRIoMAX;
+- if (name[3] == 'u')
+- return PRIuMAX;
+- if (name[3] == 'x')
+- return PRIxMAX;
+- if (name[3] == 'X')
+- return PRIXMAX;
+- abort ();
+- }
+- if (name[4] == 'P' && name[5] == 'T' && name[6] == 'R'
+- && name[7] == '\0')
+- {
+- if (name[3] == 'd')
+- return PRIdPTR;
+- if (name[3] == 'i')
+- return PRIiPTR;
+- if (name[3] == 'o')
+- return PRIoPTR;
+- if (name[3] == 'u')
+- return PRIuPTR;
+- if (name[3] == 'x')
+- return PRIxPTR;
+- if (name[3] == 'X')
+- return PRIXPTR;
+- abort ();
+- }
+- }
+- }
+- /* Test for a glibc specific printf() format directive flag. */
+- if (name[0] == 'I' && name[1] == '\0')
+- {
+-#if defined _LIBC || __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2)
+- /* The 'I' flag, in numeric format directives, replaces ASCII digits
+- with the 'outdigits' defined in the LC_CTYPE locale facet. This is
+- used for Farsi (Persian) and maybe Arabic. */
+- return "I";
+-#else
+- return "";
+-#endif
+- }
+- /* Other system dependent strings are not valid. */
+- return NULL;
+-}
+-
+-/* Load the message catalogs specified by FILENAME. If it is no valid
+- message catalog do nothing. */
+-void
+-internal_function
+-_nl_load_domain (struct loaded_l10nfile *domain_file,
+- struct binding *domainbinding)
+-{
+- __libc_lock_define_initialized_recursive (static, lock)
+- int fd = -1;
+- size_t size;
+-#ifdef _LIBC
+- struct stat64 st;
+-#else
+- struct stat st;
+-#endif
+- struct mo_file_header *data = (struct mo_file_header *) -1;
+- int use_mmap = 0;
+- struct loaded_domain *domain;
+- int revision;
+- const char *nullentry;
+- size_t nullentrylen;
+-
+- __libc_lock_lock_recursive (lock);
+- if (domain_file->decided != 0)
+- {
+- /* There are two possibilities:
+-
+- + this is the same thread calling again during this initialization
+- via _nl_find_msg. We have initialized everything this call needs.
+-
+- + this is another thread which tried to initialize this object.
+- Not necessary anymore since if the lock is available this
+- is finished.
+- */
+- goto done;
+- }
+-
+- domain_file->decided = -1;
+- domain_file->data = NULL;
+-
+- /* Note that it would be useless to store domainbinding in domain_file
+- because domainbinding might be == NULL now but != NULL later (after
+- a call to bind_textdomain_codeset). */
+-
+- /* If the record does not represent a valid locale the FILENAME
+- might be NULL. This can happen when according to the given
+- specification the locale file name is different for XPG and CEN
+- syntax. */
+- if (domain_file->filename == NULL)
+- goto out;
+-
+- /* Try to open the addressed file. */
+- fd = open (domain_file->filename, O_RDONLY | O_BINARY);
+- if (fd == -1)
+- goto out;
+-
+- /* We must know about the size of the file. */
+- if (
+-#ifdef _LIBC
+- __builtin_expect (fstat64 (fd, &st) != 0, 0)
+-#else
+- __builtin_expect (fstat (fd, &st) != 0, 0)
+-#endif
+- || __builtin_expect ((size = (size_t) st.st_size) != st.st_size, 0)
+- || __builtin_expect (size < sizeof (struct mo_file_header), 0))
+- /* Something went wrong. */
+- goto out;
+-
+-#ifdef HAVE_MMAP
+- /* Now we are ready to load the file. If mmap() is available we try
+- this first. If not available or it failed we try to load it. */
+- data = (struct mo_file_header *) mmap (NULL, size, PROT_READ,
+- MAP_PRIVATE, fd, 0);
+-
+- if (__builtin_expect (data != (struct mo_file_header *) -1, 1))
+- {
+- /* mmap() call was successful. */
+- close (fd);
+- fd = -1;
+- use_mmap = 1;
+- }
+-#endif
+-
+- /* If the data is not yet available (i.e. mmap'ed) we try to load
+- it manually. */
+- if (data == (struct mo_file_header *) -1)
+- {
+- size_t to_read;
+- char *read_ptr;
+-
+- data = (struct mo_file_header *) malloc (size);
+- if (data == NULL)
+- goto out;
+-
+- to_read = size;
+- read_ptr = (char *) data;
+- do
+- {
+- long int nb = (long int) read (fd, read_ptr, to_read);
+- if (nb <= 0)
+- {
+-#ifdef EINTR
+- if (nb == -1 && errno == EINTR)
+- continue;
+-#endif
+- goto out;
+- }
+- read_ptr += nb;
+- to_read -= nb;
+- }
+- while (to_read > 0);
+-
+- close (fd);
+- fd = -1;
+- }
+-
+- /* Using the magic number we can test whether it really is a message
+- catalog file. */
+- if (__builtin_expect (data->magic != _MAGIC && data->magic != _MAGIC_SWAPPED,
+- 0))
+- {
+- /* The magic number is wrong: not a message catalog file. */
+-#ifdef HAVE_MMAP
+- if (use_mmap)
+- munmap ((caddr_t) data, size);
+- else
+-#endif
+- free (data);
+- goto out;
+- }
+-
+- domain = (struct loaded_domain *) malloc (sizeof (struct loaded_domain));
+- if (domain == NULL)
+- goto out;
+- domain_file->data = domain;
+-
+- domain->data = (char *) data;
+- domain->use_mmap = use_mmap;
+- domain->mmap_size = size;
+- domain->must_swap = data->magic != _MAGIC;
+- domain->malloced = NULL;
+-
+- /* Fill in the information about the available tables. */
+- revision = W (domain->must_swap, data->revision);
+- /* We support only the major revisions 0 and 1. */
+- switch (revision >> 16)
+- {
+- case 0:
+- case 1:
+- domain->nstrings = W (domain->must_swap, data->nstrings);
+- domain->orig_tab = (const struct string_desc *)
+- ((char *) data + W (domain->must_swap, data->orig_tab_offset));
+- domain->trans_tab = (const struct string_desc *)
+- ((char *) data + W (domain->must_swap, data->trans_tab_offset));
+- domain->hash_size = W (domain->must_swap, data->hash_tab_size);
+- domain->hash_tab =
+- (domain->hash_size > 2
+- ? (const nls_uint32 *)
+- ((char *) data + W (domain->must_swap, data->hash_tab_offset))
+- : NULL);
+- domain->must_swap_hash_tab = domain->must_swap;
+-
+- /* Now dispatch on the minor revision. */
+- switch (revision & 0xffff)
+- {
+- case 0:
+- domain->n_sysdep_strings = 0;
+- domain->orig_sysdep_tab = NULL;
+- domain->trans_sysdep_tab = NULL;
+- break;
+- case 1:
+- default:
+- {
+- nls_uint32 n_sysdep_strings;
+-
+- if (domain->hash_tab == NULL)
+- /* This is invalid. These minor revisions need a hash table. */
+- goto invalid;
+-
+- n_sysdep_strings =
+- W (domain->must_swap, data->n_sysdep_strings);
+- if (n_sysdep_strings > 0)
+- {
+- nls_uint32 n_sysdep_segments;
+- const struct sysdep_segment *sysdep_segments;
+- const char **sysdep_segment_values;
+- const nls_uint32 *orig_sysdep_tab;
+- const nls_uint32 *trans_sysdep_tab;
+- nls_uint32 n_inmem_sysdep_strings;
+- size_t memneed;
+- char *mem;
+- struct sysdep_string_desc *inmem_orig_sysdep_tab;
+- struct sysdep_string_desc *inmem_trans_sysdep_tab;
+- nls_uint32 *inmem_hash_tab;
+- unsigned int i, j;
+-
+- /* Get the values of the system dependent segments. */
+- n_sysdep_segments =
+- W (domain->must_swap, data->n_sysdep_segments);
+- sysdep_segments = (const struct sysdep_segment *)
+- ((char *) data
+- + W (domain->must_swap, data->sysdep_segments_offset));
+- sysdep_segment_values =
+- (const char **)
+- alloca (n_sysdep_segments * sizeof (const char *));
+- for (i = 0; i < n_sysdep_segments; i++)
+- {
+- const char *name =
+- (char *) data
+- + W (domain->must_swap, sysdep_segments[i].offset);
+- nls_uint32 namelen =
+- W (domain->must_swap, sysdep_segments[i].length);
+-
+- if (!(namelen > 0 && name[namelen - 1] == '\0'))
+- {
+- freea (sysdep_segment_values);
+- goto invalid;
+- }
+-
+- sysdep_segment_values[i] = get_sysdep_segment_value (name);
+- }
+-
+- orig_sysdep_tab = (const nls_uint32 *)
+- ((char *) data
+- + W (domain->must_swap, data->orig_sysdep_tab_offset));
+- trans_sysdep_tab = (const nls_uint32 *)
+- ((char *) data
+- + W (domain->must_swap, data->trans_sysdep_tab_offset));
+-
+- /* Compute the amount of additional memory needed for the
+- system dependent strings and the augmented hash table.
+- At the same time, also drop string pairs which refer to
+- an undefined system dependent segment. */
+- n_inmem_sysdep_strings = 0;
+- memneed = domain->hash_size * sizeof (nls_uint32);
+- for (i = 0; i < n_sysdep_strings; i++)
+- {
+- int valid = 1;
+- size_t needs[2];
+-
+- for (j = 0; j < 2; j++)
+- {
+- const struct sysdep_string *sysdep_string =
+- (const struct sysdep_string *)
+- ((char *) data
+- + W (domain->must_swap,
+- j == 0
+- ? orig_sysdep_tab[i]
+- : trans_sysdep_tab[i]));
+- size_t need = 0;
+- const struct segment_pair *p = sysdep_string->segments;
+-
+- if (W (domain->must_swap, p->sysdepref) != SEGMENTS_END)
+- for (p = sysdep_string->segments;; p++)
+- {
+- nls_uint32 sysdepref;
+-
+- need += W (domain->must_swap, p->segsize);
+-
+- sysdepref = W (domain->must_swap, p->sysdepref);
+- if (sysdepref == SEGMENTS_END)
+- break;
+-
+- if (sysdepref >= n_sysdep_segments)
+- {
+- /* Invalid. */
+- freea (sysdep_segment_values);
+- goto invalid;
+- }
+-
+- if (sysdep_segment_values[sysdepref] == NULL)
+- {
+- /* This particular string pair is invalid. */
+- valid = 0;
+- break;
+- }
+-
+- need += strlen (sysdep_segment_values[sysdepref]);
+- }
+-
+- needs[j] = need;
+- if (!valid)
+- break;
+- }
+-
+- if (valid)
+- {
+- n_inmem_sysdep_strings++;
+- memneed += needs[0] + needs[1];
+- }
+- }
+- memneed += 2 * n_inmem_sysdep_strings
+- * sizeof (struct sysdep_string_desc);
+-
+- if (n_inmem_sysdep_strings > 0)
+- {
+- unsigned int k;
+-
+- /* Allocate additional memory. */
+- mem = (char *) malloc (memneed);
+- if (mem == NULL)
+- goto invalid;
+-
+- domain->malloced = mem;
+- inmem_orig_sysdep_tab = (struct sysdep_string_desc *) mem;
+- mem += n_inmem_sysdep_strings
+- * sizeof (struct sysdep_string_desc);
+- inmem_trans_sysdep_tab = (struct sysdep_string_desc *) mem;
+- mem += n_inmem_sysdep_strings
+- * sizeof (struct sysdep_string_desc);
+- inmem_hash_tab = (nls_uint32 *) mem;
+- mem += domain->hash_size * sizeof (nls_uint32);
+-
+- /* Compute the system dependent strings. */
+- k = 0;
+- for (i = 0; i < n_sysdep_strings; i++)
+- {
+- int valid = 1;
+-
+- for (j = 0; j < 2; j++)
+- {
+- const struct sysdep_string *sysdep_string =
+- (const struct sysdep_string *)
+- ((char *) data
+- + W (domain->must_swap,
+- j == 0
+- ? orig_sysdep_tab[i]
+- : trans_sysdep_tab[i]));
+- const struct segment_pair *p =
+- sysdep_string->segments;
+-
+- if (W (domain->must_swap, p->sysdepref)
+- != SEGMENTS_END)
+- for (p = sysdep_string->segments;; p++)
+- {
+- nls_uint32 sysdepref;
+-
+- sysdepref =
+- W (domain->must_swap, p->sysdepref);
+- if (sysdepref == SEGMENTS_END)
+- break;
+-
+- if (sysdep_segment_values[sysdepref] == NULL)
+- {
+- /* This particular string pair is
+- invalid. */
+- valid = 0;
+- break;
+- }
+- }
+-
+- if (!valid)
+- break;
+- }
+-
+- if (valid)
+- {
+- for (j = 0; j < 2; j++)
+- {
+- const struct sysdep_string *sysdep_string =
+- (const struct sysdep_string *)
+- ((char *) data
+- + W (domain->must_swap,
+- j == 0
+- ? orig_sysdep_tab[i]
+- : trans_sysdep_tab[i]));
+- const char *static_segments =
+- (char *) data
+- + W (domain->must_swap, sysdep_string->offset);
+- const struct segment_pair *p =
+- sysdep_string->segments;
+-
+- /* Concatenate the segments, and fill
+- inmem_orig_sysdep_tab[k] (for j == 0) and
+- inmem_trans_sysdep_tab[k] (for j == 1). */
+-
+- struct sysdep_string_desc *inmem_tab_entry =
+- (j == 0
+- ? inmem_orig_sysdep_tab
+- : inmem_trans_sysdep_tab)
+- + k;
+-
+- if (W (domain->must_swap, p->sysdepref)
+- == SEGMENTS_END)
+- {
+- /* Only one static segment. */
+- inmem_tab_entry->length =
+- W (domain->must_swap, p->segsize);
+- inmem_tab_entry->pointer = static_segments;
+- }
+- else
+- {
+- inmem_tab_entry->pointer = mem;
+-
+- for (p = sysdep_string->segments;; p++)
+- {
+- nls_uint32 segsize =
+- W (domain->must_swap, p->segsize);
+- nls_uint32 sysdepref =
+- W (domain->must_swap, p->sysdepref);
+- size_t n;
+-
+- if (segsize > 0)
+- {
+- memcpy (mem, static_segments, segsize);
+- mem += segsize;
+- static_segments += segsize;
+- }
+-
+- if (sysdepref == SEGMENTS_END)
+- break;
+-
+- n = strlen (sysdep_segment_values[sysdepref]);
+- memcpy (mem, sysdep_segment_values[sysdepref], n);
+- mem += n;
+- }
+-
+- inmem_tab_entry->length =
+- mem - inmem_tab_entry->pointer;
+- }
+- }
+-
+- k++;
+- }
+- }
+- if (k != n_inmem_sysdep_strings)
+- abort ();
+-
+- /* Compute the augmented hash table. */
+- for (i = 0; i < domain->hash_size; i++)
+- inmem_hash_tab[i] =
+- W (domain->must_swap_hash_tab, domain->hash_tab[i]);
+- for (i = 0; i < n_inmem_sysdep_strings; i++)
+- {
+- const char *msgid = inmem_orig_sysdep_tab[i].pointer;
+- nls_uint32 hash_val = __hash_string (msgid);
+- nls_uint32 idx = hash_val % domain->hash_size;
+- nls_uint32 incr =
+- 1 + (hash_val % (domain->hash_size - 2));
+-
+- for (;;)
+- {
+- if (inmem_hash_tab[idx] == 0)
+- {
+- /* Hash table entry is empty. Use it. */
+- inmem_hash_tab[idx] = 1 + domain->nstrings + i;
+- break;
+- }
+-
+- if (idx >= domain->hash_size - incr)
+- idx -= domain->hash_size - incr;
+- else
+- idx += incr;
+- }
+- }
+-
+- domain->n_sysdep_strings = n_inmem_sysdep_strings;
+- domain->orig_sysdep_tab = inmem_orig_sysdep_tab;
+- domain->trans_sysdep_tab = inmem_trans_sysdep_tab;
+-
+- domain->hash_tab = inmem_hash_tab;
+- domain->must_swap_hash_tab = 0;
+- }
+- else
+- {
+- domain->n_sysdep_strings = 0;
+- domain->orig_sysdep_tab = NULL;
+- domain->trans_sysdep_tab = NULL;
+- }
+-
+- freea (sysdep_segment_values);
+- }
+- else
+- {
+- domain->n_sysdep_strings = 0;
+- domain->orig_sysdep_tab = NULL;
+- domain->trans_sysdep_tab = NULL;
+- }
+- }
+- break;
+- }
+- break;
+- default:
+- /* This is an invalid revision. */
+- invalid:
+- /* This is an invalid .mo file. */
+- if (domain->malloced)
+- free (domain->malloced);
+-#ifdef HAVE_MMAP
+- if (use_mmap)
+- munmap ((caddr_t) data, size);
+- else
+-#endif
+- free (data);
+- free (domain);
+- domain_file->data = NULL;
+- goto out;
+- }
+-
+- /* No caches of converted translations so far. */
+- domain->conversions = NULL;
+- domain->nconversions = 0;
+- gl_rwlock_init (domain->conversions_lock);
+-
+- /* Get the header entry and look for a plural specification. */
+-#ifdef IN_LIBGLOCALE
+- nullentry =
+- _nl_find_msg (domain_file, domainbinding, NULL, "", &nullentrylen);
+-#else
+- nullentry = _nl_find_msg (domain_file, domainbinding, "", 0, &nullentrylen);
+-#endif
+- EXTRACT_PLURAL_EXPRESSION (nullentry, &domain->plural, &domain->nplurals);
+-
+- out:
+- if (fd != -1)
+- close (fd);
+-
+- domain_file->decided = 1;
+-
+- done:
+- __libc_lock_unlock_recursive (lock);
+-}
+-
+-
+-#ifdef _LIBC
+-void
+-internal_function __libc_freeres_fn_section
+-_nl_unload_domain (struct loaded_domain *domain)
+-{
+- size_t i;
+-
+- if (domain->plural != &__gettext_germanic_plural)
+- __gettext_free_exp ((struct expression *) domain->plural);
+-
+- for (i = 0; i < domain->nconversions; i++)
+- {
+- struct converted_domain *convd = &domain->conversions[i];
+-
+- free (convd->encoding);
+- if (convd->conv_tab != NULL && convd->conv_tab != (char **) -1)
+- free (convd->conv_tab);
+- if (convd->conv != (__gconv_t) -1)
+- __gconv_close (convd->conv);
+- }
+- if (domain->conversions != NULL)
+- free (domain->conversions);
+- __libc_rwlock_fini (domain->conversions_lock);
+-
+- if (domain->malloced)
+- free (domain->malloced);
+-
+-# ifdef _POSIX_MAPPED_FILES
+- if (domain->use_mmap)
+- munmap ((caddr_t) domain->data, domain->mmap_size);
+- else
+-# endif /* _POSIX_MAPPED_FILES */
+- free ((void *) domain->data);
+-
+- free (domain);
+-}
+-#endif
+--- a/intl/localcharset.c
++++ /dev/null
+@@ -1,461 +0,0 @@
+-/* 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 <bruno@clisp.org>. */
+-
+-#include <config.h>
+-
+-/* Specification. */
+-#include "localcharset.h"
+-
+-#include <stddef.h>
+-#include <stdio.h>
+-#include <string.h>
+-#include <stdlib.h>
+-
+-#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 <langinfo.h>
+-# else
+-# if 0 /* see comment below */
+-# include <locale.h>
+-# endif
+-# endif
+-# ifdef __CYGWIN__
+-# define WIN32_LEAN_AND_MEAN
+-# include <windows.h>
+-# endif
+-#elif defined WIN32_NATIVE
+-# define WIN32_LEAN_AND_MEAN
+-# include <windows.h>
+-#endif
+-#if defined OS2
+-# define INCL_DOS
+-# include <os2.h>
+-#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. */
+-static const char *
+-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. */
+-
+-#ifdef STATIC
+-STATIC
+-#endif
+-const char *
+-locale_charset (void)
+-{
+- const char *codeset;
+- const char *aliases;
+-
+-#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
+-
+- if (codeset == NULL)
+- /* The canonical name cannot be determined. */
+- codeset = "";
+-
+- /* Resolve alias. */
+- for (aliases = 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;
+-}
+--- a/intl/localcharset.h
++++ /dev/null
+@@ -1,42 +0,0 @@
+-/* 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 * locale_charset (void);
+-
+-
+-#ifdef __cplusplus
+-}
+-#endif
+-
+-
+-#endif /* _LOCALCHARSET_H */
+--- a/intl/locale.alias
++++ /dev/null
+@@ -1,77 +0,0 @@
+-# Locale name alias data base.
+-# Copyright (C) 1996-2001,2003,2007 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 format of this file is the same as for the corresponding file of
+-# the X Window System, which normally can be found in
+-# /usr/lib/X11/locale/locale.alias
+-# A single line contains two fields: an alias and a substitution value.
+-# All entries are case independent.
+-
+-# Note: This file is obsolete and is kept around for the time being for
+-# backward compatibility. Nobody should rely on the names defined here.
+-# Locales should always be specified by their full name.
+-
+-# Packages using this file:
+-
+-bokmal nb_NO.ISO-8859-1
+-bokmål nb_NO.ISO-8859-1
+-catalan ca_ES.ISO-8859-1
+-croatian hr_HR.ISO-8859-2
+-czech cs_CZ.ISO-8859-2
+-danish da_DK.ISO-8859-1
+-dansk da_DK.ISO-8859-1
+-deutsch de_DE.ISO-8859-1
+-dutch nl_NL.ISO-8859-1
+-eesti et_EE.ISO-8859-1
+-estonian et_EE.ISO-8859-1
+-finnish fi_FI.ISO-8859-1
+-français fr_FR.ISO-8859-1
+-french fr_FR.ISO-8859-1
+-galego gl_ES.ISO-8859-1
+-galician gl_ES.ISO-8859-1
+-german de_DE.ISO-8859-1
+-greek el_GR.ISO-8859-7
+-hebrew he_IL.ISO-8859-8
+-hrvatski hr_HR.ISO-8859-2
+-hungarian hu_HU.ISO-8859-2
+-icelandic is_IS.ISO-8859-1
+-italian it_IT.ISO-8859-1
+-japanese ja_JP.eucJP
+-japanese.euc ja_JP.eucJP
+-ja_JP ja_JP.eucJP
+-ja_JP.ujis ja_JP.eucJP
+-japanese.sjis ja_JP.SJIS
+-korean ko_KR.eucKR
+-korean.euc ko_KR.eucKR
+-ko_KR ko_KR.eucKR
+-lithuanian lt_LT.ISO-8859-13
+-no_NO nb_NO.ISO-8859-1
+-no_NO.ISO-8859-1 nb_NO.ISO-8859-1
+-norwegian nb_NO.ISO-8859-1
+-nynorsk nn_NO.ISO-8859-1
+-polish pl_PL.ISO-8859-2
+-portuguese pt_PT.ISO-8859-1
+-romanian ro_RO.ISO-8859-2
+-russian ru_RU.ISO-8859-5
+-slovak sk_SK.ISO-8859-2
+-slovene sl_SI.ISO-8859-2
+-slovenian sl_SI.ISO-8859-2
+-spanish es_ES.ISO-8859-1
+-swedish sv_SE.ISO-8859-1
+-thai th_TH.TIS-620
+-turkish tr_TR.ISO-8859-9
+--- a/intl/localealias.c
++++ /dev/null
+@@ -1,439 +0,0 @@
+-/* Handle aliases for locale names.
+- Copyright (C) 1995-1999, 2000-2001, 2003, 2005-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. */
+-
+-/* Tell glibc's <string.h> to provide a prototype for mempcpy().
+- This must come before <config.h> because <config.h> may include
+- <features.h>, and once <features.h> has been included, it's too late. */
+-#ifndef _GNU_SOURCE
+-# define _GNU_SOURCE 1
+-#endif
+-
+-#ifdef HAVE_CONFIG_H
+-# include <config.h>
+-#endif
+-
+-#include <ctype.h>
+-#include <stdio.h>
+-#if defined _LIBC || defined HAVE___FSETLOCKING
+-# include <stdio_ext.h>
+-#endif
+-#include <sys/types.h>
+-
+-#ifdef __GNUC__
+-# undef alloca
+-# define alloca __builtin_alloca
+-# define HAVE_ALLOCA 1
+-#else
+-# ifdef _MSC_VER
+-# include <malloc.h>
+-# define alloca _alloca
+-# else
+-# if defined HAVE_ALLOCA_H || defined _LIBC
+-# include <alloca.h>
+-# else
+-# ifdef _AIX
+- #pragma alloca
+-# else
+-# ifndef alloca
+-char *alloca ();
+-# endif
+-# endif
+-# endif
+-# endif
+-#endif
+-
+-#include <stdlib.h>
+-#include <string.h>
+-
+-#include "gettextP.h"
+-
+-#if ENABLE_RELOCATABLE
+-# include "relocatable.h"
+-#else
+-# define relocate(pathname) (pathname)
+-#endif
+-
+-/* @@ end of prolog @@ */
+-
+-#ifdef _LIBC
+-/* Rename the non ANSI C functions. This is required by the standard
+- because some ANSI C functions will require linking with this object
+- file and the name space must not be polluted. */
+-# define strcasecmp __strcasecmp
+-
+-# ifndef mempcpy
+-# define mempcpy __mempcpy
+-# endif
+-# define HAVE_MEMPCPY 1
+-# define HAVE___FSETLOCKING 1
+-#endif
+-
+-/* Handle multi-threaded applications. */
+-#ifdef _LIBC
+-# include <bits/libc-lock.h>
+-#else
+-# include "lock.h"
+-#endif
+-
+-#ifndef internal_function
+-# define internal_function
+-#endif
+-
+-/* Some optimizations for glibc. */
+-#ifdef _LIBC
+-# define FEOF(fp) feof_unlocked (fp)
+-# define FGETS(buf, n, fp) fgets_unlocked (buf, n, fp)
+-#else
+-# define FEOF(fp) feof (fp)
+-# define FGETS(buf, n, fp) fgets (buf, n, fp)
+-#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
+-
+-#if defined _LIBC_REENTRANT || HAVE_DECL_FGETS_UNLOCKED
+-# undef fgets
+-# define fgets(buf, len, s) fgets_unlocked (buf, len, s)
+-#endif
+-#if defined _LIBC_REENTRANT || HAVE_DECL_FEOF_UNLOCKED
+-# undef feof
+-# define feof(s) feof_unlocked (s)
+-#endif
+-
+-
+-__libc_lock_define_initialized (static, lock)
+-
+-
+-struct alias_map
+-{
+- const char *alias;
+- const char *value;
+-};
+-
+-
+-#ifndef _LIBC
+-# define libc_freeres_ptr(decl) decl
+-#endif
+-
+-libc_freeres_ptr (static char *string_space);
+-static size_t string_space_act;
+-static size_t string_space_max;
+-libc_freeres_ptr (static struct alias_map *map);
+-static size_t nmap;
+-static size_t maxmap;
+-
+-
+-/* Prototypes for local functions. */
+-static size_t read_alias_file (const char *fname, int fname_len)
+- internal_function;
+-static int extend_alias_table (void);
+-static int alias_compare (const struct alias_map *map1,
+- const struct alias_map *map2);
+-
+-
+-const char *
+-_nl_expand_alias (const char *name)
+-{
+- static const char *locale_alias_path;
+- struct alias_map *retval;
+- const char *result = NULL;
+- size_t added;
+-
+- __libc_lock_lock (lock);
+-
+- if (locale_alias_path == NULL)
+- locale_alias_path = LOCALE_ALIAS_PATH;
+-
+- do
+- {
+- struct alias_map item;
+-
+- item.alias = name;
+-
+- if (nmap > 0)
+- retval = (struct alias_map *) bsearch (&item, map, nmap,
+- sizeof (struct alias_map),
+- (int (*) (const void *,
+- const void *)
+- ) alias_compare);
+- else
+- retval = NULL;
+-
+- /* We really found an alias. Return the value. */
+- if (retval != NULL)
+- {
+- result = retval->value;
+- break;
+- }
+-
+- /* Perhaps we can find another alias file. */
+- added = 0;
+- while (added == 0 && locale_alias_path[0] != '\0')
+- {
+- const char *start;
+-
+- while (locale_alias_path[0] == PATH_SEPARATOR)
+- ++locale_alias_path;
+- start = locale_alias_path;
+-
+- while (locale_alias_path[0] != '\0'
+- && locale_alias_path[0] != PATH_SEPARATOR)
+- ++locale_alias_path;
+-
+- if (start < locale_alias_path)
+- added = read_alias_file (start, locale_alias_path - start);
+- }
+- }
+- while (added != 0);
+-
+- __libc_lock_unlock (lock);
+-
+- return result;
+-}
+-
+-
+-static size_t
+-internal_function
+-read_alias_file (const char *fname, int fname_len)
+-{
+- FILE *fp;
+- char *full_fname;
+- size_t added;
+- static const char aliasfile[] = "/locale.alias";
+-
+- full_fname = (char *) alloca (fname_len + sizeof aliasfile);
+-#ifdef HAVE_MEMPCPY
+- mempcpy (mempcpy (full_fname, fname, fname_len),
+- aliasfile, sizeof aliasfile);
+-#else
+- memcpy (full_fname, fname, fname_len);
+- memcpy (&full_fname[fname_len], aliasfile, sizeof aliasfile);
+-#endif
+-
+-#ifdef _LIBC
+- /* Note the file is opened with cancellation in the I/O functions
+- disabled. */
+- fp = fopen (relocate (full_fname), "rc");
+-#else
+- fp = fopen (relocate (full_fname), "r");
+-#endif
+- freea (full_fname);
+- if (fp == NULL)
+- return 0;
+-
+-#ifdef HAVE___FSETLOCKING
+- /* No threads present. */
+- __fsetlocking (fp, FSETLOCKING_BYCALLER);
+-#endif
+-
+- added = 0;
+- while (!FEOF (fp))
+- {
+- /* It is a reasonable approach to use a fix buffer here because
+- a) we are only interested in the first two fields
+- b) these fields must be usable as file names and so must not
+- be that long
+- We avoid a multi-kilobyte buffer here since this would use up
+- stack space which we might not have if the program ran out of
+- memory. */
+- char buf[400];
+- char *alias;
+- char *value;
+- char *cp;
+- int complete_line;
+-
+- if (FGETS (buf, sizeof buf, fp) == NULL)
+- /* EOF reached. */
+- break;
+-
+- /* Determine whether the line is complete. */
+- complete_line = strchr (buf, '\n') != NULL;
+-
+- cp = buf;
+- /* Ignore leading white space. */
+- while (isspace ((unsigned char) cp[0]))
+- ++cp;
+-
+- /* A leading '#' signals a comment line. */
+- if (cp[0] != '\0' && cp[0] != '#')
+- {
+- alias = cp++;
+- while (cp[0] != '\0' && !isspace ((unsigned char) cp[0]))
+- ++cp;
+- /* Terminate alias name. */
+- if (cp[0] != '\0')
+- *cp++ = '\0';
+-
+- /* Now look for the beginning of the value. */
+- while (isspace ((unsigned char) cp[0]))
+- ++cp;
+-
+- if (cp[0] != '\0')
+- {
+- value = cp++;
+- while (cp[0] != '\0' && !isspace ((unsigned char) cp[0]))
+- ++cp;
+- /* Terminate value. */
+- if (cp[0] == '\n')
+- {
+- /* This has to be done to make the following test
+- for the end of line possible. We are looking for
+- the terminating '\n' which do not overwrite here. */
+- *cp++ = '\0';
+- *cp = '\n';
+- }
+- else if (cp[0] != '\0')
+- *cp++ = '\0';
+-
+-#ifdef IN_LIBGLOCALE
+- /* glibc's locale.alias contains entries for ja_JP and ko_KR
+- that make it impossible to use a Japanese or Korean UTF-8
+- locale under the name "ja_JP" or "ko_KR". Ignore these
+- entries. */
+- if (strchr (alias, '_') == NULL)
+-#endif
+- {
+- size_t alias_len;
+- size_t value_len;
+-
+- if (nmap >= maxmap)
+- if (__builtin_expect (extend_alias_table (), 0))
+- goto out;
+-
+- alias_len = strlen (alias) + 1;
+- value_len = strlen (value) + 1;
+-
+- if (string_space_act + alias_len + value_len > string_space_max)
+- {
+- /* Increase size of memory pool. */
+- size_t new_size = (string_space_max
+- + (alias_len + value_len > 1024
+- ? alias_len + value_len : 1024));
+- char *new_pool = (char *) realloc (string_space, new_size);
+- if (new_pool == NULL)
+- goto out;
+-
+- if (__builtin_expect (string_space != new_pool, 0))
+- {
+- size_t i;
+-
+- for (i = 0; i < nmap; i++)
+- {
+- map[i].alias += new_pool - string_space;
+- map[i].value += new_pool - string_space;
+- }
+- }
+-
+- string_space = new_pool;
+- string_space_max = new_size;
+- }
+-
+- map[nmap].alias =
+- (const char *) memcpy (&string_space[string_space_act],
+- alias, alias_len);
+- string_space_act += alias_len;
+-
+- map[nmap].value =
+- (const char *) memcpy (&string_space[string_space_act],
+- value, value_len);
+- string_space_act += value_len;
+-
+- ++nmap;
+- ++added;
+- }
+- }
+- }
+-
+- /* Possibly not the whole line fits into the buffer. Ignore
+- the rest of the line. */
+- if (! complete_line)
+- do
+- if (FGETS (buf, sizeof buf, fp) == NULL)
+- /* Make sure the inner loop will be left. The outer loop
+- will exit at the `feof' test. */
+- break;
+- while (strchr (buf, '\n') == NULL);
+- }
+-
+- out:
+- /* Should we test for ferror()? I think we have to silently ignore
+- errors. --drepper */
+- fclose (fp);
+-
+- if (added > 0)
+- qsort (map, nmap, sizeof (struct alias_map),
+- (int (*) (const void *, const void *)) alias_compare);
+-
+- return added;
+-}
+-
+-
+-static int
+-extend_alias_table ()
+-{
+- size_t new_size;
+- struct alias_map *new_map;
+-
+- new_size = maxmap == 0 ? 100 : 2 * maxmap;
+- new_map = (struct alias_map *) realloc (map, (new_size
+- * sizeof (struct alias_map)));
+- if (new_map == NULL)
+- /* Simply don't extend: we don't have any more core. */
+- return -1;
+-
+- map = new_map;
+- maxmap = new_size;
+- return 0;
+-}
+-
+-
+-static int
+-alias_compare (const struct alias_map *map1, const struct alias_map *map2)
+-{
+-#if defined _LIBC || defined HAVE_STRCASECMP
+- return strcasecmp (map1->alias, map2->alias);
+-#else
+- const unsigned char *p1 = (const unsigned char *) map1->alias;
+- const unsigned char *p2 = (const unsigned char *) map2->alias;
+- unsigned char c1, c2;
+-
+- if (p1 == p2)
+- return 0;
+-
+- do
+- {
+- /* I know this seems to be odd but the tolower() function in
+- some systems libc cannot handle nonalpha characters. */
+- c1 = isupper (*p1) ? tolower (*p1) : *p1;
+- c2 = isupper (*p2) ? tolower (*p2) : *p2;
+- if (c1 == '\0')
+- break;
+- ++p1;
+- ++p2;
+- }
+- while (c1 == c2);
+-
+- return c1 - c2;
+-#endif
+-}
+--- a/intl/localename.c
++++ /dev/null
+@@ -1,1507 +0,0 @@
+-/* Determine name of the currently selected locale.
+- Copyright (C) 1995-1999, 2000-2007 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 Ulrich Drepper <drepper@gnu.org>, 1995. */
+-/* Win32 code written by Tor Lillqvist <tml@iki.fi>. */
+-/* MacOS X code written by Bruno Haible <bruno@clisp.org>. */
+-
+-#include <config.h>
+-
+-/* Specification. */
+-#ifdef IN_LIBINTL
+-# include "gettextP.h"
+-#else
+-# include "localename.h"
+-#endif
+-
+-#include <stdlib.h>
+-#include <locale.h>
+-
+-#if HAVE_CFLOCALECOPYCURRENT || HAVE_CFPREFERENCESCOPYAPPVALUE
+-# include <string.h>
+-# include <CoreFoundation/CFString.h>
+-# if HAVE_CFLOCALECOPYCURRENT
+-# include <CoreFoundation/CFLocale.h>
+-# elif HAVE_CFPREFERENCESCOPYAPPVALUE
+-# include <CoreFoundation/CFPreferences.h>
+-# endif
+-#endif
+-
+-#if defined _WIN32 || defined __WIN32__
+-# define WIN32_NATIVE
+-#endif
+-
+-#ifdef WIN32_NATIVE
+-# define WIN32_LEAN_AND_MEAN
+-# include <windows.h>
+-/* List of language codes, sorted by value:
+- 0x01 LANG_ARABIC
+- 0x02 LANG_BULGARIAN
+- 0x03 LANG_CATALAN
+- 0x04 LANG_CHINESE
+- 0x05 LANG_CZECH
+- 0x06 LANG_DANISH
+- 0x07 LANG_GERMAN
+- 0x08 LANG_GREEK
+- 0x09 LANG_ENGLISH
+- 0x0a LANG_SPANISH
+- 0x0b LANG_FINNISH
+- 0x0c LANG_FRENCH
+- 0x0d LANG_HEBREW
+- 0x0e LANG_HUNGARIAN
+- 0x0f LANG_ICELANDIC
+- 0x10 LANG_ITALIAN
+- 0x11 LANG_JAPANESE
+- 0x12 LANG_KOREAN
+- 0x13 LANG_DUTCH
+- 0x14 LANG_NORWEGIAN
+- 0x15 LANG_POLISH
+- 0x16 LANG_PORTUGUESE
+- 0x17 LANG_RHAETO_ROMANCE
+- 0x18 LANG_ROMANIAN
+- 0x19 LANG_RUSSIAN
+- 0x1a LANG_CROATIAN == LANG_SERBIAN
+- 0x1b LANG_SLOVAK
+- 0x1c LANG_ALBANIAN
+- 0x1d LANG_SWEDISH
+- 0x1e LANG_THAI
+- 0x1f LANG_TURKISH
+- 0x20 LANG_URDU
+- 0x21 LANG_INDONESIAN
+- 0x22 LANG_UKRAINIAN
+- 0x23 LANG_BELARUSIAN
+- 0x24 LANG_SLOVENIAN
+- 0x25 LANG_ESTONIAN
+- 0x26 LANG_LATVIAN
+- 0x27 LANG_LITHUANIAN
+- 0x28 LANG_TAJIK
+- 0x29 LANG_FARSI
+- 0x2a LANG_VIETNAMESE
+- 0x2b LANG_ARMENIAN
+- 0x2c LANG_AZERI
+- 0x2d LANG_BASQUE
+- 0x2e LANG_SORBIAN
+- 0x2f LANG_MACEDONIAN
+- 0x30 LANG_SUTU
+- 0x31 LANG_TSONGA
+- 0x32 LANG_TSWANA
+- 0x33 LANG_VENDA
+- 0x34 LANG_XHOSA
+- 0x35 LANG_ZULU
+- 0x36 LANG_AFRIKAANS
+- 0x37 LANG_GEORGIAN
+- 0x38 LANG_FAEROESE
+- 0x39 LANG_HINDI
+- 0x3a LANG_MALTESE
+- 0x3b LANG_SAAMI
+- 0x3c LANG_GAELIC
+- 0x3d LANG_YIDDISH
+- 0x3e LANG_MALAY
+- 0x3f LANG_KAZAK
+- 0x40 LANG_KYRGYZ
+- 0x41 LANG_SWAHILI
+- 0x42 LANG_TURKMEN
+- 0x43 LANG_UZBEK
+- 0x44 LANG_TATAR
+- 0x45 LANG_BENGALI
+- 0x46 LANG_PUNJABI
+- 0x47 LANG_GUJARATI
+- 0x48 LANG_ORIYA
+- 0x49 LANG_TAMIL
+- 0x4a LANG_TELUGU
+- 0x4b LANG_KANNADA
+- 0x4c LANG_MALAYALAM
+- 0x4d LANG_ASSAMESE
+- 0x4e LANG_MARATHI
+- 0x4f LANG_SANSKRIT
+- 0x50 LANG_MONGOLIAN
+- 0x51 LANG_TIBETAN
+- 0x52 LANG_WELSH
+- 0x53 LANG_CAMBODIAN
+- 0x54 LANG_LAO
+- 0x55 LANG_BURMESE
+- 0x56 LANG_GALICIAN
+- 0x57 LANG_KONKANI
+- 0x58 LANG_MANIPURI
+- 0x59 LANG_SINDHI
+- 0x5a LANG_SYRIAC
+- 0x5b LANG_SINHALESE
+- 0x5c LANG_CHEROKEE
+- 0x5d LANG_INUKTITUT
+- 0x5e LANG_AMHARIC
+- 0x5f LANG_TAMAZIGHT
+- 0x60 LANG_KASHMIRI
+- 0x61 LANG_NEPALI
+- 0x62 LANG_FRISIAN
+- 0x63 LANG_PASHTO
+- 0x64 LANG_TAGALOG
+- 0x65 LANG_DIVEHI
+- 0x66 LANG_EDO
+- 0x67 LANG_FULFULDE
+- 0x68 LANG_HAUSA
+- 0x69 LANG_IBIBIO
+- 0x6a LANG_YORUBA
+- 0x70 LANG_IGBO
+- 0x71 LANG_KANURI
+- 0x72 LANG_OROMO
+- 0x73 LANG_TIGRINYA
+- 0x74 LANG_GUARANI
+- 0x75 LANG_HAWAIIAN
+- 0x76 LANG_LATIN
+- 0x77 LANG_SOMALI
+- 0x78 LANG_YI
+- 0x79 LANG_PAPIAMENTU
+-*/
+-/* Mingw headers don't have latest language and sublanguage codes. */
+-# ifndef LANG_AFRIKAANS
+-# define LANG_AFRIKAANS 0x36
+-# endif
+-# ifndef LANG_ALBANIAN
+-# define LANG_ALBANIAN 0x1c
+-# endif
+-# ifndef LANG_AMHARIC
+-# define LANG_AMHARIC 0x5e
+-# endif
+-# ifndef LANG_ARABIC
+-# define LANG_ARABIC 0x01
+-# endif
+-# ifndef LANG_ARMENIAN
+-# define LANG_ARMENIAN 0x2b
+-# endif
+-# ifndef LANG_ASSAMESE
+-# define LANG_ASSAMESE 0x4d
+-# endif
+-# ifndef LANG_AZERI
+-# define LANG_AZERI 0x2c
+-# endif
+-# ifndef LANG_BASQUE
+-# define LANG_BASQUE 0x2d
+-# endif
+-# ifndef LANG_BELARUSIAN
+-# define LANG_BELARUSIAN 0x23
+-# endif
+-# ifndef LANG_BENGALI
+-# define LANG_BENGALI 0x45
+-# endif
+-# ifndef LANG_BURMESE
+-# define LANG_BURMESE 0x55
+-# endif
+-# ifndef LANG_CAMBODIAN
+-# define LANG_CAMBODIAN 0x53
+-# endif
+-# ifndef LANG_CATALAN
+-# define LANG_CATALAN 0x03
+-# endif
+-# ifndef LANG_CHEROKEE
+-# define LANG_CHEROKEE 0x5c
+-# endif
+-# ifndef LANG_DIVEHI
+-# define LANG_DIVEHI 0x65
+-# endif
+-# ifndef LANG_EDO
+-# define LANG_EDO 0x66
+-# endif
+-# ifndef LANG_ESTONIAN
+-# define LANG_ESTONIAN 0x25
+-# endif
+-# ifndef LANG_FAEROESE
+-# define LANG_FAEROESE 0x38
+-# endif
+-# ifndef LANG_FARSI
+-# define LANG_FARSI 0x29
+-# endif
+-# ifndef LANG_FRISIAN
+-# define LANG_FRISIAN 0x62
+-# endif
+-# ifndef LANG_FULFULDE
+-# define LANG_FULFULDE 0x67
+-# endif
+-# ifndef LANG_GAELIC
+-# define LANG_GAELIC 0x3c
+-# endif
+-# ifndef LANG_GALICIAN
+-# define LANG_GALICIAN 0x56
+-# endif
+-# ifndef LANG_GEORGIAN
+-# define LANG_GEORGIAN 0x37
+-# endif
+-# ifndef LANG_GUARANI
+-# define LANG_GUARANI 0x74
+-# endif
+-# ifndef LANG_GUJARATI
+-# define LANG_GUJARATI 0x47
+-# endif
+-# ifndef LANG_HAUSA
+-# define LANG_HAUSA 0x68
+-# endif
+-# ifndef LANG_HAWAIIAN
+-# define LANG_HAWAIIAN 0x75
+-# endif
+-# ifndef LANG_HEBREW
+-# define LANG_HEBREW 0x0d
+-# endif
+-# ifndef LANG_HINDI
+-# define LANG_HINDI 0x39
+-# endif
+-# ifndef LANG_IBIBIO
+-# define LANG_IBIBIO 0x69
+-# endif
+-# ifndef LANG_IGBO
+-# define LANG_IGBO 0x70
+-# endif
+-# ifndef LANG_INDONESIAN
+-# define LANG_INDONESIAN 0x21
+-# endif
+-# ifndef LANG_INUKTITUT
+-# define LANG_INUKTITUT 0x5d
+-# endif
+-# ifndef LANG_KANNADA
+-# define LANG_KANNADA 0x4b
+-# endif
+-# ifndef LANG_KANURI
+-# define LANG_KANURI 0x71
+-# endif
+-# ifndef LANG_KASHMIRI
+-# define LANG_KASHMIRI 0x60
+-# endif
+-# ifndef LANG_KAZAK
+-# define LANG_KAZAK 0x3f
+-# endif
+-# ifndef LANG_KONKANI
+-# define LANG_KONKANI 0x57
+-# endif
+-# ifndef LANG_KYRGYZ
+-# define LANG_KYRGYZ 0x40
+-# endif
+-# ifndef LANG_LAO
+-# define LANG_LAO 0x54
+-# endif
+-# ifndef LANG_LATIN
+-# define LANG_LATIN 0x76
+-# endif
+-# ifndef LANG_LATVIAN
+-# define LANG_LATVIAN 0x26
+-# endif
+-# ifndef LANG_LITHUANIAN
+-# define LANG_LITHUANIAN 0x27
+-# endif
+-# ifndef LANG_MACEDONIAN
+-# define LANG_MACEDONIAN 0x2f
+-# endif
+-# ifndef LANG_MALAY
+-# define LANG_MALAY 0x3e
+-# endif
+-# ifndef LANG_MALAYALAM
+-# define LANG_MALAYALAM 0x4c
+-# endif
+-# ifndef LANG_MALTESE
+-# define LANG_MALTESE 0x3a
+-# endif
+-# ifndef LANG_MANIPURI
+-# define LANG_MANIPURI 0x58
+-# endif
+-# ifndef LANG_MARATHI
+-# define LANG_MARATHI 0x4e
+-# endif
+-# ifndef LANG_MONGOLIAN
+-# define LANG_MONGOLIAN 0x50
+-# endif
+-# ifndef LANG_NEPALI
+-# define LANG_NEPALI 0x61
+-# endif
+-# ifndef LANG_ORIYA
+-# define LANG_ORIYA 0x48
+-# endif
+-# ifndef LANG_OROMO
+-# define LANG_OROMO 0x72
+-# endif
+-# ifndef LANG_PAPIAMENTU
+-# define LANG_PAPIAMENTU 0x79
+-# endif
+-# ifndef LANG_PASHTO
+-# define LANG_PASHTO 0x63
+-# endif
+-# ifndef LANG_PUNJABI
+-# define LANG_PUNJABI 0x46
+-# endif
+-# ifndef LANG_RHAETO_ROMANCE
+-# define LANG_RHAETO_ROMANCE 0x17
+-# endif
+-# ifndef LANG_SAAMI
+-# define LANG_SAAMI 0x3b
+-# endif
+-# ifndef LANG_SANSKRIT
+-# define LANG_SANSKRIT 0x4f
+-# endif
+-# ifndef LANG_SERBIAN
+-# define LANG_SERBIAN 0x1a
+-# endif
+-# ifndef LANG_SINDHI
+-# define LANG_SINDHI 0x59
+-# endif
+-# ifndef LANG_SINHALESE
+-# define LANG_SINHALESE 0x5b
+-# endif
+-# ifndef LANG_SLOVAK
+-# define LANG_SLOVAK 0x1b
+-# endif
+-# ifndef LANG_SOMALI
+-# define LANG_SOMALI 0x77
+-# endif
+-# ifndef LANG_SORBIAN
+-# define LANG_SORBIAN 0x2e
+-# endif
+-# ifndef LANG_SUTU
+-# define LANG_SUTU 0x30
+-# endif
+-# ifndef LANG_SWAHILI
+-# define LANG_SWAHILI 0x41
+-# endif
+-# ifndef LANG_SYRIAC
+-# define LANG_SYRIAC 0x5a
+-# endif
+-# ifndef LANG_TAGALOG
+-# define LANG_TAGALOG 0x64
+-# endif
+-# ifndef LANG_TAJIK
+-# define LANG_TAJIK 0x28
+-# endif
+-# ifndef LANG_TAMAZIGHT
+-# define LANG_TAMAZIGHT 0x5f
+-# endif
+-# ifndef LANG_TAMIL
+-# define LANG_TAMIL 0x49
+-# endif
+-# ifndef LANG_TATAR
+-# define LANG_TATAR 0x44
+-# endif
+-# ifndef LANG_TELUGU
+-# define LANG_TELUGU 0x4a
+-# endif
+-# ifndef LANG_THAI
+-# define LANG_THAI 0x1e
+-# endif
+-# ifndef LANG_TIBETAN
+-# define LANG_TIBETAN 0x51
+-# endif
+-# ifndef LANG_TIGRINYA
+-# define LANG_TIGRINYA 0x73
+-# endif
+-# ifndef LANG_TSONGA
+-# define LANG_TSONGA 0x31
+-# endif
+-# ifndef LANG_TSWANA
+-# define LANG_TSWANA 0x32
+-# endif
+-# ifndef LANG_TURKMEN
+-# define LANG_TURKMEN 0x42
+-# endif
+-# ifndef LANG_UKRAINIAN
+-# define LANG_UKRAINIAN 0x22
+-# endif
+-# ifndef LANG_URDU
+-# define LANG_URDU 0x20
+-# endif
+-# ifndef LANG_UZBEK
+-# define LANG_UZBEK 0x43
+-# endif
+-# ifndef LANG_VENDA
+-# define LANG_VENDA 0x33
+-# endif
+-# ifndef LANG_VIETNAMESE
+-# define LANG_VIETNAMESE 0x2a
+-# endif
+-# ifndef LANG_WELSH
+-# define LANG_WELSH 0x52
+-# endif
+-# ifndef LANG_XHOSA
+-# define LANG_XHOSA 0x34
+-# endif
+-# ifndef LANG_YI
+-# define LANG_YI 0x78
+-# endif
+-# ifndef LANG_YIDDISH
+-# define LANG_YIDDISH 0x3d
+-# endif
+-# ifndef LANG_YORUBA
+-# define LANG_YORUBA 0x6a
+-# endif
+-# ifndef LANG_ZULU
+-# define LANG_ZULU 0x35
+-# endif
+-# ifndef SUBLANG_ARABIC_SAUDI_ARABIA
+-# define SUBLANG_ARABIC_SAUDI_ARABIA 0x01
+-# endif
+-# ifndef SUBLANG_ARABIC_IRAQ
+-# define SUBLANG_ARABIC_IRAQ 0x02
+-# endif
+-# ifndef SUBLANG_ARABIC_EGYPT
+-# define SUBLANG_ARABIC_EGYPT 0x03
+-# endif
+-# ifndef SUBLANG_ARABIC_LIBYA
+-# define SUBLANG_ARABIC_LIBYA 0x04
+-# endif
+-# ifndef SUBLANG_ARABIC_ALGERIA
+-# define SUBLANG_ARABIC_ALGERIA 0x05
+-# endif
+-# ifndef SUBLANG_ARABIC_MOROCCO
+-# define SUBLANG_ARABIC_MOROCCO 0x06
+-# endif
+-# ifndef SUBLANG_ARABIC_TUNISIA
+-# define SUBLANG_ARABIC_TUNISIA 0x07
+-# endif
+-# ifndef SUBLANG_ARABIC_OMAN
+-# define SUBLANG_ARABIC_OMAN 0x08
+-# endif
+-# ifndef SUBLANG_ARABIC_YEMEN
+-# define SUBLANG_ARABIC_YEMEN 0x09
+-# endif
+-# ifndef SUBLANG_ARABIC_SYRIA
+-# define SUBLANG_ARABIC_SYRIA 0x0a
+-# endif
+-# ifndef SUBLANG_ARABIC_JORDAN
+-# define SUBLANG_ARABIC_JORDAN 0x0b
+-# endif
+-# ifndef SUBLANG_ARABIC_LEBANON
+-# define SUBLANG_ARABIC_LEBANON 0x0c
+-# endif
+-# ifndef SUBLANG_ARABIC_KUWAIT
+-# define SUBLANG_ARABIC_KUWAIT 0x0d
+-# endif
+-# ifndef SUBLANG_ARABIC_UAE
+-# define SUBLANG_ARABIC_UAE 0x0e
+-# endif
+-# ifndef SUBLANG_ARABIC_BAHRAIN
+-# define SUBLANG_ARABIC_BAHRAIN 0x0f
+-# endif
+-# ifndef SUBLANG_ARABIC_QATAR
+-# define SUBLANG_ARABIC_QATAR 0x10
+-# endif
+-# ifndef SUBLANG_AZERI_LATIN
+-# define SUBLANG_AZERI_LATIN 0x01
+-# endif
+-# ifndef SUBLANG_AZERI_CYRILLIC
+-# define SUBLANG_AZERI_CYRILLIC 0x02
+-# endif
+-# ifndef SUBLANG_BENGALI_INDIA
+-# define SUBLANG_BENGALI_INDIA 0x01
+-# endif
+-# ifndef SUBLANG_BENGALI_BANGLADESH
+-# define SUBLANG_BENGALI_BANGLADESH 0x02
+-# endif
+-# ifndef SUBLANG_CHINESE_MACAU
+-# define SUBLANG_CHINESE_MACAU 0x05
+-# endif
+-# ifndef SUBLANG_ENGLISH_SOUTH_AFRICA
+-# define SUBLANG_ENGLISH_SOUTH_AFRICA 0x07
+-# endif
+-# ifndef SUBLANG_ENGLISH_JAMAICA
+-# define SUBLANG_ENGLISH_JAMAICA 0x08
+-# endif
+-# ifndef SUBLANG_ENGLISH_CARIBBEAN
+-# define SUBLANG_ENGLISH_CARIBBEAN 0x09
+-# endif
+-# ifndef SUBLANG_ENGLISH_BELIZE
+-# define SUBLANG_ENGLISH_BELIZE 0x0a
+-# endif
+-# ifndef SUBLANG_ENGLISH_TRINIDAD
+-# define SUBLANG_ENGLISH_TRINIDAD 0x0b
+-# endif
+-# ifndef SUBLANG_ENGLISH_ZIMBABWE
+-# define SUBLANG_ENGLISH_ZIMBABWE 0x0c
+-# endif
+-# ifndef SUBLANG_ENGLISH_PHILIPPINES
+-# define SUBLANG_ENGLISH_PHILIPPINES 0x0d
+-# endif
+-# ifndef SUBLANG_ENGLISH_INDONESIA
+-# define SUBLANG_ENGLISH_INDONESIA 0x0e
+-# endif
+-# ifndef SUBLANG_ENGLISH_HONGKONG
+-# define SUBLANG_ENGLISH_HONGKONG 0x0f
+-# endif
+-# ifndef SUBLANG_ENGLISH_INDIA
+-# define SUBLANG_ENGLISH_INDIA 0x10
+-# endif
+-# ifndef SUBLANG_ENGLISH_MALAYSIA
+-# define SUBLANG_ENGLISH_MALAYSIA 0x11
+-# endif
+-# ifndef SUBLANG_ENGLISH_SINGAPORE
+-# define SUBLANG_ENGLISH_SINGAPORE 0x12
+-# endif
+-# ifndef SUBLANG_FRENCH_LUXEMBOURG
+-# define SUBLANG_FRENCH_LUXEMBOURG 0x05
+-# endif
+-# ifndef SUBLANG_FRENCH_MONACO
+-# define SUBLANG_FRENCH_MONACO 0x06
+-# endif
+-# ifndef SUBLANG_FRENCH_WESTINDIES
+-# define SUBLANG_FRENCH_WESTINDIES 0x07
+-# endif
+-# ifndef SUBLANG_FRENCH_REUNION
+-# define SUBLANG_FRENCH_REUNION 0x08
+-# endif
+-# ifndef SUBLANG_FRENCH_CONGO
+-# define SUBLANG_FRENCH_CONGO 0x09
+-# endif
+-# ifndef SUBLANG_FRENCH_SENEGAL
+-# define SUBLANG_FRENCH_SENEGAL 0x0a
+-# endif
+-# ifndef SUBLANG_FRENCH_CAMEROON
+-# define SUBLANG_FRENCH_CAMEROON 0x0b
+-# endif
+-# ifndef SUBLANG_FRENCH_COTEDIVOIRE
+-# define SUBLANG_FRENCH_COTEDIVOIRE 0x0c
+-# endif
+-# ifndef SUBLANG_FRENCH_MALI
+-# define SUBLANG_FRENCH_MALI 0x0d
+-# endif
+-# ifndef SUBLANG_FRENCH_MOROCCO
+-# define SUBLANG_FRENCH_MOROCCO 0x0e
+-# endif
+-# ifndef SUBLANG_FRENCH_HAITI
+-# define SUBLANG_FRENCH_HAITI 0x0f
+-# endif
+-# ifndef SUBLANG_GERMAN_LUXEMBOURG
+-# define SUBLANG_GERMAN_LUXEMBOURG 0x04
+-# endif
+-# ifndef SUBLANG_GERMAN_LIECHTENSTEIN
+-# define SUBLANG_GERMAN_LIECHTENSTEIN 0x05
+-# endif
+-# ifndef SUBLANG_KASHMIRI_INDIA
+-# define SUBLANG_KASHMIRI_INDIA 0x02
+-# endif
+-# ifndef SUBLANG_MALAY_MALAYSIA
+-# define SUBLANG_MALAY_MALAYSIA 0x01
+-# endif
+-# ifndef SUBLANG_MALAY_BRUNEI_DARUSSALAM
+-# define SUBLANG_MALAY_BRUNEI_DARUSSALAM 0x02
+-# endif
+-# ifndef SUBLANG_NEPALI_INDIA
+-# define SUBLANG_NEPALI_INDIA 0x02
+-# endif
+-# ifndef SUBLANG_PUNJABI_INDIA
+-# define SUBLANG_PUNJABI_INDIA 0x01
+-# endif
+-# ifndef SUBLANG_PUNJABI_PAKISTAN
+-# define SUBLANG_PUNJABI_PAKISTAN 0x02
+-# endif
+-# ifndef SUBLANG_ROMANIAN_ROMANIA
+-# define SUBLANG_ROMANIAN_ROMANIA 0x01
+-# endif
+-# ifndef SUBLANG_ROMANIAN_MOLDOVA
+-# define SUBLANG_ROMANIAN_MOLDOVA 0x02
+-# endif
+-# ifndef SUBLANG_SERBIAN_LATIN
+-# define SUBLANG_SERBIAN_LATIN 0x02
+-# endif
+-# ifndef SUBLANG_SERBIAN_CYRILLIC
+-# define SUBLANG_SERBIAN_CYRILLIC 0x03
+-# endif
+-# ifndef SUBLANG_SINDHI_PAKISTAN
+-# define SUBLANG_SINDHI_PAKISTAN 0x01
+-# endif
+-# ifndef SUBLANG_SINDHI_AFGHANISTAN
+-# define SUBLANG_SINDHI_AFGHANISTAN 0x02
+-# endif
+-# ifndef SUBLANG_SPANISH_GUATEMALA
+-# define SUBLANG_SPANISH_GUATEMALA 0x04
+-# endif
+-# ifndef SUBLANG_SPANISH_COSTA_RICA
+-# define SUBLANG_SPANISH_COSTA_RICA 0x05
+-# endif
+-# ifndef SUBLANG_SPANISH_PANAMA
+-# define SUBLANG_SPANISH_PANAMA 0x06
+-# endif
+-# ifndef SUBLANG_SPANISH_DOMINICAN_REPUBLIC
+-# define SUBLANG_SPANISH_DOMINICAN_REPUBLIC 0x07
+-# endif
+-# ifndef SUBLANG_SPANISH_VENEZUELA
+-# define SUBLANG_SPANISH_VENEZUELA 0x08
+-# endif
+-# ifndef SUBLANG_SPANISH_COLOMBIA
+-# define SUBLANG_SPANISH_COLOMBIA 0x09
+-# endif
+-# ifndef SUBLANG_SPANISH_PERU
+-# define SUBLANG_SPANISH_PERU 0x0a
+-# endif
+-# ifndef SUBLANG_SPANISH_ARGENTINA
+-# define SUBLANG_SPANISH_ARGENTINA 0x0b
+-# endif
+-# ifndef SUBLANG_SPANISH_ECUADOR
+-# define SUBLANG_SPANISH_ECUADOR 0x0c
+-# endif
+-# ifndef SUBLANG_SPANISH_CHILE
+-# define SUBLANG_SPANISH_CHILE 0x0d
+-# endif
+-# ifndef SUBLANG_SPANISH_URUGUAY
+-# define SUBLANG_SPANISH_URUGUAY 0x0e
+-# endif
+-# ifndef SUBLANG_SPANISH_PARAGUAY
+-# define SUBLANG_SPANISH_PARAGUAY 0x0f
+-# endif
+-# ifndef SUBLANG_SPANISH_BOLIVIA
+-# define SUBLANG_SPANISH_BOLIVIA 0x10
+-# endif
+-# ifndef SUBLANG_SPANISH_EL_SALVADOR
+-# define SUBLANG_SPANISH_EL_SALVADOR 0x11
+-# endif
+-# ifndef SUBLANG_SPANISH_HONDURAS
+-# define SUBLANG_SPANISH_HONDURAS 0x12
+-# endif
+-# ifndef SUBLANG_SPANISH_NICARAGUA
+-# define SUBLANG_SPANISH_NICARAGUA 0x13
+-# endif
+-# ifndef SUBLANG_SPANISH_PUERTO_RICO
+-# define SUBLANG_SPANISH_PUERTO_RICO 0x14
+-# endif
+-# ifndef SUBLANG_SWEDISH_FINLAND
+-# define SUBLANG_SWEDISH_FINLAND 0x02
+-# endif
+-# ifndef SUBLANG_TAMAZIGHT_ARABIC
+-# define SUBLANG_TAMAZIGHT_ARABIC 0x01
+-# endif
+-# ifndef SUBLANG_TAMAZIGHT_ALGERIA_LATIN
+-# define SUBLANG_TAMAZIGHT_ALGERIA_LATIN 0x02
+-# endif
+-# ifndef SUBLANG_TIGRINYA_ETHIOPIA
+-# define SUBLANG_TIGRINYA_ETHIOPIA 0x01
+-# endif
+-# ifndef SUBLANG_TIGRINYA_ERITREA
+-# define SUBLANG_TIGRINYA_ERITREA 0x02
+-# endif
+-# ifndef SUBLANG_URDU_PAKISTAN
+-# define SUBLANG_URDU_PAKISTAN 0x01
+-# endif
+-# ifndef SUBLANG_URDU_INDIA
+-# define SUBLANG_URDU_INDIA 0x02
+-# endif
+-# ifndef SUBLANG_UZBEK_LATIN
+-# define SUBLANG_UZBEK_LATIN 0x01
+-# endif
+-# ifndef SUBLANG_UZBEK_CYRILLIC
+-# define SUBLANG_UZBEK_CYRILLIC 0x02
+-# endif
+-#endif
+-
+-# if HAVE_CFLOCALECOPYCURRENT || HAVE_CFPREFERENCESCOPYAPPVALUE
+-/* MacOS X 10.2 or newer */
+-
+-/* Canonicalize a MacOS X locale name to a Unix locale name.
+- NAME is a sufficiently large buffer.
+- On input, it contains the MacOS X locale name.
+- On output, it contains the Unix locale name. */
+-# if !defined IN_LIBINTL
+-static
+-# endif
+-void
+-gl_locale_name_canonicalize (char *name)
+-{
+- /* This conversion is based on a posting by
+- Deborah GoldSmith <goldsmit@apple.com> on 2005-03-08,
+- http://lists.apple.com/archives/carbon-dev/2005/Mar/msg00293.html */
+-
+- /* Convert legacy (NeXTstep inherited) English names to Unix (ISO 639 and
+- ISO 3166) names. Prior to MacOS X 10.3, there is no API for doing this.
+- Therefore we do it ourselves, using a table based on the results of the
+- MacOS X 10.3.8 function
+- CFLocaleCreateCanonicalLocaleIdentifierFromString(). */
+- typedef struct { const char legacy[21+1]; const char unixy[5+1]; }
+- legacy_entry;
+- static const legacy_entry legacy_table[] = {
+- { "Afrikaans", "af" },
+- { "Albanian", "sq" },
+- { "Amharic", "am" },
+- { "Arabic", "ar" },
+- { "Armenian", "hy" },
+- { "Assamese", "as" },
+- { "Aymara", "ay" },
+- { "Azerbaijani", "az" },
+- { "Basque", "eu" },
+- { "Belarusian", "be" },
+- { "Belorussian", "be" },
+- { "Bengali", "bn" },
+- { "Brazilian Portugese", "pt_BR" },
+- { "Brazilian Portuguese", "pt_BR" },
+- { "Breton", "br" },
+- { "Bulgarian", "bg" },
+- { "Burmese", "my" },
+- { "Byelorussian", "be" },
+- { "Catalan", "ca" },
+- { "Chewa", "ny" },
+- { "Chichewa", "ny" },
+- { "Chinese", "zh" },
+- { "Chinese, Simplified", "zh_CN" },
+- { "Chinese, Traditional", "zh_TW" },
+- { "Chinese, Tradtional", "zh_TW" },
+- { "Croatian", "hr" },
+- { "Czech", "cs" },
+- { "Danish", "da" },
+- { "Dutch", "nl" },
+- { "Dzongkha", "dz" },
+- { "English", "en" },
+- { "Esperanto", "eo" },
+- { "Estonian", "et" },
+- { "Faroese", "fo" },
+- { "Farsi", "fa" },
+- { "Finnish", "fi" },
+- { "Flemish", "nl_BE" },
+- { "French", "fr" },
+- { "Galician", "gl" },
+- { "Gallegan", "gl" },
+- { "Georgian", "ka" },
+- { "German", "de" },
+- { "Greek", "el" },
+- { "Greenlandic", "kl" },
+- { "Guarani", "gn" },
+- { "Gujarati", "gu" },
+- { "Hawaiian", "haw" }, /* Yes, "haw", not "cpe". */
+- { "Hebrew", "he" },
+- { "Hindi", "hi" },
+- { "Hungarian", "hu" },
+- { "Icelandic", "is" },
+- { "Indonesian", "id" },
+- { "Inuktitut", "iu" },
+- { "Irish", "ga" },
+- { "Italian", "it" },
+- { "Japanese", "ja" },
+- { "Javanese", "jv" },
+- { "Kalaallisut", "kl" },
+- { "Kannada", "kn" },
+- { "Kashmiri", "ks" },
+- { "Kazakh", "kk" },
+- { "Khmer", "km" },
+- { "Kinyarwanda", "rw" },
+- { "Kirghiz", "ky" },
+- { "Korean", "ko" },
+- { "Kurdish", "ku" },
+- { "Latin", "la" },
+- { "Latvian", "lv" },
+- { "Lithuanian", "lt" },
+- { "Macedonian", "mk" },
+- { "Malagasy", "mg" },
+- { "Malay", "ms" },
+- { "Malayalam", "ml" },
+- { "Maltese", "mt" },
+- { "Manx", "gv" },
+- { "Marathi", "mr" },
+- { "Moldavian", "mo" },
+- { "Mongolian", "mn" },
+- { "Nepali", "ne" },
+- { "Norwegian", "nb" }, /* Yes, "nb", not the obsolete "no". */
+- { "Nyanja", "ny" },
+- { "Nynorsk", "nn" },
+- { "Oriya", "or" },
+- { "Oromo", "om" },
+- { "Panjabi", "pa" },
+- { "Pashto", "ps" },
+- { "Persian", "fa" },
+- { "Polish", "pl" },
+- { "Portuguese", "pt" },
+- { "Portuguese, Brazilian", "pt_BR" },
+- { "Punjabi", "pa" },
+- { "Pushto", "ps" },
+- { "Quechua", "qu" },
+- { "Romanian", "ro" },
+- { "Ruanda", "rw" },
+- { "Rundi", "rn" },
+- { "Russian", "ru" },
+- { "Sami", "se_NO" }, /* Not just "se". */
+- { "Sanskrit", "sa" },
+- { "Scottish", "gd" },
+- { "Serbian", "sr" },
+- { "Simplified Chinese", "zh_CN" },
+- { "Sindhi", "sd" },
+- { "Sinhalese", "si" },
+- { "Slovak", "sk" },
+- { "Slovenian", "sl" },
+- { "Somali", "so" },
+- { "Spanish", "es" },
+- { "Sundanese", "su" },
+- { "Swahili", "sw" },
+- { "Swedish", "sv" },
+- { "Tagalog", "tl" },
+- { "Tajik", "tg" },
+- { "Tajiki", "tg" },
+- { "Tamil", "ta" },
+- { "Tatar", "tt" },
+- { "Telugu", "te" },
+- { "Thai", "th" },
+- { "Tibetan", "bo" },
+- { "Tigrinya", "ti" },
+- { "Tongan", "to" },
+- { "Traditional Chinese", "zh_TW" },
+- { "Turkish", "tr" },
+- { "Turkmen", "tk" },
+- { "Uighur", "ug" },
+- { "Ukrainian", "uk" },
+- { "Urdu", "ur" },
+- { "Uzbek", "uz" },
+- { "Vietnamese", "vi" },
+- { "Welsh", "cy" },
+- { "Yiddish", "yi" }
+- };
+-
+- /* Convert new-style locale names with language tags (ISO 639 and ISO 15924)
+- to Unix (ISO 639 and ISO 3166) names. */
+- typedef struct { const char langtag[7+1]; const char unixy[12+1]; }
+- langtag_entry;
+- static const langtag_entry langtag_table[] = {
+- /* MacOS X has "az-Arab", "az-Cyrl", "az-Latn".
+- The default script for az on Unix is Latin. */
+- { "az-Latn", "az" },
+- /* MacOS X has "ga-dots". Does not yet exist on Unix. */
+- { "ga-dots", "ga" },
+- /* MacOS X has "kk-Cyrl". Does not yet exist on Unix. */
+- /* MacOS X has "mn-Cyrl", "mn-Mong".
+- The default script for mn on Unix is Cyrillic. */
+- { "mn-Cyrl", "mn" },
+- /* MacOS X has "ms-Arab", "ms-Latn".
+- The default script for ms on Unix is Latin. */
+- { "ms-Latn", "ms" },
+- /* MacOS X has "tg-Cyrl".
+- The default script for tg on Unix is Cyrillic. */
+- { "tg-Cyrl", "tg" },
+- /* MacOS X has "tk-Cyrl". Does not yet exist on Unix. */
+- /* MacOS X has "tt-Cyrl".
+- The default script for tt on Unix is Cyrillic. */
+- { "tt-Cyrl", "tt" },
+- /* MacOS X has "zh-Hans", "zh-Hant".
+- Country codes are used to distinguish these on Unix. */
+- { "zh-Hans", "zh_CN" },
+- { "zh-Hant", "zh_TW" }
+- };
+-
+- /* Convert script names (ISO 15924) to Unix conventions.
+- See http://www.unicode.org/iso15924/iso15924-codes.html */
+- typedef struct { const char script[4+1]; const char unixy[9+1]; }
+- script_entry;
+- static const script_entry script_table[] = {
+- { "Arab", "arabic" },
+- { "Cyrl", "cyrillic" },
+- { "Mong", "mongolian" }
+- };
+-
+- /* Step 1: Convert using legacy_table. */
+- if (name[0] >= 'A' && name[0] <= 'Z')
+- {
+- unsigned int i1, i2;
+- i1 = 0;
+- i2 = sizeof (legacy_table) / sizeof (legacy_entry);
+- while (i2 - i1 > 1)
+- {
+- /* At this point we know that if name occurs in legacy_table,
+- its index must be >= i1 and < i2. */
+- unsigned int i = (i1 + i2) >> 1;
+- const legacy_entry *p = &legacy_table[i];
+- if (strcmp (name, p->legacy) < 0)
+- i2 = i;
+- else
+- i1 = i;
+- }
+- if (strcmp (name, legacy_table[i1].legacy) == 0)
+- {
+- strcpy (name, legacy_table[i1].unixy);
+- return;
+- }
+- }
+-
+- /* Step 2: Convert using langtag_table and script_table. */
+- if (strlen (name) == 7 && name[2] == '-')
+- {
+- unsigned int i1, i2;
+- i1 = 0;
+- i2 = sizeof (langtag_table) / sizeof (langtag_entry);
+- while (i2 - i1 > 1)
+- {
+- /* At this point we know that if name occurs in langtag_table,
+- its index must be >= i1 and < i2. */
+- unsigned int i = (i1 + i2) >> 1;
+- const langtag_entry *p = &langtag_table[i];
+- if (strcmp (name, p->langtag) < 0)
+- i2 = i;
+- else
+- i1 = i;
+- }
+- if (strcmp (name, langtag_table[i1].langtag) == 0)
+- {
+- strcpy (name, langtag_table[i1].unixy);
+- return;
+- }
+-
+- i1 = 0;
+- i2 = sizeof (script_table) / sizeof (script_entry);
+- while (i2 - i1 > 1)
+- {
+- /* At this point we know that if (name + 3) occurs in script_table,
+- its index must be >= i1 and < i2. */
+- unsigned int i = (i1 + i2) >> 1;
+- const script_entry *p = &script_table[i];
+- if (strcmp (name + 3, p->script) < 0)
+- i2 = i;
+- else
+- i1 = i;
+- }
+- if (strcmp (name + 3, script_table[i1].script) == 0)
+- {
+- name[2] = '@';
+- strcpy (name + 3, script_table[i1].unixy);
+- return;
+- }
+- }
+-
+- /* Step 3: Convert new-style dash to Unix underscore. */
+- {
+- char *p;
+- for (p = name; *p != '\0'; p++)
+- if (*p == '-')
+- *p = '_';
+- }
+-}
+-
+-#endif
+-
+-/* XPG3 defines the result of 'setlocale (category, NULL)' as:
+- "Directs 'setlocale()' to query 'category' and return the current
+- setting of 'local'."
+- However it does not specify the exact format. Neither do SUSV2 and
+- ISO C 99. So we can use this feature only on selected systems (e.g.
+- those using GNU C Library). */
+-#if defined _LIBC || (defined __GLIBC__ && __GLIBC__ >= 2)
+-# define HAVE_LOCALE_NULL
+-#endif
+-
+-/* Determine the current locale's name, and canonicalize it into XPG syntax
+- language[_territory][.codeset][@modifier]
+- The codeset part in the result is not reliable; the locale_charset()
+- should be used for codeset information instead.
+- The result must not be freed; it is statically allocated. */
+-
+-const char *
+-gl_locale_name_posix (int category, const char *categoryname)
+-{
+- /* Use the POSIX methods of looking to 'LC_ALL', 'LC_xxx', and 'LANG'.
+- On some systems this can be done by the 'setlocale' function itself. */
+-#if defined HAVE_SETLOCALE && defined HAVE_LC_MESSAGES && defined HAVE_LOCALE_NULL
+- return setlocale (category, NULL);
+-#else
+- const char *retval;
+-
+- /* Setting of LC_ALL overrides all other. */
+- retval = getenv ("LC_ALL");
+- if (retval != NULL && retval[0] != '\0')
+- return retval;
+- /* Next comes the name of the desired category. */
+- retval = getenv (categoryname);
+- if (retval != NULL && retval[0] != '\0')
+- return retval;
+- /* Last possibility is the LANG environment variable. */
+- retval = getenv ("LANG");
+- if (retval != NULL && retval[0] != '\0')
+- return retval;
+-
+- return NULL;
+-#endif
+-}
+-
+-const char *
+-gl_locale_name_default (void)
+-{
+- /* POSIX:2001 says:
+- "All implementations shall define a locale as the default locale, to be
+- invoked when no environment variables are set, or set to the empty
+- string. This default locale can be the POSIX locale or any other
+- implementation-defined locale. Some implementations may provide
+- facilities for local installation administrators to set the default
+- locale, customizing it for each location. POSIX:2001 does not require
+- such a facility. */
+-
+-#if !(HAVE_CFLOCALECOPYCURRENT || HAVE_CFPREFERENCESCOPYAPPVALUE || defined(WIN32_NATIVE))
+-
+- /* The system does not have a way of setting the locale, other than the
+- POSIX specified environment variables. We use C as default locale. */
+- return "C";
+-
+-#else
+-
+- /* Return an XPG style locale name language[_territory][@modifier].
+- Don't even bother determining the codeset; it's not useful in this
+- context, because message catalogs are not specific to a single
+- codeset. */
+-
+-# if HAVE_CFLOCALECOPYCURRENT || HAVE_CFPREFERENCESCOPYAPPVALUE
+- /* MacOS X 10.2 or newer */
+- {
+- /* Cache the locale name, since CoreFoundation calls are expensive. */
+- static const char *cached_localename;
+-
+- if (cached_localename == NULL)
+- {
+- char namebuf[256];
+-# if HAVE_CFLOCALECOPYCURRENT /* MacOS X 10.3 or newer */
+- CFLocaleRef locale = CFLocaleCopyCurrent ();
+- CFStringRef name = CFLocaleGetIdentifier (locale);
+-
+- if (CFStringGetCString (name, namebuf, sizeof(namebuf),
+- kCFStringEncodingASCII))
+- {
+- gl_locale_name_canonicalize (namebuf);
+- cached_localename = strdup (namebuf);
+- }
+- CFRelease (locale);
+-# elif HAVE_CFPREFERENCESCOPYAPPVALUE /* MacOS X 10.2 or newer */
+- CFTypeRef value =
+- CFPreferencesCopyAppValue (CFSTR ("AppleLocale"),
+- kCFPreferencesCurrentApplication);
+- if (value != NULL
+- && CFGetTypeID (value) == CFStringGetTypeID ()
+- && CFStringGetCString ((CFStringRef)value, namebuf, sizeof(namebuf),
+- kCFStringEncodingASCII))
+- {
+- gl_locale_name_canonicalize (namebuf);
+- cached_localename = strdup (namebuf);
+- }
+-# endif
+- if (cached_localename == NULL)
+- cached_localename = "C";
+- }
+- return cached_localename;
+- }
+-
+-# endif
+-
+-# if defined(WIN32_NATIVE) /* WIN32, not Cygwin */
+- {
+- LCID lcid;
+- LANGID langid;
+- int primary, sub;
+-
+- /* Use native Win32 API locale ID. */
+- lcid = GetThreadLocale ();
+-
+- /* 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);
+-
+- /* Dispatch on language.
+- See also http://www.unicode.org/unicode/onlinedat/languages.html .
+- For details about languages, see http://www.ethnologue.com/ . */
+- switch (primary)
+- {
+- case LANG_AFRIKAANS: return "af_ZA";
+- case LANG_ALBANIAN: return "sq_AL";
+- case LANG_AMHARIC: return "am_ET";
+- case LANG_ARABIC:
+- switch (sub)
+- {
+- case SUBLANG_ARABIC_SAUDI_ARABIA: return "ar_SA";
+- case SUBLANG_ARABIC_IRAQ: return "ar_IQ";
+- case SUBLANG_ARABIC_EGYPT: return "ar_EG";
+- case SUBLANG_ARABIC_LIBYA: return "ar_LY";
+- case SUBLANG_ARABIC_ALGERIA: return "ar_DZ";
+- case SUBLANG_ARABIC_MOROCCO: return "ar_MA";
+- case SUBLANG_ARABIC_TUNISIA: return "ar_TN";
+- case SUBLANG_ARABIC_OMAN: return "ar_OM";
+- case SUBLANG_ARABIC_YEMEN: return "ar_YE";
+- case SUBLANG_ARABIC_SYRIA: return "ar_SY";
+- case SUBLANG_ARABIC_JORDAN: return "ar_JO";
+- case SUBLANG_ARABIC_LEBANON: return "ar_LB";
+- case SUBLANG_ARABIC_KUWAIT: return "ar_KW";
+- case SUBLANG_ARABIC_UAE: return "ar_AE";
+- case SUBLANG_ARABIC_BAHRAIN: return "ar_BH";
+- case SUBLANG_ARABIC_QATAR: return "ar_QA";
+- }
+- return "ar";
+- case LANG_ARMENIAN: return "hy_AM";
+- case LANG_ASSAMESE: return "as_IN";
+- case LANG_AZERI:
+- switch (sub)
+- {
+- /* FIXME: Adjust this when Azerbaijani locales appear on Unix. */
+- case SUBLANG_AZERI_LATIN: return "az_AZ@latin";
+- case SUBLANG_AZERI_CYRILLIC: return "az_AZ@cyrillic";
+- }
+- return "az";
+- case LANG_BASQUE:
+- switch (sub)
+- {
+- case SUBLANG_DEFAULT: return "eu_ES";
+- }
+- return "eu"; /* Ambiguous: could be "eu_ES" or "eu_FR". */
+- case LANG_BELARUSIAN: return "be_BY";
+- case LANG_BENGALI:
+- switch (sub)
+- {
+- case SUBLANG_BENGALI_INDIA: return "bn_IN";
+- case SUBLANG_BENGALI_BANGLADESH: return "bn_BD";
+- }
+- return "bn";
+- case LANG_BULGARIAN: return "bg_BG";
+- case LANG_BURMESE: return "my_MM";
+- case LANG_CAMBODIAN: return "km_KH";
+- case LANG_CATALAN: return "ca_ES";
+- case LANG_CHEROKEE: return "chr_US";
+- case LANG_CHINESE:
+- switch (sub)
+- {
+- case SUBLANG_CHINESE_TRADITIONAL: return "zh_TW";
+- case SUBLANG_CHINESE_SIMPLIFIED: return "zh_CN";
+- case SUBLANG_CHINESE_HONGKONG: return "zh_HK";
+- case SUBLANG_CHINESE_SINGAPORE: return "zh_SG";
+- case SUBLANG_CHINESE_MACAU: return "zh_MO";
+- }
+- return "zh";
+- case LANG_CROATIAN: /* LANG_CROATIAN == LANG_SERBIAN
+- * What used to be called Serbo-Croatian
+- * should really now be two separate
+- * languages because of political reasons.
+- * (Says tml, who knows nothing about Serbian
+- * or Croatian.)
+- * (I can feel those flames coming already.)
+- */
+- switch (sub)
+- {
+- case SUBLANG_DEFAULT: return "hr_HR";
+- case SUBLANG_SERBIAN_LATIN: return "sr_CS";
+- case SUBLANG_SERBIAN_CYRILLIC: return "sr_CS@cyrillic";
+- }
+- return "hr";
+- case LANG_CZECH: return "cs_CZ";
+- case LANG_DANISH: return "da_DK";
+- case LANG_DIVEHI: return "dv_MV";
+- case LANG_DUTCH:
+- switch (sub)
+- {
+- case SUBLANG_DUTCH: return "nl_NL";
+- case SUBLANG_DUTCH_BELGIAN: /* FLEMISH, VLAAMS */ return "nl_BE";
+- }
+- return "nl";
+- case LANG_EDO: return "bin_NG";
+- case LANG_ENGLISH:
+- switch (sub)
+- {
+- /* SUBLANG_ENGLISH_US == SUBLANG_DEFAULT. Heh. I thought
+- * English was the language spoken in England.
+- * Oh well.
+- */
+- case SUBLANG_ENGLISH_US: return "en_US";
+- case SUBLANG_ENGLISH_UK: return "en_GB";
+- case SUBLANG_ENGLISH_AUS: return "en_AU";
+- case SUBLANG_ENGLISH_CAN: return "en_CA";
+- case SUBLANG_ENGLISH_NZ: return "en_NZ";
+- case SUBLANG_ENGLISH_EIRE: return "en_IE";
+- case SUBLANG_ENGLISH_SOUTH_AFRICA: return "en_ZA";
+- case SUBLANG_ENGLISH_JAMAICA: return "en_JM";
+- case SUBLANG_ENGLISH_CARIBBEAN: return "en_GD"; /* Grenada? */
+- case SUBLANG_ENGLISH_BELIZE: return "en_BZ";
+- case SUBLANG_ENGLISH_TRINIDAD: return "en_TT";
+- case SUBLANG_ENGLISH_ZIMBABWE: return "en_ZW";
+- case SUBLANG_ENGLISH_PHILIPPINES: return "en_PH";
+- case SUBLANG_ENGLISH_INDONESIA: return "en_ID";
+- case SUBLANG_ENGLISH_HONGKONG: return "en_HK";
+- case SUBLANG_ENGLISH_INDIA: return "en_IN";
+- case SUBLANG_ENGLISH_MALAYSIA: return "en_MY";
+- case SUBLANG_ENGLISH_SINGAPORE: return "en_SG";
+- }
+- return "en";
+- case LANG_ESTONIAN: return "et_EE";
+- case LANG_FAEROESE: return "fo_FO";
+- case LANG_FARSI: return "fa_IR";
+- case LANG_FINNISH: return "fi_FI";
+- case LANG_FRENCH:
+- switch (sub)
+- {
+- case SUBLANG_FRENCH: return "fr_FR";
+- case SUBLANG_FRENCH_BELGIAN: /* WALLOON */ return "fr_BE";
+- case SUBLANG_FRENCH_CANADIAN: return "fr_CA";
+- case SUBLANG_FRENCH_SWISS: return "fr_CH";
+- case SUBLANG_FRENCH_LUXEMBOURG: return "fr_LU";
+- case SUBLANG_FRENCH_MONACO: return "fr_MC";
+- case SUBLANG_FRENCH_WESTINDIES: return "fr"; /* Caribbean? */
+- case SUBLANG_FRENCH_REUNION: return "fr_RE";
+- case SUBLANG_FRENCH_CONGO: return "fr_CG";
+- case SUBLANG_FRENCH_SENEGAL: return "fr_SN";
+- case SUBLANG_FRENCH_CAMEROON: return "fr_CM";
+- case SUBLANG_FRENCH_COTEDIVOIRE: return "fr_CI";
+- case SUBLANG_FRENCH_MALI: return "fr_ML";
+- case SUBLANG_FRENCH_MOROCCO: return "fr_MA";
+- case SUBLANG_FRENCH_HAITI: return "fr_HT";
+- }
+- return "fr";
+- case LANG_FRISIAN: return "fy_NL";
+- case LANG_FULFULDE:
+- /* Spoken in Nigeria, Guinea, Senegal, Mali, Niger, Cameroon, Benin. */
+- return "ff_NG";
+- case LANG_GAELIC:
+- switch (sub)
+- {
+- case 0x01: /* SCOTTISH */ return "gd_GB";
+- case 0x02: /* IRISH */ return "ga_IE";
+- }
+- return "C";
+- case LANG_GALICIAN: return "gl_ES";
+- case LANG_GEORGIAN: return "ka_GE";
+- case LANG_GERMAN:
+- switch (sub)
+- {
+- case SUBLANG_GERMAN: return "de_DE";
+- case SUBLANG_GERMAN_SWISS: return "de_CH";
+- case SUBLANG_GERMAN_AUSTRIAN: return "de_AT";
+- case SUBLANG_GERMAN_LUXEMBOURG: return "de_LU";
+- case SUBLANG_GERMAN_LIECHTENSTEIN: return "de_LI";
+- }
+- return "de";
+- case LANG_GREEK: return "el_GR";
+- case LANG_GUARANI: return "gn_PY";
+- case LANG_GUJARATI: return "gu_IN";
+- case LANG_HAUSA: return "ha_NG";
+- case LANG_HAWAIIAN:
+- /* FIXME: Do they mean Hawaiian ("haw_US", 1000 speakers)
+- or Hawaii Creole English ("cpe_US", 600000 speakers)? */
+- return "cpe_US";
+- case LANG_HEBREW: return "he_IL";
+- case LANG_HINDI: return "hi_IN";
+- case LANG_HUNGARIAN: return "hu_HU";
+- case LANG_IBIBIO: return "nic_NG";
+- case LANG_ICELANDIC: return "is_IS";
+- case LANG_IGBO: return "ig_NG";
+- case LANG_INDONESIAN: return "id_ID";
+- case LANG_INUKTITUT: return "iu_CA";
+- case LANG_ITALIAN:
+- switch (sub)
+- {
+- case SUBLANG_ITALIAN: return "it_IT";
+- case SUBLANG_ITALIAN_SWISS: return "it_CH";
+- }
+- return "it";
+- case LANG_JAPANESE: return "ja_JP";
+- case LANG_KANNADA: return "kn_IN";
+- case LANG_KANURI: return "kr_NG";
+- case LANG_KASHMIRI:
+- switch (sub)
+- {
+- case SUBLANG_DEFAULT: return "ks_PK";
+- case SUBLANG_KASHMIRI_INDIA: return "ks_IN";
+- }
+- return "ks";
+- case LANG_KAZAK: return "kk_KZ";
+- case LANG_KONKANI:
+- /* FIXME: Adjust this when such locales appear on Unix. */
+- return "kok_IN";
+- case LANG_KOREAN: return "ko_KR";
+- case LANG_KYRGYZ: return "ky_KG";
+- case LANG_LAO: return "lo_LA";
+- case LANG_LATIN: return "la_VA";
+- case LANG_LATVIAN: return "lv_LV";
+- case LANG_LITHUANIAN: return "lt_LT";
+- case LANG_MACEDONIAN: return "mk_MK";
+- case LANG_MALAY:
+- switch (sub)
+- {
+- case SUBLANG_MALAY_MALAYSIA: return "ms_MY";
+- case SUBLANG_MALAY_BRUNEI_DARUSSALAM: return "ms_BN";
+- }
+- return "ms";
+- case LANG_MALAYALAM: return "ml_IN";
+- case LANG_MALTESE: return "mt_MT";
+- case LANG_MANIPURI:
+- /* FIXME: Adjust this when such locales appear on Unix. */
+- return "mni_IN";
+- case LANG_MARATHI: return "mr_IN";
+- case LANG_MONGOLIAN:
+- switch (sub)
+- {
+- case SUBLANG_DEFAULT: return "mn_MN";
+- }
+- return "mn"; /* Ambiguous: could be "mn_CN" or "mn_MN". */
+- case LANG_NEPALI:
+- switch (sub)
+- {
+- case SUBLANG_DEFAULT: return "ne_NP";
+- case SUBLANG_NEPALI_INDIA: return "ne_IN";
+- }
+- return "ne";
+- case LANG_NORWEGIAN:
+- switch (sub)
+- {
+- case SUBLANG_NORWEGIAN_BOKMAL: return "nb_NO";
+- case SUBLANG_NORWEGIAN_NYNORSK: return "nn_NO";
+- }
+- return "no";
+- case LANG_ORIYA: return "or_IN";
+- case LANG_OROMO: return "om_ET";
+- case LANG_PAPIAMENTU: return "pap_AN";
+- case LANG_PASHTO:
+- return "ps"; /* Ambiguous: could be "ps_PK" or "ps_AF". */
+- case LANG_POLISH: return "pl_PL";
+- case LANG_PORTUGUESE:
+- switch (sub)
+- {
+- case SUBLANG_PORTUGUESE: return "pt_PT";
+- /* Hmm. SUBLANG_PORTUGUESE_BRAZILIAN == SUBLANG_DEFAULT.
+- Same phenomenon as SUBLANG_ENGLISH_US == SUBLANG_DEFAULT. */
+- case SUBLANG_PORTUGUESE_BRAZILIAN: return "pt_BR";
+- }
+- return "pt";
+- case LANG_PUNJABI:
+- switch (sub)
+- {
+- case SUBLANG_PUNJABI_INDIA: return "pa_IN"; /* Gurmukhi script */
+- case SUBLANG_PUNJABI_PAKISTAN: return "pa_PK"; /* Arabic script */
+- }
+- return "pa";
+- case LANG_RHAETO_ROMANCE: return "rm_CH";
+- case LANG_ROMANIAN:
+- switch (sub)
+- {
+- case SUBLANG_ROMANIAN_ROMANIA: return "ro_RO";
+- case SUBLANG_ROMANIAN_MOLDOVA: return "ro_MD";
+- }
+- return "ro";
+- case LANG_RUSSIAN:
+- switch (sub)
+- {
+- case SUBLANG_DEFAULT: return "ru_RU";
+- }
+- return "ru"; /* Ambiguous: could be "ru_RU" or "ru_UA" or "ru_MD". */
+- case LANG_SAAMI: /* actually Northern Sami */ return "se_NO";
+- case LANG_SANSKRIT: return "sa_IN";
+- case LANG_SINDHI:
+- switch (sub)
+- {
+- case SUBLANG_SINDHI_PAKISTAN: return "sd_PK";
+- case SUBLANG_SINDHI_AFGHANISTAN: return "sd_AF";
+- }
+- return "sd";
+- case LANG_SINHALESE: return "si_LK";
+- case LANG_SLOVAK: return "sk_SK";
+- case LANG_SLOVENIAN: return "sl_SI";
+- case LANG_SOMALI: return "so_SO";
+- case LANG_SORBIAN:
+- /* FIXME: Adjust this when such locales appear on Unix. */
+- return "wen_DE";
+- case LANG_SPANISH:
+- switch (sub)
+- {
+- case SUBLANG_SPANISH: return "es_ES";
+- case SUBLANG_SPANISH_MEXICAN: return "es_MX";
+- case SUBLANG_SPANISH_MODERN:
+- return "es_ES@modern"; /* not seen on Unix */
+- case SUBLANG_SPANISH_GUATEMALA: return "es_GT";
+- case SUBLANG_SPANISH_COSTA_RICA: return "es_CR";
+- case SUBLANG_SPANISH_PANAMA: return "es_PA";
+- case SUBLANG_SPANISH_DOMINICAN_REPUBLIC: return "es_DO";
+- case SUBLANG_SPANISH_VENEZUELA: return "es_VE";
+- case SUBLANG_SPANISH_COLOMBIA: return "es_CO";
+- case SUBLANG_SPANISH_PERU: return "es_PE";
+- case SUBLANG_SPANISH_ARGENTINA: return "es_AR";
+- case SUBLANG_SPANISH_ECUADOR: return "es_EC";
+- case SUBLANG_SPANISH_CHILE: return "es_CL";
+- case SUBLANG_SPANISH_URUGUAY: return "es_UY";
+- case SUBLANG_SPANISH_PARAGUAY: return "es_PY";
+- case SUBLANG_SPANISH_BOLIVIA: return "es_BO";
+- case SUBLANG_SPANISH_EL_SALVADOR: return "es_SV";
+- case SUBLANG_SPANISH_HONDURAS: return "es_HN";
+- case SUBLANG_SPANISH_NICARAGUA: return "es_NI";
+- case SUBLANG_SPANISH_PUERTO_RICO: return "es_PR";
+- }
+- return "es";
+- case LANG_SUTU: return "bnt_TZ"; /* or "st_LS" or "nso_ZA"? */
+- case LANG_SWAHILI: return "sw_KE";
+- case LANG_SWEDISH:
+- switch (sub)
+- {
+- case SUBLANG_DEFAULT: return "sv_SE";
+- case SUBLANG_SWEDISH_FINLAND: return "sv_FI";
+- }
+- return "sv";
+- case LANG_SYRIAC: return "syr_TR"; /* An extinct language. */
+- case LANG_TAGALOG: return "tl_PH";
+- case LANG_TAJIK: return "tg_TJ";
+- case LANG_TAMAZIGHT:
+- switch (sub)
+- {
+- /* FIXME: Adjust this when Tamazight locales appear on Unix. */
+- case SUBLANG_TAMAZIGHT_ARABIC: return "ber_MA@arabic";
+- case SUBLANG_TAMAZIGHT_ALGERIA_LATIN: return "ber_DZ@latin";
+- }
+- return "ber_MA";
+- case LANG_TAMIL:
+- switch (sub)
+- {
+- case SUBLANG_DEFAULT: return "ta_IN";
+- }
+- return "ta"; /* Ambiguous: could be "ta_IN" or "ta_LK" or "ta_SG". */
+- case LANG_TATAR: return "tt_RU";
+- case LANG_TELUGU: return "te_IN";
+- case LANG_THAI: return "th_TH";
+- case LANG_TIBETAN: return "bo_CN";
+- case LANG_TIGRINYA:
+- switch (sub)
+- {
+- case SUBLANG_TIGRINYA_ETHIOPIA: return "ti_ET";
+- case SUBLANG_TIGRINYA_ERITREA: return "ti_ER";
+- }
+- return "ti";
+- case LANG_TSONGA: return "ts_ZA";
+- case LANG_TSWANA: return "tn_BW";
+- case LANG_TURKISH: return "tr_TR";
+- case LANG_TURKMEN: return "tk_TM";
+- case LANG_UKRAINIAN: return "uk_UA";
+- case LANG_URDU:
+- switch (sub)
+- {
+- case SUBLANG_URDU_PAKISTAN: return "ur_PK";
+- case SUBLANG_URDU_INDIA: return "ur_IN";
+- }
+- return "ur";
+- case LANG_UZBEK:
+- switch (sub)
+- {
+- case SUBLANG_UZBEK_LATIN: return "uz_UZ";
+- case SUBLANG_UZBEK_CYRILLIC: return "uz_UZ@cyrillic";
+- }
+- return "uz";
+- case LANG_VENDA: return "ve_ZA";
+- case LANG_VIETNAMESE: return "vi_VN";
+- case LANG_WELSH: return "cy_GB";
+- case LANG_XHOSA: return "xh_ZA";
+- case LANG_YI: return "sit_CN";
+- case LANG_YIDDISH: return "yi_IL";
+- case LANG_YORUBA: return "yo_NG";
+- case LANG_ZULU: return "zu_ZA";
+- default: return "C";
+- }
+- }
+-# endif
+-#endif
+-}
+-
+-const char *
+-gl_locale_name (int category, const char *categoryname)
+-{
+- const char *retval;
+-
+- retval = gl_locale_name_posix (category, categoryname);
+- if (retval != NULL)
+- return retval;
+-
+- return gl_locale_name_default ();
+-}
+--- a/intl/lock.c
++++ /dev/null
+@@ -1,922 +0,0 @@
+-/* Locking in multithreaded situations.
+- Copyright (C) 2005-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 <bruno@clisp.org>, 2005.
+- Based on GCC's gthr-posix.h, gthr-posix95.h, gthr-solaris.h,
+- gthr-win32.h. */
+-
+-#include <config.h>
+-
+-#include "lock.h"
+-
+-/* ========================================================================= */
+-
+-#if USE_POSIX_THREADS
+-
+-/* Use the POSIX threads library. */
+-
+-# if PTHREAD_IN_USE_DETECTION_HARD
+-
+-/* The function to be executed by a dummy thread. */
+-static void *
+-dummy_thread_func (void *arg)
+-{
+- return arg;
+-}
+-
+-int
+-glthread_in_use (void)
+-{
+- static int tested;
+- static int result; /* 1: linked with -lpthread, 0: only with libc */
+-
+- if (!tested)
+- {
+- pthread_t thread;
+-
+- if (pthread_create (&thread, NULL, dummy_thread_func, NULL) != 0)
+- /* Thread creation failed. */
+- result = 0;
+- else
+- {
+- /* Thread creation works. */
+- void *retval;
+- if (pthread_join (thread, &retval) != 0)
+- abort ();
+- result = 1;
+- }
+- tested = 1;
+- }
+- return result;
+-}
+-
+-# endif
+-
+-/* -------------------------- gl_lock_t datatype -------------------------- */
+-
+-/* ------------------------- gl_rwlock_t datatype ------------------------- */
+-
+-# if HAVE_PTHREAD_RWLOCK
+-
+-# if !defined PTHREAD_RWLOCK_INITIALIZER
+-
+-void
+-glthread_rwlock_init (gl_rwlock_t *lock)
+-{
+- if (pthread_rwlock_init (&lock->rwlock, NULL) != 0)
+- abort ();
+- lock->initialized = 1;
+-}
+-
+-void
+-glthread_rwlock_rdlock (gl_rwlock_t *lock)
+-{
+- if (!lock->initialized)
+- {
+- if (pthread_mutex_lock (&lock->guard) != 0)
+- abort ();
+- if (!lock->initialized)
+- glthread_rwlock_init (lock);
+- if (pthread_mutex_unlock (&lock->guard) != 0)
+- abort ();
+- }
+- if (pthread_rwlock_rdlock (&lock->rwlock) != 0)
+- abort ();
+-}
+-
+-void
+-glthread_rwlock_wrlock (gl_rwlock_t *lock)
+-{
+- if (!lock->initialized)
+- {
+- if (pthread_mutex_lock (&lock->guard) != 0)
+- abort ();
+- if (!lock->initialized)
+- glthread_rwlock_init (lock);
+- if (pthread_mutex_unlock (&lock->guard) != 0)
+- abort ();
+- }
+- if (pthread_rwlock_wrlock (&lock->rwlock) != 0)
+- abort ();
+-}
+-
+-void
+-glthread_rwlock_unlock (gl_rwlock_t *lock)
+-{
+- if (!lock->initialized)
+- abort ();
+- if (pthread_rwlock_unlock (&lock->rwlock) != 0)
+- abort ();
+-}
+-
+-void
+-glthread_rwlock_destroy (gl_rwlock_t *lock)
+-{
+- if (!lock->initialized)
+- abort ();
+- if (pthread_rwlock_destroy (&lock->rwlock) != 0)
+- abort ();
+- lock->initialized = 0;
+-}
+-
+-# endif
+-
+-# else
+-
+-void
+-glthread_rwlock_init (gl_rwlock_t *lock)
+-{
+- if (pthread_mutex_init (&lock->lock, NULL) != 0)
+- abort ();
+- if (pthread_cond_init (&lock->waiting_readers, NULL) != 0)
+- abort ();
+- if (pthread_cond_init (&lock->waiting_writers, NULL) != 0)
+- abort ();
+- lock->waiting_writers_count = 0;
+- lock->runcount = 0;
+-}
+-
+-void
+-glthread_rwlock_rdlock (gl_rwlock_t *lock)
+-{
+- if (pthread_mutex_lock (&lock->lock) != 0)
+- abort ();
+- /* Test whether only readers are currently running, and whether the runcount
+- field will not overflow. */
+- /* POSIX says: "It is implementation-defined whether the calling thread
+- acquires the lock when a writer does not hold the lock and there are
+- writers blocked on the lock." Let's say, no: give the writers a higher
+- priority. */
+- while (!(lock->runcount + 1 > 0 && lock->waiting_writers_count == 0))
+- {
+- /* This thread has to wait for a while. Enqueue it among the
+- waiting_readers. */
+- if (pthread_cond_wait (&lock->waiting_readers, &lock->lock) != 0)
+- abort ();
+- }
+- lock->runcount++;
+- if (pthread_mutex_unlock (&lock->lock) != 0)
+- abort ();
+-}
+-
+-void
+-glthread_rwlock_wrlock (gl_rwlock_t *lock)
+-{
+- if (pthread_mutex_lock (&lock->lock) != 0)
+- abort ();
+- /* Test whether no readers or writers are currently running. */
+- while (!(lock->runcount == 0))
+- {
+- /* This thread has to wait for a while. Enqueue it among the
+- waiting_writers. */
+- lock->waiting_writers_count++;
+- if (pthread_cond_wait (&lock->waiting_writers, &lock->lock) != 0)
+- abort ();
+- lock->waiting_writers_count--;
+- }
+- lock->runcount--; /* runcount becomes -1 */
+- if (pthread_mutex_unlock (&lock->lock) != 0)
+- abort ();
+-}
+-
+-void
+-glthread_rwlock_unlock (gl_rwlock_t *lock)
+-{
+- if (pthread_mutex_lock (&lock->lock) != 0)
+- abort ();
+- if (lock->runcount < 0)
+- {
+- /* Drop a writer lock. */
+- if (!(lock->runcount == -1))
+- abort ();
+- lock->runcount = 0;
+- }
+- else
+- {
+- /* Drop a reader lock. */
+- if (!(lock->runcount > 0))
+- abort ();
+- lock->runcount--;
+- }
+- if (lock->runcount == 0)
+- {
+- /* POSIX recommends that "write locks shall take precedence over read
+- locks", to avoid "writer starvation". */
+- if (lock->waiting_writers_count > 0)
+- {
+- /* Wake up one of the waiting writers. */
+- if (pthread_cond_signal (&lock->waiting_writers) != 0)
+- abort ();
+- }
+- else
+- {
+- /* Wake up all waiting readers. */
+- if (pthread_cond_broadcast (&lock->waiting_readers) != 0)
+- abort ();
+- }
+- }
+- if (pthread_mutex_unlock (&lock->lock) != 0)
+- abort ();
+-}
+-
+-void
+-glthread_rwlock_destroy (gl_rwlock_t *lock)
+-{
+- if (pthread_mutex_destroy (&lock->lock) != 0)
+- abort ();
+- if (pthread_cond_destroy (&lock->waiting_readers) != 0)
+- abort ();
+- if (pthread_cond_destroy (&lock->waiting_writers) != 0)
+- abort ();
+-}
+-
+-# endif
+-
+-/* --------------------- gl_recursive_lock_t datatype --------------------- */
+-
+-# if HAVE_PTHREAD_MUTEX_RECURSIVE
+-
+-# if !(defined PTHREAD_RECURSIVE_MUTEX_INITIALIZER || defined PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP)
+-
+-void
+-glthread_recursive_lock_init (gl_recursive_lock_t *lock)
+-{
+- pthread_mutexattr_t attributes;
+-
+- if (pthread_mutexattr_init (&attributes) != 0)
+- abort ();
+- if (pthread_mutexattr_settype (&attributes, PTHREAD_MUTEX_RECURSIVE) != 0)
+- abort ();
+- if (pthread_mutex_init (&lock->recmutex, &attributes) != 0)
+- abort ();
+- if (pthread_mutexattr_destroy (&attributes) != 0)
+- abort ();
+- lock->initialized = 1;
+-}
+-
+-void
+-glthread_recursive_lock_lock (gl_recursive_lock_t *lock)
+-{
+- if (!lock->initialized)
+- {
+- if (pthread_mutex_lock (&lock->guard) != 0)
+- abort ();
+- if (!lock->initialized)
+- glthread_recursive_lock_init (lock);
+- if (pthread_mutex_unlock (&lock->guard) != 0)
+- abort ();
+- }
+- if (pthread_mutex_lock (&lock->recmutex) != 0)
+- abort ();
+-}
+-
+-void
+-glthread_recursive_lock_unlock (gl_recursive_lock_t *lock)
+-{
+- if (!lock->initialized)
+- abort ();
+- if (pthread_mutex_unlock (&lock->recmutex) != 0)
+- abort ();
+-}
+-
+-void
+-glthread_recursive_lock_destroy (gl_recursive_lock_t *lock)
+-{
+- if (!lock->initialized)
+- abort ();
+- if (pthread_mutex_destroy (&lock->recmutex) != 0)
+- abort ();
+- lock->initialized = 0;
+-}
+-
+-# endif
+-
+-# else
+-
+-void
+-glthread_recursive_lock_init (gl_recursive_lock_t *lock)
+-{
+- if (pthread_mutex_init (&lock->mutex, NULL) != 0)
+- abort ();
+- lock->owner = (pthread_t) 0;
+- lock->depth = 0;
+-}
+-
+-void
+-glthread_recursive_lock_lock (gl_recursive_lock_t *lock)
+-{
+- pthread_t self = pthread_self ();
+- if (lock->owner != self)
+- {
+- if (pthread_mutex_lock (&lock->mutex) != 0)
+- abort ();
+- lock->owner = self;
+- }
+- if (++(lock->depth) == 0) /* wraparound? */
+- abort ();
+-}
+-
+-void
+-glthread_recursive_lock_unlock (gl_recursive_lock_t *lock)
+-{
+- if (lock->owner != pthread_self ())
+- abort ();
+- if (lock->depth == 0)
+- abort ();
+- if (--(lock->depth) == 0)
+- {
+- lock->owner = (pthread_t) 0;
+- if (pthread_mutex_unlock (&lock->mutex) != 0)
+- abort ();
+- }
+-}
+-
+-void
+-glthread_recursive_lock_destroy (gl_recursive_lock_t *lock)
+-{
+- if (lock->owner != (pthread_t) 0)
+- abort ();
+- if (pthread_mutex_destroy (&lock->mutex) != 0)
+- abort ();
+-}
+-
+-# endif
+-
+-/* -------------------------- gl_once_t datatype -------------------------- */
+-
+-static const pthread_once_t fresh_once = PTHREAD_ONCE_INIT;
+-
+-int
+-glthread_once_singlethreaded (pthread_once_t *once_control)
+-{
+- /* We don't know whether pthread_once_t is an integer type, a floating-point
+- type, a pointer type, or a structure type. */
+- char *firstbyte = (char *)once_control;
+- if (*firstbyte == *(const char *)&fresh_once)
+- {
+- /* First time use of once_control. Invert the first byte. */
+- *firstbyte = ~ *(const char *)&fresh_once;
+- return 1;
+- }
+- else
+- return 0;
+-}
+-
+-#endif
+-
+-/* ========================================================================= */
+-
+-#if USE_PTH_THREADS
+-
+-/* Use the GNU Pth threads library. */
+-
+-/* -------------------------- gl_lock_t datatype -------------------------- */
+-
+-/* ------------------------- gl_rwlock_t datatype ------------------------- */
+-
+-/* --------------------- gl_recursive_lock_t datatype --------------------- */
+-
+-/* -------------------------- gl_once_t datatype -------------------------- */
+-
+-void
+-glthread_once_call (void *arg)
+-{
+- void (**gl_once_temp_addr) (void) = (void (**) (void)) arg;
+- void (*initfunction) (void) = *gl_once_temp_addr;
+- initfunction ();
+-}
+-
+-int
+-glthread_once_singlethreaded (pth_once_t *once_control)
+-{
+- /* We know that pth_once_t is an integer type. */
+- if (*once_control == PTH_ONCE_INIT)
+- {
+- /* First time use of once_control. Invert the marker. */
+- *once_control = ~ PTH_ONCE_INIT;
+- return 1;
+- }
+- else
+- return 0;
+-}
+-
+-#endif
+-
+-/* ========================================================================= */
+-
+-#if USE_SOLARIS_THREADS
+-
+-/* Use the old Solaris threads library. */
+-
+-/* -------------------------- gl_lock_t datatype -------------------------- */
+-
+-/* ------------------------- gl_rwlock_t datatype ------------------------- */
+-
+-/* --------------------- gl_recursive_lock_t datatype --------------------- */
+-
+-void
+-glthread_recursive_lock_init (gl_recursive_lock_t *lock)
+-{
+- if (mutex_init (&lock->mutex, USYNC_THREAD, NULL) != 0)
+- abort ();
+- lock->owner = (thread_t) 0;
+- lock->depth = 0;
+-}
+-
+-void
+-glthread_recursive_lock_lock (gl_recursive_lock_t *lock)
+-{
+- thread_t self = thr_self ();
+- if (lock->owner != self)
+- {
+- if (mutex_lock (&lock->mutex) != 0)
+- abort ();
+- lock->owner = self;
+- }
+- if (++(lock->depth) == 0) /* wraparound? */
+- abort ();
+-}
+-
+-void
+-glthread_recursive_lock_unlock (gl_recursive_lock_t *lock)
+-{
+- if (lock->owner != thr_self ())
+- abort ();
+- if (lock->depth == 0)
+- abort ();
+- if (--(lock->depth) == 0)
+- {
+- lock->owner = (thread_t) 0;
+- if (mutex_unlock (&lock->mutex) != 0)
+- abort ();
+- }
+-}
+-
+-void
+-glthread_recursive_lock_destroy (gl_recursive_lock_t *lock)
+-{
+- if (lock->owner != (thread_t) 0)
+- abort ();
+- if (mutex_destroy (&lock->mutex) != 0)
+- abort ();
+-}
+-
+-/* -------------------------- gl_once_t datatype -------------------------- */
+-
+-void
+-glthread_once (gl_once_t *once_control, void (*initfunction) (void))
+-{
+- if (!once_control->inited)
+- {
+- /* Use the mutex to guarantee that if another thread is already calling
+- the initfunction, this thread waits until it's finished. */
+- if (mutex_lock (&once_control->mutex) != 0)
+- abort ();
+- if (!once_control->inited)
+- {
+- once_control->inited = 1;
+- initfunction ();
+- }
+- if (mutex_unlock (&once_control->mutex) != 0)
+- abort ();
+- }
+-}
+-
+-int
+-glthread_once_singlethreaded (gl_once_t *once_control)
+-{
+- /* We know that gl_once_t contains an integer type. */
+- if (!once_control->inited)
+- {
+- /* First time use of once_control. Invert the marker. */
+- once_control->inited = ~ 0;
+- return 1;
+- }
+- else
+- return 0;
+-}
+-
+-#endif
+-
+-/* ========================================================================= */
+-
+-#if USE_WIN32_THREADS
+-
+-/* -------------------------- gl_lock_t datatype -------------------------- */
+-
+-void
+-glthread_lock_init (gl_lock_t *lock)
+-{
+- InitializeCriticalSection (&lock->lock);
+- lock->guard.done = 1;
+-}
+-
+-void
+-glthread_lock_lock (gl_lock_t *lock)
+-{
+- if (!lock->guard.done)
+- {
+- if (InterlockedIncrement (&lock->guard.started) == 0)
+- /* This thread is the first one to need this lock. Initialize it. */
+- glthread_lock_init (lock);
+- else
+- /* Yield the CPU while waiting for another thread to finish
+- initializing this lock. */
+- while (!lock->guard.done)
+- Sleep (0);
+- }
+- EnterCriticalSection (&lock->lock);
+-}
+-
+-void
+-glthread_lock_unlock (gl_lock_t *lock)
+-{
+- if (!lock->guard.done)
+- abort ();
+- LeaveCriticalSection (&lock->lock);
+-}
+-
+-void
+-glthread_lock_destroy (gl_lock_t *lock)
+-{
+- if (!lock->guard.done)
+- abort ();
+- DeleteCriticalSection (&lock->lock);
+- lock->guard.done = 0;
+-}
+-
+-/* ------------------------- gl_rwlock_t datatype ------------------------- */
+-
+-static inline void
+-gl_waitqueue_init (gl_waitqueue_t *wq)
+-{
+- wq->array = NULL;
+- wq->count = 0;
+- wq->alloc = 0;
+- wq->offset = 0;
+-}
+-
+-/* Enqueues the current thread, represented by an event, in a wait queue.
+- Returns INVALID_HANDLE_VALUE if an allocation failure occurs. */
+-static HANDLE
+-gl_waitqueue_add (gl_waitqueue_t *wq)
+-{
+- HANDLE event;
+- unsigned int index;
+-
+- if (wq->count == wq->alloc)
+- {
+- unsigned int new_alloc = 2 * wq->alloc + 1;
+- HANDLE *new_array =
+- (HANDLE *) realloc (wq->array, new_alloc * sizeof (HANDLE));
+- if (new_array == NULL)
+- /* No more memory. */
+- return INVALID_HANDLE_VALUE;
+- /* Now is a good opportunity to rotate the array so that its contents
+- starts at offset 0. */
+- if (wq->offset > 0)
+- {
+- unsigned int old_count = wq->count;
+- unsigned int old_alloc = wq->alloc;
+- unsigned int old_offset = wq->offset;
+- unsigned int i;
+- if (old_offset + old_count > old_alloc)
+- {
+- unsigned int limit = old_offset + old_count - old_alloc;
+- for (i = 0; i < limit; i++)
+- new_array[old_alloc + i] = new_array[i];
+- }
+- for (i = 0; i < old_count; i++)
+- new_array[i] = new_array[old_offset + i];
+- wq->offset = 0;
+- }
+- wq->array = new_array;
+- wq->alloc = new_alloc;
+- }
+- event = CreateEvent (NULL, TRUE, FALSE, NULL);
+- if (event == INVALID_HANDLE_VALUE)
+- /* No way to allocate an event. */
+- return INVALID_HANDLE_VALUE;
+- index = wq->offset + wq->count;
+- if (index >= wq->alloc)
+- index -= wq->alloc;
+- wq->array[index] = event;
+- wq->count++;
+- return event;
+-}
+-
+-/* Notifies the first thread from a wait queue and dequeues it. */
+-static inline void
+-gl_waitqueue_notify_first (gl_waitqueue_t *wq)
+-{
+- SetEvent (wq->array[wq->offset + 0]);
+- wq->offset++;
+- wq->count--;
+- if (wq->count == 0 || wq->offset == wq->alloc)
+- wq->offset = 0;
+-}
+-
+-/* Notifies all threads from a wait queue and dequeues them all. */
+-static inline void
+-gl_waitqueue_notify_all (gl_waitqueue_t *wq)
+-{
+- unsigned int i;
+-
+- for (i = 0; i < wq->count; i++)
+- {
+- unsigned int index = wq->offset + i;
+- if (index >= wq->alloc)
+- index -= wq->alloc;
+- SetEvent (wq->array[index]);
+- }
+- wq->count = 0;
+- wq->offset = 0;
+-}
+-
+-void
+-glthread_rwlock_init (gl_rwlock_t *lock)
+-{
+- InitializeCriticalSection (&lock->lock);
+- gl_waitqueue_init (&lock->waiting_readers);
+- gl_waitqueue_init (&lock->waiting_writers);
+- lock->runcount = 0;
+- lock->guard.done = 1;
+-}
+-
+-void
+-glthread_rwlock_rdlock (gl_rwlock_t *lock)
+-{
+- if (!lock->guard.done)
+- {
+- if (InterlockedIncrement (&lock->guard.started) == 0)
+- /* This thread is the first one to need this lock. Initialize it. */
+- glthread_rwlock_init (lock);
+- else
+- /* Yield the CPU while waiting for another thread to finish
+- initializing this lock. */
+- while (!lock->guard.done)
+- Sleep (0);
+- }
+- EnterCriticalSection (&lock->lock);
+- /* Test whether only readers are currently running, and whether the runcount
+- field will not overflow. */
+- if (!(lock->runcount + 1 > 0))
+- {
+- /* This thread has to wait for a while. Enqueue it among the
+- waiting_readers. */
+- HANDLE event = gl_waitqueue_add (&lock->waiting_readers);
+- if (event != INVALID_HANDLE_VALUE)
+- {
+- DWORD result;
+- LeaveCriticalSection (&lock->lock);
+- /* Wait until another thread signals this event. */
+- result = WaitForSingleObject (event, INFINITE);
+- if (result == WAIT_FAILED || result == WAIT_TIMEOUT)
+- abort ();
+- CloseHandle (event);
+- /* The thread which signalled the event already did the bookkeeping:
+- removed us from the waiting_readers, incremented lock->runcount. */
+- if (!(lock->runcount > 0))
+- abort ();
+- return;
+- }
+- else
+- {
+- /* Allocation failure. Weird. */
+- do
+- {
+- LeaveCriticalSection (&lock->lock);
+- Sleep (1);
+- EnterCriticalSection (&lock->lock);
+- }
+- while (!(lock->runcount + 1 > 0));
+- }
+- }
+- lock->runcount++;
+- LeaveCriticalSection (&lock->lock);
+-}
+-
+-void
+-glthread_rwlock_wrlock (gl_rwlock_t *lock)
+-{
+- if (!lock->guard.done)
+- {
+- if (InterlockedIncrement (&lock->guard.started) == 0)
+- /* This thread is the first one to need this lock. Initialize it. */
+- glthread_rwlock_init (lock);
+- else
+- /* Yield the CPU while waiting for another thread to finish
+- initializing this lock. */
+- while (!lock->guard.done)
+- Sleep (0);
+- }
+- EnterCriticalSection (&lock->lock);
+- /* Test whether no readers or writers are currently running. */
+- if (!(lock->runcount == 0))
+- {
+- /* This thread has to wait for a while. Enqueue it among the
+- waiting_writers. */
+- HANDLE event = gl_waitqueue_add (&lock->waiting_writers);
+- if (event != INVALID_HANDLE_VALUE)
+- {
+- DWORD result;
+- LeaveCriticalSection (&lock->lock);
+- /* Wait until another thread signals this event. */
+- result = WaitForSingleObject (event, INFINITE);
+- if (result == WAIT_FAILED || result == WAIT_TIMEOUT)
+- abort ();
+- CloseHandle (event);
+- /* The thread which signalled the event already did the bookkeeping:
+- removed us from the waiting_writers, set lock->runcount = -1. */
+- if (!(lock->runcount == -1))
+- abort ();
+- return;
+- }
+- else
+- {
+- /* Allocation failure. Weird. */
+- do
+- {
+- LeaveCriticalSection (&lock->lock);
+- Sleep (1);
+- EnterCriticalSection (&lock->lock);
+- }
+- while (!(lock->runcount == 0));
+- }
+- }
+- lock->runcount--; /* runcount becomes -1 */
+- LeaveCriticalSection (&lock->lock);
+-}
+-
+-void
+-glthread_rwlock_unlock (gl_rwlock_t *lock)
+-{
+- if (!lock->guard.done)
+- abort ();
+- EnterCriticalSection (&lock->lock);
+- if (lock->runcount < 0)
+- {
+- /* Drop a writer lock. */
+- if (!(lock->runcount == -1))
+- abort ();
+- lock->runcount = 0;
+- }
+- else
+- {
+- /* Drop a reader lock. */
+- if (!(lock->runcount > 0))
+- abort ();
+- lock->runcount--;
+- }
+- if (lock->runcount == 0)
+- {
+- /* POSIX recommends that "write locks shall take precedence over read
+- locks", to avoid "writer starvation". */
+- if (lock->waiting_writers.count > 0)
+- {
+- /* Wake up one of the waiting writers. */
+- lock->runcount--;
+- gl_waitqueue_notify_first (&lock->waiting_writers);
+- }
+- else
+- {
+- /* Wake up all waiting readers. */
+- lock->runcount += lock->waiting_readers.count;
+- gl_waitqueue_notify_all (&lock->waiting_readers);
+- }
+- }
+- LeaveCriticalSection (&lock->lock);
+-}
+-
+-void
+-glthread_rwlock_destroy (gl_rwlock_t *lock)
+-{
+- if (!lock->guard.done)
+- abort ();
+- if (lock->runcount != 0)
+- abort ();
+- DeleteCriticalSection (&lock->lock);
+- if (lock->waiting_readers.array != NULL)
+- free (lock->waiting_readers.array);
+- if (lock->waiting_writers.array != NULL)
+- free (lock->waiting_writers.array);
+- lock->guard.done = 0;
+-}
+-
+-/* --------------------- gl_recursive_lock_t datatype --------------------- */
+-
+-void
+-glthread_recursive_lock_init (gl_recursive_lock_t *lock)
+-{
+- lock->owner = 0;
+- lock->depth = 0;
+- InitializeCriticalSection (&lock->lock);
+- lock->guard.done = 1;
+-}
+-
+-void
+-glthread_recursive_lock_lock (gl_recursive_lock_t *lock)
+-{
+- if (!lock->guard.done)
+- {
+- if (InterlockedIncrement (&lock->guard.started) == 0)
+- /* This thread is the first one to need this lock. Initialize it. */
+- glthread_recursive_lock_init (lock);
+- else
+- /* Yield the CPU while waiting for another thread to finish
+- initializing this lock. */
+- while (!lock->guard.done)
+- Sleep (0);
+- }
+- {
+- DWORD self = GetCurrentThreadId ();
+- if (lock->owner != self)
+- {
+- EnterCriticalSection (&lock->lock);
+- lock->owner = self;
+- }
+- if (++(lock->depth) == 0) /* wraparound? */
+- abort ();
+- }
+-}
+-
+-void
+-glthread_recursive_lock_unlock (gl_recursive_lock_t *lock)
+-{
+- if (lock->owner != GetCurrentThreadId ())
+- abort ();
+- if (lock->depth == 0)
+- abort ();
+- if (--(lock->depth) == 0)
+- {
+- lock->owner = 0;
+- LeaveCriticalSection (&lock->lock);
+- }
+-}
+-
+-void
+-glthread_recursive_lock_destroy (gl_recursive_lock_t *lock)
+-{
+- if (lock->owner != 0)
+- abort ();
+- DeleteCriticalSection (&lock->lock);
+- lock->guard.done = 0;
+-}
+-
+-/* -------------------------- gl_once_t datatype -------------------------- */
+-
+-void
+-glthread_once (gl_once_t *once_control, void (*initfunction) (void))
+-{
+- if (once_control->inited <= 0)
+- {
+- if (InterlockedIncrement (&once_control->started) == 0)
+- {
+- /* This thread is the first one to come to this once_control. */
+- InitializeCriticalSection (&once_control->lock);
+- EnterCriticalSection (&once_control->lock);
+- once_control->inited = 0;
+- initfunction ();
+- once_control->inited = 1;
+- LeaveCriticalSection (&once_control->lock);
+- }
+- else
+- {
+- /* Undo last operation. */
+- InterlockedDecrement (&once_control->started);
+- /* Some other thread has already started the initialization.
+- Yield the CPU while waiting for the other thread to finish
+- initializing and taking the lock. */
+- while (once_control->inited < 0)
+- Sleep (0);
+- if (once_control->inited <= 0)
+- {
+- /* Take the lock. This blocks until the other thread has
+- finished calling the initfunction. */
+- EnterCriticalSection (&once_control->lock);
+- LeaveCriticalSection (&once_control->lock);
+- if (!(once_control->inited > 0))
+- abort ();
+- }
+- }
+- }
+-}
+-
+-#endif
+-
+-/* ========================================================================= */
+--- a/intl/lock.h
++++ /dev/null
+@@ -1,1105 +0,0 @@
+-/* Locking in multithreaded situations.
+- Copyright (C) 2005-2007 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 <bruno@clisp.org>, 2005.
+- Based on GCC's gthr-posix.h, gthr-posix95.h, gthr-solaris.h,
+- gthr-win32.h. */
+-
+-/* This file contains locking primitives for use with a given thread library.
+- It does not contain primitives for creating threads or for other
+- synchronization primitives.
+-
+- Normal (non-recursive) locks:
+- Type: gl_lock_t
+- Declaration: gl_lock_define(extern, name)
+- Initializer: gl_lock_define_initialized(, name)
+- Initialization: gl_lock_init (name);
+- Taking the lock: gl_lock_lock (name);
+- Releasing the lock: gl_lock_unlock (name);
+- De-initialization: gl_lock_destroy (name);
+-
+- Read-Write (non-recursive) locks:
+- Type: gl_rwlock_t
+- Declaration: gl_rwlock_define(extern, name)
+- Initializer: gl_rwlock_define_initialized(, name)
+- Initialization: gl_rwlock_init (name);
+- Taking the lock: gl_rwlock_rdlock (name);
+- gl_rwlock_wrlock (name);
+- Releasing the lock: gl_rwlock_unlock (name);
+- De-initialization: gl_rwlock_destroy (name);
+-
+- Recursive locks:
+- Type: gl_recursive_lock_t
+- Declaration: gl_recursive_lock_define(extern, name)
+- Initializer: gl_recursive_lock_define_initialized(, name)
+- Initialization: gl_recursive_lock_init (name);
+- Taking the lock: gl_recursive_lock_lock (name);
+- Releasing the lock: gl_recursive_lock_unlock (name);
+- De-initialization: gl_recursive_lock_destroy (name);
+-
+- Once-only execution:
+- Type: gl_once_t
+- Initializer: gl_once_define(extern, name)
+- Execution: gl_once (name, initfunction);
+-*/
+-
+-
+-#ifndef _LOCK_H
+-#define _LOCK_H
+-
+-/* ========================================================================= */
+-
+-#if USE_POSIX_THREADS
+-
+-/* Use the POSIX threads library. */
+-
+-# include <pthread.h>
+-# include <stdlib.h>
+-
+-# ifdef __cplusplus
+-extern "C" {
+-# endif
+-
+-# if PTHREAD_IN_USE_DETECTION_HARD
+-
+-/* The pthread_in_use() detection needs to be done at runtime. */
+-# define pthread_in_use() \
+- glthread_in_use ()
+-extern int glthread_in_use (void);
+-
+-# endif
+-
+-# if USE_POSIX_THREADS_WEAK
+-
+-/* Use weak references to the POSIX threads library. */
+-
+-/* Weak references avoid dragging in external libraries if the other parts
+- of the program don't use them. Here we use them, because we don't want
+- every program that uses libintl to depend on libpthread. This assumes
+- that libpthread would not be loaded after libintl; i.e. if libintl is
+- loaded first, by an executable that does not depend on libpthread, and
+- then a module is dynamically loaded that depends on libpthread, libintl
+- will not be multithread-safe. */
+-
+-/* The way to test at runtime whether libpthread is present is to test
+- whether a function pointer's value, such as &pthread_mutex_init, is
+- non-NULL. However, some versions of GCC have a bug through which, in
+- PIC mode, &foo != NULL always evaluates to true if there is a direct
+- call to foo(...) in the same function. To avoid this, we test the
+- address of a function in libpthread that we don't use. */
+-
+-# pragma weak pthread_mutex_init
+-# pragma weak pthread_mutex_lock
+-# pragma weak pthread_mutex_unlock
+-# pragma weak pthread_mutex_destroy
+-# pragma weak pthread_rwlock_init
+-# pragma weak pthread_rwlock_rdlock
+-# pragma weak pthread_rwlock_wrlock
+-# pragma weak pthread_rwlock_unlock
+-# pragma weak pthread_rwlock_destroy
+-# pragma weak pthread_once
+-# pragma weak pthread_cond_init
+-# pragma weak pthread_cond_wait
+-# pragma weak pthread_cond_signal
+-# pragma weak pthread_cond_broadcast
+-# pragma weak pthread_cond_destroy
+-# pragma weak pthread_mutexattr_init
+-# pragma weak pthread_mutexattr_settype
+-# pragma weak pthread_mutexattr_destroy
+-# ifndef pthread_self
+-# pragma weak pthread_self
+-# endif
+-
+-# if !PTHREAD_IN_USE_DETECTION_HARD
+-# pragma weak pthread_cancel
+-# define pthread_in_use() (pthread_cancel != NULL)
+-# endif
+-
+-# else
+-
+-# if !PTHREAD_IN_USE_DETECTION_HARD
+-# define pthread_in_use() 1
+-# endif
+-
+-# endif
+-
+-/* -------------------------- gl_lock_t datatype -------------------------- */
+-
+-typedef pthread_mutex_t gl_lock_t;
+-# define gl_lock_define(STORAGECLASS, NAME) \
+- STORAGECLASS pthread_mutex_t NAME;
+-# define gl_lock_define_initialized(STORAGECLASS, NAME) \
+- STORAGECLASS pthread_mutex_t NAME = gl_lock_initializer;
+-# define gl_lock_initializer \
+- PTHREAD_MUTEX_INITIALIZER
+-# define gl_lock_init(NAME) \
+- do \
+- { \
+- if (pthread_in_use () && pthread_mutex_init (&NAME, NULL) != 0) \
+- abort (); \
+- } \
+- while (0)
+-# define gl_lock_lock(NAME) \
+- do \
+- { \
+- if (pthread_in_use () && pthread_mutex_lock (&NAME) != 0) \
+- abort (); \
+- } \
+- while (0)
+-# define gl_lock_unlock(NAME) \
+- do \
+- { \
+- if (pthread_in_use () && pthread_mutex_unlock (&NAME) != 0) \
+- abort (); \
+- } \
+- while (0)
+-# define gl_lock_destroy(NAME) \
+- do \
+- { \
+- if (pthread_in_use () && pthread_mutex_destroy (&NAME) != 0) \
+- abort (); \
+- } \
+- while (0)
+-
+-/* ------------------------- gl_rwlock_t datatype ------------------------- */
+-
+-# if HAVE_PTHREAD_RWLOCK
+-
+-# ifdef PTHREAD_RWLOCK_INITIALIZER
+-
+-typedef pthread_rwlock_t gl_rwlock_t;
+-# define gl_rwlock_define(STORAGECLASS, NAME) \
+- STORAGECLASS pthread_rwlock_t NAME;
+-# define gl_rwlock_define_initialized(STORAGECLASS, NAME) \
+- STORAGECLASS pthread_rwlock_t NAME = gl_rwlock_initializer;
+-# define gl_rwlock_initializer \
+- PTHREAD_RWLOCK_INITIALIZER
+-# define gl_rwlock_init(NAME) \
+- do \
+- { \
+- if (pthread_in_use () && pthread_rwlock_init (&NAME, NULL) != 0) \
+- abort (); \
+- } \
+- while (0)
+-# define gl_rwlock_rdlock(NAME) \
+- do \
+- { \
+- if (pthread_in_use () && pthread_rwlock_rdlock (&NAME) != 0) \
+- abort (); \
+- } \
+- while (0)
+-# define gl_rwlock_wrlock(NAME) \
+- do \
+- { \
+- if (pthread_in_use () && pthread_rwlock_wrlock (&NAME) != 0) \
+- abort (); \
+- } \
+- while (0)
+-# define gl_rwlock_unlock(NAME) \
+- do \
+- { \
+- if (pthread_in_use () && pthread_rwlock_unlock (&NAME) != 0) \
+- abort (); \
+- } \
+- while (0)
+-# define gl_rwlock_destroy(NAME) \
+- do \
+- { \
+- if (pthread_in_use () && pthread_rwlock_destroy (&NAME) != 0) \
+- abort (); \
+- } \
+- while (0)
+-
+-# else
+-
+-typedef struct
+- {
+- int initialized;
+- pthread_mutex_t guard; /* protects the initialization */
+- pthread_rwlock_t rwlock; /* read-write lock */
+- }
+- gl_rwlock_t;
+-# define gl_rwlock_define(STORAGECLASS, NAME) \
+- STORAGECLASS gl_rwlock_t NAME;
+-# define gl_rwlock_define_initialized(STORAGECLASS, NAME) \
+- STORAGECLASS gl_rwlock_t NAME = gl_rwlock_initializer;
+-# define gl_rwlock_initializer \
+- { 0, PTHREAD_MUTEX_INITIALIZER }
+-# define gl_rwlock_init(NAME) \
+- do \
+- { \
+- if (pthread_in_use ()) \
+- glthread_rwlock_init (&NAME); \
+- } \
+- while (0)
+-# define gl_rwlock_rdlock(NAME) \
+- do \
+- { \
+- if (pthread_in_use ()) \
+- glthread_rwlock_rdlock (&NAME); \
+- } \
+- while (0)
+-# define gl_rwlock_wrlock(NAME) \
+- do \
+- { \
+- if (pthread_in_use ()) \
+- glthread_rwlock_wrlock (&NAME); \
+- } \
+- while (0)
+-# define gl_rwlock_unlock(NAME) \
+- do \
+- { \
+- if (pthread_in_use ()) \
+- glthread_rwlock_unlock (&NAME); \
+- } \
+- while (0)
+-# define gl_rwlock_destroy(NAME) \
+- do \
+- { \
+- if (pthread_in_use ()) \
+- glthread_rwlock_destroy (&NAME); \
+- } \
+- while (0)
+-extern void glthread_rwlock_init (gl_rwlock_t *lock);
+-extern void glthread_rwlock_rdlock (gl_rwlock_t *lock);
+-extern void glthread_rwlock_wrlock (gl_rwlock_t *lock);
+-extern void glthread_rwlock_unlock (gl_rwlock_t *lock);
+-extern void glthread_rwlock_destroy (gl_rwlock_t *lock);
+-
+-# endif
+-
+-# else
+-
+-typedef struct
+- {
+- pthread_mutex_t lock; /* protects the remaining fields */
+- pthread_cond_t waiting_readers; /* waiting readers */
+- pthread_cond_t waiting_writers; /* waiting writers */
+- unsigned int waiting_writers_count; /* number of waiting writers */
+- int runcount; /* number of readers running, or -1 when a writer runs */
+- }
+- gl_rwlock_t;
+-# define gl_rwlock_define(STORAGECLASS, NAME) \
+- STORAGECLASS gl_rwlock_t NAME;
+-# define gl_rwlock_define_initialized(STORAGECLASS, NAME) \
+- STORAGECLASS gl_rwlock_t NAME = gl_rwlock_initializer;
+-# define gl_rwlock_initializer \
+- { PTHREAD_MUTEX_INITIALIZER, PTHREAD_COND_INITIALIZER, PTHREAD_COND_INITIALIZER, 0, 0 }
+-# define gl_rwlock_init(NAME) \
+- do \
+- { \
+- if (pthread_in_use ()) \
+- glthread_rwlock_init (&NAME); \
+- } \
+- while (0)
+-# define gl_rwlock_rdlock(NAME) \
+- do \
+- { \
+- if (pthread_in_use ()) \
+- glthread_rwlock_rdlock (&NAME); \
+- } \
+- while (0)
+-# define gl_rwlock_wrlock(NAME) \
+- do \
+- { \
+- if (pthread_in_use ()) \
+- glthread_rwlock_wrlock (&NAME); \
+- } \
+- while (0)
+-# define gl_rwlock_unlock(NAME) \
+- do \
+- { \
+- if (pthread_in_use ()) \
+- glthread_rwlock_unlock (&NAME); \
+- } \
+- while (0)
+-# define gl_rwlock_destroy(NAME) \
+- do \
+- { \
+- if (pthread_in_use ()) \
+- glthread_rwlock_destroy (&NAME); \
+- } \
+- while (0)
+-extern void glthread_rwlock_init (gl_rwlock_t *lock);
+-extern void glthread_rwlock_rdlock (gl_rwlock_t *lock);
+-extern void glthread_rwlock_wrlock (gl_rwlock_t *lock);
+-extern void glthread_rwlock_unlock (gl_rwlock_t *lock);
+-extern void glthread_rwlock_destroy (gl_rwlock_t *lock);
+-
+-# endif
+-
+-/* --------------------- gl_recursive_lock_t datatype --------------------- */
+-
+-# if HAVE_PTHREAD_MUTEX_RECURSIVE
+-
+-# if defined PTHREAD_RECURSIVE_MUTEX_INITIALIZER || defined PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP
+-
+-typedef pthread_mutex_t gl_recursive_lock_t;
+-# define gl_recursive_lock_define(STORAGECLASS, NAME) \
+- STORAGECLASS pthread_mutex_t NAME;
+-# define gl_recursive_lock_define_initialized(STORAGECLASS, NAME) \
+- STORAGECLASS pthread_mutex_t NAME = gl_recursive_lock_initializer;
+-# ifdef PTHREAD_RECURSIVE_MUTEX_INITIALIZER
+-# define gl_recursive_lock_initializer \
+- PTHREAD_RECURSIVE_MUTEX_INITIALIZER
+-# else
+-# define gl_recursive_lock_initializer \
+- PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP
+-# endif
+-# define gl_recursive_lock_init(NAME) \
+- do \
+- { \
+- if (pthread_in_use () && pthread_mutex_init (&NAME, NULL) != 0) \
+- abort (); \
+- } \
+- while (0)
+-# define gl_recursive_lock_lock(NAME) \
+- do \
+- { \
+- if (pthread_in_use () && pthread_mutex_lock (&NAME) != 0) \
+- abort (); \
+- } \
+- while (0)
+-# define gl_recursive_lock_unlock(NAME) \
+- do \
+- { \
+- if (pthread_in_use () && pthread_mutex_unlock (&NAME) != 0) \
+- abort (); \
+- } \
+- while (0)
+-# define gl_recursive_lock_destroy(NAME) \
+- do \
+- { \
+- if (pthread_in_use () && pthread_mutex_destroy (&NAME) != 0) \
+- abort (); \
+- } \
+- while (0)
+-
+-# else
+-
+-typedef struct
+- {
+- pthread_mutex_t recmutex; /* recursive mutex */
+- pthread_mutex_t guard; /* protects the initialization */
+- int initialized;
+- }
+- gl_recursive_lock_t;
+-# define gl_recursive_lock_define(STORAGECLASS, NAME) \
+- STORAGECLASS gl_recursive_lock_t NAME;
+-# define gl_recursive_lock_define_initialized(STORAGECLASS, NAME) \
+- STORAGECLASS gl_recursive_lock_t NAME = gl_recursive_lock_initializer;
+-# define gl_recursive_lock_initializer \
+- { PTHREAD_MUTEX_INITIALIZER, PTHREAD_MUTEX_INITIALIZER, 0 }
+-# define gl_recursive_lock_init(NAME) \
+- do \
+- { \
+- if (pthread_in_use ()) \
+- glthread_recursive_lock_init (&NAME); \
+- } \
+- while (0)
+-# define gl_recursive_lock_lock(NAME) \
+- do \
+- { \
+- if (pthread_in_use ()) \
+- glthread_recursive_lock_lock (&NAME); \
+- } \
+- while (0)
+-# define gl_recursive_lock_unlock(NAME) \
+- do \
+- { \
+- if (pthread_in_use ()) \
+- glthread_recursive_lock_unlock (&NAME); \
+- } \
+- while (0)
+-# define gl_recursive_lock_destroy(NAME) \
+- do \
+- { \
+- if (pthread_in_use ()) \
+- glthread_recursive_lock_destroy (&NAME); \
+- } \
+- while (0)
+-extern void glthread_recursive_lock_init (gl_recursive_lock_t *lock);
+-extern void glthread_recursive_lock_lock (gl_recursive_lock_t *lock);
+-extern void glthread_recursive_lock_unlock (gl_recursive_lock_t *lock);
+-extern void glthread_recursive_lock_destroy (gl_recursive_lock_t *lock);
+-
+-# endif
+-
+-# else
+-
+-/* Old versions of POSIX threads on Solaris did not have recursive locks.
+- We have to implement them ourselves. */
+-
+-typedef struct
+- {
+- pthread_mutex_t mutex;
+- pthread_t owner;
+- unsigned long depth;
+- }
+- gl_recursive_lock_t;
+-# define gl_recursive_lock_define(STORAGECLASS, NAME) \
+- STORAGECLASS gl_recursive_lock_t NAME;
+-# define gl_recursive_lock_define_initialized(STORAGECLASS, NAME) \
+- STORAGECLASS gl_recursive_lock_t NAME = gl_recursive_lock_initializer;
+-# define gl_recursive_lock_initializer \
+- { PTHREAD_MUTEX_INITIALIZER, (pthread_t) 0, 0 }
+-# define gl_recursive_lock_init(NAME) \
+- do \
+- { \
+- if (pthread_in_use ()) \
+- glthread_recursive_lock_init (&NAME); \
+- } \
+- while (0)
+-# define gl_recursive_lock_lock(NAME) \
+- do \
+- { \
+- if (pthread_in_use ()) \
+- glthread_recursive_lock_lock (&NAME); \
+- } \
+- while (0)
+-# define gl_recursive_lock_unlock(NAME) \
+- do \
+- { \
+- if (pthread_in_use ()) \
+- glthread_recursive_lock_unlock (&NAME); \
+- } \
+- while (0)
+-# define gl_recursive_lock_destroy(NAME) \
+- do \
+- { \
+- if (pthread_in_use ()) \
+- glthread_recursive_lock_destroy (&NAME); \
+- } \
+- while (0)
+-extern void glthread_recursive_lock_init (gl_recursive_lock_t *lock);
+-extern void glthread_recursive_lock_lock (gl_recursive_lock_t *lock);
+-extern void glthread_recursive_lock_unlock (gl_recursive_lock_t *lock);
+-extern void glthread_recursive_lock_destroy (gl_recursive_lock_t *lock);
+-
+-# endif
+-
+-/* -------------------------- gl_once_t datatype -------------------------- */
+-
+-typedef pthread_once_t gl_once_t;
+-# define gl_once_define(STORAGECLASS, NAME) \
+- STORAGECLASS pthread_once_t NAME = PTHREAD_ONCE_INIT;
+-# define gl_once(NAME, INITFUNCTION) \
+- do \
+- { \
+- if (pthread_in_use ()) \
+- { \
+- if (pthread_once (&NAME, INITFUNCTION) != 0) \
+- abort (); \
+- } \
+- else \
+- { \
+- if (glthread_once_singlethreaded (&NAME)) \
+- INITFUNCTION (); \
+- } \
+- } \
+- while (0)
+-extern int glthread_once_singlethreaded (pthread_once_t *once_control);
+-
+-# ifdef __cplusplus
+-}
+-# endif
+-
+-#endif
+-
+-/* ========================================================================= */
+-
+-#if USE_PTH_THREADS
+-
+-/* Use the GNU Pth threads library. */
+-
+-# include <pth.h>
+-# include <stdlib.h>
+-
+-# ifdef __cplusplus
+-extern "C" {
+-# endif
+-
+-# if USE_PTH_THREADS_WEAK
+-
+-/* Use weak references to the GNU Pth threads library. */
+-
+-# pragma weak pth_mutex_init
+-# pragma weak pth_mutex_acquire
+-# pragma weak pth_mutex_release
+-# pragma weak pth_rwlock_init
+-# pragma weak pth_rwlock_acquire
+-# pragma weak pth_rwlock_release
+-# pragma weak pth_once
+-
+-# pragma weak pth_cancel
+-# define pth_in_use() (pth_cancel != NULL)
+-
+-# else
+-
+-# define pth_in_use() 1
+-
+-# endif
+-
+-/* -------------------------- gl_lock_t datatype -------------------------- */
+-
+-typedef pth_mutex_t gl_lock_t;
+-# define gl_lock_define(STORAGECLASS, NAME) \
+- STORAGECLASS pth_mutex_t NAME;
+-# define gl_lock_define_initialized(STORAGECLASS, NAME) \
+- STORAGECLASS pth_mutex_t NAME = gl_lock_initializer;
+-# define gl_lock_initializer \
+- PTH_MUTEX_INIT
+-# define gl_lock_init(NAME) \
+- do \
+- { \
+- if (pth_in_use() && !pth_mutex_init (&NAME)) \
+- abort (); \
+- } \
+- while (0)
+-# define gl_lock_lock(NAME) \
+- do \
+- { \
+- if (pth_in_use() && !pth_mutex_acquire (&NAME, 0, NULL)) \
+- abort (); \
+- } \
+- while (0)
+-# define gl_lock_unlock(NAME) \
+- do \
+- { \
+- if (pth_in_use() && !pth_mutex_release (&NAME)) \
+- abort (); \
+- } \
+- while (0)
+-# define gl_lock_destroy(NAME) \
+- (void)(&NAME)
+-
+-/* ------------------------- gl_rwlock_t datatype ------------------------- */
+-
+-typedef pth_rwlock_t gl_rwlock_t;
+-# define gl_rwlock_define(STORAGECLASS, NAME) \
+- STORAGECLASS pth_rwlock_t NAME;
+-# define gl_rwlock_define_initialized(STORAGECLASS, NAME) \
+- STORAGECLASS pth_rwlock_t NAME = gl_rwlock_initializer;
+-# define gl_rwlock_initializer \
+- PTH_RWLOCK_INIT
+-# define gl_rwlock_init(NAME) \
+- do \
+- { \
+- if (pth_in_use() && !pth_rwlock_init (&NAME)) \
+- abort (); \
+- } \
+- while (0)
+-# define gl_rwlock_rdlock(NAME) \
+- do \
+- { \
+- if (pth_in_use() \
+- && !pth_rwlock_acquire (&NAME, PTH_RWLOCK_RD, 0, NULL)) \
+- abort (); \
+- } \
+- while (0)
+-# define gl_rwlock_wrlock(NAME) \
+- do \
+- { \
+- if (pth_in_use() \
+- && !pth_rwlock_acquire (&NAME, PTH_RWLOCK_RW, 0, NULL)) \
+- abort (); \
+- } \
+- while (0)
+-# define gl_rwlock_unlock(NAME) \
+- do \
+- { \
+- if (pth_in_use() && !pth_rwlock_release (&NAME)) \
+- abort (); \
+- } \
+- while (0)
+-# define gl_rwlock_destroy(NAME) \
+- (void)(&NAME)
+-
+-/* --------------------- gl_recursive_lock_t datatype --------------------- */
+-
+-/* In Pth, mutexes are recursive by default. */
+-typedef pth_mutex_t gl_recursive_lock_t;
+-# define gl_recursive_lock_define(STORAGECLASS, NAME) \
+- STORAGECLASS pth_mutex_t NAME;
+-# define gl_recursive_lock_define_initialized(STORAGECLASS, NAME) \
+- STORAGECLASS pth_mutex_t NAME = gl_recursive_lock_initializer;
+-# define gl_recursive_lock_initializer \
+- PTH_MUTEX_INIT
+-# define gl_recursive_lock_init(NAME) \
+- do \
+- { \
+- if (pth_in_use() && !pth_mutex_init (&NAME)) \
+- abort (); \
+- } \
+- while (0)
+-# define gl_recursive_lock_lock(NAME) \
+- do \
+- { \
+- if (pth_in_use() && !pth_mutex_acquire (&NAME, 0, NULL)) \
+- abort (); \
+- } \
+- while (0)
+-# define gl_recursive_lock_unlock(NAME) \
+- do \
+- { \
+- if (pth_in_use() && !pth_mutex_release (&NAME)) \
+- abort (); \
+- } \
+- while (0)
+-# define gl_recursive_lock_destroy(NAME) \
+- (void)(&NAME)
+-
+-/* -------------------------- gl_once_t datatype -------------------------- */
+-
+-typedef pth_once_t gl_once_t;
+-# define gl_once_define(STORAGECLASS, NAME) \
+- STORAGECLASS pth_once_t NAME = PTH_ONCE_INIT;
+-# define gl_once(NAME, INITFUNCTION) \
+- do \
+- { \
+- if (pth_in_use ()) \
+- { \
+- void (*gl_once_temp) (void) = INITFUNCTION; \
+- if (!pth_once (&NAME, glthread_once_call, &gl_once_temp)) \
+- abort (); \
+- } \
+- else \
+- { \
+- if (glthread_once_singlethreaded (&NAME)) \
+- INITFUNCTION (); \
+- } \
+- } \
+- while (0)
+-extern void glthread_once_call (void *arg);
+-extern int glthread_once_singlethreaded (pth_once_t *once_control);
+-
+-# ifdef __cplusplus
+-}
+-# endif
+-
+-#endif
+-
+-/* ========================================================================= */
+-
+-#if USE_SOLARIS_THREADS
+-
+-/* Use the old Solaris threads library. */
+-
+-# include <thread.h>
+-# include <synch.h>
+-# include <stdlib.h>
+-
+-# ifdef __cplusplus
+-extern "C" {
+-# endif
+-
+-# if USE_SOLARIS_THREADS_WEAK
+-
+-/* Use weak references to the old Solaris threads library. */
+-
+-# pragma weak mutex_init
+-# pragma weak mutex_lock
+-# pragma weak mutex_unlock
+-# pragma weak mutex_destroy
+-# pragma weak rwlock_init
+-# pragma weak rw_rdlock
+-# pragma weak rw_wrlock
+-# pragma weak rw_unlock
+-# pragma weak rwlock_destroy
+-# pragma weak thr_self
+-
+-# pragma weak thr_suspend
+-# define thread_in_use() (thr_suspend != NULL)
+-
+-# else
+-
+-# define thread_in_use() 1
+-
+-# endif
+-
+-/* -------------------------- gl_lock_t datatype -------------------------- */
+-
+-typedef mutex_t gl_lock_t;
+-# define gl_lock_define(STORAGECLASS, NAME) \
+- STORAGECLASS mutex_t NAME;
+-# define gl_lock_define_initialized(STORAGECLASS, NAME) \
+- STORAGECLASS mutex_t NAME = gl_lock_initializer;
+-# define gl_lock_initializer \
+- DEFAULTMUTEX
+-# define gl_lock_init(NAME) \
+- do \
+- { \
+- if (thread_in_use () && mutex_init (&NAME, USYNC_THREAD, NULL) != 0) \
+- abort (); \
+- } \
+- while (0)
+-# define gl_lock_lock(NAME) \
+- do \
+- { \
+- if (thread_in_use () && mutex_lock (&NAME) != 0) \
+- abort (); \
+- } \
+- while (0)
+-# define gl_lock_unlock(NAME) \
+- do \
+- { \
+- if (thread_in_use () && mutex_unlock (&NAME) != 0) \
+- abort (); \
+- } \
+- while (0)
+-# define gl_lock_destroy(NAME) \
+- do \
+- { \
+- if (thread_in_use () && mutex_destroy (&NAME) != 0) \
+- abort (); \
+- } \
+- while (0)
+-
+-/* ------------------------- gl_rwlock_t datatype ------------------------- */
+-
+-typedef rwlock_t gl_rwlock_t;
+-# define gl_rwlock_define(STORAGECLASS, NAME) \
+- STORAGECLASS rwlock_t NAME;
+-# define gl_rwlock_define_initialized(STORAGECLASS, NAME) \
+- STORAGECLASS rwlock_t NAME = gl_rwlock_initializer;
+-# define gl_rwlock_initializer \
+- DEFAULTRWLOCK
+-# define gl_rwlock_init(NAME) \
+- do \
+- { \
+- if (thread_in_use () && rwlock_init (&NAME, USYNC_THREAD, NULL) != 0) \
+- abort (); \
+- } \
+- while (0)
+-# define gl_rwlock_rdlock(NAME) \
+- do \
+- { \
+- if (thread_in_use () && rw_rdlock (&NAME) != 0) \
+- abort (); \
+- } \
+- while (0)
+-# define gl_rwlock_wrlock(NAME) \
+- do \
+- { \
+- if (thread_in_use () && rw_wrlock (&NAME) != 0) \
+- abort (); \
+- } \
+- while (0)
+-# define gl_rwlock_unlock(NAME) \
+- do \
+- { \
+- if (thread_in_use () && rw_unlock (&NAME) != 0) \
+- abort (); \
+- } \
+- while (0)
+-# define gl_rwlock_destroy(NAME) \
+- do \
+- { \
+- if (thread_in_use () && rwlock_destroy (&NAME) != 0) \
+- abort (); \
+- } \
+- while (0)
+-
+-/* --------------------- gl_recursive_lock_t datatype --------------------- */
+-
+-/* Old Solaris threads did not have recursive locks.
+- We have to implement them ourselves. */
+-
+-typedef struct
+- {
+- mutex_t mutex;
+- thread_t owner;
+- unsigned long depth;
+- }
+- gl_recursive_lock_t;
+-# define gl_recursive_lock_define(STORAGECLASS, NAME) \
+- STORAGECLASS gl_recursive_lock_t NAME;
+-# define gl_recursive_lock_define_initialized(STORAGECLASS, NAME) \
+- STORAGECLASS gl_recursive_lock_t NAME = gl_recursive_lock_initializer;
+-# define gl_recursive_lock_initializer \
+- { DEFAULTMUTEX, (thread_t) 0, 0 }
+-# define gl_recursive_lock_init(NAME) \
+- do \
+- { \
+- if (thread_in_use ()) \
+- glthread_recursive_lock_init (&NAME); \
+- } \
+- while (0)
+-# define gl_recursive_lock_lock(NAME) \
+- do \
+- { \
+- if (thread_in_use ()) \
+- glthread_recursive_lock_lock (&NAME); \
+- } \
+- while (0)
+-# define gl_recursive_lock_unlock(NAME) \
+- do \
+- { \
+- if (thread_in_use ()) \
+- glthread_recursive_lock_unlock (&NAME); \
+- } \
+- while (0)
+-# define gl_recursive_lock_destroy(NAME) \
+- do \
+- { \
+- if (thread_in_use ()) \
+- glthread_recursive_lock_destroy (&NAME); \
+- } \
+- while (0)
+-extern void glthread_recursive_lock_init (gl_recursive_lock_t *lock);
+-extern void glthread_recursive_lock_lock (gl_recursive_lock_t *lock);
+-extern void glthread_recursive_lock_unlock (gl_recursive_lock_t *lock);
+-extern void glthread_recursive_lock_destroy (gl_recursive_lock_t *lock);
+-
+-/* -------------------------- gl_once_t datatype -------------------------- */
+-
+-typedef struct
+- {
+- volatile int inited;
+- mutex_t mutex;
+- }
+- gl_once_t;
+-# define gl_once_define(STORAGECLASS, NAME) \
+- STORAGECLASS gl_once_t NAME = { 0, DEFAULTMUTEX };
+-# define gl_once(NAME, INITFUNCTION) \
+- do \
+- { \
+- if (thread_in_use ()) \
+- { \
+- glthread_once (&NAME, INITFUNCTION); \
+- } \
+- else \
+- { \
+- if (glthread_once_singlethreaded (&NAME)) \
+- INITFUNCTION (); \
+- } \
+- } \
+- while (0)
+-extern void glthread_once (gl_once_t *once_control, void (*initfunction) (void));
+-extern int glthread_once_singlethreaded (gl_once_t *once_control);
+-
+-# ifdef __cplusplus
+-}
+-# endif
+-
+-#endif
+-
+-/* ========================================================================= */
+-
+-#if USE_WIN32_THREADS
+-
+-# include <windows.h>
+-
+-# ifdef __cplusplus
+-extern "C" {
+-# endif
+-
+-/* We can use CRITICAL_SECTION directly, rather than the Win32 Event, Mutex,
+- Semaphore types, because
+- - we need only to synchronize inside a single process (address space),
+- not inter-process locking,
+- - we don't need to support trylock operations. (TryEnterCriticalSection
+- does not work on Windows 95/98/ME. Packages that need trylock usually
+- define their own mutex type.) */
+-
+-/* There is no way to statically initialize a CRITICAL_SECTION. It needs
+- to be done lazily, once only. For this we need spinlocks. */
+-
+-typedef struct { volatile int done; volatile long started; } gl_spinlock_t;
+-
+-/* -------------------------- gl_lock_t datatype -------------------------- */
+-
+-typedef struct
+- {
+- gl_spinlock_t guard; /* protects the initialization */
+- CRITICAL_SECTION lock;
+- }
+- gl_lock_t;
+-# define gl_lock_define(STORAGECLASS, NAME) \
+- STORAGECLASS gl_lock_t NAME;
+-# define gl_lock_define_initialized(STORAGECLASS, NAME) \
+- STORAGECLASS gl_lock_t NAME = gl_lock_initializer;
+-# define gl_lock_initializer \
+- { { 0, -1 } }
+-# define gl_lock_init(NAME) \
+- glthread_lock_init (&NAME)
+-# define gl_lock_lock(NAME) \
+- glthread_lock_lock (&NAME)
+-# define gl_lock_unlock(NAME) \
+- glthread_lock_unlock (&NAME)
+-# define gl_lock_destroy(NAME) \
+- glthread_lock_destroy (&NAME)
+-extern void glthread_lock_init (gl_lock_t *lock);
+-extern void glthread_lock_lock (gl_lock_t *lock);
+-extern void glthread_lock_unlock (gl_lock_t *lock);
+-extern void glthread_lock_destroy (gl_lock_t *lock);
+-
+-/* ------------------------- gl_rwlock_t datatype ------------------------- */
+-
+-/* It is impossible to implement read-write locks using plain locks, without
+- introducing an extra thread dedicated to managing read-write locks.
+- Therefore here we need to use the low-level Event type. */
+-
+-typedef struct
+- {
+- HANDLE *array; /* array of waiting threads, each represented by an event */
+- unsigned int count; /* number of waiting threads */
+- unsigned int alloc; /* length of allocated array */
+- unsigned int offset; /* index of first waiting thread in array */
+- }
+- gl_waitqueue_t;
+-typedef struct
+- {
+- gl_spinlock_t guard; /* protects the initialization */
+- CRITICAL_SECTION lock; /* protects the remaining fields */
+- gl_waitqueue_t waiting_readers; /* waiting readers */
+- gl_waitqueue_t waiting_writers; /* waiting writers */
+- int runcount; /* number of readers running, or -1 when a writer runs */
+- }
+- gl_rwlock_t;
+-# define gl_rwlock_define(STORAGECLASS, NAME) \
+- STORAGECLASS gl_rwlock_t NAME;
+-# define gl_rwlock_define_initialized(STORAGECLASS, NAME) \
+- STORAGECLASS gl_rwlock_t NAME = gl_rwlock_initializer;
+-# define gl_rwlock_initializer \
+- { { 0, -1 } }
+-# define gl_rwlock_init(NAME) \
+- glthread_rwlock_init (&NAME)
+-# define gl_rwlock_rdlock(NAME) \
+- glthread_rwlock_rdlock (&NAME)
+-# define gl_rwlock_wrlock(NAME) \
+- glthread_rwlock_wrlock (&NAME)
+-# define gl_rwlock_unlock(NAME) \
+- glthread_rwlock_unlock (&NAME)
+-# define gl_rwlock_destroy(NAME) \
+- glthread_rwlock_destroy (&NAME)
+-extern void glthread_rwlock_init (gl_rwlock_t *lock);
+-extern void glthread_rwlock_rdlock (gl_rwlock_t *lock);
+-extern void glthread_rwlock_wrlock (gl_rwlock_t *lock);
+-extern void glthread_rwlock_unlock (gl_rwlock_t *lock);
+-extern void glthread_rwlock_destroy (gl_rwlock_t *lock);
+-
+-/* --------------------- gl_recursive_lock_t datatype --------------------- */
+-
+-/* The Win32 documentation says that CRITICAL_SECTION already implements a
+- recursive lock. But we need not rely on it: It's easy to implement a
+- recursive lock without this assumption. */
+-
+-typedef struct
+- {
+- gl_spinlock_t guard; /* protects the initialization */
+- DWORD owner;
+- unsigned long depth;
+- CRITICAL_SECTION lock;
+- }
+- gl_recursive_lock_t;
+-# define gl_recursive_lock_define(STORAGECLASS, NAME) \
+- STORAGECLASS gl_recursive_lock_t NAME;
+-# define gl_recursive_lock_define_initialized(STORAGECLASS, NAME) \
+- STORAGECLASS gl_recursive_lock_t NAME = gl_recursive_lock_initializer;
+-# define gl_recursive_lock_initializer \
+- { { 0, -1 }, 0, 0 }
+-# define gl_recursive_lock_init(NAME) \
+- glthread_recursive_lock_init (&NAME)
+-# define gl_recursive_lock_lock(NAME) \
+- glthread_recursive_lock_lock (&NAME)
+-# define gl_recursive_lock_unlock(NAME) \
+- glthread_recursive_lock_unlock (&NAME)
+-# define gl_recursive_lock_destroy(NAME) \
+- glthread_recursive_lock_destroy (&NAME)
+-extern void glthread_recursive_lock_init (gl_recursive_lock_t *lock);
+-extern void glthread_recursive_lock_lock (gl_recursive_lock_t *lock);
+-extern void glthread_recursive_lock_unlock (gl_recursive_lock_t *lock);
+-extern void glthread_recursive_lock_destroy (gl_recursive_lock_t *lock);
+-
+-/* -------------------------- gl_once_t datatype -------------------------- */
+-
+-typedef struct
+- {
+- volatile int inited;
+- volatile long started;
+- CRITICAL_SECTION lock;
+- }
+- gl_once_t;
+-# define gl_once_define(STORAGECLASS, NAME) \
+- STORAGECLASS gl_once_t NAME = { -1, -1 };
+-# define gl_once(NAME, INITFUNCTION) \
+- glthread_once (&NAME, INITFUNCTION)
+-extern void glthread_once (gl_once_t *once_control, void (*initfunction) (void));
+-
+-# ifdef __cplusplus
+-}
+-# endif
+-
+-#endif
+-
+-/* ========================================================================= */
+-
+-#if !(USE_POSIX_THREADS || USE_PTH_THREADS || USE_SOLARIS_THREADS || USE_WIN32_THREADS)
+-
+-/* Provide dummy implementation if threads are not supported. */
+-
+-/* -------------------------- gl_lock_t datatype -------------------------- */
+-
+-typedef int gl_lock_t;
+-# define gl_lock_define(STORAGECLASS, NAME)
+-# define gl_lock_define_initialized(STORAGECLASS, NAME)
+-# define gl_lock_init(NAME)
+-# define gl_lock_lock(NAME)
+-# define gl_lock_unlock(NAME)
+-
+-/* ------------------------- gl_rwlock_t datatype ------------------------- */
+-
+-typedef int gl_rwlock_t;
+-# define gl_rwlock_define(STORAGECLASS, NAME)
+-# define gl_rwlock_define_initialized(STORAGECLASS, NAME)
+-# define gl_rwlock_init(NAME)
+-# define gl_rwlock_rdlock(NAME)
+-# define gl_rwlock_wrlock(NAME)
+-# define gl_rwlock_unlock(NAME)
+-
+-/* --------------------- gl_recursive_lock_t datatype --------------------- */
+-
+-typedef int gl_recursive_lock_t;
+-# define gl_recursive_lock_define(STORAGECLASS, NAME)
+-# define gl_recursive_lock_define_initialized(STORAGECLASS, NAME)
+-# define gl_recursive_lock_init(NAME)
+-# define gl_recursive_lock_lock(NAME)
+-# define gl_recursive_lock_unlock(NAME)
+-
+-/* -------------------------- gl_once_t datatype -------------------------- */
+-
+-typedef int gl_once_t;
+-# define gl_once_define(STORAGECLASS, NAME) \
+- STORAGECLASS gl_once_t NAME = 0;
+-# define gl_once(NAME, INITFUNCTION) \
+- do \
+- { \
+- if (NAME == 0) \
+- { \
+- NAME = ~ 0; \
+- INITFUNCTION (); \
+- } \
+- } \
+- while (0)
+-
+-#endif
+-
+-/* ========================================================================= */
+-
+-#endif /* _LOCK_H */
+--- a/intl/log.c
++++ /dev/null
+@@ -1,116 +0,0 @@
+-/* Log file output.
+- Copyright (C) 2003, 2005 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 <bruno@clisp.org>. */
+-
+-#ifdef HAVE_CONFIG_H
+-# include <config.h>
+-#endif
+-
+-#include <stdio.h>
+-#include <stdlib.h>
+-#include <string.h>
+-
+-/* Handle multi-threaded applications. */
+-#ifdef _LIBC
+-# include <bits/libc-lock.h>
+-#else
+-# include "lock.h"
+-#endif
+-
+-/* Print an ASCII string with quotes and escape sequences where needed. */
+-static void
+-print_escaped (FILE *stream, const char *str)
+-{
+- putc ('"', stream);
+- for (; *str != '\0'; str++)
+- if (*str == '\n')
+- {
+- fputs ("\\n\"", stream);
+- if (str[1] == '\0')
+- return;
+- fputs ("\n\"", stream);
+- }
+- else
+- {
+- if (*str == '"' || *str == '\\')
+- putc ('\\', stream);
+- putc (*str, stream);
+- }
+- putc ('"', stream);
+-}
+-
+-static char *last_logfilename = NULL;
+-static FILE *last_logfile = NULL;
+-__libc_lock_define_initialized (static, lock)
+-
+-static inline void
+-_nl_log_untranslated_locked (const char *logfilename, const char *domainname,
+- const char *msgid1, const char *msgid2, int plural)
+-{
+- FILE *logfile;
+-
+- /* Can we reuse the last opened logfile? */
+- if (last_logfilename == NULL || strcmp (logfilename, last_logfilename) != 0)
+- {
+- /* Close the last used logfile. */
+- if (last_logfilename != NULL)
+- {
+- if (last_logfile != NULL)
+- {
+- fclose (last_logfile);
+- last_logfile = NULL;
+- }
+- free (last_logfilename);
+- last_logfilename = NULL;
+- }
+- /* Open the logfile. */
+- last_logfilename = (char *) malloc (strlen (logfilename) + 1);
+- if (last_logfilename == NULL)
+- return;
+- strcpy (last_logfilename, logfilename);
+- last_logfile = fopen (logfilename, "a");
+- if (last_logfile == NULL)
+- return;
+- }
+- logfile = last_logfile;
+-
+- fprintf (logfile, "domain ");
+- print_escaped (logfile, domainname);
+- fprintf (logfile, "\nmsgid ");
+- print_escaped (logfile, msgid1);
+- if (plural)
+- {
+- fprintf (logfile, "\nmsgid_plural ");
+- print_escaped (logfile, msgid2);
+- fprintf (logfile, "\nmsgstr[0] \"\"\n");
+- }
+- else
+- fprintf (logfile, "\nmsgstr \"\"\n");
+- putc ('\n', logfile);
+-}
+-
+-/* Add to the log file an entry denoting a failed translation. */
+-void
+-_nl_log_untranslated (const char *logfilename, const char *domainname,
+- const char *msgid1, const char *msgid2, int plural)
+-{
+- __libc_lock_lock (lock);
+- _nl_log_untranslated_locked (logfilename, domainname, msgid1, msgid2, plural);
+- __libc_lock_unlock (lock);
+-}
+--- a/intl/ngettext.c
++++ /dev/null
+@@ -1,65 +0,0 @@
+-/* Implementation of ngettext(3) function.
+- Copyright (C) 1995, 1997, 2000-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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+- USA. */
+-
+-#ifdef HAVE_CONFIG_H
+-# include <config.h>
+-#endif
+-
+-#ifdef _LIBC
+-# define __need_NULL
+-# include <stddef.h>
+-#else
+-# include <stdlib.h> /* Just for NULL. */
+-#endif
+-
+-#include "gettextP.h"
+-#ifdef _LIBC
+-# include <libintl.h>
+-#else
+-# include "libgnuintl.h"
+-#endif
+-
+-#include <locale.h>
+-
+-/* @@ end of prolog @@ */
+-
+-/* Names for the libintl functions are a problem. They must not clash
+- with existing names and they should follow ANSI C. But this source
+- code is also used in GNU C Library where the names have a __
+- prefix. So we have to make a difference here. */
+-#ifdef _LIBC
+-# define NGETTEXT __ngettext
+-# define DCNGETTEXT __dcngettext
+-#else
+-# define NGETTEXT libintl_ngettext
+-# define DCNGETTEXT libintl_dcngettext
+-#endif
+-
+-/* Look up MSGID in the current default message catalog for the current
+- LC_MESSAGES locale. If not found, returns MSGID itself (the default
+- text). */
+-char *
+-NGETTEXT (const char *msgid1, const char *msgid2, unsigned long int n)
+-{
+- return DCNGETTEXT (NULL, msgid1, msgid2, n, LC_MESSAGES);
+-}
+-
+-#ifdef _LIBC
+-/* Alias for function name in GNU C Library. */
+-weak_alias (__ngettext, ngettext);
+-#endif
+--- a/intl/os2compat.c
++++ /dev/null
+@@ -1,98 +0,0 @@
+-/* OS/2 compatibility functions.
+- Copyright (C) 2001-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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+- USA. */
+-
+-#define OS2_AWARE
+-#ifdef HAVE_CONFIG_H
+-#include <config.h>
+-#endif
+-
+-#include <stdlib.h>
+-#include <string.h>
+-#include <sys/param.h>
+-
+-/* A version of getenv() that works from DLLs */
+-extern unsigned long DosScanEnv (const unsigned char *pszName, unsigned char **ppszValue);
+-
+-char *
+-_nl_getenv (const char *name)
+-{
+- unsigned char *value;
+- if (DosScanEnv (name, &value))
+- return NULL;
+- else
+- return value;
+-}
+-
+-/* A fixed size buffer. */
+-char libintl_nl_default_dirname[MAXPATHLEN+1];
+-
+-char *_nlos2_libdir = NULL;
+-char *_nlos2_localealiaspath = NULL;
+-char *_nlos2_localedir = NULL;
+-
+-static __attribute__((constructor)) void
+-nlos2_initialize ()
+-{
+- char *root = getenv ("UNIXROOT");
+- char *gnulocaledir = getenv ("GNULOCALEDIR");
+-
+- _nlos2_libdir = gnulocaledir;
+- if (!_nlos2_libdir)
+- {
+- if (root)
+- {
+- size_t sl = strlen (root);
+- _nlos2_libdir = (char *) malloc (sl + strlen (LIBDIR) + 1);
+- memcpy (_nlos2_libdir, root, sl);
+- memcpy (_nlos2_libdir + sl, LIBDIR, strlen (LIBDIR) + 1);
+- }
+- else
+- _nlos2_libdir = LIBDIR;
+- }
+-
+- _nlos2_localealiaspath = gnulocaledir;
+- if (!_nlos2_localealiaspath)
+- {
+- if (root)
+- {
+- size_t sl = strlen (root);
+- _nlos2_localealiaspath = (char *) malloc (sl + strlen (LOCALE_ALIAS_PATH) + 1);
+- memcpy (_nlos2_localealiaspath, root, sl);
+- memcpy (_nlos2_localealiaspath + sl, LOCALE_ALIAS_PATH, strlen (LOCALE_ALIAS_PATH) + 1);
+- }
+- else
+- _nlos2_localealiaspath = LOCALE_ALIAS_PATH;
+- }
+-
+- _nlos2_localedir = gnulocaledir;
+- if (!_nlos2_localedir)
+- {
+- if (root)
+- {
+- size_t sl = strlen (root);
+- _nlos2_localedir = (char *) malloc (sl + strlen (LOCALEDIR) + 1);
+- memcpy (_nlos2_localedir, root, sl);
+- memcpy (_nlos2_localedir + sl, LOCALEDIR, strlen (LOCALEDIR) + 1);
+- }
+- else
+- _nlos2_localedir = LOCALEDIR;
+- }
+-
+- if (strlen (_nlos2_localedir) <= MAXPATHLEN)
+- strcpy (libintl_nl_default_dirname, _nlos2_localedir);
+-}
+--- a/intl/os2compat.h
++++ /dev/null
+@@ -1,46 +0,0 @@
+-/* OS/2 compatibility defines.
+- This file is intended to be included from config.h
+- Copyright (C) 2001-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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+- USA. */
+-
+-/* When included from os2compat.h we need all the original definitions */
+-#ifndef OS2_AWARE
+-
+-#undef LIBDIR
+-#define LIBDIR _nlos2_libdir
+-extern char *_nlos2_libdir;
+-
+-#undef LOCALEDIR
+-#define LOCALEDIR _nlos2_localedir
+-extern char *_nlos2_localedir;
+-
+-#undef LOCALE_ALIAS_PATH
+-#define LOCALE_ALIAS_PATH _nlos2_localealiaspath
+-extern char *_nlos2_localealiaspath;
+-
+-#endif
+-
+-#undef HAVE_STRCASECMP
+-#define HAVE_STRCASECMP 1
+-#define strcasecmp stricmp
+-#define strncasecmp strnicmp
+-
+-/* We have our own getenv() which works even if library is compiled as DLL */
+-#define getenv _nl_getenv
+-
+-/* Older versions of gettext used -1 as the value of LC_MESSAGES */
+-#define LC_MESSAGES_COMPAT (-1)
+--- a/intl/osdep.c
++++ /dev/null
+@@ -1,26 +0,0 @@
+-/* OS dependent parts of libintl.
+- Copyright (C) 2001-2002, 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. */
+-
+-#if defined __CYGWIN__
+-# include "intl-exports.c"
+-#elif defined __EMX__
+-# include "os2compat.c"
+-#else
+-/* Avoid AIX compiler warning. */
+-typedef int dummy;
+-#endif
+--- a/intl/plural-exp.c
++++ /dev/null
+@@ -1,155 +0,0 @@
+-/* Expression parsing for plural form selection.
+- Copyright (C) 2000-2001, 2003, 2005-2007 Free Software Foundation, Inc.
+- Written by Ulrich Drepper <drepper@cygnus.com>, 2000.
+-
+- 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. */
+-
+-#ifdef HAVE_CONFIG_H
+-# include <config.h>
+-#endif
+-
+-#include <ctype.h>
+-#include <stdlib.h>
+-#include <string.h>
+-
+-#include "plural-exp.h"
+-
+-#if (defined __GNUC__ && !(__APPLE_CC__ > 1) && !defined __cplusplus) \
+- || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L)
+-
+-/* These structs are the constant expression for the germanic plural
+- form determination. It represents the expression "n != 1". */
+-static const struct expression plvar =
+-{
+- .nargs = 0,
+- .operation = var,
+-};
+-static const struct expression plone =
+-{
+- .nargs = 0,
+- .operation = num,
+- .val =
+- {
+- .num = 1
+- }
+-};
+-struct expression GERMANIC_PLURAL =
+-{
+- .nargs = 2,
+- .operation = not_equal,
+- .val =
+- {
+- .args =
+- {
+- [0] = (struct expression *) &plvar,
+- [1] = (struct expression *) &plone
+- }
+- }
+-};
+-
+-# define INIT_GERMANIC_PLURAL()
+-
+-#else
+-
+-/* For compilers without support for ISO C 99 struct/union initializers:
+- Initialization at run-time. */
+-
+-static struct expression plvar;
+-static struct expression plone;
+-struct expression GERMANIC_PLURAL;
+-
+-static void
+-init_germanic_plural ()
+-{
+- if (plone.val.num == 0)
+- {
+- plvar.nargs = 0;
+- plvar.operation = var;
+-
+- plone.nargs = 0;
+- plone.operation = num;
+- plone.val.num = 1;
+-
+- GERMANIC_PLURAL.nargs = 2;
+- GERMANIC_PLURAL.operation = not_equal;
+- GERMANIC_PLURAL.val.args[0] = &plvar;
+- GERMANIC_PLURAL.val.args[1] = &plone;
+- }
+-}
+-
+-# define INIT_GERMANIC_PLURAL() init_germanic_plural ()
+-
+-#endif
+-
+-void
+-internal_function
+-EXTRACT_PLURAL_EXPRESSION (const char *nullentry,
+- const struct expression **pluralp,
+- unsigned long int *npluralsp)
+-{
+- if (nullentry != NULL)
+- {
+- const char *plural;
+- const char *nplurals;
+-
+- plural = strstr (nullentry, "plural=");
+- nplurals = strstr (nullentry, "nplurals=");
+- if (plural == NULL || nplurals == NULL)
+- goto no_plural;
+- else
+- {
+- char *endp;
+- unsigned long int n;
+- struct parse_args args;
+-
+- /* First get the number. */
+- nplurals += 9;
+- while (*nplurals != '\0' && isspace ((unsigned char) *nplurals))
+- ++nplurals;
+- if (!(*nplurals >= '0' && *nplurals <= '9'))
+- goto no_plural;
+-#if defined HAVE_STRTOUL || defined _LIBC
+- n = strtoul (nplurals, &endp, 10);
+-#else
+- for (endp = nplurals, n = 0; *endp >= '0' && *endp <= '9'; endp++)
+- n = n * 10 + (*endp - '0');
+-#endif
+- if (nplurals == endp)
+- goto no_plural;
+- *npluralsp = n;
+-
+- /* Due to the restrictions bison imposes onto the interface of the
+- scanner function we have to put the input string and the result
+- passed up from the parser into the same structure which address
+- is passed down to the parser. */
+- plural += 7;
+- args.cp = plural;
+- if (PLURAL_PARSE (&args) != 0)
+- goto no_plural;
+- *pluralp = args.res;
+- }
+- }
+- else
+- {
+- /* By default we are using the Germanic form: singular form only
+- for `one', the plural form otherwise. Yes, this is also what
+- English is using since English is a Germanic language. */
+- no_plural:
+- INIT_GERMANIC_PLURAL ();
+- *pluralp = &GERMANIC_PLURAL;
+- *npluralsp = 2;
+- }
+-}
+--- a/intl/plural-exp.h
++++ /dev/null
+@@ -1,129 +0,0 @@
+-/* Expression parsing and evaluation for plural form selection.
+- Copyright (C) 2000-2003, 2005-2007 Free Software Foundation, Inc.
+- Written by Ulrich Drepper <drepper@cygnus.com>, 2000.
+-
+- 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 _PLURAL_EXP_H
+-#define _PLURAL_EXP_H
+-
+-#ifndef internal_function
+-# define internal_function
+-#endif
+-
+-#ifndef attribute_hidden
+-# define attribute_hidden
+-#endif
+-
+-#ifdef __cplusplus
+-extern "C" {
+-#endif
+-
+-
+-enum expression_operator
+-{
+- /* Without arguments: */
+- var, /* The variable "n". */
+- num, /* Decimal number. */
+- /* Unary operators: */
+- lnot, /* Logical NOT. */
+- /* Binary operators: */
+- mult, /* Multiplication. */
+- divide, /* Division. */
+- module, /* Modulo operation. */
+- plus, /* Addition. */
+- minus, /* Subtraction. */
+- less_than, /* Comparison. */
+- greater_than, /* Comparison. */
+- less_or_equal, /* Comparison. */
+- greater_or_equal, /* Comparison. */
+- equal, /* Comparison for equality. */
+- not_equal, /* Comparison for inequality. */
+- land, /* Logical AND. */
+- lor, /* Logical OR. */
+- /* Ternary operators: */
+- qmop /* Question mark operator. */
+-};
+-
+-/* This is the representation of the expressions to determine the
+- plural form. */
+-struct expression
+-{
+- int nargs; /* Number of arguments. */
+- enum expression_operator operation;
+- union
+- {
+- unsigned long int num; /* Number value for `num'. */
+- struct expression *args[3]; /* Up to three arguments. */
+- } val;
+-};
+-
+-/* This is the data structure to pass information to the parser and get
+- the result in a thread-safe way. */
+-struct parse_args
+-{
+- const char *cp;
+- struct expression *res;
+-};
+-
+-
+-/* Names for the libintl functions are a problem. This source code is used
+- 1. in the GNU C Library library,
+- 2. in the GNU libintl library,
+- 3. in the GNU gettext tools.
+- The function names in each situation must be different, to allow for
+- binary incompatible changes in 'struct expression'. Furthermore,
+- 1. in the GNU C Library library, the names have a __ prefix,
+- 2.+3. in the GNU libintl library and in the GNU gettext tools, the names
+- must follow ANSI C and not start with __.
+- So we have to distinguish the three cases. */
+-#ifdef _LIBC
+-# define FREE_EXPRESSION __gettext_free_exp
+-# define PLURAL_PARSE __gettextparse
+-# define GERMANIC_PLURAL __gettext_germanic_plural
+-# define EXTRACT_PLURAL_EXPRESSION __gettext_extract_plural
+-#elif defined (IN_LIBINTL)
+-# define FREE_EXPRESSION libintl_gettext_free_exp
+-# define PLURAL_PARSE libintl_gettextparse
+-# define GERMANIC_PLURAL libintl_gettext_germanic_plural
+-# define EXTRACT_PLURAL_EXPRESSION libintl_gettext_extract_plural
+-#else
+-# define FREE_EXPRESSION free_plural_expression
+-# define PLURAL_PARSE parse_plural_expression
+-# define GERMANIC_PLURAL germanic_plural
+-# define EXTRACT_PLURAL_EXPRESSION extract_plural_expression
+-#endif
+-
+-extern void FREE_EXPRESSION (struct expression *exp)
+- internal_function;
+-extern int PLURAL_PARSE (void *arg);
+-extern struct expression GERMANIC_PLURAL attribute_hidden;
+-extern void EXTRACT_PLURAL_EXPRESSION (const char *nullentry,
+- const struct expression **pluralp,
+- unsigned long int *npluralsp)
+- internal_function;
+-
+-#if !defined (_LIBC) && !defined (IN_LIBINTL) && !defined (IN_LIBGLOCALE)
+-extern unsigned long int plural_eval (const struct expression *pexp,
+- unsigned long int n);
+-#endif
+-
+-
+-#ifdef __cplusplus
+-}
+-#endif
+-
+-#endif /* _PLURAL_EXP_H */
+--- a/intl/plural.c
++++ /dev/null
+@@ -1,1981 +0,0 @@
+-
+-/* A Bison parser, made by GNU Bison 2.4.1. */
+-
+-/* Skeleton implementation for Bison's Yacc-like parsers in C
+-
+- Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
+- 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 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 <http://www.gnu.org/licenses/>. */
+-
+-/* As a special exception, you may create a larger work that contains
+- part or all of the Bison parser skeleton and distribute that work
+- under terms of your choice, so long as that work isn't itself a
+- parser generator using the skeleton or a modified version thereof
+- as a parser skeleton. Alternatively, if you modify or redistribute
+- the parser skeleton itself, you may (at your option) remove this
+- special exception, which will cause the skeleton and the resulting
+- Bison output files to be licensed under the GNU General Public
+- License without this special exception.
+-
+- This special exception was added by the Free Software Foundation in
+- version 2.2 of Bison. */
+-
+-/* C LALR(1) parser skeleton written by Richard Stallman, by
+- simplifying the original so-called "semantic" parser. */
+-
+-/* All symbols defined below should begin with yy or YY, to avoid
+- infringing on user name space. This should be done even for local
+- variables, as they might otherwise be expanded by user macros.
+- There are some unavoidable exceptions within include files to
+- define necessary library symbols; they are noted "INFRINGES ON
+- USER NAME SPACE" below. */
+-
+-/* Identify Bison output. */
+-#define YYBISON 1
+-
+-/* Bison version. */
+-#define YYBISON_VERSION "2.4.1"
+-
+-/* Skeleton name. */
+-#define YYSKELETON_NAME "yacc.c"
+-
+-/* Pure parsers. */
+-#define YYPURE 1
+-
+-/* Push parsers. */
+-#define YYPUSH 0
+-
+-/* Pull parsers. */
+-#define YYPULL 1
+-
+-/* Using locations. */
+-#define YYLSP_NEEDED 0
+-
+-/* Substitute the variable and function names. */
+-#define yyparse __gettextparse
+-#define yylex __gettextlex
+-#define yyerror __gettexterror
+-#define yylval __gettextlval
+-#define yychar __gettextchar
+-#define yydebug __gettextdebug
+-#define yynerrs __gettextnerrs
+-
+-
+-/* Copy the first part of user declarations. */
+-
+-/* Line 189 of yacc.c */
+-#line 1 "plural.y"
+-
+-/* Expression parsing for plural form selection.
+- Copyright (C) 2000-2001, 2003, 2005-2006 Free Software Foundation, Inc.
+- Written by Ulrich Drepper <drepper@cygnus.com>, 2000.
+-
+- 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. */
+-
+-/* For bison < 2.0, the bison generated parser uses alloca. AIX 3 forces us
+- to put this declaration at the beginning of the file. The declaration in
+- bison's skeleton file comes too late. This must come before <config.h>
+- because <config.h> may include arbitrary system headers.
+- This can go away once the AM_INTL_SUBDIR macro requires bison >= 2.0. */
+-#if defined _AIX && !defined __GNUC__
+- #pragma alloca
+-#endif
+-
+-#ifdef HAVE_CONFIG_H
+-# include <config.h>
+-#endif
+-
+-#include <stddef.h>
+-#include <stdlib.h>
+-#include <string.h>
+-#include "plural-exp.h"
+-
+-/* The main function generated by the parser is called __gettextparse,
+- but we want it to be called PLURAL_PARSE. */
+-#ifndef _LIBC
+-# define __gettextparse PLURAL_PARSE
+-#endif
+-
+-#define YYLEX_PARAM &((struct parse_args *) arg)->cp
+-#define YYPARSE_PARAM arg
+-
+-
+-/* Line 189 of yacc.c */
+-#line 130 "plural.c"
+-
+-/* Enabling traces. */
+-#ifndef YYDEBUG
+-# define YYDEBUG 0
+-#endif
+-
+-/* Enabling verbose error messages. */
+-#ifdef YYERROR_VERBOSE
+-# undef YYERROR_VERBOSE
+-# define YYERROR_VERBOSE 1
+-#else
+-# define YYERROR_VERBOSE 0
+-#endif
+-
+-/* Enabling the token table. */
+-#ifndef YYTOKEN_TABLE
+-# define YYTOKEN_TABLE 0
+-#endif
+-
+-
+-/* Tokens. */
+-#ifndef YYTOKENTYPE
+-# define YYTOKENTYPE
+- /* Put the tokens into the symbol table, so that GDB and other debuggers
+- know about them. */
+- enum yytokentype {
+- EQUOP2 = 258,
+- CMPOP2 = 259,
+- ADDOP2 = 260,
+- MULOP2 = 261,
+- NUMBER = 262
+- };
+-#endif
+-/* Tokens. */
+-#define EQUOP2 258
+-#define CMPOP2 259
+-#define ADDOP2 260
+-#define MULOP2 261
+-#define NUMBER 262
+-
+-
+-
+-
+-#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
+-typedef union YYSTYPE
+-{
+-
+-/* Line 214 of yacc.c */
+-#line 51 "plural.y"
+-
+- unsigned long int num;
+- enum expression_operator op;
+- struct expression *exp;
+-
+-
+-
+-/* Line 214 of yacc.c */
+-#line 188 "plural.c"
+-} YYSTYPE;
+-# define YYSTYPE_IS_TRIVIAL 1
+-# define yystype YYSTYPE /* obsolescent; will be withdrawn */
+-# define YYSTYPE_IS_DECLARED 1
+-#endif
+-
+-
+-/* Copy the second part of user declarations. */
+-
+-/* Line 264 of yacc.c */
+-#line 57 "plural.y"
+-
+-/* Prototypes for local functions. */
+-static int yylex (YYSTYPE *lval, const char **pexp);
+-static void yyerror (const char *str);
+-
+-/* Allocation of expressions. */
+-
+-static struct expression *
+-new_exp (int nargs, enum expression_operator op,
+- struct expression * const *args)
+-{
+- int i;
+- struct expression *newp;
+-
+- /* If any of the argument could not be malloc'ed, just return NULL. */
+- for (i = nargs - 1; i >= 0; i--)
+- if (args[i] == NULL)
+- goto fail;
+-
+- /* Allocate a new expression. */
+- newp = (struct expression *) malloc (sizeof (*newp));
+- if (newp != NULL)
+- {
+- newp->nargs = nargs;
+- newp->operation = op;
+- for (i = nargs - 1; i >= 0; i--)
+- newp->val.args[i] = args[i];
+- return newp;
+- }
+-
+- fail:
+- for (i = nargs - 1; i >= 0; i--)
+- FREE_EXPRESSION (args[i]);
+-
+- return NULL;
+-}
+-
+-static inline struct expression *
+-new_exp_0 (enum expression_operator op)
+-{
+- return new_exp (0, op, NULL);
+-}
+-
+-static inline struct expression *
+-new_exp_1 (enum expression_operator op, struct expression *right)
+-{
+- struct expression *args[1];
+-
+- args[0] = right;
+- return new_exp (1, op, args);
+-}
+-
+-static struct expression *
+-new_exp_2 (enum expression_operator op, struct expression *left,
+- struct expression *right)
+-{
+- struct expression *args[2];
+-
+- args[0] = left;
+- args[1] = right;
+- return new_exp (2, op, args);
+-}
+-
+-static inline struct expression *
+-new_exp_3 (enum expression_operator op, struct expression *bexp,
+- struct expression *tbranch, struct expression *fbranch)
+-{
+- struct expression *args[3];
+-
+- args[0] = bexp;
+- args[1] = tbranch;
+- args[2] = fbranch;
+- return new_exp (3, op, args);
+-}
+-
+-
+-
+-/* Line 264 of yacc.c */
+-#line 278 "plural.c"
+-
+-#ifdef short
+-# undef short
+-#endif
+-
+-#ifdef YYTYPE_UINT8
+-typedef YYTYPE_UINT8 yytype_uint8;
+-#else
+-typedef unsigned char yytype_uint8;
+-#endif
+-
+-#ifdef YYTYPE_INT8
+-typedef YYTYPE_INT8 yytype_int8;
+-#elif (defined __STDC__ || defined __C99__FUNC__ \
+- || defined __cplusplus || defined _MSC_VER)
+-typedef signed char yytype_int8;
+-#else
+-typedef short int yytype_int8;
+-#endif
+-
+-#ifdef YYTYPE_UINT16
+-typedef YYTYPE_UINT16 yytype_uint16;
+-#else
+-typedef unsigned short int yytype_uint16;
+-#endif
+-
+-#ifdef YYTYPE_INT16
+-typedef YYTYPE_INT16 yytype_int16;
+-#else
+-typedef short int yytype_int16;
+-#endif
+-
+-#ifndef YYSIZE_T
+-# ifdef __SIZE_TYPE__
+-# define YYSIZE_T __SIZE_TYPE__
+-# elif defined size_t
+-# define YYSIZE_T size_t
+-# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \
+- || defined __cplusplus || defined _MSC_VER)
+-# include <stddef.h> /* INFRINGES ON USER NAME SPACE */
+-# define YYSIZE_T size_t
+-# else
+-# define YYSIZE_T unsigned int
+-# endif
+-#endif
+-
+-#define YYSIZE_MAXIMUM ((YYSIZE_T) -1)
+-
+-#ifndef YY_
+-# if YYENABLE_NLS
+-# if ENABLE_NLS
+-# include <libintl.h> /* INFRINGES ON USER NAME SPACE */
+-# define YY_(msgid) dgettext ("bison-runtime", msgid)
+-# endif
+-# endif
+-# ifndef YY_
+-# define YY_(msgid) msgid
+-# endif
+-#endif
+-
+-/* Suppress unused-variable warnings by "using" E. */
+-#if ! defined lint || defined __GNUC__
+-# define YYUSE(e) ((void) (e))
+-#else
+-# define YYUSE(e) /* empty */
+-#endif
+-
+-/* Identity function, used to suppress warnings about constant conditions. */
+-#ifndef lint
+-# define YYID(n) (n)
+-#else
+-#if (defined __STDC__ || defined __C99__FUNC__ \
+- || defined __cplusplus || defined _MSC_VER)
+-static int
+-YYID (int yyi)
+-#else
+-static int
+-YYID (yyi)
+- int yyi;
+-#endif
+-{
+- return yyi;
+-}
+-#endif
+-
+-#if ! defined yyoverflow || YYERROR_VERBOSE
+-
+-/* The parser invokes alloca or malloc; define the necessary symbols. */
+-
+-# ifdef YYSTACK_USE_ALLOCA
+-# if YYSTACK_USE_ALLOCA
+-# ifdef __GNUC__
+-# define YYSTACK_ALLOC __builtin_alloca
+-# elif defined __BUILTIN_VA_ARG_INCR
+-# include <alloca.h> /* INFRINGES ON USER NAME SPACE */
+-# elif defined _AIX
+-# define YYSTACK_ALLOC __alloca
+-# elif defined _MSC_VER
+-# include <malloc.h> /* INFRINGES ON USER NAME SPACE */
+-# define alloca _alloca
+-# else
+-# define YYSTACK_ALLOC alloca
+-# if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
+- || defined __cplusplus || defined _MSC_VER)
+-# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+-# ifndef _STDLIB_H
+-# define _STDLIB_H 1
+-# endif
+-# endif
+-# endif
+-# endif
+-# endif
+-
+-# ifdef YYSTACK_ALLOC
+- /* Pacify GCC's `empty if-body' warning. */
+-# define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0))
+-# ifndef YYSTACK_ALLOC_MAXIMUM
+- /* The OS might guarantee only one guard page at the bottom of the stack,
+- and a page size can be as small as 4096 bytes. So we cannot safely
+- invoke alloca (N) if N exceeds 4096. Use a slightly smaller number
+- to allow for a few compiler-allocated temporary stack slots. */
+-# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */
+-# endif
+-# else
+-# define YYSTACK_ALLOC YYMALLOC
+-# define YYSTACK_FREE YYFREE
+-# ifndef YYSTACK_ALLOC_MAXIMUM
+-# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM
+-# endif
+-# if (defined __cplusplus && ! defined _STDLIB_H \
+- && ! ((defined YYMALLOC || defined malloc) \
+- && (defined YYFREE || defined free)))
+-# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+-# ifndef _STDLIB_H
+-# define _STDLIB_H 1
+-# endif
+-# endif
+-# ifndef YYMALLOC
+-# define YYMALLOC malloc
+-# if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
+- || defined __cplusplus || defined _MSC_VER)
+-void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
+-# endif
+-# endif
+-# ifndef YYFREE
+-# define YYFREE free
+-# if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
+- || defined __cplusplus || defined _MSC_VER)
+-void free (void *); /* INFRINGES ON USER NAME SPACE */
+-# endif
+-# endif
+-# endif
+-#endif /* ! defined yyoverflow || YYERROR_VERBOSE */
+-
+-
+-#if (! defined yyoverflow \
+- && (! defined __cplusplus \
+- || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
+-
+-/* A type that is properly aligned for any stack member. */
+-union yyalloc
+-{
+- yytype_int16 yyss_alloc;
+- YYSTYPE yyvs_alloc;
+-};
+-
+-/* The size of the maximum gap between one aligned stack and the next. */
+-# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1)
+-
+-/* The size of an array large to enough to hold all stacks, each with
+- N elements. */
+-# define YYSTACK_BYTES(N) \
+- ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \
+- + YYSTACK_GAP_MAXIMUM)
+-
+-/* Copy COUNT objects from FROM to TO. The source and destination do
+- not overlap. */
+-# ifndef YYCOPY
+-# if defined __GNUC__ && 1 < __GNUC__
+-# define YYCOPY(To, From, Count) \
+- __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
+-# else
+-# define YYCOPY(To, From, Count) \
+- do \
+- { \
+- YYSIZE_T yyi; \
+- for (yyi = 0; yyi < (Count); yyi++) \
+- (To)[yyi] = (From)[yyi]; \
+- } \
+- while (YYID (0))
+-# endif
+-# endif
+-
+-/* Relocate STACK from its old location to the new one. The
+- local variables YYSIZE and YYSTACKSIZE give the old and new number of
+- elements in the stack, and YYPTR gives the new location of the
+- stack. Advance YYPTR to a properly aligned location for the next
+- stack. */
+-# define YYSTACK_RELOCATE(Stack_alloc, Stack) \
+- do \
+- { \
+- YYSIZE_T yynewbytes; \
+- YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \
+- Stack = &yyptr->Stack_alloc; \
+- yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
+- yyptr += yynewbytes / sizeof (*yyptr); \
+- } \
+- while (YYID (0))
+-
+-#endif
+-
+-/* YYFINAL -- State number of the termination state. */
+-#define YYFINAL 9
+-/* YYLAST -- Last index in YYTABLE. */
+-#define YYLAST 54
+-
+-/* YYNTOKENS -- Number of terminals. */
+-#define YYNTOKENS 16
+-/* YYNNTS -- Number of nonterminals. */
+-#define YYNNTS 3
+-/* YYNRULES -- Number of rules. */
+-#define YYNRULES 13
+-/* YYNRULES -- Number of states. */
+-#define YYNSTATES 27
+-
+-/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */
+-#define YYUNDEFTOK 2
+-#define YYMAXUTOK 262
+-
+-#define YYTRANSLATE(YYX) \
+- ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
+-
+-/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */
+-static const yytype_uint8 yytranslate[] =
+-{
+- 0, 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, 10, 2, 2, 2, 2, 5, 2,
+- 14, 15, 2, 2, 2, 2, 2, 2, 2, 2,
+- 2, 2, 2, 2, 2, 2, 2, 2, 12, 2,
+- 2, 2, 2, 3, 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, 2, 2, 2, 2,
+- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+- 13, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+- 2, 2, 2, 2, 4, 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, 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, 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, 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, 2, 2, 2, 1, 2, 6, 7,
+- 8, 9, 11
+-};
+-
+-#if YYDEBUG
+-/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
+- YYRHS. */
+-static const yytype_uint8 yyprhs[] =
+-{
+- 0, 0, 3, 5, 11, 15, 19, 23, 27, 31,
+- 35, 38, 40, 42
+-};
+-
+-/* YYRHS -- A `-1'-separated list of the rules' RHS. */
+-static const yytype_int8 yyrhs[] =
+-{
+- 17, 0, -1, 18, -1, 18, 3, 18, 12, 18,
+- -1, 18, 4, 18, -1, 18, 5, 18, -1, 18,
+- 6, 18, -1, 18, 7, 18, -1, 18, 8, 18,
+- -1, 18, 9, 18, -1, 10, 18, -1, 13, -1,
+- 11, -1, 14, 18, 15, -1
+-};
+-
+-/* YYRLINE[YYN] -- source line where rule number YYN was defined. */
+-static const yytype_uint8 yyrline[] =
+-{
+- 0, 154, 154, 162, 166, 170, 174, 178, 182, 186,
+- 190, 194, 198, 203
+-};
+-#endif
+-
+-#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
+-/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
+- First, the terminals, then, starting at YYNTOKENS, nonterminals. */
+-static const char *const yytname[] =
+-{
+- "$end", "error", "$undefined", "'?'", "'|'", "'&'", "EQUOP2", "CMPOP2",
+- "ADDOP2", "MULOP2", "'!'", "NUMBER", "':'", "'n'", "'('", "')'",
+- "$accept", "start", "exp", 0
+-};
+-#endif
+-
+-# ifdef YYPRINT
+-/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
+- token YYLEX-NUM. */
+-static const yytype_uint16 yytoknum[] =
+-{
+- 0, 256, 257, 63, 124, 38, 258, 259, 260, 261,
+- 33, 262, 58, 110, 40, 41
+-};
+-# endif
+-
+-/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
+-static const yytype_uint8 yyr1[] =
+-{
+- 0, 16, 17, 18, 18, 18, 18, 18, 18, 18,
+- 18, 18, 18, 18
+-};
+-
+-/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */
+-static const yytype_uint8 yyr2[] =
+-{
+- 0, 2, 1, 5, 3, 3, 3, 3, 3, 3,
+- 2, 1, 1, 3
+-};
+-
+-/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
+- STATE-NUM when YYTABLE doesn't specify something else to do. Zero
+- means the default is an error. */
+-static const yytype_uint8 yydefact[] =
+-{
+- 0, 0, 12, 11, 0, 0, 2, 10, 0, 1,
+- 0, 0, 0, 0, 0, 0, 0, 13, 0, 4,
+- 5, 6, 7, 8, 9, 0, 3
+-};
+-
+-/* YYDEFGOTO[NTERM-NUM]. */
+-static const yytype_int8 yydefgoto[] =
+-{
+- -1, 5, 6
+-};
+-
+-/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
+- STATE-NUM. */
+-#define YYPACT_NINF -10
+-static const yytype_int8 yypact[] =
+-{
+- -9, -9, -10, -10, -9, 8, 36, -10, 13, -10,
+- -9, -9, -9, -9, -9, -9, -9, -10, 26, 41,
+- 45, 18, -2, 14, -10, -9, 36
+-};
+-
+-/* YYPGOTO[NTERM-NUM]. */
+-static const yytype_int8 yypgoto[] =
+-{
+- -10, -10, -1
+-};
+-
+-/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If
+- positive, shift that token. If negative, reduce the rule which
+- number is the opposite. If zero, do what YYDEFACT says.
+- If YYTABLE_NINF, syntax error. */
+-#define YYTABLE_NINF -1
+-static const yytype_uint8 yytable[] =
+-{
+- 7, 1, 2, 8, 3, 4, 15, 16, 9, 18,
+- 19, 20, 21, 22, 23, 24, 10, 11, 12, 13,
+- 14, 15, 16, 16, 26, 14, 15, 16, 17, 10,
+- 11, 12, 13, 14, 15, 16, 0, 0, 25, 10,
+- 11, 12, 13, 14, 15, 16, 12, 13, 14, 15,
+- 16, 13, 14, 15, 16
+-};
+-
+-static const yytype_int8 yycheck[] =
+-{
+- 1, 10, 11, 4, 13, 14, 8, 9, 0, 10,
+- 11, 12, 13, 14, 15, 16, 3, 4, 5, 6,
+- 7, 8, 9, 9, 25, 7, 8, 9, 15, 3,
+- 4, 5, 6, 7, 8, 9, -1, -1, 12, 3,
+- 4, 5, 6, 7, 8, 9, 5, 6, 7, 8,
+- 9, 6, 7, 8, 9
+-};
+-
+-/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
+- symbol of state STATE-NUM. */
+-static const yytype_uint8 yystos[] =
+-{
+- 0, 10, 11, 13, 14, 17, 18, 18, 18, 0,
+- 3, 4, 5, 6, 7, 8, 9, 15, 18, 18,
+- 18, 18, 18, 18, 18, 12, 18
+-};
+-
+-#define yyerrok (yyerrstatus = 0)
+-#define yyclearin (yychar = YYEMPTY)
+-#define YYEMPTY (-2)
+-#define YYEOF 0
+-
+-#define YYACCEPT goto yyacceptlab
+-#define YYABORT goto yyabortlab
+-#define YYERROR goto yyerrorlab
+-
+-
+-/* Like YYERROR except do call yyerror. This remains here temporarily
+- to ease the transition to the new meaning of YYERROR, for GCC.
+- Once GCC version 2 has supplanted version 1, this can go. */
+-
+-#define YYFAIL goto yyerrlab
+-
+-#define YYRECOVERING() (!!yyerrstatus)
+-
+-#define YYBACKUP(Token, Value) \
+-do \
+- if (yychar == YYEMPTY && yylen == 1) \
+- { \
+- yychar = (Token); \
+- yylval = (Value); \
+- yytoken = YYTRANSLATE (yychar); \
+- YYPOPSTACK (1); \
+- goto yybackup; \
+- } \
+- else \
+- { \
+- yyerror (YY_("syntax error: cannot back up")); \
+- YYERROR; \
+- } \
+-while (YYID (0))
+-
+-
+-#define YYTERROR 1
+-#define YYERRCODE 256
+-
+-
+-/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
+- If N is 0, then set CURRENT to the empty location which ends
+- the previous symbol: RHS[0] (always defined). */
+-
+-#define YYRHSLOC(Rhs, K) ((Rhs)[K])
+-#ifndef YYLLOC_DEFAULT
+-# define YYLLOC_DEFAULT(Current, Rhs, N) \
+- do \
+- if (YYID (N)) \
+- { \
+- (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \
+- (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \
+- (Current).last_line = YYRHSLOC (Rhs, N).last_line; \
+- (Current).last_column = YYRHSLOC (Rhs, N).last_column; \
+- } \
+- else \
+- { \
+- (Current).first_line = (Current).last_line = \
+- YYRHSLOC (Rhs, 0).last_line; \
+- (Current).first_column = (Current).last_column = \
+- YYRHSLOC (Rhs, 0).last_column; \
+- } \
+- while (YYID (0))
+-#endif
+-
+-
+-/* YY_LOCATION_PRINT -- Print the location on the stream.
+- This macro was not mandated originally: define only if we know
+- we won't break user code: when these are the locations we know. */
+-
+-#ifndef YY_LOCATION_PRINT
+-# if YYLTYPE_IS_TRIVIAL
+-# define YY_LOCATION_PRINT(File, Loc) \
+- fprintf (File, "%d.%d-%d.%d", \
+- (Loc).first_line, (Loc).first_column, \
+- (Loc).last_line, (Loc).last_column)
+-# else
+-# define YY_LOCATION_PRINT(File, Loc) ((void) 0)
+-# endif
+-#endif
+-
+-
+-/* YYLEX -- calling `yylex' with the right arguments. */
+-
+-#ifdef YYLEX_PARAM
+-# define YYLEX yylex (&yylval, YYLEX_PARAM)
+-#else
+-# define YYLEX yylex (&yylval)
+-#endif
+-
+-/* Enable debugging if requested. */
+-#if YYDEBUG
+-
+-# ifndef YYFPRINTF
+-# include <stdio.h> /* INFRINGES ON USER NAME SPACE */
+-# define YYFPRINTF fprintf
+-# endif
+-
+-# define YYDPRINTF(Args) \
+-do { \
+- if (yydebug) \
+- YYFPRINTF Args; \
+-} while (YYID (0))
+-
+-# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \
+-do { \
+- if (yydebug) \
+- { \
+- YYFPRINTF (stderr, "%s ", Title); \
+- yy_symbol_print (stderr, \
+- Type, Value); \
+- YYFPRINTF (stderr, "\n"); \
+- } \
+-} while (YYID (0))
+-
+-
+-/*--------------------------------.
+-| Print this symbol on YYOUTPUT. |
+-`--------------------------------*/
+-
+-/*ARGSUSED*/
+-#if (defined __STDC__ || defined __C99__FUNC__ \
+- || defined __cplusplus || defined _MSC_VER)
+-static void
+-yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep)
+-#else
+-static void
+-yy_symbol_value_print (yyoutput, yytype, yyvaluep)
+- FILE *yyoutput;
+- int yytype;
+- YYSTYPE const * const yyvaluep;
+-#endif
+-{
+- if (!yyvaluep)
+- return;
+-# ifdef YYPRINT
+- if (yytype < YYNTOKENS)
+- YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
+-# else
+- YYUSE (yyoutput);
+-# endif
+- switch (yytype)
+- {
+- default:
+- break;
+- }
+-}
+-
+-
+-/*--------------------------------.
+-| Print this symbol on YYOUTPUT. |
+-`--------------------------------*/
+-
+-#if (defined __STDC__ || defined __C99__FUNC__ \
+- || defined __cplusplus || defined _MSC_VER)
+-static void
+-yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep)
+-#else
+-static void
+-yy_symbol_print (yyoutput, yytype, yyvaluep)
+- FILE *yyoutput;
+- int yytype;
+- YYSTYPE const * const yyvaluep;
+-#endif
+-{
+- if (yytype < YYNTOKENS)
+- YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
+- else
+- YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
+-
+- yy_symbol_value_print (yyoutput, yytype, yyvaluep);
+- YYFPRINTF (yyoutput, ")");
+-}
+-
+-/*------------------------------------------------------------------.
+-| yy_stack_print -- Print the state stack from its BOTTOM up to its |
+-| TOP (included). |
+-`------------------------------------------------------------------*/
+-
+-#if (defined __STDC__ || defined __C99__FUNC__ \
+- || defined __cplusplus || defined _MSC_VER)
+-static void
+-yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop)
+-#else
+-static void
+-yy_stack_print (yybottom, yytop)
+- yytype_int16 *yybottom;
+- yytype_int16 *yytop;
+-#endif
+-{
+- YYFPRINTF (stderr, "Stack now");
+- for (; yybottom <= yytop; yybottom++)
+- {
+- int yybot = *yybottom;
+- YYFPRINTF (stderr, " %d", yybot);
+- }
+- YYFPRINTF (stderr, "\n");
+-}
+-
+-# define YY_STACK_PRINT(Bottom, Top) \
+-do { \
+- if (yydebug) \
+- yy_stack_print ((Bottom), (Top)); \
+-} while (YYID (0))
+-
+-
+-/*------------------------------------------------.
+-| Report that the YYRULE is going to be reduced. |
+-`------------------------------------------------*/
+-
+-#if (defined __STDC__ || defined __C99__FUNC__ \
+- || defined __cplusplus || defined _MSC_VER)
+-static void
+-yy_reduce_print (YYSTYPE *yyvsp, int yyrule)
+-#else
+-static void
+-yy_reduce_print (yyvsp, yyrule)
+- YYSTYPE *yyvsp;
+- int yyrule;
+-#endif
+-{
+- int yynrhs = yyr2[yyrule];
+- int yyi;
+- unsigned long int yylno = yyrline[yyrule];
+- YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n",
+- yyrule - 1, yylno);
+- /* The symbols being reduced. */
+- for (yyi = 0; yyi < yynrhs; yyi++)
+- {
+- YYFPRINTF (stderr, " $%d = ", yyi + 1);
+- yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi],
+- &(yyvsp[(yyi + 1) - (yynrhs)])
+- );
+- YYFPRINTF (stderr, "\n");
+- }
+-}
+-
+-# define YY_REDUCE_PRINT(Rule) \
+-do { \
+- if (yydebug) \
+- yy_reduce_print (yyvsp, Rule); \
+-} while (YYID (0))
+-
+-/* Nonzero means print parse trace. It is left uninitialized so that
+- multiple parsers can coexist. */
+-int yydebug;
+-#else /* !YYDEBUG */
+-# define YYDPRINTF(Args)
+-# define YY_SYMBOL_PRINT(Title, Type, Value, Location)
+-# define YY_STACK_PRINT(Bottom, Top)
+-# define YY_REDUCE_PRINT(Rule)
+-#endif /* !YYDEBUG */
+-
+-
+-/* YYINITDEPTH -- initial size of the parser's stacks. */
+-#ifndef YYINITDEPTH
+-# define YYINITDEPTH 200
+-#endif
+-
+-/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
+- if the built-in stack extension method is used).
+-
+- Do not make this value too large; the results are undefined if
+- YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH)
+- evaluated with infinite-precision integer arithmetic. */
+-
+-#ifndef YYMAXDEPTH
+-# define YYMAXDEPTH 10000
+-#endif
+-
+-
+-
+-#if YYERROR_VERBOSE
+-
+-# ifndef yystrlen
+-# if defined __GLIBC__ && defined _STRING_H
+-# define yystrlen strlen
+-# else
+-/* Return the length of YYSTR. */
+-#if (defined __STDC__ || defined __C99__FUNC__ \
+- || defined __cplusplus || defined _MSC_VER)
+-static YYSIZE_T
+-yystrlen (const char *yystr)
+-#else
+-static YYSIZE_T
+-yystrlen (yystr)
+- const char *yystr;
+-#endif
+-{
+- YYSIZE_T yylen;
+- for (yylen = 0; yystr[yylen]; yylen++)
+- continue;
+- return yylen;
+-}
+-# endif
+-# endif
+-
+-# ifndef yystpcpy
+-# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE
+-# define yystpcpy stpcpy
+-# else
+-/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
+- YYDEST. */
+-#if (defined __STDC__ || defined __C99__FUNC__ \
+- || defined __cplusplus || defined _MSC_VER)
+-static char *
+-yystpcpy (char *yydest, const char *yysrc)
+-#else
+-static char *
+-yystpcpy (yydest, yysrc)
+- char *yydest;
+- const char *yysrc;
+-#endif
+-{
+- char *yyd = yydest;
+- const char *yys = yysrc;
+-
+- while ((*yyd++ = *yys++) != '\0')
+- continue;
+-
+- return yyd - 1;
+-}
+-# endif
+-# endif
+-
+-# ifndef yytnamerr
+-/* Copy to YYRES the contents of YYSTR after stripping away unnecessary
+- quotes and backslashes, so that it's suitable for yyerror. The
+- heuristic is that double-quoting is unnecessary unless the string
+- contains an apostrophe, a comma, or backslash (other than
+- backslash-backslash). YYSTR is taken from yytname. If YYRES is
+- null, do not copy; instead, return the length of what the result
+- would have been. */
+-static YYSIZE_T
+-yytnamerr (char *yyres, const char *yystr)
+-{
+- if (*yystr == '"')
+- {
+- YYSIZE_T yyn = 0;
+- char const *yyp = yystr;
+-
+- for (;;)
+- switch (*++yyp)
+- {
+- case '\'':
+- case ',':
+- goto do_not_strip_quotes;
+-
+- case '\\':
+- if (*++yyp != '\\')
+- goto do_not_strip_quotes;
+- /* Fall through. */
+- default:
+- if (yyres)
+- yyres[yyn] = *yyp;
+- yyn++;
+- break;
+-
+- case '"':
+- if (yyres)
+- yyres[yyn] = '\0';
+- return yyn;
+- }
+- do_not_strip_quotes: ;
+- }
+-
+- if (! yyres)
+- return yystrlen (yystr);
+-
+- return yystpcpy (yyres, yystr) - yyres;
+-}
+-# endif
+-
+-/* Copy into YYRESULT an error message about the unexpected token
+- YYCHAR while in state YYSTATE. Return the number of bytes copied,
+- including the terminating null byte. If YYRESULT is null, do not
+- copy anything; just return the number of bytes that would be
+- copied. As a special case, return 0 if an ordinary "syntax error"
+- message will do. Return YYSIZE_MAXIMUM if overflow occurs during
+- size calculation. */
+-static YYSIZE_T
+-yysyntax_error (char *yyresult, int yystate, int yychar)
+-{
+- int yyn = yypact[yystate];
+-
+- if (! (YYPACT_NINF < yyn && yyn <= YYLAST))
+- return 0;
+- else
+- {
+- int yytype = YYTRANSLATE (yychar);
+- YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]);
+- YYSIZE_T yysize = yysize0;
+- YYSIZE_T yysize1;
+- int yysize_overflow = 0;
+- enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
+- char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
+- int yyx;
+-
+-# if 0
+- /* This is so xgettext sees the translatable formats that are
+- constructed on the fly. */
+- YY_("syntax error, unexpected %s");
+- YY_("syntax error, unexpected %s, expecting %s");
+- YY_("syntax error, unexpected %s, expecting %s or %s");
+- YY_("syntax error, unexpected %s, expecting %s or %s or %s");
+- YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s");
+-# endif
+- char *yyfmt;
+- char const *yyf;
+- static char const yyunexpected[] = "syntax error, unexpected %s";
+- static char const yyexpecting[] = ", expecting %s";
+- static char const yyor[] = " or %s";
+- char yyformat[sizeof yyunexpected
+- + sizeof yyexpecting - 1
+- + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2)
+- * (sizeof yyor - 1))];
+- char const *yyprefix = yyexpecting;
+-
+- /* Start YYX at -YYN if negative to avoid negative indexes in
+- YYCHECK. */
+- int yyxbegin = yyn < 0 ? -yyn : 0;
+-
+- /* Stay within bounds of both yycheck and yytname. */
+- int yychecklim = YYLAST - yyn + 1;
+- int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
+- int yycount = 1;
+-
+- yyarg[0] = yytname[yytype];
+- yyfmt = yystpcpy (yyformat, yyunexpected);
+-
+- for (yyx = yyxbegin; yyx < yyxend; ++yyx)
+- if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
+- {
+- if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
+- {
+- yycount = 1;
+- yysize = yysize0;
+- yyformat[sizeof yyunexpected - 1] = '\0';
+- break;
+- }
+- yyarg[yycount++] = yytname[yyx];
+- yysize1 = yysize + yytnamerr (0, yytname[yyx]);
+- yysize_overflow |= (yysize1 < yysize);
+- yysize = yysize1;
+- yyfmt = yystpcpy (yyfmt, yyprefix);
+- yyprefix = yyor;
+- }
+-
+- yyf = YY_(yyformat);
+- yysize1 = yysize + yystrlen (yyf);
+- yysize_overflow |= (yysize1 < yysize);
+- yysize = yysize1;
+-
+- if (yysize_overflow)
+- return YYSIZE_MAXIMUM;
+-
+- if (yyresult)
+- {
+- /* Avoid sprintf, as that infringes on the user's name space.
+- Don't have undefined behavior even if the translation
+- produced a string with the wrong number of "%s"s. */
+- char *yyp = yyresult;
+- int yyi = 0;
+- while ((*yyp = *yyf) != '\0')
+- {
+- if (*yyp == '%' && yyf[1] == 's' && yyi < yycount)
+- {
+- yyp += yytnamerr (yyp, yyarg[yyi++]);
+- yyf += 2;
+- }
+- else
+- {
+- yyp++;
+- yyf++;
+- }
+- }
+- }
+- return yysize;
+- }
+-}
+-#endif /* YYERROR_VERBOSE */
+-
+-
+-/*-----------------------------------------------.
+-| Release the memory associated to this symbol. |
+-`-----------------------------------------------*/
+-
+-/*ARGSUSED*/
+-#if (defined __STDC__ || defined __C99__FUNC__ \
+- || defined __cplusplus || defined _MSC_VER)
+-static void
+-yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep)
+-#else
+-static void
+-yydestruct (yymsg, yytype, yyvaluep)
+- const char *yymsg;
+- int yytype;
+- YYSTYPE *yyvaluep;
+-#endif
+-{
+- YYUSE (yyvaluep);
+-
+- if (!yymsg)
+- yymsg = "Deleting";
+- YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
+-
+- switch (yytype)
+- {
+-
+- default:
+- break;
+- }
+-}
+-
+-/* Prevent warnings from -Wmissing-prototypes. */
+-#ifdef YYPARSE_PARAM
+-#if defined __STDC__ || defined __cplusplus
+-int yyparse (void *YYPARSE_PARAM);
+-#else
+-int yyparse ();
+-#endif
+-#else /* ! YYPARSE_PARAM */
+-#if defined __STDC__ || defined __cplusplus
+-int yyparse (void);
+-#else
+-int yyparse ();
+-#endif
+-#endif /* ! YYPARSE_PARAM */
+-
+-
+-
+-
+-
+-/*-------------------------.
+-| yyparse or yypush_parse. |
+-`-------------------------*/
+-
+-#ifdef YYPARSE_PARAM
+-#if (defined __STDC__ || defined __C99__FUNC__ \
+- || defined __cplusplus || defined _MSC_VER)
+-int
+-yyparse (void *YYPARSE_PARAM)
+-#else
+-int
+-yyparse (YYPARSE_PARAM)
+- void *YYPARSE_PARAM;
+-#endif
+-#else /* ! YYPARSE_PARAM */
+-#if (defined __STDC__ || defined __C99__FUNC__ \
+- || defined __cplusplus || defined _MSC_VER)
+-int
+-yyparse (void)
+-#else
+-int
+-yyparse ()
+-
+-#endif
+-#endif
+-{
+-/* The lookahead symbol. */
+-int yychar;
+-
+-/* The semantic value of the lookahead symbol. */
+-YYSTYPE yylval;
+-
+- /* Number of syntax errors so far. */
+- int yynerrs;
+-
+- int yystate;
+- /* Number of tokens to shift before error messages enabled. */
+- int yyerrstatus;
+-
+- /* The stacks and their tools:
+- `yyss': related to states.
+- `yyvs': related to semantic values.
+-
+- Refer to the stacks thru separate pointers, to allow yyoverflow
+- to reallocate them elsewhere. */
+-
+- /* The state stack. */
+- yytype_int16 yyssa[YYINITDEPTH];
+- yytype_int16 *yyss;
+- yytype_int16 *yyssp;
+-
+- /* The semantic value stack. */
+- YYSTYPE yyvsa[YYINITDEPTH];
+- YYSTYPE *yyvs;
+- YYSTYPE *yyvsp;
+-
+- YYSIZE_T yystacksize;
+-
+- int yyn;
+- int yyresult;
+- /* Lookahead token as an internal (translated) token number. */
+- int yytoken;
+- /* The variables used to return semantic value and location from the
+- action routines. */
+- YYSTYPE yyval;
+-
+-#if YYERROR_VERBOSE
+- /* Buffer for error messages, and its allocated size. */
+- char yymsgbuf[128];
+- char *yymsg = yymsgbuf;
+- YYSIZE_T yymsg_alloc = sizeof yymsgbuf;
+-#endif
+-
+-#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N))
+-
+- /* The number of symbols on the RHS of the reduced rule.
+- Keep to zero when no symbol should be popped. */
+- int yylen = 0;
+-
+- yytoken = 0;
+- yyss = yyssa;
+- yyvs = yyvsa;
+- yystacksize = YYINITDEPTH;
+-
+- YYDPRINTF ((stderr, "Starting parse\n"));
+-
+- yystate = 0;
+- yyerrstatus = 0;
+- yynerrs = 0;
+- yychar = YYEMPTY; /* Cause a token to be read. */
+-
+- /* Initialize stack pointers.
+- Waste one element of value and location stack
+- so that they stay on the same level as the state stack.
+- The wasted elements are never initialized. */
+- yyssp = yyss;
+- yyvsp = yyvs;
+-
+- goto yysetstate;
+-
+-/*------------------------------------------------------------.
+-| yynewstate -- Push a new state, which is found in yystate. |
+-`------------------------------------------------------------*/
+- yynewstate:
+- /* In all cases, when you get here, the value and location stacks
+- have just been pushed. So pushing a state here evens the stacks. */
+- yyssp++;
+-
+- yysetstate:
+- *yyssp = yystate;
+-
+- if (yyss + yystacksize - 1 <= yyssp)
+- {
+- /* Get the current used size of the three stacks, in elements. */
+- YYSIZE_T yysize = yyssp - yyss + 1;
+-
+-#ifdef yyoverflow
+- {
+- /* Give user a chance to reallocate the stack. Use copies of
+- these so that the &'s don't force the real ones into
+- memory. */
+- YYSTYPE *yyvs1 = yyvs;
+- yytype_int16 *yyss1 = yyss;
+-
+- /* Each stack pointer address is followed by the size of the
+- data in use in that stack, in bytes. This used to be a
+- conditional around just the two extra args, but that might
+- be undefined if yyoverflow is a macro. */
+- yyoverflow (YY_("memory exhausted"),
+- &yyss1, yysize * sizeof (*yyssp),
+- &yyvs1, yysize * sizeof (*yyvsp),
+- &yystacksize);
+-
+- yyss = yyss1;
+- yyvs = yyvs1;
+- }
+-#else /* no yyoverflow */
+-# ifndef YYSTACK_RELOCATE
+- goto yyexhaustedlab;
+-# else
+- /* Extend the stack our own way. */
+- if (YYMAXDEPTH <= yystacksize)
+- goto yyexhaustedlab;
+- yystacksize *= 2;
+- if (YYMAXDEPTH < yystacksize)
+- yystacksize = YYMAXDEPTH;
+-
+- {
+- yytype_int16 *yyss1 = yyss;
+- union yyalloc *yyptr =
+- (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
+- if (! yyptr)
+- goto yyexhaustedlab;
+- YYSTACK_RELOCATE (yyss_alloc, yyss);
+- YYSTACK_RELOCATE (yyvs_alloc, yyvs);
+-# undef YYSTACK_RELOCATE
+- if (yyss1 != yyssa)
+- YYSTACK_FREE (yyss1);
+- }
+-# endif
+-#endif /* no yyoverflow */
+-
+- yyssp = yyss + yysize - 1;
+- yyvsp = yyvs + yysize - 1;
+-
+- YYDPRINTF ((stderr, "Stack size increased to %lu\n",
+- (unsigned long int) yystacksize));
+-
+- if (yyss + yystacksize - 1 <= yyssp)
+- YYABORT;
+- }
+-
+- YYDPRINTF ((stderr, "Entering state %d\n", yystate));
+-
+- if (yystate == YYFINAL)
+- YYACCEPT;
+-
+- goto yybackup;
+-
+-/*-----------.
+-| yybackup. |
+-`-----------*/
+-yybackup:
+-
+- /* Do appropriate processing given the current state. Read a
+- lookahead token if we need one and don't already have one. */
+-
+- /* First try to decide what to do without reference to lookahead token. */
+- yyn = yypact[yystate];
+- if (yyn == YYPACT_NINF)
+- goto yydefault;
+-
+- /* Not known => get a lookahead token if don't already have one. */
+-
+- /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */
+- if (yychar == YYEMPTY)
+- {
+- YYDPRINTF ((stderr, "Reading a token: "));
+- yychar = YYLEX;
+- }
+-
+- if (yychar <= YYEOF)
+- {
+- yychar = yytoken = YYEOF;
+- YYDPRINTF ((stderr, "Now at end of input.\n"));
+- }
+- else
+- {
+- yytoken = YYTRANSLATE (yychar);
+- YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
+- }
+-
+- /* If the proper action on seeing token YYTOKEN is to reduce or to
+- detect an error, take that action. */
+- yyn += yytoken;
+- if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
+- goto yydefault;
+- yyn = yytable[yyn];
+- if (yyn <= 0)
+- {
+- if (yyn == 0 || yyn == YYTABLE_NINF)
+- goto yyerrlab;
+- yyn = -yyn;
+- goto yyreduce;
+- }
+-
+- /* Count tokens shifted since error; after three, turn off error
+- status. */
+- if (yyerrstatus)
+- yyerrstatus--;
+-
+- /* Shift the lookahead token. */
+- YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
+-
+- /* Discard the shifted token. */
+- yychar = YYEMPTY;
+-
+- yystate = yyn;
+- *++yyvsp = yylval;
+-
+- goto yynewstate;
+-
+-
+-/*-----------------------------------------------------------.
+-| yydefault -- do the default action for the current state. |
+-`-----------------------------------------------------------*/
+-yydefault:
+- yyn = yydefact[yystate];
+- if (yyn == 0)
+- goto yyerrlab;
+- goto yyreduce;
+-
+-
+-/*-----------------------------.
+-| yyreduce -- Do a reduction. |
+-`-----------------------------*/
+-yyreduce:
+- /* yyn is the number of a rule to reduce with. */
+- yylen = yyr2[yyn];
+-
+- /* If YYLEN is nonzero, implement the default value of the action:
+- `$$ = $1'.
+-
+- Otherwise, the following line sets YYVAL to garbage.
+- This behavior is undocumented and Bison
+- users should not rely upon it. Assigning to YYVAL
+- unconditionally makes the parser a bit smaller, and it avoids a
+- GCC warning that YYVAL may be used uninitialized. */
+- yyval = yyvsp[1-yylen];
+-
+-
+- YY_REDUCE_PRINT (yyn);
+- switch (yyn)
+- {
+- case 2:
+-
+-/* Line 1455 of yacc.c */
+-#line 155 "plural.y"
+- {
+- if ((yyvsp[(1) - (1)].exp) == NULL)
+- YYABORT;
+- ((struct parse_args *) arg)->res = (yyvsp[(1) - (1)].exp);
+- }
+- break;
+-
+- case 3:
+-
+-/* Line 1455 of yacc.c */
+-#line 163 "plural.y"
+- {
+- (yyval.exp) = new_exp_3 (qmop, (yyvsp[(1) - (5)].exp), (yyvsp[(3) - (5)].exp), (yyvsp[(5) - (5)].exp));
+- }
+- break;
+-
+- case 4:
+-
+-/* Line 1455 of yacc.c */
+-#line 167 "plural.y"
+- {
+- (yyval.exp) = new_exp_2 (lor, (yyvsp[(1) - (3)].exp), (yyvsp[(3) - (3)].exp));
+- }
+- break;
+-
+- case 5:
+-
+-/* Line 1455 of yacc.c */
+-#line 171 "plural.y"
+- {
+- (yyval.exp) = new_exp_2 (land, (yyvsp[(1) - (3)].exp), (yyvsp[(3) - (3)].exp));
+- }
+- break;
+-
+- case 6:
+-
+-/* Line 1455 of yacc.c */
+-#line 175 "plural.y"
+- {
+- (yyval.exp) = new_exp_2 ((yyvsp[(2) - (3)].op), (yyvsp[(1) - (3)].exp), (yyvsp[(3) - (3)].exp));
+- }
+- break;
+-
+- case 7:
+-
+-/* Line 1455 of yacc.c */
+-#line 179 "plural.y"
+- {
+- (yyval.exp) = new_exp_2 ((yyvsp[(2) - (3)].op), (yyvsp[(1) - (3)].exp), (yyvsp[(3) - (3)].exp));
+- }
+- break;
+-
+- case 8:
+-
+-/* Line 1455 of yacc.c */
+-#line 183 "plural.y"
+- {
+- (yyval.exp) = new_exp_2 ((yyvsp[(2) - (3)].op), (yyvsp[(1) - (3)].exp), (yyvsp[(3) - (3)].exp));
+- }
+- break;
+-
+- case 9:
+-
+-/* Line 1455 of yacc.c */
+-#line 187 "plural.y"
+- {
+- (yyval.exp) = new_exp_2 ((yyvsp[(2) - (3)].op), (yyvsp[(1) - (3)].exp), (yyvsp[(3) - (3)].exp));
+- }
+- break;
+-
+- case 10:
+-
+-/* Line 1455 of yacc.c */
+-#line 191 "plural.y"
+- {
+- (yyval.exp) = new_exp_1 (lnot, (yyvsp[(2) - (2)].exp));
+- }
+- break;
+-
+- case 11:
+-
+-/* Line 1455 of yacc.c */
+-#line 195 "plural.y"
+- {
+- (yyval.exp) = new_exp_0 (var);
+- }
+- break;
+-
+- case 12:
+-
+-/* Line 1455 of yacc.c */
+-#line 199 "plural.y"
+- {
+- if (((yyval.exp) = new_exp_0 (num)) != NULL)
+- (yyval.exp)->val.num = (yyvsp[(1) - (1)].num);
+- }
+- break;
+-
+- case 13:
+-
+-/* Line 1455 of yacc.c */
+-#line 204 "plural.y"
+- {
+- (yyval.exp) = (yyvsp[(2) - (3)].exp);
+- }
+- break;
+-
+-
+-
+-/* Line 1455 of yacc.c */
+-#line 1592 "plural.c"
+- default: break;
+- }
+- YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
+-
+- YYPOPSTACK (yylen);
+- yylen = 0;
+- YY_STACK_PRINT (yyss, yyssp);
+-
+- *++yyvsp = yyval;
+-
+- /* Now `shift' the result of the reduction. Determine what state
+- that goes to, based on the state we popped back to and the rule
+- number reduced by. */
+-
+- yyn = yyr1[yyn];
+-
+- yystate = yypgoto[yyn - YYNTOKENS] + *yyssp;
+- if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp)
+- yystate = yytable[yystate];
+- else
+- yystate = yydefgoto[yyn - YYNTOKENS];
+-
+- goto yynewstate;
+-
+-
+-/*------------------------------------.
+-| yyerrlab -- here on detecting error |
+-`------------------------------------*/
+-yyerrlab:
+- /* If not already recovering from an error, report this error. */
+- if (!yyerrstatus)
+- {
+- ++yynerrs;
+-#if ! YYERROR_VERBOSE
+- yyerror (YY_("syntax error"));
+-#else
+- {
+- YYSIZE_T yysize = yysyntax_error (0, yystate, yychar);
+- if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM)
+- {
+- YYSIZE_T yyalloc = 2 * yysize;
+- if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM))
+- yyalloc = YYSTACK_ALLOC_MAXIMUM;
+- if (yymsg != yymsgbuf)
+- YYSTACK_FREE (yymsg);
+- yymsg = (char *) YYSTACK_ALLOC (yyalloc);
+- if (yymsg)
+- yymsg_alloc = yyalloc;
+- else
+- {
+- yymsg = yymsgbuf;
+- yymsg_alloc = sizeof yymsgbuf;
+- }
+- }
+-
+- if (0 < yysize && yysize <= yymsg_alloc)
+- {
+- (void) yysyntax_error (yymsg, yystate, yychar);
+- yyerror (yymsg);
+- }
+- else
+- {
+- yyerror (YY_("syntax error"));
+- if (yysize != 0)
+- goto yyexhaustedlab;
+- }
+- }
+-#endif
+- }
+-
+-
+-
+- if (yyerrstatus == 3)
+- {
+- /* If just tried and failed to reuse lookahead token after an
+- error, discard it. */
+-
+- if (yychar <= YYEOF)
+- {
+- /* Return failure if at end of input. */
+- if (yychar == YYEOF)
+- YYABORT;
+- }
+- else
+- {
+- yydestruct ("Error: discarding",
+- yytoken, &yylval);
+- yychar = YYEMPTY;
+- }
+- }
+-
+- /* Else will try to reuse lookahead token after shifting the error
+- token. */
+- goto yyerrlab1;
+-
+-
+-/*---------------------------------------------------.
+-| yyerrorlab -- error raised explicitly by YYERROR. |
+-`---------------------------------------------------*/
+-yyerrorlab:
+-
+- /* Pacify compilers like GCC when the user code never invokes
+- YYERROR and the label yyerrorlab therefore never appears in user
+- code. */
+- if (/*CONSTCOND*/ 0)
+- goto yyerrorlab;
+-
+- /* Do not reclaim the symbols of the rule which action triggered
+- this YYERROR. */
+- YYPOPSTACK (yylen);
+- yylen = 0;
+- YY_STACK_PRINT (yyss, yyssp);
+- yystate = *yyssp;
+- goto yyerrlab1;
+-
+-
+-/*-------------------------------------------------------------.
+-| yyerrlab1 -- common code for both syntax error and YYERROR. |
+-`-------------------------------------------------------------*/
+-yyerrlab1:
+- yyerrstatus = 3; /* Each real token shifted decrements this. */
+-
+- for (;;)
+- {
+- yyn = yypact[yystate];
+- if (yyn != YYPACT_NINF)
+- {
+- yyn += YYTERROR;
+- if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
+- {
+- yyn = yytable[yyn];
+- if (0 < yyn)
+- break;
+- }
+- }
+-
+- /* Pop the current state because it cannot handle the error token. */
+- if (yyssp == yyss)
+- YYABORT;
+-
+-
+- yydestruct ("Error: popping",
+- yystos[yystate], yyvsp);
+- YYPOPSTACK (1);
+- yystate = *yyssp;
+- YY_STACK_PRINT (yyss, yyssp);
+- }
+-
+- *++yyvsp = yylval;
+-
+-
+- /* Shift the error token. */
+- YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp);
+-
+- yystate = yyn;
+- goto yynewstate;
+-
+-
+-/*-------------------------------------.
+-| yyacceptlab -- YYACCEPT comes here. |
+-`-------------------------------------*/
+-yyacceptlab:
+- yyresult = 0;
+- goto yyreturn;
+-
+-/*-----------------------------------.
+-| yyabortlab -- YYABORT comes here. |
+-`-----------------------------------*/
+-yyabortlab:
+- yyresult = 1;
+- goto yyreturn;
+-
+-#if !defined(yyoverflow) || YYERROR_VERBOSE
+-/*-------------------------------------------------.
+-| yyexhaustedlab -- memory exhaustion comes here. |
+-`-------------------------------------------------*/
+-yyexhaustedlab:
+- yyerror (YY_("memory exhausted"));
+- yyresult = 2;
+- /* Fall through. */
+-#endif
+-
+-yyreturn:
+- if (yychar != YYEMPTY)
+- yydestruct ("Cleanup: discarding lookahead",
+- yytoken, &yylval);
+- /* Do not reclaim the symbols of the rule which action triggered
+- this YYABORT or YYACCEPT. */
+- YYPOPSTACK (yylen);
+- YY_STACK_PRINT (yyss, yyssp);
+- while (yyssp != yyss)
+- {
+- yydestruct ("Cleanup: popping",
+- yystos[*yyssp], yyvsp);
+- YYPOPSTACK (1);
+- }
+-#ifndef yyoverflow
+- if (yyss != yyssa)
+- YYSTACK_FREE (yyss);
+-#endif
+-#if YYERROR_VERBOSE
+- if (yymsg != yymsgbuf)
+- YYSTACK_FREE (yymsg);
+-#endif
+- /* Make sure YYID is used. */
+- return YYID (yyresult);
+-}
+-
+-
+-
+-/* Line 1675 of yacc.c */
+-#line 209 "plural.y"
+-
+-
+-void
+-internal_function
+-FREE_EXPRESSION (struct expression *exp)
+-{
+- if (exp == NULL)
+- return;
+-
+- /* Handle the recursive case. */
+- switch (exp->nargs)
+- {
+- case 3:
+- FREE_EXPRESSION (exp->val.args[2]);
+- /* FALLTHROUGH */
+- case 2:
+- FREE_EXPRESSION (exp->val.args[1]);
+- /* FALLTHROUGH */
+- case 1:
+- FREE_EXPRESSION (exp->val.args[0]);
+- /* FALLTHROUGH */
+- default:
+- break;
+- }
+-
+- free (exp);
+-}
+-
+-
+-static int
+-yylex (YYSTYPE *lval, const char **pexp)
+-{
+- const char *exp = *pexp;
+- int result;
+-
+- while (1)
+- {
+- if (exp[0] == '\0')
+- {
+- *pexp = exp;
+- return YYEOF;
+- }
+-
+- if (exp[0] != ' ' && exp[0] != '\t')
+- break;
+-
+- ++exp;
+- }
+-
+- result = *exp++;
+- switch (result)
+- {
+- case '0': case '1': case '2': case '3': case '4':
+- case '5': case '6': case '7': case '8': case '9':
+- {
+- unsigned long int n = result - '0';
+- while (exp[0] >= '0' && exp[0] <= '9')
+- {
+- n *= 10;
+- n += exp[0] - '0';
+- ++exp;
+- }
+- lval->num = n;
+- result = NUMBER;
+- }
+- break;
+-
+- case '=':
+- if (exp[0] == '=')
+- {
+- ++exp;
+- lval->op = equal;
+- result = EQUOP2;
+- }
+- else
+- result = YYERRCODE;
+- break;
+-
+- case '!':
+- if (exp[0] == '=')
+- {
+- ++exp;
+- lval->op = not_equal;
+- result = EQUOP2;
+- }
+- break;
+-
+- case '&':
+- case '|':
+- if (exp[0] == result)
+- ++exp;
+- else
+- result = YYERRCODE;
+- break;
+-
+- case '<':
+- if (exp[0] == '=')
+- {
+- ++exp;
+- lval->op = less_or_equal;
+- }
+- else
+- lval->op = less_than;
+- result = CMPOP2;
+- break;
+-
+- case '>':
+- if (exp[0] == '=')
+- {
+- ++exp;
+- lval->op = greater_or_equal;
+- }
+- else
+- lval->op = greater_than;
+- result = CMPOP2;
+- break;
+-
+- case '*':
+- lval->op = mult;
+- result = MULOP2;
+- break;
+-
+- case '/':
+- lval->op = divide;
+- result = MULOP2;
+- break;
+-
+- case '%':
+- lval->op = module;
+- result = MULOP2;
+- break;
+-
+- case '+':
+- lval->op = plus;
+- result = ADDOP2;
+- break;
+-
+- case '-':
+- lval->op = minus;
+- result = ADDOP2;
+- break;
+-
+- case 'n':
+- case '?':
+- case ':':
+- case '(':
+- case ')':
+- /* Nothing, just return the character. */
+- break;
+-
+- case ';':
+- case '\n':
+- case '\0':
+- /* Be safe and let the user call this function again. */
+- --exp;
+- result = YYEOF;
+- break;
+-
+- default:
+- result = YYERRCODE;
+-#if YYDEBUG != 0
+- --exp;
+-#endif
+- break;
+- }
+-
+- *pexp = exp;
+-
+- return result;
+-}
+-
+-
+-static void
+-yyerror (const char *str)
+-{
+- /* Do nothing. We don't print error messages here. */
+-}
+-
+--- a/intl/plural.y
++++ /dev/null
+@@ -1,385 +0,0 @@
+-%{
+-/* Expression parsing for plural form selection.
+- Copyright (C) 2000-2001, 2003, 2005-2006 Free Software Foundation, Inc.
+- Written by Ulrich Drepper <drepper@cygnus.com>, 2000.
+-
+- 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. */
+-
+-/* For bison < 2.0, the bison generated parser uses alloca. AIX 3 forces us
+- to put this declaration at the beginning of the file. The declaration in
+- bison's skeleton file comes too late. This must come before <config.h>
+- because <config.h> may include arbitrary system headers.
+- This can go away once the AM_INTL_SUBDIR macro requires bison >= 2.0. */
+-#if defined _AIX && !defined __GNUC__
+- #pragma alloca
+-#endif
+-
+-#ifdef HAVE_CONFIG_H
+-# include <config.h>
+-#endif
+-
+-#include <stddef.h>
+-#include <stdlib.h>
+-#include <string.h>
+-#include "plural-exp.h"
+-
+-/* The main function generated by the parser is called __gettextparse,
+- but we want it to be called PLURAL_PARSE. */
+-#ifndef _LIBC
+-# define __gettextparse PLURAL_PARSE
+-#endif
+-
+-#define YYLEX_PARAM &((struct parse_args *) arg)->cp
+-#define YYPARSE_PARAM arg
+-%}
+-%pure_parser
+-%expect 7
+-
+-%union {
+- unsigned long int num;
+- enum expression_operator op;
+- struct expression *exp;
+-}
+-
+-%{
+-/* Prototypes for local functions. */
+-static int yylex (YYSTYPE *lval, const char **pexp);
+-static void yyerror (const char *str);
+-
+-/* Allocation of expressions. */
+-
+-static struct expression *
+-new_exp (int nargs, enum expression_operator op,
+- struct expression * const *args)
+-{
+- int i;
+- struct expression *newp;
+-
+- /* If any of the argument could not be malloc'ed, just return NULL. */
+- for (i = nargs - 1; i >= 0; i--)
+- if (args[i] == NULL)
+- goto fail;
+-
+- /* Allocate a new expression. */
+- newp = (struct expression *) malloc (sizeof (*newp));
+- if (newp != NULL)
+- {
+- newp->nargs = nargs;
+- newp->operation = op;
+- for (i = nargs - 1; i >= 0; i--)
+- newp->val.args[i] = args[i];
+- return newp;
+- }
+-
+- fail:
+- for (i = nargs - 1; i >= 0; i--)
+- FREE_EXPRESSION (args[i]);
+-
+- return NULL;
+-}
+-
+-static inline struct expression *
+-new_exp_0 (enum expression_operator op)
+-{
+- return new_exp (0, op, NULL);
+-}
+-
+-static inline struct expression *
+-new_exp_1 (enum expression_operator op, struct expression *right)
+-{
+- struct expression *args[1];
+-
+- args[0] = right;
+- return new_exp (1, op, args);
+-}
+-
+-static struct expression *
+-new_exp_2 (enum expression_operator op, struct expression *left,
+- struct expression *right)
+-{
+- struct expression *args[2];
+-
+- args[0] = left;
+- args[1] = right;
+- return new_exp (2, op, args);
+-}
+-
+-static inline struct expression *
+-new_exp_3 (enum expression_operator op, struct expression *bexp,
+- struct expression *tbranch, struct expression *fbranch)
+-{
+- struct expression *args[3];
+-
+- args[0] = bexp;
+- args[1] = tbranch;
+- args[2] = fbranch;
+- return new_exp (3, op, args);
+-}
+-
+-%}
+-
+-/* This declares that all operators have the same associativity and the
+- precedence order as in C. See [Harbison, Steele: C, A Reference Manual].
+- There is no unary minus and no bitwise operators.
+- Operators with the same syntactic behaviour have been merged into a single
+- token, to save space in the array generated by bison. */
+-%right '?' /* ? */
+-%left '|' /* || */
+-%left '&' /* && */
+-%left EQUOP2 /* == != */
+-%left CMPOP2 /* < > <= >= */
+-%left ADDOP2 /* + - */
+-%left MULOP2 /* * / % */
+-%right '!' /* ! */
+-
+-%token <op> EQUOP2 CMPOP2 ADDOP2 MULOP2
+-%token <num> NUMBER
+-%type <exp> exp
+-
+-%%
+-
+-start: exp
+- {
+- if ($1 == NULL)
+- YYABORT;
+- ((struct parse_args *) arg)->res = $1;
+- }
+- ;
+-
+-exp: exp '?' exp ':' exp
+- {
+- $$ = new_exp_3 (qmop, $1, $3, $5);
+- }
+- | exp '|' exp
+- {
+- $$ = new_exp_2 (lor, $1, $3);
+- }
+- | exp '&' exp
+- {
+- $$ = new_exp_2 (land, $1, $3);
+- }
+- | exp EQUOP2 exp
+- {
+- $$ = new_exp_2 ($2, $1, $3);
+- }
+- | exp CMPOP2 exp
+- {
+- $$ = new_exp_2 ($2, $1, $3);
+- }
+- | exp ADDOP2 exp
+- {
+- $$ = new_exp_2 ($2, $1, $3);
+- }
+- | exp MULOP2 exp
+- {
+- $$ = new_exp_2 ($2, $1, $3);
+- }
+- | '!' exp
+- {
+- $$ = new_exp_1 (lnot, $2);
+- }
+- | 'n'
+- {
+- $$ = new_exp_0 (var);
+- }
+- | NUMBER
+- {
+- if (($$ = new_exp_0 (num)) != NULL)
+- $$->val.num = $1;
+- }
+- | '(' exp ')'
+- {
+- $$ = $2;
+- }
+- ;
+-
+-%%
+-
+-void
+-internal_function
+-FREE_EXPRESSION (struct expression *exp)
+-{
+- if (exp == NULL)
+- return;
+-
+- /* Handle the recursive case. */
+- switch (exp->nargs)
+- {
+- case 3:
+- FREE_EXPRESSION (exp->val.args[2]);
+- /* FALLTHROUGH */
+- case 2:
+- FREE_EXPRESSION (exp->val.args[1]);
+- /* FALLTHROUGH */
+- case 1:
+- FREE_EXPRESSION (exp->val.args[0]);
+- /* FALLTHROUGH */
+- default:
+- break;
+- }
+-
+- free (exp);
+-}
+-
+-
+-static int
+-yylex (YYSTYPE *lval, const char **pexp)
+-{
+- const char *exp = *pexp;
+- int result;
+-
+- while (1)
+- {
+- if (exp[0] == '\0')
+- {
+- *pexp = exp;
+- return YYEOF;
+- }
+-
+- if (exp[0] != ' ' && exp[0] != '\t')
+- break;
+-
+- ++exp;
+- }
+-
+- result = *exp++;
+- switch (result)
+- {
+- case '0': case '1': case '2': case '3': case '4':
+- case '5': case '6': case '7': case '8': case '9':
+- {
+- unsigned long int n = result - '0';
+- while (exp[0] >= '0' && exp[0] <= '9')
+- {
+- n *= 10;
+- n += exp[0] - '0';
+- ++exp;
+- }
+- lval->num = n;
+- result = NUMBER;
+- }
+- break;
+-
+- case '=':
+- if (exp[0] == '=')
+- {
+- ++exp;
+- lval->op = equal;
+- result = EQUOP2;
+- }
+- else
+- result = YYERRCODE;
+- break;
+-
+- case '!':
+- if (exp[0] == '=')
+- {
+- ++exp;
+- lval->op = not_equal;
+- result = EQUOP2;
+- }
+- break;
+-
+- case '&':
+- case '|':
+- if (exp[0] == result)
+- ++exp;
+- else
+- result = YYERRCODE;
+- break;
+-
+- case '<':
+- if (exp[0] == '=')
+- {
+- ++exp;
+- lval->op = less_or_equal;
+- }
+- else
+- lval->op = less_than;
+- result = CMPOP2;
+- break;
+-
+- case '>':
+- if (exp[0] == '=')
+- {
+- ++exp;
+- lval->op = greater_or_equal;
+- }
+- else
+- lval->op = greater_than;
+- result = CMPOP2;
+- break;
+-
+- case '*':
+- lval->op = mult;
+- result = MULOP2;
+- break;
+-
+- case '/':
+- lval->op = divide;
+- result = MULOP2;
+- break;
+-
+- case '%':
+- lval->op = module;
+- result = MULOP2;
+- break;
+-
+- case '+':
+- lval->op = plus;
+- result = ADDOP2;
+- break;
+-
+- case '-':
+- lval->op = minus;
+- result = ADDOP2;
+- break;
+-
+- case 'n':
+- case '?':
+- case ':':
+- case '(':
+- case ')':
+- /* Nothing, just return the character. */
+- break;
+-
+- case ';':
+- case '\n':
+- case '\0':
+- /* Be safe and let the user call this function again. */
+- --exp;
+- result = YYEOF;
+- break;
+-
+- default:
+- result = YYERRCODE;
+-#if YYDEBUG != 0
+- --exp;
+-#endif
+- break;
+- }
+-
+- *pexp = exp;
+-
+- return result;
+-}
+-
+-
+-static void
+-yyerror (const char *str)
+-{
+- /* Do nothing. We don't print error messages here. */
+-}
+--- a/intl/printf-args.c
++++ /dev/null
+@@ -1,188 +0,0 @@
+-/* Decomposed printf argument list.
+- Copyright (C) 1999, 2002-2003, 2005-2007 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. */
+-
+-/* This file can be parametrized with the following macros:
+- ENABLE_UNISTDIO Set to 1 to enable the unistdio extensions.
+- PRINTF_FETCHARGS Name of the function to be defined.
+- STATIC Set to 'static' to declare the function static. */
+-
+-#ifndef PRINTF_FETCHARGS
+-# include <config.h>
+-#endif
+-
+-/* Specification. */
+-#ifndef PRINTF_FETCHARGS
+-# include "printf-args.h"
+-#endif
+-
+-#ifdef STATIC
+-STATIC
+-#endif
+-int
+-PRINTF_FETCHARGS (va_list args, arguments *a)
+-{
+- size_t 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;
+-#if HAVE_LONG_LONG_INT
+- 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
+- case TYPE_DOUBLE:
+- ap->a.a_double = va_arg (args, double);
+- break;
+- case TYPE_LONGDOUBLE:
+- ap->a.a_longdouble = va_arg (args, long double);
+- break;
+- case TYPE_CHAR:
+- ap->a.a_char = va_arg (args, int);
+- break;
+-#if HAVE_WINT_T
+- case TYPE_WIDE_CHAR:
+- /* Although ISO C 99 7.24.1.(2) says that wint_t is "unchanged by
+- default argument promotions", this is not the case in mingw32,
+- where wint_t is 'unsigned short'. */
+- ap->a.a_wide_char =
+- (sizeof (wint_t) < sizeof (int)
+- ? va_arg (args, int)
+- : va_arg (args, wint_t));
+- break;
+-#endif
+- case TYPE_STRING:
+- ap->a.a_string = va_arg (args, const char *);
+- /* A null pointer is an invalid argument for "%s", but in practice
+- it occurs quite frequently in printf statements that produce
+- debug output. Use a fallback in this case. */
+- if (ap->a.a_string == NULL)
+- ap->a.a_string = "(NULL)";
+- break;
+-#if HAVE_WCHAR_T
+- case TYPE_WIDE_STRING:
+- ap->a.a_wide_string = va_arg (args, const wchar_t *);
+- /* A null pointer is an invalid argument for "%ls", but in practice
+- it occurs quite frequently in printf statements that produce
+- debug output. Use a fallback in this case. */
+- if (ap->a.a_wide_string == NULL)
+- {
+- static const wchar_t wide_null_string[] =
+- {
+- (wchar_t)'(',
+- (wchar_t)'N', (wchar_t)'U', (wchar_t)'L', (wchar_t)'L',
+- (wchar_t)')',
+- (wchar_t)0
+- };
+- ap->a.a_wide_string = wide_null_string;
+- }
+- 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;
+-#if HAVE_LONG_LONG_INT
+- case TYPE_COUNT_LONGLONGINT_POINTER:
+- ap->a.a_count_longlongint_pointer = va_arg (args, long long int *);
+- break;
+-#endif
+-#if ENABLE_UNISTDIO
+- /* The unistdio extensions. */
+- case TYPE_U8_STRING:
+- ap->a.a_u8_string = va_arg (args, const uint8_t *);
+- /* A null pointer is an invalid argument for "%U", but in practice
+- it occurs quite frequently in printf statements that produce
+- debug output. Use a fallback in this case. */
+- if (ap->a.a_u8_string == NULL)
+- {
+- static const uint8_t u8_null_string[] =
+- { '(', 'N', 'U', 'L', 'L', ')', 0 };
+- ap->a.a_u8_string = u8_null_string;
+- }
+- break;
+- case TYPE_U16_STRING:
+- ap->a.a_u16_string = va_arg (args, const uint16_t *);
+- /* A null pointer is an invalid argument for "%lU", but in practice
+- it occurs quite frequently in printf statements that produce
+- debug output. Use a fallback in this case. */
+- if (ap->a.a_u16_string == NULL)
+- {
+- static const uint16_t u16_null_string[] =
+- { '(', 'N', 'U', 'L', 'L', ')', 0 };
+- ap->a.a_u16_string = u16_null_string;
+- }
+- break;
+- case TYPE_U32_STRING:
+- ap->a.a_u32_string = va_arg (args, const uint32_t *);
+- /* A null pointer is an invalid argument for "%llU", but in practice
+- it occurs quite frequently in printf statements that produce
+- debug output. Use a fallback in this case. */
+- if (ap->a.a_u32_string == NULL)
+- {
+- static const uint32_t u32_null_string[] =
+- { '(', 'N', 'U', 'L', 'L', ')', 0 };
+- ap->a.a_u32_string = u32_null_string;
+- }
+- break;
+-#endif
+- default:
+- /* Unknown type. */
+- return -1;
+- }
+- return 0;
+-}
+--- a/intl/printf-args.h
++++ /dev/null
+@@ -1,155 +0,0 @@
+-/* Decomposed printf argument list.
+- Copyright (C) 1999, 2002-2003, 2006-2007 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. */
+-
+-#ifndef _PRINTF_ARGS_H
+-#define _PRINTF_ARGS_H
+-
+-/* This file can be parametrized with the following macros:
+- ENABLE_UNISTDIO Set to 1 to enable the unistdio extensions.
+- PRINTF_FETCHARGS Name of the function to be declared.
+- STATIC Set to 'static' to declare the function static. */
+-
+-/* Default parameters. */
+-#ifndef PRINTF_FETCHARGS
+-# define PRINTF_FETCHARGS printf_fetchargs
+-#endif
+-
+-/* Get size_t. */
+-#include <stddef.h>
+-
+-/* Get wchar_t. */
+-#if HAVE_WCHAR_T
+-# include <stddef.h>
+-#endif
+-
+-/* Get wint_t. */
+-#if HAVE_WINT_T
+-# include <wchar.h>
+-#endif
+-
+-/* Get va_list. */
+-#include <stdarg.h>
+-
+-
+-/* Argument types */
+-typedef enum
+-{
+- TYPE_NONE,
+- TYPE_SCHAR,
+- TYPE_UCHAR,
+- TYPE_SHORT,
+- TYPE_USHORT,
+- TYPE_INT,
+- TYPE_UINT,
+- TYPE_LONGINT,
+- TYPE_ULONGINT,
+-#if HAVE_LONG_LONG_INT
+- TYPE_LONGLONGINT,
+- TYPE_ULONGLONGINT,
+-#endif
+- TYPE_DOUBLE,
+- TYPE_LONGDOUBLE,
+- TYPE_CHAR,
+-#if HAVE_WINT_T
+- TYPE_WIDE_CHAR,
+-#endif
+- TYPE_STRING,
+-#if 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
+-#if HAVE_LONG_LONG_INT
+-, TYPE_COUNT_LONGLONGINT_POINTER
+-#endif
+-#if ENABLE_UNISTDIO
+- /* The unistdio extensions. */
+-, TYPE_U8_STRING
+-, TYPE_U16_STRING
+-, TYPE_U32_STRING
+-#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;
+-#if HAVE_LONG_LONG_INT
+- long long int a_longlongint;
+- unsigned long long int a_ulonglongint;
+-#endif
+- float a_float;
+- double a_double;
+- long double a_longdouble;
+- int a_char;
+-#if HAVE_WINT_T
+- wint_t a_wide_char;
+-#endif
+- const char* a_string;
+-#if 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;
+-#if HAVE_LONG_LONG_INT
+- long long int * a_count_longlongint_pointer;
+-#endif
+-#if ENABLE_UNISTDIO
+- /* The unistdio extensions. */
+- const uint8_t * a_u8_string;
+- const uint16_t * a_u16_string;
+- const uint32_t * a_u32_string;
+-#endif
+- }
+- a;
+-}
+-argument;
+-
+-typedef struct
+-{
+- size_t 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 */
+--- a/intl/printf-parse.c
++++ /dev/null
+@@ -1,590 +0,0 @@
+-/* Formatted output to strings.
+- Copyright (C) 1999-2000, 2002-2003, 2006-2007 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. */
+-
+-/* This file can be parametrized with the following macros:
+- CHAR_T The element type of the format string.
+- CHAR_T_ONLY_ASCII Set to 1 to enable verification that all characters
+- in the format string are ASCII.
+- DIRECTIVE Structure denoting a format directive.
+- Depends on CHAR_T.
+- DIRECTIVES Structure denoting the set of format directives of a
+- format string. Depends on CHAR_T.
+- PRINTF_PARSE Function that parses a format string.
+- Depends on CHAR_T.
+- STATIC Set to 'static' to declare the function static.
+- ENABLE_UNISTDIO Set to 1 to enable the unistdio extensions. */
+-
+-#ifndef PRINTF_PARSE
+-# include <config.h>
+-#endif
+-
+-/* Specification. */
+-#ifndef PRINTF_PARSE
+-# include "printf-parse.h"
+-#endif
+-
+-/* Default parameters. */
+-#ifndef PRINTF_PARSE
+-# define PRINTF_PARSE printf_parse
+-# define CHAR_T char
+-# define DIRECTIVE char_directive
+-# define DIRECTIVES char_directives
+-#endif
+-
+-/* Get size_t, NULL. */
+-#include <stddef.h>
+-
+-/* Get intmax_t. */
+-#if defined IN_LIBINTL || defined IN_LIBASPRINTF
+-# if HAVE_STDINT_H_WITH_UINTMAX
+-# include <stdint.h>
+-# endif
+-# if HAVE_INTTYPES_H_WITH_UINTMAX
+-# include <inttypes.h>
+-# endif
+-#else
+-# include <stdint.h>
+-#endif
+-
+-/* malloc(), realloc(), free(). */
+-#include <stdlib.h>
+-
+-/* errno. */
+-#include <errno.h>
+-
+-/* Checked size_t computations. */
+-#include "xsize.h"
+-
+-#if CHAR_T_ONLY_ASCII
+-/* c_isascii(). */
+-# include "c-ctype.h"
+-#endif
+-
+-#ifdef STATIC
+-STATIC
+-#endif
+-int
+-PRINTF_PARSE (const CHAR_T *format, DIRECTIVES *d, arguments *a)
+-{
+- const CHAR_T *cp = format; /* pointer into format */
+- size_t arg_posn = 0; /* number of regular arguments consumed */
+- size_t d_allocated; /* allocated elements of d->dir */
+- size_t a_allocated; /* allocated elements of a->arg */
+- size_t max_width_length = 0;
+- size_t max_precision_length = 0;
+-
+- d->count = 0;
+- d_allocated = 1;
+- d->dir = (DIRECTIVE *) malloc (d_allocated * sizeof (DIRECTIVE));
+- if (d->dir == NULL)
+- /* Out of memory. */
+- goto out_of_memory_1;
+-
+- a->count = 0;
+- a_allocated = 0;
+- a->arg = NULL;
+-
+-#define REGISTER_ARG(_index_,_type_) \
+- { \
+- size_t n = (_index_); \
+- if (n >= a_allocated) \
+- { \
+- size_t memory_size; \
+- argument *memory; \
+- \
+- a_allocated = xtimes (a_allocated, 2); \
+- if (a_allocated <= n) \
+- a_allocated = xsum (n, 1); \
+- memory_size = xtimes (a_allocated, sizeof (argument)); \
+- if (size_overflow_p (memory_size)) \
+- /* Overflow, would lead to out of memory. */ \
+- goto out_of_memory; \
+- memory = (argument *) (a->arg \
+- ? realloc (a->arg, memory_size) \
+- : malloc (memory_size)); \
+- if (memory == NULL) \
+- /* Out of memory. */ \
+- goto out_of_memory; \
+- 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_T c = *cp++;
+- if (c == '%')
+- {
+- size_t arg_index = ARG_NONE;
+- 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 = ARG_NONE;
+- dp->precision_start = NULL;
+- dp->precision_end = NULL;
+- dp->precision_arg_index = ARG_NONE;
+- dp->arg_index = ARG_NONE;
+-
+- /* Test for positional argument. */
+- if (*cp >= '0' && *cp <= '9')
+- {
+- const CHAR_T *np;
+-
+- for (np = cp; *np >= '0' && *np <= '9'; np++)
+- ;
+- if (*np == '$')
+- {
+- size_t n = 0;
+-
+- for (np = cp; *np >= '0' && *np <= '9'; np++)
+- n = xsum (xtimes (n, 10), *np - '0');
+- if (n == 0)
+- /* Positional argument 0. */
+- goto error;
+- if (size_overflow_p (n))
+- /* n too large, would lead to out of memory later. */
+- 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_T *np;
+-
+- for (np = cp; *np >= '0' && *np <= '9'; np++)
+- ;
+- if (*np == '$')
+- {
+- size_t n = 0;
+-
+- for (np = cp; *np >= '0' && *np <= '9'; np++)
+- n = xsum (xtimes (n, 10), *np - '0');
+- if (n == 0)
+- /* Positional argument 0. */
+- goto error;
+- if (size_overflow_p (n))
+- /* n too large, would lead to out of memory later. */
+- goto error;
+- dp->width_arg_index = n - 1;
+- cp = np + 1;
+- }
+- }
+- if (dp->width_arg_index == ARG_NONE)
+- {
+- dp->width_arg_index = arg_posn++;
+- if (dp->width_arg_index == ARG_NONE)
+- /* arg_posn wrapped around. */
+- goto error;
+- }
+- REGISTER_ARG (dp->width_arg_index, TYPE_INT);
+- }
+- else if (*cp >= '0' && *cp <= '9')
+- {
+- size_t 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_T *np;
+-
+- for (np = cp; *np >= '0' && *np <= '9'; np++)
+- ;
+- if (*np == '$')
+- {
+- size_t n = 0;
+-
+- for (np = cp; *np >= '0' && *np <= '9'; np++)
+- n = xsum (xtimes (n, 10), *np - '0');
+- if (n == 0)
+- /* Positional argument 0. */
+- goto error;
+- if (size_overflow_p (n))
+- /* n too large, would lead to out of memory
+- later. */
+- goto error;
+- dp->precision_arg_index = n - 1;
+- cp = np + 1;
+- }
+- }
+- if (dp->precision_arg_index == ARG_NONE)
+- {
+- dp->precision_arg_index = arg_posn++;
+- if (dp->precision_arg_index == ARG_NONE)
+- /* arg_posn wrapped around. */
+- goto error;
+- }
+- REGISTER_ARG (dp->precision_arg_index, TYPE_INT);
+- }
+- else
+- {
+- size_t 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++;
+- }
+- 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++;
+- }
+- 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':
+-#if HAVE_LONG_LONG_INT
+- /* If 'long long' exists and is larger than 'long': */
+- if (flags >= 16 || (flags & 4))
+- type = TYPE_LONGLONGINT;
+- else
+-#endif
+- /* If 'long long' exists and is the same as 'long', we parse
+- "lld" into TYPE_LONGINT. */
+- 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':
+-#if HAVE_LONG_LONG_INT
+- /* If 'long long' exists and is larger than 'long': */
+- if (flags >= 16 || (flags & 4))
+- type = TYPE_ULONGLONGINT;
+- else
+-#endif
+- /* If 'unsigned long long' exists and is the same as
+- 'unsigned long', we parse "llu" into TYPE_ULONGINT. */
+- 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':
+- if (flags >= 16 || (flags & 4))
+- type = TYPE_LONGDOUBLE;
+- else
+- type = TYPE_DOUBLE;
+- break;
+- case 'c':
+- if (flags >= 8)
+-#if HAVE_WINT_T
+- type = TYPE_WIDE_CHAR;
+-#else
+- goto error;
+-#endif
+- else
+- type = TYPE_CHAR;
+- break;
+-#if HAVE_WINT_T
+- case 'C':
+- type = TYPE_WIDE_CHAR;
+- c = 'c';
+- break;
+-#endif
+- case 's':
+- if (flags >= 8)
+-#if HAVE_WCHAR_T
+- type = TYPE_WIDE_STRING;
+-#else
+- goto error;
+-#endif
+- else
+- type = TYPE_STRING;
+- break;
+-#if HAVE_WCHAR_T
+- case 'S':
+- type = TYPE_WIDE_STRING;
+- c = 's';
+- break;
+-#endif
+- case 'p':
+- type = TYPE_POINTER;
+- break;
+- case 'n':
+-#if HAVE_LONG_LONG_INT
+- /* If 'long long' exists and is larger than 'long': */
+- if (flags >= 16 || (flags & 4))
+- type = TYPE_COUNT_LONGLONGINT_POINTER;
+- else
+-#endif
+- /* If 'long long' exists and is the same as 'long', we parse
+- "lln" into TYPE_COUNT_LONGINT_POINTER. */
+- 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;
+-#if ENABLE_UNISTDIO
+- /* The unistdio extensions. */
+- case 'U':
+- if (flags >= 16)
+- type = TYPE_U32_STRING;
+- else if (flags >= 8)
+- type = TYPE_U16_STRING;
+- else
+- type = TYPE_U8_STRING;
+- break;
+-#endif
+- case '%':
+- type = TYPE_NONE;
+- break;
+- default:
+- /* Unknown conversion character. */
+- goto error;
+- }
+- }
+-
+- if (type != TYPE_NONE)
+- {
+- dp->arg_index = arg_index;
+- if (dp->arg_index == ARG_NONE)
+- {
+- dp->arg_index = arg_posn++;
+- if (dp->arg_index == ARG_NONE)
+- /* arg_posn wrapped around. */
+- goto error;
+- }
+- REGISTER_ARG (dp->arg_index, type);
+- }
+- dp->conversion = c;
+- dp->dir_end = cp;
+- }
+-
+- d->count++;
+- if (d->count >= d_allocated)
+- {
+- size_t memory_size;
+- DIRECTIVE *memory;
+-
+- d_allocated = xtimes (d_allocated, 2);
+- memory_size = xtimes (d_allocated, sizeof (DIRECTIVE));
+- if (size_overflow_p (memory_size))
+- /* Overflow, would lead to out of memory. */
+- goto out_of_memory;
+- memory = (DIRECTIVE *) realloc (d->dir, memory_size);
+- if (memory == NULL)
+- /* Out of memory. */
+- goto out_of_memory;
+- d->dir = memory;
+- }
+- }
+-#if CHAR_T_ONLY_ASCII
+- else if (!c_isascii (c))
+- {
+- /* Non-ASCII character. Not supported. */
+- goto error;
+- }
+-#endif
+- }
+- 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);
+- errno = EINVAL;
+- return -1;
+-
+-out_of_memory:
+- if (a->arg)
+- free (a->arg);
+- if (d->dir)
+- free (d->dir);
+-out_of_memory_1:
+- errno = ENOMEM;
+- return -1;
+-}
+-
+-#undef PRINTF_PARSE
+-#undef DIRECTIVES
+-#undef DIRECTIVE
+-#undef CHAR_T_ONLY_ASCII
+-#undef CHAR_T
+--- a/intl/printf-parse.h
++++ /dev/null
+@@ -1,75 +0,0 @@
+-/* Parse printf format string.
+- 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+- USA. */
+-
+-#ifndef _PRINTF_PARSE_H
+-#define _PRINTF_PARSE_H
+-
+-#include "printf-args.h"
+-
+-
+-/* 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
+-
+-/* arg_index value indicating that no argument is consumed. */
+-#define ARG_NONE (~(size_t)0)
+-
+-/* A parsed directive. */
+-typedef struct
+-{
+- const char* dir_start;
+- const char* dir_end;
+- int flags;
+- const char* width_start;
+- const char* width_end;
+- size_t width_arg_index;
+- const char* precision_start;
+- const char* precision_end;
+- size_t 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 */
+- size_t arg_index;
+-}
+-char_directive;
+-
+-/* A parsed format string. */
+-typedef struct
+-{
+- size_t count;
+- char_directive *dir;
+- size_t max_width_length;
+- size_t 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 */
+--- a/intl/printf.c
++++ /dev/null
+@@ -1,427 +0,0 @@
+-/* Formatted output to strings, using POSIX/XSI format strings with positions.
+- Copyright (C) 2003, 2006-2007 Free Software Foundation, Inc.
+- Written by Bruno Haible <bruno@clisp.org>, 2003.
+-
+- 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. */
+-
+-#ifdef HAVE_CONFIG_H
+-# include <config.h>
+-#endif
+-
+-#ifdef __GNUC__
+-# define alloca __builtin_alloca
+-# define HAVE_ALLOCA 1
+-#else
+-# ifdef _MSC_VER
+-# include <malloc.h>
+-# define alloca _alloca
+-# else
+-# if defined HAVE_ALLOCA_H || defined _LIBC
+-# include <alloca.h>
+-# else
+-# ifdef _AIX
+- #pragma alloca
+-# else
+-# ifndef alloca
+-char *alloca ();
+-# endif
+-# endif
+-# endif
+-# endif
+-#endif
+-
+-#include <stdio.h>
+-
+-#if !HAVE_POSIX_PRINTF
+-
+-#include <errno.h>
+-#include <limits.h>
+-#include <stdlib.h>
+-#include <string.h>
+-
+-/* Some systems, like OSF/1 4.0 and Woe32, don't have EOVERFLOW. */
+-#ifndef EOVERFLOW
+-# define EOVERFLOW E2BIG
+-#endif
+-
+-/* When building a DLL, we must export some functions. Note that because
+- the functions are only defined for binary backward compatibility, we
+- don't need to use __declspec(dllimport) in any case. */
+-#if defined _MSC_VER && BUILDING_DLL
+-# define DLL_EXPORTED __declspec(dllexport)
+-#else
+-# define DLL_EXPORTED
+-#endif
+-
+-#define STATIC static
+-
+-/* This needs to be consistent with libgnuintl.h.in. */
+-#if defined __NetBSD__ || defined __BEOS__ || defined __CYGWIN__ || defined __MINGW32__
+-/* Don't break __attribute__((format(printf,M,N))).
+- This redefinition is only possible because the libc in NetBSD, Cygwin,
+- mingw does not have a function __printf__. */
+-# define libintl_printf __printf__
+-#endif
+-
+-/* Define auxiliary functions declared in "printf-args.h". */
+-#include "printf-args.c"
+-
+-/* Define auxiliary functions declared in "printf-parse.h". */
+-#include "printf-parse.c"
+-
+-/* Define functions declared in "vasnprintf.h". */
+-#define vasnprintf libintl_vasnprintf
+-#include "vasnprintf.c"
+-#if 0 /* not needed */
+-#define asnprintf libintl_asnprintf
+-#include "asnprintf.c"
+-#endif
+-
+-DLL_EXPORTED
+-int
+-libintl_vfprintf (FILE *stream, const char *format, va_list args)
+-{
+- if (strchr (format, '$') == NULL)
+- return vfprintf (stream, format, args);
+- else
+- {
+- size_t length;
+- char *result = libintl_vasnprintf (NULL, &length, format, args);
+- int retval = -1;
+- if (result != NULL)
+- {
+- size_t written = fwrite (result, 1, length, stream);
+- free (result);
+- if (written == length)
+- {
+- if (length > INT_MAX)
+- errno = EOVERFLOW;
+- else
+- retval = length;
+- }
+- }
+- return retval;
+- }
+-}
+-
+-DLL_EXPORTED
+-int
+-libintl_fprintf (FILE *stream, const char *format, ...)
+-{
+- va_list args;
+- int retval;
+-
+- va_start (args, format);
+- retval = libintl_vfprintf (stream, format, args);
+- va_end (args);
+- return retval;
+-}
+-
+-DLL_EXPORTED
+-int
+-libintl_vprintf (const char *format, va_list args)
+-{
+- return libintl_vfprintf (stdout, format, args);
+-}
+-
+-DLL_EXPORTED
+-int
+-libintl_printf (const char *format, ...)
+-{
+- va_list args;
+- int retval;
+-
+- va_start (args, format);
+- retval = libintl_vprintf (format, args);
+- va_end (args);
+- return retval;
+-}
+-
+-DLL_EXPORTED
+-int
+-libintl_vsprintf (char *resultbuf, const char *format, va_list args)
+-{
+- if (strchr (format, '$') == NULL)
+- return vsprintf (resultbuf, format, args);
+- else
+- {
+- size_t length = (size_t) ~0 / (4 * sizeof (char));
+- char *result = libintl_vasnprintf (resultbuf, &length, format, args);
+- if (result != resultbuf)
+- {
+- free (result);
+- return -1;
+- }
+- if (length > INT_MAX)
+- {
+- errno = EOVERFLOW;
+- return -1;
+- }
+- else
+- return length;
+- }
+-}
+-
+-DLL_EXPORTED
+-int
+-libintl_sprintf (char *resultbuf, const char *format, ...)
+-{
+- va_list args;
+- int retval;
+-
+- va_start (args, format);
+- retval = libintl_vsprintf (resultbuf, format, args);
+- va_end (args);
+- return retval;
+-}
+-
+-#if HAVE_SNPRINTF
+-
+-# if HAVE_DECL__SNPRINTF
+- /* Windows. */
+-# define system_vsnprintf _vsnprintf
+-# else
+- /* Unix. */
+-# define system_vsnprintf vsnprintf
+-# endif
+-
+-DLL_EXPORTED
+-int
+-libintl_vsnprintf (char *resultbuf, size_t length, const char *format, va_list args)
+-{
+- if (strchr (format, '$') == NULL)
+- return system_vsnprintf (resultbuf, length, format, args);
+- else
+- {
+- size_t maxlength = length;
+- char *result = libintl_vasnprintf (resultbuf, &length, format, args);
+- if (result != resultbuf)
+- {
+- if (maxlength > 0)
+- {
+- size_t pruned_length =
+- (length < maxlength ? length : maxlength - 1);
+- memcpy (resultbuf, result, pruned_length);
+- resultbuf[pruned_length] = '\0';
+- }
+- free (result);
+- }
+- if (length > INT_MAX)
+- {
+- errno = EOVERFLOW;
+- return -1;
+- }
+- else
+- return length;
+- }
+-}
+-
+-DLL_EXPORTED
+-int
+-libintl_snprintf (char *resultbuf, size_t length, const char *format, ...)
+-{
+- va_list args;
+- int retval;
+-
+- va_start (args, format);
+- retval = libintl_vsnprintf (resultbuf, length, format, args);
+- va_end (args);
+- return retval;
+-}
+-
+-#endif
+-
+-#if HAVE_ASPRINTF
+-
+-DLL_EXPORTED
+-int
+-libintl_vasprintf (char **resultp, const char *format, va_list args)
+-{
+- size_t length;
+- char *result = libintl_vasnprintf (NULL, &length, format, args);
+- if (result == NULL)
+- return -1;
+- if (length > INT_MAX)
+- {
+- free (result);
+- errno = EOVERFLOW;
+- return -1;
+- }
+- *resultp = result;
+- return length;
+-}
+-
+-DLL_EXPORTED
+-int
+-libintl_asprintf (char **resultp, const char *format, ...)
+-{
+- va_list args;
+- int retval;
+-
+- va_start (args, format);
+- retval = libintl_vasprintf (resultp, format, args);
+- va_end (args);
+- return retval;
+-}
+-
+-#endif
+-
+-#if HAVE_FWPRINTF
+-
+-#include <wchar.h>
+-
+-#define WIDE_CHAR_VERSION 1
+-
+-#include "wprintf-parse.h"
+-/* Define auxiliary functions declared in "wprintf-parse.h". */
+-#define CHAR_T wchar_t
+-#define DIRECTIVE wchar_t_directive
+-#define DIRECTIVES wchar_t_directives
+-#define PRINTF_PARSE wprintf_parse
+-#include "printf-parse.c"
+-
+-/* Define functions declared in "vasnprintf.h". */
+-#define vasnwprintf libintl_vasnwprintf
+-#include "vasnprintf.c"
+-#if 0 /* not needed */
+-#define asnwprintf libintl_asnwprintf
+-#include "asnprintf.c"
+-#endif
+-
+-# if HAVE_DECL__SNWPRINTF
+- /* Windows. */
+-# define system_vswprintf _vsnwprintf
+-# else
+- /* Unix. */
+-# define system_vswprintf vswprintf
+-# endif
+-
+-DLL_EXPORTED
+-int
+-libintl_vfwprintf (FILE *stream, const wchar_t *format, va_list args)
+-{
+- if (wcschr (format, '$') == NULL)
+- return vfwprintf (stream, format, args);
+- else
+- {
+- size_t length;
+- wchar_t *result = libintl_vasnwprintf (NULL, &length, format, args);
+- int retval = -1;
+- if (result != NULL)
+- {
+- size_t i;
+- for (i = 0; i < length; i++)
+- if (fputwc (result[i], stream) == WEOF)
+- break;
+- free (result);
+- if (i == length)
+- {
+- if (length > INT_MAX)
+- errno = EOVERFLOW;
+- else
+- retval = length;
+- }
+- }
+- return retval;
+- }
+-}
+-
+-DLL_EXPORTED
+-int
+-libintl_fwprintf (FILE *stream, const wchar_t *format, ...)
+-{
+- va_list args;
+- int retval;
+-
+- va_start (args, format);
+- retval = libintl_vfwprintf (stream, format, args);
+- va_end (args);
+- return retval;
+-}
+-
+-DLL_EXPORTED
+-int
+-libintl_vwprintf (const wchar_t *format, va_list args)
+-{
+- return libintl_vfwprintf (stdout, format, args);
+-}
+-
+-DLL_EXPORTED
+-int
+-libintl_wprintf (const wchar_t *format, ...)
+-{
+- va_list args;
+- int retval;
+-
+- va_start (args, format);
+- retval = libintl_vwprintf (format, args);
+- va_end (args);
+- return retval;
+-}
+-
+-DLL_EXPORTED
+-int
+-libintl_vswprintf (wchar_t *resultbuf, size_t length, const wchar_t *format, va_list args)
+-{
+- if (wcschr (format, '$') == NULL)
+- return system_vswprintf (resultbuf, length, format, args);
+- else
+- {
+- size_t maxlength = length;
+- wchar_t *result = libintl_vasnwprintf (resultbuf, &length, format, args);
+- if (result != resultbuf)
+- {
+- if (maxlength > 0)
+- {
+- size_t pruned_length =
+- (length < maxlength ? length : maxlength - 1);
+- memcpy (resultbuf, result, pruned_length * sizeof (wchar_t));
+- resultbuf[pruned_length] = 0;
+- }
+- free (result);
+- /* Unlike vsnprintf, which has to return the number of character that
+- would have been produced if the resultbuf had been sufficiently
+- large, the vswprintf function has to return a negative value if
+- the resultbuf was not sufficiently large. */
+- if (length >= maxlength)
+- return -1;
+- }
+- if (length > INT_MAX)
+- {
+- errno = EOVERFLOW;
+- return -1;
+- }
+- else
+- return length;
+- }
+-}
+-
+-DLL_EXPORTED
+-int
+-libintl_swprintf (wchar_t *resultbuf, size_t length, const wchar_t *format, ...)
+-{
+- va_list args;
+- int retval;
+-
+- va_start (args, format);
+- retval = libintl_vswprintf (resultbuf, length, format, args);
+- va_end (args);
+- return retval;
+-}
+-
+-#endif
+-
+-#endif
+--- a/intl/ref-add.sin
++++ /dev/null
+@@ -1,31 +0,0 @@
+-# 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 <haible@clisp.cons.org>.
+-#
+-/^# Packages using this file: / {
+- s/# Packages using this file://
+- ta
+- :a
+- s/ @PACKAGE@ / @PACKAGE@ /
+- tb
+- s/ $/ @PACKAGE@ /
+- :b
+- s/^/# Packages using this file:/
+-}
+--- a/intl/ref-del.sin
++++ /dev/null
+@@ -1,26 +0,0 @@
+-# 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 <haible@clisp.cons.org>.
+-#
+-/^# Packages using this file: / {
+- s/# Packages using this file://
+- s/ @PACKAGE@ / /
+- s/^/# Packages using this file:/
+-}
+--- a/intl/relocatable.c
++++ /dev/null
+@@ -1,468 +0,0 @@
+-/* Provide relocatable packages.
+- Copyright (C) 2003-2006 Free Software Foundation, Inc.
+- Written by Bruno Haible <bruno@clisp.org>, 2003.
+-
+- 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. */
+-
+-
+-/* Tell glibc's <stdio.h> to provide a prototype for getline().
+- This must come before <config.h> because <config.h> may include
+- <features.h>, and once <features.h> has been included, it's too late. */
+-#ifndef _GNU_SOURCE
+-# define _GNU_SOURCE 1
+-#endif
+-
+-#include <config.h>
+-
+-/* Specification. */
+-#include "relocatable.h"
+-
+-#if ENABLE_RELOCATABLE
+-
+-#include <stddef.h>
+-#include <stdio.h>
+-#include <stdlib.h>
+-#include <string.h>
+-
+-#ifdef NO_XMALLOC
+-# define xmalloc malloc
+-#else
+-# include "xalloc.h"
+-#endif
+-
+-#if defined _WIN32 || defined __WIN32__ || defined __CYGWIN__
+-# define WIN32_LEAN_AND_MEAN
+-# include <windows.h>
+-#endif
+-
+-#if DEPENDS_ON_LIBCHARSET
+-# include <libcharset.h>
+-#endif
+-#if DEPENDS_ON_LIBICONV && HAVE_ICONV
+-# include <iconv.h>
+-#endif
+-#if DEPENDS_ON_LIBINTL && ENABLE_NLS
+-# include <libintl.h>
+-#endif
+-
+-/* Faked cheap 'bool'. */
+-#undef bool
+-#undef false
+-#undef true
+-#define bool int
+-#define false 0
+-#define true 1
+-
+-/* Pathname support.
+- ISSLASH(C) tests whether C is a directory separator character.
+- IS_PATH_WITH_DIR(P) tests whether P contains a directory specification.
+- */
+-#if defined _WIN32 || defined __WIN32__ || defined __CYGWIN__ || defined __EMX__ || defined __DJGPP__
+- /* Win32, Cygwin, OS/2, DOS */
+-# define ISSLASH(C) ((C) == '/' || (C) == '\\')
+-# define HAS_DEVICE(P) \
+- ((((P)[0] >= 'A' && (P)[0] <= 'Z') || ((P)[0] >= 'a' && (P)[0] <= 'z')) \
+- && (P)[1] == ':')
+-# define IS_PATH_WITH_DIR(P) \
+- (strchr (P, '/') != NULL || strchr (P, '\\') != NULL || HAS_DEVICE (P))
+-# define FILE_SYSTEM_PREFIX_LEN(P) (HAS_DEVICE (P) ? 2 : 0)
+-#else
+- /* Unix */
+-# define ISSLASH(C) ((C) == '/')
+-# define IS_PATH_WITH_DIR(P) (strchr (P, '/') != NULL)
+-# define FILE_SYSTEM_PREFIX_LEN(P) 0
+-#endif
+-
+-/* Original installation prefix. */
+-static char *orig_prefix;
+-static size_t orig_prefix_len;
+-/* Current installation prefix. */
+-static char *curr_prefix;
+-static size_t curr_prefix_len;
+-/* These prefixes do not end in a slash. Anything that will be concatenated
+- to them must start with a slash. */
+-
+-/* Sets the original and the current installation prefix of this module.
+- 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 "/"). */
+-static void
+-set_this_relocation_prefix (const char *orig_prefix_arg,
+- const char *curr_prefix_arg)
+-{
+- if (orig_prefix_arg != NULL && curr_prefix_arg != NULL
+- /* Optimization: if orig_prefix and curr_prefix are equal, the
+- relocation is a nop. */
+- && strcmp (orig_prefix_arg, curr_prefix_arg) != 0)
+- {
+- /* Duplicate the argument strings. */
+- char *memory;
+-
+- orig_prefix_len = strlen (orig_prefix_arg);
+- curr_prefix_len = strlen (curr_prefix_arg);
+- memory = (char *) xmalloc (orig_prefix_len + 1 + curr_prefix_len + 1);
+-#ifdef NO_XMALLOC
+- if (memory != NULL)
+-#endif
+- {
+- memcpy (memory, orig_prefix_arg, orig_prefix_len + 1);
+- orig_prefix = memory;
+- memory += orig_prefix_len + 1;
+- memcpy (memory, curr_prefix_arg, curr_prefix_len + 1);
+- curr_prefix = memory;
+- return;
+- }
+- }
+- orig_prefix = NULL;
+- curr_prefix = NULL;
+- /* Don't worry about wasted memory here - this function is usually only
+- called once. */
+-}
+-
+-/* 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 "/"). */
+-void
+-set_relocation_prefix (const char *orig_prefix_arg, const char *curr_prefix_arg)
+-{
+- set_this_relocation_prefix (orig_prefix_arg, curr_prefix_arg);
+-
+- /* Now notify all dependent libraries. */
+-#if DEPENDS_ON_LIBCHARSET
+- libcharset_set_relocation_prefix (orig_prefix_arg, curr_prefix_arg);
+-#endif
+-#if DEPENDS_ON_LIBICONV && HAVE_ICONV && _LIBICONV_VERSION >= 0x0109
+- libiconv_set_relocation_prefix (orig_prefix_arg, curr_prefix_arg);
+-#endif
+-#if DEPENDS_ON_LIBINTL && ENABLE_NLS && defined libintl_set_relocation_prefix
+- libintl_set_relocation_prefix (orig_prefix_arg, curr_prefix_arg);
+-#endif
+-}
+-
+-#if !defined IN_LIBRARY || (defined PIC && defined INSTALLDIR)
+-
+-/* Convenience function:
+- Computes the current installation prefix, based on the original
+- installation prefix, the original installation directory of a particular
+- file, and the current pathname of this file. Returns NULL upon failure. */
+-#ifdef IN_LIBRARY
+-#define compute_curr_prefix local_compute_curr_prefix
+-static
+-#endif
+-const char *
+-compute_curr_prefix (const char *orig_installprefix,
+- const char *orig_installdir,
+- const char *curr_pathname)
+-{
+- const char *curr_installdir;
+- const char *rel_installdir;
+-
+- if (curr_pathname == NULL)
+- return NULL;
+-
+- /* Determine the relative installation directory, relative to the prefix.
+- This is simply the difference between orig_installprefix and
+- orig_installdir. */
+- if (strncmp (orig_installprefix, orig_installdir, strlen (orig_installprefix))
+- != 0)
+- /* Shouldn't happen - nothing should be installed outside $(prefix). */
+- return NULL;
+- rel_installdir = orig_installdir + strlen (orig_installprefix);
+-
+- /* Determine the current installation directory. */
+- {
+- const char *p_base = curr_pathname + FILE_SYSTEM_PREFIX_LEN (curr_pathname);
+- const char *p = curr_pathname + strlen (curr_pathname);
+- char *q;
+-
+- while (p > p_base)
+- {
+- p--;
+- if (ISSLASH (*p))
+- break;
+- }
+-
+- q = (char *) xmalloc (p - curr_pathname + 1);
+-#ifdef NO_XMALLOC
+- if (q == NULL)
+- return NULL;
+-#endif
+- memcpy (q, curr_pathname, p - curr_pathname);
+- q[p - curr_pathname] = '\0';
+- curr_installdir = q;
+- }
+-
+- /* Compute the current installation prefix by removing the trailing
+- rel_installdir from it. */
+- {
+- const char *rp = rel_installdir + strlen (rel_installdir);
+- const char *cp = curr_installdir + strlen (curr_installdir);
+- const char *cp_base =
+- curr_installdir + FILE_SYSTEM_PREFIX_LEN (curr_installdir);
+-
+- while (rp > rel_installdir && cp > cp_base)
+- {
+- bool same = false;
+- const char *rpi = rp;
+- const char *cpi = cp;
+-
+- while (rpi > rel_installdir && cpi > cp_base)
+- {
+- rpi--;
+- cpi--;
+- if (ISSLASH (*rpi) || ISSLASH (*cpi))
+- {
+- if (ISSLASH (*rpi) && ISSLASH (*cpi))
+- same = true;
+- break;
+- }
+- /* Do case-insensitive comparison if the filesystem is always or
+- often case-insensitive. It's better to accept the comparison
+- if the difference is only in case, rather than to fail. */
+-#if defined _WIN32 || defined __WIN32__ || defined __CYGWIN__ || defined __EMX__ || defined __DJGPP__
+- /* Win32, Cygwin, OS/2, DOS - case insignificant filesystem */
+- if ((*rpi >= 'a' && *rpi <= 'z' ? *rpi - 'a' + 'A' : *rpi)
+- != (*cpi >= 'a' && *cpi <= 'z' ? *cpi - 'a' + 'A' : *cpi))
+- break;
+-#else
+- if (*rpi != *cpi)
+- break;
+-#endif
+- }
+- if (!same)
+- break;
+- /* The last pathname component was the same. opi and cpi now point
+- to the slash before it. */
+- rp = rpi;
+- cp = cpi;
+- }
+-
+- if (rp > rel_installdir)
+- /* Unexpected: The curr_installdir does not end with rel_installdir. */
+- return NULL;
+-
+- {
+- size_t curr_prefix_len = cp - curr_installdir;
+- char *curr_prefix;
+-
+- curr_prefix = (char *) xmalloc (curr_prefix_len + 1);
+-#ifdef NO_XMALLOC
+- if (curr_prefix == NULL)
+- return NULL;
+-#endif
+- memcpy (curr_prefix, curr_installdir, curr_prefix_len);
+- curr_prefix[curr_prefix_len] = '\0';
+-
+- return curr_prefix;
+- }
+- }
+-}
+-
+-#endif /* !IN_LIBRARY || PIC */
+-
+-#if defined PIC && defined INSTALLDIR
+-
+-/* Full pathname of shared library, or NULL. */
+-static char *shared_library_fullname;
+-
+-#if defined _WIN32 || defined __WIN32__ || defined __CYGWIN__
+-
+-/* Determine the full pathname of the shared library when it is loaded. */
+-
+-BOOL WINAPI
+-DllMain (HINSTANCE module_handle, DWORD event, LPVOID reserved)
+-{
+- (void) reserved;
+-
+- if (event == DLL_PROCESS_ATTACH)
+- {
+- /* The DLL is being loaded into an application's address range. */
+- static char location[MAX_PATH];
+-
+- if (!GetModuleFileName (module_handle, location, sizeof (location)))
+- /* Shouldn't happen. */
+- return FALSE;
+-
+- if (!IS_PATH_WITH_DIR (location))
+- /* Shouldn't happen. */
+- return FALSE;
+-
+- {
+-#if defined __CYGWIN__
+- /* On Cygwin, we need to convert paths coming from Win32 system calls
+- to the Unix-like slashified notation. */
+- static char location_as_posix_path[2 * MAX_PATH];
+- /* There's no error return defined for cygwin_conv_to_posix_path.
+- See cygwin-api/func-cygwin-conv-to-posix-path.html.
+- Does it overflow the buffer of expected size MAX_PATH or does it
+- truncate the path? I don't know. Let's catch both. */
+- cygwin_conv_to_posix_path (location, location_as_posix_path);
+- location_as_posix_path[MAX_PATH - 1] = '\0';
+- if (strlen (location_as_posix_path) >= MAX_PATH - 1)
+- /* A sign of buffer overflow or path truncation. */
+- return FALSE;
+- shared_library_fullname = strdup (location_as_posix_path);
+-#else
+- shared_library_fullname = strdup (location);
+-#endif
+- }
+- }
+-
+- return TRUE;
+-}
+-
+-#else /* Unix except Cygwin */
+-
+-static void
+-find_shared_library_fullname ()
+-{
+-#if defined __linux__ && __GLIBC__ >= 2
+- /* Linux has /proc/self/maps. glibc 2 has the getline() function. */
+- FILE *fp;
+-
+- /* Open the current process' maps file. It describes one VMA per line. */
+- fp = fopen ("/proc/self/maps", "r");
+- if (fp)
+- {
+- unsigned long address = (unsigned long) &find_shared_library_fullname;
+- for (;;)
+- {
+- unsigned long start, end;
+- int c;
+-
+- if (fscanf (fp, "%lx-%lx", &start, &end) != 2)
+- break;
+- if (address >= start && address <= end - 1)
+- {
+- /* Found it. Now see if this line contains a filename. */
+- while (c = getc (fp), c != EOF && c != '\n' && c != '/')
+- continue;
+- if (c == '/')
+- {
+- size_t size;
+- int len;
+-
+- ungetc (c, fp);
+- shared_library_fullname = NULL; size = 0;
+- len = getline (&shared_library_fullname, &size, fp);
+- if (len >= 0)
+- {
+- /* Success: filled shared_library_fullname. */
+- if (len > 0 && shared_library_fullname[len - 1] == '\n')
+- shared_library_fullname[len - 1] = '\0';
+- }
+- }
+- break;
+- }
+- while (c = getc (fp), c != EOF && c != '\n')
+- continue;
+- }
+- fclose (fp);
+- }
+-#endif
+-}
+-
+-#endif /* (WIN32 or Cygwin) / (Unix except Cygwin) */
+-
+-/* Return the full pathname of the current shared library.
+- Return NULL if unknown.
+- Guaranteed to work only on Linux, Cygwin and Woe32. */
+-static char *
+-get_shared_library_fullname ()
+-{
+-#if !(defined _WIN32 || defined __WIN32__ || defined __CYGWIN__)
+- static bool tried_find_shared_library_fullname;
+- if (!tried_find_shared_library_fullname)
+- {
+- find_shared_library_fullname ();
+- tried_find_shared_library_fullname = true;
+- }
+-#endif
+- return shared_library_fullname;
+-}
+-
+-#endif /* PIC */
+-
+-/* Returns the pathname, relocated according to the current installation
+- directory. */
+-const char *
+-relocate (const char *pathname)
+-{
+-#if defined PIC && defined INSTALLDIR
+- static int initialized;
+-
+- /* Initialization code for a shared library. */
+- if (!initialized)
+- {
+- /* At this point, orig_prefix and curr_prefix likely have already been
+- set through the main program's set_program_name_and_installdir
+- function. This is sufficient in the case that the library has
+- initially been installed in the same orig_prefix. But we can do
+- better, to also cover the cases that 1. it has been installed
+- in a different prefix before being moved to orig_prefix and (later)
+- to curr_prefix, 2. unlike the program, it has not moved away from
+- orig_prefix. */
+- const char *orig_installprefix = INSTALLPREFIX;
+- const char *orig_installdir = INSTALLDIR;
+- const char *curr_prefix_better;
+-
+- curr_prefix_better =
+- compute_curr_prefix (orig_installprefix, orig_installdir,
+- get_shared_library_fullname ());
+- if (curr_prefix_better == NULL)
+- curr_prefix_better = curr_prefix;
+-
+- set_relocation_prefix (orig_installprefix, curr_prefix_better);
+-
+- initialized = 1;
+- }
+-#endif
+-
+- /* Note: It is not necessary to perform case insensitive comparison here,
+- even for DOS-like filesystems, because the pathname argument was
+- typically created from the same Makefile variable as orig_prefix came
+- from. */
+- if (orig_prefix != NULL && curr_prefix != NULL
+- && strncmp (pathname, orig_prefix, orig_prefix_len) == 0)
+- {
+- if (pathname[orig_prefix_len] == '\0')
+- /* pathname equals orig_prefix. */
+- return curr_prefix;
+- if (ISSLASH (pathname[orig_prefix_len]))
+- {
+- /* pathname starts with orig_prefix. */
+- const char *pathname_tail = &pathname[orig_prefix_len];
+- char *result =
+- (char *) xmalloc (curr_prefix_len + strlen (pathname_tail) + 1);
+-
+-#ifdef NO_XMALLOC
+- if (result != NULL)
+-#endif
+- {
+- memcpy (result, curr_prefix, curr_prefix_len);
+- strcpy (result + curr_prefix_len, pathname_tail);
+- return result;
+- }
+- }
+- }
+- /* Nothing to relocate. */
+- return pathname;
+-}
+-
+-#endif
+--- a/intl/relocatable.h
++++ /dev/null
+@@ -1,79 +0,0 @@
+-/* Provide relocatable packages.
+- Copyright (C) 2003, 2005 Free Software Foundation, Inc.
+- Written by Bruno Haible <bruno@clisp.org>, 2003.
+-
+- 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 _RELOCATABLE_H
+-#define _RELOCATABLE_H
+-
+-#ifdef __cplusplus
+-extern "C" {
+-#endif
+-
+-
+-/* This can be enabled through the configure --enable-relocatable option. */
+-#if ENABLE_RELOCATABLE
+-
+-/* When building a DLL, we must export some functions. Note that because
+- this is a private .h file, we don't need to use __declspec(dllimport)
+- in any case. */
+-#if HAVE_VISIBILITY && BUILDING_DLL
+-# define RELOCATABLE_DLL_EXPORTED __attribute__((__visibility__("default")))
+-#elif defined _MSC_VER && BUILDING_DLL
+-# define RELOCATABLE_DLL_EXPORTED __declspec(dllexport)
+-#else
+-# define RELOCATABLE_DLL_EXPORTED
+-#endif
+-
+-/* 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 RELOCATABLE_DLL_EXPORTED void
+- set_relocation_prefix (const char *orig_prefix,
+- const char *curr_prefix);
+-
+-/* Returns the pathname, relocated according to the current installation
+- directory. */
+-extern const char * relocate (const char *pathname);
+-
+-/* Memory management: relocate() leaks memory, because it has to construct
+- a fresh pathname. If this is a problem because your program calls
+- relocate() frequently, think about caching the result. */
+-
+-/* Convenience function:
+- Computes the current installation prefix, based on the original
+- installation prefix, the original installation directory of a particular
+- file, and the current pathname of this file. Returns NULL upon failure. */
+-extern const char * compute_curr_prefix (const char *orig_installprefix,
+- const char *orig_installdir,
+- const char *curr_pathname);
+-
+-#else
+-
+-/* By default, we use the hardwired pathnames. */
+-#define relocate(pathname) (pathname)
+-
+-#endif
+-
+-
+-#ifdef __cplusplus
+-}
+-#endif
+-
+-#endif /* _RELOCATABLE_H */
+--- a/intl/textdomain.c
++++ /dev/null
+@@ -1,127 +0,0 @@
+-/* Implementation of the textdomain(3) function.
+- Copyright (C) 1995-1998, 2000-2003, 2005-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. */
+-
+-#ifdef HAVE_CONFIG_H
+-# include <config.h>
+-#endif
+-
+-#include <stdlib.h>
+-#include <string.h>
+-
+-#include "gettextP.h"
+-#ifdef _LIBC
+-# include <libintl.h>
+-#else
+-# include "libgnuintl.h"
+-#endif
+-
+-/* Handle multi-threaded applications. */
+-#ifdef _LIBC
+-# include <bits/libc-lock.h>
+-# define gl_rwlock_define __libc_rwlock_define
+-# define gl_rwlock_wrlock __libc_rwlock_wrlock
+-# define gl_rwlock_unlock __libc_rwlock_unlock
+-#else
+-# include "lock.h"
+-#endif
+-
+-/* @@ end of prolog @@ */
+-
+-
+-/* Names for the libintl functions are a problem. They must not clash
+- with existing names and they should follow ANSI C. But this source
+- code is also used in GNU C Library where the names have a __
+- prefix. So we have to make a difference here. */
+-#ifdef _LIBC
+-# define TEXTDOMAIN __textdomain
+-# ifndef strdup
+-# define strdup(str) __strdup (str)
+-# endif
+-#else
+-# define TEXTDOMAIN libintl_textdomain
+-#endif
+-
+-/* Lock variable to protect the global data in the gettext implementation. */
+-gl_rwlock_define (extern, _nl_state_lock attribute_hidden)
+-
+-/* Set the current default message catalog to DOMAINNAME.
+- If DOMAINNAME is null, return the current default.
+- If DOMAINNAME is "", reset to the default of "messages". */
+-char *
+-TEXTDOMAIN (const char *domainname)
+-{
+- char *new_domain;
+- char *old_domain;
+-
+- /* A NULL pointer requests the current setting. */
+- if (domainname == NULL)
+- return (char *) _nl_current_default_domain;
+-
+- gl_rwlock_wrlock (_nl_state_lock);
+-
+- old_domain = (char *) _nl_current_default_domain;
+-
+- /* If domain name is the null string set to default domain "messages". */
+- if (domainname[0] == '\0'
+- || strcmp (domainname, _nl_default_default_domain) == 0)
+- {
+- _nl_current_default_domain = _nl_default_default_domain;
+- new_domain = (char *) _nl_current_default_domain;
+- }
+- else if (strcmp (domainname, old_domain) == 0)
+- /* This can happen and people will use it to signal that some
+- environment variable changed. */
+- new_domain = old_domain;
+- else
+- {
+- /* If the following malloc fails `_nl_current_default_domain'
+- will be NULL. This value will be returned and so signals we
+- are out of core. */
+-#if defined _LIBC || defined HAVE_STRDUP
+- new_domain = strdup (domainname);
+-#else
+- size_t len = strlen (domainname) + 1;
+- new_domain = (char *) malloc (len);
+- if (new_domain != NULL)
+- memcpy (new_domain, domainname, len);
+-#endif
+-
+- if (new_domain != NULL)
+- _nl_current_default_domain = new_domain;
+- }
+-
+- /* We use this possibility to signal a change of the loaded catalogs
+- since this is most likely the case and there is no other easy we
+- to do it. Do it only when the call was successful. */
+- if (new_domain != NULL)
+- {
+- ++_nl_msg_cat_cntr;
+-
+- if (old_domain != new_domain && old_domain != _nl_default_default_domain)
+- free (old_domain);
+- }
+-
+- gl_rwlock_unlock (_nl_state_lock);
+-
+- return new_domain;
+-}
+-
+-#ifdef _LIBC
+-/* Alias for function name in GNU C Library. */
+-weak_alias (__textdomain, textdomain);
+-#endif
+--- a/intl/tsearch.c
++++ /dev/null
+@@ -1,684 +0,0 @@
+-/* Copyright (C) 1995, 1996, 1997, 2000, 2006 Free Software Foundation, Inc.
+- Contributed by Bernd Schmidt <crux@Pool.Informatik.RWTH-Aachen.DE>, 1997.
+-
+- NOTE: The canonical source of this file is maintained with the GNU C
+- Library. Bugs can be reported to bug-glibc@gnu.org.
+-
+- 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. */
+-
+-/* Tree search for red/black trees.
+- The algorithm for adding nodes is taken from one of the many "Algorithms"
+- books by Robert Sedgewick, although the implementation differs.
+- The algorithm for deleting nodes can probably be found in a book named
+- "Introduction to Algorithms" by Cormen/Leiserson/Rivest. At least that's
+- the book that my professor took most algorithms from during the "Data
+- Structures" course...
+-
+- Totally public domain. */
+-
+-/* Red/black trees are binary trees in which the edges are colored either red
+- or black. They have the following properties:
+- 1. The number of black edges on every path from the root to a leaf is
+- constant.
+- 2. No two red edges are adjacent.
+- Therefore there is an upper bound on the length of every path, it's
+- O(log n) where n is the number of nodes in the tree. No path can be longer
+- than 1+2*P where P is the length of the shortest path in the tree.
+- Useful for the implementation:
+- 3. If one of the children of a node is NULL, then the other one is red
+- (if it exists).
+-
+- In the implementation, not the edges are colored, but the nodes. The color
+- interpreted as the color of the edge leading to this node. The color is
+- meaningless for the root node, but we color the root node black for
+- convenience. All added nodes are red initially.
+-
+- Adding to a red/black tree is rather easy. The right place is searched
+- with a usual binary tree search. Additionally, whenever a node N is
+- reached that has two red successors, the successors are colored black and
+- the node itself colored red. This moves red edges up the tree where they
+- pose less of a problem once we get to really insert the new node. Changing
+- N's color to red may violate rule 2, however, so rotations may become
+- necessary to restore the invariants. Adding a new red leaf may violate
+- the same rule, so afterwards an additional check is run and the tree
+- possibly rotated.
+-
+- Deleting is hairy. There are mainly two nodes involved: the node to be
+- deleted (n1), and another node that is to be unchained from the tree (n2).
+- If n1 has a successor (the node with a smallest key that is larger than
+- n1), then the successor becomes n2 and its contents are copied into n1,
+- otherwise n1 becomes n2.
+- Unchaining a node may violate rule 1: if n2 is black, one subtree is
+- missing one black edge afterwards. The algorithm must try to move this
+- error upwards towards the root, so that the subtree that does not have
+- enough black edges becomes the whole tree. Once that happens, the error
+- has disappeared. It may not be necessary to go all the way up, since it
+- is possible that rotations and recoloring can fix the error before that.
+-
+- Although the deletion algorithm must walk upwards through the tree, we
+- do not store parent pointers in the nodes. Instead, delete allocates a
+- small array of parent pointers and fills it while descending the tree.
+- Since we know that the length of a path is O(log n), where n is the number
+- of nodes, this is likely to use less memory. */
+-
+-/* Tree rotations look like this:
+- A C
+- / \ / \
+- B C A G
+- / \ / \ --> / \
+- D E F G B F
+- / \
+- D E
+-
+- In this case, A has been rotated left. This preserves the ordering of the
+- binary tree. */
+-
+-#include <config.h>
+-
+-/* Specification. */
+-#ifdef IN_LIBINTL
+-# include "tsearch.h"
+-#else
+-# include <search.h>
+-#endif
+-
+-#include <stdlib.h>
+-
+-typedef int (*__compar_fn_t) (const void *, const void *);
+-typedef void (*__action_fn_t) (const void *, VISIT, int);
+-
+-#ifndef weak_alias
+-# define __tsearch tsearch
+-# define __tfind tfind
+-# define __tdelete tdelete
+-# define __twalk twalk
+-#endif
+-
+-#ifndef internal_function
+-/* Inside GNU libc we mark some function in a special way. In other
+- environments simply ignore the marking. */
+-# define internal_function
+-#endif
+-
+-typedef struct node_t
+-{
+- /* Callers expect this to be the first element in the structure - do not
+- move! */
+- const void *key;
+- struct node_t *left;
+- struct node_t *right;
+- unsigned int red:1;
+-} *node;
+-typedef const struct node_t *const_node;
+-
+-#undef DEBUGGING
+-
+-#ifdef DEBUGGING
+-
+-/* Routines to check tree invariants. */
+-
+-#include <assert.h>
+-
+-#define CHECK_TREE(a) check_tree(a)
+-
+-static void
+-check_tree_recurse (node p, int d_sofar, int d_total)
+-{
+- if (p == NULL)
+- {
+- assert (d_sofar == d_total);
+- return;
+- }
+-
+- check_tree_recurse (p->left, d_sofar + (p->left && !p->left->red), d_total);
+- check_tree_recurse (p->right, d_sofar + (p->right && !p->right->red), d_total);
+- if (p->left)
+- assert (!(p->left->red && p->red));
+- if (p->right)
+- assert (!(p->right->red && p->red));
+-}
+-
+-static void
+-check_tree (node root)
+-{
+- int cnt = 0;
+- node p;
+- if (root == NULL)
+- return;
+- root->red = 0;
+- for(p = root->left; p; p = p->left)
+- cnt += !p->red;
+- check_tree_recurse (root, 0, cnt);
+-}
+-
+-
+-#else
+-
+-#define CHECK_TREE(a)
+-
+-#endif
+-
+-/* Possibly "split" a node with two red successors, and/or fix up two red
+- edges in a row. ROOTP is a pointer to the lowest node we visited, PARENTP
+- and GPARENTP pointers to its parent/grandparent. P_R and GP_R contain the
+- comparison values that determined which way was taken in the tree to reach
+- ROOTP. MODE is 1 if we need not do the split, but must check for two red
+- edges between GPARENTP and ROOTP. */
+-static void
+-maybe_split_for_insert (node *rootp, node *parentp, node *gparentp,
+- int p_r, int gp_r, int mode)
+-{
+- node root = *rootp;
+- node *rp, *lp;
+- rp = &(*rootp)->right;
+- lp = &(*rootp)->left;
+-
+- /* See if we have to split this node (both successors red). */
+- if (mode == 1
+- || ((*rp) != NULL && (*lp) != NULL && (*rp)->red && (*lp)->red))
+- {
+- /* This node becomes red, its successors black. */
+- root->red = 1;
+- if (*rp)
+- (*rp)->red = 0;
+- if (*lp)
+- (*lp)->red = 0;
+-
+- /* If the parent of this node is also red, we have to do
+- rotations. */
+- if (parentp != NULL && (*parentp)->red)
+- {
+- node gp = *gparentp;
+- node p = *parentp;
+- /* There are two main cases:
+- 1. The edge types (left or right) of the two red edges differ.
+- 2. Both red edges are of the same type.
+- There exist two symmetries of each case, so there is a total of
+- 4 cases. */
+- if ((p_r > 0) != (gp_r > 0))
+- {
+- /* Put the child at the top of the tree, with its parent
+- and grandparent as successors. */
+- p->red = 1;
+- gp->red = 1;
+- root->red = 0;
+- if (p_r < 0)
+- {
+- /* Child is left of parent. */
+- p->left = *rp;
+- *rp = p;
+- gp->right = *lp;
+- *lp = gp;
+- }
+- else
+- {
+- /* Child is right of parent. */
+- p->right = *lp;
+- *lp = p;
+- gp->left = *rp;
+- *rp = gp;
+- }
+- *gparentp = root;
+- }
+- else
+- {
+- *gparentp = *parentp;
+- /* Parent becomes the top of the tree, grandparent and
+- child are its successors. */
+- p->red = 0;
+- gp->red = 1;
+- if (p_r < 0)
+- {
+- /* Left edges. */
+- gp->left = p->right;
+- p->right = gp;
+- }
+- else
+- {
+- /* Right edges. */
+- gp->right = p->left;
+- p->left = gp;
+- }
+- }
+- }
+- }
+-}
+-
+-/* Find or insert datum into search tree.
+- KEY is the key to be located, ROOTP is the address of tree root,
+- COMPAR the ordering function. */
+-void *
+-__tsearch (const void *key, void **vrootp, __compar_fn_t compar)
+-{
+- node q;
+- node *parentp = NULL, *gparentp = NULL;
+- node *rootp = (node *) vrootp;
+- node *nextp;
+- int r = 0, p_r = 0, gp_r = 0; /* No they might not, Mr Compiler. */
+-
+- if (rootp == NULL)
+- return NULL;
+-
+- /* This saves some additional tests below. */
+- if (*rootp != NULL)
+- (*rootp)->red = 0;
+-
+- CHECK_TREE (*rootp);
+-
+- nextp = rootp;
+- while (*nextp != NULL)
+- {
+- node root = *rootp;
+- r = (*compar) (key, root->key);
+- if (r == 0)
+- return root;
+-
+- maybe_split_for_insert (rootp, parentp, gparentp, p_r, gp_r, 0);
+- /* If that did any rotations, parentp and gparentp are now garbage.
+- That doesn't matter, because the values they contain are never
+- used again in that case. */
+-
+- nextp = r < 0 ? &root->left : &root->right;
+- if (*nextp == NULL)
+- break;
+-
+- gparentp = parentp;
+- parentp = rootp;
+- rootp = nextp;
+-
+- gp_r = p_r;
+- p_r = r;
+- }
+-
+- q = (struct node_t *) malloc (sizeof (struct node_t));
+- if (q != NULL)
+- {
+- *nextp = q; /* link new node to old */
+- q->key = key; /* initialize new node */
+- q->red = 1;
+- q->left = q->right = NULL;
+-
+- if (nextp != rootp)
+- /* There may be two red edges in a row now, which we must avoid by
+- rotating the tree. */
+- maybe_split_for_insert (nextp, rootp, parentp, r, p_r, 1);
+- }
+-
+- return q;
+-}
+-#ifdef weak_alias
+-weak_alias (__tsearch, tsearch)
+-#endif
+-
+-
+-/* Find datum in search tree.
+- KEY is the key to be located, ROOTP is the address of tree root,
+- COMPAR the ordering function. */
+-void *
+-__tfind (key, vrootp, compar)
+- const void *key;
+- void *const *vrootp;
+- __compar_fn_t compar;
+-{
+- node *rootp = (node *) vrootp;
+-
+- if (rootp == NULL)
+- return NULL;
+-
+- CHECK_TREE (*rootp);
+-
+- while (*rootp != NULL)
+- {
+- node root = *rootp;
+- int r;
+-
+- r = (*compar) (key, root->key);
+- if (r == 0)
+- return root;
+-
+- rootp = r < 0 ? &root->left : &root->right;
+- }
+- return NULL;
+-}
+-#ifdef weak_alias
+-weak_alias (__tfind, tfind)
+-#endif
+-
+-
+-/* Delete node with given key.
+- KEY is the key to be deleted, ROOTP is the address of the root of tree,
+- COMPAR the comparison function. */
+-void *
+-__tdelete (const void *key, void **vrootp, __compar_fn_t compar)
+-{
+- node p, q, r, retval;
+- int cmp;
+- node *rootp = (node *) vrootp;
+- node root, unchained;
+- /* Stack of nodes so we remember the parents without recursion. It's
+- _very_ unlikely that there are paths longer than 40 nodes. The tree
+- would need to have around 250.000 nodes. */
+- int stacksize = 100;
+- int sp = 0;
+- node *nodestack[100];
+-
+- if (rootp == NULL)
+- return NULL;
+- p = *rootp;
+- if (p == NULL)
+- return NULL;
+-
+- CHECK_TREE (p);
+-
+- while ((cmp = (*compar) (key, (*rootp)->key)) != 0)
+- {
+- if (sp == stacksize)
+- abort ();
+-
+- nodestack[sp++] = rootp;
+- p = *rootp;
+- rootp = ((cmp < 0)
+- ? &(*rootp)->left
+- : &(*rootp)->right);
+- if (*rootp == NULL)
+- return NULL;
+- }
+-
+- /* This is bogus if the node to be deleted is the root... this routine
+- really should return an integer with 0 for success, -1 for failure
+- and errno = ESRCH or something. */
+- retval = p;
+-
+- /* We don't unchain the node we want to delete. Instead, we overwrite
+- it with its successor and unchain the successor. If there is no
+- successor, we really unchain the node to be deleted. */
+-
+- root = *rootp;
+-
+- r = root->right;
+- q = root->left;
+-
+- if (q == NULL || r == NULL)
+- unchained = root;
+- else
+- {
+- node *parent = rootp, *up = &root->right;
+- for (;;)
+- {
+- if (sp == stacksize)
+- abort ();
+- nodestack[sp++] = parent;
+- parent = up;
+- if ((*up)->left == NULL)
+- break;
+- up = &(*up)->left;
+- }
+- unchained = *up;
+- }
+-
+- /* We know that either the left or right successor of UNCHAINED is NULL.
+- R becomes the other one, it is chained into the parent of UNCHAINED. */
+- r = unchained->left;
+- if (r == NULL)
+- r = unchained->right;
+- if (sp == 0)
+- *rootp = r;
+- else
+- {
+- q = *nodestack[sp-1];
+- if (unchained == q->right)
+- q->right = r;
+- else
+- q->left = r;
+- }
+-
+- if (unchained != root)
+- root->key = unchained->key;
+- if (!unchained->red)
+- {
+- /* Now we lost a black edge, which means that the number of black
+- edges on every path is no longer constant. We must balance the
+- tree. */
+- /* NODESTACK now contains all parents of R. R is likely to be NULL
+- in the first iteration. */
+- /* NULL nodes are considered black throughout - this is necessary for
+- correctness. */
+- while (sp > 0 && (r == NULL || !r->red))
+- {
+- node *pp = nodestack[sp - 1];
+- p = *pp;
+- /* Two symmetric cases. */
+- if (r == p->left)
+- {
+- /* Q is R's brother, P is R's parent. The subtree with root
+- R has one black edge less than the subtree with root Q. */
+- q = p->right;
+- if (q->red)
+- {
+- /* If Q is red, we know that P is black. We rotate P left
+- so that Q becomes the top node in the tree, with P below
+- it. P is colored red, Q is colored black.
+- This action does not change the black edge count for any
+- leaf in the tree, but we will be able to recognize one
+- of the following situations, which all require that Q
+- is black. */
+- q->red = 0;
+- p->red = 1;
+- /* Left rotate p. */
+- p->right = q->left;
+- q->left = p;
+- *pp = q;
+- /* Make sure pp is right if the case below tries to use
+- it. */
+- nodestack[sp++] = pp = &q->left;
+- q = p->right;
+- }
+- /* We know that Q can't be NULL here. We also know that Q is
+- black. */
+- if ((q->left == NULL || !q->left->red)
+- && (q->right == NULL || !q->right->red))
+- {
+- /* Q has two black successors. We can simply color Q red.
+- The whole subtree with root P is now missing one black
+- edge. Note that this action can temporarily make the
+- tree invalid (if P is red). But we will exit the loop
+- in that case and set P black, which both makes the tree
+- valid and also makes the black edge count come out
+- right. If P is black, we are at least one step closer
+- to the root and we'll try again the next iteration. */
+- q->red = 1;
+- r = p;
+- }
+- else
+- {
+- /* Q is black, one of Q's successors is red. We can
+- repair the tree with one operation and will exit the
+- loop afterwards. */
+- if (q->right == NULL || !q->right->red)
+- {
+- /* The left one is red. We perform the same action as
+- in maybe_split_for_insert where two red edges are
+- adjacent but point in different directions:
+- Q's left successor (let's call it Q2) becomes the
+- top of the subtree we are looking at, its parent (Q)
+- and grandparent (P) become its successors. The former
+- successors of Q2 are placed below P and Q.
+- P becomes black, and Q2 gets the color that P had.
+- This changes the black edge count only for node R and
+- its successors. */
+- node q2 = q->left;
+- q2->red = p->red;
+- p->right = q2->left;
+- q->left = q2->right;
+- q2->right = q;
+- q2->left = p;
+- *pp = q2;
+- p->red = 0;
+- }
+- else
+- {
+- /* It's the right one. Rotate P left. P becomes black,
+- and Q gets the color that P had. Q's right successor
+- also becomes black. This changes the black edge
+- count only for node R and its successors. */
+- q->red = p->red;
+- p->red = 0;
+-
+- q->right->red = 0;
+-
+- /* left rotate p */
+- p->right = q->left;
+- q->left = p;
+- *pp = q;
+- }
+-
+- /* We're done. */
+- sp = 1;
+- r = NULL;
+- }
+- }
+- else
+- {
+- /* Comments: see above. */
+- q = p->left;
+- if (q->red)
+- {
+- q->red = 0;
+- p->red = 1;
+- p->left = q->right;
+- q->right = p;
+- *pp = q;
+- nodestack[sp++] = pp = &q->right;
+- q = p->left;
+- }
+- if ((q->right == NULL || !q->right->red)
+- && (q->left == NULL || !q->left->red))
+- {
+- q->red = 1;
+- r = p;
+- }
+- else
+- {
+- if (q->left == NULL || !q->left->red)
+- {
+- node q2 = q->right;
+- q2->red = p->red;
+- p->left = q2->right;
+- q->right = q2->left;
+- q2->left = q;
+- q2->right = p;
+- *pp = q2;
+- p->red = 0;
+- }
+- else
+- {
+- q->red = p->red;
+- p->red = 0;
+- q->left->red = 0;
+- p->left = q->right;
+- q->right = p;
+- *pp = q;
+- }
+- sp = 1;
+- r = NULL;
+- }
+- }
+- --sp;
+- }
+- if (r != NULL)
+- r->red = 0;
+- }
+-
+- free (unchained);
+- return retval;
+-}
+-#ifdef weak_alias
+-weak_alias (__tdelete, tdelete)
+-#endif
+-
+-
+-/* Walk the nodes of a tree.
+- ROOT is the root of the tree to be walked, ACTION the function to be
+- called at each node. LEVEL is the level of ROOT in the whole tree. */
+-static void
+-internal_function
+-trecurse (const void *vroot, __action_fn_t action, int level)
+-{
+- const_node root = (const_node) vroot;
+-
+- if (root->left == NULL && root->right == NULL)
+- (*action) (root, leaf, level);
+- else
+- {
+- (*action) (root, preorder, level);
+- if (root->left != NULL)
+- trecurse (root->left, action, level + 1);
+- (*action) (root, postorder, level);
+- if (root->right != NULL)
+- trecurse (root->right, action, level + 1);
+- (*action) (root, endorder, level);
+- }
+-}
+-
+-
+-/* Walk the nodes of a tree.
+- ROOT is the root of the tree to be walked, ACTION the function to be
+- called at each node. */
+-void
+-__twalk (const void *vroot, __action_fn_t action)
+-{
+- const_node root = (const_node) vroot;
+-
+- CHECK_TREE (root);
+-
+- if (root != NULL && action != NULL)
+- trecurse (root, action, 0);
+-}
+-#ifdef weak_alias
+-weak_alias (__twalk, twalk)
+-#endif
+-
+-
+-#ifdef _LIBC
+-
+-/* The standardized functions miss an important functionality: the
+- tree cannot be removed easily. We provide a function to do this. */
+-static void
+-internal_function
+-tdestroy_recurse (node root, __free_fn_t freefct)
+-{
+- if (root->left != NULL)
+- tdestroy_recurse (root->left, freefct);
+- if (root->right != NULL)
+- tdestroy_recurse (root->right, freefct);
+- (*freefct) ((void *) root->key);
+- /* Free the node itself. */
+- free (root);
+-}
+-
+-void
+-__tdestroy (void *vroot, __free_fn_t freefct)
+-{
+- node root = (node) vroot;
+-
+- CHECK_TREE (root);
+-
+- if (root != NULL)
+- tdestroy_recurse (root, freefct);
+-}
+-weak_alias (__tdestroy, tdestroy)
+-
+-#endif /* _LIBC */
+--- a/intl/tsearch.h
++++ /dev/null
+@@ -1,83 +0,0 @@
+-/* Binary tree data structure.
+- Copyright (C) 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. */
+-
+-#ifndef _TSEARCH_H
+-#define _TSEARCH_H
+-
+-#if HAVE_TSEARCH
+-
+-/* Get tseach(), tfind(), tdelete(), twalk() declarations. */
+-#include <search.h>
+-
+-#else
+-
+-#ifdef __cplusplus
+-extern "C" {
+-#endif
+-
+-/* See <http://www.opengroup.org/susv3xbd/search.h.html>,
+- <http://www.opengroup.org/susv3xsh/tsearch.html>
+- for details. */
+-
+-typedef enum
+-{
+- preorder,
+- postorder,
+- endorder,
+- leaf
+-}
+-VISIT;
+-
+-/* Searches an element in the tree *VROOTP that compares equal to KEY.
+- If one is found, it is returned. Otherwise, a new element equal to KEY
+- is inserted in the tree and is returned. */
+-extern void * tsearch (const void *key, void **vrootp,
+- int (*compar) (const void *, const void *));
+-
+-/* Searches an element in the tree *VROOTP that compares equal to KEY.
+- If one is found, it is returned. Otherwise, NULL is returned. */
+-extern void * tfind (const void *key, void *const *vrootp,
+- int (*compar) (const void *, const void *));
+-
+-/* Searches an element in the tree *VROOTP that compares equal to KEY.
+- If one is found, it is removed from the tree, and its parent node is
+- returned. Otherwise, NULL is returned. */
+-extern void * tdelete (const void *key, void **vrootp,
+- int (*compar) (const void *, const void *));
+-
+-/* Perform a depth-first, left-to-right traversal of the tree VROOT.
+- The ACTION function is called:
+- - for non-leaf nodes: 3 times, before the left subtree traversal,
+- after the left subtree traversal but before the right subtree traversal,
+- and after the right subtree traversal,
+- - for leaf nodes: once.
+- The arguments passed to ACTION are:
+- 1. the node; it can be casted to a 'const void * const *', i.e. into a
+- pointer to the key,
+- 2. an indicator which visit of the node this is,
+- 3. the level of the node in the tree (0 for the root). */
+-extern void twalk (const void *vroot,
+- void (*action) (const void *, VISIT, int));
+-
+-#ifdef __cplusplus
+-}
+-#endif
+-
+-#endif
+-
+-#endif /* _TSEARCH_H */
+--- a/intl/vasnprintf.c
++++ /dev/null
+@@ -1,4677 +0,0 @@
+-/* vsprintf with automatic memory allocation.
+- Copyright (C) 1999, 2002-2007 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. */
+-
+-/* This file can be parametrized with the following macros:
+- VASNPRINTF The name of the function being defined.
+- FCHAR_T The element type of the format string.
+- DCHAR_T The element type of the destination (result) string.
+- FCHAR_T_ONLY_ASCII Set to 1 to enable verification that all characters
+- in the format string are ASCII. MUST be set if
+- FCHAR_T and DCHAR_T are not the same type.
+- DIRECTIVE Structure denoting a format directive.
+- Depends on FCHAR_T.
+- DIRECTIVES Structure denoting the set of format directives of a
+- format string. Depends on FCHAR_T.
+- PRINTF_PARSE Function that parses a format string.
+- Depends on FCHAR_T.
+- DCHAR_CPY memcpy like function for DCHAR_T[] arrays.
+- DCHAR_SET memset like function for DCHAR_T[] arrays.
+- DCHAR_MBSNLEN mbsnlen like function for DCHAR_T[] arrays.
+- SNPRINTF The system's snprintf (or similar) function.
+- This may be either snprintf or swprintf.
+- TCHAR_T The element type of the argument and result string
+- of the said SNPRINTF function. This may be either
+- char or wchar_t. The code exploits that
+- sizeof (TCHAR_T) | sizeof (DCHAR_T) and
+- alignof (TCHAR_T) <= alignof (DCHAR_T).
+- DCHAR_IS_TCHAR Set to 1 if DCHAR_T and TCHAR_T are the same type.
+- DCHAR_CONV_FROM_ENCODING A function to convert from char[] to DCHAR[].
+- DCHAR_IS_UINT8_T Set to 1 if DCHAR_T is uint8_t.
+- DCHAR_IS_UINT16_T Set to 1 if DCHAR_T is uint16_t.
+- DCHAR_IS_UINT32_T Set to 1 if DCHAR_T is uint32_t. */
+-
+-/* Tell glibc's <stdio.h> to provide a prototype for snprintf().
+- This must come before <config.h> because <config.h> may include
+- <features.h>, and once <features.h> has been included, it's too late. */
+-#ifndef _GNU_SOURCE
+-# define _GNU_SOURCE 1
+-#endif
+-
+-#ifndef VASNPRINTF
+-# include <config.h>
+-#endif
+-#ifndef IN_LIBINTL
+-# include <alloca.h>
+-#endif
+-
+-/* Specification. */
+-#ifndef VASNPRINTF
+-# if WIDE_CHAR_VERSION
+-# include "vasnwprintf.h"
+-# else
+-# include "vasnprintf.h"
+-# endif
+-#endif
+-
+-#include <locale.h> /* localeconv() */
+-#include <stdio.h> /* snprintf(), sprintf() */
+-#include <stdlib.h> /* abort(), malloc(), realloc(), free() */
+-#include <string.h> /* memcpy(), strlen() */
+-#include <errno.h> /* errno */
+-#include <limits.h> /* CHAR_BIT */
+-#include <float.h> /* DBL_MAX_EXP, LDBL_MAX_EXP */
+-#if HAVE_NL_LANGINFO
+-# include <langinfo.h>
+-#endif
+-#ifndef VASNPRINTF
+-# if WIDE_CHAR_VERSION
+-# include "wprintf-parse.h"
+-# else
+-# include "printf-parse.h"
+-# endif
+-#endif
+-
+-/* Checked size_t computations. */
+-#include "xsize.h"
+-
+-#if (NEED_PRINTF_DOUBLE || NEED_PRINTF_LONG_DOUBLE) && !defined IN_LIBINTL
+-# include <math.h>
+-# include "float+.h"
+-#endif
+-
+-#if (NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE) && !defined IN_LIBINTL
+-# include <math.h>
+-# include "isnan.h"
+-#endif
+-
+-#if (NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_INFINITE_LONG_DOUBLE) && !defined IN_LIBINTL
+-# include <math.h>
+-# include "isnanl-nolibm.h"
+-# include "fpucw.h"
+-#endif
+-
+-#if (NEED_PRINTF_DIRECTIVE_A || NEED_PRINTF_DOUBLE) && !defined IN_LIBINTL
+-# include <math.h>
+-# include "isnan.h"
+-# include "printf-frexp.h"
+-#endif
+-
+-#if (NEED_PRINTF_DIRECTIVE_A || NEED_PRINTF_LONG_DOUBLE) && !defined IN_LIBINTL
+-# include <math.h>
+-# include "isnanl-nolibm.h"
+-# include "printf-frexpl.h"
+-# include "fpucw.h"
+-#endif
+-
+-/* Some systems, like OSF/1 4.0 and Woe32, don't have EOVERFLOW. */
+-#ifndef EOVERFLOW
+-# define EOVERFLOW E2BIG
+-#endif
+-
+-#if HAVE_WCHAR_T
+-# if 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
+-
+-/* Default parameters. */
+-#ifndef VASNPRINTF
+-# if WIDE_CHAR_VERSION
+-# define VASNPRINTF vasnwprintf
+-# define FCHAR_T wchar_t
+-# define DCHAR_T wchar_t
+-# define TCHAR_T wchar_t
+-# define DCHAR_IS_TCHAR 1
+-# define DIRECTIVE wchar_t_directive
+-# define DIRECTIVES wchar_t_directives
+-# define PRINTF_PARSE wprintf_parse
+-# define DCHAR_CPY wmemcpy
+-# else
+-# define VASNPRINTF vasnprintf
+-# define FCHAR_T char
+-# define DCHAR_T char
+-# define TCHAR_T char
+-# define DCHAR_IS_TCHAR 1
+-# define DIRECTIVE char_directive
+-# define DIRECTIVES char_directives
+-# define PRINTF_PARSE printf_parse
+-# define DCHAR_CPY memcpy
+-# endif
+-#endif
+-#if WIDE_CHAR_VERSION
+- /* TCHAR_T is wchar_t. */
+-# define USE_SNPRINTF 1
+-# if HAVE_DECL__SNWPRINTF
+- /* On Windows, the function swprintf() has a different signature than
+- on Unix; we use the _snwprintf() function instead. */
+-# define SNPRINTF _snwprintf
+-# else
+- /* Unix. */
+-# define SNPRINTF swprintf
+-# endif
+-#else
+- /* TCHAR_T is char. */
+-# /* Use snprintf if it exists under the name 'snprintf' or '_snprintf'.
+- But don't use it on BeOS, since BeOS snprintf produces no output if the
+- size argument is >= 0x3000000. */
+-# if (HAVE_DECL__SNPRINTF || HAVE_SNPRINTF) && !defined __BEOS__
+-# define USE_SNPRINTF 1
+-# else
+-# define USE_SNPRINTF 0
+-# endif
+-# if HAVE_DECL__SNPRINTF
+- /* Windows. */
+-# define SNPRINTF _snprintf
+-# else
+- /* Unix. */
+-# define SNPRINTF snprintf
+- /* Here we need to call the native snprintf, not rpl_snprintf. */
+-# undef snprintf
+-# endif
+-#endif
+-/* Here we need to call the native sprintf, not rpl_sprintf. */
+-#undef sprintf
+-
+-#if (NEED_PRINTF_DIRECTIVE_A || NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE) && !defined IN_LIBINTL
+-/* Determine the decimal-point character according to the current locale. */
+-# ifndef decimal_point_char_defined
+-# define decimal_point_char_defined 1
+-static char
+-decimal_point_char ()
+-{
+- const char *point;
+- /* Determine it in a multithread-safe way. We know nl_langinfo is
+- multithread-safe on glibc systems, but is not required to be multithread-
+- safe by POSIX. sprintf(), however, is multithread-safe. localeconv()
+- is rarely multithread-safe. */
+-# if HAVE_NL_LANGINFO && __GLIBC__
+- point = nl_langinfo (RADIXCHAR);
+-# elif 1
+- char pointbuf[5];
+- sprintf (pointbuf, "%#.0f", 1.0);
+- point = &pointbuf[1];
+-# else
+- point = localeconv () -> decimal_point;
+-# endif
+- /* The decimal point is always a single byte: either '.' or ','. */
+- return (point[0] != '\0' ? point[0] : '.');
+-}
+-# endif
+-#endif
+-
+-#if NEED_PRINTF_INFINITE_DOUBLE && !NEED_PRINTF_DOUBLE && !defined IN_LIBINTL
+-
+-/* Equivalent to !isfinite(x) || x == 0, but does not require libm. */
+-static int
+-is_infinite_or_zero (double x)
+-{
+- return isnan (x) || x + x == x;
+-}
+-
+-#endif
+-
+-#if NEED_PRINTF_INFINITE_LONG_DOUBLE && !NEED_PRINTF_LONG_DOUBLE && !defined IN_LIBINTL
+-
+-/* Equivalent to !isfinite(x), but does not require libm. */
+-static int
+-is_infinitel (long double x)
+-{
+- return isnanl (x) || (x + x == x && x != 0.0L);
+-}
+-
+-#endif
+-
+-#if (NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_DOUBLE) && !defined IN_LIBINTL
+-
+-/* Converting 'long double' to decimal without rare rounding bugs requires
+- real bignums. We use the naming conventions of GNU gmp, but vastly simpler
+- (and slower) algorithms. */
+-
+-typedef unsigned int mp_limb_t;
+-# define GMP_LIMB_BITS 32
+-typedef int mp_limb_verify[2 * (sizeof (mp_limb_t) * CHAR_BIT == GMP_LIMB_BITS) - 1];
+-
+-typedef unsigned long long mp_twolimb_t;
+-# define GMP_TWOLIMB_BITS 64
+-typedef int mp_twolimb_verify[2 * (sizeof (mp_twolimb_t) * CHAR_BIT == GMP_TWOLIMB_BITS) - 1];
+-
+-/* Representation of a bignum >= 0. */
+-typedef struct
+-{
+- size_t nlimbs;
+- mp_limb_t *limbs; /* Bits in little-endian order, allocated with malloc(). */
+-} mpn_t;
+-
+-/* Compute the product of two bignums >= 0.
+- Return the allocated memory in case of success, NULL in case of memory
+- allocation failure. */
+-static void *
+-multiply (mpn_t src1, mpn_t src2, mpn_t *dest)
+-{
+- const mp_limb_t *p1;
+- const mp_limb_t *p2;
+- size_t len1;
+- size_t len2;
+-
+- if (src1.nlimbs <= src2.nlimbs)
+- {
+- len1 = src1.nlimbs;
+- p1 = src1.limbs;
+- len2 = src2.nlimbs;
+- p2 = src2.limbs;
+- }
+- else
+- {
+- len1 = src2.nlimbs;
+- p1 = src2.limbs;
+- len2 = src1.nlimbs;
+- p2 = src1.limbs;
+- }
+- /* Now 0 <= len1 <= len2. */
+- if (len1 == 0)
+- {
+- /* src1 or src2 is zero. */
+- dest->nlimbs = 0;
+- dest->limbs = (mp_limb_t *) malloc (1);
+- }
+- else
+- {
+- /* Here 1 <= len1 <= len2. */
+- size_t dlen;
+- mp_limb_t *dp;
+- size_t k, i, j;
+-
+- dlen = len1 + len2;
+- dp = (mp_limb_t *) malloc (dlen * sizeof (mp_limb_t));
+- if (dp == NULL)
+- return NULL;
+- for (k = len2; k > 0; )
+- dp[--k] = 0;
+- for (i = 0; i < len1; i++)
+- {
+- mp_limb_t digit1 = p1[i];
+- mp_twolimb_t carry = 0;
+- for (j = 0; j < len2; j++)
+- {
+- mp_limb_t digit2 = p2[j];
+- carry += (mp_twolimb_t) digit1 * (mp_twolimb_t) digit2;
+- carry += dp[i + j];
+- dp[i + j] = (mp_limb_t) carry;
+- carry = carry >> GMP_LIMB_BITS;
+- }
+- dp[i + len2] = (mp_limb_t) carry;
+- }
+- /* Normalise. */
+- while (dlen > 0 && dp[dlen - 1] == 0)
+- dlen--;
+- dest->nlimbs = dlen;
+- dest->limbs = dp;
+- }
+- return dest->limbs;
+-}
+-
+-/* Compute the quotient of a bignum a >= 0 and a bignum b > 0.
+- a is written as a = q * b + r with 0 <= r < b. q is the quotient, r
+- the remainder.
+- Finally, round-to-even is performed: If r > b/2 or if r = b/2 and q is odd,
+- q is incremented.
+- Return the allocated memory in case of success, NULL in case of memory
+- allocation failure. */
+-static void *
+-divide (mpn_t a, mpn_t b, mpn_t *q)
+-{
+- /* Algorithm:
+- First normalise a and b: a=[a[m-1],...,a[0]], b=[b[n-1],...,b[0]]
+- with m>=0 and n>0 (in base beta = 2^GMP_LIMB_BITS).
+- If m<n, then q:=0 and r:=a.
+- If m>=n=1, perform a single-precision division:
+- r:=0, j:=m,
+- while j>0 do
+- {Here (q[m-1]*beta^(m-1)+...+q[j]*beta^j) * b[0] + r*beta^j =
+- = a[m-1]*beta^(m-1)+...+a[j]*beta^j und 0<=r<b[0]<beta}
+- j:=j-1, r:=r*beta+a[j], q[j]:=floor(r/b[0]), r:=r-b[0]*q[j].
+- Normalise [q[m-1],...,q[0]], yields q.
+- If m>=n>1, perform a multiple-precision division:
+- We have a/b < beta^(m-n+1).
+- s:=intDsize-1-(hightest bit in b[n-1]), 0<=s<intDsize.
+- Shift a and b left by s bits, copying them. r:=a.
+- r=[r[m],...,r[0]], b=[b[n-1],...,b[0]] with b[n-1]>=beta/2.
+- For j=m-n,...,0: {Here 0 <= r < b*beta^(j+1).}
+- Compute q* :
+- q* := floor((r[j+n]*beta+r[j+n-1])/b[n-1]).
+- In case of overflow (q* >= beta) set q* := beta-1.
+- Compute c2 := ((r[j+n]*beta+r[j+n-1]) - q* * b[n-1])*beta + r[j+n-2]
+- and c3 := b[n-2] * q*.
+- {We have 0 <= c2 < 2*beta^2, even 0 <= c2 < beta^2 if no overflow
+- occurred. Furthermore 0 <= c3 < beta^2.
+- If there was overflow and
+- r[j+n]*beta+r[j+n-1] - q* * b[n-1] >= beta, i.e. c2 >= beta^2,
+- the next test can be skipped.}
+- While c3 > c2, {Here 0 <= c2 < c3 < beta^2}
+- Put q* := q* - 1, c2 := c2 + b[n-1]*beta, c3 := c3 - b[n-2].
+- If q* > 0:
+- Put r := r - b * q* * beta^j. In detail:
+- [r[n+j],...,r[j]] := [r[n+j],...,r[j]] - q* * [b[n-1],...,b[0]].
+- hence: u:=0, for i:=0 to n-1 do
+- u := u + q* * b[i],
+- r[j+i]:=r[j+i]-(u mod beta) (+ beta, if carry),
+- u:=u div beta (+ 1, if carry in subtraction)
+- r[n+j]:=r[n+j]-u.
+- {Since always u = (q* * [b[i-1],...,b[0]] div beta^i) + 1
+- < q* + 1 <= beta,
+- the carry u does not overflow.}
+- If a negative carry occurs, put q* := q* - 1
+- and [r[n+j],...,r[j]] := [r[n+j],...,r[j]] + [0,b[n-1],...,b[0]].
+- Set q[j] := q*.
+- Normalise [q[m-n],..,q[0]]; this yields the quotient q.
+- Shift [r[n-1],...,r[0]] right by s bits and normalise; this yields the
+- rest r.
+- The room for q[j] can be allocated at the memory location of r[n+j].
+- Finally, round-to-even:
+- Shift r left by 1 bit.
+- If r > b or if r = b and q[0] is odd, q := q+1.
+- */
+- const mp_limb_t *a_ptr = a.limbs;
+- size_t a_len = a.nlimbs;
+- const mp_limb_t *b_ptr = b.limbs;
+- size_t b_len = b.nlimbs;
+- mp_limb_t *roomptr;
+- mp_limb_t *tmp_roomptr = NULL;
+- mp_limb_t *q_ptr;
+- size_t q_len;
+- mp_limb_t *r_ptr;
+- size_t r_len;
+-
+- /* Allocate room for a_len+2 digits.
+- (Need a_len+1 digits for the real division and 1 more digit for the
+- final rounding of q.) */
+- roomptr = (mp_limb_t *) malloc ((a_len + 2) * sizeof (mp_limb_t));
+- if (roomptr == NULL)
+- return NULL;
+-
+- /* Normalise a. */
+- while (a_len > 0 && a_ptr[a_len - 1] == 0)
+- a_len--;
+-
+- /* Normalise b. */
+- for (;;)
+- {
+- if (b_len == 0)
+- /* Division by zero. */
+- abort ();
+- if (b_ptr[b_len - 1] == 0)
+- b_len--;
+- else
+- break;
+- }
+-
+- /* Here m = a_len >= 0 and n = b_len > 0. */
+-
+- if (a_len < b_len)
+- {
+- /* m<n: trivial case. q=0, r := copy of a. */
+- r_ptr = roomptr;
+- r_len = a_len;
+- memcpy (r_ptr, a_ptr, a_len * sizeof (mp_limb_t));
+- q_ptr = roomptr + a_len;
+- q_len = 0;
+- }
+- else if (b_len == 1)
+- {
+- /* n=1: single precision division.
+- beta^(m-1) <= a < beta^m ==> beta^(m-2) <= a/b < beta^m */
+- r_ptr = roomptr;
+- q_ptr = roomptr + 1;
+- {
+- mp_limb_t den = b_ptr[0];
+- mp_limb_t remainder = 0;
+- const mp_limb_t *sourceptr = a_ptr + a_len;
+- mp_limb_t *destptr = q_ptr + a_len;
+- size_t count;
+- for (count = a_len; count > 0; count--)
+- {
+- mp_twolimb_t num =
+- ((mp_twolimb_t) remainder << GMP_LIMB_BITS) | *--sourceptr;
+- *--destptr = num / den;
+- remainder = num % den;
+- }
+- /* Normalise and store r. */
+- if (remainder > 0)
+- {
+- r_ptr[0] = remainder;
+- r_len = 1;
+- }
+- else
+- r_len = 0;
+- /* Normalise q. */
+- q_len = a_len;
+- if (q_ptr[q_len - 1] == 0)
+- q_len--;
+- }
+- }
+- else
+- {
+- /* n>1: multiple precision division.
+- beta^(m-1) <= a < beta^m, beta^(n-1) <= b < beta^n ==>
+- beta^(m-n-1) <= a/b < beta^(m-n+1). */
+- /* Determine s. */
+- size_t s;
+- {
+- mp_limb_t msd = b_ptr[b_len - 1]; /* = b[n-1], > 0 */
+- s = 31;
+- if (msd >= 0x10000)
+- {
+- msd = msd >> 16;
+- s -= 16;
+- }
+- if (msd >= 0x100)
+- {
+- msd = msd >> 8;
+- s -= 8;
+- }
+- if (msd >= 0x10)
+- {
+- msd = msd >> 4;
+- s -= 4;
+- }
+- if (msd >= 0x4)
+- {
+- msd = msd >> 2;
+- s -= 2;
+- }
+- if (msd >= 0x2)
+- {
+- msd = msd >> 1;
+- s -= 1;
+- }
+- }
+- /* 0 <= s < GMP_LIMB_BITS.
+- Copy b, shifting it left by s bits. */
+- if (s > 0)
+- {
+- tmp_roomptr = (mp_limb_t *) malloc (b_len * sizeof (mp_limb_t));
+- if (tmp_roomptr == NULL)
+- {
+- free (roomptr);
+- return NULL;
+- }
+- {
+- const mp_limb_t *sourceptr = b_ptr;
+- mp_limb_t *destptr = tmp_roomptr;
+- mp_twolimb_t accu = 0;
+- size_t count;
+- for (count = b_len; count > 0; count--)
+- {
+- accu += (mp_twolimb_t) *sourceptr++ << s;
+- *destptr++ = (mp_limb_t) accu;
+- accu = accu >> GMP_LIMB_BITS;
+- }
+- /* accu must be zero, since that was how s was determined. */
+- if (accu != 0)
+- abort ();
+- }
+- b_ptr = tmp_roomptr;
+- }
+- /* Copy a, shifting it left by s bits, yields r.
+- Memory layout:
+- At the beginning: r = roomptr[0..a_len],
+- at the end: r = roomptr[0..b_len-1], q = roomptr[b_len..a_len] */
+- r_ptr = roomptr;
+- if (s == 0)
+- {
+- memcpy (r_ptr, a_ptr, a_len * sizeof (mp_limb_t));
+- r_ptr[a_len] = 0;
+- }
+- else
+- {
+- const mp_limb_t *sourceptr = a_ptr;
+- mp_limb_t *destptr = r_ptr;
+- mp_twolimb_t accu = 0;
+- size_t count;
+- for (count = a_len; count > 0; count--)
+- {
+- accu += (mp_twolimb_t) *sourceptr++ << s;
+- *destptr++ = (mp_limb_t) accu;
+- accu = accu >> GMP_LIMB_BITS;
+- }
+- *destptr++ = (mp_limb_t) accu;
+- }
+- q_ptr = roomptr + b_len;
+- q_len = a_len - b_len + 1; /* q will have m-n+1 limbs */
+- {
+- size_t j = a_len - b_len; /* m-n */
+- mp_limb_t b_msd = b_ptr[b_len - 1]; /* b[n-1] */
+- mp_limb_t b_2msd = b_ptr[b_len - 2]; /* b[n-2] */
+- mp_twolimb_t b_msdd = /* b[n-1]*beta+b[n-2] */
+- ((mp_twolimb_t) b_msd << GMP_LIMB_BITS) | b_2msd;
+- /* Division loop, traversed m-n+1 times.
+- j counts down, b is unchanged, beta/2 <= b[n-1] < beta. */
+- for (;;)
+- {
+- mp_limb_t q_star;
+- mp_limb_t c1;
+- if (r_ptr[j + b_len] < b_msd) /* r[j+n] < b[n-1] ? */
+- {
+- /* Divide r[j+n]*beta+r[j+n-1] by b[n-1], no overflow. */
+- mp_twolimb_t num =
+- ((mp_twolimb_t) r_ptr[j + b_len] << GMP_LIMB_BITS)
+- | r_ptr[j + b_len - 1];
+- q_star = num / b_msd;
+- c1 = num % b_msd;
+- }
+- else
+- {
+- /* Overflow, hence r[j+n]*beta+r[j+n-1] >= beta*b[n-1]. */
+- q_star = (mp_limb_t)~(mp_limb_t)0; /* q* = beta-1 */
+- /* Test whether r[j+n]*beta+r[j+n-1] - (beta-1)*b[n-1] >= beta
+- <==> r[j+n]*beta+r[j+n-1] + b[n-1] >= beta*b[n-1]+beta
+- <==> b[n-1] < floor((r[j+n]*beta+r[j+n-1]+b[n-1])/beta)
+- {<= beta !}.
+- If yes, jump directly to the subtraction loop.
+- (Otherwise, r[j+n]*beta+r[j+n-1] - (beta-1)*b[n-1] < beta
+- <==> floor((r[j+n]*beta+r[j+n-1]+b[n-1])/beta) = b[n-1] ) */
+- if (r_ptr[j + b_len] > b_msd
+- || (c1 = r_ptr[j + b_len - 1] + b_msd) < b_msd)
+- /* r[j+n] >= b[n-1]+1 or
+- r[j+n] = b[n-1] and the addition r[j+n-1]+b[n-1] gives a
+- carry. */
+- goto subtract;
+- }
+- /* q_star = q*,
+- c1 = (r[j+n]*beta+r[j+n-1]) - q* * b[n-1] (>=0, <beta). */
+- {
+- mp_twolimb_t c2 = /* c1*beta+r[j+n-2] */
+- ((mp_twolimb_t) c1 << GMP_LIMB_BITS) | r_ptr[j + b_len - 2];
+- mp_twolimb_t c3 = /* b[n-2] * q* */
+- (mp_twolimb_t) b_2msd * (mp_twolimb_t) q_star;
+- /* While c2 < c3, increase c2 and decrease c3.
+- Consider c3-c2. While it is > 0, decrease it by
+- b[n-1]*beta+b[n-2]. Because of b[n-1]*beta+b[n-2] >= beta^2/2
+- this can happen only twice. */
+- if (c3 > c2)
+- {
+- q_star = q_star - 1; /* q* := q* - 1 */
+- if (c3 - c2 > b_msdd)
+- q_star = q_star - 1; /* q* := q* - 1 */
+- }
+- }
+- if (q_star > 0)
+- subtract:
+- {
+- /* Subtract r := r - b * q* * beta^j. */
+- mp_limb_t cr;
+- {
+- const mp_limb_t *sourceptr = b_ptr;
+- mp_limb_t *destptr = r_ptr + j;
+- mp_twolimb_t carry = 0;
+- size_t count;
+- for (count = b_len; count > 0; count--)
+- {
+- /* Here 0 <= carry <= q*. */
+- carry =
+- carry
+- + (mp_twolimb_t) q_star * (mp_twolimb_t) *sourceptr++
+- + (mp_limb_t) ~(*destptr);
+- /* Here 0 <= carry <= beta*q* + beta-1. */
+- *destptr++ = ~(mp_limb_t) carry;
+- carry = carry >> GMP_LIMB_BITS; /* <= q* */
+- }
+- cr = (mp_limb_t) carry;
+- }
+- /* Subtract cr from r_ptr[j + b_len], then forget about
+- r_ptr[j + b_len]. */
+- if (cr > r_ptr[j + b_len])
+- {
+- /* Subtraction gave a carry. */
+- q_star = q_star - 1; /* q* := q* - 1 */
+- /* Add b back. */
+- {
+- const mp_limb_t *sourceptr = b_ptr;
+- mp_limb_t *destptr = r_ptr + j;
+- mp_limb_t carry = 0;
+- size_t count;
+- for (count = b_len; count > 0; count--)
+- {
+- mp_limb_t source1 = *sourceptr++;
+- mp_limb_t source2 = *destptr;
+- *destptr++ = source1 + source2 + carry;
+- carry =
+- (carry
+- ? source1 >= (mp_limb_t) ~source2
+- : source1 > (mp_limb_t) ~source2);
+- }
+- }
+- /* Forget about the carry and about r[j+n]. */
+- }
+- }
+- /* q* is determined. Store it as q[j]. */
+- q_ptr[j] = q_star;
+- if (j == 0)
+- break;
+- j--;
+- }
+- }
+- r_len = b_len;
+- /* Normalise q. */
+- if (q_ptr[q_len - 1] == 0)
+- q_len--;
+-# if 0 /* Not needed here, since we need r only to compare it with b/2, and
+- b is shifted left by s bits. */
+- /* Shift r right by s bits. */
+- if (s > 0)
+- {
+- mp_limb_t ptr = r_ptr + r_len;
+- mp_twolimb_t accu = 0;
+- size_t count;
+- for (count = r_len; count > 0; count--)
+- {
+- accu = (mp_twolimb_t) (mp_limb_t) accu << GMP_LIMB_BITS;
+- accu += (mp_twolimb_t) *--ptr << (GMP_LIMB_BITS - s);
+- *ptr = (mp_limb_t) (accu >> GMP_LIMB_BITS);
+- }
+- }
+-# endif
+- /* Normalise r. */
+- while (r_len > 0 && r_ptr[r_len - 1] == 0)
+- r_len--;
+- }
+- /* Compare r << 1 with b. */
+- if (r_len > b_len)
+- goto increment_q;
+- {
+- size_t i;
+- for (i = b_len;;)
+- {
+- mp_limb_t r_i =
+- (i <= r_len && i > 0 ? r_ptr[i - 1] >> (GMP_LIMB_BITS - 1) : 0)
+- | (i < r_len ? r_ptr[i] << 1 : 0);
+- mp_limb_t b_i = (i < b_len ? b_ptr[i] : 0);
+- if (r_i > b_i)
+- goto increment_q;
+- if (r_i < b_i)
+- goto keep_q;
+- if (i == 0)
+- break;
+- i--;
+- }
+- }
+- if (q_len > 0 && ((q_ptr[0] & 1) != 0))
+- /* q is odd. */
+- increment_q:
+- {
+- size_t i;
+- for (i = 0; i < q_len; i++)
+- if (++(q_ptr[i]) != 0)
+- goto keep_q;
+- q_ptr[q_len++] = 1;
+- }
+- keep_q:
+- if (tmp_roomptr != NULL)
+- free (tmp_roomptr);
+- q->limbs = q_ptr;
+- q->nlimbs = q_len;
+- return roomptr;
+-}
+-
+-/* Convert a bignum a >= 0, multiplied with 10^extra_zeroes, to decimal
+- representation.
+- Destroys the contents of a.
+- Return the allocated memory - containing the decimal digits in low-to-high
+- order, terminated with a NUL character - in case of success, NULL in case
+- of memory allocation failure. */
+-static char *
+-convert_to_decimal (mpn_t a, size_t extra_zeroes)
+-{
+- mp_limb_t *a_ptr = a.limbs;
+- size_t a_len = a.nlimbs;
+- /* 0.03345 is slightly larger than log(2)/(9*log(10)). */
+- size_t c_len = 9 * ((size_t)(a_len * (GMP_LIMB_BITS * 0.03345f)) + 1);
+- char *c_ptr = (char *) malloc (xsum (c_len, extra_zeroes));
+- if (c_ptr != NULL)
+- {
+- char *d_ptr = c_ptr;
+- for (; extra_zeroes > 0; extra_zeroes--)
+- *d_ptr++ = '0';
+- while (a_len > 0)
+- {
+- /* Divide a by 10^9, in-place. */
+- mp_limb_t remainder = 0;
+- mp_limb_t *ptr = a_ptr + a_len;
+- size_t count;
+- for (count = a_len; count > 0; count--)
+- {
+- mp_twolimb_t num =
+- ((mp_twolimb_t) remainder << GMP_LIMB_BITS) | *--ptr;
+- *ptr = num / 1000000000;
+- remainder = num % 1000000000;
+- }
+- /* Store the remainder as 9 decimal digits. */
+- for (count = 9; count > 0; count--)
+- {
+- *d_ptr++ = '0' + (remainder % 10);
+- remainder = remainder / 10;
+- }
+- /* Normalize a. */
+- if (a_ptr[a_len - 1] == 0)
+- a_len--;
+- }
+- /* Remove leading zeroes. */
+- while (d_ptr > c_ptr && d_ptr[-1] == '0')
+- d_ptr--;
+- /* But keep at least one zero. */
+- if (d_ptr == c_ptr)
+- *d_ptr++ = '0';
+- /* Terminate the string. */
+- *d_ptr = '\0';
+- }
+- return c_ptr;
+-}
+-
+-# if NEED_PRINTF_LONG_DOUBLE
+-
+-/* Assuming x is finite and >= 0:
+- write x as x = 2^e * m, where m is a bignum.
+- Return the allocated memory in case of success, NULL in case of memory
+- allocation failure. */
+-static void *
+-decode_long_double (long double x, int *ep, mpn_t *mp)
+-{
+- mpn_t m;
+- int exp;
+- long double y;
+- size_t i;
+-
+- /* Allocate memory for result. */
+- m.nlimbs = (LDBL_MANT_BIT + GMP_LIMB_BITS - 1) / GMP_LIMB_BITS;
+- m.limbs = (mp_limb_t *) malloc (m.nlimbs * sizeof (mp_limb_t));
+- if (m.limbs == NULL)
+- return NULL;
+- /* Split into exponential part and mantissa. */
+- y = frexpl (x, &exp);
+- if (!(y >= 0.0L && y < 1.0L))
+- abort ();
+- /* x = 2^exp * y = 2^(exp - LDBL_MANT_BIT) * (y * LDBL_MANT_BIT), and the
+- latter is an integer. */
+- /* Convert the mantissa (y * LDBL_MANT_BIT) to a sequence of limbs.
+- I'm not sure whether it's safe to cast a 'long double' value between
+- 2^31 and 2^32 to 'unsigned int', therefore play safe and cast only
+- 'long double' values between 0 and 2^16 (to 'unsigned int' or 'int',
+- doesn't matter). */
+-# if (LDBL_MANT_BIT % GMP_LIMB_BITS) != 0
+-# if (LDBL_MANT_BIT % GMP_LIMB_BITS) > GMP_LIMB_BITS / 2
+- {
+- mp_limb_t hi, lo;
+- y *= (mp_limb_t) 1 << (LDBL_MANT_BIT % (GMP_LIMB_BITS / 2));
+- hi = (int) y;
+- y -= hi;
+- if (!(y >= 0.0L && y < 1.0L))
+- abort ();
+- y *= (mp_limb_t) 1 << (GMP_LIMB_BITS / 2);
+- lo = (int) y;
+- y -= lo;
+- if (!(y >= 0.0L && y < 1.0L))
+- abort ();
+- m.limbs[LDBL_MANT_BIT / GMP_LIMB_BITS] = (hi << (GMP_LIMB_BITS / 2)) | lo;
+- }
+-# else
+- {
+- mp_limb_t d;
+- y *= (mp_limb_t) 1 << (LDBL_MANT_BIT % GMP_LIMB_BITS);
+- d = (int) y;
+- y -= d;
+- if (!(y >= 0.0L && y < 1.0L))
+- abort ();
+- m.limbs[LDBL_MANT_BIT / GMP_LIMB_BITS] = d;
+- }
+-# endif
+-# endif
+- for (i = LDBL_MANT_BIT / GMP_LIMB_BITS; i > 0; )
+- {
+- mp_limb_t hi, lo;
+- y *= (mp_limb_t) 1 << (GMP_LIMB_BITS / 2);
+- hi = (int) y;
+- y -= hi;
+- if (!(y >= 0.0L && y < 1.0L))
+- abort ();
+- y *= (mp_limb_t) 1 << (GMP_LIMB_BITS / 2);
+- lo = (int) y;
+- y -= lo;
+- if (!(y >= 0.0L && y < 1.0L))
+- abort ();
+- m.limbs[--i] = (hi << (GMP_LIMB_BITS / 2)) | lo;
+- }
+- if (!(y == 0.0L))
+- abort ();
+- /* Normalise. */
+- while (m.nlimbs > 0 && m.limbs[m.nlimbs - 1] == 0)
+- m.nlimbs--;
+- *mp = m;
+- *ep = exp - LDBL_MANT_BIT;
+- return m.limbs;
+-}
+-
+-# endif
+-
+-# if NEED_PRINTF_DOUBLE
+-
+-/* Assuming x is finite and >= 0:
+- write x as x = 2^e * m, where m is a bignum.
+- Return the allocated memory in case of success, NULL in case of memory
+- allocation failure. */
+-static void *
+-decode_double (double x, int *ep, mpn_t *mp)
+-{
+- mpn_t m;
+- int exp;
+- double y;
+- size_t i;
+-
+- /* Allocate memory for result. */
+- m.nlimbs = (DBL_MANT_BIT + GMP_LIMB_BITS - 1) / GMP_LIMB_BITS;
+- m.limbs = (mp_limb_t *) malloc (m.nlimbs * sizeof (mp_limb_t));
+- if (m.limbs == NULL)
+- return NULL;
+- /* Split into exponential part and mantissa. */
+- y = frexp (x, &exp);
+- if (!(y >= 0.0 && y < 1.0))
+- abort ();
+- /* x = 2^exp * y = 2^(exp - DBL_MANT_BIT) * (y * DBL_MANT_BIT), and the
+- latter is an integer. */
+- /* Convert the mantissa (y * DBL_MANT_BIT) to a sequence of limbs.
+- I'm not sure whether it's safe to cast a 'double' value between
+- 2^31 and 2^32 to 'unsigned int', therefore play safe and cast only
+- 'double' values between 0 and 2^16 (to 'unsigned int' or 'int',
+- doesn't matter). */
+-# if (DBL_MANT_BIT % GMP_LIMB_BITS) != 0
+-# if (DBL_MANT_BIT % GMP_LIMB_BITS) > GMP_LIMB_BITS / 2
+- {
+- mp_limb_t hi, lo;
+- y *= (mp_limb_t) 1 << (DBL_MANT_BIT % (GMP_LIMB_BITS / 2));
+- hi = (int) y;
+- y -= hi;
+- if (!(y >= 0.0 && y < 1.0))
+- abort ();
+- y *= (mp_limb_t) 1 << (GMP_LIMB_BITS / 2);
+- lo = (int) y;
+- y -= lo;
+- if (!(y >= 0.0 && y < 1.0))
+- abort ();
+- m.limbs[DBL_MANT_BIT / GMP_LIMB_BITS] = (hi << (GMP_LIMB_BITS / 2)) | lo;
+- }
+-# else
+- {
+- mp_limb_t d;
+- y *= (mp_limb_t) 1 << (DBL_MANT_BIT % GMP_LIMB_BITS);
+- d = (int) y;
+- y -= d;
+- if (!(y >= 0.0 && y < 1.0))
+- abort ();
+- m.limbs[DBL_MANT_BIT / GMP_LIMB_BITS] = d;
+- }
+-# endif
+-# endif
+- for (i = DBL_MANT_BIT / GMP_LIMB_BITS; i > 0; )
+- {
+- mp_limb_t hi, lo;
+- y *= (mp_limb_t) 1 << (GMP_LIMB_BITS / 2);
+- hi = (int) y;
+- y -= hi;
+- if (!(y >= 0.0 && y < 1.0))
+- abort ();
+- y *= (mp_limb_t) 1 << (GMP_LIMB_BITS / 2);
+- lo = (int) y;
+- y -= lo;
+- if (!(y >= 0.0 && y < 1.0))
+- abort ();
+- m.limbs[--i] = (hi << (GMP_LIMB_BITS / 2)) | lo;
+- }
+- if (!(y == 0.0))
+- abort ();
+- /* Normalise. */
+- while (m.nlimbs > 0 && m.limbs[m.nlimbs - 1] == 0)
+- m.nlimbs--;
+- *mp = m;
+- *ep = exp - DBL_MANT_BIT;
+- return m.limbs;
+-}
+-
+-# endif
+-
+-/* Assuming x = 2^e * m is finite and >= 0, and n is an integer:
+- Returns the decimal representation of round (x * 10^n).
+- Return the allocated memory - containing the decimal digits in low-to-high
+- order, terminated with a NUL character - in case of success, NULL in case
+- of memory allocation failure. */
+-static char *
+-scale10_round_decimal_decoded (int e, mpn_t m, void *memory, int n)
+-{
+- int s;
+- size_t extra_zeroes;
+- unsigned int abs_n;
+- unsigned int abs_s;
+- mp_limb_t *pow5_ptr;
+- size_t pow5_len;
+- unsigned int s_limbs;
+- unsigned int s_bits;
+- mpn_t pow5;
+- mpn_t z;
+- void *z_memory;
+- char *digits;
+-
+- if (memory == NULL)
+- return NULL;
+- /* x = 2^e * m, hence
+- y = round (2^e * 10^n * m) = round (2^(e+n) * 5^n * m)
+- = round (2^s * 5^n * m). */
+- s = e + n;
+- extra_zeroes = 0;
+- /* Factor out a common power of 10 if possible. */
+- if (s > 0 && n > 0)
+- {
+- extra_zeroes = (s < n ? s : n);
+- s -= extra_zeroes;
+- n -= extra_zeroes;
+- }
+- /* Here y = round (2^s * 5^n * m) * 10^extra_zeroes.
+- Before converting to decimal, we need to compute
+- z = round (2^s * 5^n * m). */
+- /* Compute 5^|n|, possibly shifted by |s| bits if n and s have the same
+- sign. 2.322 is slightly larger than log(5)/log(2). */
+- abs_n = (n >= 0 ? n : -n);
+- abs_s = (s >= 0 ? s : -s);
+- pow5_ptr = (mp_limb_t *) malloc (((int)(abs_n * (2.322f / GMP_LIMB_BITS)) + 1
+- + abs_s / GMP_LIMB_BITS + 1)
+- * sizeof (mp_limb_t));
+- if (pow5_ptr == NULL)
+- {
+- free (memory);
+- return NULL;
+- }
+- /* Initialize with 1. */
+- pow5_ptr[0] = 1;
+- pow5_len = 1;
+- /* Multiply with 5^|n|. */
+- if (abs_n > 0)
+- {
+- static mp_limb_t const small_pow5[13 + 1] =
+- {
+- 1, 5, 25, 125, 625, 3125, 15625, 78125, 390625, 1953125, 9765625,
+- 48828125, 244140625, 1220703125
+- };
+- unsigned int n13;
+- for (n13 = 0; n13 <= abs_n; n13 += 13)
+- {
+- mp_limb_t digit1 = small_pow5[n13 + 13 <= abs_n ? 13 : abs_n - n13];
+- size_t j;
+- mp_twolimb_t carry = 0;
+- for (j = 0; j < pow5_len; j++)
+- {
+- mp_limb_t digit2 = pow5_ptr[j];
+- carry += (mp_twolimb_t) digit1 * (mp_twolimb_t) digit2;
+- pow5_ptr[j] = (mp_limb_t) carry;
+- carry = carry >> GMP_LIMB_BITS;
+- }
+- if (carry > 0)
+- pow5_ptr[pow5_len++] = (mp_limb_t) carry;
+- }
+- }
+- s_limbs = abs_s / GMP_LIMB_BITS;
+- s_bits = abs_s % GMP_LIMB_BITS;
+- if (n >= 0 ? s >= 0 : s <= 0)
+- {
+- /* Multiply with 2^|s|. */
+- if (s_bits > 0)
+- {
+- mp_limb_t *ptr = pow5_ptr;
+- mp_twolimb_t accu = 0;
+- size_t count;
+- for (count = pow5_len; count > 0; count--)
+- {
+- accu += (mp_twolimb_t) *ptr << s_bits;
+- *ptr++ = (mp_limb_t) accu;
+- accu = accu >> GMP_LIMB_BITS;
+- }
+- if (accu > 0)
+- {
+- *ptr = (mp_limb_t) accu;
+- pow5_len++;
+- }
+- }
+- if (s_limbs > 0)
+- {
+- size_t count;
+- for (count = pow5_len; count > 0;)
+- {
+- count--;
+- pow5_ptr[s_limbs + count] = pow5_ptr[count];
+- }
+- for (count = s_limbs; count > 0;)
+- {
+- count--;
+- pow5_ptr[count] = 0;
+- }
+- pow5_len += s_limbs;
+- }
+- pow5.limbs = pow5_ptr;
+- pow5.nlimbs = pow5_len;
+- if (n >= 0)
+- {
+- /* Multiply m with pow5. No division needed. */
+- z_memory = multiply (m, pow5, &z);
+- }
+- else
+- {
+- /* Divide m by pow5 and round. */
+- z_memory = divide (m, pow5, &z);
+- }
+- }
+- else
+- {
+- pow5.limbs = pow5_ptr;
+- pow5.nlimbs = pow5_len;
+- if (n >= 0)
+- {
+- /* n >= 0, s < 0.
+- Multiply m with pow5, then divide by 2^|s|. */
+- mpn_t numerator;
+- mpn_t denominator;
+- void *tmp_memory;
+- tmp_memory = multiply (m, pow5, &numerator);
+- if (tmp_memory == NULL)
+- {
+- free (pow5_ptr);
+- free (memory);
+- return NULL;
+- }
+- /* Construct 2^|s|. */
+- {
+- mp_limb_t *ptr = pow5_ptr + pow5_len;
+- size_t i;
+- for (i = 0; i < s_limbs; i++)
+- ptr[i] = 0;
+- ptr[s_limbs] = (mp_limb_t) 1 << s_bits;
+- denominator.limbs = ptr;
+- denominator.nlimbs = s_limbs + 1;
+- }
+- z_memory = divide (numerator, denominator, &z);
+- free (tmp_memory);
+- }
+- else
+- {
+- /* n < 0, s > 0.
+- Multiply m with 2^s, then divide by pow5. */
+- mpn_t numerator;
+- mp_limb_t *num_ptr;
+- num_ptr = (mp_limb_t *) malloc ((m.nlimbs + s_limbs + 1)
+- * sizeof (mp_limb_t));
+- if (num_ptr == NULL)
+- {
+- free (pow5_ptr);
+- free (memory);
+- return NULL;
+- }
+- {
+- mp_limb_t *destptr = num_ptr;
+- {
+- size_t i;
+- for (i = 0; i < s_limbs; i++)
+- *destptr++ = 0;
+- }
+- if (s_bits > 0)
+- {
+- const mp_limb_t *sourceptr = m.limbs;
+- mp_twolimb_t accu = 0;
+- size_t count;
+- for (count = m.nlimbs; count > 0; count--)
+- {
+- accu += (mp_twolimb_t) *sourceptr++ << s_bits;
+- *destptr++ = (mp_limb_t) accu;
+- accu = accu >> GMP_LIMB_BITS;
+- }
+- if (accu > 0)
+- *destptr++ = (mp_limb_t) accu;
+- }
+- else
+- {
+- const mp_limb_t *sourceptr = m.limbs;
+- size_t count;
+- for (count = m.nlimbs; count > 0; count--)
+- *destptr++ = *sourceptr++;
+- }
+- numerator.limbs = num_ptr;
+- numerator.nlimbs = destptr - num_ptr;
+- }
+- z_memory = divide (numerator, pow5, &z);
+- free (num_ptr);
+- }
+- }
+- free (pow5_ptr);
+- free (memory);
+-
+- /* Here y = round (x * 10^n) = z * 10^extra_zeroes. */
+-
+- if (z_memory == NULL)
+- return NULL;
+- digits = convert_to_decimal (z, extra_zeroes);
+- free (z_memory);
+- return digits;
+-}
+-
+-# if NEED_PRINTF_LONG_DOUBLE
+-
+-/* Assuming x is finite and >= 0, and n is an integer:
+- Returns the decimal representation of round (x * 10^n).
+- Return the allocated memory - containing the decimal digits in low-to-high
+- order, terminated with a NUL character - in case of success, NULL in case
+- of memory allocation failure. */
+-static char *
+-scale10_round_decimal_long_double (long double x, int n)
+-{
+- int e;
+- mpn_t m;
+- void *memory = decode_long_double (x, &e, &m);
+- return scale10_round_decimal_decoded (e, m, memory, n);
+-}
+-
+-# endif
+-
+-# if NEED_PRINTF_DOUBLE
+-
+-/* Assuming x is finite and >= 0, and n is an integer:
+- Returns the decimal representation of round (x * 10^n).
+- Return the allocated memory - containing the decimal digits in low-to-high
+- order, terminated with a NUL character - in case of success, NULL in case
+- of memory allocation failure. */
+-static char *
+-scale10_round_decimal_double (double x, int n)
+-{
+- int e;
+- mpn_t m;
+- void *memory = decode_double (x, &e, &m);
+- return scale10_round_decimal_decoded (e, m, memory, n);
+-}
+-
+-# endif
+-
+-# if NEED_PRINTF_LONG_DOUBLE
+-
+-/* Assuming x is finite and > 0:
+- Return an approximation for n with 10^n <= x < 10^(n+1).
+- The approximation is usually the right n, but may be off by 1 sometimes. */
+-static int
+-floorlog10l (long double x)
+-{
+- int exp;
+- long double y;
+- double z;
+- double l;
+-
+- /* Split into exponential part and mantissa. */
+- y = frexpl (x, &exp);
+- if (!(y >= 0.0L && y < 1.0L))
+- abort ();
+- if (y == 0.0L)
+- return INT_MIN;
+- if (y < 0.5L)
+- {
+- while (y < (1.0L / (1 << (GMP_LIMB_BITS / 2)) / (1 << (GMP_LIMB_BITS / 2))))
+- {
+- y *= 1.0L * (1 << (GMP_LIMB_BITS / 2)) * (1 << (GMP_LIMB_BITS / 2));
+- exp -= GMP_LIMB_BITS;
+- }
+- if (y < (1.0L / (1 << 16)))
+- {
+- y *= 1.0L * (1 << 16);
+- exp -= 16;
+- }
+- if (y < (1.0L / (1 << 8)))
+- {
+- y *= 1.0L * (1 << 8);
+- exp -= 8;
+- }
+- if (y < (1.0L / (1 << 4)))
+- {
+- y *= 1.0L * (1 << 4);
+- exp -= 4;
+- }
+- if (y < (1.0L / (1 << 2)))
+- {
+- y *= 1.0L * (1 << 2);
+- exp -= 2;
+- }
+- if (y < (1.0L / (1 << 1)))
+- {
+- y *= 1.0L * (1 << 1);
+- exp -= 1;
+- }
+- }
+- if (!(y >= 0.5L && y < 1.0L))
+- abort ();
+- /* Compute an approximation for l = log2(x) = exp + log2(y). */
+- l = exp;
+- z = y;
+- if (z < 0.70710678118654752444)
+- {
+- z *= 1.4142135623730950488;
+- l -= 0.5;
+- }
+- if (z < 0.8408964152537145431)
+- {
+- z *= 1.1892071150027210667;
+- l -= 0.25;
+- }
+- if (z < 0.91700404320467123175)
+- {
+- z *= 1.0905077326652576592;
+- l -= 0.125;
+- }
+- if (z < 0.9576032806985736469)
+- {
+- z *= 1.0442737824274138403;
+- l -= 0.0625;
+- }
+- /* Now 0.95 <= z <= 1.01. */
+- z = 1 - z;
+- /* log(1-z) = - z - z^2/2 - z^3/3 - z^4/4 - ...
+- Four terms are enough to get an approximation with error < 10^-7. */
+- l -= z * (1.0 + z * (0.5 + z * ((1.0 / 3) + z * 0.25)));
+- /* Finally multiply with log(2)/log(10), yields an approximation for
+- log10(x). */
+- l *= 0.30102999566398119523;
+- /* Round down to the next integer. */
+- return (int) l + (l < 0 ? -1 : 0);
+-}
+-
+-# endif
+-
+-# if NEED_PRINTF_DOUBLE
+-
+-/* Assuming x is finite and > 0:
+- Return an approximation for n with 10^n <= x < 10^(n+1).
+- The approximation is usually the right n, but may be off by 1 sometimes. */
+-static int
+-floorlog10 (double x)
+-{
+- int exp;
+- double y;
+- double z;
+- double l;
+-
+- /* Split into exponential part and mantissa. */
+- y = frexp (x, &exp);
+- if (!(y >= 0.0 && y < 1.0))
+- abort ();
+- if (y == 0.0)
+- return INT_MIN;
+- if (y < 0.5)
+- {
+- while (y < (1.0 / (1 << (GMP_LIMB_BITS / 2)) / (1 << (GMP_LIMB_BITS / 2))))
+- {
+- y *= 1.0 * (1 << (GMP_LIMB_BITS / 2)) * (1 << (GMP_LIMB_BITS / 2));
+- exp -= GMP_LIMB_BITS;
+- }
+- if (y < (1.0 / (1 << 16)))
+- {
+- y *= 1.0 * (1 << 16);
+- exp -= 16;
+- }
+- if (y < (1.0 / (1 << 8)))
+- {
+- y *= 1.0 * (1 << 8);
+- exp -= 8;
+- }
+- if (y < (1.0 / (1 << 4)))
+- {
+- y *= 1.0 * (1 << 4);
+- exp -= 4;
+- }
+- if (y < (1.0 / (1 << 2)))
+- {
+- y *= 1.0 * (1 << 2);
+- exp -= 2;
+- }
+- if (y < (1.0 / (1 << 1)))
+- {
+- y *= 1.0 * (1 << 1);
+- exp -= 1;
+- }
+- }
+- if (!(y >= 0.5 && y < 1.0))
+- abort ();
+- /* Compute an approximation for l = log2(x) = exp + log2(y). */
+- l = exp;
+- z = y;
+- if (z < 0.70710678118654752444)
+- {
+- z *= 1.4142135623730950488;
+- l -= 0.5;
+- }
+- if (z < 0.8408964152537145431)
+- {
+- z *= 1.1892071150027210667;
+- l -= 0.25;
+- }
+- if (z < 0.91700404320467123175)
+- {
+- z *= 1.0905077326652576592;
+- l -= 0.125;
+- }
+- if (z < 0.9576032806985736469)
+- {
+- z *= 1.0442737824274138403;
+- l -= 0.0625;
+- }
+- /* Now 0.95 <= z <= 1.01. */
+- z = 1 - z;
+- /* log(1-z) = - z - z^2/2 - z^3/3 - z^4/4 - ...
+- Four terms are enough to get an approximation with error < 10^-7. */
+- l -= z * (1.0 + z * (0.5 + z * ((1.0 / 3) + z * 0.25)));
+- /* Finally multiply with log(2)/log(10), yields an approximation for
+- log10(x). */
+- l *= 0.30102999566398119523;
+- /* Round down to the next integer. */
+- return (int) l + (l < 0 ? -1 : 0);
+-}
+-
+-# endif
+-
+-#endif
+-
+-DCHAR_T *
+-VASNPRINTF (DCHAR_T *resultbuf, size_t *lengthp,
+- const FCHAR_T *format, va_list args)
+-{
+- DIRECTIVES d;
+- arguments a;
+-
+- if (PRINTF_PARSE (format, &d, &a) < 0)
+- /* errno is already set. */
+- return NULL;
+-
+-#define CLEANUP() \
+- free (d.dir); \
+- if (a.arg) \
+- free (a.arg);
+-
+- if (PRINTF_FETCHARGS (args, &a) < 0)
+- {
+- CLEANUP ();
+- errno = EINVAL;
+- return NULL;
+- }
+-
+- {
+- size_t buf_neededlength;
+- TCHAR_T *buf;
+- TCHAR_T *buf_malloced;
+- const FCHAR_T *cp;
+- size_t i;
+- DIRECTIVE *dp;
+- /* Output string accumulator. */
+- DCHAR_T *result;
+- size_t allocated;
+- size_t length;
+-
+- /* Allocate a small buffer that will hold a directive passed to
+- sprintf or snprintf. */
+- buf_neededlength =
+- xsum4 (7, d.max_width_length, d.max_precision_length, 6);
+-#if HAVE_ALLOCA
+- if (buf_neededlength < 4000 / sizeof (TCHAR_T))
+- {
+- buf = (TCHAR_T *) alloca (buf_neededlength * sizeof (TCHAR_T));
+- buf_malloced = NULL;
+- }
+- else
+-#endif
+- {
+- size_t buf_memsize = xtimes (buf_neededlength, sizeof (TCHAR_T));
+- if (size_overflow_p (buf_memsize))
+- goto out_of_memory_1;
+- buf = (TCHAR_T *) malloc (buf_memsize);
+- if (buf == NULL)
+- goto out_of_memory_1;
+- buf_malloced = buf;
+- }
+-
+- 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. */
+-
+- /* Ensures that allocated >= needed. Aborts through a jump to
+- out_of_memory if needed is SIZE_MAX or otherwise too big. */
+-#define ENSURE_ALLOCATION(needed) \
+- if ((needed) > allocated) \
+- { \
+- size_t memory_size; \
+- DCHAR_T *memory; \
+- \
+- allocated = (allocated > 0 ? xtimes (allocated, 2) : 12); \
+- if ((needed) > allocated) \
+- allocated = (needed); \
+- memory_size = xtimes (allocated, sizeof (DCHAR_T)); \
+- if (size_overflow_p (memory_size)) \
+- goto out_of_memory; \
+- if (result == resultbuf || result == NULL) \
+- memory = (DCHAR_T *) malloc (memory_size); \
+- else \
+- memory = (DCHAR_T *) realloc (result, memory_size); \
+- if (memory == NULL) \
+- goto out_of_memory; \
+- if (result == resultbuf && length > 0) \
+- DCHAR_CPY (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;
+- size_t augmented_length = xsum (length, n);
+-
+- ENSURE_ALLOCATION (augmented_length);
+- /* This copies a piece of FCHAR_T[] into a DCHAR_T[]. Here we
+- need that the format string contains only ASCII characters
+- if FCHAR_T and DCHAR_T are not the same type. */
+- if (sizeof (FCHAR_T) == sizeof (DCHAR_T))
+- {
+- DCHAR_CPY (result + length, (const DCHAR_T *) cp, n);
+- length = augmented_length;
+- }
+- else
+- {
+- do
+- result[length++] = (unsigned char) *cp++;
+- while (--n > 0);
+- }
+- }
+- if (i == d.count)
+- break;
+-
+- /* Execute a single directive. */
+- if (dp->conversion == '%')
+- {
+- size_t augmented_length;
+-
+- if (!(dp->arg_index == ARG_NONE))
+- abort ();
+- augmented_length = xsum (length, 1);
+- ENSURE_ALLOCATION (augmented_length);
+- result[length] = '%';
+- length = augmented_length;
+- }
+- else
+- {
+- if (!(dp->arg_index != ARG_NONE))
+- 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;
+-#if HAVE_LONG_LONG_INT
+- case TYPE_COUNT_LONGLONGINT_POINTER:
+- *a.arg[dp->arg_index].a.a_count_longlongint_pointer = length;
+- break;
+-#endif
+- default:
+- abort ();
+- }
+- }
+-#if ENABLE_UNISTDIO
+- /* The unistdio extensions. */
+- else if (dp->conversion == 'U')
+- {
+- arg_type type = a.arg[dp->arg_index].type;
+- int flags = dp->flags;
+- int has_width;
+- size_t width;
+- int has_precision;
+- size_t precision;
+-
+- has_width = 0;
+- width = 0;
+- if (dp->width_start != dp->width_end)
+- {
+- if (dp->width_arg_index != ARG_NONE)
+- {
+- int arg;
+-
+- if (!(a.arg[dp->width_arg_index].type == TYPE_INT))
+- abort ();
+- arg = a.arg[dp->width_arg_index].a.a_int;
+- if (arg < 0)
+- {
+- /* "A negative field width is taken as a '-' flag
+- followed by a positive field width." */
+- flags |= FLAG_LEFT;
+- width = (unsigned int) (-arg);
+- }
+- else
+- width = arg;
+- }
+- else
+- {
+- const FCHAR_T *digitp = dp->width_start;
+-
+- do
+- width = xsum (xtimes (width, 10), *digitp++ - '0');
+- while (digitp != dp->width_end);
+- }
+- has_width = 1;
+- }
+-
+- has_precision = 0;
+- precision = 0;
+- if (dp->precision_start != dp->precision_end)
+- {
+- if (dp->precision_arg_index != ARG_NONE)
+- {
+- int arg;
+-
+- if (!(a.arg[dp->precision_arg_index].type == TYPE_INT))
+- abort ();
+- arg = a.arg[dp->precision_arg_index].a.a_int;
+- /* "A negative precision is taken as if the precision
+- were omitted." */
+- if (arg >= 0)
+- {
+- precision = arg;
+- has_precision = 1;
+- }
+- }
+- else
+- {
+- const FCHAR_T *digitp = dp->precision_start + 1;
+-
+- precision = 0;
+- while (digitp != dp->precision_end)
+- precision = xsum (xtimes (precision, 10), *digitp++ - '0');
+- has_precision = 1;
+- }
+- }
+-
+- switch (type)
+- {
+- case TYPE_U8_STRING:
+- {
+- const uint8_t *arg = a.arg[dp->arg_index].a.a_u8_string;
+- const uint8_t *arg_end;
+- size_t characters;
+-
+- if (has_precision)
+- {
+- /* Use only PRECISION characters, from the left. */
+- arg_end = arg;
+- characters = 0;
+- for (; precision > 0; precision--)
+- {
+- int count = u8_strmblen (arg_end);
+- if (count == 0)
+- break;
+- if (count < 0)
+- {
+- if (!(result == resultbuf || result == NULL))
+- free (result);
+- if (buf_malloced != NULL)
+- free (buf_malloced);
+- CLEANUP ();
+- errno = EILSEQ;
+- return NULL;
+- }
+- arg_end += count;
+- characters++;
+- }
+- }
+- else if (has_width)
+- {
+- /* Use the entire string, and count the number of
+- characters. */
+- arg_end = arg;
+- characters = 0;
+- for (;;)
+- {
+- int count = u8_strmblen (arg_end);
+- if (count == 0)
+- break;
+- if (count < 0)
+- {
+- if (!(result == resultbuf || result == NULL))
+- free (result);
+- if (buf_malloced != NULL)
+- free (buf_malloced);
+- CLEANUP ();
+- errno = EILSEQ;
+- return NULL;
+- }
+- arg_end += count;
+- characters++;
+- }
+- }
+- else
+- {
+- /* Use the entire string. */
+- arg_end = arg + u8_strlen (arg);
+- /* The number of characters doesn't matter. */
+- characters = 0;
+- }
+-
+- if (has_width && width > characters
+- && !(dp->flags & FLAG_LEFT))
+- {
+- size_t n = width - characters;
+- ENSURE_ALLOCATION (xsum (length, n));
+- DCHAR_SET (result + length, ' ', n);
+- length += n;
+- }
+-
+-# if DCHAR_IS_UINT8_T
+- {
+- size_t n = arg_end - arg;
+- ENSURE_ALLOCATION (xsum (length, n));
+- DCHAR_CPY (result + length, arg, n);
+- length += n;
+- }
+-# else
+- { /* Convert. */
+- DCHAR_T *converted = result + length;
+- size_t converted_len = allocated - length;
+-# if DCHAR_IS_TCHAR
+- /* Convert from UTF-8 to locale encoding. */
+- if (u8_conv_to_encoding (locale_charset (),
+- iconveh_question_mark,
+- arg, arg_end - arg, NULL,
+- &converted, &converted_len)
+- < 0)
+-# else
+- /* Convert from UTF-8 to UTF-16/UTF-32. */
+- converted =
+- U8_TO_DCHAR (arg, arg_end - arg,
+- converted, &converted_len);
+- if (converted == NULL)
+-# endif
+- {
+- int saved_errno = errno;
+- if (!(result == resultbuf || result == NULL))
+- free (result);
+- if (buf_malloced != NULL)
+- free (buf_malloced);
+- CLEANUP ();
+- errno = saved_errno;
+- return NULL;
+- }
+- if (converted != result + length)
+- {
+- ENSURE_ALLOCATION (xsum (length, converted_len));
+- DCHAR_CPY (result + length, converted, converted_len);
+- free (converted);
+- }
+- length += converted_len;
+- }
+-# endif
+-
+- if (has_width && width > characters
+- && (dp->flags & FLAG_LEFT))
+- {
+- size_t n = width - characters;
+- ENSURE_ALLOCATION (xsum (length, n));
+- DCHAR_SET (result + length, ' ', n);
+- length += n;
+- }
+- }
+- break;
+-
+- case TYPE_U16_STRING:
+- {
+- const uint16_t *arg = a.arg[dp->arg_index].a.a_u16_string;
+- const uint16_t *arg_end;
+- size_t characters;
+-
+- if (has_precision)
+- {
+- /* Use only PRECISION characters, from the left. */
+- arg_end = arg;
+- characters = 0;
+- for (; precision > 0; precision--)
+- {
+- int count = u16_strmblen (arg_end);
+- if (count == 0)
+- break;
+- if (count < 0)
+- {
+- if (!(result == resultbuf || result == NULL))
+- free (result);
+- if (buf_malloced != NULL)
+- free (buf_malloced);
+- CLEANUP ();
+- errno = EILSEQ;
+- return NULL;
+- }
+- arg_end += count;
+- characters++;
+- }
+- }
+- else if (has_width)
+- {
+- /* Use the entire string, and count the number of
+- characters. */
+- arg_end = arg;
+- characters = 0;
+- for (;;)
+- {
+- int count = u16_strmblen (arg_end);
+- if (count == 0)
+- break;
+- if (count < 0)
+- {
+- if (!(result == resultbuf || result == NULL))
+- free (result);
+- if (buf_malloced != NULL)
+- free (buf_malloced);
+- CLEANUP ();
+- errno = EILSEQ;
+- return NULL;
+- }
+- arg_end += count;
+- characters++;
+- }
+- }
+- else
+- {
+- /* Use the entire string. */
+- arg_end = arg + u16_strlen (arg);
+- /* The number of characters doesn't matter. */
+- characters = 0;
+- }
+-
+- if (has_width && width > characters
+- && !(dp->flags & FLAG_LEFT))
+- {
+- size_t n = width - characters;
+- ENSURE_ALLOCATION (xsum (length, n));
+- DCHAR_SET (result + length, ' ', n);
+- length += n;
+- }
+-
+-# if DCHAR_IS_UINT16_T
+- {
+- size_t n = arg_end - arg;
+- ENSURE_ALLOCATION (xsum (length, n));
+- DCHAR_CPY (result + length, arg, n);
+- length += n;
+- }
+-# else
+- { /* Convert. */
+- DCHAR_T *converted = result + length;
+- size_t converted_len = allocated - length;
+-# if DCHAR_IS_TCHAR
+- /* Convert from UTF-16 to locale encoding. */
+- if (u16_conv_to_encoding (locale_charset (),
+- iconveh_question_mark,
+- arg, arg_end - arg, NULL,
+- &converted, &converted_len)
+- < 0)
+-# else
+- /* Convert from UTF-16 to UTF-8/UTF-32. */
+- converted =
+- U16_TO_DCHAR (arg, arg_end - arg,
+- converted, &converted_len);
+- if (converted == NULL)
+-# endif
+- {
+- int saved_errno = errno;
+- if (!(result == resultbuf || result == NULL))
+- free (result);
+- if (buf_malloced != NULL)
+- free (buf_malloced);
+- CLEANUP ();
+- errno = saved_errno;
+- return NULL;
+- }
+- if (converted != result + length)
+- {
+- ENSURE_ALLOCATION (xsum (length, converted_len));
+- DCHAR_CPY (result + length, converted, converted_len);
+- free (converted);
+- }
+- length += converted_len;
+- }
+-# endif
+-
+- if (has_width && width > characters
+- && (dp->flags & FLAG_LEFT))
+- {
+- size_t n = width - characters;
+- ENSURE_ALLOCATION (xsum (length, n));
+- DCHAR_SET (result + length, ' ', n);
+- length += n;
+- }
+- }
+- break;
+-
+- case TYPE_U32_STRING:
+- {
+- const uint32_t *arg = a.arg[dp->arg_index].a.a_u32_string;
+- const uint32_t *arg_end;
+- size_t characters;
+-
+- if (has_precision)
+- {
+- /* Use only PRECISION characters, from the left. */
+- arg_end = arg;
+- characters = 0;
+- for (; precision > 0; precision--)
+- {
+- int count = u32_strmblen (arg_end);
+- if (count == 0)
+- break;
+- if (count < 0)
+- {
+- if (!(result == resultbuf || result == NULL))
+- free (result);
+- if (buf_malloced != NULL)
+- free (buf_malloced);
+- CLEANUP ();
+- errno = EILSEQ;
+- return NULL;
+- }
+- arg_end += count;
+- characters++;
+- }
+- }
+- else if (has_width)
+- {
+- /* Use the entire string, and count the number of
+- characters. */
+- arg_end = arg;
+- characters = 0;
+- for (;;)
+- {
+- int count = u32_strmblen (arg_end);
+- if (count == 0)
+- break;
+- if (count < 0)
+- {
+- if (!(result == resultbuf || result == NULL))
+- free (result);
+- if (buf_malloced != NULL)
+- free (buf_malloced);
+- CLEANUP ();
+- errno = EILSEQ;
+- return NULL;
+- }
+- arg_end += count;
+- characters++;
+- }
+- }
+- else
+- {
+- /* Use the entire string. */
+- arg_end = arg + u32_strlen (arg);
+- /* The number of characters doesn't matter. */
+- characters = 0;
+- }
+-
+- if (has_width && width > characters
+- && !(dp->flags & FLAG_LEFT))
+- {
+- size_t n = width - characters;
+- ENSURE_ALLOCATION (xsum (length, n));
+- DCHAR_SET (result + length, ' ', n);
+- length += n;
+- }
+-
+-# if DCHAR_IS_UINT32_T
+- {
+- size_t n = arg_end - arg;
+- ENSURE_ALLOCATION (xsum (length, n));
+- DCHAR_CPY (result + length, arg, n);
+- length += n;
+- }
+-# else
+- { /* Convert. */
+- DCHAR_T *converted = result + length;
+- size_t converted_len = allocated - length;
+-# if DCHAR_IS_TCHAR
+- /* Convert from UTF-32 to locale encoding. */
+- if (u32_conv_to_encoding (locale_charset (),
+- iconveh_question_mark,
+- arg, arg_end - arg, NULL,
+- &converted, &converted_len)
+- < 0)
+-# else
+- /* Convert from UTF-32 to UTF-8/UTF-16. */
+- converted =
+- U32_TO_DCHAR (arg, arg_end - arg,
+- converted, &converted_len);
+- if (converted == NULL)
+-# endif
+- {
+- int saved_errno = errno;
+- if (!(result == resultbuf || result == NULL))
+- free (result);
+- if (buf_malloced != NULL)
+- free (buf_malloced);
+- CLEANUP ();
+- errno = saved_errno;
+- return NULL;
+- }
+- if (converted != result + length)
+- {
+- ENSURE_ALLOCATION (xsum (length, converted_len));
+- DCHAR_CPY (result + length, converted, converted_len);
+- free (converted);
+- }
+- length += converted_len;
+- }
+-# endif
+-
+- if (has_width && width > characters
+- && (dp->flags & FLAG_LEFT))
+- {
+- size_t n = width - characters;
+- ENSURE_ALLOCATION (xsum (length, n));
+- DCHAR_SET (result + length, ' ', n);
+- length += n;
+- }
+- }
+- break;
+-
+- default:
+- abort ();
+- }
+- }
+-#endif
+-#if (NEED_PRINTF_DIRECTIVE_A || NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_DOUBLE) && !defined IN_LIBINTL
+- else if ((dp->conversion == 'a' || dp->conversion == 'A')
+-# if !(NEED_PRINTF_DIRECTIVE_A || (NEED_PRINTF_LONG_DOUBLE && NEED_PRINTF_DOUBLE))
+- && (0
+-# if NEED_PRINTF_DOUBLE
+- || a.arg[dp->arg_index].type == TYPE_DOUBLE
+-# endif
+-# if NEED_PRINTF_LONG_DOUBLE
+- || a.arg[dp->arg_index].type == TYPE_LONGDOUBLE
+-# endif
+- )
+-# endif
+- )
+- {
+- arg_type type = a.arg[dp->arg_index].type;
+- int flags = dp->flags;
+- int has_width;
+- size_t width;
+- int has_precision;
+- size_t precision;
+- size_t tmp_length;
+- DCHAR_T tmpbuf[700];
+- DCHAR_T *tmp;
+- DCHAR_T *pad_ptr;
+- DCHAR_T *p;
+-
+- has_width = 0;
+- width = 0;
+- if (dp->width_start != dp->width_end)
+- {
+- if (dp->width_arg_index != ARG_NONE)
+- {
+- int arg;
+-
+- if (!(a.arg[dp->width_arg_index].type == TYPE_INT))
+- abort ();
+- arg = a.arg[dp->width_arg_index].a.a_int;
+- if (arg < 0)
+- {
+- /* "A negative field width is taken as a '-' flag
+- followed by a positive field width." */
+- flags |= FLAG_LEFT;
+- width = (unsigned int) (-arg);
+- }
+- else
+- width = arg;
+- }
+- else
+- {
+- const FCHAR_T *digitp = dp->width_start;
+-
+- do
+- width = xsum (xtimes (width, 10), *digitp++ - '0');
+- while (digitp != dp->width_end);
+- }
+- has_width = 1;
+- }
+-
+- has_precision = 0;
+- precision = 0;
+- if (dp->precision_start != dp->precision_end)
+- {
+- if (dp->precision_arg_index != ARG_NONE)
+- {
+- int arg;
+-
+- if (!(a.arg[dp->precision_arg_index].type == TYPE_INT))
+- abort ();
+- arg = a.arg[dp->precision_arg_index].a.a_int;
+- /* "A negative precision is taken as if the precision
+- were omitted." */
+- if (arg >= 0)
+- {
+- precision = arg;
+- has_precision = 1;
+- }
+- }
+- else
+- {
+- const FCHAR_T *digitp = dp->precision_start + 1;
+-
+- precision = 0;
+- while (digitp != dp->precision_end)
+- precision = xsum (xtimes (precision, 10), *digitp++ - '0');
+- has_precision = 1;
+- }
+- }
+-
+- /* Allocate a temporary buffer of sufficient size. */
+- if (type == TYPE_LONGDOUBLE)
+- tmp_length =
+- (unsigned int) ((LDBL_DIG + 1)
+- * 0.831 /* decimal -> hexadecimal */
+- )
+- + 1; /* turn floor into ceil */
+- else
+- tmp_length =
+- (unsigned int) ((DBL_DIG + 1)
+- * 0.831 /* decimal -> hexadecimal */
+- )
+- + 1; /* turn floor into ceil */
+- if (tmp_length < precision)
+- tmp_length = precision;
+- /* Account for sign, decimal point etc. */
+- tmp_length = xsum (tmp_length, 12);
+-
+- if (tmp_length < width)
+- tmp_length = width;
+-
+- tmp_length = xsum (tmp_length, 1); /* account for trailing NUL */
+-
+- if (tmp_length <= sizeof (tmpbuf) / sizeof (DCHAR_T))
+- tmp = tmpbuf;
+- else
+- {
+- size_t tmp_memsize = xtimes (tmp_length, sizeof (DCHAR_T));
+-
+- if (size_overflow_p (tmp_memsize))
+- /* Overflow, would lead to out of memory. */
+- goto out_of_memory;
+- tmp = (DCHAR_T *) malloc (tmp_memsize);
+- if (tmp == NULL)
+- /* Out of memory. */
+- goto out_of_memory;
+- }
+-
+- pad_ptr = NULL;
+- p = tmp;
+- if (type == TYPE_LONGDOUBLE)
+- {
+-# if NEED_PRINTF_DIRECTIVE_A || NEED_PRINTF_LONG_DOUBLE
+- long double arg = a.arg[dp->arg_index].a.a_longdouble;
+-
+- if (isnanl (arg))
+- {
+- if (dp->conversion == 'A')
+- {
+- *p++ = 'N'; *p++ = 'A'; *p++ = 'N';
+- }
+- else
+- {
+- *p++ = 'n'; *p++ = 'a'; *p++ = 'n';
+- }
+- }
+- else
+- {
+- int sign = 0;
+- DECL_LONG_DOUBLE_ROUNDING
+-
+- BEGIN_LONG_DOUBLE_ROUNDING ();
+-
+- if (signbit (arg)) /* arg < 0.0L or negative zero */
+- {
+- sign = -1;
+- arg = -arg;
+- }
+-
+- if (sign < 0)
+- *p++ = '-';
+- else if (flags & FLAG_SHOWSIGN)
+- *p++ = '+';
+- else if (flags & FLAG_SPACE)
+- *p++ = ' ';
+-
+- if (arg > 0.0L && arg + arg == arg)
+- {
+- if (dp->conversion == 'A')
+- {
+- *p++ = 'I'; *p++ = 'N'; *p++ = 'F';
+- }
+- else
+- {
+- *p++ = 'i'; *p++ = 'n'; *p++ = 'f';
+- }
+- }
+- else
+- {
+- int exponent;
+- long double mantissa;
+-
+- if (arg > 0.0L)
+- mantissa = printf_frexpl (arg, &exponent);
+- else
+- {
+- exponent = 0;
+- mantissa = 0.0L;
+- }
+-
+- if (has_precision
+- && precision < (unsigned int) ((LDBL_DIG + 1) * 0.831) + 1)
+- {
+- /* Round the mantissa. */
+- long double tail = mantissa;
+- size_t q;
+-
+- for (q = precision; ; q--)
+- {
+- int digit = (int) tail;
+- tail -= digit;
+- if (q == 0)
+- {
+- if (digit & 1 ? tail >= 0.5L : tail > 0.5L)
+- tail = 1 - tail;
+- else
+- tail = - tail;
+- break;
+- }
+- tail *= 16.0L;
+- }
+- if (tail != 0.0L)
+- for (q = precision; q > 0; q--)
+- tail *= 0.0625L;
+- mantissa += tail;
+- }
+-
+- *p++ = '0';
+- *p++ = dp->conversion - 'A' + 'X';
+- pad_ptr = p;
+- {
+- int digit;
+-
+- digit = (int) mantissa;
+- mantissa -= digit;
+- *p++ = '0' + digit;
+- if ((flags & FLAG_ALT)
+- || mantissa > 0.0L || precision > 0)
+- {
+- *p++ = decimal_point_char ();
+- /* This loop terminates because we assume
+- that FLT_RADIX is a power of 2. */
+- while (mantissa > 0.0L)
+- {
+- mantissa *= 16.0L;
+- digit = (int) mantissa;
+- mantissa -= digit;
+- *p++ = digit
+- + (digit < 10
+- ? '0'
+- : dp->conversion - 10);
+- if (precision > 0)
+- precision--;
+- }
+- while (precision > 0)
+- {
+- *p++ = '0';
+- precision--;
+- }
+- }
+- }
+- *p++ = dp->conversion - 'A' + 'P';
+-# if WIDE_CHAR_VERSION
+- {
+- static const wchar_t decimal_format[] =
+- { '%', '+', 'd', '\0' };
+- SNPRINTF (p, 6 + 1, decimal_format, exponent);
+- }
+- while (*p != '\0')
+- p++;
+-# else
+- if (sizeof (DCHAR_T) == 1)
+- {
+- sprintf ((char *) p, "%+d", exponent);
+- while (*p != '\0')
+- p++;
+- }
+- else
+- {
+- char expbuf[6 + 1];
+- const char *ep;
+- sprintf (expbuf, "%+d", exponent);
+- for (ep = expbuf; (*p = *ep) != '\0'; ep++)
+- p++;
+- }
+-# endif
+- }
+-
+- END_LONG_DOUBLE_ROUNDING ();
+- }
+-# else
+- abort ();
+-# endif
+- }
+- else
+- {
+-# if NEED_PRINTF_DIRECTIVE_A || NEED_PRINTF_DOUBLE
+- double arg = a.arg[dp->arg_index].a.a_double;
+-
+- if (isnan (arg))
+- {
+- if (dp->conversion == 'A')
+- {
+- *p++ = 'N'; *p++ = 'A'; *p++ = 'N';
+- }
+- else
+- {
+- *p++ = 'n'; *p++ = 'a'; *p++ = 'n';
+- }
+- }
+- else
+- {
+- int sign = 0;
+-
+- if (signbit (arg)) /* arg < 0.0 or negative zero */
+- {
+- sign = -1;
+- arg = -arg;
+- }
+-
+- if (sign < 0)
+- *p++ = '-';
+- else if (flags & FLAG_SHOWSIGN)
+- *p++ = '+';
+- else if (flags & FLAG_SPACE)
+- *p++ = ' ';
+-
+- if (arg > 0.0 && arg + arg == arg)
+- {
+- if (dp->conversion == 'A')
+- {
+- *p++ = 'I'; *p++ = 'N'; *p++ = 'F';
+- }
+- else
+- {
+- *p++ = 'i'; *p++ = 'n'; *p++ = 'f';
+- }
+- }
+- else
+- {
+- int exponent;
+- double mantissa;
+-
+- if (arg > 0.0)
+- mantissa = printf_frexp (arg, &exponent);
+- else
+- {
+- exponent = 0;
+- mantissa = 0.0;
+- }
+-
+- if (has_precision
+- && precision < (unsigned int) ((DBL_DIG + 1) * 0.831) + 1)
+- {
+- /* Round the mantissa. */
+- double tail = mantissa;
+- size_t q;
+-
+- for (q = precision; ; q--)
+- {
+- int digit = (int) tail;
+- tail -= digit;
+- if (q == 0)
+- {
+- if (digit & 1 ? tail >= 0.5 : tail > 0.5)
+- tail = 1 - tail;
+- else
+- tail = - tail;
+- break;
+- }
+- tail *= 16.0;
+- }
+- if (tail != 0.0)
+- for (q = precision; q > 0; q--)
+- tail *= 0.0625;
+- mantissa += tail;
+- }
+-
+- *p++ = '0';
+- *p++ = dp->conversion - 'A' + 'X';
+- pad_ptr = p;
+- {
+- int digit;
+-
+- digit = (int) mantissa;
+- mantissa -= digit;
+- *p++ = '0' + digit;
+- if ((flags & FLAG_ALT)
+- || mantissa > 0.0 || precision > 0)
+- {
+- *p++ = decimal_point_char ();
+- /* This loop terminates because we assume
+- that FLT_RADIX is a power of 2. */
+- while (mantissa > 0.0)
+- {
+- mantissa *= 16.0;
+- digit = (int) mantissa;
+- mantissa -= digit;
+- *p++ = digit
+- + (digit < 10
+- ? '0'
+- : dp->conversion - 10);
+- if (precision > 0)
+- precision--;
+- }
+- while (precision > 0)
+- {
+- *p++ = '0';
+- precision--;
+- }
+- }
+- }
+- *p++ = dp->conversion - 'A' + 'P';
+-# if WIDE_CHAR_VERSION
+- {
+- static const wchar_t decimal_format[] =
+- { '%', '+', 'd', '\0' };
+- SNPRINTF (p, 6 + 1, decimal_format, exponent);
+- }
+- while (*p != '\0')
+- p++;
+-# else
+- if (sizeof (DCHAR_T) == 1)
+- {
+- sprintf ((char *) p, "%+d", exponent);
+- while (*p != '\0')
+- p++;
+- }
+- else
+- {
+- char expbuf[6 + 1];
+- const char *ep;
+- sprintf (expbuf, "%+d", exponent);
+- for (ep = expbuf; (*p = *ep) != '\0'; ep++)
+- p++;
+- }
+-# endif
+- }
+- }
+-# else
+- abort ();
+-# endif
+- }
+- /* The generated string now extends from tmp to p, with the
+- zero padding insertion point being at pad_ptr. */
+- if (has_width && p - tmp < width)
+- {
+- size_t pad = width - (p - tmp);
+- DCHAR_T *end = p + pad;
+-
+- if (flags & FLAG_LEFT)
+- {
+- /* Pad with spaces on the right. */
+- for (; pad > 0; pad--)
+- *p++ = ' ';
+- }
+- else if ((flags & FLAG_ZERO) && pad_ptr != NULL)
+- {
+- /* Pad with zeroes. */
+- DCHAR_T *q = end;
+-
+- while (p > pad_ptr)
+- *--q = *--p;
+- for (; pad > 0; pad--)
+- *p++ = '0';
+- }
+- else
+- {
+- /* Pad with spaces on the left. */
+- DCHAR_T *q = end;
+-
+- while (p > tmp)
+- *--q = *--p;
+- for (; pad > 0; pad--)
+- *p++ = ' ';
+- }
+-
+- p = end;
+- }
+-
+- {
+- size_t count = p - tmp;
+-
+- if (count >= tmp_length)
+- /* tmp_length was incorrectly calculated - fix the
+- code above! */
+- abort ();
+-
+- /* Make room for the result. */
+- if (count >= allocated - length)
+- {
+- size_t n = xsum (length, count);
+-
+- ENSURE_ALLOCATION (n);
+- }
+-
+- /* Append the result. */
+- memcpy (result + length, tmp, count * sizeof (DCHAR_T));
+- if (tmp != tmpbuf)
+- free (tmp);
+- length += count;
+- }
+- }
+-#endif
+-#if (NEED_PRINTF_INFINITE_DOUBLE || NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_LONG_DOUBLE || NEED_PRINTF_LONG_DOUBLE) && !defined IN_LIBINTL
+- else if ((dp->conversion == 'f' || dp->conversion == 'F'
+- || dp->conversion == 'e' || dp->conversion == 'E'
+- || dp->conversion == 'g' || dp->conversion == 'G'
+- || dp->conversion == 'a' || dp->conversion == 'A')
+- && (0
+-# if NEED_PRINTF_DOUBLE
+- || a.arg[dp->arg_index].type == TYPE_DOUBLE
+-# elif NEED_PRINTF_INFINITE_DOUBLE
+- || (a.arg[dp->arg_index].type == TYPE_DOUBLE
+- /* The systems (mingw) which produce wrong output
+- for Inf, -Inf, and NaN also do so for -0.0.
+- Therefore we treat this case here as well. */
+- && is_infinite_or_zero (a.arg[dp->arg_index].a.a_double))
+-# endif
+-# if NEED_PRINTF_LONG_DOUBLE
+- || a.arg[dp->arg_index].type == TYPE_LONGDOUBLE
+-# elif NEED_PRINTF_INFINITE_LONG_DOUBLE
+- || (a.arg[dp->arg_index].type == TYPE_LONGDOUBLE
+- /* Some systems produce wrong output for Inf,
+- -Inf, and NaN. */
+- && is_infinitel (a.arg[dp->arg_index].a.a_longdouble))
+-# endif
+- ))
+- {
+-# if (NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE) && (NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_INFINITE_LONG_DOUBLE)
+- arg_type type = a.arg[dp->arg_index].type;
+-# endif
+- int flags = dp->flags;
+- int has_width;
+- size_t width;
+- int has_precision;
+- size_t precision;
+- size_t tmp_length;
+- DCHAR_T tmpbuf[700];
+- DCHAR_T *tmp;
+- DCHAR_T *pad_ptr;
+- DCHAR_T *p;
+-
+- has_width = 0;
+- width = 0;
+- if (dp->width_start != dp->width_end)
+- {
+- if (dp->width_arg_index != ARG_NONE)
+- {
+- int arg;
+-
+- if (!(a.arg[dp->width_arg_index].type == TYPE_INT))
+- abort ();
+- arg = a.arg[dp->width_arg_index].a.a_int;
+- if (arg < 0)
+- {
+- /* "A negative field width is taken as a '-' flag
+- followed by a positive field width." */
+- flags |= FLAG_LEFT;
+- width = (unsigned int) (-arg);
+- }
+- else
+- width = arg;
+- }
+- else
+- {
+- const FCHAR_T *digitp = dp->width_start;
+-
+- do
+- width = xsum (xtimes (width, 10), *digitp++ - '0');
+- while (digitp != dp->width_end);
+- }
+- has_width = 1;
+- }
+-
+- has_precision = 0;
+- precision = 0;
+- if (dp->precision_start != dp->precision_end)
+- {
+- if (dp->precision_arg_index != ARG_NONE)
+- {
+- int arg;
+-
+- if (!(a.arg[dp->precision_arg_index].type == TYPE_INT))
+- abort ();
+- arg = a.arg[dp->precision_arg_index].a.a_int;
+- /* "A negative precision is taken as if the precision
+- were omitted." */
+- if (arg >= 0)
+- {
+- precision = arg;
+- has_precision = 1;
+- }
+- }
+- else
+- {
+- const FCHAR_T *digitp = dp->precision_start + 1;
+-
+- precision = 0;
+- while (digitp != dp->precision_end)
+- precision = xsum (xtimes (precision, 10), *digitp++ - '0');
+- has_precision = 1;
+- }
+- }
+-
+- /* POSIX specifies the default precision to be 6 for %f, %F,
+- %e, %E, but not for %g, %G. Implementations appear to use
+- the same default precision also for %g, %G. */
+- if (!has_precision)
+- precision = 6;
+-
+- /* Allocate a temporary buffer of sufficient size. */
+-# if NEED_PRINTF_DOUBLE && NEED_PRINTF_LONG_DOUBLE
+- tmp_length = (type == TYPE_LONGDOUBLE ? LDBL_DIG + 1 : DBL_DIG + 1);
+-# elif NEED_PRINTF_INFINITE_DOUBLE && NEED_PRINTF_LONG_DOUBLE
+- tmp_length = (type == TYPE_LONGDOUBLE ? LDBL_DIG + 1 : 0);
+-# elif NEED_PRINTF_LONG_DOUBLE
+- tmp_length = LDBL_DIG + 1;
+-# elif NEED_PRINTF_DOUBLE
+- tmp_length = DBL_DIG + 1;
+-# else
+- tmp_length = 0;
+-# endif
+- if (tmp_length < precision)
+- tmp_length = precision;
+-# if NEED_PRINTF_LONG_DOUBLE
+-# if NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE
+- if (type == TYPE_LONGDOUBLE)
+-# endif
+- if (dp->conversion == 'f' || dp->conversion == 'F')
+- {
+- long double arg = a.arg[dp->arg_index].a.a_longdouble;
+- if (!(isnanl (arg) || arg + arg == arg))
+- {
+- /* arg is finite and nonzero. */
+- int exponent = floorlog10l (arg < 0 ? -arg : arg);
+- if (exponent >= 0 && tmp_length < exponent + precision)
+- tmp_length = exponent + precision;
+- }
+- }
+-# endif
+-# if NEED_PRINTF_DOUBLE
+-# if NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_INFINITE_LONG_DOUBLE
+- if (type == TYPE_DOUBLE)
+-# endif
+- if (dp->conversion == 'f' || dp->conversion == 'F')
+- {
+- double arg = a.arg[dp->arg_index].a.a_double;
+- if (!(isnan (arg) || arg + arg == arg))
+- {
+- /* arg is finite and nonzero. */
+- int exponent = floorlog10 (arg < 0 ? -arg : arg);
+- if (exponent >= 0 && tmp_length < exponent + precision)
+- tmp_length = exponent + precision;
+- }
+- }
+-# endif
+- /* Account for sign, decimal point etc. */
+- tmp_length = xsum (tmp_length, 12);
+-
+- if (tmp_length < width)
+- tmp_length = width;
+-
+- tmp_length = xsum (tmp_length, 1); /* account for trailing NUL */
+-
+- if (tmp_length <= sizeof (tmpbuf) / sizeof (DCHAR_T))
+- tmp = tmpbuf;
+- else
+- {
+- size_t tmp_memsize = xtimes (tmp_length, sizeof (DCHAR_T));
+-
+- if (size_overflow_p (tmp_memsize))
+- /* Overflow, would lead to out of memory. */
+- goto out_of_memory;
+- tmp = (DCHAR_T *) malloc (tmp_memsize);
+- if (tmp == NULL)
+- /* Out of memory. */
+- goto out_of_memory;
+- }
+-
+- pad_ptr = NULL;
+- p = tmp;
+-
+-# if NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_INFINITE_LONG_DOUBLE
+-# if NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE
+- if (type == TYPE_LONGDOUBLE)
+-# endif
+- {
+- long double arg = a.arg[dp->arg_index].a.a_longdouble;
+-
+- if (isnanl (arg))
+- {
+- if (dp->conversion >= 'A' && dp->conversion <= 'Z')
+- {
+- *p++ = 'N'; *p++ = 'A'; *p++ = 'N';
+- }
+- else
+- {
+- *p++ = 'n'; *p++ = 'a'; *p++ = 'n';
+- }
+- }
+- else
+- {
+- int sign = 0;
+- DECL_LONG_DOUBLE_ROUNDING
+-
+- BEGIN_LONG_DOUBLE_ROUNDING ();
+-
+- if (signbit (arg)) /* arg < 0.0L or negative zero */
+- {
+- sign = -1;
+- arg = -arg;
+- }
+-
+- if (sign < 0)
+- *p++ = '-';
+- else if (flags & FLAG_SHOWSIGN)
+- *p++ = '+';
+- else if (flags & FLAG_SPACE)
+- *p++ = ' ';
+-
+- if (arg > 0.0L && arg + arg == arg)
+- {
+- if (dp->conversion >= 'A' && dp->conversion <= 'Z')
+- {
+- *p++ = 'I'; *p++ = 'N'; *p++ = 'F';
+- }
+- else
+- {
+- *p++ = 'i'; *p++ = 'n'; *p++ = 'f';
+- }
+- }
+- else
+- {
+-# if NEED_PRINTF_LONG_DOUBLE
+- pad_ptr = p;
+-
+- if (dp->conversion == 'f' || dp->conversion == 'F')
+- {
+- char *digits;
+- size_t ndigits;
+-
+- digits =
+- scale10_round_decimal_long_double (arg, precision);
+- if (digits == NULL)
+- {
+- END_LONG_DOUBLE_ROUNDING ();
+- goto out_of_memory;
+- }
+- ndigits = strlen (digits);
+-
+- if (ndigits > precision)
+- do
+- {
+- --ndigits;
+- *p++ = digits[ndigits];
+- }
+- while (ndigits > precision);
+- else
+- *p++ = '0';
+- /* Here ndigits <= precision. */
+- if ((flags & FLAG_ALT) || precision > 0)
+- {
+- *p++ = decimal_point_char ();
+- for (; precision > ndigits; precision--)
+- *p++ = '0';
+- while (ndigits > 0)
+- {
+- --ndigits;
+- *p++ = digits[ndigits];
+- }
+- }
+-
+- free (digits);
+- }
+- else if (dp->conversion == 'e' || dp->conversion == 'E')
+- {
+- int exponent;
+-
+- if (arg == 0.0L)
+- {
+- exponent = 0;
+- *p++ = '0';
+- if ((flags & FLAG_ALT) || precision > 0)
+- {
+- *p++ = decimal_point_char ();
+- for (; precision > 0; precision--)
+- *p++ = '0';
+- }
+- }
+- else
+- {
+- /* arg > 0.0L. */
+- int adjusted;
+- char *digits;
+- size_t ndigits;
+-
+- exponent = floorlog10l (arg);
+- adjusted = 0;
+- for (;;)
+- {
+- digits =
+- scale10_round_decimal_long_double (arg,
+- (int)precision - exponent);
+- if (digits == NULL)
+- {
+- END_LONG_DOUBLE_ROUNDING ();
+- goto out_of_memory;
+- }
+- ndigits = strlen (digits);
+-
+- if (ndigits == precision + 1)
+- break;
+- if (ndigits < precision
+- || ndigits > precision + 2)
+- /* The exponent was not guessed
+- precisely enough. */
+- abort ();
+- if (adjusted)
+- /* None of two values of exponent is
+- the right one. Prevent an endless
+- loop. */
+- abort ();
+- free (digits);
+- if (ndigits == precision)
+- exponent -= 1;
+- else
+- exponent += 1;
+- adjusted = 1;
+- }
+-
+- /* Here ndigits = precision+1. */
+- *p++ = digits[--ndigits];
+- if ((flags & FLAG_ALT) || precision > 0)
+- {
+- *p++ = decimal_point_char ();
+- while (ndigits > 0)
+- {
+- --ndigits;
+- *p++ = digits[ndigits];
+- }
+- }
+-
+- free (digits);
+- }
+-
+- *p++ = dp->conversion; /* 'e' or 'E' */
+-# if WIDE_CHAR_VERSION
+- {
+- static const wchar_t decimal_format[] =
+- { '%', '+', '.', '2', 'd', '\0' };
+- SNPRINTF (p, 6 + 1, decimal_format, exponent);
+- }
+- while (*p != '\0')
+- p++;
+-# else
+- if (sizeof (DCHAR_T) == 1)
+- {
+- sprintf ((char *) p, "%+.2d", exponent);
+- while (*p != '\0')
+- p++;
+- }
+- else
+- {
+- char expbuf[6 + 1];
+- const char *ep;
+- sprintf (expbuf, "%+.2d", exponent);
+- for (ep = expbuf; (*p = *ep) != '\0'; ep++)
+- p++;
+- }
+-# endif
+- }
+- else if (dp->conversion == 'g' || dp->conversion == 'G')
+- {
+- if (precision == 0)
+- precision = 1;
+- /* precision >= 1. */
+-
+- if (arg == 0.0L)
+- /* The exponent is 0, >= -4, < precision.
+- Use fixed-point notation. */
+- {
+- size_t ndigits = precision;
+- /* Number of trailing zeroes that have to be
+- dropped. */
+- size_t nzeroes =
+- (flags & FLAG_ALT ? 0 : precision - 1);
+-
+- --ndigits;
+- *p++ = '0';
+- if ((flags & FLAG_ALT) || ndigits > nzeroes)
+- {
+- *p++ = decimal_point_char ();
+- while (ndigits > nzeroes)
+- {
+- --ndigits;
+- *p++ = '0';
+- }
+- }
+- }
+- else
+- {
+- /* arg > 0.0L. */
+- int exponent;
+- int adjusted;
+- char *digits;
+- size_t ndigits;
+- size_t nzeroes;
+-
+- exponent = floorlog10l (arg);
+- adjusted = 0;
+- for (;;)
+- {
+- digits =
+- scale10_round_decimal_long_double (arg,
+- (int)(precision - 1) - exponent);
+- if (digits == NULL)
+- {
+- END_LONG_DOUBLE_ROUNDING ();
+- goto out_of_memory;
+- }
+- ndigits = strlen (digits);
+-
+- if (ndigits == precision)
+- break;
+- if (ndigits < precision - 1
+- || ndigits > precision + 1)
+- /* The exponent was not guessed
+- precisely enough. */
+- abort ();
+- if (adjusted)
+- /* None of two values of exponent is
+- the right one. Prevent an endless
+- loop. */
+- abort ();
+- free (digits);
+- if (ndigits < precision)
+- exponent -= 1;
+- else
+- exponent += 1;
+- adjusted = 1;
+- }
+- /* Here ndigits = precision. */
+-
+- /* Determine the number of trailing zeroes
+- that have to be dropped. */
+- nzeroes = 0;
+- if ((flags & FLAG_ALT) == 0)
+- while (nzeroes < ndigits
+- && digits[nzeroes] == '0')
+- nzeroes++;
+-
+- /* The exponent is now determined. */
+- if (exponent >= -4
+- && exponent < (long)precision)
+- {
+- /* Fixed-point notation:
+- max(exponent,0)+1 digits, then the
+- decimal point, then the remaining
+- digits without trailing zeroes. */
+- if (exponent >= 0)
+- {
+- size_t count = exponent + 1;
+- /* Note: count <= precision = ndigits. */
+- for (; count > 0; count--)
+- *p++ = digits[--ndigits];
+- if ((flags & FLAG_ALT) || ndigits > nzeroes)
+- {
+- *p++ = decimal_point_char ();
+- while (ndigits > nzeroes)
+- {
+- --ndigits;
+- *p++ = digits[ndigits];
+- }
+- }
+- }
+- else
+- {
+- size_t count = -exponent - 1;
+- *p++ = '0';
+- *p++ = decimal_point_char ();
+- for (; count > 0; count--)
+- *p++ = '0';
+- while (ndigits > nzeroes)
+- {
+- --ndigits;
+- *p++ = digits[ndigits];
+- }
+- }
+- }
+- else
+- {
+- /* Exponential notation. */
+- *p++ = digits[--ndigits];
+- if ((flags & FLAG_ALT) || ndigits > nzeroes)
+- {
+- *p++ = decimal_point_char ();
+- while (ndigits > nzeroes)
+- {
+- --ndigits;
+- *p++ = digits[ndigits];
+- }
+- }
+- *p++ = dp->conversion - 'G' + 'E'; /* 'e' or 'E' */
+-# if WIDE_CHAR_VERSION
+- {
+- static const wchar_t decimal_format[] =
+- { '%', '+', '.', '2', 'd', '\0' };
+- SNPRINTF (p, 6 + 1, decimal_format, exponent);
+- }
+- while (*p != '\0')
+- p++;
+-# else
+- if (sizeof (DCHAR_T) == 1)
+- {
+- sprintf ((char *) p, "%+.2d", exponent);
+- while (*p != '\0')
+- p++;
+- }
+- else
+- {
+- char expbuf[6 + 1];
+- const char *ep;
+- sprintf (expbuf, "%+.2d", exponent);
+- for (ep = expbuf; (*p = *ep) != '\0'; ep++)
+- p++;
+- }
+-# endif
+- }
+-
+- free (digits);
+- }
+- }
+- else
+- abort ();
+-# else
+- /* arg is finite. */
+- abort ();
+-# endif
+- }
+-
+- END_LONG_DOUBLE_ROUNDING ();
+- }
+- }
+-# if NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE
+- else
+-# endif
+-# endif
+-# if NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE
+- {
+- double arg = a.arg[dp->arg_index].a.a_double;
+-
+- if (isnan (arg))
+- {
+- if (dp->conversion >= 'A' && dp->conversion <= 'Z')
+- {
+- *p++ = 'N'; *p++ = 'A'; *p++ = 'N';
+- }
+- else
+- {
+- *p++ = 'n'; *p++ = 'a'; *p++ = 'n';
+- }
+- }
+- else
+- {
+- int sign = 0;
+-
+- if (signbit (arg)) /* arg < 0.0 or negative zero */
+- {
+- sign = -1;
+- arg = -arg;
+- }
+-
+- if (sign < 0)
+- *p++ = '-';
+- else if (flags & FLAG_SHOWSIGN)
+- *p++ = '+';
+- else if (flags & FLAG_SPACE)
+- *p++ = ' ';
+-
+- if (arg > 0.0 && arg + arg == arg)
+- {
+- if (dp->conversion >= 'A' && dp->conversion <= 'Z')
+- {
+- *p++ = 'I'; *p++ = 'N'; *p++ = 'F';
+- }
+- else
+- {
+- *p++ = 'i'; *p++ = 'n'; *p++ = 'f';
+- }
+- }
+- else
+- {
+-# if NEED_PRINTF_DOUBLE
+- pad_ptr = p;
+-
+- if (dp->conversion == 'f' || dp->conversion == 'F')
+- {
+- char *digits;
+- size_t ndigits;
+-
+- digits =
+- scale10_round_decimal_double (arg, precision);
+- if (digits == NULL)
+- goto out_of_memory;
+- ndigits = strlen (digits);
+-
+- if (ndigits > precision)
+- do
+- {
+- --ndigits;
+- *p++ = digits[ndigits];
+- }
+- while (ndigits > precision);
+- else
+- *p++ = '0';
+- /* Here ndigits <= precision. */
+- if ((flags & FLAG_ALT) || precision > 0)
+- {
+- *p++ = decimal_point_char ();
+- for (; precision > ndigits; precision--)
+- *p++ = '0';
+- while (ndigits > 0)
+- {
+- --ndigits;
+- *p++ = digits[ndigits];
+- }
+- }
+-
+- free (digits);
+- }
+- else if (dp->conversion == 'e' || dp->conversion == 'E')
+- {
+- int exponent;
+-
+- if (arg == 0.0)
+- {
+- exponent = 0;
+- *p++ = '0';
+- if ((flags & FLAG_ALT) || precision > 0)
+- {
+- *p++ = decimal_point_char ();
+- for (; precision > 0; precision--)
+- *p++ = '0';
+- }
+- }
+- else
+- {
+- /* arg > 0.0. */
+- int adjusted;
+- char *digits;
+- size_t ndigits;
+-
+- exponent = floorlog10 (arg);
+- adjusted = 0;
+- for (;;)
+- {
+- digits =
+- scale10_round_decimal_double (arg,
+- (int)precision - exponent);
+- if (digits == NULL)
+- goto out_of_memory;
+- ndigits = strlen (digits);
+-
+- if (ndigits == precision + 1)
+- break;
+- if (ndigits < precision
+- || ndigits > precision + 2)
+- /* The exponent was not guessed
+- precisely enough. */
+- abort ();
+- if (adjusted)
+- /* None of two values of exponent is
+- the right one. Prevent an endless
+- loop. */
+- abort ();
+- free (digits);
+- if (ndigits == precision)
+- exponent -= 1;
+- else
+- exponent += 1;
+- adjusted = 1;
+- }
+-
+- /* Here ndigits = precision+1. */
+- *p++ = digits[--ndigits];
+- if ((flags & FLAG_ALT) || precision > 0)
+- {
+- *p++ = decimal_point_char ();
+- while (ndigits > 0)
+- {
+- --ndigits;
+- *p++ = digits[ndigits];
+- }
+- }
+-
+- free (digits);
+- }
+-
+- *p++ = dp->conversion; /* 'e' or 'E' */
+-# if WIDE_CHAR_VERSION
+- {
+- static const wchar_t decimal_format[] =
+- /* Produce the same number of exponent digits
+- as the native printf implementation. */
+-# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+- { '%', '+', '.', '3', 'd', '\0' };
+-# else
+- { '%', '+', '.', '2', 'd', '\0' };
+-# endif
+- SNPRINTF (p, 6 + 1, decimal_format, exponent);
+- }
+- while (*p != '\0')
+- p++;
+-# else
+- {
+- static const char decimal_format[] =
+- /* Produce the same number of exponent digits
+- as the native printf implementation. */
+-# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+- "%+.3d";
+-# else
+- "%+.2d";
+-# endif
+- if (sizeof (DCHAR_T) == 1)
+- {
+- sprintf ((char *) p, decimal_format, exponent);
+- while (*p != '\0')
+- p++;
+- }
+- else
+- {
+- char expbuf[6 + 1];
+- const char *ep;
+- sprintf (expbuf, decimal_format, exponent);
+- for (ep = expbuf; (*p = *ep) != '\0'; ep++)
+- p++;
+- }
+- }
+-# endif
+- }
+- else if (dp->conversion == 'g' || dp->conversion == 'G')
+- {
+- if (precision == 0)
+- precision = 1;
+- /* precision >= 1. */
+-
+- if (arg == 0.0)
+- /* The exponent is 0, >= -4, < precision.
+- Use fixed-point notation. */
+- {
+- size_t ndigits = precision;
+- /* Number of trailing zeroes that have to be
+- dropped. */
+- size_t nzeroes =
+- (flags & FLAG_ALT ? 0 : precision - 1);
+-
+- --ndigits;
+- *p++ = '0';
+- if ((flags & FLAG_ALT) || ndigits > nzeroes)
+- {
+- *p++ = decimal_point_char ();
+- while (ndigits > nzeroes)
+- {
+- --ndigits;
+- *p++ = '0';
+- }
+- }
+- }
+- else
+- {
+- /* arg > 0.0. */
+- int exponent;
+- int adjusted;
+- char *digits;
+- size_t ndigits;
+- size_t nzeroes;
+-
+- exponent = floorlog10 (arg);
+- adjusted = 0;
+- for (;;)
+- {
+- digits =
+- scale10_round_decimal_double (arg,
+- (int)(precision - 1) - exponent);
+- if (digits == NULL)
+- goto out_of_memory;
+- ndigits = strlen (digits);
+-
+- if (ndigits == precision)
+- break;
+- if (ndigits < precision - 1
+- || ndigits > precision + 1)
+- /* The exponent was not guessed
+- precisely enough. */
+- abort ();
+- if (adjusted)
+- /* None of two values of exponent is
+- the right one. Prevent an endless
+- loop. */
+- abort ();
+- free (digits);
+- if (ndigits < precision)
+- exponent -= 1;
+- else
+- exponent += 1;
+- adjusted = 1;
+- }
+- /* Here ndigits = precision. */
+-
+- /* Determine the number of trailing zeroes
+- that have to be dropped. */
+- nzeroes = 0;
+- if ((flags & FLAG_ALT) == 0)
+- while (nzeroes < ndigits
+- && digits[nzeroes] == '0')
+- nzeroes++;
+-
+- /* The exponent is now determined. */
+- if (exponent >= -4
+- && exponent < (long)precision)
+- {
+- /* Fixed-point notation:
+- max(exponent,0)+1 digits, then the
+- decimal point, then the remaining
+- digits without trailing zeroes. */
+- if (exponent >= 0)
+- {
+- size_t count = exponent + 1;
+- /* Note: count <= precision = ndigits. */
+- for (; count > 0; count--)
+- *p++ = digits[--ndigits];
+- if ((flags & FLAG_ALT) || ndigits > nzeroes)
+- {
+- *p++ = decimal_point_char ();
+- while (ndigits > nzeroes)
+- {
+- --ndigits;
+- *p++ = digits[ndigits];
+- }
+- }
+- }
+- else
+- {
+- size_t count = -exponent - 1;
+- *p++ = '0';
+- *p++ = decimal_point_char ();
+- for (; count > 0; count--)
+- *p++ = '0';
+- while (ndigits > nzeroes)
+- {
+- --ndigits;
+- *p++ = digits[ndigits];
+- }
+- }
+- }
+- else
+- {
+- /* Exponential notation. */
+- *p++ = digits[--ndigits];
+- if ((flags & FLAG_ALT) || ndigits > nzeroes)
+- {
+- *p++ = decimal_point_char ();
+- while (ndigits > nzeroes)
+- {
+- --ndigits;
+- *p++ = digits[ndigits];
+- }
+- }
+- *p++ = dp->conversion - 'G' + 'E'; /* 'e' or 'E' */
+-# if WIDE_CHAR_VERSION
+- {
+- static const wchar_t decimal_format[] =
+- /* Produce the same number of exponent digits
+- as the native printf implementation. */
+-# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+- { '%', '+', '.', '3', 'd', '\0' };
+-# else
+- { '%', '+', '.', '2', 'd', '\0' };
+-# endif
+- SNPRINTF (p, 6 + 1, decimal_format, exponent);
+- }
+- while (*p != '\0')
+- p++;
+-# else
+- {
+- static const char decimal_format[] =
+- /* Produce the same number of exponent digits
+- as the native printf implementation. */
+-# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+- "%+.3d";
+-# else
+- "%+.2d";
+-# endif
+- if (sizeof (DCHAR_T) == 1)
+- {
+- sprintf ((char *) p, decimal_format, exponent);
+- while (*p != '\0')
+- p++;
+- }
+- else
+- {
+- char expbuf[6 + 1];
+- const char *ep;
+- sprintf (expbuf, decimal_format, exponent);
+- for (ep = expbuf; (*p = *ep) != '\0'; ep++)
+- p++;
+- }
+- }
+-# endif
+- }
+-
+- free (digits);
+- }
+- }
+- else
+- abort ();
+-# else
+- /* arg is finite. */
+- if (!(arg == 0.0))
+- abort ();
+-
+- pad_ptr = p;
+-
+- if (dp->conversion == 'f' || dp->conversion == 'F')
+- {
+- *p++ = '0';
+- if ((flags & FLAG_ALT) || precision > 0)
+- {
+- *p++ = decimal_point_char ();
+- for (; precision > 0; precision--)
+- *p++ = '0';
+- }
+- }
+- else if (dp->conversion == 'e' || dp->conversion == 'E')
+- {
+- *p++ = '0';
+- if ((flags & FLAG_ALT) || precision > 0)
+- {
+- *p++ = decimal_point_char ();
+- for (; precision > 0; precision--)
+- *p++ = '0';
+- }
+- *p++ = dp->conversion; /* 'e' or 'E' */
+- *p++ = '+';
+- /* Produce the same number of exponent digits as
+- the native printf implementation. */
+-# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+- *p++ = '0';
+-# endif
+- *p++ = '0';
+- *p++ = '0';
+- }
+- else if (dp->conversion == 'g' || dp->conversion == 'G')
+- {
+- *p++ = '0';
+- if (flags & FLAG_ALT)
+- {
+- size_t ndigits =
+- (precision > 0 ? precision - 1 : 0);
+- *p++ = decimal_point_char ();
+- for (; ndigits > 0; --ndigits)
+- *p++ = '0';
+- }
+- }
+- else
+- abort ();
+-# endif
+- }
+- }
+- }
+-# endif
+-
+- /* The generated string now extends from tmp to p, with the
+- zero padding insertion point being at pad_ptr. */
+- if (has_width && p - tmp < width)
+- {
+- size_t pad = width - (p - tmp);
+- DCHAR_T *end = p + pad;
+-
+- if (flags & FLAG_LEFT)
+- {
+- /* Pad with spaces on the right. */
+- for (; pad > 0; pad--)
+- *p++ = ' ';
+- }
+- else if ((flags & FLAG_ZERO) && pad_ptr != NULL)
+- {
+- /* Pad with zeroes. */
+- DCHAR_T *q = end;
+-
+- while (p > pad_ptr)
+- *--q = *--p;
+- for (; pad > 0; pad--)
+- *p++ = '0';
+- }
+- else
+- {
+- /* Pad with spaces on the left. */
+- DCHAR_T *q = end;
+-
+- while (p > tmp)
+- *--q = *--p;
+- for (; pad > 0; pad--)
+- *p++ = ' ';
+- }
+-
+- p = end;
+- }
+-
+- {
+- size_t count = p - tmp;
+-
+- if (count >= tmp_length)
+- /* tmp_length was incorrectly calculated - fix the
+- code above! */
+- abort ();
+-
+- /* Make room for the result. */
+- if (count >= allocated - length)
+- {
+- size_t n = xsum (length, count);
+-
+- ENSURE_ALLOCATION (n);
+- }
+-
+- /* Append the result. */
+- memcpy (result + length, tmp, count * sizeof (DCHAR_T));
+- if (tmp != tmpbuf)
+- free (tmp);
+- length += count;
+- }
+- }
+-#endif
+- else
+- {
+- arg_type type = a.arg[dp->arg_index].type;
+- int flags = dp->flags;
+-#if !USE_SNPRINTF || !DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION
+- int has_width;
+- size_t width;
+-#endif
+-#if !USE_SNPRINTF || NEED_PRINTF_UNBOUNDED_PRECISION
+- int has_precision;
+- size_t precision;
+-#endif
+-#if NEED_PRINTF_UNBOUNDED_PRECISION
+- int prec_ourselves;
+-#else
+-# define prec_ourselves 0
+-#endif
+-#if !DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION
+- int pad_ourselves;
+-#else
+-# define pad_ourselves 0
+-#endif
+- TCHAR_T *fbp;
+- unsigned int prefix_count;
+- int prefixes[2];
+-#if !USE_SNPRINTF
+- size_t tmp_length;
+- TCHAR_T tmpbuf[700];
+- TCHAR_T *tmp;
+-#endif
+-
+-#if !USE_SNPRINTF || !DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION
+- has_width = 0;
+- width = 0;
+- if (dp->width_start != dp->width_end)
+- {
+- if (dp->width_arg_index != ARG_NONE)
+- {
+- int arg;
+-
+- if (!(a.arg[dp->width_arg_index].type == TYPE_INT))
+- abort ();
+- arg = a.arg[dp->width_arg_index].a.a_int;
+- if (arg < 0)
+- {
+- /* "A negative field width is taken as a '-' flag
+- followed by a positive field width." */
+- flags |= FLAG_LEFT;
+- width = (unsigned int) (-arg);
+- }
+- else
+- width = arg;
+- }
+- else
+- {
+- const FCHAR_T *digitp = dp->width_start;
+-
+- do
+- width = xsum (xtimes (width, 10), *digitp++ - '0');
+- while (digitp != dp->width_end);
+- }
+- has_width = 1;
+- }
+-#endif
+-
+-#if !USE_SNPRINTF || NEED_PRINTF_UNBOUNDED_PRECISION
+- has_precision = 0;
+- precision = 6;
+- if (dp->precision_start != dp->precision_end)
+- {
+- if (dp->precision_arg_index != ARG_NONE)
+- {
+- int arg;
+-
+- if (!(a.arg[dp->precision_arg_index].type == TYPE_INT))
+- abort ();
+- arg = a.arg[dp->precision_arg_index].a.a_int;
+- /* "A negative precision is taken as if the precision
+- were omitted." */
+- if (arg >= 0)
+- {
+- precision = arg;
+- has_precision = 1;
+- }
+- }
+- else
+- {
+- const FCHAR_T *digitp = dp->precision_start + 1;
+-
+- precision = 0;
+- while (digitp != dp->precision_end)
+- precision = xsum (xtimes (precision, 10), *digitp++ - '0');
+- has_precision = 1;
+- }
+- }
+-#endif
+-
+-#if !USE_SNPRINTF
+- /* Allocate a temporary buffer of sufficient size for calling
+- sprintf. */
+- {
+- switch (dp->conversion)
+- {
+-
+- case 'd': case 'i': case 'u':
+-# if HAVE_LONG_LONG_INT
+- if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT)
+- tmp_length =
+- (unsigned int) (sizeof (unsigned long long) * CHAR_BIT
+- * 0.30103 /* binary -> decimal */
+- )
+- + 1; /* turn floor into ceil */
+- else
+-# endif
+- if (type == TYPE_LONGINT || type == TYPE_ULONGINT)
+- tmp_length =
+- (unsigned int) (sizeof (unsigned long) * CHAR_BIT
+- * 0.30103 /* binary -> decimal */
+- )
+- + 1; /* turn floor into ceil */
+- else
+- tmp_length =
+- (unsigned int) (sizeof (unsigned int) * CHAR_BIT
+- * 0.30103 /* binary -> decimal */
+- )
+- + 1; /* turn floor into ceil */
+- if (tmp_length < precision)
+- tmp_length = precision;
+- /* Multiply by 2, as an estimate for FLAG_GROUP. */
+- tmp_length = xsum (tmp_length, tmp_length);
+- /* Add 1, to account for a leading sign. */
+- tmp_length = xsum (tmp_length, 1);
+- break;
+-
+- case 'o':
+-# if HAVE_LONG_LONG_INT
+- 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 */
+- 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 */
+- else
+- tmp_length =
+- (unsigned int) (sizeof (unsigned int) * CHAR_BIT
+- * 0.333334 /* binary -> octal */
+- )
+- + 1; /* turn floor into ceil */
+- if (tmp_length < precision)
+- tmp_length = precision;
+- /* Add 1, to account for a leading sign. */
+- tmp_length = xsum (tmp_length, 1);
+- break;
+-
+- case 'x': case 'X':
+-# if HAVE_LONG_LONG_INT
+- 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 */
+- 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 */
+- else
+- tmp_length =
+- (unsigned int) (sizeof (unsigned int) * CHAR_BIT
+- * 0.25 /* binary -> hexadecimal */
+- )
+- + 1; /* turn floor into ceil */
+- if (tmp_length < precision)
+- tmp_length = precision;
+- /* Add 2, to account for a leading sign or alternate form. */
+- tmp_length = xsum (tmp_length, 2);
+- break;
+-
+- case 'f': case 'F':
+- 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 */
+- + 10; /* sign, decimal point etc. */
+- else
+- tmp_length =
+- (unsigned int) (DBL_MAX_EXP
+- * 0.30103 /* binary -> decimal */
+- * 2 /* estimate for FLAG_GROUP */
+- )
+- + 1 /* turn floor into ceil */
+- + 10; /* sign, decimal point etc. */
+- tmp_length = xsum (tmp_length, precision);
+- break;
+-
+- case 'e': case 'E': case 'g': case 'G':
+- tmp_length =
+- 12; /* sign, decimal point, exponent etc. */
+- tmp_length = xsum (tmp_length, precision);
+- break;
+-
+- case 'a': case 'A':
+- if (type == TYPE_LONGDOUBLE)
+- tmp_length =
+- (unsigned int) (LDBL_DIG
+- * 0.831 /* decimal -> hexadecimal */
+- )
+- + 1; /* turn floor into ceil */
+- else
+- tmp_length =
+- (unsigned int) (DBL_DIG
+- * 0.831 /* decimal -> hexadecimal */
+- )
+- + 1; /* turn floor into ceil */
+- if (tmp_length < precision)
+- tmp_length = precision;
+- /* Account for sign, decimal point etc. */
+- tmp_length = xsum (tmp_length, 12);
+- break;
+-
+- case 'c':
+-# if HAVE_WINT_T && !WIDE_CHAR_VERSION
+- if (type == TYPE_WIDE_CHAR)
+- tmp_length = MB_CUR_MAX;
+- else
+-# endif
+- tmp_length = 1;
+- break;
+-
+- case 's':
+-# if HAVE_WCHAR_T
+- if (type == TYPE_WIDE_STRING)
+- {
+- tmp_length =
+- local_wcslen (a.arg[dp->arg_index].a.a_wide_string);
+-
+-# if !WIDE_CHAR_VERSION
+- tmp_length = xtimes (tmp_length, MB_CUR_MAX);
+-# endif
+- }
+- else
+-# endif
+- tmp_length = strlen (a.arg[dp->arg_index].a.a_string);
+- break;
+-
+- case 'p':
+- tmp_length =
+- (unsigned int) (sizeof (void *) * CHAR_BIT
+- * 0.25 /* binary -> hexadecimal */
+- )
+- + 1 /* turn floor into ceil */
+- + 2; /* account for leading 0x */
+- break;
+-
+- default:
+- abort ();
+- }
+-
+-# if ENABLE_UNISTDIO
+- /* Padding considers the number of characters, therefore the
+- number of elements after padding may be
+- > max (tmp_length, width)
+- but is certainly
+- <= tmp_length + width. */
+- tmp_length = xsum (tmp_length, width);
+-# else
+- /* Padding considers the number of elements, says POSIX. */
+- if (tmp_length < width)
+- tmp_length = width;
+-# endif
+-
+- tmp_length = xsum (tmp_length, 1); /* account for trailing NUL */
+- }
+-
+- if (tmp_length <= sizeof (tmpbuf) / sizeof (TCHAR_T))
+- tmp = tmpbuf;
+- else
+- {
+- size_t tmp_memsize = xtimes (tmp_length, sizeof (TCHAR_T));
+-
+- if (size_overflow_p (tmp_memsize))
+- /* Overflow, would lead to out of memory. */
+- goto out_of_memory;
+- tmp = (TCHAR_T *) malloc (tmp_memsize);
+- if (tmp == NULL)
+- /* Out of memory. */
+- goto out_of_memory;
+- }
+-#endif
+-
+- /* Decide whether to handle the precision ourselves. */
+-#if NEED_PRINTF_UNBOUNDED_PRECISION
+- switch (dp->conversion)
+- {
+- case 'd': case 'i': case 'u':
+- case 'o':
+- case 'x': case 'X': case 'p':
+- prec_ourselves = has_precision && (precision > 0);
+- break;
+- default:
+- prec_ourselves = 0;
+- break;
+- }
+-#endif
+-
+- /* Decide whether to perform the padding ourselves. */
+-#if !DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION
+- switch (dp->conversion)
+- {
+-# if !DCHAR_IS_TCHAR || ENABLE_UNISTDIO
+- /* If we need conversion from TCHAR_T[] to DCHAR_T[], we need
+- to perform the padding after this conversion. Functions
+- with unistdio extensions perform the padding based on
+- character count rather than element count. */
+- case 'c': case 's':
+-# endif
+-# if NEED_PRINTF_FLAG_ZERO
+- case 'f': case 'F': case 'e': case 'E': case 'g': case 'G':
+- case 'a': case 'A':
+-# endif
+- pad_ourselves = 1;
+- break;
+- default:
+- pad_ourselves = prec_ourselves;
+- break;
+- }
+-#endif
+-
+- /* Construct the format string for calling snprintf or
+- sprintf. */
+- fbp = buf;
+- *fbp++ = '%';
+-#if NEED_PRINTF_FLAG_GROUPING
+- /* The underlying implementation doesn't support the ' flag.
+- Produce no grouping characters in this case; this is
+- acceptable because the grouping is locale dependent. */
+-#else
+- if (flags & FLAG_GROUP)
+- *fbp++ = '\'';
+-#endif
+- if (flags & FLAG_LEFT)
+- *fbp++ = '-';
+- if (flags & FLAG_SHOWSIGN)
+- *fbp++ = '+';
+- if (flags & FLAG_SPACE)
+- *fbp++ = ' ';
+- if (flags & FLAG_ALT)
+- *fbp++ = '#';
+- if (!pad_ourselves)
+- {
+- if (flags & FLAG_ZERO)
+- *fbp++ = '0';
+- if (dp->width_start != dp->width_end)
+- {
+- size_t n = dp->width_end - dp->width_start;
+- /* The width specification is known to consist only
+- of standard ASCII characters. */
+- if (sizeof (FCHAR_T) == sizeof (TCHAR_T))
+- {
+- memcpy (fbp, dp->width_start, n * sizeof (TCHAR_T));
+- fbp += n;
+- }
+- else
+- {
+- const FCHAR_T *mp = dp->width_start;
+- do
+- *fbp++ = (unsigned char) *mp++;
+- while (--n > 0);
+- }
+- }
+- }
+- if (!prec_ourselves)
+- {
+- if (dp->precision_start != dp->precision_end)
+- {
+- size_t n = dp->precision_end - dp->precision_start;
+- /* The precision specification is known to consist only
+- of standard ASCII characters. */
+- if (sizeof (FCHAR_T) == sizeof (TCHAR_T))
+- {
+- memcpy (fbp, dp->precision_start, n * sizeof (TCHAR_T));
+- fbp += n;
+- }
+- else
+- {
+- const FCHAR_T *mp = dp->precision_start;
+- do
+- *fbp++ = (unsigned char) *mp++;
+- while (--n > 0);
+- }
+- }
+- }
+-
+- switch (type)
+- {
+-#if HAVE_LONG_LONG_INT
+- case TYPE_LONGLONGINT:
+- case TYPE_ULONGLONGINT:
+-# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+- *fbp++ = 'I';
+- *fbp++ = '6';
+- *fbp++ = '4';
+- break;
+-# else
+- *fbp++ = 'l';
+- /*FALLTHROUGH*/
+-# endif
+-#endif
+- case TYPE_LONGINT:
+- case TYPE_ULONGINT:
+-#if HAVE_WINT_T
+- case TYPE_WIDE_CHAR:
+-#endif
+-#if HAVE_WCHAR_T
+- case TYPE_WIDE_STRING:
+-#endif
+- *fbp++ = 'l';
+- break;
+- case TYPE_LONGDOUBLE:
+- *fbp++ = 'L';
+- break;
+- default:
+- break;
+- }
+-#if NEED_PRINTF_DIRECTIVE_F
+- if (dp->conversion == 'F')
+- *fbp = 'f';
+- else
+-#endif
+- *fbp = dp->conversion;
+-#if USE_SNPRINTF
+-# if !(__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 3))
+- fbp[1] = '%';
+- fbp[2] = 'n';
+- fbp[3] = '\0';
+-# else
+- /* On glibc2 systems from glibc >= 2.3 - probably also older
+- ones - we know that snprintf's returns value conforms to
+- ISO C 99: the gl_SNPRINTF_DIRECTIVE_N test passes.
+- Therefore we can avoid using %n in this situation.
+- On glibc2 systems from 2004-10-18 or newer, the use of %n
+- in format strings in writable memory may crash the program
+- (if compiled with _FORTIFY_SOURCE=2), so we should avoid it
+- in this situation. */
+- fbp[1] = '\0';
+-# endif
+-#else
+- fbp[1] = '\0';
+-#endif
+-
+- /* Construct the arguments for calling snprintf or sprintf. */
+- prefix_count = 0;
+- if (!pad_ourselves && dp->width_arg_index != ARG_NONE)
+- {
+- 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 != ARG_NONE)
+- {
+- if (!(a.arg[dp->precision_arg_index].type == TYPE_INT))
+- abort ();
+- prefixes[prefix_count++] = a.arg[dp->precision_arg_index].a.a_int;
+- }
+-
+-#if USE_SNPRINTF
+- /* The SNPRINTF result is appended after result[0..length].
+- The latter is an array of DCHAR_T; SNPRINTF appends an
+- array of TCHAR_T to it. This is possible because
+- sizeof (TCHAR_T) divides sizeof (DCHAR_T) and
+- alignof (TCHAR_T) <= alignof (DCHAR_T). */
+-# define TCHARS_PER_DCHAR (sizeof (DCHAR_T) / sizeof (TCHAR_T))
+- /* Prepare checking whether snprintf returns the count
+- via %n. */
+- ENSURE_ALLOCATION (xsum (length, 1));
+- *(TCHAR_T *) (result + length) = '\0';
+-#endif
+-
+- for (;;)
+- {
+- int count = -1;
+-
+-#if USE_SNPRINTF
+- int retcount = 0;
+- size_t maxlen = allocated - length;
+- /* SNPRINTF can fail if its second argument is
+- > INT_MAX. */
+- if (maxlen > INT_MAX / TCHARS_PER_DCHAR)
+- maxlen = INT_MAX / TCHARS_PER_DCHAR;
+- maxlen = maxlen * TCHARS_PER_DCHAR;
+-# define SNPRINTF_BUF(arg) \
+- switch (prefix_count) \
+- { \
+- case 0: \
+- retcount = SNPRINTF ((TCHAR_T *) (result + length), \
+- maxlen, buf, \
+- arg, &count); \
+- break; \
+- case 1: \
+- retcount = SNPRINTF ((TCHAR_T *) (result + length), \
+- maxlen, buf, \
+- prefixes[0], arg, &count); \
+- break; \
+- case 2: \
+- retcount = SNPRINTF ((TCHAR_T *) (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;
+-#if HAVE_LONG_LONG_INT
+- 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
+- case TYPE_DOUBLE:
+- {
+- double arg = a.arg[dp->arg_index].a.a_double;
+- SNPRINTF_BUF (arg);
+- }
+- break;
+- case TYPE_LONGDOUBLE:
+- {
+- long double arg = a.arg[dp->arg_index].a.a_longdouble;
+- SNPRINTF_BUF (arg);
+- }
+- break;
+- case TYPE_CHAR:
+- {
+- int arg = a.arg[dp->arg_index].a.a_char;
+- SNPRINTF_BUF (arg);
+- }
+- break;
+-#if HAVE_WINT_T
+- case TYPE_WIDE_CHAR:
+- {
+- wint_t arg = a.arg[dp->arg_index].a.a_wide_char;
+- SNPRINTF_BUF (arg);
+- }
+- break;
+-#endif
+- case TYPE_STRING:
+- {
+- const char *arg = a.arg[dp->arg_index].a.a_string;
+- SNPRINTF_BUF (arg);
+- }
+- break;
+-#if HAVE_WCHAR_T
+- case TYPE_WIDE_STRING:
+- {
+- const wchar_t *arg = a.arg[dp->arg_index].a.a_wide_string;
+- SNPRINTF_BUF (arg);
+- }
+- break;
+-#endif
+- case TYPE_POINTER:
+- {
+- void *arg = a.arg[dp->arg_index].a.a_pointer;
+- SNPRINTF_BUF (arg);
+- }
+- break;
+- default:
+- abort ();
+- }
+-
+-#if USE_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
+- && ((TCHAR_T *) (result + length)) [count] != '\0')
+- abort ();
+- /* Portability hack. */
+- if (retcount > count)
+- count = retcount;
+- }
+- else
+- {
+- /* snprintf() doesn't understand the '%n'
+- directive. */
+- if (fbp[1] != '\0')
+- {
+- /* Don't use the '%n' directive; instead, look
+- at the snprintf() return value. */
+- fbp[1] = '\0';
+- continue;
+- }
+- else
+- {
+- /* Look at the snprintf() return value. */
+- if (retcount < 0)
+- {
+- /* HP-UX 10.20 snprintf() is doubly deficient:
+- It doesn't understand the '%n' directive,
+- *and* it returns -1 (rather than the length
+- that would have been required) when the
+- buffer is too small. */
+- size_t bigger_need =
+- xsum (xtimes (allocated, 2), 12);
+- ENSURE_ALLOCATION (bigger_need);
+- continue;
+- }
+- else
+- count = retcount;
+- }
+- }
+-#endif
+-
+- /* Attempt to handle failure. */
+- if (count < 0)
+- {
+- if (!(result == resultbuf || result == NULL))
+- free (result);
+- if (buf_malloced != NULL)
+- free (buf_malloced);
+- CLEANUP ();
+- errno = EINVAL;
+- return NULL;
+- }
+-
+-#if USE_SNPRINTF
+- /* Handle overflow of the allocated buffer.
+- If such an overflow occurs, a C99 compliant snprintf()
+- returns a count >= maxlen. However, a non-compliant
+- snprintf() function returns only count = maxlen - 1. To
+- cover both cases, test whether count >= maxlen - 1. */
+- if ((unsigned int) count + 1 >= maxlen)
+- {
+- /* If maxlen already has attained its allowed maximum,
+- allocating more memory will not increase maxlen.
+- Instead of looping, bail out. */
+- if (maxlen == INT_MAX / TCHARS_PER_DCHAR)
+- goto overflow;
+- else
+- {
+- /* Need at least count * sizeof (TCHAR_T) bytes.
+- But allocate proportionally, to avoid looping
+- eternally if snprintf() reports a too small
+- count. */
+- size_t n =
+- xmax (xsum (length,
+- (count + TCHARS_PER_DCHAR - 1)
+- / TCHARS_PER_DCHAR),
+- xtimes (allocated, 2));
+-
+- ENSURE_ALLOCATION (n);
+- continue;
+- }
+- }
+-#endif
+-
+-#if NEED_PRINTF_UNBOUNDED_PRECISION
+- if (prec_ourselves)
+- {
+- /* Handle the precision. */
+- TCHAR_T *prec_ptr =
+-# if USE_SNPRINTF
+- (TCHAR_T *) (result + length);
+-# else
+- tmp;
+-# endif
+- size_t prefix_count;
+- size_t move;
+-
+- prefix_count = 0;
+- /* Put the additional zeroes after the sign. */
+- if (count >= 1
+- && (*prec_ptr == '-' || *prec_ptr == '+'
+- || *prec_ptr == ' '))
+- prefix_count = 1;
+- /* Put the additional zeroes after the 0x prefix if
+- (flags & FLAG_ALT) || (dp->conversion == 'p'). */
+- else if (count >= 2
+- && prec_ptr[0] == '0'
+- && (prec_ptr[1] == 'x' || prec_ptr[1] == 'X'))
+- prefix_count = 2;
+-
+- move = count - prefix_count;
+- if (precision > move)
+- {
+- /* Insert zeroes. */
+- size_t insert = precision - move;
+- TCHAR_T *prec_end;
+-
+-# if USE_SNPRINTF
+- size_t n =
+- xsum (length,
+- (count + insert + TCHARS_PER_DCHAR - 1)
+- / TCHARS_PER_DCHAR);
+- length += (count + TCHARS_PER_DCHAR - 1) / TCHARS_PER_DCHAR;
+- ENSURE_ALLOCATION (n);
+- length -= (count + TCHARS_PER_DCHAR - 1) / TCHARS_PER_DCHAR;
+- prec_ptr = (TCHAR_T *) (result + length);
+-# endif
+-
+- prec_end = prec_ptr + count;
+- prec_ptr += prefix_count;
+-
+- while (prec_end > prec_ptr)
+- {
+- prec_end--;
+- prec_end[insert] = prec_end[0];
+- }
+-
+- prec_end += insert;
+- do
+- *--prec_end = '0';
+- while (prec_end > prec_ptr);
+-
+- count += insert;
+- }
+- }
+-#endif
+-
+-#if !DCHAR_IS_TCHAR
+-# if !USE_SNPRINTF
+- if (count >= tmp_length)
+- /* tmp_length was incorrectly calculated - fix the
+- code above! */
+- abort ();
+-# endif
+-
+- /* Convert from TCHAR_T[] to DCHAR_T[]. */
+- if (dp->conversion == 'c' || dp->conversion == 's')
+- {
+- /* type = TYPE_CHAR or TYPE_WIDE_CHAR or TYPE_STRING
+- TYPE_WIDE_STRING.
+- The result string is not certainly ASCII. */
+- const TCHAR_T *tmpsrc;
+- DCHAR_T *tmpdst;
+- size_t tmpdst_len;
+- /* This code assumes that TCHAR_T is 'char'. */
+- typedef int TCHAR_T_verify
+- [2 * (sizeof (TCHAR_T) == 1) - 1];
+-# if USE_SNPRINTF
+- tmpsrc = (TCHAR_T *) (result + length);
+-# else
+- tmpsrc = tmp;
+-# endif
+- tmpdst = NULL;
+- tmpdst_len = 0;
+- if (DCHAR_CONV_FROM_ENCODING (locale_charset (),
+- iconveh_question_mark,
+- tmpsrc, count,
+- NULL,
+- &tmpdst, &tmpdst_len)
+- < 0)
+- {
+- int saved_errno = errno;
+- if (!(result == resultbuf || result == NULL))
+- free (result);
+- if (buf_malloced != NULL)
+- free (buf_malloced);
+- CLEANUP ();
+- errno = saved_errno;
+- return NULL;
+- }
+- ENSURE_ALLOCATION (xsum (length, tmpdst_len));
+- DCHAR_CPY (result + length, tmpdst, tmpdst_len);
+- free (tmpdst);
+- count = tmpdst_len;
+- }
+- else
+- {
+- /* The result string is ASCII.
+- Simple 1:1 conversion. */
+-# if USE_SNPRINTF
+- /* If sizeof (DCHAR_T) == sizeof (TCHAR_T), it's a
+- no-op conversion, in-place on the array starting
+- at (result + length). */
+- if (sizeof (DCHAR_T) != sizeof (TCHAR_T))
+-# endif
+- {
+- const TCHAR_T *tmpsrc;
+- DCHAR_T *tmpdst;
+- size_t n;
+-
+-# if USE_SNPRINTF
+- if (result == resultbuf)
+- {
+- tmpsrc = (TCHAR_T *) (result + length);
+- /* ENSURE_ALLOCATION will not move tmpsrc
+- (because it's part of resultbuf). */
+- ENSURE_ALLOCATION (xsum (length, count));
+- }
+- else
+- {
+- /* ENSURE_ALLOCATION will move the array
+- (because it uses realloc(). */
+- ENSURE_ALLOCATION (xsum (length, count));
+- tmpsrc = (TCHAR_T *) (result + length);
+- }
+-# else
+- tmpsrc = tmp;
+- ENSURE_ALLOCATION (xsum (length, count));
+-# endif
+- tmpdst = result + length;
+- /* Copy backwards, because of overlapping. */
+- tmpsrc += count;
+- tmpdst += count;
+- for (n = count; n > 0; n--)
+- *--tmpdst = (unsigned char) *--tmpsrc;
+- }
+- }
+-#endif
+-
+-#if DCHAR_IS_TCHAR && !USE_SNPRINTF
+- /* Make room for the result. */
+- if (count > allocated - length)
+- {
+- /* Need at least count elements. But allocate
+- proportionally. */
+- size_t n =
+- xmax (xsum (length, count), xtimes (allocated, 2));
+-
+- ENSURE_ALLOCATION (n);
+- }
+-#endif
+-
+- /* Here count <= allocated - length. */
+-
+- /* Perform padding. */
+-#if !DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION
+- if (pad_ourselves && has_width)
+- {
+- size_t w;
+-# if ENABLE_UNISTDIO
+- /* Outside POSIX, it's preferrable to compare the width
+- against the number of _characters_ of the converted
+- value. */
+- w = DCHAR_MBSNLEN (result + length, count);
+-# else
+- /* The width is compared against the number of _bytes_
+- of the converted value, says POSIX. */
+- w = count;
+-# endif
+- if (w < width)
+- {
+- size_t pad = width - w;
+-# if USE_SNPRINTF
+- /* Make room for the result. */
+- if (xsum (count, pad) > allocated - length)
+- {
+- /* Need at least count + pad elements. But
+- allocate proportionally. */
+- size_t n =
+- xmax (xsum3 (length, count, pad),
+- xtimes (allocated, 2));
+-
+- length += count;
+- ENSURE_ALLOCATION (n);
+- length -= count;
+- }
+- /* Here count + pad <= allocated - length. */
+-# endif
+- {
+-# if !DCHAR_IS_TCHAR || USE_SNPRINTF
+- DCHAR_T * const rp = result + length;
+-# else
+- DCHAR_T * const rp = tmp;
+-# endif
+- DCHAR_T *p = rp + count;
+- DCHAR_T *end = p + pad;
+-# if NEED_PRINTF_FLAG_ZERO
+- DCHAR_T *pad_ptr;
+-# if !DCHAR_IS_TCHAR
+- if (dp->conversion == 'c'
+- || dp->conversion == 's')
+- /* No zero-padding for string directives. */
+- pad_ptr = NULL;
+- else
+-# endif
+- {
+- pad_ptr = (*rp == '-' ? rp + 1 : rp);
+- /* No zero-padding of "inf" and "nan". */
+- if ((*pad_ptr >= 'A' && *pad_ptr <= 'Z')
+- || (*pad_ptr >= 'a' && *pad_ptr <= 'z'))
+- pad_ptr = NULL;
+- }
+-# endif
+- /* The generated string now extends from rp to p,
+- with the zero padding insertion point being at
+- pad_ptr. */
+-
+- count = count + pad; /* = end - rp */
+-
+- if (flags & FLAG_LEFT)
+- {
+- /* Pad with spaces on the right. */
+- for (; pad > 0; pad--)
+- *p++ = ' ';
+- }
+-# if NEED_PRINTF_FLAG_ZERO
+- else if ((flags & FLAG_ZERO) && pad_ptr != NULL)
+- {
+- /* Pad with zeroes. */
+- DCHAR_T *q = end;
+-
+- while (p > pad_ptr)
+- *--q = *--p;
+- for (; pad > 0; pad--)
+- *p++ = '0';
+- }
+-# endif
+- else
+- {
+- /* Pad with spaces on the left. */
+- DCHAR_T *q = end;
+-
+- while (p > rp)
+- *--q = *--p;
+- for (; pad > 0; pad--)
+- *p++ = ' ';
+- }
+- }
+- }
+- }
+-#endif
+-
+-#if DCHAR_IS_TCHAR && !USE_SNPRINTF
+- if (count >= tmp_length)
+- /* tmp_length was incorrectly calculated - fix the
+- code above! */
+- abort ();
+-#endif
+-
+- /* Here still count <= allocated - length. */
+-
+-#if !DCHAR_IS_TCHAR || USE_SNPRINTF
+- /* The snprintf() result did fit. */
+-#else
+- /* Append the sprintf() result. */
+- memcpy (result + length, tmp, count * sizeof (DCHAR_T));
+-#endif
+-#if !USE_SNPRINTF
+- if (tmp != tmpbuf)
+- free (tmp);
+-#endif
+-
+-#if NEED_PRINTF_DIRECTIVE_F
+- if (dp->conversion == 'F')
+- {
+- /* Convert the %f result to upper case for %F. */
+- DCHAR_T *rp = result + length;
+- size_t rc;
+- for (rc = count; rc > 0; rc--, rp++)
+- if (*rp >= 'a' && *rp <= 'z')
+- *rp = *rp - 'a' + 'A';
+- }
+-#endif
+-
+- length += count;
+- break;
+- }
+- }
+- }
+- }
+-
+- /* Add the final NUL. */
+- ENSURE_ALLOCATION (xsum (length, 1));
+- result[length] = '\0';
+-
+- if (result != resultbuf && length + 1 < allocated)
+- {
+- /* Shrink the allocated memory if possible. */
+- DCHAR_T *memory;
+-
+- memory = (DCHAR_T *) realloc (result, (length + 1) * sizeof (DCHAR_T));
+- if (memory != NULL)
+- result = memory;
+- }
+-
+- if (buf_malloced != NULL)
+- free (buf_malloced);
+- CLEANUP ();
+- *lengthp = length;
+- /* Note that we can produce a big string of a length > INT_MAX. POSIX
+- says that snprintf() fails with errno = EOVERFLOW in this case, but
+- that's only because snprintf() returns an 'int'. This function does
+- not have this limitation. */
+- return result;
+-
+- overflow:
+- if (!(result == resultbuf || result == NULL))
+- free (result);
+- if (buf_malloced != NULL)
+- free (buf_malloced);
+- CLEANUP ();
+- errno = EOVERFLOW;
+- return NULL;
+-
+- out_of_memory:
+- if (!(result == resultbuf || result == NULL))
+- free (result);
+- if (buf_malloced != NULL)
+- free (buf_malloced);
+- out_of_memory_1:
+- CLEANUP ();
+- errno = ENOMEM;
+- return NULL;
+- }
+-}
+-
+-#undef TCHARS_PER_DCHAR
+-#undef SNPRINTF
+-#undef USE_SNPRINTF
+-#undef DCHAR_CPY
+-#undef PRINTF_PARSE
+-#undef DIRECTIVES
+-#undef DIRECTIVE
+-#undef DCHAR_IS_TCHAR
+-#undef TCHAR_T
+-#undef DCHAR_T
+-#undef FCHAR_T
+-#undef VASNPRINTF
+--- a/intl/vasnprintf.h
++++ /dev/null
+@@ -1,78 +0,0 @@
+-/* vsprintf with automatic memory allocation.
+- Copyright (C) 2002-2004 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. */
+-
+-#ifndef _VASNPRINTF_H
+-#define _VASNPRINTF_H
+-
+-/* Get va_list. */
+-#include <stdarg.h>
+-
+-/* Get size_t. */
+-#include <stddef.h>
+-
+-#ifndef __attribute__
+-/* This feature is available in gcc versions 2.5 and later. */
+-# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) || __STRICT_ANSI__
+-# define __attribute__(Spec) /* empty */
+-# endif
+-/* The __-protected variants of `format' and `printf' attributes
+- are accepted by gcc versions 2.6.4 (effectively 2.7) and later. */
+-# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7)
+-# define __format__ format
+-# define __printf__ printf
+-# endif
+-#endif
+-
+-#ifdef __cplusplus
+-extern "C" {
+-#endif
+-
+-/* Write formatted output to a string dynamically allocated with malloc().
+- You can pass a preallocated buffer for the result in RESULTBUF and its
+- size in *LENGTHP; otherwise you pass RESULTBUF = NULL.
+- If successful, return the address of the string (this may be = RESULTBUF
+- if no dynamic memory allocation was necessary) and set *LENGTHP to the
+- number of resulting bytes, excluding the trailing NUL. Upon error, set
+- errno and return NULL.
+-
+- When dynamic memory allocation occurs, the preallocated buffer is left
+- alone (with possibly modified contents). This makes it possible to use
+- a statically allocated or stack-allocated buffer, like this:
+-
+- char buf[100];
+- size_t len = sizeof (buf);
+- char *output = vasnprintf (buf, &len, format, args);
+- if (output == NULL)
+- ... error handling ...;
+- else
+- {
+- ... use the output string ...;
+- if (output != buf)
+- free (output);
+- }
+- */
+-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 */
+--- a/intl/vasnwprintf.h
++++ /dev/null
+@@ -1,46 +0,0 @@
+-/* vswprintf 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+- USA. */
+-
+-#ifndef _VASNWPRINTF_H
+-#define _VASNWPRINTF_H
+-
+-/* Get va_list. */
+-#include <stdarg.h>
+-
+-/* Get wchar_t, size_t. */
+-#include <stddef.h>
+-
+-#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 wchar_t * asnwprintf (wchar_t *resultbuf, size_t *lengthp, const wchar_t *format, ...);
+-extern wchar_t * vasnwprintf (wchar_t *resultbuf, size_t *lengthp, const wchar_t *format, va_list args);
+-
+-#ifdef __cplusplus
+-}
+-#endif
+-
+-#endif /* _VASNWPRINTF_H */
+--- a/intl/version.c
++++ /dev/null
+@@ -1,26 +0,0 @@
+-/* libintl library version.
+- Copyright (C) 2005 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. */
+-
+-#ifdef HAVE_CONFIG_H
+-# include <config.h>
+-#endif
+-
+-#include "libgnuintl.h"
+-
+-/* Version number: (major<<16) + (minor<<8) + subminor */
+-int libintl_version = LIBINTL_VERSION;
+--- a/intl/wprintf-parse.h
++++ /dev/null
+@@ -1,75 +0,0 @@
+-/* Parse printf format string.
+- 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+- USA. */
+-
+-#ifndef _WPRINTF_PARSE_H
+-#define _WPRINTF_PARSE_H
+-
+-#include "printf-args.h"
+-
+-
+-/* 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
+-
+-/* arg_index value indicating that no argument is consumed. */
+-#define ARG_NONE (~(size_t)0)
+-
+-/* A parsed directive. */
+-typedef struct
+-{
+- const wchar_t* dir_start;
+- const wchar_t* dir_end;
+- int flags;
+- const wchar_t* width_start;
+- const wchar_t* width_end;
+- size_t width_arg_index;
+- const wchar_t* precision_start;
+- const wchar_t* precision_end;
+- size_t precision_arg_index;
+- wchar_t conversion; /* d i o u x X f e E g G c s p n U % but not C S */
+- size_t arg_index;
+-}
+-wchar_t_directive;
+-
+-/* A parsed format string. */
+-typedef struct
+-{
+- size_t count;
+- wchar_t_directive *dir;
+- size_t max_width_length;
+- size_t max_precision_length;
+-}
+-wchar_t_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 wprintf_parse (const wchar_t *format, wchar_t_directives *d, arguments *a);
+-
+-#endif /* _WPRINTF_PARSE_H */
+--- a/intl/xsize.h
++++ /dev/null
+@@ -1,109 +0,0 @@
+-/* xsize.h -- Checked size_t computations.
+-
+- Copyright (C) 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+- USA. */
+-
+-#ifndef _XSIZE_H
+-#define _XSIZE_H
+-
+-/* Get size_t. */
+-#include <stddef.h>
+-
+-/* Get SIZE_MAX. */
+-#include <limits.h>
+-#if HAVE_STDINT_H
+-# include <stdint.h>
+-#endif
+-
+-/* The size of memory objects is often computed through expressions of
+- type size_t. Example:
+- void* p = malloc (header_size + n * element_size).
+- These computations can lead to overflow. When this happens, malloc()
+- returns a piece of memory that is way too small, and the program then
+- crashes while attempting to fill the memory.
+- To avoid this, the functions and macros in this file check for overflow.
+- The convention is that SIZE_MAX represents overflow.
+- malloc (SIZE_MAX) is not guaranteed to fail -- think of a malloc
+- implementation that uses mmap --, it's recommended to use size_overflow_p()
+- or size_in_bounds_p() before invoking malloc().
+- The example thus becomes:
+- size_t size = xsum (header_size, xtimes (n, element_size));
+- void *p = (size_in_bounds_p (size) ? malloc (size) : NULL);
+-*/
+-
+-/* Convert an arbitrary value >= 0 to type size_t. */
+-#define xcast_size_t(N) \
+- ((N) <= SIZE_MAX ? (size_t) (N) : SIZE_MAX)
+-
+-/* Sum of two sizes, with overflow check. */
+-static inline size_t
+-#if __GNUC__ >= 3
+-__attribute__ ((__pure__))
+-#endif
+-xsum (size_t size1, size_t size2)
+-{
+- size_t sum = size1 + size2;
+- return (sum >= size1 ? sum : SIZE_MAX);
+-}
+-
+-/* Sum of three sizes, with overflow check. */
+-static inline size_t
+-#if __GNUC__ >= 3
+-__attribute__ ((__pure__))
+-#endif
+-xsum3 (size_t size1, size_t size2, size_t size3)
+-{
+- return xsum (xsum (size1, size2), size3);
+-}
+-
+-/* Sum of four sizes, with overflow check. */
+-static inline size_t
+-#if __GNUC__ >= 3
+-__attribute__ ((__pure__))
+-#endif
+-xsum4 (size_t size1, size_t size2, size_t size3, size_t size4)
+-{
+- return xsum (xsum (xsum (size1, size2), size3), size4);
+-}
+-
+-/* Maximum of two sizes, with overflow check. */
+-static inline size_t
+-#if __GNUC__ >= 3
+-__attribute__ ((__pure__))
+-#endif
+-xmax (size_t size1, size_t size2)
+-{
+- /* No explicit check is needed here, because for any n:
+- max (SIZE_MAX, n) == SIZE_MAX and max (n, SIZE_MAX) == SIZE_MAX. */
+- return (size1 >= size2 ? size1 : size2);
+-}
+-
+-/* Multiplication of a count with an element size, with overflow check.
+- The count must be >= 0 and the element size must be > 0.
+- This is a macro, not an inline function, so that it works correctly even
+- when N is of a wider tupe and N > SIZE_MAX. */
+-#define xtimes(N, ELSIZE) \
+- ((N) <= SIZE_MAX / (ELSIZE) ? (size_t) (N) * (ELSIZE) : SIZE_MAX)
+-
+-/* Check for overflow. */
+-#define size_overflow_p(SIZE) \
+- ((SIZE) == SIZE_MAX)
+-/* Check against overflow. */
+-#define size_in_bounds_p(SIZE) \
+- ((SIZE) != SIZE_MAX)
+-
+-#endif /* _XSIZE_H */
+--- a/m4/intlmacosx.m4
++++ b/m4/intlmacosx.m4
+@@ -1,50 +1,71 @@
+-# intlmacosx.m4 serial 1 (gettext-0.17)
+-dnl Copyright (C) 2004-2007 Free Software Foundation, Inc.
++# intlmacosx.m4 serial 6 (gettext-0.20)
++dnl Copyright (C) 2004-2014, 2016, 2019 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
+-dnl This file can can be used in projects which are not available under
++dnl This file can be used in projects which are not available under
+ dnl the GNU General Public License or the GNU Library General Public
+ dnl License but which still want to provide support for the GNU gettext
+ dnl functionality.
+ dnl Please note that the actual code of the GNU gettext library is covered
+ dnl by the GNU Library General Public License, and the rest of the GNU
+-dnl gettext package package is covered by the GNU General Public License.
++dnl gettext package is covered by the GNU General Public License.
+ dnl They are *not* in the public domain.
+
+-dnl Checks for special options needed on MacOS X.
++dnl Checks for special options needed on Mac OS X.
+ dnl Defines INTL_MACOSX_LIBS.
+ AC_DEFUN([gt_INTL_MACOSX],
+ [
+- dnl Check for API introduced in MacOS X 10.2.
++ dnl Check for API introduced in Mac OS X 10.4.
+ AC_CACHE_CHECK([for CFPreferencesCopyAppValue],
+- gt_cv_func_CFPreferencesCopyAppValue,
++ [gt_cv_func_CFPreferencesCopyAppValue],
+ [gt_save_LIBS="$LIBS"
+ LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation"
+- AC_TRY_LINK([#include <CoreFoundation/CFPreferences.h>],
+- [CFPreferencesCopyAppValue(NULL, NULL)],
++ AC_LINK_IFELSE(
++ [AC_LANG_PROGRAM(
++ [[#include <CoreFoundation/CFPreferences.h>]],
++ [[CFPreferencesCopyAppValue(NULL, NULL)]])],
+ [gt_cv_func_CFPreferencesCopyAppValue=yes],
+ [gt_cv_func_CFPreferencesCopyAppValue=no])
+ LIBS="$gt_save_LIBS"])
+ if test $gt_cv_func_CFPreferencesCopyAppValue = yes; then
+- AC_DEFINE([HAVE_CFPREFERENCESCOPYAPPVALUE], 1,
+- [Define to 1 if you have the MacOS X function CFPreferencesCopyAppValue in the CoreFoundation framework.])
++ AC_DEFINE([HAVE_CFPREFERENCESCOPYAPPVALUE], [1],
++ [Define to 1 if you have the Mac OS X function CFPreferencesCopyAppValue in the CoreFoundation framework.])
+ fi
+- dnl Check for API introduced in MacOS X 10.3.
+- AC_CACHE_CHECK([for CFLocaleCopyCurrent], gt_cv_func_CFLocaleCopyCurrent,
++ dnl Check for API introduced in Mac OS X 10.5.
++ AC_CACHE_CHECK([for CFLocaleCopyCurrent], [gt_cv_func_CFLocaleCopyCurrent],
+ [gt_save_LIBS="$LIBS"
+ LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation"
+- AC_TRY_LINK([#include <CoreFoundation/CFLocale.h>], [CFLocaleCopyCurrent();],
++ AC_LINK_IFELSE(
++ [AC_LANG_PROGRAM(
++ [[#include <CoreFoundation/CFLocale.h>]],
++ [[CFLocaleCopyCurrent();]])],
+ [gt_cv_func_CFLocaleCopyCurrent=yes],
+ [gt_cv_func_CFLocaleCopyCurrent=no])
+ LIBS="$gt_save_LIBS"])
+ if test $gt_cv_func_CFLocaleCopyCurrent = yes; then
+- AC_DEFINE([HAVE_CFLOCALECOPYCURRENT], 1,
+- [Define to 1 if you have the MacOS X function CFLocaleCopyCurrent in the CoreFoundation framework.])
++ AC_DEFINE([HAVE_CFLOCALECOPYCURRENT], [1],
++ [Define to 1 if you have the Mac OS X function CFLocaleCopyCurrent in the CoreFoundation framework.])
++ fi
++ AC_CACHE_CHECK([for CFLocaleCopyPreferredLanguages], [gt_cv_func_CFLocaleCopyPreferredLanguages],
++ [gt_save_LIBS="$LIBS"
++ LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation"
++ AC_LINK_IFELSE(
++ [AC_LANG_PROGRAM(
++ [[#include <CoreFoundation/CFLocale.h>]],
++ [[CFLocaleCopyPreferredLanguages();]])],
++ [gt_cv_func_CFLocaleCopyPreferredLanguages=yes],
++ [gt_cv_func_CFLocaleCopyPreferredLanguages=no])
++ LIBS="$gt_save_LIBS"])
++ if test $gt_cv_func_CFLocaleCopyPreferredLanguages = yes; then
++ AC_DEFINE([HAVE_CFLOCALECOPYPREFERREDLANGUAGES], [1],
++ [Define to 1 if you have the Mac OS X function CFLocaleCopyPreferredLanguages in the CoreFoundation framework.])
+ fi
+ INTL_MACOSX_LIBS=
+- if test $gt_cv_func_CFPreferencesCopyAppValue = yes || test $gt_cv_func_CFLocaleCopyCurrent = yes; then
++ if test $gt_cv_func_CFPreferencesCopyAppValue = yes \
++ || test $gt_cv_func_CFLocaleCopyCurrent = yes \
++ || test $gt_cv_func_CFLocaleCopyPreferredLanguages = yes; then
+ INTL_MACOSX_LIBS="-Wl,-framework -Wl,CoreFoundation"
+ fi
+ AC_SUBST([INTL_MACOSX_LIBS])
+--- a/po/ChangeLog
++++ b/po/ChangeLog
+@@ -1,3 +1,11 @@
++2019-12-07 gettextize <bug-gnu-gettext@gnu.org>
++
++ * en@boldquot.header: Upgrade to gettext-0.20.1.
++ * en@quot.header: Upgrade to gettext-0.20.1.
++ * insert-header.sin: Upgrade to gettext-0.20.1.
++ * remove-potcdate.sin: Upgrade to gettext-0.20.1.
++ * Rules-quot: Upgrade to gettext-0.20.1.
++
+ 2009-08-11 Scott James Remnant <scott@netsplit.com>
+
+ * libnih.pot: Distribute the pot file
+--- a/po/Rules-quot
++++ b/po/Rules-quot
+@@ -1,4 +1,9 @@
+ # Special Makefile rules for English message catalogs with quotation marks.
++#
++# Copyright (C) 2001-2017 Free Software Foundation, Inc.
++# This file, Rules-quot, and its auxiliary files (listed under
++# DISTFILES.common.extra1) are free software; the Free Software Foundation
++# gives unlimited permission to use, copy, distribute, and modify them.
+
+ DISTFILES.common.extra1 = quot.sed boldquot.sed en@quot.header en@boldquot.header insert-header.sin Rules-quot
+
+@@ -14,13 +19,23 @@ en@boldquot.po-update: en@boldquot.po-up
+
+ .insert-header.po-update-en:
+ @lang=`echo $@ | sed -e 's/\.po-update-en$$//'`; \
+- if test "$(PACKAGE)" = "gettext"; then PATH=`pwd`/../src:$$PATH; GETTEXTLIBDIR=`cd $(top_srcdir)/src && pwd`; export GETTEXTLIBDIR; fi; \
++ if test "$(PACKAGE)" = "gettext-tools" && test "$(CROSS_COMPILING)" != "yes"; then PATH=`pwd`/../src:$$PATH; GETTEXTLIBDIR=`cd $(top_srcdir)/src && pwd`; export GETTEXTLIBDIR; fi; \
+ tmpdir=`pwd`; \
+ echo "$$lang:"; \
+ ll=`echo $$lang | sed -e 's/@.*//'`; \
+ LC_ALL=C; export LC_ALL; \
+ cd $(srcdir); \
+- if $(MSGINIT) -i $(DOMAIN).pot --no-translator -l $$ll -o - 2>/dev/null | sed -f $$tmpdir/$$lang.insert-header | $(MSGCONV) -t UTF-8 | $(MSGFILTER) sed -f `echo $$lang | sed -e 's/.*@//'`.sed 2>/dev/null > $$tmpdir/$$lang.new.po; then \
++ if $(MSGINIT) $(MSGINIT_OPTIONS) -i $(DOMAIN).pot --no-translator -l $$lang -o - 2>/dev/null \
++ | $(SED) -f $$tmpdir/$$lang.insert-header | $(MSGCONV) -t UTF-8 | \
++ { case `$(MSGFILTER) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \
++ '' | 0.[0-9] | 0.[0-9].* | 0.1[0-8] | 0.1[0-8].*) \
++ $(MSGFILTER) $(SED) -f `echo $$lang | sed -e 's/.*@//'`.sed \
++ ;; \
++ *) \
++ $(MSGFILTER) `echo $$lang | sed -e 's/.*@//'` \
++ ;; \
++ esac } 2>/dev/null > $$tmpdir/$$lang.new.po \
++ ; then \
+ if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \
+ rm -f $$tmpdir/$$lang.new.po; \
+ else \
+--- a/po/en@boldquot.header
++++ b/po/en@boldquot.header
+@@ -2,7 +2,7 @@
+ # The msgids must be ASCII and therefore cannot contain real quotation
+ # characters, only substitutes like grave accent (0x60), apostrophe (0x27)
+ # and double quote (0x22). These substitutes look strange; see
+-# http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html
++# https://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html
+ #
+ # This catalog translates grave accent (0x60) and apostrophe (0x27) to
+ # left single quotation mark (U+2018) and right single quotation mark (U+2019).
+--- a/po/en@quot.header
++++ b/po/en@quot.header
+@@ -2,7 +2,7 @@
+ # The msgids must be ASCII and therefore cannot contain real quotation
+ # characters, only substitutes like grave accent (0x60), apostrophe (0x27)
+ # and double quote (0x22). These substitutes look strange; see
+-# http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html
++# https://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html
+ #
+ # This catalog translates grave accent (0x60) and apostrophe (0x27) to
+ # left single quotation mark (U+2018) and right single quotation mark (U+2019).
+--- a/po/insert-header.sin
++++ b/po/insert-header.sin
+@@ -1,5 +1,10 @@
+ # Sed script that inserts the file called HEADER before the header entry.
+ #
++# Copyright (C) 2001 Free Software Foundation, Inc.
++# Written by Bruno Haible <bruno@clisp.org>, 2001.
++# This file is free software; the Free Software Foundation gives
++# unlimited permission to use, copy, distribute, and modify it.
++#
+ # At each occurrence of a line starting with "msgid ", we execute the following
+ # commands. At the first occurrence, insert the file. At the following
+ # occurrences, do nothing. The distinction between the first and the following
+--- a/po/remove-potcdate.sin
++++ b/po/remove-potcdate.sin
+@@ -1,6 +1,12 @@
+-# Sed script that remove the POT-Creation-Date line in the header entry
++# Sed script that removes the POT-Creation-Date line in the header entry
+ # from a POT file.
+ #
++# Copyright (C) 2002 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 any warranty.
++#
+ # The distinction between the first and the following occurrences of the
+ # pattern is achieved by looking at the hold space.
+ /^"POT-Creation-Date: .*"$/{
diff --git a/meta-oe/recipes-support/libnih/libnih_1.0.3.bb b/meta-oe/recipes-support/libnih/libnih_1.0.3.bb
index fcb6bebd60..ff7a4ed105 100644
--- a/meta-oe/recipes-support/libnih/libnih_1.0.3.bb
+++ b/meta-oe/recipes-support/libnih/libnih_1.0.3.bb
@@ -20,19 +20,19 @@ SECTION = "libs"
LICENSE = "GPL-2.0"
LIC_FILES_CHKSUM = "file://COPYING;md5=751419260aa954499f7abaabaa882bbe"
-DEPENDS = "dbus libnih-native"
-DEPENDS_class-native = "dbus-native"
+DEPENDS = "dbus expat"
+DEPENDS_append_class-target = " libnih-native"
SRC_URI = "https://launchpad.net/${BPN}/1.0/${PV}/+download/${BP}.tar.gz \
file://libnih_1.0.3-4ubuntu16.patch \
file://0001-signal.c-SIGCLD-and-SIGCHILD-are-same-on-sytem-V-sys.patch \
+ file://0001-Update-autotool-files-also-make-it-work-with-latest-.patch \
"
SRC_URI[md5sum] = "db7990ce55e01daffe19006524a1ccb0"
SRC_URI[sha256sum] = "897572df7565c0a90a81532671e23c63f99b4efde2eecbbf11e7857fbc61f405"
-inherit autotools
-inherit gettext
+inherit autotools gettext
do_configure_append () {
sed -i -e 's,lib/pkgconfig,${baselib}/pkgconfig,g' ${S}/nih/Makefile.in ${S}/nih-dbus/Makefile.in